HvCheckBin
__int64 __fastcall HvCheckBin(
__int64 a1,
_HBIN *a2,
__int64 a3,
_DWORD *a4,
_RTL_BITMAP *BitMapHeader,
_HIVE_LAYOUT_STATS_MOVE *Stats,
_HIVE_LOAD_FAILURE *HiveLoadFailure){
_HIVE_LOAD_FAILURE *v7;
unsigned int v8;
unsigned int v10;
unsigned int v11;
int v12;
_HBIN *v13;
__int64 Size;
__int64 Signature;
__int64 v16;
_HBIN *v17;
char v19;
UINT64 v20;
_HIVE_LAYOUT_STATS_MOVE *v21;
_HIVE_LOAD_FAILURE *v22;
UINT64 Point;
unsigned int v24;
_DWORD *v25;
v25 = a4;
v7 = HiveLoadFailure;
v8 = 0;
v24 = 0;
v10 = 0;
v11 = 0;
v12 = 0;
if( HiveLoadFailure )
HiveLoadFailure->CheckBin.Bin = a2;
v13 = a2 + 1;
Size = a2->Size;
if( v13 >= (_HBIN *)((char *)a2 + Size) )
{
LABEL_14:
if( v11 + v10 + 32i64 == (unsigned int)Size )
{
if( v13 == (_HBIN *)((char *)a2 + (unsigned int)Size) )
{
if( a4 )
*a4 += v12;
return v8;
}
LODWORD(Point) = 112;
}
else
{
LODWORD(Point) = 96;
}
v8 = -1073741492;
SetFailureLocation(v7, 0i64, _HvCheckBin, 3221225804i64, Point);
return v8;
}
while( 1 )
{
Signature = (int)v13->Signature;
if( (int)Signature >= 0 )
break;
v16 = (unsigned int)-(int)Signature;
if( (unsigned int)v16 > (unsigned int)Size
|| (v17 = (_HBIN *)((char *)v13 + v16), (char *)v13 + v16 > (char *)a2 + (unsigned int)Size) )
{
v22 = HiveLoadFailure;
v8 = -1073741492;
if( !HiveLoadFailure )
return v8;
LODWORD(Point) = 32;
goto LABEL_39;
}
v11 -= Signature;
v12 = v12 - Signature - 4;
if( v11 > (unsigned int)Size )
{
v22 = HiveLoadFailure;
v8 = -1073741492;
if( !HiveLoadFailure )
return v8;
LODWORD(Point) = 48;
goto LABEL_39;
}
if( Stats && (unsigned int)v16 >= 0x54ui64 && LOWORD(v13->FileOffset) == 27502 )
{
v19 = v13->Reserved1[1];
if( (v19 & 2) != 0 )
{
HvMoveLayoutStats(Stats + 2);
HvMoveLayoutStats(Stats + 1);
*(_QWORD *)&Stats[3].MoveOutSpace = 0i64;
}
else
{
v20 = (unsigned int)(8 * v13->TimeStamp.anonymous_0.HighPart + 40 - Signature);
if( (v19 & 1) != 0 )
{
HvAddToLayoutStats(Stats + 2, v20);
HvMoveLayoutStats(Stats + 1);
if( !Stats[3].MoveOutSpace )
Stats[3].MoveOutSpace = a2->FileOffset;
Stats[3].MoveOutAllocs = 0;
}
else
{
HvAddToLayoutStats(Stats + 1, v20);
if( !Stats[3].MoveOutAllocs )
Stats[3].MoveOutAllocs = a2->FileOffset;
}
}
}
if( BitMapHeader )
{
RtlSetBits(BitMapHeader, ((unsigned int)v13 + a2->FileOffset - (_DWORD)a2) >> 3, 1ui64);
v10 = v24;
}
LABEL_12:
v13 = v17;
LODWORD(Size) = a2->Size;
if( v17 >= (_HBIN *)((char *)a2 + (unsigned int)Size) )
{
a4 = v25;
v7 = HiveLoadFailure;
goto LABEL_14;
}
}
if( (unsigned int)Signature <= (unsigned int)Size
&& (char *)v13 + Signature <= (char *)a2 + (unsigned int)Size
&& (_DWORD)Signature )
{
v10 += Signature;
v24 = v10;
if( v10 <= (unsigned int)Size )
{
if( Stats )
{
HvAddToLayoutStats(Stats, (unsigned int)Signature);
HvMoveLayoutStats(v21);
}
v17 = (_HBIN *)((char *)v13 + (int)v13->Signature);
goto LABEL_12;
}
v22 = HiveLoadFailure;
v8 = -1073741492;
if( HiveLoadFailure )
{
LODWORD(Point) = 80;
LABEL_39:
SetFailureLocation(v22, 0i64, _HvCheckBin, 3221225804i64, Point);
HiveLoadFailure->CheckBin.CellPoint = (_HCELL *)v13;
return v8;
}
return v8;
}
if( HiveLoadFailure )
{
LODWORD(Point) = 64;
SetFailureLocation(HiveLoadFailure, 0i64, _HvCheckBin, 3221225804i64, Point);
HiveLoadFailure->CheckBin.CellPoint = (_HCELL *)v13;
}
return 60i64;
}Referenced by:
HvCheckHive