CmpGetSystemControlValues

INT64 __fastcall CmpGetSystemControlValues(INT64 BaseBlock, INT64 a2, CHAR a3){
  wchar_t **v3; 
  int v6; 
  WCHAR v7; 
  unsigned int v8; 
  unsigned int ControlSet; 
  INT64 SubKeyByName; 
  WCHAR v11; 
  _CM_KEY_NODE *v12; 
  unsigned int v13; 
  _HHIVE *v14; 
  unsigned int v15; 
  unsigned int v16; 
  WCHAR v17; 
  _CM_KEY_NODE *v18; 
  unsigned int ValueByName; 
  unsigned int *v20; 
  unsigned int v21; 
  unsigned int *v22; 
  INT64 v23; 
  _HHIVE *v24; 
  unsigned int v25; 
  wchar_t *v26; 
  WCHAR v27; 
  _CM_KEY_NODE *v28; 
  BYTE v29[4]; 
  int v30[2]; 
  UINT64 LCIDPickedUp; 
  struct _UNICODE_STRING DestinationString; 
  int v33[2]; 
  ULONG_PTR *v34; 
  INT64 result[53]; 
  v3 = CmControlVector;
  v33[1] = 0;
  v29[1] = 0;
  LODWORD(LCIDPickedUp) = 0;
  v30[1] = 0;
  v33[0] = -1;
  v30[0] = -1;
  DestinationString = 0i64;
  memset((INT64)result, 0i64);
  memset((INT64)&CmControlHive, 0i64);
  CmpInitSecurityCache((__int64)&CmControlHive);
  HvHiveInitialize(&CmControlHive);
  v34 = &CmControlHive;
  qword_140D5B798 = (__int64)&v34;
  HvHiveStartMemoryBacked((INT64)&CmControlHive, 4ui64, 1i64, 0i64);
  if( v6 < 0 )
    KeBugCheckEx(0x74u, 1ui64, 1ui64, (ULONG_PTR)&CmControlHive, v6);
  qword_140D5B798 = 0i64;
  v8 = *(_DWORD *)(BaseBlock + 36);
  if( a3 == 1 )
  {
    SubKeyByName = ((__int64(__fastcall *)(ULONG_PTR *, _QWORD, int *))qword_140D5B768)(&CmControlHive, v8, v30);
    v28 = (_CM_KEY_NODE *)SubKeyByName;
    if( !SubKeyByName )
      return SubKeyByName;
    RtlInitUnicodeString(&DestinationString, L"ControlSetOverride", v27);
    SubKeyByName = CmpFindSubKeyByName((_HHIVE *)&CmControlHive, v28, &DestinationString);
    v13 = SubKeyByName;
    if( (_DWORD)SubKeyByName == -1 )
      return SubKeyByName;
  }
  else
  {
    RtlInitUnicodeString(&DestinationString, L"current", v7);
    ControlSet = CmpFindControlSet((UINT64)&CmControlHive, v8, &DestinationString, &v29[1]);
    if( ControlSet == -1 )
      KeBugCheckEx(0x74u, 1ui64, 2ui64, (ULONG_PTR)&CmControlHive, (ULONG_PTR)&DestinationString);
    SubKeyByName = ((__int64(__fastcall *)(ULONG_PTR *, _QWORD, int *))qword_140D5B768)(
                     &CmControlHive,
                     ControlSet,
                     v30);
    v12 = (_CM_KEY_NODE *)SubKeyByName;
    if( !SubKeyByName )
      return SubKeyByName;
    RtlInitUnicodeString(&DestinationString, L"control", v11);
    v13 = CmpFindSubKeyByName((_HHIVE *)&CmControlHive, v12, &DestinationString);
    if( v13 == -1 )
      KeBugCheckEx(0x74u, 1ui64, 3ui64, (ULONG_PTR)v12, (ULONG_PTR)&DestinationString);
  }
  ((void(__fastcall *)(ULONG_PTR *, int *))qword_140D5B770)(&CmControlHive, v30);
  if( CmControlVector[0] )
  {
    do
    {
      if( a3 != 1 || *((_BYTE *)v3 + 40) )
      {
        v15 = -1;
        v16 = CmpWalkPath((INT64)&CmControlHive, v13, *v3);
        if( v16 != -1 )
        {
          SubKeyByName = ((__int64(__fastcall *)(ULONG_PTR *, _QWORD, int *))qword_140D5B768)(&CmControlHive, v16, v30);
          v18 = (_CM_KEY_NODE *)SubKeyByName;
          if( !SubKeyByName )
            return SubKeyByName;
          RtlInitUnicodeString(&DestinationString, v3[1], v17);
          ValueByName = CmpFindValueByName((_HHIVE *)&CmControlHive, v18, &DestinationString);
          ((void(__fastcall *)(ULONG_PTR *, int *))qword_140D5B770)(&CmControlHive, v30);
          if( ValueByName != -1 )
          {
            v22 = (unsigned int *)v3[3];
            v15 = 4;
            if( v22 )
              v15 = *v22;
            SubKeyByName = ((__int64(__fastcall *)(ULONG_PTR *, _QWORD, int *))qword_140D5B768)(
                             &CmControlHive,
                             ValueByName,
                             v33);
            v23 = SubKeyByName;
            if( !SubKeyByName )
              return SubKeyByName;
            v24 = (_HHIVE *)*(unsigned int *)(SubKeyByName + 4);
            v25 = (_DWORD)v24 + 0x80000000;
            if( (unsigned int)v24 < 0x80000000 )
              v25 = *(_DWORD *)(SubKeyByName + 4);
            if( v15 >= v25 )
              v15 = v25;
            if( v15 && !CmpGetBootValueData(v24, (_CM_KEY_VALUE *)SubKeyByName, v3[2], v15) )
              return((__int64(__fastcall *)(ULONG_PTR *, int *))qword_140D5B770)(&CmControlHive, v33);
            v26 = v3[4];
            if( v26 )
              *(_DWORD *)v26 = *(_DWORD *)(v23 + 12);
            ((void(__fastcall *)(ULONG_PTR *, int *))qword_140D5B770)(&CmControlHive, v33);
          }
        }
        v20 = (unsigned int *)v3[3];
        if( v20 )
          *v20 = v15;
      }
      v3 += 6;
    }
    while( *v3 );
  }
  if( *(_DWORD *)CmDefaultLanguageIdType == 1 )
  {
    PsDefaultSystemLocaleId = CmpConvertLangId(&CmDefaultLanguageId, (unsigned int)CmDefaultLanguageIdLength);
  }
  else if( !a3 )
  {
    PsDefaultSystemLocaleId = 1033;
  }
  if( CmInstallUILanguageIdType == 1 )
    PsInstallUILanguageId = CmpConvertLangId(&CmInstallUILanguageId, (unsigned int)CmInstallUILanguageIdLength);
  if( !a3 )
  {
    v21 = CmSelectQualifiedInstallLanguage(v14, v13, &LCIDPickedUp, (unsigned __int16)PsInstallUILanguageId);
    if( v21 )
    {
      if( !psMUITest )
        KeBugCheckEx(0x12Au, 1ui64, v21, 0i64, 0i64);
      PsInstallUILanguageId = PsDefaultSystemLocaleId;
    }
    else if( (unsigned __int16)PsInstallUILanguageId != (_DWORD)LCIDPickedUp )
    {
      PsInstallUILanguageId = LCIDPickedUp;
      CmInstallUILanguageFallbackToOOBm = 1;
    }
  }
  SubKeyByName = (unsigned int)PsDefaultSystemLocaleId;
  PsDefaultThreadLocaleId = PsDefaultSystemLocaleId;
  if( !PsMachineUILanguageId || a3 == 1 )
  {
    SubKeyByName = (unsigned __int16)PsInstallUILanguageId;
    PsMachineUILanguageId = PsInstallUILanguageId;
  }
  return SubKeyByName;
}

Referenced by:

CmInitSystem0