KeSwitchFrozenProcessor
KCONTINUE_STATUS __stdcall KeSwitchFrozenProcessor(UINT64 ProcessorNumber){
__int64 v1;
__int64 v2;
struct _KPRCB *CurrentPrcb;
volatile signed __int32 *v5;
volatile signed __int32 *v6;
v1 = (unsigned int)ProcessorNumber;
if( (unsigned int)ProcessorNumber < (unsigned int)KeQueryActiveProcessorCountEx(0xFFFFu) && !PoAllProcIntrDisabled )
{
_mm_lfence();
v2 = (__int64)*(&KiProcessorBlock + v1);
if( ((*(_DWORD *)(v2 + 11656) - 2) & 0xFFFFFFFD) == 0 )
{
CurrentPrcb = KeGetCurrentPrcb();
KiSetDebuggerOwner((_KPRCB *)v2);
if( (*((_DWORD *)CurrentPrcb + 2914) & 0xF) == 2 )
return 3;
if( (*((_DWORD *)CurrentPrcb + 2914) & 0xF) != 4 )
return 0;
v5 = (volatile signed __int32 *)*((_QWORD *)CurrentPrcb + 4247);
if( v5 )
_InterlockedOr(v5, 0x20000u);
KeQueryPerformanceCounter(0i64);
while( CurrentPrcb != (struct _KPRCB *)KiDebuggerOwner )
KiCheckStall(CurrentPrcb, 1u);
v6 = (volatile signed __int32 *)*((_QWORD *)CurrentPrcb + 4247);
if( v6 )
_InterlockedAnd(v6, 0xFFFDFFFF);
}
}
return 2;
}Referenced by:
KdpSendWaitContinue