PopNewWakeInfo
INT64 __fastcall PopNewWakeInfo(INT64 a1, INT64 a2, INT64 a3, INT64 a4){
VOID *PoolWithTag;
INT64 v5;
_QWORD *v6;
_QWORD *v7;
UINT64 v8;
UINT8 v9;
UINT8 v10;
INT64 result;
__int64 v12;
__int64 v13;
_QWORD *v14;
_QWORD *v15;
struct _KLOCK_QUEUE_HANDLE LockHandle;
memset(&LockHandle, 0, sizeof(LockHandle));
PoolWithTag = ExAllocatePoolWithTag(NonPagedPoolNx, 0xB0ui64, 0x206D654Dui64);
v5 = (INT64)PoolWithTag;
if( PoolWithTag )
{
memset((INT64)PoolWithTag, 0i64);
*(_DWORD *)(v5 + 16) = 1;
*(_QWORD *)(v5 + 32) = v5 + 24;
*(_QWORD *)(v5 + 24) = v5 + 24;
*(_QWORD *)(v5 + 8) = v5;
*(_QWORD *)v5 = v5;
}
PopAcquireWakeSourceSpinLock(&LockHandle);
v6 = (_QWORD *)PopPendingWakeInfo;
if( PopPendingWakeInfo )
{
v12 = PopWakeInfoList;
if( *(__int64 **)(PopWakeInfoList + 8) != &PopWakeInfoList )
goto LABEL_15;
PopPendingWakeInfo = 0i64;
++PopWakeInfoCount;
*v6 = PopWakeInfoList;
v6[1] = &PopWakeInfoList;
*(_QWORD *)(v12 + 8) = v6;
PopWakeInfoList = (__int64)v6;
}
v7 = (_QWORD *)PopCurrentWakeInfo;
if( PopCurrentWakeInfo )
{
v13 = PopWakeInfoList;
if( *(__int64 **)(PopWakeInfoList + 8) != &PopWakeInfoList )
goto LABEL_15;
PopCurrentWakeInfo = 0i64;
++PopWakeInfoCount;
*v7 = PopWakeInfoList;
v7[1] = &PopWakeInfoList;
*(_QWORD *)(v13 + 8) = v7;
PopWakeInfoList = (__int64)v7;
}
if( v5 )
{
PopCurrentWakeInfo = v5;
if( PopWakeInfoCount == 1 )
{
v14 = (_QWORD *)qword_140C24168;
v15 = *(_QWORD **)(qword_140C24168 + 8);
if( *(__int64 **)qword_140C24168 == &PopWakeInfoList && *v15 == qword_140C24168 )
{
qword_140C24168 = *(_QWORD *)(qword_140C24168 + 8);
*v15 = &PopWakeInfoList;
v14[1] = v14;
*v14 = v14;
PopWakeInfoDereference((INT64)v14);
--PopWakeInfoCount;
goto LABEL_7;
}
LABEL_15:
__fastfail(3u);
}
}
LABEL_7:
PopReleaseWakeSourceSpinLock(&LockHandle);
result = (INT64)KeResetEvent(&PopWakeSourceAvailable, v8, v9, v10, (IRP *)LockHandle.LockQueue.Next);
PopFixedWakeSourceMask = 0;
return result;
}Referenced by:
PopTransitionSystemPowerStateEx