PoInitiateProcessorWake
char __fastcall PoInitiateProcessorWake(unsigned int a1){
unsigned __int64 v2;
unsigned __int64 v3;
__int64 v4;
UINT32 *v5;
int v6;
char v7;
__int64 v8;
char updated;
char v10;
_RTL_PROCESS_MODULES *v11;
UINT64 v12;
UINT64 *v13;
_LIST_ENTRY LoadOrderListHead;
__int128 v16;
INT64 result[22];
memset((INT64)result, 0i64);
KeGetPrcb(a1);
v3 = v2;
v4 = *(_QWORD *)(v2 + 0x8000);
v5 = (UINT32 *)(v2 + 32832);
v6 = HIBYTE(*(_DWORD *)(v2 + 32832));
v7 = 0;
v8 = *(_QWORD *)(v4 + 488);
while( (_BYTE)v6 != 1 && ((unsigned __int8)(v6 - 1) <= 5u || (unsigned __int8)v6 >= 9u) )
{
if( (_BYTE)v6 == 2 )
{
v6 = HIBYTE(*v5);
}
else if( (((_BYTE)v6 - 4) & 0xFD) != 0 )
{
if( (_BYTE)v6 == 5 )
{
LOBYTE(v6) = PpmIdleUpdateSynchronizationState(v5, 7u, 5u);
if( (_BYTE)v6 == 5 )
{
KeCopyAffinityEx((__int64)result, (unsigned __int16 *)(v4 + 72));
if( !(unsigned int)KeIsEmptyAffinityEx(result) )
HalRequestIpi(0, result);
return v7;
}
}
}
else
{
updated = PpmIdleUpdateSynchronizationState(v5, 8u, v6);
if( updated == v10 )
{
if( !*(_BYTE *)(v3 + 32817) )
return 1;
LoadOrderListHead.Flink = 0i64;
LoadOrderListHead.Blink = (_LIST_ENTRY *)PopIdleTransitionTimeout;
v16 = v3;
while( !(*(unsigned __int8(__fastcall **)(__int64))(v4 + 472))(v8) )
{
if( HIBYTE(*v5) != 8 )
return v7;
PpmIdleTransitionStall(&LoadOrderListHead, v11, v12, v13);
}
if( *(_QWORD *)(v4 + 56) == -1i64 )
_InterlockedExchange64((volatile __int64 *)(v4 + 56), KeQueryPerformanceCounter(0i64).QuadPart);
return(*(__int64(__fastcall **)(__int64))(v4 + 480))(v8);
}
LOBYTE(v6) = updated;
}
_mm_pause();
}
return v7;
}Referenced by:
No references.