SmcCacheRemove
_SMC_CACHE *__stdcall SmcCacheRemove(_SMC_CACHE_MANAGER *CacheMgr, UINT64 CacheId){
_ETHREAD *CurrentThread;
_SMC_CACHE *v3;
_SMC_CACHE_MANAGER *v4;
unsigned int v5;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = 0i64;
v4 = &CacheMgr[8 * (CacheId & 0xF)];
v5 = CacheId;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v4 + 2, 0i64);
if( v5 >> 4 == (v4[6] & 0xFFF) && *(_QWORD *)v4 )
{
ExWaitForRundownProtectionRelease((_EX_RUNDOWN_REF *)v4 + 1);
v3 = *(_SMC_CACHE **)v4;
*(_QWORD *)v4 = 0i64;
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v4 + 2, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)v4 + 2);
KeAbPostRelease(v4 + 4);
KeLeaveCriticalRegion();
return v3;
}Referenced by:
SmcCacheDelete