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