SmcCacheAdd

NTSTATUS __stdcall SmcCacheAdd(_SMC_CACHE_MANAGER *CacheMgr, _SMC_CACHE *NewCache, UINT64 *CacheIdOut){
  NTSTATUS v3; 
  int v5; 
  _SMC_CACHE_MANAGER *v8; 
  _ETHREAD *CurrentThread; 
  int v10; 
  int v11; 

  v3 = 0;
  v5 = 0;
  while( 1 )
  {
    v8 = &CacheMgr[8 * v5];
    if( !*(_QWORD *)v8 )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --CurrentThread->Tcb.KernelApcDisable;
      ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v8 + 2, 0i64);
      if( !*(_QWORD *)v8 )
      {
        *(_QWORD *)v8 = NewCache;
        do
        {
          v10 = v8[6] ^ (v8[6] ^ (v8[6] + 1)) & 0xFFF;
          v8[6] = v10;
          v11 = v5 | (16 * (v10 & 0xFFF));
          *NewCache = v11;
        }
        while( v11 == -1 );
        *(_DWORD *)CacheIdOut = v11;
        NewCache = 0i64;
        _InterlockedExchange64((volatile __int64 *)v8 + 1, 0i64);
        ExAcquireRundownProtection((_EX_RUNDOWN_REF *)v8 + 1);
      }
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v8 + 2, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((_EX_PUSH_LOCK *)v8 + 2);
      KeAbPostRelease(v8 + 4);
      KeLeaveCriticalRegion();
      if( !NewCache )
        break;
    }
    if( (unsigned int)++v5 >= 0x10 )
      return -1073741671;
  }
  KeSetEvent(*((PRKEVENT *)CacheMgr + 69), 0, 0);
  return v3;
}

Referenced by:

SmcProcessCreateRequest