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