NtQueryQuotaInformationFile
NTSTATUS __stdcall NtQueryQuotaInformationFile(
VOID *FileHandle,
IO_STATUS_BLOCK *IoStatusBlock,
VOID *Buffer,
UINT64 Length,
UINT8 ReturnSingleEntry,
VOID *SidList,
UINT64 SidListLength,
UINT64 *StartSid,
UINT8 RestartScan){
void *v11;
_ETHREAD *CurrentThread;
INT8 v13;
__int64 v14;
__int64 v15;
__int16 v16;
UINT64 v17;
UINT64 *v18;
__int64 v19;
unsigned int v20;
unsigned int v21;
unsigned int v22;
unsigned int v23;
NTSTATUS result;
FILE_GET_QUOTA_INFORMATION *PoolWithQuota_5;
FILE_GET_QUOTA_INFORMATION *v26;
void *v27;
NTSTATUS v28;
FILE_OBJECT *v29;
_DWORD *v30;
_ETHREAD *v31;
volatile __int32 *v32;
__int64 v33;
INT64 v34;
_KEVENT *Pool_3;
IRP *v36;
IRP *v37;
IO_STATUS_BLOCK *v38;
PVOID v39;
__int64 v40;
PDEVICE_OBJECT v41;
int v42;
VOID *v43;
ULONG v44;
_MDL *Mdl;
INT64 v46;
char v47;
PIRP Irp;
UINT64 v49;
CHAR v50;
CHAR a2;
CHAR a2_1;
FILE_GET_QUOTA_INFORMATION *a2_7;
PVOID Object;
PVOID P;
FILE_GET_QUOTA_INFORMATION *QuotaBuffer;
PSID Sid;
PIRP v58;
PDEVICE_OBJECT DeviceObject;
_ETHREAD *v60;
_IO_STATUS_BLOCK LocalIoStatus[5];
VOID *retaddr;
ULONG Size;
Size = Length;
v11 = FileHandle;
Object = 0i64;
P = 0i64;
a2_7 = 0i64;
LODWORD(DeviceObject) = 0;
Sid = 0i64;
QuotaBuffer = 0i64;
LocalIoStatus[0] = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v60 = CurrentThread;
v13 = *((_BYTE *)CurrentThread + 562);
a2 = v13;
if( v13 )
{
v14 = 0x7FFFFFFF0000i64;
if( (unsigned __int64)IoStatusBlock < 0x7FFFFFFF0000i64 )
v14 = (__int64)IoStatusBlock;
*(_DWORD *)v14 = *(_DWORD *)v14;
v15 = *(_QWORD *)(*((_QWORD *)CurrentThread + 23) + 1408i64);
if( v15 && ((v16 = *(_WORD *)(v15 + 8), v16 == 332) || v16 == 452) )
v17 = 4i64;
else
v17 = 8i64;
ProbeForWrite(Buffer, (unsigned int)Length, v17);
v18 = StartSid;
if( StartSid )
{
v19 = (__int64)StartSid + 1;
if( (unsigned __int64)StartSid + 1 >= 0x7FFFFFFF0000i64 )
v19 = 0x7FFFFFFF0000i64;
a2_1 = *(_BYTE *)v19;
v20 = RtlLengthRequiredSid(*(unsigned __int8 *)v19);
v21 = v20;
LODWORD(DeviceObject) = v20;
if( v20 )
{
if( ((unsigned __int8)StartSid & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)StartSid + v20 > 0x7FFFFFFF0000i64 || (UINT64 *)((char *)StartSid + v20) < StartSid )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
else
{
a2_1 = 0;
v21 = (unsigned int)DeviceObject;
}
if( SidList && (v22 = SidListLength) != 0 )
{
if( ((unsigned __int8)SidList & 3) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)SidList + (unsigned int)SidListLength > 0x7FFFFFFF0000i64
|| (char *)SidList + (unsigned int)SidListLength < SidList )
{
MEMORY[0x7FFFFFFF0000] = 0;
}
v23 = (SidListLength + 3) & 0xFFFFFFFC;
if( v23 > ~v21 )
return -1073741811;
if( v23 < (unsigned int)SidListLength )
return -1073741811;
PoolWithQuota_5 = (FILE_GET_QUOTA_INFORMATION *)IopVerifierExAllocatePoolWithQuota_5(NonPagedPoolNx, v23 + v21);
a2_7 = PoolWithQuota_5;
QuotaBuffer = PoolWithQuota_5;
memmove((UINT8 *)PoolWithQuota_5, (UINT8 *)SidList, (unsigned int)SidListLength);
}
else
{
v22 = 0;
LODWORD(SidListLength) = 0;
if( StartSid )
{
PoolWithQuota_5 = (FILE_GET_QUOTA_INFORMATION *)IopVerifierExAllocatePoolWithQuota_5(PagedPool, v21);
a2_7 = PoolWithQuota_5;
}
else
{
PoolWithQuota_5 = 0i64;
}
}
if( StartSid )
{
Sid = (char *)PoolWithQuota_5 + ((v22 + 3) & 0xFFFFFFFC);
memmove((UINT8 *)Sid, (UINT8 *)StartSid, v21);
*((_BYTE *)Sid + 1) = a2_1;
}
v11 = FileHandle;
}
else
{
v22 = SidListLength;
if( SidList )
{
v26 = QuotaBuffer;
if( (_DWORD)SidListLength )
v26 = (FILE_GET_QUOTA_INFORMATION *)SidList;
QuotaBuffer = v26;
}
v27 = Sid;
v18 = StartSid;
if( StartSid )
v27 = StartSid;
Sid = v27;
PoolWithQuota_5 = 0i64;
}
if( QuotaBuffer )
{
v58 = 0i64;
v28 = IopCheckGetQuotaBufferValidity(QuotaBuffer, v22, (UINT64 *)&v58);
if( v28 < 0 )
{
IoStatusBlock->Information = (unsigned __int64)v58;
LABEL_47:
if( PoolWithQuota_5 )
ExFreePoolWithTag(PoolWithQuota_5, 0);
return v28;
}
}
if( Sid && !RtlValidSid(Sid) )
{
if( PoolWithQuota_5 )
ExFreePoolWithTag(PoolWithQuota_5, 0);
return -1073741704;
}
v28 = IopReferenceFileObject(v11, 0i64, v13, (FILE_OBJECT **)&Object, 0i64);
if( v28 < 0 )
goto LABEL_47;
v29 = (FILE_OBJECT *)Object;
v30 = (char *)Object + 80;
if( (*((_DWORD *)Object + 20) & 2) != 0 )
{
v31 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v31 + 242);
v32 = (volatile __int32 *)Object;
LODWORD(v33) = KeAbPreAcquire((char *)Object + 128, 0i64, 0i64);
if( _InterlockedExchange(v32 + 29, 1) )
{
LOBYTE(v34) = a2;
v29 = (FILE_OBJECT *)Object;
IopWaitAndAcquireFileObjectLock(Object, v34);
}
else
{
if( v33 )
*(_BYTE *)(v33 + 26) |= 1u;
v29 = (FILE_OBJECT *)Object;
ObfReferenceObject(Object);
}
v50 = 1;
v22 = SidListLength;
PoolWithQuota_5 = a2_7;
LABEL_68:
IopResetEvent(v29);
DeviceObject = IoGetRelatedDeviceObject(v29);
v36 = IopAllocateIrpExReturn(DeviceObject, *((_BYTE *)DeviceObject + 76), 0, retaddr);
v37 = v36;
v58 = v36;
if( !v36 )
{
if( (*v30 & 2) == 0 )
ExFreePoolWithTag(P, 0);
IopAllocateIrpCleanup((PUNICODE_STRING)v29);
if( PoolWithQuota_5 )
ExFreePoolWithTag(PoolWithQuota_5, 0);
return -1073741670;
}
*((_QWORD *)v36 + 24) = v29;
*((_QWORD *)v36 + 19) = v60;
*((_BYTE *)v36 + 64) = a2;
if( v50 )
{
v38 = IoStatusBlock;
v39 = 0i64;
}
else
{
*((_DWORD *)v36 + 4) = 4;
v38 = LocalIoStatus;
v39 = P;
}
*((_QWORD *)v37 + 10) = v39;
*((_QWORD *)v37 + 9) = v38;
*((_QWORD *)v37 + 11) = 0i64;
v40 = *((_QWORD *)v37 + 23);
*(_BYTE *)(v40 - 72) = 25;
*(_QWORD *)(v40 - 24) = v29;
*((_QWORD *)v37 + 20) = PoolWithQuota_5;
*(_QWORD *)(v40 - 48) = QuotaBuffer;
*(_DWORD *)(v40 - 40) = v22;
v41 = DeviceObject;
v42 = *((_DWORD *)DeviceObject + 12);
if( (v42 & 4) != 0 )
{
if( Size )
{
v43 = IopVerifierExAllocatePoolWithQuota_5(NonPagedPoolNx, Size);
*((_QWORD *)v37 + 3) = v43;
if( !IopDisableBufferedIoInit )
memset((INT64)v43, 0i64);
*((_DWORD *)v37 + 4) |= 0x70u;
}
else
{
*((_QWORD *)v37 + 3) = 0i64;
}
}
else if( (v42 & 0x10) != 0 )
{
v44 = Size;
if( Size )
{
Mdl = IoAllocateMdl(Buffer, Size, 0, 1u, v37);
if( !Mdl )
RtlRaiseStatus(-1073741670);
LODWORD(Irp) = *(unsigned __int8 *)(v40 - 72);
IopProbeAndLockPages_1(Mdl, a2, v46, v41, (INT64)Irp);
}
goto LABEL_89;
}
*((_QWORD *)v37 + 14) = Buffer;
v44 = Size;
LABEL_89:
*(_DWORD *)(v40 - 64) = v44;
*(_QWORD *)(v40 - 56) = Sid;
*(_BYTE *)(v40 - 70) = 0;
v47 = 0;
if( RestartScan )
{
*(_BYTE *)(v40 - 70) = 1;
v47 = 1;
}
if( ReturnSingleEntry )
{
v47 |= 2u;
*(_BYTE *)(v40 - 70) = v47;
}
if( v18 )
*(_BYTE *)(v40 - 70) = v47 | 4;
LODWORD(v49) = 2;
result = IopSynchronousServiceTail(v41, v37, v29, 0, a2, v50, v49);
if( !v50 )
return IopSynchronousApiServiceTail((unsigned int)result, (_KEVENT *)P, v37, a2, LocalIoStatus, IoStatusBlock);
return result;
}
Pool_3 = (_KEVENT *)IopVerifierExAllocatePool_3();
P = Pool_3;
if( Pool_3 )
{
KeInitializeEvent(Pool_3, SynchronizationEvent, 0);
v50 = 0;
goto LABEL_68;
}
if( PoolWithQuota_5 )
ExFreePoolWithTag(PoolWithQuota_5, 0);
HalPutDmaAdapter((PADAPTER_OBJECT)v29);
return -1073741670;
}Referenced by:
No references.