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