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