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