HvHiveStartFileBacked
INT64 __fastcall HvHiveStartFileBacked(
PVOID BugCheckParameter2,
INT64 a2,
EVENT_DESCRIPTOR *a3,
UINT64 a4,
INT64 a5,
INT64 a6,
INT64 a7,
UNICODE_STRING *FileName,
INT64 a9,
INT64 a10,
INT64 a11,
INT64 a12,
INT64 a13){
unsigned int v14;
int v15;
__int64 v16;
unsigned int Hive;
_HBASE_BLOCK *v18;
INT64 v20;
INT64 v21;
int v22;
int v23;
INT64 v24;
if( *(_DWORD *)BugCheckParameter2 != -1092567328
|| ((unsigned int)a3 & 0xFF617CEC) != 0
|| (unsigned int)a4 > 2
|| (unsigned int)(a6 - 1) > 7 )
{
__fastfail(5u);
}
v14 = (unsigned int)a3 & 0xFFFDFFFF;
if( !(_BYTE)a2 )
v14 = (unsigned int)a3;
*((_DWORD *)BugCheckParameter2 + 40) = v14;
if( a5 )
{
*((_QWORD *)BugCheckParameter2 + 3) = *(_QWORD *)a5;
*((_QWORD *)BugCheckParameter2 + 4) = *(_QWORD *)(a5 + 8);
*((_QWORD *)BugCheckParameter2 + 5) = *(_QWORD *)(a5 + 24);
*((_QWORD *)BugCheckParameter2 + 6) = *(_QWORD *)(a5 + 32);
}
if( (_DWORD)a4 )
{
v15 = 4;
if( (_DWORD)a4 == 1 )
v15 = 1;
*((_DWORD *)BugCheckParameter2 + 41) = v15;
}
else
{
*((_DWORD *)BugCheckParameter2 + 41) = 0;
}
*((_DWORD *)BugCheckParameter2 + 33) = 4096;
*((_QWORD *)BugCheckParameter2 + 1) = HvpGetCellPaged;
*((_DWORD *)BugCheckParameter2 + 34) = a6;
*((_QWORD *)BugCheckParameter2 + 2) = HvpReleaseCellPaged;
*((_DWORD *)BugCheckParameter2 + 52) = 2;
v16 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
if( (_BYTE)a2 )
{
LOBYTE(a2) = 1;
v20 = (*((__int64(__fastcall **)(_QWORD, INT64, __int64))BugCheckParameter2 + 3))(
*((unsigned int *)BugCheckParameter2 + 33),
a2,
825314627i64);
v21 = v20;
if( v20 )
{
memset(v20, 0i64);
*(_DWORD *)(v21 + 28) = 0;
*(_DWORD *)(v21 + 36) = -1;
*(_DWORD *)(v21 + 40) = 0;
*(_DWORD *)v21 = 1718052210;
*(_DWORD *)(v21 + 4) = 1;
*(_DWORD *)(v21 + 8) = 1;
*(_DWORD *)(v21 + 32) = 1;
*(_DWORD *)(v21 + 44) = 1;
HvpFillFileName((_HBASE_BLOCK *)v21, FileName);
*(_DWORD *)(v21 + 144) = 0;
v22 = v14 & 0x80000;
if( v22 )
*(_DWORD *)(v21 + 144) = 2;
*(_DWORD *)(v21 + 20) = 1;
v23 = v22 != 0 ? 6 : 3;
*(_DWORD *)(v21 + 24) = v23;
*((_DWORD *)BugCheckParameter2 + 53) = v23;
*(_DWORD *)(v21 + 164) = 1836346738;
*(_QWORD *)(v21 + 12) = v16;
if( a9 )
{
*(_OWORD *)(v21 + 112) = *(_OWORD *)a9;
*(_OWORD *)(v21 + 128) = *(_OWORD *)a9;
}
if( a10 )
*(_OWORD *)(v21 + 148) = *(_OWORD *)a10;
*(_DWORD *)(v21 + 508) = HvpHeaderCheckSum((_DWORD *)v21);
*((_QWORD *)BugCheckParameter2 + 8) = v21;
*((_DWORD *)BugCheckParameter2 + 45) = 1;
*((_DWORD *)BugCheckParameter2 + 42) = 1;
*((_DWORD *)BugCheckParameter2 + 43) = 1;
*((_BYTE *)BugCheckParameter2 + 190) = 1;
if( a12 )
*(_DWORD *)a12 = 825314627;
return 0;
}
Hive = -1073741670;
LODWORD(v24) = 16;
LABEL_37:
SetFailureLocation(a13, 0i64, 24i64, Hive, v24);
return Hive;
}
CmpTraceHiveMountStart(a5, a2, (UINT64)a3);
Hive = HvLoadHive((ULONG_PTR)BugCheckParameter2);
CmpTraceHiveMountStop(Hive);
if( (Hive & 0x80000000) != 0 )
{
LODWORD(v24) = 64;
goto LABEL_37;
}
if( Hive == 1073741833 && a11 )
*(_BYTE *)a11 = 1;
if( a12 )
*(_DWORD *)a12 = 825445699;
v18 = (_HBASE_BLOCK *)*((_QWORD *)BugCheckParameter2 + 8);
if( (v18->Flags & 1) != 0 )
{
HvMarkBaseBlockDirty((_HHIVE *)BugCheckParameter2);
if( a11 )
*(_BYTE *)a11 = 1;
*(_DWORD *)(*((_QWORD *)BugCheckParameter2 + 8) + 144i64) &= ~1u;
v18 = (_HBASE_BLOCK *)*((_QWORD *)BugCheckParameter2 + 8);
}
HvpFillFileName(v18, FileName);
return 0;
}Referenced by:
CmpCreateHive