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