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