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