HvpDropPagedBins

NTSTATUS __stdcall HvpDropPagedBins(_HHIVE *Hive){
  VOID *v1; 
  size_t v2; 
  unsigned int Length; 
  unsigned int i; 
  _HMAP_ENTRY *CellMap; 
  _HMAP_ENTRY *v7; 
  unsigned __int64 PermanentBinAddress; 
  _DWORD *v9; 
  int Bin; 
  __int64 FreeBin; 
  VOID *Tag; 
  _HBIN **a6; 
  _HBIN **v15; 
  UINT64 a2; 

  a2 = 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(Hive, i);
      v7 = CellMap;
      if( !CellMap )
        KeBugCheckEx(0x51u, (PVOID)1, Hive, (PVOID)i, (PVOID)0x1456);
      PermanentBinAddress = CellMap->PermanentBinAddress;
      if( (PermanentBinAddress & 8) != 0 )
        break;
      v9 = (_DWORD *)(PermanentBinAddress & 0xFFFFFFFFFFFFFFF0ui64);
      v2 = v9[2];
      Bin = HvpAllocateBin(Hive, v2, 0, 0x35324D43ui64, (UINT64)&a2, a6, v15);
      if( Bin < 0 )
        goto LABEL_11;
      memmove((VOID *)a2, v9, v2);
      FreeBin = HvpMapEntryGetFreeBin(v7);
      HvpPointMapEntriesToBuffer(Hive, a2, v2, i, 1, FreeBin);
      a2 = 0i64;
      CmpReleaseGlobalQuota(v2);
    }
  }
  if( _InterlockedExchangeAdd(&CmpPreloadedHivesCount, 0xFFFFFFFF) == 1 )
    MmFreeBootRegistry();
  Hive->HiveFlags &= ~0x10u;
  Bin = 0;
LABEL_11:
  if( a2 )
    HvpFreeBin(Hive, v2, (VOID *)a2, v1, Tag);
  return Bin;
}

Referenced by:

CmpLoadHiveThread
CmpMountPreloadedHives