SmcStoreResize

NTSTATUS __stdcall SmcStoreResize(_SMC_CACHE_MANAGER *CacheMgr, _SMC_STORE_RESIZE_REQUEST *Request){
  UINT64 CacheId; 
  _PRIVILEGE_SET *v4; 
  _SMC_CACHE *v5; 
  _SMC_CACHE *v6; 
  int v7; 
  __int64 v8; 
  unsigned int *p_RegionCount; 
  unsigned __int64 v10; 
  unsigned int *v11; 
  bool v12; 
  _ETHREAD *CurrentThread; 
  _EX_PUSH_LOCK *v14; 
  _SMC_STORE_ENTRY *v15; 
  _EX_RUNDOWN_REF *v16; 
  _PRIVILEGE_SET *v17; 
  unsigned __int64 v18; 
  unsigned __int64 v19; 
  _DWORD *Count; 
  _ETHREAD *v21; 
  _DWORD *v22; 
  unsigned __int64 v23; 
  _PRIVILEGE_SET *v24; 
  unsigned __int64 v25; 
  UINT64 AddRegions; 
  INT64 v28; 
  _RTL_BITMAP BitMapHeader; 
  _SMC_STORE_ENTRY TransitionEntry[4]; 
  __int64 v31; 
  int v33; 
  _EX_RUNDOWN_REF *v34; 

  CacheId = Request->CacheId;
  v31 = 0i64;
  v4 = 0i64;
  v33 = 0;
  *(_OWORD *)TransitionEntry = 0i64;
  BitMapHeader = 0i64;
  v5 = SmcCacheReference(CacheMgr, CacheId);
  v6 = v5;
  if( !v5 )
    return -1073741672;
  v8 = (unsigned int)v5[2];
  p_RegionCount = &Request->RegionCount;
  if( Request->RegionCount > (unsigned int)v8 )
  {
    v7 = -1073741811;
    goto LABEL_35;
  }
  v10 = (unsigned __int64)(v8 + 31) >> 5;
  LODWORD(v11) = SSHSupportAllocateNonPaged(4 * v10, 0x72436D73u);
  v4 = (_PRIVILEGE_SET *)v11;
  if( v11 )
  {
    v12 = (Request->_bf_0 & 0x100) == 0;
    BitMapHeader.SizeOfBitMap = v6[2];
    BitMapHeader.Buffer = v11;
    if( v12 )
    {
      RtlClearAllBits(&BitMapHeader);
    }
    else
    {
      RtlSetAllBits(&BitMapHeader);
      TransitionEntry[1] |= 4u;
      v31 = 0i64;
      *(_QWORD *)&TransitionEntry[2] = v4;
    }
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    v14 = (_EX_PUSH_LOCK *)(v6 + 40);
    ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v6 + 20, 0i64);
    v15 = SmcStoreEntryFind(v6, Request->StoreId, Request->StoreManagerType);
    v34 = (_EX_RUNDOWN_REF *)v15;
    if( v15 )
    {
      v33 = ExAcquireRundownProtection((_EX_RUNDOWN_REF *)v15 + 2);
      if( (Request->_bf_0 & 0x100) != 0 )
      {
        v7 = SmcStorePlacementGet(v6, *p_RegionCount, TransitionEntry);
        if( v7 < 0 )
          goto LABEL_30;
        v16 = v34;
        v17 = v4;
        v18 = (unsigned int)v10;
        v19 = 0i64;
        Count = (_DWORD *)v34[1].Count;
        if( v4 > (_PRIVILEGE_SET *)((char *)v4 + 4 * (unsigned int)v10) )
          v18 = 0i64;
        if( v18 )
        {
          do
          {
            ++v19;
            *Count |= v17->PrivilegeCount;
            v17 = (_PRIVILEGE_SET *)((char *)v17 + 4);
            ++Count;
          }
          while( v19 < v18 );
        }
      }
      else
      {
        v16 = v34;
      }
      if( (_InterlockedExchangeAdd64(&v14->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
        ExfTryToWakePushLock(v14);
      KeAbPostRelease(v14);
      KeLeaveCriticalRegion();
      LODWORD(AddRegions) = ((unsigned __int32)Request->_bf_0 >> 8) & 1;
      SmStoreResize(
        Request->StoreManagerType,
        Request->StoreId,
        &BitMapHeader,
        (UINT64 *)&Request->RegionCount,
        AddRegions,
        v28,
        *(INT64 *)&BitMapHeader.SizeOfBitMap,
        (INT64)BitMapHeader.Buffer);
      if( (Request->_bf_0 & 0x100) != 0 || !*p_RegionCount )
      {
        v7 = 0;
LABEL_33:
        if( v33 )
          ExReleaseRundownProtection(v34 + 2);
        goto LABEL_35;
      }
      v21 = (_ETHREAD *)KeGetCurrentThread();
      --v21->Tcb.KernelApcDisable;
      ExAcquirePushLockExclusiveEx(v14, 0i64);
      v22 = (_DWORD *)v16[1].Count;
      v23 = (unsigned int)v10;
      v24 = v4;
      v25 = 0i64;
      if( v4 > (_PRIVILEGE_SET *)((char *)v4 + 4 * (unsigned int)v10) )
        v23 = 0i64;
      if( v23 )
      {
        do
        {
          ++v25;
          *v22 ^= v24->PrivilegeCount;
          v24 = (_PRIVILEGE_SET *)((char *)v24 + 4);
          ++v22;
        }
        while( v25 < v23 );
      }
      v7 = 0;
    }
    else
    {
      v7 = -1073741672;
    }
LABEL_30:
    if( (_InterlockedExchangeAdd64(&v14->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(v14);
    KeAbPostRelease(v14);
    KeLeaveCriticalRegion();
    goto LABEL_33;
  }
  v7 = -1073741670;
LABEL_35:
  ExReleaseRundownProtection((_EX_RUNDOWN_REF *)&CacheMgr[8 * (Request->CacheId & 0xF) + 2]);
  if( v4 )
    CmSiFreeMemory(v4);
  return v7;
}

Referenced by:

SmcProcessResizeRequest