PfpScenCtxPrefetchStateSet

INT64 __fastcall PfpScenCtxPrefetchStateSet(CHAR *Lock, INT64 a2, INT64 a3, INT64 a4){
  int v4; 
  int v5; 
  int v6; 
  _ETHREAD *CurrentThread; 
  unsigned int v9; 
  unsigned int v10; 
  v4 = a4;
  v5 = a3;
  v6 = a2;
  if( !(_DWORD)a4 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    ExAcquirePushLockExclusiveEx((UINT64)Lock, 0i64);
  }
  if( *((_DWORD *)Lock + 12) == v6 )
  {
    if( v5 == 1 && (*((_DWORD *)Lock + 2) & 0xC) == 8 )
    {
      v10 = -1073741431;
    }
    else
    {
      v9 = *((_DWORD *)Lock + 2);
      if( (v9 & 0xC) == 4 )
      {
        KeSetEvent((PRKEVENT)(Lock + 16), 1);
        v9 = *((_DWORD *)Lock + 2) & 0xFFFFFFF3;
      }
      *((_DWORD *)Lock + 2) = v9 ^ ((unsigned __int8)v5 ^ (unsigned __int8)v9) & 3;
      v10 = 0;
    }
  }
  else
  {
    v10 = -1073741735;
  }
  if( !v4 )
  {
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)Lock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)Lock);
    KeAbPostRelease(Lock);
    KeLeaveCriticalRegion();
  }
  return v10;
}

Referenced by:

PfSetSuperfetchInformation
PfpScenCtxScenarioSet