ExUnregisterCallback

VOID __stdcall ExUnregisterCallback(PVOID CbRegistration){
  UINT64 v1; 
  UINT64 *v2; 
  unsigned __int8 v4; 
  UINT64 v5; 
  UINT8 v6; 
  UINT8 v7; 
  unsigned __int8 v8; 
  _QWORD *v9; 
  PVOID *v10; 
  UINT64 v11; 
  IRP *v12; 
  v2 = (UINT64 *)*((_QWORD *)CbRegistration + 2);
  KeAcquireSpinLockRaiseToDpc(v2 + 1, v1);
  while( 1 )
  {
    v8 = v4;
    if( !*((_DWORD *)CbRegistration + 10) )
      break;
    *((_BYTE *)CbRegistration + 44) = 1;
    KeResetEvent(&ExpCallbackEvent, v5, v6, v7, v12);
    KxReleaseSpinLock(v2 + 1);
    __writecr8(v8);
    KeWaitForSingleObject(&ExpCallbackEvent, Executive, 0, 0, 0i64);
    KeAcquireSpinLockRaiseToDpc(v2 + 1, v11);
  }
  v9 = *(_QWORD **)CbRegistration;
  v10 = (PVOID *)*((_QWORD *)CbRegistration + 1);
  if( *(PVOID *)(*(_QWORD *)CbRegistration + 8i64) != CbRegistration || *v10 != CbRegistration )
    __fastfail(3u);
  *v10 = v9;
  v9[1] = v10;
  KxReleaseSpinLock(v2 + 1);
  __writecr8(v8);
  ExFreePoolWithTag(CbRegistration, 0);
  ObfDereferenceObjectWithTag(v2, 0x746C6644ui64);
}

Referenced by:

IoRegisterContainerNotification
IoUnregisterBootDriverCallback
IoUnregisterContainerNotification
IopCleanupNotifications
KeDeregisterProcessorChangeCallback
KeRegisterProcessorChangeCallback
PopUmpoInitializeMonitorChannel
SeUnregisterImageVerificationCallback