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