HvCheckHive
INT64 __fastcall HvCheckHive(INT64 a1, INT64 a2, INT64 a3, INT64 r9_0, INT64 a5, INT64 arg28){
unsigned int *v6;
INT64 a7;
unsigned int v8;
INT64 a6;
unsigned int v10;
INT64 v11;
unsigned int v12;
_BYTE *CellMap;
__int64 FreeBin;
__int64 v15;
INT64 v16;
RTL_BITMAP *v17;
_DWORD *v18;
INT64 v19;
int v20;
unsigned int v21;
INT64 v23;
_DWORD *v24;
INT64 v25;
PRTL_BITMAP BitMapHeader;
int a4;
INT64 v29;
v29 = r9_0;
a4 = 0;
v6 = (unsigned int *)(a1 + 272);
a7 = arg28;
v8 = 0;
a6 = a5;
v10 = 0;
v11 = a1;
while( 2 )
{
v12 = *v6;
while( v8 < v12 )
{
CellMap = (_BYTE *)HvpGetCellMap(v11, v8);
if( !CellMap )
{
v21 = -1073741492;
if( a7 )
{
LODWORD(BitMapHeader) = 0;
SetFailureLocation(a7, 0i64, 16i64, 3221225804i64, (INT64)BitMapHeader);
*(_DWORD *)(a7 + 296) = v10;
*(_DWORD *)(a7 + 300) = v8;
}
return v21;
}
FreeBin = HvpMapEntryGetFreeBin(CellMap);
if( FreeBin )
{
v23 = *(unsigned int *)(FreeBin + 16);
v8 += v23;
if( a6 )
{
HvAddToLayoutStats(a6, v23);
HvMoveLayoutStats(v24);
}
}
else
{
v18 = (_DWORD *)(*(_QWORD *)(v15 + 8) & 0xFFFFFFFFFFFFFFF0ui64);
v19 = (unsigned int)v18[2];
if( (unsigned int)v19 > v12 - v8
|| (unsigned int)v19 < 0x20
|| (v19 & 0xFFF) != 0
|| *v18 != 1852400232
|| v18[1] != v8 )
{
v25 = 3221225804i64;
v21 = -1073741492;
if( !a7 )
return v21;
LODWORD(BitMapHeader) = 32;
goto LABEL_23;
}
v20 = HvCheckBin(v19, v18, v16, &a4, v17, a6, a7);
v21 = v20;
if( v20 < 0 )
{
if( !a7 )
return v21;
LODWORD(BitMapHeader) = 48;
v25 = (unsigned int)v20;
LABEL_23:
SetFailureLocation(a7, 0i64, 16i64, v25, (INT64)BitMapHeader);
*(_DWORD *)(a7 + 296) = v10;
*(_DWORD *)(a7 + 300) = v8;
*(_QWORD *)(a7 + 304) = v18;
return v21;
}
v8 += v18[2];
}
v11 = a1;
}
++v10;
v6 += 158;
v8 = 0x80000000;
if( v10 <= 1 )
continue;
return 0;
}
}Referenced by:
CmCheckRegistry