ExReleaseRundownProtectionCacheAware
void __stdcall ExReleaseRundownProtectionCacheAware(PEX_RUNDOWN_REF_CACHE_AWARE RunRefCacheAware){
_EX_RUNDOWN_REF *RunRefs;
signed __int64 Count;
unsigned __int64 v3;
RunRefs = (_EX_RUNDOWN_REF *)((char *)RunRefCacheAware->RunRefs
+ RunRefCacheAware->RunRefSize
* (*((_DWORD *)KeGetPcr() + 105) % RunRefCacheAware->Number));
_m_prefetchw(RunRefs);
while( 1 )
{
while( 1 )
{
Count = RunRefs->Count;
if( (RunRefs->Count & 1) != 0 )
break;
if( Count == _InterlockedCompareExchange64((volatile signed __int64 *)RunRefs, Count - 2, Count) )
return;
}
if( Count != 1 )
break;
RunRefs = RunRefCacheAware->RunRefs;
}
v3 = Count & 0xFFFFFFFFFFFFFFFEui64;
if( _InterlockedExchangeAdd64((volatile signed __int64 *)v3, 0xFFFFFFFFFFFFFFFFui64) == 1 )
KeSetEvent((PRKEVENT)(v3 + 8), 0);
}Referenced by:
MmUnlockPages