NtNotifyChangeDirectoryFileEx
VOID __fastcall NtNotifyChangeDirectoryFileEx(){
void *v0;
void *v1;
INT64 v2;
__int64 v3;
void *v4;
void *v5;
INT8 v6;
__int64 v7;
ULONG v8;
CHAR v9;
PFILE_OBJECT v10;
UINT64 v11;
NTSTATUS v12;
UINT8 v13;
UINT8 v14;
_DEVICE_OBJECT *RelatedDeviceObject;
IRP *Irp;
IRP *v17;
__int64 v18;
POOL_TYPE v19;
int v20;
char v21;
_ETHREAD *v22;
PFILE_OBJECT v23;
__int64 v24;
INT64 v25;
_WORD *PoolWithQuota;
_MDL *Mdl;
INT64 v28;
IRP *Object;
PVOID *Objecta;
UINT64 v31;
char v32;
PFILE_OBJECT FileObject;
PADAPTER_OBJECT DmaAdapter;
PVOID VirtualAddress;
_ETHREAD *CurrentThread;
VOID *retaddr;
INT64 v38;
__int64 v39;
UINT64 *v40;
volatile void *Address;
SIZE_T Length;
int v43;
char v44;
POOL_TYPE v45;
v39 = v3;
v38 = v2;
v4 = v0;
v5 = v1;
FileObject = 0i64;
DmaAdapter = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = *((_BYTE *)CurrentThread + 562);
if( !v6 )
{
v8 = Length;
goto LABEL_8;
}
v7 = (__int64)v40;
if( (unsigned __int64)v40 >= 0x7FFFFFFF0000i64 )
v7 = 0x7FFFFFFF0000i64;
*(_DWORD *)v7 = *(_DWORD *)v7;
v8 = Length;
if( (_DWORD)Length )
ProbeForWrite((VOID *)Address, (unsigned int)Length, 4ui64);
if( (v43 & 0xFFFFF000) == 0 && v43 )
{
LABEL_8:
v9 = 1;
if( IopReferenceFileObject(v5, 1ui64, v6, &FileObject, 0i64) < 0 )
return;
v10 = FileObject;
if( FileObject->CompletionContext && (v38 & 0xFFFFFFFFFFFFFFFEui64) != 0 )
goto LABEL_36;
if( v4 )
{
VirtualAddress = 0i64;
v12 = ObReferenceObjectByHandle(v4, 2u, (POBJECT_TYPE)ExEventObjectType, v6, &VirtualAddress, 0i64);
DmaAdapter = (PADAPTER_OBJECT)VirtualAddress;
if( v12 < 0 )
{
LABEL_36:
HalPutDmaAdapter((PADAPTER_OBJECT)v10);
return;
}
KeResetEvent(VirtualAddress, v11, v13, v14, Object);
}
if( (v10->Flags & 2) != 0 )
{
v22 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v22 + 242);
v23 = FileObject;
LODWORD(v24) = KeAbPreAcquire(&FileObject->Lock, 0i64, 0i64);
if( _InterlockedExchange((volatile __int32 *)&v23->Busy, 1) )
{
LOBYTE(v25) = v6;
v10 = FileObject;
IopWaitAndAcquireFileObjectLock(FileObject, v25);
}
else
{
if( v24 )
*(_BYTE *)(v24 + 26) |= 1u;
v10 = FileObject;
ObfReferenceObject(FileObject);
}
v32 = 1;
}
else
{
v9 = 0;
v32 = 0;
if( v6 )
IopMarkApcRoutineIfAsynchronousIo32(&v40, &v38, 0);
}
IopResetEvent(v10);
RelatedDeviceObject = IoGetRelatedDeviceObject(v10);
Irp = IopAllocateIrpExReturn(RelatedDeviceObject, *((_BYTE *)RelatedDeviceObject + 76), v9 ^ 1u, retaddr);
v17 = Irp;
VirtualAddress = Irp;
if( !Irp )
{
IopAllocateIrpCleanup((PUNICODE_STRING)v10);
return;
}
*((_QWORD *)Irp + 24) = v10;
*((_QWORD *)Irp + 19) = CurrentThread;
*((_BYTE *)Irp + 64) = v6;
*((_QWORD *)Irp + 10) = DmaAdapter;
*((_QWORD *)Irp + 9) = v40;
*((_QWORD *)Irp + 11) = v38;
*((_QWORD *)Irp + 12) = v39;
v18 = *((_QWORD *)Irp + 23);
*(_BYTE *)(v18 - 72) = 12;
v19 = v45;
*(_BYTE *)(v18 - 71) = (v45 == NonPagedPoolMustSucceed) + 2;
*(_QWORD *)(v18 - 24) = v10;
if( !v8 )
goto LABEL_21;
v20 = *((_DWORD *)RelatedDeviceObject + 12);
if( (v20 & 4) != 0 )
{
PoolWithQuota = IopVerifierExAllocatePoolWithQuota(v19, v8);
*((_QWORD *)v17 + 3) = PoolWithQuota;
if( !IopDisableBufferedIoInit )
memset((INT64)PoolWithQuota, 0i64);
*((_DWORD *)v17 + 4) = 112;
v9 = v32;
v19 = v45;
}
else if( (v20 & 0x10) != 0 )
{
Mdl = IoAllocateMdl((PVOID)Address, v8, 0, 1u, v17);
if( !Mdl )
RtlRaiseStatus(-1073741670);
LODWORD(Objecta) = *(unsigned __int8 *)(v18 - 72);
IopProbeAndLockPages_1(Mdl, v6, v28, RelatedDeviceObject, (INT64)Objecta);
v19 = v45;
goto LABEL_21;
}
*((_QWORD *)v17 + 14) = Address;
LABEL_21:
*(_DWORD *)(v18 - 64) = v8;
*(_DWORD *)(v18 - 56) = v43;
if( *(_BYTE *)(v18 - 71) == 3 )
*(_DWORD *)(v18 - 48) = v19;
*(_BYTE *)(v18 - 70) = 0;
v21 = *(_BYTE *)(v18 - 70);
if( v44 )
v21 = 1;
*(_BYTE *)(v18 - 70) = v21;
LODWORD(v31) = 2;
IopSynchronousServiceTail(RelatedDeviceObject, v17, v10, 0, v6, v9, v31);
}
}Referenced by:
NtNotifyChangeDirectoryFile