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