PoInitiateProcessorWake
INT8 __fastcall PoInitiateProcessorWake(UINT64 a1){
unsigned int v1;
_KPRCB *Prcb;
_PPM_IDLE_STATES *IdleStates;
_PPM_IDLE_SYNCHRONIZATION_STATE *p_Synchronization;
unsigned int AsLong_high;
INT8 v6;
void *Context;
UINT8 updated;
char v9;
_QWORD v11[2];
__int128 v12;
_KAFFINITY_EX Dest;
v1 = a1;
memset(&Dest, 0i64, sizeof(Dest));
Prcb = KeGetPrcb(v1);
IdleStates = Prcb->PowerState.IdleStates;
p_Synchronization = (_PPM_IDLE_SYNCHRONIZATION_STATE *)&Prcb->PowerState.Synchronization;
AsLong_high = HIBYTE(Prcb->PowerState.Synchronization.AsLong);
v6 = 0;
Context = IdleStates->PrepareInfo.Context;
while( (_BYTE)AsLong_high != 1 && ((unsigned __int8)(AsLong_high - 1) <= 5u || (unsigned __int8)AsLong_high >= 9u) )
{
if( (_BYTE)AsLong_high == 2 )
{
AsLong_high = HIBYTE(p_Synchronization->AsLong);
}
else if( (((_BYTE)AsLong_high - 4) & 0xFD) != 0 )
{
if( (_BYTE)AsLong_high == 5 )
{
LOBYTE(AsLong_high) = PpmIdleUpdateSynchronizationState(p_Synchronization, 7u, 5u);
if( (_BYTE)AsLong_high == 5 )
{
KeCopyAffinityEx(&Dest, &IdleStates->PrimaryProcessorMask);
if( !KeIsEmptyAffinityEx(&Dest.Count) )
HalRequestIpi(IpiAffinity, &Dest);
return v6;
}
}
}
else
{
updated = PpmIdleUpdateSynchronizationState(p_Synchronization, 8u, AsLong_high);
if( updated == v9 )
{
if( !Prcb->PowerState.PepWokenTransition )
return 1;
v11[0] = 0i64;
v11[1] = PopIdleTransitionTimeout;
v12 = (unsigned __int64)Prcb;
while( !IdleStates->IdleIsHalted(Context) )
{
if( HIBYTE(p_Synchronization->AsLong) != 8 )
return v6;
PpmIdleTransitionStall((__int64)v11);
}
if( IdleStates->InitiateWakeStamp == -1i64 )
_InterlockedExchange64((volatile __int64 *)&IdleStates->InitiateWakeStamp, KeQueryPerformanceCounter(0i64));
return IdleStates->IdleInitiateWake(Context);
}
LOBYTE(AsLong_high) = updated;
}
_mm_pause();
}
return v6;
}Referenced by:
No references.