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