CmpInitializePreloadedHive
INT64 __fastcall CmpInitializePreloadedHive(INT64 a1, INT64 a2){
int v4;
VOID **PoolWithTag;
VOID **v6;
int v7;
int v8;
VOID **v9;
wchar_t *v10;
int v11;
int Hive;
int v13;
int v14;
int v15;
_QWORD *v16;
_QWORD *v17;
int v19;
_WCHAR *SystemRelativeRegistryHiveFilePath;
PVOID BugCheckParameter4;
UINT64 Flags;
INT64 a11;
PVOID v24;
_UNICODE_STRING Destination;
_UNICODE_STRING LinkName;
char BugCheckParameter3[432];
char v28;
memset(BugCheckParameter3, 0i64, sizeof(BugCheckParameter3));
v4 = 4096;
v24 = 0i64;
LOBYTE(a11) = 0;
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x1000ui64, 538987843i64);
v6 = PoolWithTag;
if( !PoolWithTag )
goto LABEL_33;
v7 = *(_DWORD *)(a1 + 24);
*(_QWORD *)&Destination.Length = 0x10000000i64;
Destination.Buffer = (wchar_t *)PoolWithTag;
if( (v7 & 0x36) != 0 )
{
RtlAppendUnicodeToString(&Destination, *(WCHAR **)(a1 + 16));
v19 = *(_DWORD *)(a1 + 24);
if( (v19 & 2) == 0 )
{
if( (v19 & 4) != 0 )
v4 = 0x2000;
else
v4 = (v19 & 0x20) != 0 ? 0x200000 : 1;
}
}
else if( (v7 & 0x80) != 0 )
{
SystemRelativeRegistryHiveFilePath = CmpGetSystemRelativeRegistryHiveFilePath(*(_WCHAR **)(a1 + 16));
RtlAppendUnicodeToString(&Destination, (WCHAR *)L"\\DriverStores\\");
RtlAppendUnicodeToString(&Destination, *(WCHAR **)(a1 + 48));
RtlAppendUnicodeToString(&Destination, SystemRelativeRegistryHiveFilePath);
v4 = 0x400000;
if( *(&stru_140CF2E80 + 1656) && !*(&stru_140CF2E80 + 1868) )
v4 = 4194305;
}
else
{
RtlAppendUnicodeToString(&Destination, (WCHAR *)L"\\SystemRoot\\System32\\Config\\");
RtlAppendUnicodeToString(&Destination, *(WCHAR **)(a1 + 16));
v4 = 0x4000;
}
v8 = *(_DWORD *)(a1 + 24) & 0x100;
v9 = ExAllocatePoolWithTag(1ui64, Destination.Length + 2i64, 538987843i64);
v10 = (wchar_t *)v9;
if( !v9 )
LABEL_33:
KeBugCheckEx(0x74u, (PVOID)3, (PVOID)4, 0i64, (PVOID)0xFFFFFFFFC000009Ai64);
memmove(v9, 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)&v24,
1ui64,
(32 * (v11 & 8)) | 0x12u,
2ui64,
*(_QWORD *)(a1 + 32),
0i64,
(INT64)&Destination,
Flags,
0i64,
0i64,
(INT64)&a11,
(INT64)BugCheckParameter3);
if( Hive < 0 )
KeBugCheckEx(0x74u, (PVOID)3, (PVOID)5, BugCheckParameter3, (PVOID)Hive);
CmpSetupLoggingState((INT64)v24, (UINT64 *)(a1 + 64));
RtlInitUnicodeString((PUNICODE_STRING)((char *)v24 + 1816), v10);
v13 = v4 | 0x1000000;
if( !v8 )
v13 = v4;
*((_DWORD *)v24 + 40) |= v13 | 0x400;
if( (_BYTE)a11 == 1 )
*((_DWORD *)v24 + 40) |= 0x800u;
if( BYTE4(NlsMbCodePageTag) )
*((_DWORD *)v24 + 40) |= 0x8000u;
if( *(&stru_140CF2E80 + 1656) && !*(&stru_140CF2E80 + 1868) && (*(_DWORD *)(a1 + 24) & 0x20) == 0 )
*((_DWORD *)v24 + 40) |= 0x8000u;
v14 = *(_DWORD *)(*((_QWORD *)v24 + 8) + 4088i64);
*(&CmpDummyThreadEvent + 686) = v14;
if( !CmSelfHeal )
{
BYTE3(NlsMbCodePageTag) = 0;
if( (v14 & 4) != 0 )
KeBugCheckEx(0x74u, (PVOID)3, (PVOID)6, v24, 0i64);
}
*(_QWORD *)&LinkName.Length = 0x800000i64;
LinkName.Buffer = (wchar_t *)&v28;
RtlAppendUnicodeToString(&LinkName, (WCHAR *)L"\\REGISTRY\\");
RtlAppendUnicodeToString(&LinkName, *(WCHAR **)(a1 + 56));
RtlAppendUnicodeToString(&LinkName, (WCHAR *)L"\\");
RtlAppendUnicodeToString(&LinkName, *(WCHAR **)(a1 + 48));
LODWORD(BugCheckParameter4) = 512;
v15 = CmpLinkHiveToMaster(
&LinkName,
0i64,
(_CMHIVE *)v24,
0i64,
(UINT64)BugCheckParameter4,
0,
0i64,
(VOID *)a2,
0i64,
0i64,
1u);
if( v15 < 0 )
KeBugCheckEx(0x74u, (PVOID)3, (PVOID)7, v24, (PVOID)v15);
v16 = (_QWORD *)*(&CmpDummyThreadEvent + 259);
v17 = (char *)v24 + 1616;
if( (_UNKNOWN *)**(&CmpDummyThreadEvent + 259) != (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 2064) )
__fastfail(3u);
*v17 = (char *)&CmpDummyThreadEvent + 2064;
v17[1] = v16;
*v16 = v17;
*(&CmpDummyThreadEvent + 259) = v17;
return 0i64;
}Referenced by:
CmpInitializePreloadedHives