IopCleanupNotifications
VOID __stdcall IopCleanupNotifications(PVOID DriverObject, VOID *IoObject){
_ETHREAD *CurrentThread;
VOID **v5;
VOID **v6;
VOID *v7;
VOID **v8;
VOID ***v9;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C452E0 + 119, 0i64);
v5 = (VOID **)*(&stru_140C452E0 + 120);
while( v5 != (VOID **)((char *)&stru_140C452E0 + 960) )
{
v6 = v5;
v5 = (VOID **)*v5;
v7 = v6[2];
if( v7 == DriverObject && (!IoObject || v6[5] == IoObject) )
{
ObfDereferenceObjectWithTag(v7, 0x746C6644ui64);
ExUnregisterCallback(v6[4]);
v8 = (VOID **)*v6;
if( *((VOID ***)*v6 + 1) != v6 || (v9 = (VOID ***)v6[1], *v9 != v6) )
__fastfail(3u);
*v9 = v8;
v8[1] = v9;
ExFreePoolWithTag(v6, 0);
}
}
ExReleasePushLockEx((ULONG_PTR)&stru_140C452E0 + 952, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}Referenced by:
IopDeleteDevice
IopDeleteFileObjectExtension
IopUnloadDriver