HvpEnlistFreeCells
UINT8 __stdcall HvpEnlistFreeCells(_HHIVE *Hive, _HBIN *Bin, UINT64 BinOffset){
int v3;
char v4;
unsigned int Size;
unsigned int v6;
int v7;
size_t *v10;
size_t v11;
unsigned int v12;
UINT64 Point;
_HIVE_LOAD_FAILURE *HiveLoadFailure;
int v16;
v16 = v3;
Hive->HvBinHeadersUse += 32;
v4 = 0;
Size = Bin->Size;
v6 = 32;
v7 = BinOffset;
HiveLoadFailure = (_HIVE_LOAD_FAILURE *)Hive->HiveLoadFailure;
if( Size <= 0x20 )
return 0;
do
{
v10 = (unsigned int *)((char *)&Bin->Signature + v6);
v11 = *v10;
if( (*v10 & 0x80000000) != 0 )
v11 = -v11;
if( v11 + v6 < v6 || v11 + v6 > Size || (v11 & 7) != 0 || !v11 )
{
if( (v3 & 0x20000) != 0 || !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
{
LODWORD(Point) = 0;
SetFailureLocation(HiveLoadFailure, 0i64, _HvpEnlistFreeCells, 3221225804i64, Point);
return 76;
}
v12 = v6 + v7;
v11 = Size - v6;
if( !HvpMarkDirty((ULONG_PTR)Hive, v6 + v7, Size - v6, CmHiveDirtyNormal) )
{
LODWORD(Point) = 16;
SetFailureLocation(HiveLoadFailure, 0i64, _HvpEnlistFreeCells, 3221225626i64, Point);
return -102;
}
memset((char *)Bin + v6, 0i64, v11);
*v10 = v11;
v4 = 1;
LODWORD(Point) = 32;
Hive->BaseBlock->BootType |= 4u;
SetFailureLocation(HiveLoadFailure, 1ui64, _HvpEnlistFreeCells, 1073741833i64, Point);
}
else
{
v12 = v6 + v7;
if( (*v10 & 0x80000000) != 0 )
{
Hive->HvUsedCellsUse += v11;
goto LABEL_10;
}
}
Hive->HvFreeCellsUse += v11;
HvpEnlistFreeCell(Hive, v12, v11, 0, Point);
v3 = v16;
LABEL_10:
Size = Bin->Size;
v6 += v11;
}
while( v6 < Size );
if( !v4 )
return 0;
return 9;
}Referenced by:
HvpBuildMapForMemoryBackedHive
HvpRemapAndEnlistHiveBins