NtFlushBuffersFileEx

NTSTATUS __stdcall NtFlushBuffersFileEx(
        VOID *FileHandle,
        UINT64 Flags,
        VOID *Parameters,
        UINT64 ParametersSize,
        _IO_STATUS_BLOCK *IoStatusBlock){
  char v5; 
  _ETHREAD *CurrentThread; 
  INT8 PreviousMode; 
  __int64 v9; 
  NTSTATUS result; 
  _FILE_OBJECT *v11; 
  unsigned int v12; 
  bool v13; 
  _ETHREAD *v14; 
  _FILE_OBJECT *v15; 
  _BYTE *v16; 
  NTSTATUS v17; 
  UINT8 SynchronousIo; 
  _KEVENT *v19; 
  _DEVICE_OBJECT *v20; 
  _IRP *Irp; 
  _IRP *v22; 
  _IO_STATUS_BLOCK *p_LocalIoStatus; 
  _KEVENT *v24; 
  _IO_STACK_LOCATION *CurrentStackLocation; 
  VOID **Pool_1; 
  _FILE_OBJECT *pFileObject; 
  _OBJECT_HANDLE_INFORMATION pHandleInformation; 
  _IO_STATUS_BLOCK LocalIoStatus; 
  VOID *retaddr; 
  PDEVICE_OBJECT DeviceObject; 

  v5 = Flags;
  pFileObject = 0i64;
  LocalIoStatus = 0i64;
  pHandleInformation = 0i64;
  if( Parameters || (_DWORD)ParametersSize )
    return -1073741811;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  PreviousMode = CurrentThread->Tcb.PreviousMode;
  if( PreviousMode )
  {
    v9 = 0x7FFFFFFF0000i64;
    if( (unsigned __int64)IoStatusBlock < 0x7FFFFFFF0000i64 )
      v9 = (__int64)IoStatusBlock;
    *(_DWORD *)v9 = *(_DWORD *)v9;
  }
  result = IopReferenceFileObject(FileHandle, 0i64, PreviousMode, &pFileObject, &pHandleInformation);
  if( result >= 0 )
  {
    v11 = pFileObject;
    v12 = pFileObject->Flags;
    if( ((~(unsigned __int8)(v12 >> 5) & 4 | 2) & pHandleInformation.GrantedAccess) != 0 )
    {
      if( (v12 & 2) != 0 )
      {
        v13 = (v12 & 4) != 0;
        v14 = (_ETHREAD *)KeGetCurrentThread();
        --v14->Tcb.KernelApcDisable;
        v15 = pFileObject;
        v16 = KeAbPreAcquire(pFileObject->gap80, 0i64, 0i64);
        LOBYTE(DeviceObject) = 0;
        if( _InterlockedExchange((volatile __int32 *)&v15->Busy, 1) )
        {
          v11 = pFileObject;
          v17 = IopWaitAndAcquireFileObjectLock(pFileObject, PreviousMode, v13, v16, (INT64)&DeviceObject);
        }
        else
        {
          if( v16 )
            v16[26] |= 1u;
          v11 = pFileObject;
          ObfReferenceObject(pFileObject);
          v17 = 0;
        }
        if( !(_BYTE)DeviceObject )
        {
          SynchronousIo = 1;
          v19 = 0i64;
          goto LABEL_16;
        }
      }
      else
      {
        Pool_1 = IopVerifierExAllocatePool_1(0x200ui64, 0x18ui64);
        v19 = (_KEVENT *)Pool_1;
        if( Pool_1 )
        {
          KeInitializeEvent((INT64)Pool_1, 1, 0);
          SynchronousIo = 0;
LABEL_16:
          IopResetEvent(v11);
          LODWORD(v20) = IoGetRelatedDeviceObject((INT64)v11);
          DeviceObject = v20;
          Irp = IopAllocateIrpExReturn(v20, v20->StackSize, 0, retaddr);
          v22 = Irp;
          if( Irp )
          {
            Irp->Tail.OriginalFileObject = v11;
            Irp->Tail.Thread = CurrentThread;
            Irp->RequestorMode = PreviousMode;
            if( SynchronousIo )
            {
              p_LocalIoStatus = IoStatusBlock;
              v24 = 0i64;
            }
            else
            {
              Irp->Flags = 4;
              p_LocalIoStatus = &LocalIoStatus;
              v24 = v19;
            }
            v22->UserEvent = v24;
            v22->UserIosb = p_LocalIoStatus;
            v22->Overlay.UserApcRoutine = 0i64;
            CurrentStackLocation = v22->Tail.CurrentStackLocation;
            CurrentStackLocation[-1].MajorFunction = 9;
            CurrentStackLocation[-1].FileObject = v11;
            if( (v5 & 1) != 0 )
            {
              CurrentStackLocation[-1].MinorFunction = 2;
            }
            else if( (v5 & 2) != 0 )
            {
              CurrentStackLocation[-1].MinorFunction = 3;
            }
            else if( (v5 & 4) != 0 )
            {
              CurrentStackLocation[-1].MinorFunction = 4;
            }
            result = IopSynchronousServiceTail(DeviceObject, v22, v11, 0, PreviousMode, SynchronousIo, OtherTransfer);
            if( !SynchronousIo )
              return IopSynchronousApiServiceTail(
                       (unsigned int)result,
                       v19,
                       v22,
                       PreviousMode,
                       &LocalIoStatus,
                       IoStatusBlock);
          }
          else
          {
            if( v19 )
              ExFreePoolWithTag(v19, 0);
            IopAllocateIrpCleanup(v11, 0i64);
            return -1073741670;
          }
          return result;
        }
        v17 = -1073741670;
      }
    }
    else
    {
      v17 = -1073741790;
    }
    HalPutDmaAdapter((PADAPTER_OBJECT)v11);
    return v17;
  }
  return result;
}

Referenced by:

NtFlushBuffersFile