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