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