HvCheckHive

__int64 __fastcall HvCheckHive(
        _HHIVE *Hive,
        __int64 a2,
        __int64 a3,
        __int64 a4,
        _HIVE_LAYOUT_STATS_MOVE *Stats,
        _HIVE_LOAD_FAILURE *HiveLoadFailure){
  _DUAL *Storage; 
  _HIVE_LOAD_FAILURE *v7; 
  unsigned int v8; 
  _HIVE_LAYOUT_STATS_MOVE *v9; 
  unsigned int v10; 
  _HHIVE *v11; 
  unsigned int Length; 
  _HMAP_ENTRY *CellMap; 
  __int64 FreeBin; 
  __int64 v15; 
  __int64 v16; 
  _RTL_BITMAP *v17; 
  _HBIN *v18; 
  __int64 Size; 
  int v20; 
  unsigned int v21; 
  UINT64 v23; 
  _HIVE_LAYOUT_STATS_MOVE *v24; 
  INT64 v25; 
  UINT64 Point; 
  int v28; 
  __int64 v29; 

  v29 = a4;
  v28 = 0;
  Storage = Hive->Storage;
  v7 = HiveLoadFailure;
  v8 = 0;
  v9 = Stats;
  v10 = 0;
  v11 = Hive;
  while( 2 )
  {
    Length = Storage->Length;
    while( v8 < Length )
    {
      CellMap = HvpGetCellMap(v11, v8);
      if( !CellMap )
      {
        v21 = -1073741492;
        if( v7 )
        {
          LODWORD(Point) = 0;
          SetFailureLocation(v7, 0i64, _HvCheckHive, 3221225804i64, Point);
          v7->CheckHive.Space = v10;
          v7->CheckHive.MapPoint = v8;
        }
        return v21;
      }
      FreeBin = HvpMapEntryGetFreeBin(CellMap);
      if( FreeBin )
      {
        v23 = *(unsigned int *)(FreeBin + 16);
        v8 += v23;
        if( v9 )
        {
          HvAddToLayoutStats(v9, v23);
          HvMoveLayoutStats(v24);
        }
      }
      else
      {
        v18 = (_HBIN *)(*(_QWORD *)(v15 + 8) & 0xFFFFFFFFFFFFFFF0ui64);
        Size = v18->Size;
        if( (unsigned int)Size > Length - v8
          || (unsigned int)Size < 0x20
          || (Size & 0xFFF) != 0
          || v18->Signature != 1852400232
          || v18->FileOffset != v8 )
        {
          v25 = 3221225804i64;
          v21 = -1073741492;
          if( !v7 )
            return v21;
          LODWORD(Point) = 32;
          goto LABEL_23;
        }
        v20 = HvCheckBin(Size, v18, v16, &v28, v17, v9, v7);
        v21 = v20;
        if( v20 < 0 )
        {
          if( !v7 )
            return v21;
          LODWORD(Point) = 48;
          v25 = (unsigned int)v20;
LABEL_23:
          SetFailureLocation(v7, 0i64, _HvCheckHive, v25, Point);
          v7->CheckHive.Space = v10;
          v7->CheckHive.MapPoint = v8;
          v7->CheckHive.BinPoint = v18;
          return v21;
        }
        v8 += v18->Size;
      }
      v11 = Hive;
    }
    ++v10;
    ++Storage;
    v8 = 0x80000000;
    if( v10 <= 1 )
      continue;
    return 0;
  }
}

Referenced by:

CmCheckRegistry