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