PoInitiateProcessorWake

INT8 __fastcall PoInitiateProcessorWake(UINT64 a1){
  unsigned int v1; 
  _KPRCB *Prcb; 
  _PPM_IDLE_STATES *IdleStates; 
  _PPM_IDLE_SYNCHRONIZATION_STATE *p_Synchronization; 
  unsigned int AsLong_high; 
  INT8 v6; 
  void *Context; 
  UINT8 updated; 
  char v9; 
  _QWORD v11[2]; 
  __int128 v12; 
  _KAFFINITY_EX Dest; 

  v1 = a1;
  memset(&Dest, 0i64, sizeof(Dest));
  Prcb = KeGetPrcb(v1);
  IdleStates = Prcb->PowerState.IdleStates;
  p_Synchronization = (_PPM_IDLE_SYNCHRONIZATION_STATE *)&Prcb->PowerState.Synchronization;
  AsLong_high = HIBYTE(Prcb->PowerState.Synchronization.AsLong);
  v6 = 0;
  Context = IdleStates->PrepareInfo.Context;
  while( (_BYTE)AsLong_high != 1 && ((unsigned __int8)(AsLong_high - 1) <= 5u || (unsigned __int8)AsLong_high >= 9u) )
  {
    if( (_BYTE)AsLong_high == 2 )
    {
      AsLong_high = HIBYTE(p_Synchronization->AsLong);
    }
    else if( (((_BYTE)AsLong_high - 4) & 0xFD) != 0 )
    {
      if( (_BYTE)AsLong_high == 5 )
      {
        LOBYTE(AsLong_high) = PpmIdleUpdateSynchronizationState(p_Synchronization, 7u, 5u);
        if( (_BYTE)AsLong_high == 5 )
        {
          KeCopyAffinityEx(&Dest, &IdleStates->PrimaryProcessorMask);
          if( !KeIsEmptyAffinityEx(&Dest.Count) )
            HalRequestIpi(IpiAffinity, &Dest);
          return v6;
        }
      }
    }
    else
    {
      updated = PpmIdleUpdateSynchronizationState(p_Synchronization, 8u, AsLong_high);
      if( updated == v9 )
      {
        if( !Prcb->PowerState.PepWokenTransition )
          return 1;
        v11[0] = 0i64;
        v11[1] = PopIdleTransitionTimeout;
        v12 = (unsigned __int64)Prcb;
        while( !IdleStates->IdleIsHalted(Context) )
        {
          if( HIBYTE(p_Synchronization->AsLong) != 8 )
            return v6;
          PpmIdleTransitionStall((__int64)v11);
        }
        if( IdleStates->InitiateWakeStamp == -1i64 )
          _InterlockedExchange64((volatile __int64 *)&IdleStates->InitiateWakeStamp, KeQueryPerformanceCounter(0i64));
        return IdleStates->IdleInitiateWake(Context);
      }
      LOBYTE(AsLong_high) = updated;
    }
    _mm_pause();
  }
  return v6;
}

Referenced by:

No references.