CmpInitializePreloadedHive
__int64 __fastcall CmpInitializePreloadedHive(__int64 a1, __int64 a2){
int v4;
wchar_t *PoolWithTag;
wchar_t *v6;
int v7;
int v8;
UINT8 *v9;
wchar_t *v10;
int v11;
int Hive;
WCHAR v13;
int v14;
int v15;
int v16;
_QWORD *v17;
_QWORD *v18;
int v20;
WCHAR *SystemRelativeRegistryHiveFilePath;
ULONG_PTR BugCheckParameter4;
UINT64 Flags;
INT64 a11;
ULONG_PTR v25;
struct _UNICODE_STRING Destination;
UNICODE_STRING LinkName;
__int128 BugCheckParameter3[27];
char v29;
memset((INT64)BugCheckParameter3, 0i64);
v4 = 4096;
v25 = 0i64;
LOBYTE(a11) = 0;
PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(PagedPool, 0x1000ui64, 0x20204D43ui64);
v6 = PoolWithTag;
if( !PoolWithTag )
goto LABEL_33;
v7 = *(_DWORD *)(a1 + 24);
*(_QWORD *)&Destination.Length = 0x10000000i64;
Destination.Buffer = PoolWithTag;
if( (v7 & 0x36) != 0 )
{
RtlAppendUnicodeToString(&Destination, *(PWCHAR *)(a1 + 16));
v20 = *(_DWORD *)(a1 + 24);
if( (v20 & 2) == 0 )
{
if( (v20 & 4) != 0 )
v4 = 0x2000;
else
v4 = (v20 & 0x20) != 0 ? 0x200000 : 1;
}
}
else if( (v7 & 0x80) != 0 )
{
SystemRelativeRegistryHiveFilePath = CmpGetSystemRelativeRegistryHiveFilePath(*(WCHAR **)(a1 + 16));
RtlAppendUnicodeToString(&Destination, (PWCHAR)L"\\DriverStores\\");
RtlAppendUnicodeToString(&Destination, *(PWCHAR *)(a1 + 48));
RtlAppendUnicodeToString(&Destination, SystemRelativeRegistryHiveFilePath);
v4 = 0x400000;
if( CmStateSeparationEnabled && !CmStateSeparationDevMode )
v4 = 4194305;
}
else
{
RtlAppendUnicodeToString(&Destination, (PWCHAR)L"\\SystemRoot\\System32\\Config\\");
RtlAppendUnicodeToString(&Destination, *(PWCHAR *)(a1 + 16));
v4 = 0x4000;
}
v8 = *(_DWORD *)(a1 + 24) & 0x100;
v9 = (UINT8 *)ExAllocatePoolWithTag(PagedPool, Destination.Length + 2i64, 0x20204D43ui64);
v10 = (wchar_t *)v9;
if( !v9 )
LABEL_33:
KeBugCheckEx(0x74u, 3ui64, 4ui64, 0i64, 0xFFFFFFFFC000009Aui64);
memmove(v9, (UINT8 *)Destination.Buffer, Destination.Length);
ExFreePoolWithTag(v6, 0);
v10[(unsigned __int64)Destination.Length >> 1] = 0;
v11 = *(_DWORD *)(a1 + 24);
Destination.MaximumLength = Destination.Length + 2;
Destination.Buffer = v10;
LODWORD(Flags) = 5832712;
Hive = CmpCreateHive(
(INT64)&v25,
1ui64,
(32 * (v11 & 8)) | 0x12u,
2ui64,
*(_QWORD *)(a1 + 32),
0i64,
(INT64)&Destination,
Flags,
0i64,
0i64,
(INT64)&a11,
(INT64)BugCheckParameter3);
if( Hive < 0 )
KeBugCheckEx(0x74u, 3ui64, 5ui64, (ULONG_PTR)BugCheckParameter3, Hive);
CmpSetupLoggingState(v25, (unsigned int *)(a1 + 64));
RtlInitUnicodeString((PUNICODE_STRING)(v25 + 1816), v10, v13);
v14 = v4 | 0x1000000;
if( !v8 )
v14 = v4;
*(_DWORD *)(v25 + 160) |= v14 | 0x400;
if( (_BYTE)a11 == 1 )
*(_DWORD *)(v25 + 160) |= 0x800u;
if( BYTE4(NlsMbCodePageTag) )
*(_DWORD *)(v25 + 160) |= 0x8000u;
if( CmStateSeparationEnabled && !CmStateSeparationDevMode && (*(_DWORD *)(a1 + 24) & 0x20) == 0 )
*(_DWORD *)(v25 + 160) |= 0x8000u;
v15 = *(_DWORD *)(*(_QWORD *)(v25 + 64) + 4088i64);
CmpBootType = v15;
if( !CmSelfHeal )
{
BYTE3(NlsMbCodePageTag) = 0;
if( (v15 & 4) != 0 )
KeBugCheckEx(0x74u, 3ui64, 6ui64, v25, 0i64);
}
*(_QWORD *)&LinkName.Length = 0x800000i64;
LinkName.Buffer = (wchar_t *)&v29;
RtlAppendUnicodeToString(&LinkName, (PWCHAR)L"\\REGISTRY\\");
RtlAppendUnicodeToString(&LinkName, *(PWCHAR *)(a1 + 56));
RtlAppendUnicodeToString(&LinkName, (PWCHAR)L"\\");
RtlAppendUnicodeToString(&LinkName, *(PWCHAR *)(a1 + 48));
LODWORD(BugCheckParameter4) = 512;
v16 = CmpLinkHiveToMaster(
&LinkName,
0i64,
(_CMHIVE *)v25,
0i64,
BugCheckParameter4,
0,
0i64,
(VOID *)a2,
0i64,
0i64,
1u);
if( v16 < 0 )
KeBugCheckEx(0x74u, 3ui64, 7ui64, v25, v16);
v17 = (_QWORD *)qword_140C48258;
v18 = (_QWORD *)(v25 + 1616);
if( *(__int64 **)qword_140C48258 != &CmpPreloadedHivesList )
__fastfail(3u);
*v18 = &CmpPreloadedHivesList;
v18[1] = v17;
*v17 = v18;
qword_140C48258 = (__int64)v18;
return 0i64;
}Referenced by:
CmpInitializePreloadedHives