IopSetEaOrQuotaInformationFile
INT64 __stdcall IopSetEaOrQuotaInformationFile(
PVOID FileHandle,
IO_STATUS_BLOCK *IoStatusBlock,
PVOID Buffer,
UINT64 a4){
UINT64 v4;
_KEVENT *v8;
INT8 v9;
__int64 v10;
INT64 result;
struct _DMA_ADAPTER *v12;
_ETHREAD *v13;
volatile __int32 *v14;
__int64 v15;
INT64 v16;
_KEVENT *Pool_1;
IRP *v18;
IRP *v19;
CHAR v20;
IO_STATUS_BLOCK *p_LocalIoStatus;
_KEVENT *v22;
__int64 v23;
int v24;
UINT8 *PoolWithQuota_1;
int v26;
_MDL *Mdl;
_DWORD *v28;
PIRP Irp;
UINT64 v30;
CHAR RequestorMode;
PVOID Object;
_DWORD *v33;
ULONG ErrorOffset;
PVOID P;
PDEVICE_OBJECT DeviceObject;
PIRP v37;
_ETHREAD *CurrentThread;
_IO_STATUS_BLOCK LocalIoStatus;
VOID *retaddr;
ULONG Size;
CHAR v42;
Size = a4;
v4 = (unsigned int)a4;
Object = 0i64;
v8 = 0i64;
P = 0i64;
LocalIoStatus = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v9 = *((_BYTE *)CurrentThread + 562);
RequestorMode = v9;
if( v9 )
{
v10 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)IoStatusBlock < 0x7FFFFFFF0000i64 )
v10 = (__int64)IoStatusBlock;
*(_DWORD *)v10 = *(_DWORD *)v10;
if( (_DWORD)a4 )
{
if( ((unsigned __int8)Buffer & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)Buffer + (unsigned int)a4 > 0x7FFFFFFF0000i64 || (char *)Buffer + (unsigned int)a4 < Buffer )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
LODWORD(result) = IopReferenceFileObject(FileHandle, 2ui64, v9, (FILE_OBJECT **)&Object, 0i64);
if( (int)result >= 0 )
{
v12 = (struct _DMA_ADAPTER *)Object;
v33 = (char *)Object + 80;
if( (*((_DWORD *)Object + 20) & 2) != 0 )
{
v13 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v13 + 242);
v14 = (volatile __int32 *)Object;
LODWORD(v15) = KeAbPreAcquire((char *)Object + 128, 0i64, 0i64);
if( _InterlockedExchange(v14 + 29, 1) )
{
LOBYTE(v16) = v9;
v12 = (struct _DMA_ADAPTER *)Object;
IopWaitAndAcquireFileObjectLock(Object, v16);
}
else
{
if( v15 )
*(_BYTE *)(v15 + 26) |= 1u;
v12 = (struct _DMA_ADAPTER *)Object;
ObfReferenceObject(Object);
}
v42 = 1;
v4 = Size;
}
else
{
Pool_1 = (_KEVENT *)IopVerifierExAllocatePool_1(NonPagedPoolNx, 0x18ui64);
v8 = Pool_1;
P = Pool_1;
if( !Pool_1 )
{
HalPutDmaAdapter(v12);
return 3221225626i64;
}
KeInitializeEvent(Pool_1, SynchronizationEvent, 0);
v42 = 0;
}
IopResetEvent((FILE_OBJECT *)v12);
DeviceObject = IoGetRelatedDeviceObject((_FILE_OBJECT *)v12);
v18 = IopAllocateIrpExReturn(DeviceObject, *((_BYTE *)DeviceObject + 76), 0, retaddr);
v19 = v18;
v37 = v18;
if( !v18 )
{
if( (*v33 & 2) == 0 )
ExFreePoolWithTag(v8, 0);
IopAllocateIrpCleanup((PUNICODE_STRING)v12);
return 3221225626i64;
}
*((_QWORD *)v18 + 24) = v12;
*((_QWORD *)v18 + 19) = CurrentThread;
v20 = RequestorMode;
*((_BYTE *)v18 + 64) = RequestorMode;
if( v42 )
{
*((_BYTE *)v18 + 71) |= 2u;
p_LocalIoStatus = IoStatusBlock;
v22 = 0i64;
}
else
{
*((_DWORD *)v18 + 4) = 4;
p_LocalIoStatus = &LocalIoStatus;
v22 = v8;
}
*((_QWORD *)v19 + 10) = v22;
*((_QWORD *)v19 + 9) = p_LocalIoStatus;
*((_QWORD *)v19 + 11) = 0i64;
v23 = *((_QWORD *)v19 + 23) - 72i64;
v33 = (_DWORD *)v23;
*(_BYTE *)v23 = 26;
*(_QWORD *)(v23 + 48) = v12;
v24 = *((_DWORD *)DeviceObject + 12);
if( (v24 & 4) != 0 )
{
ErrorOffset = 0;
if( (_DWORD)v4 )
{
PoolWithQuota_1 = (UINT8 *)IopVerifierExAllocatePoolWithQuota_1(NonPagedPoolNx, v4);
*((_QWORD *)v19 + 3) = PoolWithQuota_1;
memmove(PoolWithQuota_1, (UINT8 *)Buffer, v4);
LODWORD(v4) = Size;
v26 = IoCheckQuotaBufferValidity((PFILE_QUOTA_INFORMATION)PoolWithQuota_1, Size, &ErrorOffset);
if( v26 < 0 )
{
IoStatusBlock->Status = v26;
IoStatusBlock->Information = ErrorOffset;
RtlRaiseStatus(v26);
}
*((_DWORD *)v19 + 4) |= 0x30u;
v20 = RequestorMode;
goto LABEL_40;
}
*((_QWORD *)v19 + 3) = 0i64;
}
else if( (v24 & 0x10) != 0 )
{
if( (_DWORD)v4 )
{
Mdl = IoAllocateMdl(Buffer, v4, 0, 1u, v19);
if( !Mdl )
RtlRaiseStatus(-1073741670);
v28 = v33;
LODWORD(Irp) = *(unsigned __int8 *)v33;
IopProbeAndLockPages_0(Mdl, RequestorMode, 0i64, DeviceObject, (INT64)Irp);
goto LABEL_41;
}
LABEL_40:
v28 = v33;
LABEL_41:
v28[2] = v4;
LODWORD(v30) = 2;
result = IopSynchronousServiceTail(DeviceObject, v19, (FILE_OBJECT *)v12, 0, v20, v42, v30);
if( !v42 )
LODWORD(result) = IopSynchronousApiServiceTail(
(unsigned int)result,
v8,
v19,
v20,
&LocalIoStatus,
IoStatusBlock);
return result;
}
*((_QWORD *)v19 + 14) = Buffer;
goto LABEL_40;
}
return result;
}Referenced by:
NtSetQuotaInformationFile