NtFlushBuffersFileEx

NTSTATUS __stdcall NtFlushBuffersFileEx(
        PVOID FileHandle,
        UINT64 Flags,
        PVOID Parameters,
        UINT64 ParametersSize,
        IO_STATUS_BLOCK *IoStatusBlock){
  char v5; 
  _ETHREAD *CurrentThread; 
  INT8 v8; 
  __int64 v9; 
  NTSTATUS result; 
  FILE_OBJECT *v11; 
  unsigned int v12; 
  _ETHREAD *v13; 
  volatile __int32 *v14; 
  __int64 v15; 
  INT64 v16; 
  CHAR v17; 
  _KEVENT *v18; 
  IRP *Irp; 
  IRP *v20; 
  IO_STATUS_BLOCK *p_LocalIoStatus; 
  _KEVENT *v22; 
  __int64 v23; 
  _KEVENT *Pool_1; 
  NTSTATUS v25; 
  UINT64 v26; 
  PVOID Object; 
  OBJECT_HANDLE_INFORMATION pHandleInformation; 
  _IO_STATUS_BLOCK LocalIoStatus; 
  VOID *retaddr; 
  _DEVICE_OBJECT *DeviceObject; 
  v5 = Flags;
  Object = 0i64;
  LocalIoStatus = 0i64;
  pHandleInformation = 0i64;
  if( Parameters || (_DWORD)ParametersSize )
    return -1073741811;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v8 = *((_BYTE *)CurrentThread + 562);
  if( v8 )
  {
    v9 = 0x7FFFFFFF0000i64;
    if( (unsigned __int64)IoStatusBlock < 0x7FFFFFFF0000i64 )
      v9 = (__int64)IoStatusBlock;
    *(_DWORD *)v9 = *(_DWORD *)v9;
  }
  result = IopReferenceFileObject(FileHandle, 0i64, v8, (FILE_OBJECT **)&Object, &pHandleInformation);
  if( result >= 0 )
  {
    v11 = (FILE_OBJECT *)Object;
    v12 = *((_DWORD *)Object + 20);
    if( ((~(unsigned __int8)(v12 >> 5) & 4 | 2) & pHandleInformation.GrantedAccess) != 0 )
    {
      if( (v12 & 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) = v8;
          v11 = (FILE_OBJECT *)Object;
          IopWaitAndAcquireFileObjectLock(Object, v16);
        }
        else
        {
          if( v15 )
            *(_BYTE *)(v15 + 26) |= 1u;
          v11 = (FILE_OBJECT *)Object;
          ObfReferenceObject(Object);
        }
        v17 = 1;
        v18 = 0i64;
        goto LABEL_15;
      }
      Pool_1 = (_KEVENT *)IopVerifierExAllocatePool_1(NonPagedPoolNx, 0x18ui64);
      v18 = Pool_1;
      if( Pool_1 )
      {
        KeInitializeEvent(Pool_1, SynchronizationEvent, 0);
        v17 = 0;
LABEL_15:
        IopResetEvent(v11);
        DeviceObject = IoGetRelatedDeviceObject(v11);
        Irp = IopAllocateIrpExReturn(DeviceObject, *((_BYTE *)DeviceObject + 76), 0, retaddr);
        v20 = Irp;
        if( Irp )
        {
          *((_QWORD *)Irp + 24) = v11;
          *((_QWORD *)Irp + 19) = CurrentThread;
          *((_BYTE *)Irp + 64) = v8;
          if( v17 )
          {
            p_LocalIoStatus = IoStatusBlock;
            v22 = 0i64;
          }
          else
          {
            *((_DWORD *)Irp + 4) = 4;
            p_LocalIoStatus = &LocalIoStatus;
            v22 = v18;
          }
          *((_QWORD *)v20 + 10) = v22;
          *((_QWORD *)v20 + 9) = p_LocalIoStatus;
          *((_QWORD *)v20 + 11) = 0i64;
          v23 = *((_QWORD *)v20 + 23);
          *(_BYTE *)(v23 - 72) = 9;
          *(_QWORD *)(v23 - 24) = v11;
          if( (v5 & 1) != 0 )
          {
            *(_BYTE *)(v23 - 71) = 2;
          }
          else if( (v5 & 2) != 0 )
          {
            *(_BYTE *)(v23 - 71) = 3;
          }
          else if( (v5 & 4) != 0 )
          {
            *(_BYTE *)(v23 - 71) = 4;
          }
          LODWORD(v26) = 2;
          result = IopSynchronousServiceTail(DeviceObject, v20, v11, 0, v8, v17, v26);
          if( !v17 )
            return IopSynchronousApiServiceTail((unsigned int)result, v18, v20, v8, &LocalIoStatus, IoStatusBlock);
        }
        else
        {
          if( v18 )
            ExFreePoolWithTag(v18, 0);
          IopAllocateIrpCleanup((PUNICODE_STRING)v11);
          return -1073741670;
        }
        return result;
      }
      v25 = -1073741670;
    }
    else
    {
      v25 = -1073741790;
    }
    HalPutDmaAdapter((PADAPTER_OBJECT)v11);
    return v25;
  }
  return result;
}

Referenced by:

NtFlushBuffersFile