HvHiveStartFileBacked
__int64 __fastcall HvHiveStartFileBacked(
_HHIVE *Hive,
__int64 a2,
unsigned int a3,
unsigned int a4,
__int64 a5,
int a6,
int a7,
_UNICODE_STRING *FileName,
__int64 a9,
__int64 a10,
__int64 a11,
__int64 a12,
_HIVE_LOAD_FAILURE *HiveLoadFailure){
unsigned int v14;
unsigned int v15;
__int64 v16;
unsigned int v17;
_HBASE_BLOCK *BaseBlock;
char *v20;
char *v21;
int v22;
unsigned int v23;
UINT64 Point;
if( Hive->Signature != -1092567328 || (a3 & 0xFF617CEC) != 0 || a4 > 2 || (unsigned int)(a6 - 1) > 7 )
__fastfail(5u);
v14 = a3 & 0xFFFDFFFF;
if( !(_BYTE)a2 )
v14 = a3;
Hive->HiveFlags = v14;
if( a5 )
{
Hive->Allocate = *(void *(__fastcall **)(unsigned int, unsigned __int8, unsigned int))a5;
Hive->Free = *(void(__fastcall **)(void *, unsigned int))(a5 + 8);
Hive->FileWrite = *(int(__fastcall **)(_HHIVE *, unsigned int, CMP_OFFSET_ARRAY *, unsigned int, unsigned int))(a5 + 24);
Hive->FileRead = *(int(__fastcall **)(_HHIVE *, unsigned int, unsigned int, void *, unsigned int))(a5 + 32);
}
if( a4 )
{
v15 = 4;
if( a4 == 1 )
v15 = 1;
Hive->CurrentLog = v15;
}
else
{
Hive->CurrentLog = 0;
}
Hive->BaseBlockAlloc = 4096;
Hive->GetCellRoutine = (_CELL_DATA *(__fastcall *)(_HHIVE *, unsigned int, _HV_GET_CELL_CONTEXT *))HvpGetCellPaged;
Hive->Cluster = a6;
Hive->ReleaseCellRoutine = (void(__fastcall *)(_HHIVE *, _HV_GET_CELL_CONTEXT *))HvpReleaseCellPaged;
Hive->StorageTypeCount = 2;
v16 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
if( (_BYTE)a2 )
{
LOBYTE(a2) = 1;
v20 = (char *)Hive->Allocate(Hive->BaseBlockAlloc, a2, 825314627i64);
v21 = v20;
if( v20 )
{
memset(v20, 0i64, Hive->BaseBlockAlloc);
*((_DWORD *)v21 + 7) = 0;
*((_DWORD *)v21 + 9) = -1;
*((_DWORD *)v21 + 10) = 0;
*(_DWORD *)v21 = 1718052210;
*((_DWORD *)v21 + 1) = 1;
*((_DWORD *)v21 + 2) = 1;
*((_DWORD *)v21 + 8) = 1;
*((_DWORD *)v21 + 11) = 1;
HvpFillFileName((_HBASE_BLOCK *)v21, FileName);
*((_DWORD *)v21 + 36) = 0;
v22 = v14 & 0x80000;
if( v22 )
*((_DWORD *)v21 + 36) = 2;
*((_DWORD *)v21 + 5) = 1;
v23 = v22 != 0 ? 6 : 3;
*((_DWORD *)v21 + 6) = v23;
Hive->Version = v23;
*((_DWORD *)v21 + 41) = 1836346738;
*(_QWORD *)(v21 + 12) = v16;
if( a9 )
{
*((_OWORD *)v21 + 7) = *(_OWORD *)a9;
*((_OWORD *)v21 + 8) = *(_OWORD *)a9;
}
if( a10 )
*(_OWORD *)(v21 + 148) = *(_OWORD *)a10;
*((_DWORD *)v21 + 127) = HvpHeaderCheckSum((_HBASE_BLOCK *)v21);
Hive->BaseBlock = (_HBASE_BLOCK *)v21;
Hive->MinimumLogSequence = 1;
Hive->CurrentLogSequence = 1;
Hive->CurrentLogMinimumSequence = 1;
Hive->PrimaryFileValid = 1;
if( a12 )
*(_DWORD *)a12 = 825314627;
return 0;
}
v17 = -1073741670;
LODWORD(Point) = 16;
LABEL_37:
SetFailureLocation(HiveLoadFailure, 0i64, _HvHiveStartFileBacked, v17, Point);
return v17;
}
CmpTraceHiveMountStart();
v17 = HvLoadHive(Hive);
CmpTraceHiveMountStop(v17);
if( (v17 & 0x80000000) != 0 )
{
LODWORD(Point) = 64;
goto LABEL_37;
}
if( v17 == 1073741833 && a11 )
*(_BYTE *)a11 = 1;
if( a12 )
*(_DWORD *)a12 = 825445699;
BaseBlock = Hive->BaseBlock;
if( (BaseBlock->Flags & 1) != 0 )
{
HvMarkBaseBlockDirty(Hive);
if( a11 )
*(_BYTE *)a11 = 1;
Hive->BaseBlock->Flags &= ~1u;
BaseBlock = Hive->BaseBlock;
}
HvpFillFileName(BaseBlock, FileName);
return 0;
}Referenced by:
CmpCreateHive