CmpInitializeSystemHivesLoad
INT64 __stdcall CmpInitializeSystemHivesLoad(){
unsigned int v0;
VOID ***v1;
__int64 v2;
VOID **PoolWithTag;
WCHAR v4;
_UNICODE_STRING *v5;
INT64 v6;
_DWORD *v7;
unsigned int i;
VOID *v9;
NTSTATUS v10;
INT64 result;
_DWORD *v12;
__int64 v13;
VOID *Handle;
_UNICODE_STRING ValueName;
char v16;
Handle = 0i64;
BYTE1(NlsMbCodePageTag) = 0;
KeInitializeEvent((INT64)&CmpDummyThreadEvent + 2656, 1, 0);
KeInitializeEvent((INT64)&CmpDummyThreadEvent + 2688, 1, 0);
v0 = 0;
v1 = (VOID ***)((char *)&stru_140C00F40 + 128);
do
{
v2 = 25i64 * v0;
KeInitializeEvent((INT64)&CmpMachineHiveList[v2 + 8], 0, 0);
KeInitializeEvent((INT64)&CmpMachineHiveList[v2 + 11], 1, 0);
*(_QWORD *)&ValueName.Length = 0x800000i64;
ValueName.Buffer = (wchar_t *)&v16;
CmpBuildMachineHiveMountPoint(v0, &ValueName);
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x80ui64, 842419523i64);
if( !PoolWithTag )
KeBugCheckEx(0x74u, (PVOID)2, (PVOID)5, (PVOID)v0, 0i64);
*(_OWORD *)(v1 - 1) = 0i64;
*v1 = PoolWithTag;
*((_WORD *)v1 - 3) = 128;
v5 = (_UNICODE_STRING *)&CmpMachineHiveList[v2 + 23];
if( !CmpQueryHiveRedirectionFileList(&ValueName, v5, v4) || *((_WORD *)v1 - 4) == 2 )
{
*(_OWORD *)(v1 - 1) = 0i64;
*v1 = PoolWithTag;
*((_WORD *)v1 - 3) = 128;
RtlAppendUnicodeToString(v5, (WCHAR *)L"\\SystemRoot\\System32\\Config\\");
RtlAppendUnicodeToString(v5, (WCHAR *)*(v1 - 24));
}
v1 += 25;
++v0;
}
while( v0 < 7 );
v7 = &unk_140C00F20;
if( BYTE4(NlsMbCodePageTag) )
{
v12 = &unk_140C00F20;
v13 = 7i64;
do
{
if( *((_QWORD *)v12 - 4) )
*v12 |= 0x8000u;
v12 += 50;
--v13;
}
while( v13 );
}
CmpSpecialBootCondition = 1;
for( i = 0; i < 7; ++i )
{
if( (*v7 & 1) != 0 || NeedRmLogStart || CmpForceSynchronousMachineHiveLoad || ((i - 2) & 0xFFFFFFFA) == 0 )
{
v9 = (VOID *)i;
KeSetEvent((PRKEVENT)((char *)&stru_140C00F40 + 200 * i), 0, 0);
}
else
{
v9 = (VOID *)i;
}
v10 = CmpCreateRegistryThread(&Handle, v6, (_KSTART_ROUTINE *)CmpLoadHiveThread, v9);
if( v10 < 0 )
KeBugCheckEx(0x74u, (PVOID)2, (PVOID)3, (PVOID)i, (PVOID)v10);
LODWORD(result) = ZwClose((_HANDLE)Handle);
v7 += 50;
}
return result;
}Referenced by:
CmCompleteRegistryInitialization