SmcStoreDelete

NTSTATUS __stdcall SmcStoreDelete(
        _SMC_CACHE_MANAGER *CacheMgr,
        UINT64 CacheId,
        UINT64 StoreId,
        _SM_STORE_MANAGER_TYPE StoreMgrType){
  unsigned int v5; 
  char v6; 
  _PRIVILEGE_SET *v8; 
  _SMC_CACHE *v9; 
  NTSTATUS v10; 
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *v12; 
  _SMC_STORE_ENTRY *v13; 
  _SMC_STORE_ENTRY *v14; 
  _ETHREAD *v15; 
  unsigned int StoreIda; 

  StoreIda = StoreId;
  v5 = StoreId;
  v6 = CacheId;
  v8 = 0i64;
  v9 = SmcCacheReference(CacheMgr, CacheId);
  if( !v9 )
    return -1073741672;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  v12 = (_EX_PUSH_LOCK *)(v9 + 40);
  ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v9 + 20, 0i64);
  v13 = SmcStoreEntryFind(v9, v5, StoreMgrType);
  v14 = v13;
  if( v13 )
  {
    v13[1] |= 4u;
    *v13 = -1;
    if( (_InterlockedExchangeAdd64(&v12->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((_EX_PUSH_LOCK *)v9 + 20);
    KeAbPostRelease(v9 + 40);
    KeLeaveCriticalRegion();
    ExWaitForRundownProtectionRelease((_EX_RUNDOWN_REF *)v14 + 2);
    ExRundownCompleted((INT64 *)v14 + 2);
    SmStoreDelete(StoreMgrType, StoreIda);
    v15 = (_ETHREAD *)KeGetCurrentThread();
    --v15->Tcb.KernelApcDisable;
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v9 + 20, 0i64);
    v8 = (_PRIVILEGE_SET *)*((_QWORD *)v14 + 1);
    *((_QWORD *)v14 + 1) = 0i64;
    v14[1] &= ~4u;
    v10 = 0;
  }
  else
  {
    v10 = -1073741672;
  }
  if( (_InterlockedExchangeAdd64(&v12->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
    ExfTryToWakePushLock(v12);
  KeAbPostRelease(v12);
  KeLeaveCriticalRegion();
  ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&CacheMgr[8 * (v6 & 0xF) + 2]);
  if( v8 )
    CmSiFreeMemory(v8);
  return v10;
}

Referenced by:

SmcProcessStoreDeleteRequest