HvpShrinkMap

VOID __stdcall HvpShrinkMap(_HHIVE *Hive, _HSTORAGE_TYPE Type, UINT64 OldLength, UINT64 NewLength){
  __int64 v4; 
  unsigned int v5; 
  unsigned int v6; 
  _HHIVE *v7; 
  _HMAP_TABLE *SmallDir; 
  unsigned int v9; 
  _HMAP_ENTRY *CellMap; 
  int v11; 
  unsigned int v12; 
  unsigned int v13; 

  v4 = Type;
  v5 = NewLength;
  v6 = OldLength;
  v7 = Hive;
  if( (_DWORD)NewLength || (SmallDir = Hive->Storage[Type].SmallDir, SmallDir != (_HMAP_TABLE *)v7->Storage[Type].Map) )
  {
    v9 = (Type << 31) + NewLength;
    while( v9 < ((_DWORD)v4 << 31) + v6 )
    {
      CellMap = HvpGetCellMap(v7, v9);
      v9 = v11 + 4096;
      *(_OWORD *)&CellMap->BlockOffset = 0i64;
      *(_QWORD *)&CellMap->MemAlloc = 0i64;
    }
    v12 = ((v5 >> 12) + 511) >> 9;
    v13 = ((v6 >> 12) + 511) >> 9;
    if( v12 < v13 )
      HvpFreeMap(v7, v7->Storage[v4].Map, v12, v13 - 1);
  }
  else
  {
    v7->Free(SmallDir, 12288u);
  }
}

Referenced by:

HvpAddBin