PopHandleWakeSources
VOID __stdcall PopHandleWakeSources(){
int v0;
unsigned int v1;
INT64 v2;
UINT64 *v3;
CHAR *v4;
VOID *v5;
CHAR **v6;
INT64 *v7;
struct _KLOCK_QUEUE_HANDLE LockHandle;
UINT8 v9;
v0 = 0;
v9 = 0;
v1 = 4;
memset(&LockHandle, 0, sizeof(LockHandle));
if( (*(_DWORD *)PopSimulate & 0x200000) == 0 && (PopFixedWakeSourceMask & 1) == 0 )
{
if( (*(_DWORD *)PopSimulate & 0x400000) == 0 && (PopFixedWakeSourceMask & 2) == 0 )
{
if( PopValidateRTCWake(&v9) && (*(_DWORD *)PopSimulate & 0x100000) == 0 )
v0 = 4;
}
else
{
v0 = 2;
}
}
else
{
v0 = 1;
}
PopAcquireWakeSourceSpinLock(&LockHandle);
v2 = PopCurrentWakeInfo;
if( PopCurrentWakeInfo && !v0 )
PopWakeInfoReference(PopCurrentWakeInfo);
PopReleaseWakeSourceSpinLock(&LockHandle);
if( !v2 )
{
KeSetEvent(&PopWakeSourceAvailable, 0);
return;
}
if( !v0 )
{
KeInitializeDpc((PRKDPC)(v2 + 48), PopWakeSourceTimeoutDpc, 0i64);
KeInitializeTimerEx((PKTIMER)(v2 + 112), NotificationTimer);
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 = (UINT64 *)qword_140C232D8[3 * dword_140C232C0];
if( v0 == 4 )
{
if( (unsigned __int64)v3 <= 0xFFFFFFFFFFFFFFFCui64 )
v1 = (v9 != 0) + 2;
}
else
{
v1 = 1;
}
v4 = PopNewWakeSource(v1);
PopAcquireWakeSourceSpinLock(&LockHandle);
PopCurrentWakeInfo = 0i64;
PopReleaseWakeSourceSpinLock(&LockHandle);
PopUnlinkWakeSources(v2, v5);
if( v4 )
{
if( (unsigned int)(*((_DWORD *)v4 + 4) - 2) <= 1 )
{
ExCopyWakeTimerInfo(v3, (CHAR **)v4 + 3);
}
else if( v3 == (UINT64 *)-1i64 )
{
*((_DWORD *)v4 + 6) = 0;
}
else if( v3 == (UINT64 *)-2i64 )
{
*((_DWORD *)v4 + 6) = 1;
}
else
{
if( v3 == (UINT64 *)-3i64 )
v0 = 2;
*((_DWORD *)v4 + 6) = v0;
}
v6 = *(CHAR ***)(v2 + 32);
if( *v6 != (CHAR *)(v2 + 24) )
LABEL_37:
__fastfail(3u);
*(_QWORD *)v4 = v2 + 24;
*((_QWORD *)v4 + 1) = v6;
*v6 = v4;
*(_QWORD *)(v2 + 32) = v4;
*(_DWORD *)(v2 + 40) = 1;
}
PopAcquireWakeSourceSpinLock(&LockHandle);
v7 = (INT64 *)qword_140C24168;
if( *(__int64 **)qword_140C24168 != &PopWakeInfoList )
goto LABEL_37;
++PopWakeInfoCount;
*(_QWORD *)v2 = &PopWakeInfoList;
*(_QWORD *)(v2 + 8) = v7;
*v7 = v2;
qword_140C24168 = v2;
PopReleaseWakeSourceSpinLock(&LockHandle);
PopFinalizeWakeInfo(v2);
}Referenced by:
PoBroadcastSystemState