HvpDropPagedBins

NTSTATUS __stdcall HvpDropPagedBins(_HHIVE *Hive){
  void *v1; 
  unsigned int v2; 
  unsigned int Length; 
  unsigned int i; 
  INT64 CellMap; 
  _BYTE *v7; 
  __int64 v8; 
  unsigned __int64 v9; 
  NTSTATUS v10; 
  __int64 FreeBin; 
  void *BugCheckParameter4; 
  INT64 v14; 
  v14 = 0i64;
  v2 = 0;
  if( (Hive->HiveFlags & 0x10) == 0 )
    return 0;
  Length = Hive->Storage[0].Length;
  if( Length )
  {
    for( i = 0; i < Length; i += v2 )
    {
      CellMap = HvpGetCellMap((INT64)Hive, i);
      v7 = (_BYTE *)CellMap;
      if( !CellMap )
        KeBugCheckEx(0x51u, 1ui64, (ULONG_PTR)Hive, i, 0x1456ui64);
      v8 = *(_QWORD *)(CellMap + 8);
      if( (v8 & 8) != 0 )
        break;
      v9 = v8 & 0xFFFFFFFFFFFFFFF0ui64;
      v2 = *(_DWORD *)(v9 + 8);
      v10 = HvpAllocateBin((INT64)Hive, v2, 0i64, 0x35324D43ui64, &v14);
      if( v10 < 0 )
        goto LABEL_11;
      memmove((UINT8 *)v14, (UINT8 *)v9, v2);
      FreeBin = HvpMapEntryGetFreeBin(v7);
      HvpPointMapEntriesToBuffer((UINT64)Hive, v14, v2, i, 1, FreeBin);
      v14 = 0i64;
      CmpReleaseGlobalQuota(v2);
    }
  }
  if( _InterlockedExchangeAdd(&CmpPreloadedHivesCount, 0xFFFFFFFF) == 1 )
    MmFreeBootRegistry();
  Hive->HiveFlags &= ~0x10u;
  v10 = 0;
LABEL_11:
  if( v14 )
    HvpFreeBin(Hive, v2, (HSTORAGE_TYPE)v14, v1, BugCheckParameter4);
  return v10;
}

Referenced by:

CmpLoadHiveThread
CmpMountPreloadedHives