KdEnableDebuggerWithLock

NTSTATUS __stdcall KdEnableDebuggerWithLock(UINT8 TakeLock){
  unsigned __int8 CurrentIrql; 
  int v4; 
  CurrentIrql = 0;
  if( KdPitchDebugger )
    return -1073740972;
  if( KdBlockEnable )
    return -1073741790;
  if( TakeLock )
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    KxAcquireSpinLock(&KdDebuggerLock);
  }
  v4 = KdDisableCount;
  if( KdDisableCount )
  {
    --KdDisableCount;
    if( v4 == 1 && KdPreviouslyEnabled )
    {
      if( TakeLock )
      {
        KdPowerTransitionEx(1073741825i64, 0);
        KdpDebugRoutineSelect = 1;
        LOBYTE(KdDebuggerEnabled) = 1;
        KUSER_SHARED_DATA.KdDebuggerEnabled = 1;
        KdpRestoreAllBreakpoints();
      }
      else
      {
        PoHiberInProgress = 1;
        KdInitSystem(0i64, 0i64);
        KdpRestoreAllBreakpoints();
        PoHiberInProgress = 0;
      }
    }
    if( TakeLock )
    {
      KxReleaseSpinLock(&KdDebuggerLock);
      __writecr8(CurrentIrql);
    }
  }
  else
  {
    if( TakeLock )
    {
      KxReleaseSpinLock(&KdDebuggerLock);
      __writecr8(CurrentIrql);
      return -1073741811;
    }
    KdInitSystem(0i64, 0i64);
  }
  return 0;
}

Referenced by:

KdEnableDebugger
KeBugCheck2