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