SmKmStoreAdd

__int64 __fastcall SmKmStoreAdd(__int64 a1, __int64 a2, __int64 a3, int *a4){
  unsigned int v4; 
  __int64 v5; 
  unsigned __int64 v7; 
  unsigned __int64 v8; 
  volatile INT64 *v9; 
  _ETHREAD *v10; 
  _ETHREAD *v11; 
  volatile signed __int64 *v12; 
  __int16 v13; 
  int v14; 
  UINT64 *v15; 
  EVENT_DESCRIPTOR *v16; 
  unsigned __int64 NonPaged; 
  struct _PRIVILEGE_SET *v20; 
  unsigned __int64 v21; 
  unsigned __int64 v22; 
  _ETHREAD *CurrentThread; 
  _DWORD *v24; 
  v4 = 0;
  v24 = *(_DWORD **)a3;
  v5 = 0i64;
  do
  {
    if( !*(_QWORD *)(a1 + 8 * v5) )
    {
      NonPaged = SSHSupportAllocateNonPaged(0x500ui64, 0x61536D73u);
      v20 = (struct _PRIVILEGE_SET *)NonPaged;
      if( !NonPaged )
        return(unsigned int)-1073741670;
      v21 = NonPaged + 1280;
      if( NonPaged < NonPaged + 1280 )
      {
        v22 = NonPaged + 8;
        do
        {
          *(_OWORD *)(v22 - 8) = 0i64;
          *(_OWORD *)(v22 + 8) = 0i64;
          *(_QWORD *)(v22 + 24) = 0i64;
          ExInitializePushLock((EX_RUNDOWN_REF *)v22);
          ExWaitForRundownProtectionRelease((EX_RUNDOWN_REF *)v22);
          *(_QWORD *)(v22 + 8) = 0i64;
          v22 += 40i64;
        }
        while( v22 - 8 < v21 );
      }
      CurrentThread = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)CurrentThread + 242);
      ExAcquirePushLockExclusiveEx(a1 + 416, 0i64);
      if( !*(_QWORD *)(a1 + 8 * v5) )
      {
        *(_QWORD *)(a1 + 8 * v5) = v20;
        v20 = 0i64;
      }
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 416), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)(a1 + 416));
      KeAbPostRelease((PVOID)(a1 + 416));
      KeLeaveCriticalRegion();
      if( v20 )
        CmSiFreeMemory(v20);
    }
    v7 = *(_QWORD *)(a1 + 8 * v5);
    v8 = v7 + 1280;
    if( v7 >= v7 + 1280 )
      goto LABEL_35;
    v9 = (volatile INT64 *)(v7 + 16);
    while( *(_QWORD *)v7 )
    {
LABEL_6:
      v7 += 40i64;
      v9 += 5;
      ++v4;
      if( v7 >= v8 )
        goto LABEL_9;
    }
    v10 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v10 + 242);
    ExAcquirePushLockExclusiveEx((UINT64)v9, 0i64);
    if( *(_QWORD *)v7 )
    {
      if( (_InterlockedExchangeAdd64(v9, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v9);
      KeAbPostRelease((PVOID)v9);
      KeLeaveCriticalRegion();
      goto LABEL_6;
    }
LABEL_9:
    if( v7 < v8 )
      break;
LABEL_35:
    v5 = (unsigned int)(v5 + 1);
  }
  while( (unsigned int)v5 < 0x20 );
  if( v4 >= 0x400 )
  {
    return(unsigned int)-1073741671;
  }
  else
  {
    v11 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v11 + 242);
    v12 = (volatile signed __int64 *)(a1 + 416);
    ExAcquirePushLockExclusiveEx(a1 + 416, 0i64);
    if( (*v24 & 0x100) == 0 )
      goto LABEL_12;
    if( *(_DWORD *)(a1 + 432) == -1 )
    {
      *(_DWORD *)(a1 + 432) = v4;
LABEL_12:
      *(_BYTE *)(v7 + 34) &= ~1u;
      *(_BYTE *)(v7 + 34) &= ~2u;
      *(_WORD *)(v7 + 32) ^= (*(_WORD *)(v7 + 32) ^ (*v24 >> 18 << 7)) & 0x80;
      *(_QWORD *)(v7 + 24) = *(_QWORD *)(a3 + 16);
      ++*(_DWORD *)(a1 + 424);
      if( (_InterlockedExchangeAdd64(v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)(a1 + 416));
      KeAbPostRelease((PVOID)(a1 + 416));
      KeLeaveCriticalRegion();
      *(_QWORD *)v7 = a2;
      do
      {
        v13 = *(_WORD *)(v7 + 32) ^ (*(_WORD *)(v7 + 32) ^ (*(_WORD *)(v7 + 32) + 1)) & 0x3F;
        *(_WORD *)(v7 + 32) = v13;
        v14 = v4 | ((v13 & 0x3F) << 10);
        *a4 = v14;
      }
      while( v14 == 66559 );
      v15 = SmEtwEnabled(0i64);
      if( v15 )
        SmKmEtwLogStoreChange(v15, *(PVOID *)v7, (EVENT_DESCRIPTOR *)&SmEventStoreCreate, v16);
      _InterlockedExchange64((volatile __int64 *)(v7 + 8), 0i64);
      ExAcquireRundownProtection((PEX_RUNDOWN_REF)(v7 + 8));
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v7 + 16), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)(v7 + 16));
      KeAbPostRelease((PVOID)(v7 + 16));
      KeLeaveCriticalRegion();
      return 0;
    }
    else
    {
      if( (_InterlockedExchangeAdd64(v12, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)(a1 + 416));
      KeAbPostRelease((PVOID)(a1 + 416));
      KeLeaveCriticalRegion();
      if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v7 + 16), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock((volatile INT64 *)(v7 + 16));
      KeAbPostRelease((PVOID)(v7 + 16));
      KeLeaveCriticalRegion();
      return(unsigned int)-1073740757;
    }
  }
}

Referenced by:

SmProcessCreateRequest