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.