PfpScenCtxScenarioSet

VOID __stdcall PfpScenCtxScenarioSet(
        _PFP_SCENARIO_CONTEXT *ScenCtx,
        _PF_PHASED_SCENARIO_TYPE OldScenario,
        _PF_PHASED_SCENARIO_TYPE NewScenario,
        VOID *Context){
  _ETHREAD *CurrentThread; 
  PF_PHASED_SCENARIO_TYPE v9; 
  KPRIORITY v10; 
  _PFP_SCENARIO_CONTEXT v11; 
  _BOOL4 v12; 
  _PFP_BOOST_SUPPORT BoostSupport[6]; 

  *(_OWORD *)BoostSupport = 0i64;
  if( ((NewScenario - 1) & 0xFFFFFFFA) == 0 && NewScenario != PfScenarioTypeMax )
    PfpServiceMainThreadBoostPrep(ScenCtx, BoostSupport);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)ScenCtx, 0i64);
  if( NewScenario || ScenCtx[12] == OldScenario )
  {
    v9 = ScenCtx[12];
    v10 = 1;
    v12 = v9
       && (PfpScenCtxPrefetchStateSet(ScenCtx, v9, PfpPrefetchInactive, 1ui64),
           PfpScenCtxWaiterTimedOut(ScenCtx),
           v11 = ScenCtx[12],
           *((_QWORD *)ScenCtx + 5) = 0i64,
           ScenCtx[2] &= 0xFFFFFFF3,
           v11)
       || NewScenario;
    ScenCtx[12] = NewScenario;
    if( NewScenario )
      ++ScenCtx[13];
    if( NewScenario == PfScenarioTypeFUS )
      *((_QWORD *)ScenCtx + 7) = Context;
    if( v12 )
    {
      if( NewScenario )
      {
        if( *(_QWORD *)BoostSupport )
        {
          PfpServiceMainThreadBoost(ScenCtx, BoostSupport);
          v10 = 0;
        }
        else
        {
          v10 = 4;
        }
      }
      KeSetEvent(*((PRKEVENT *)ScenCtx + 8), v10, 0);
    }
  }
  if( (_InterlockedExchangeAdd64((volatile signed __int64 *)ScenCtx, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock((_EX_PUSH_LOCK *)ScenCtx);
  KeAbPostRelease(ScenCtx);
  KeLeaveCriticalRegion();
  if( *(_QWORD *)BoostSupport )
    ObDereferenceObjectDeferDelete(*(UINT64 *)BoostSupport);
  if( *(_QWORD *)&BoostSupport[2] )
    ExFreePoolWithTag(*(PVOID *)&BoostSupport[2], 0);
}

Referenced by:

PfPowerActionNotify
PfpProcessScenarioPhase