ExRegisterCallback
PVOID __stdcall ExRegisterCallback(
PCALLBACK_OBJECT CallbackObject,
PCALLBACK_FUNCTION CallbackFunction,
PVOID CallbackContext){
VOID **PoolWithTag;
VOID **v7;
char v8;
unsigned __int64 v9;
PCALLBACK_OBJECT *v10;
ObfReferenceObjectWithTag(CallbackObject, 0x746C6644ui64);
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x30ui64, 1699889731i64);
v7 = PoolWithTag;
if( PoolWithTag )
{
*((_DWORD *)PoolWithTag + 10) = 0;
PoolWithTag[2] = CallbackObject;
v8 = 0;
PoolWithTag[3] = CallbackFunction;
PoolWithTag[4] = CallbackContext;
*((_BYTE *)PoolWithTag + 44) = 0;
v9 = (unsigned __int8)KeAcquireSpinLockRaiseToDpc((UINT64 *)CallbackObject + 1);
if( *((_BYTE *)CallbackObject + 32)
|| *((PCALLBACK_OBJECT *)CallbackObject + 2) == (PCALLBACK_OBJECT)((char *)CallbackObject + 16) )
{
v8 = 1;
v10 = (PCALLBACK_OBJECT *)*((_QWORD *)CallbackObject + 3);
if( *v10 != (PCALLBACK_OBJECT)((char *)CallbackObject + 16) )
__fastfail(3u);
*v7 = (char *)CallbackObject + 16;
v7[1] = v10;
*v10 = (PCALLBACK_OBJECT)v7;
*((_QWORD *)CallbackObject + 3) = v7;
}
KxReleaseSpinLock((UINT64 *)CallbackObject + 1);
__writecr8(v9);
if( !v8 )
{
ExFreePoolWithTag(v7, 0);
ObfDereferenceObjectWithTag(CallbackObject, 0x746C6644ui64);
return 0i64;
}
return v7;
}
else
{
ObfDereferenceObjectWithTag(CallbackObject, 0x746C6644ui64);
return 0i64;
}
}Referenced by:
EtwpInitialize
HaliInitPowerManagement
HalpMiscInitializeKsr
HvlPhase2Initialize
IoRegisterBootDriverCallback
IoRegisterContainerNotification
KeRegisterProcessorChangeCallback
PiCslInitialize
PiKsrNotifyInitialize
PopSetupKsrCallbacks
PopUmpoInitializeChannel
PopUmpoInitializeMonitorChannel
SeRegisterImageVerificationCallback