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