PopHandleWakeSources
VOID __stdcall PopHandleWakeSources(){
int v0;
unsigned int v1;
__int64 v2;
VOID *v3;
_POP_WAKE_SOURCE *v4;
_POP_WAKE_SOURCE **v5;
__int64 *v6;
_KLOCK_QUEUE_HANDLE LockHandle;
UINT8 v8;
v0 = 0;
v8 = 0;
v1 = 4;
memset(&LockHandle, 0, sizeof(LockHandle));
if( (*(&stru_140C23628 + 582) & 0x200000) == 0 && (*(&stru_140C23628 + 2960) & 1) == 0 )
{
if( (*(&stru_140C23628 + 582) & 0x400000) == 0 && (*(&stru_140C23628 + 2960) & 2) == 0 )
{
if( PopValidateRTCWake(&v8) && (*(&stru_140C23628 + 582) & 0x100000) == 0 )
v0 = 4;
}
else
{
v0 = 2;
}
}
else
{
v0 = 1;
}
PopAcquireWakeSourceSpinLock(&LockHandle);
v2 = *(&stru_140C23628 + 357);
if( *(&stru_140C23628 + 357) && !v0 )
PopWakeInfoReference(*(&stru_140C23628 + 357));
PopReleaseWakeSourceSpinLock(&LockHandle);
if( !v2 )
{
KeSetEvent((PRKEVENT)((char *)&stru_140C23628 + 2936), 0, 0);
return;
}
if( !v0 )
{
KeInitializeDpc((PRKDPC)(v2 + 48), PopWakeSourceTimeoutDpc, 0i64);
KeInitializeTimerEx(v2 + 112, 0);
KiSetTimerEx((_KTIMER *)(v2 + 112), (_LARGE_INTEGER)-20000000i64, 0i64, 0, (_KDPC *)(v2 + 48));
return;
}
if( dword_140C232C0 < 0 || (unsigned __int64)dword_140C232C0 >= 3 )
v3 = 0i64;
else
v3 = (VOID *)qword_140C232D8[3 * dword_140C232C0];
if( v0 == 4 )
{
if( (unsigned __int64)v3 <= 0xFFFFFFFFFFFFFFFCui64 )
v1 = (v8 != 0) + 2;
}
else
{
v1 = 1;
}
v4 = PopNewWakeSource(v1);
PopAcquireWakeSourceSpinLock(&LockHandle);
*(&stru_140C23628 + 357) = 0i64;
PopReleaseWakeSourceSpinLock(&LockHandle);
PopUnlinkWakeSources(v2);
if( v4 )
{
if( (unsigned int)(v4[4] - 2) <= 1 )
{
ExCopyWakeTimerInfo(v3, (_DIAGNOSTIC_BUFFER **)v4 + 3);
}
else if( v3 == (VOID *)-1i64 )
{
v4[6] = 0;
}
else if( v3 == (VOID *)-2i64 )
{
v4[6] = 1;
}
else
{
if( v3 == (VOID *)-3i64 )
v0 = 2;
v4[6] = v0;
}
v5 = *(_POP_WAKE_SOURCE ***)(v2 + 32);
if( *v5 != (_POP_WAKE_SOURCE *)(v2 + 24) )
LABEL_37:
__fastfail(3u);
*(_QWORD *)v4 = v2 + 24;
*((_QWORD *)v4 + 1) = v5;
*v5 = v4;
*(_QWORD *)(v2 + 32) = v4;
*(_DWORD *)(v2 + 40) = 1;
}
PopAcquireWakeSourceSpinLock(&LockHandle);
v6 = (__int64 *)*(&stru_140C23628 + 360);
if( (_UNKNOWN *)**(&stru_140C23628 + 360) != (_UNKNOWN *)((char *)&stru_140C23628 + 2872) )
goto LABEL_37;
++*(&stru_140C23628 + 708);
*(_QWORD *)v2 = (char *)&stru_140C23628 + 2872;
*(_QWORD *)(v2 + 8) = v6;
*v6 = v2;
*(&stru_140C23628 + 360) = v2;
PopReleaseWakeSourceSpinLock(&LockHandle);
PopFinalizeWakeInfo(v2);
}Referenced by:
PoBroadcastSystemState