SmcCacheAdd

INT64 __fastcall SmcCacheAdd(INT64 a1, INT64 *a2, INT64 *a3){
  unsigned int v3; 
  unsigned int v5; 
  INT64 v8; 
  _ETHREAD *CurrentThread; 
  int v10; 
  int v11; 
  v3 = 0;
  v5 = 0;
  while( 1 )
  {
    v8 = a1 + 32i64 * v5;
    if( !*(_QWORD *)v8 )
    {
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)CurrentThread + 242);
      ExAcquirePushLockExclusiveEx(v8 + 16, 0i64);
      if( !*(_QWORD *)v8 )
      {
        *(_QWORD *)v8 = a2;
        do
        {
          v10 = *(_DWORD *)(v8 + 24) ^ (*(_DWORD *)(v8 + 24) ^ (*(_DWORD *)(v8 + 24) + 1)) & 0xFFF;
          *(_DWORD *)(v8 + 24) = v10;
          v11 = v5 | (16 * (v10 & 0xFFF));
          *(_DWORD *)a2 = v11;
        }
        while( v11 == -1 );
        *(_DWORD *)a3 = v11;
        a2 = 0i64;
        _InterlockedExchange64((volatile __int64 *)(v8 + 8), 0i64);
        ExAcquireRundownProtection((PEX_RUNDOWN_REF)(v8 + 8));
      }
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v8 + 16), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)(v8 + 16));
      KeAbPostRelease((PVOID)(v8 + 16));
      KeLeaveCriticalRegion();
      if( !a2 )
        break;
    }
    if( ++v5 >= 0x10 )
      return(unsigned int)-1073741671;
  }
  KeSetEvent(*(PRKEVENT *)(a1 + 552), 0);
  return v3;
}

Referenced by:

SmcProcessCreateRequest