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