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