PfpScenCtxPrefetchStateSet

NTSTATUS __stdcall PfpScenCtxPrefetchStateSet(
        VOID *ScenCtx,
        PF_PHASED_SCENARIO_TYPE Scenario,
        PFP_SCENCTX_PREFETCH_STATE ActiveState,
        UINT64 LockHeld){
  int v4; 
  _ETHREAD *CurrentThread; 
  unsigned int v9; 
  NTSTATUS v10; 

  v4 = LockHeld;
  if( !(_DWORD)LockHeld )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)ScenCtx, 0i64);
  }
  if( *((_DWORD *)ScenCtx + 12) == Scenario )
  {
    if( ActiveState == PfpPrefetchActive && (*((_DWORD *)ScenCtx + 2) & 0xC) == 8 )
    {
      v10 = -1073741431;
    }
    else
    {
      v9 = *((_DWORD *)ScenCtx + 2);
      if( (v9 & 0xC) == 4 )
      {
        KeSetEvent((PRKEVENT)((char *)ScenCtx + 16), 1, 0);
        v9 = *((_DWORD *)ScenCtx + 2) & 0xFFFFFFF3;
      }
      *((_DWORD *)ScenCtx + 2) = v9 ^ ((unsigned __int8)ActiveState ^ (unsigned __int8)v9) & 3;
      v10 = 0;
    }
  }
  else
  {
    v10 = -1073741735;
  }
  if( !v4 )
  {
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)ScenCtx, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)ScenCtx);
    KeAbPostRelease(ScenCtx);
    KeLeaveCriticalRegion();
  }
  return v10;
}

Referenced by:

PfSetSuperfetchInformation
PfpScenCtxScenarioSet