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