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