KdEnableDebuggerWithLock

VOID __fastcall KdEnableDebuggerWithLock(UINT8 TakeLock){
  unsigned __int8 CurrentIrql; 
  int v3; 

  CurrentIrql = 0;
  if( !KdPitchDebugger && !KdBlockEnable )
  {
    if( TakeLock )
    {
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(2ui64);
      KxAcquireSpinLock(&KdDebuggerLock);
    }
    v3 = KdDisableCount;
    if( !KdDisableCount )
    {
      if( !TakeLock )
      {
        KdInitSystem(0i64, 0i64);
        return;
      }
      goto LABEL_14;
    }
    --KdDisableCount;
    if( v3 == 1 && KdPreviouslyEnabled )
    {
      if( TakeLock )
      {
        KdPowerTransitionEx(1073741825i64, 0);
        dword_140C50A74 = 1;
        LOBYTE(KdDebuggerEnabled) = 1;
        KUSER_SHARED_DATA.KdDebuggerEnabled = 1;
        KdpRestoreAllBreakpoints();
      }
      else
      {
        PoHiberInProgress = 1;
        KdInitSystem(0i64, 0i64);
        KdpRestoreAllBreakpoints();
        PoHiberInProgress = 0;
      }
    }
    if( TakeLock )
    {
LABEL_14:
      KxReleaseSpinLock(&KdDebuggerLock);
      __writecr8(CurrentIrql);
    }
  }
}

Referenced by:

KdEnableDebugger
KeBugCheck2