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