PfpScenCtxScenarioSet
VOID __fastcall PfpScenCtxScenarioSet(INT64 Lock, INT64 a2, INT64 a3, INT64 a4){
int v5;
int v6;
_ETHREAD *CurrentThread;
unsigned int v9;
int v10;
int v11;
BOOL v12;
PVOID Object[3];
*(_OWORD *)Object = 0i64;
v5 = a3;
v6 = a2;
if( (((_DWORD)a3 - 1) & 0xFFFFFFFA) == 0 && (_DWORD)a3 != 6 )
PfpServiceMainThreadBoostPrep(Lock, Object);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx(Lock, 0i64);
if( v5 || *(_DWORD *)(Lock + 48) == v6 )
{
v9 = *(_DWORD *)(Lock + 48);
v10 = 1;
v12 = v9
&& (PfpScenCtxPrefetchStateSet((CHAR *)Lock, v9, 0i64, 1i64),
PfpScenCtxWaiterTimedOut(Lock),
v11 = *(_DWORD *)(Lock + 48),
*(_QWORD *)(Lock + 40) = 0i64,
*(_DWORD *)(Lock + 8) &= 0xFFFFFFF3,
v11)
|| v5;
*(_DWORD *)(Lock + 48) = v5;
if( v5 )
++*(_DWORD *)(Lock + 52);
if( v5 == 3 )
*(_QWORD *)(Lock + 56) = a4;
if( v12 )
{
if( v5 )
{
if( Object[0] )
{
PfpServiceMainThreadBoost(Lock, (INT64 *)Object);
v10 = 0;
}
else
{
v10 = 4;
}
}
KeSetEvent(*(PRKEVENT *)(Lock + 64), v10);
}
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)Lock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)Lock);
KeAbPostRelease((PVOID)Lock);
KeLeaveCriticalRegion();
if( Object[0] )
ObDereferenceObjectDeferDelete(Object[0]);
if( Object[1] )
ExFreePoolWithTag(Object[1], 0);
}Referenced by:
PfPowerActionNotify
PfpProcessScenarioPhase