KeRegisterBugCheckReasonCallback
BOOL __stdcall KeRegisterBugCheckReasonCallback(
PKBUGCHECK_REASON_CALLBACK_RECORD CallbackRecord,
PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine,
_KBUGCHECK_CALLBACK_REASON Reason,
PUCHAR Component){
__int64 v5;
BOOL v8;
unsigned __int8 CurrentIrql;
_LIST_ENTRY *v10;
_LIST_ENTRY *v11;
_LIST_ENTRY *Flink;
_LIST_ENTRY *Blink;
v5 = Reason;
v8 = 1;
CurrentIrql = KeGetCurrentIrql();
__writecr8(0xFui64);
KxAcquireSpinLock(&KeBugCheckCallbackLock);
if( *(&CallbackRecord->State + 4) )
goto LABEL_14;
if( (_DWORD)v5 == 4 || (v10 = (_LIST_ENTRY *)((char *)&KiSwapEvent + 368), (_DWORD)v5 == 6) )
v10 = (_LIST_ENTRY *)((char *)&KiSwapEvent + 352);
if( KiCheckForDuplicateBugCheckCallback(v10, &CallbackRecord->Entry) )
{
LABEL_14:
v8 = 0;
goto LABEL_10;
}
CallbackRecord->CallbackRoutine = CallbackRoutine;
*(_DWORD *)&CallbackRecord->State = v5;
CallbackRecord->Component = Component;
*(_QWORD *)&CallbackRecord->Checksum = (char *)CallbackRoutine + v5 + (_QWORD)Component;
*(&CallbackRecord->State + 4) = 1;
if( (_DWORD)v5 == 1023 )
_InterlockedIncrement(&KiRecoveryCallbackCount);
if( (_DWORD)v5 == 7 )
{
Blink = v11->Blink;
if( Blink->Flink == v11 )
{
CallbackRecord->Entry.Flink = v11;
CallbackRecord->Entry.Blink = Blink;
Blink->Flink = &CallbackRecord->Entry;
v11->Blink = &CallbackRecord->Entry;
goto LABEL_10;
}
LABEL_15:
__fastfail(3u);
}
Flink = v11->Flink;
if( v11->Flink->Blink != v11 )
goto LABEL_15;
CallbackRecord->Entry.Flink = Flink;
CallbackRecord->Entry.Blink = v11;
Flink->Blink = &CallbackRecord->Entry;
v11->Flink = &CallbackRecord->Entry;
LABEL_10:
KxReleaseSpinLock(&KeBugCheckCallbackLock);
__writecr8(CurrentIrql);
return v8;
}Referenced by:
EtwpInitialize
HalpFirmwareInitDiscard
HalpMiscInitDiscard
HvlPhase1Initialize
HvlpInitializeHvCrashdump
IopInitializeTriageDumpData
PopRecorderInit
PspInitPhase0
SmPrepareForFatalHeapCorruption
SmPrepareForFatalPageError