HvpRemapAndEnlistHiveBins
INT64 __fastcall HvpRemapAndEnlistHiveBins(ULONG_PTR BugCheckParameter2){
void *v1;
UINT8 *v2;
unsigned int v3;
unsigned int v4;
char v5;
unsigned int v7;
unsigned int i;
_HBIN *v9;
INT64 v10;
unsigned int Size;
int v12;
int v13;
INT64 v15;
_HBIN *v16;
INT64 v17;
unsigned int v18;
int v19;
unsigned int j;
UINT8 *v21;
void *v22;
INT64 v23;
int v24;
void *v25;
unsigned int v26;
INT64 TemporaryBin;
INT64 a4;
INT64 CellMap;
a4 = 0i64;
v2 = 0i64;
v3 = *(_DWORD *)(BugCheckParameter2 + 272);
v4 = 0;
v5 = 0;
TemporaryBin = 0i64;
v26 = v3;
if( (*(_DWORD *)(BugCheckParameter2 + 160) & 0x20000) != 0 )
v7 = *(_DWORD *)(BugCheckParameter2 + 224) - 4096;
else
v7 = 0;
for( i = 0; i < v7; v3 = v26 )
{
CellMap = HvpGetCellMap(BugCheckParameter2, i);
v9 = (_HBIN *)(*(_QWORD *)(CellMap + 8) & 0xFFFFFFFFFFFFFFF0ui64);
if( !(unsigned __int8)HvpValidateLoadedBin(v9, i, v3) )
{
if( !BYTE3(NlsMbCodePageTag) && (CmpBootType & 6) == 0 )
return(unsigned int)-1073741492;
if( !HvpMarkDirty(BugCheckParameter2, v10, 4096i64) )
return(unsigned int)-1073741670;
memset((INT64)v9, 0i64);
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(BugCheckParameter2 + 216, i, Size, &a4);
if( v13 < 0 )
return(unsigned int)v13;
HvpPointMapEntriesToBuffer(BugCheckParameter2, a4, v4, i, 0, 0i64);
v9 = (_HBIN *)(*(_QWORD *)(CellMap + 8) & 0xFFFFFFFFFFFFFFF0ui64);
}
v12 = HvpEnlistFreeCells(BugCheckParameter2, (INT64)v9, i, 0i64);
v13 = v12;
if( v12 == 1073741833 )
{
v5 = 1;
}
else if( v12 < 0 )
{
return(unsigned int)v13;
}
i += v9->Size;
}
while( i < v3 )
{
v15 = HvpGetCellMap(BugCheckParameter2, i);
v16 = (_HBIN *)(*(_QWORD *)(v15 + 8) & 0xFFFFFFFFFFFFFFF0ui64);
if( !(unsigned __int8)HvpValidateLoadedBin(v16, i, v3) )
{
if( !BYTE3(NlsMbCodePageTag) && (CmpBootType & 6) == 0 )
return(unsigned int)-1073741492;
if( !HvpMarkDirty(BugCheckParameter2, v17, 4096i64) )
return(unsigned int)-1073741670;
memset((INT64)v16, 0i64);
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;
v19 = HvpAllocateBin(BugCheckParameter2, v18, 0i64, 0x31334D43ui64, &TemporaryBin);
v2 = (UINT8 *)TemporaryBin;
v13 = v19;
if( v19 < 0 )
goto LABEL_12;
for( j = 0; j < v4; *(_DWORD *)(v15 + 16) = 0 )
{
v15 = HvpGetCellMap(BugCheckParameter2, j + i);
v21 = (UINT8 *)(*(_QWORD *)(v15 + 8) & 0xFFFFFFFFFFFFFFF0ui64);
memmove(&v2[j], v21, 0x1000ui64);
if( (*(_BYTE *)(v15 + 8) & 8) != 0 )
HvpFreeBin((_HHIVE *)BugCheckParameter2, 0x1000u, (HSTORAGE_TYPE)v21, v22, v25);
else
CmpReleaseGlobalQuota(0x1000ui64);
j += 4096;
*(_QWORD *)v15 = 0i64;
*(_QWORD *)(v15 + 8) = 0i64;
}
if( !HvIsRangeDirty(BugCheckParameter2, i, v4) )
{
v13 = HvpProtectBin(v23, v4, v2, 0);
if( v13 < 0 )
goto LABEL_12;
}
HvpPointMapEntriesToBuffer(BugCheckParameter2, (INT64)v2, v4, i, 1, 0i64);
v16 = (_HBIN *)(*(_QWORD *)(v15 + 8) & 0xFFFFFFFFFFFFFFF0ui64);
v2 = 0i64;
TemporaryBin = 0i64;
}
v24 = HvpEnlistFreeCells(BugCheckParameter2, (INT64)v16, i, 0i64);
v13 = v24;
if( v24 == 1073741833 )
{
v5 = 1;
}
else if( v24 < 0 )
{
return(unsigned int)v13;
}
i += v16->Size;
v3 = v26;
}
if( v5 )
return 1073741833;
v13 = 0;
LABEL_12:
if( v2 )
HvpFreeBin((_HHIVE *)BugCheckParameter2, v4, (HSTORAGE_TYPE)v2, v1, v25);
return(unsigned int)v13;
}Referenced by:
No references.