SmKmStoreDeleteWhenEmpty

INT64 __fastcall SmKmStoreDeleteWhenEmpty(INT64 a1, INT64 a2){
  INT64 v4; 
  unsigned int v5; 
  int v6; 
  __int64 v8; 
  int v9; 
  struct _WORK_QUEUE_ITEM WorkItem; 
  __int64 Object; 
  __int64 v12[3]; 
  int v13; 
  int v14; 
  int v15; 
  int v16; 
  v4 = SmKmStoreRefFromStoreIndex(a1, *(_DWORD *)(a2 + 6016) & 0x3FF);
  v5 = 0;
  if( v6 )
  {
    _InterlockedOr8((volatile signed __int8 *)(v4 + 34), 1u);
  }
  else if( (*(_BYTE *)(v4 + 34) & 1) == 0 )
  {
    return v5;
  }
  v15 = 0;
  v16 = 0;
  ST_STORE::StDmGetSpaceStats(a2 + 80, &v15, &v16);
  if( (unsigned int)(v16 + 1023) < 0x400 )
  {
    _m_prefetchw((const void *)(v8 + 34));
    if( (_InterlockedOr8((volatile signed __int8 *)(v8 + 34), 2u) & 2) == 0 )
    {
      WorkItem.List.Blink = 0i64;
      v12[1] = (__int64)v12;
      Object = 393216i64;
      v12[0] = (__int64)v12;
      v14 = 0;
      WorkItem.WorkerRoutine = (void(__fastcall *)(void *))SmKmStoreDeleteWhenEmptyWorker;
      WorkItem.Parameter = &WorkItem;
      v12[2] = a1;
      v13 = v9;
      WorkItem.List.Flink = 0i64;
      ExQueueWorkItem(&WorkItem, DelayedWorkQueue);
      KeWaitForSingleObject(&Object, WrKernel, 0, 0, 0i64);
      return 1;
    }
  }
  return v5;
}

Referenced by:

SMKM_STORE_MGR::SmFeEvictComplete
SmProcessDeleteNotification
SmpKeyedStoreCreate