SmcStoreDelete
__int64 __fastcall SmcStoreDelete(__int64 a1, UINT64 a2, int a3, unsigned int a4){
char v6;
struct _PRIVILEGE_SET *v8;
unsigned __int64 Count;
unsigned int v10;
_ETHREAD *CurrentThread;
volatile signed __int64 *v12;
_DWORD *v13;
_DWORD *v14;
_ETHREAD *v15;
v6 = a2;
v8 = 0i64;
Count = SmcCacheReference(a1, a2).Count;
if( Count )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v12 = (volatile signed __int64 *)(Count + 160);
ExAcquirePushLockExclusiveEx(Count + 160, 0i64);
v13 = SmcStoreEntryFind(Count, (unsigned int)a3, a4);
v14 = v13;
if( v13 )
{
v13[1] |= 4u;
*v13 = -1;
if( (_InterlockedExchangeAdd64(v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(Count + 160));
KeAbPostRelease((PVOID)(Count + 160));
KeLeaveCriticalRegion();
ExWaitForRundownProtectionRelease((EX_RUNDOWN_REF *)v14 + 2);
ExRundownCompleted((EX_RUNDOWN_REF *)v14 + 2);
SmStoreDelete(a4, (unsigned int)a3);
v15 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v15 + 242);
ExAcquirePushLockExclusiveEx(Count + 160, 0i64);
v8 = (struct _PRIVILEGE_SET *)*((_QWORD *)v14 + 1);
*((_QWORD *)v14 + 1) = 0i64;
v14[1] &= ~4u;
v10 = 0;
}
else
{
v10 = -1073741672;
}
if( (_InterlockedExchangeAdd64(v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v12);
KeAbPostRelease((PVOID)v12);
KeLeaveCriticalRegion();
ExReleaseRundownProtection((PEX_RUNDOWN_REF)(32i64 * (v6 & 0xF) + a1 + 8));
if( v8 )
CmSiFreeMemory(v8);
}
else
{
return(unsigned int)-1073741672;
}
return v10;
}Referenced by:
SmcProcessStoreDeleteRequest