HvpRemapAndEnlistHiveBins
NTSTATUS __stdcall HvpRemapAndEnlistHiveBins(_HHIVE *Hive){
VOID *v1;
char *v2;
unsigned int Length;
unsigned int v4;
char v5;
unsigned int v7;
unsigned int i;
_HBIN *v9;
UINT64 v10;
unsigned int Size;
int v12;
int v13;
_HMAP_ENTRY *v15;
_HBIN *v16;
UINT64 v17;
unsigned int v18;
NTSTATUS Bin;
unsigned int j;
VOID *v21;
VOID *v22;
_HHIVE *v23;
int v24;
_HBIN *Tag;
_HBIN **v26;
UINT8 v27;
_HBIN **v28;
unsigned int v29;
UINT64 TemporaryBin;
INT64 v31;
_HMAP_ENTRY *CellMap;
v31 = 0i64;
v2 = 0i64;
Length = Hive->Storage[0].Length;
v4 = 0;
v5 = 0;
TemporaryBin = 0i64;
v29 = Length;
if( (Hive->HiveFlags & 0x20000) != 0 )
v7 = LODWORD(Hive->ViewMap.StorageEndFileOffset) - 4096;
else
v7 = 0;
for( i = 0; i < v7; Length = v29 )
{
CellMap = HvpGetCellMap(Hive, i);
v9 = (_HBIN *)(CellMap->PermanentBinAddress & 0xFFFFFFFFFFFFFFF0ui64);
if( !HvpValidateLoadedBin(v9, i, Length) )
{
if( !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
return -1073741492;
if( !HvpMarkDirty((ULONG_PTR)Hive, v10, 0x1000ui64, CmHiveDirtyNormal) )
return -1073741670;
memset(v9, 0i64, 0x1000u);
v9->Size = 4096;
v9->Signature = 1852400232;
v9->FileOffset = i & 0x7FFFFFFF;
v5 = 1;
v9[1].Signature = 4064;
}
Size = v9->Size;
if( Size != 4096 )
{
v4 = v9->Size;
if( i + Size > v7 )
break;
v13 = HvpViewMapPromoteRangeToMapping((_XSTATE_CONFIGURATION *)&Hive->ViewMap, i, Size, &v31);
if( v13 < 0 )
return v13;
HvpPointMapEntriesToBuffer(Hive, v31, v4, i, 0, 0i64);
v9 = (_HBIN *)(CellMap->PermanentBinAddress & 0xFFFFFFFFFFFFFFF0ui64);
}
LOBYTE(v12) = HvpEnlistFreeCells(Hive, v9, i);
v13 = v12;
if( v12 == 1073741833 )
{
v5 = 1;
}
else if( v12 < 0 )
{
return v13;
}
i += v9->Size;
}
while( i < Length )
{
v15 = HvpGetCellMap(Hive, i);
v16 = (_HBIN *)(v15->PermanentBinAddress & 0xFFFFFFFFFFFFFFF0ui64);
if( !HvpValidateLoadedBin(v16, i, Length) )
{
if( !BYTE3(NlsMbCodePageTag) && (*(&CmpDummyThreadEvent + 2744) & 6) == 0 )
return -1073741492;
if( !HvpMarkDirty((ULONG_PTR)Hive, v17, 0x1000ui64, CmHiveDirtyNormal) )
return -1073741670;
memset(v16, 0i64, 0x1000u);
v16->Size = 4096;
v16->Signature = 1852400232;
v16->FileOffset = i & 0x7FFFFFFF;
v5 = 1;
v16[1].Signature = 4064;
}
v18 = v16->Size;
if( v18 != 4096 )
{
v4 = v16->Size;
Bin = HvpAllocateBin(Hive, v18, 0, 0x31334D43ui64, (UINT64)&TemporaryBin, v26, v28);
v2 = (char *)TemporaryBin;
v13 = Bin;
if( Bin < 0 )
goto LABEL_12;
for( j = 0; j < v4; v15->MemAlloc = 0 )
{
v15 = HvpGetCellMap(Hive, j + i);
v21 = (VOID *)(v15->PermanentBinAddress & 0xFFFFFFFFFFFFFFF0ui64);
memmove(&v2[j], v21, 0x1000u);
if( (v15->PermanentBinAddress & 8) != 0 )
HvpFreeBin(Hive, 0x1000ui64, v21, v22, Tag);
else
CmpReleaseGlobalQuota(0x1000u);
j += 4096;
v15->BlockOffset = 0i64;
v15->PermanentBinAddress = 0i64;
}
if( !HvIsRangeDirty((INT64)Hive, i, v4) )
{
v13 = HvpProtectBin(v23, v4, (_HSTORAGE_TYPE)v2, 0i64, Tag, v27);
if( v13 < 0 )
goto LABEL_12;
}
HvpPointMapEntriesToBuffer(Hive, (UINT64)v2, v4, i, 1, 0i64);
v16 = (_HBIN *)(v15->PermanentBinAddress & 0xFFFFFFFFFFFFFFF0ui64);
v2 = 0i64;
TemporaryBin = 0i64;
}
LOBYTE(v24) = HvpEnlistFreeCells(Hive, v16, i);
v13 = v24;
if( v24 == 1073741833 )
{
v5 = 1;
}
else if( v24 < 0 )
{
return v13;
}
i += v16->Size;
Length = v29;
}
if( v5 )
return 1073741833;
v13 = 0;
LABEL_12:
if( v2 )
HvpFreeBin(Hive, v4, v2, v1, Tag);
return v13;
}Referenced by:
No references.