PsSetLoadImageNotifyRoutineEx
NTSTATUS __fastcall PsSetLoadImageNotifyRoutineEx(VOID *a1, UINT64 a2){
VOID *v2;
VOID *v3;
_EX_RUNDOWN_REF *v5;
__int64 v6;
NTSTATUS v7;
PEVENT_DATA_DESCRIPTOR UserData;
VOID *v10;
NTSTATUS v11;
VOID *v12;
_EVENT_DATA_DESCRIPTOR v13;
int *v14;
int v15;
int v16;
if( (a2 & 0xFFFFFFFFFFFFFFFEui64) != 0 )
return -1073741584;
v5 = (_EX_RUNDOWN_REF *)ExAllocateCallBack((INT64)a1, (INT64 *)a2, v2, v3, UserData, v10);
if( v5 )
{
v6 = 0i64;
while( !ExCompareExchangeCallBack(&CallBack + 2 * v6, v5, 0i64) )
{
v6 = (unsigned int)(v6 + 1);
if( (unsigned int)v6 >= 0x40 )
{
ExFreePoolWithTag(v5, 0);
goto LABEL_14;
}
}
_InterlockedIncrement(&PspLoadImageNotifyRoutineCount);
if( (PspNotifyEnableMask & 1) == 0 )
_interlockedbittestandset(&PspNotifyEnableMask, 0);
v7 = 0;
}
else
{
LABEL_14:
v7 = -1073741670;
}
v11 = v7;
v12 = a1;
if( *(&ExBootDevicesRemovedEvent + 379) )
{
v13.Reserved = 0;
v16 = 0;
v13.Ptr = (unsigned __int64)&v12;
v13.Size = 8;
v14 = &v11;
v15 = 4;
EtwWrite(*(&ExBootDevicesRemovedEvent + 379), &KERNEL_AUDIT_API_PSSETLOADIMAGENOTIFYROUTINE, 0, 2u, &v13);
}
return v7;
}Referenced by:
PsSetLoadImageNotifyRoutine