KiForceIdleParkUnparkProcessor

INT64 __fastcall KiForceIdleParkUnparkProcessor(VOID *pAccessToken, _DEVICE_MAP **ppDevMap){
  unsigned int v3; 
  unsigned int v4; 
  INT64 result; 
  unsigned __int64 v6; 
  bool v7; 
  int v8; 
  int v9; 
  UINT64 SpinCount; 
  if( (_BYTE)ppDevMap )
  {
    if( *((_BYTE *)pAccessToken + 33212) )
    {
      if( !*((_BYTE *)pAccessToken + 32819) )
        goto LABEL_7;
      v4 = KiProcessorIndexToNumberMappingTable[*((unsigned int *)pAccessToken + 9)];
      _InterlockedOr64((volatile signed __int64 *)&KiForceIdleSoftParkRestoreMask.Bitmap[v4 >> 6], 1i64 << (v4 & 0x3F));
    }
    else
    {
      v3 = KiProcessorIndexToNumberMappingTable[*((unsigned int *)pAccessToken + 9)];
      _InterlockedOr64(&qword_140C125A8[v3 >> 6], 1i64 << (v3 & 0x3F));
    }
    LOBYTE(result) = KeTransitionProcessorParkState((__int64)pAccessToken, 1);
LABEL_7:
    LODWORD(SpinCount) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)pAccessToken + 12, 0i64) )
    {
      do
      {
        KeYieldProcessorEx(&SpinCount);
        result = *((_QWORD *)pAccessToken + 6);
      }
      while( result );
    }
    *((_BYTE *)pAccessToken + 12585) = 0;
    *((_BYTE *)pAccessToken + 12587) = 0;
    _InterlockedAnd64((volatile signed __int64 *)pAccessToken + 6, 0i64);
    return result;
  }
  v6 = (unsigned __int64)(unsigned int)KiProcessorIndexToNumberMappingTable[*((unsigned int *)pAccessToken + 9)] >> 6;
  v7 = *((_BYTE *)pAccessToken + 32819) == 0;
  v8 = KiProcessorIndexToNumberMappingTable[*((unsigned int *)pAccessToken + 9)];
  if( v7 )
  {
    _InterlockedAnd64(&qword_140C125A8[v6], ~(1i64 << (v8 & 0x3F)));
    v9 = 0;
  }
  else
  {
    _InterlockedAnd64((volatile signed __int64 *)&KiForceIdleSoftParkRestoreMask.Bitmap[v6], ~(1i64 << (v8 & 0x3F)));
    v9 = 2;
  }
  LOBYTE(result) = KeTransitionProcessorParkState((__int64)pAccessToken, v9);
  return result;
}

Referenced by:

KiForceIdleParkUnparkDpcRoutine
KiForceIdleUpdateSchedulerParkState