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