SmKmStoreDelete
__int64 __fastcall SmKmStoreDelete(__int64 a1, unsigned int a2, char a3){
unsigned int v4;
unsigned int v7;
INT64 v8;
_ETHREAD *CurrentThread;
volatile INT64 *v10;
__int16 v11;
__int64 v12;
UINT64 *v13;
_EVENT_DESCRIPTOR *v14;
UINT64 *v15;
_ETHREAD *v16;
EVENT_DESCRIPTOR *v19;
v4 = a2 & 0x3FF;
v7 = 0;
v8 = SmKmStoreRefFromStoreIndex(a1, a2 & 0x3FF);
if( !v8 )
return(unsigned int)-1073741735;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
v10 = (volatile INT64 *)(v8 + 16);
ExAcquirePushLockExclusiveEx(v8 + 16, 0i64);
v11 = *(_WORD *)(v8 + 32);
if( a2 >> 10 != (v11 & 0x3F) )
goto LABEL_21;
v12 = *(_QWORD *)v8;
if( (unsigned __int64)(*(_QWORD *)v8 - 1i64) > 0xFFFFFFFFFFFFFFFDui64 )
goto LABEL_21;
if( !a3 )
{
LABEL_5:
(*(void(__fastcall **)(__int64, _QWORD, __int64))(a1 + 256))(a1, *(_QWORD *)v8, 7i64);
ExWaitForRundownProtectionRelease((EX_RUNDOWN_REF *)(v8 + 8));
v13 = SmEtwEnabled(0i64);
v15 = v13;
if( v13 )
{
SmKmEtwLogStoreStats(v13, *(PVOID *)v8, v14);
SmKmEtwLogStoreChange(v15, *(PVOID *)v8, (EVENT_DESCRIPTOR *)&SmEventStoreDelete, v19);
}
(*(void(__fastcall **)(__int64, __int64, __int64))(a1 + 256))(a1, v12, 2i64);
*(_QWORD *)v8 = 0i64;
v16 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v16 + 242);
ExAcquirePushLockExclusiveEx(a1 + 416, 0i64);
if( *(_DWORD *)(a1 + 432) == v4 )
*(_DWORD *)(a1 + 432) = -1;
if( (*(_DWORD *)(a1 + 424))-- == 1 )
(*(void(__fastcall **)(__int64, _QWORD, __int64))(a1 + 256))(a1, 0i64, 4i64);
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 416), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(a1 + 416));
KeAbPostRelease((PVOID)(a1 + 416));
KeLeaveCriticalRegion();
if( (_InterlockedExchangeAdd64(v10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v10);
KeAbPostRelease((PVOID)v10);
KeLeaveCriticalRegion();
(*(void(__fastcall **)(__int64, __int64, __int64))(a1 + 256))(a1, v12, 1i64);
return v7;
}
if( (v11 & 0x40) != 0 )
{
LABEL_21:
v7 = -1073741735;
}
else
{
if( (v11 & 0x80u) == 0 )
goto LABEL_5;
v7 = -1073741790;
}
if( (_InterlockedExchangeAdd64(v10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v8 + 16));
KeAbPostRelease((PVOID)(v8 + 16));
KeLeaveCriticalRegion();
return v7;
}Referenced by:
SmKmStoreDeleteWhenEmptyWorker
SmProcessDeleteRequest