PoInitiateProcessorWake

char __fastcall PoInitiateProcessorWake(unsigned int a1){
  unsigned __int64 v2; 
  unsigned __int64 v3; 
  __int64 v4; 
  UINT32 *v5; 
  int v6; 
  char v7; 
  __int64 v8; 
  char updated; 
  char v10; 
  _RTL_PROCESS_MODULES *v11; 
  UINT64 v12; 
  UINT64 *v13; 
  _LIST_ENTRY LoadOrderListHead; 
  __int128 v16; 
  INT64 result[22]; 
  memset((INT64)result, 0i64);
  KeGetPrcb(a1);
  v3 = v2;
  v4 = *(_QWORD *)(v2 + 0x8000);
  v5 = (UINT32 *)(v2 + 32832);
  v6 = HIBYTE(*(_DWORD *)(v2 + 32832));
  v7 = 0;
  v8 = *(_QWORD *)(v4 + 488);
  while( (_BYTE)v6 != 1 && ((unsigned __int8)(v6 - 1) <= 5u || (unsigned __int8)v6 >= 9u) )
  {
    if( (_BYTE)v6 == 2 )
    {
      v6 = HIBYTE(*v5);
    }
    else if( (((_BYTE)v6 - 4) & 0xFD) != 0 )
    {
      if( (_BYTE)v6 == 5 )
      {
        LOBYTE(v6) = PpmIdleUpdateSynchronizationState(v5, 7u, 5u);
        if( (_BYTE)v6 == 5 )
        {
          KeCopyAffinityEx((__int64)result, (unsigned __int16 *)(v4 + 72));
          if( !(unsigned int)KeIsEmptyAffinityEx(result) )
            HalRequestIpi(0, result);
          return v7;
        }
      }
    }
    else
    {
      updated = PpmIdleUpdateSynchronizationState(v5, 8u, v6);
      if( updated == v10 )
      {
        if( !*(_BYTE *)(v3 + 32817) )
          return 1;
        LoadOrderListHead.Flink = 0i64;
        LoadOrderListHead.Blink = (_LIST_ENTRY *)PopIdleTransitionTimeout;
        v16 = v3;
        while( !(*(unsigned __int8(__fastcall **)(__int64))(v4 + 472))(v8) )
        {
          if( HIBYTE(*v5) != 8 )
            return v7;
          PpmIdleTransitionStall(&LoadOrderListHead, v11, v12, v13);
        }
        if( *(_QWORD *)(v4 + 56) == -1i64 )
          _InterlockedExchange64((volatile __int64 *)(v4 + 56), KeQueryPerformanceCounter(0i64).QuadPart);
        return(*(__int64(__fastcall **)(__int64))(v4 + 480))(v8);
      }
      LOBYTE(v6) = updated;
    }
    _mm_pause();
  }
  return v7;
}

Referenced by:

No references.