IopSetEaOrQuotaInformationFile

NTSTATUS __stdcall IopSetEaOrQuotaInformationFile(
        VOID *FileHandle,
        _IO_STATUS_BLOCK *IoStatusBlock,
        VOID *Buffer,
        UINT64 Length){
  UINT64 v4; 
  _KEVENT *v8; 
  INT8 PreviousMode; 
  __int64 v10; 
  NTSTATUS result; 
  _FILE_OBJECT *v12; 
  bool v13; 
  _ETHREAD *v14; 
  _FILE_OBJECT *v15; 
  _BYTE *v16; 
  NTSTATUS v17; 
  VOID **Pool_1; 
  _DEVICE_OBJECT *v19; 
  _IRP *v20; 
  _IRP *v21; 
  INT8 v22; 
  _IO_STATUS_BLOCK *p_LocalIoStatus; 
  _KEVENT *v24; 
  __int64 v25; 
  unsigned int Flags; 
  _FILE_QUOTA_INFORMATION *PoolWithQuota_1; 
  int v28; 
  _MDL *Mdl; 
  unsigned int *v30; 
  char v31; 
  char RequestorMode; 
  _FILE_OBJECT *pFileObject; 
  unsigned int *p_Flags; 
  unsigned int ErrorOffset; 
  PVOID KernelEvent; 
  PDEVICE_OBJECT DeviceObject; 
  PIRP Irp; 
  _ETHREAD *CurrentThread; 
  _IO_STATUS_BLOCK LocalIoStatus; 
  VOID *retaddr; 
  size_t Size; 
  INT64 SynchronousIo; 

  Size = Length;
  v4 = (unsigned int)Length;
  pFileObject = 0i64;
  v8 = 0i64;
  KernelEvent = 0i64;
  LocalIoStatus = 0i64;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  PreviousMode = CurrentThread->Tcb.PreviousMode;
  RequestorMode = PreviousMode;
  if( PreviousMode )
  {
    v10 = 0x7FFFFFFF0000i64;
    if( (unsigned __int64)IoStatusBlock < 0x7FFFFFFF0000i64 )
      v10 = (__int64)IoStatusBlock;
    *(_DWORD *)v10 = *(_DWORD *)v10;
    if( (_DWORD)Length )
    {
      if( ((unsigned __int8)Buffer & 3) != 0 )
        ExRaiseDatatypeMisalignment();
      if( (unsigned __int64)Buffer + (unsigned int)Length > 0x7FFFFFFF0000i64
        || (char *)Buffer + (unsigned int)Length < Buffer )
      {
        MEMORY[0x7FFFFFFF0000] = 0;
      }
    }
  }
  result = IopReferenceFileObject(FileHandle, 2ui64, PreviousMode, &pFileObject, 0i64);
  if( result >= 0 )
  {
    v12 = pFileObject;
    p_Flags = &pFileObject->Flags;
    if( (pFileObject->Flags & 2) != 0 )
    {
      v13 = (pFileObject->Flags & 4) != 0;
      v14 = (_ETHREAD *)KeGetCurrentThread();
      --v14->Tcb.KernelApcDisable;
      v15 = pFileObject;
      v16 = KeAbPreAcquire(pFileObject->gap80, 0i64, 0i64);
      LOBYTE(SynchronousIo) = 0;
      if( _InterlockedExchange((volatile __int32 *)&v15->Busy, 1) )
      {
        v12 = pFileObject;
        v17 = IopWaitAndAcquireFileObjectLock(pFileObject, PreviousMode, v13, v16, (INT64)&SynchronousIo);
      }
      else
      {
        if( v16 )
          v16[26] |= 1u;
        v12 = pFileObject;
        ObfReferenceObject(pFileObject);
        v17 = 0;
      }
      if( !(_BYTE)SynchronousIo )
      {
        LOBYTE(SynchronousIo) = 1;
        v4 = Size;
        goto LABEL_23;
      }
    }
    else
    {
      Pool_1 = IopVerifierExAllocatePool_1(0x200ui64, 0x18ui64);
      v8 = (_KEVENT *)Pool_1;
      KernelEvent = Pool_1;
      if( Pool_1 )
      {
        KeInitializeEvent((INT64)Pool_1, 1, 0);
        LOBYTE(SynchronousIo) = 0;
LABEL_23:
        IopResetEvent(v12);
        LODWORD(v19) = IoGetRelatedDeviceObject((INT64)v12);
        DeviceObject = v19;
        v20 = IopAllocateIrpExReturn(v19, v19->StackSize, 0, retaddr);
        v21 = v20;
        Irp = v20;
        if( !v20 )
        {
          if( (*p_Flags & 2) == 0 )
            ExFreePoolWithTag(v8, 0);
          IopAllocateIrpCleanup(v12, 0i64);
          return -1073741670;
        }
        v20->Tail.OriginalFileObject = v12;
        v20->Tail.Thread = CurrentThread;
        v22 = RequestorMode;
        v20->RequestorMode = RequestorMode;
        if( (_BYTE)SynchronousIo )
        {
          v20->AllocationFlags |= 2u;
          p_LocalIoStatus = IoStatusBlock;
          v24 = 0i64;
        }
        else
        {
          v20->Flags = 4;
          p_LocalIoStatus = &LocalIoStatus;
          v24 = v8;
        }
        v21->UserEvent = v24;
        v21->UserIosb = p_LocalIoStatus;
        v21->Overlay.UserApcRoutine = 0i64;
        v25 = (__int64)&v21->Tail.CurrentStackLocation[-1];
        p_Flags = (unsigned int *)v25;
        *(_BYTE *)v25 = 26;
        *(_QWORD *)(v25 + 48) = v12;
        Flags = DeviceObject->Flags;
        if( (Flags & 4) != 0 )
        {
          ErrorOffset = 0;
          if( (_DWORD)v4 )
          {
            PoolWithQuota_1 = (_FILE_QUOTA_INFORMATION *)IopVerifierExAllocatePoolWithQuota_1(NonPagedPoolNx, v4);
            v21->AssociatedIrp.MasterIrp = (_IRP *)PoolWithQuota_1;
            memmove(PoolWithQuota_1, Buffer, v4);
            LODWORD(v4) = Size;
            v28 = IoCheckQuotaBufferValidity(PoolWithQuota_1, Size, &ErrorOffset);
            if( v28 < 0 )
            {
              IoStatusBlock->Status = v28;
              IoStatusBlock->Information = ErrorOffset;
              RtlRaiseStatus(v28);
            }
            v21->Flags |= 0x30u;
            v22 = RequestorMode;
            goto LABEL_42;
          }
          v21->AssociatedIrp.MasterIrp = 0i64;
        }
        else if( (Flags & 0x10) != 0 )
        {
          if( (_DWORD)v4 )
          {
            Mdl = IoAllocateMdl(Buffer, (unsigned int)v4, 0, 1u, v21);
            if( !Mdl )
              RtlRaiseStatus(-1073741670);
            v30 = p_Flags;
            IopProbeAndLockPages_0(Mdl, RequestorMode, 0, DeviceObject, *(unsigned __int8 *)p_Flags);
            goto LABEL_43;
          }
LABEL_42:
          v30 = p_Flags;
LABEL_43:
          v30[2] = v4;
          v31 = SynchronousIo;
          result = IopSynchronousServiceTail(DeviceObject, v21, v12, 0, v22, SynchronousIo, OtherTransfer);
          if( !v31 )
            return IopSynchronousApiServiceTail((unsigned int)result, v8, v21, v22, &LocalIoStatus, IoStatusBlock);
          return result;
        }
        v21->UserBuffer = Buffer;
        goto LABEL_42;
      }
      v17 = -1073741670;
    }
    HalPutDmaAdapter((PADAPTER_OBJECT)v12);
    return v17;
  }
  return result;
}

Referenced by:

NtSetQuotaInformationFile