SmcStoreResize

__int64 __fastcall SmcStoreResize(__int64 a1, _DWORD *a2){
  UINT64 v3; 
  struct _PRIVILEGE_SET *NonPaged; 
  struct EX_RUNDOWN_REF v5; 
  unsigned __int64 Count; 
  int v7; 
  __int64 v8; 
  ULONG *v9; 
  unsigned __int64 v10; 
  bool v11; 
  _ETHREAD *CurrentThread; 
  volatile INT64 *v13; 
  struct _EX_RUNDOWN_REF *v14; 
  struct _EX_RUNDOWN_REF *v15; 
  struct _PRIVILEGE_SET *v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  _DWORD *v19; 
  _ETHREAD *v20; 
  _DWORD *v21; 
  unsigned __int64 v22; 
  struct _PRIVILEGE_SET *v23; 
  unsigned __int64 v24; 
  struct _RTL_BITMAP BitMapHeader; 
  __int128 v27; 
  __int64 v28; 
  BOOL v30; 
  struct _EX_RUNDOWN_REF *v31; 
  v3 = (unsigned int)a2[1];
  v28 = 0i64;
  NonPaged = 0i64;
  v30 = 0;
  v27 = 0i64;
  BitMapHeader = 0i64;
  v5.Count = SmcCacheReference(a1, v3).Count;
  Count = v5.Count;
  if( !v5.Count )
    return(unsigned int)-1073741672;
  v8 = *(unsigned int *)(v5.Count + 8);
  v9 = a2 + 4;
  if( a2[4] > (unsigned int)v8 )
  {
    v7 = -1073741811;
    goto LABEL_35;
  }
  v10 = (unsigned __int64)(v8 + 31) >> 5;
  NonPaged = (struct _PRIVILEGE_SET *)SSHSupportAllocateNonPaged((unsigned int)(4 * v10), 0x72436D73u);
  if( NonPaged )
  {
    v11 = (*a2 & 0x100) == 0;
    BitMapHeader.SizeOfBitMap = *(_DWORD *)(Count + 8);
    BitMapHeader.Buffer = &NonPaged->PrivilegeCount;
    if( v11 )
    {
      RtlClearAllBits(&BitMapHeader);
    }
    else
    {
      RtlSetAllBits(&BitMapHeader);
      DWORD1(v27) |= 4u;
      v28 = 0i64;
      *((_QWORD *)&v27 + 1) = NonPaged;
    }
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    v13 = (volatile INT64 *)(Count + 160);
    ExAcquirePushLockExclusiveEx(Count + 160, 0i64);
    v14 = (struct _EX_RUNDOWN_REF *)SmcStoreEntryFind(Count, (unsigned int)a2[2], (unsigned int)a2[3]);
    v31 = v14;
    if( v14 )
    {
      v30 = ExAcquireRundownProtection(v14 + 2);
      if( (*a2 & 0x100) != 0 )
      {
        v7 = SmcStorePlacementGet(Count, *v9, (__int64)&v27);
        if( v7 < 0 )
          goto LABEL_30;
        v15 = v31;
        v16 = NonPaged;
        v17 = (unsigned int)v10;
        v18 = 0i64;
        v19 = (_DWORD *)v31[1].Count;
        if( NonPaged > (struct _PRIVILEGE_SET *)((char *)NonPaged + 4 * (unsigned int)v10) )
          v17 = 0i64;
        if( v17 )
        {
          do
          {
            ++v18;
            *v19 |= v16->PrivilegeCount;
            v16 = (struct _PRIVILEGE_SET *)((char *)v16 + 4);
            ++v19;
          }
          while( v18 < v17 );
        }
      }
      else
      {
        v15 = v31;
      }
      if( (_InterlockedExchangeAdd64(v13, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v13);
      KeAbPostRelease((PVOID)v13);
      KeLeaveCriticalRegion();
      SmStoreResize(a2[3], a2[2], (__int64)&BitMapHeader, a2 + 4, (*a2 >> 8) & 1);
      if( (*a2 & 0x100) != 0 || !*v9 )
      {
        v7 = 0;
LABEL_33:
        if( v30 )
          ExReleaseRundownProtection(v31 + 2);
        goto LABEL_35;
      }
      v20 = (_ETHREAD *)KeGetCurrentThread();
      --*((_WORD *)v20 + 242);
      ExAcquirePushLockExclusiveEx((UINT64)v13, 0i64);
      v21 = (_DWORD *)v15[1].Count;
      v22 = (unsigned int)v10;
      v23 = NonPaged;
      v24 = 0i64;
      if( NonPaged > (struct _PRIVILEGE_SET *)((char *)NonPaged + 4 * (unsigned int)v10) )
        v22 = 0i64;
      if( v22 )
      {
        do
        {
          ++v24;
          *v21 ^= v23->PrivilegeCount;
          v23 = (struct _PRIVILEGE_SET *)((char *)v23 + 4);
          ++v21;
        }
        while( v24 < v22 );
      }
      v7 = 0;
    }
    else
    {
      v7 = -1073741672;
    }
LABEL_30:
    if( (_InterlockedExchangeAdd64(v13, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(v13);
    KeAbPostRelease((PVOID)v13);
    KeLeaveCriticalRegion();
    goto LABEL_33;
  }
  v7 = -1073741670;
LABEL_35:
  ExReleaseRundownProtection((PEX_RUNDOWN_REF)(32i64 * (a2[1] & 0xF) + a1 + 8));
  if( NonPaged )
    CmSiFreeMemory(NonPaged);
  return(unsigned int)v7;
}

Referenced by:

SmcProcessResizeRequest