PfpProcessScenarioPhase

NTSTATUS __stdcall PfpProcessScenarioPhase(PF_SCENARIO_PHASE_INFO *PhaseInfo, INT8 PreviousMode){
  UINT64 v2; 
  int v4; 
  unsigned int v5; 
  NTSTATUS v6; 
  INT64 v7; 
  PF_SCENARIO_PHASE_INFO v9; 
  int ActiveConsoleId; 
  VOID *v11; 
  _PF_PHASED_SCENARIO_TYPE v12; 
  PF_SCENARIO_PHASE_INFO v13; 
  _PF_PHASED_SCENARIO_TYPE v14; 
  int v15; 
  unsigned int v16; 
  _ADAPTER_OBJECT *NextSession; 

  if( *PhaseInfo != 4 )
    return -1073741811;
  v4 = PhaseInfo[1];
  if( (unsigned int)(v4 - 1) > 4 )
    return -1073741701;
  v5 = PhaseInfo[4] & 1;
  if( v4 <= 2 )
    goto LABEL_4;
  if( v4 != 3 )
  {
    if( v4 == 4 )
    {
      v9 = PhaseInfo[2];
      v6 = 0;
      if( v9 )
      {
        if( v9 == 1 )
        {
          ActiveConsoleId = RtlGetActiveConsoleId();
          if( PsGetCurrentProcessSessionId() == ActiveConsoleId )
          {
            PfpScenCtxScenarioSet((_PFP_SCENARIO_CONTEXT *)&ScenCtx, PfScenarioTypeLogon, PfScenarioTypeNone, 0i64);
            if( *(&stru_140C4DB30 + 2042) < *(&stru_140C4DB30 + 2043) )
              PfpLogScenarioEvent(5, 2, 3, dword_140C50054, 1);
          }
        }
        return v6;
      }
      v11 = 0i64;
      v12 = PfScenarioTypeLogon;
      goto LABEL_32;
    }
    if( v4 == 5 )
    {
LABEL_4:
      v6 = 0;
      if( PreviousMode )
        return -1073741790;
      v7 = v5 | 4;
      if( v4 != 5 )
        v7 = v5;
      PfPowerActionNotify(
        (_EPROCESS *)(unsigned int)PhaseInfo[2],
        v7,
        (VOID *)((unsigned __int64)(unsigned int)PhaseInfo[4] >> 1));
      return v6;
    }
    return -1073741811;
  }
  v13 = PhaseInfo[2];
  v6 = 0;
  if( v13 )
  {
    if( v13 != 1 || dword_140C50050 != 3 )
      return v6;
    PfpScenCtxPrefetchWait((PFP_SCENARIO_CONTEXT *)&ScenCtx, PfScenarioTypeFUS, 0x1388ui64, v2);
    PfpLogScenarioEvent(3, 0, 0, dword_140C50054, 0);
    v11 = 0i64;
    v14 = PfScenarioTypeFUS;
    v12 = PfScenarioTypeNone;
LABEL_33:
    PfpScenCtxScenarioSet((_PFP_SCENARIO_CONTEXT *)&ScenCtx, v14, v12, v11);
    return v6;
  }
  v15 = RtlGetActiveConsoleId();
  if( PsGetCurrentProcessSessionId() == v15 && *(&stru_140C4DB30 + 2042) < *(&stru_140C4DB30 + 2043) )
  {
    v16 = 0;
    NextSession = (_ADAPTER_OBJECT *)MmGetNextSession(0i64);
    if( NextSession )
    {
      while( ++v16 < 3 )
      {
        NextSession = (_ADAPTER_OBJECT *)MmGetNextSession(NextSession);
        if( !NextSession )
          goto LABEL_30;
      }
      HalPutDmaAdapter(NextSession);
LABEL_30:
      if( v16 >= 3 )
      {
        v11 = (VOID *)*((_QWORD *)PhaseInfo + 3);
        v12 = PfScenarioTypeFUS;
LABEL_32:
        v14 = PfScenarioTypeNone;
        goto LABEL_33;
      }
    }
  }
  return v6;
}

Referenced by:

PfSetSuperfetchInformation
PfSnSetPrefetcherInformation