RtlpMuiRegValidateInstalled
NTSTATUS __stdcall RtlpMuiRegValidateInstalled(_MUIREGISTRYINFO *RegInfo){
INT16 v2;
int v3;
int v4;
wchar_t *v5;
UINT16 v6;
unsigned int v7;
NTSTATUS result;
NTSTATUS InstalledLanguageIndexByLangId;
INT64 v10;
__int64 v11;
__int64 v12;
__int64 v13;
int v14;
__int64 v15;
__int64 v16;
int v17;
__int64 v18;
__int64 v19;
__int64 v20;
__int16 v21;
unsigned int v22;
int v23;
__int64 v24;
__int64 v25;
wchar_t *v26;
bool v27;
__int16 v28;
unsigned int v29;
__int64 v30;
__int16 v31;
UINT16 InstallUILanguageId[4];
wchar_t *v33;
_UNICODE_STRING String;
_UNICODE_STRING uString;
_MUILANGINFO LangInfo;
char v37[176];
InstallUILanguageId[0] = 0;
v2 = -1;
*(_DWORD *)(&String.MaximumLength + 1) = 0;
InstallUILanguageId[2] = -1;
v33 = 0i64;
v3 = -1;
v4 = 0;
v5 = 0i64;
*(_OWORD *)LangInfo.FallbackSpecs = 0i64;
uString = 0i64;
memset(v37, 0i64, 0xAAu);
v6 = *((_WORD *)RegInfo + 2);
v7 = PsUILanguageComitted == 0 ? 0xC0000034 : 0;
if( !v6 )
{
result = NtQueryInstallUILanguage(InstallUILanguageId);
if( result < 0 )
return result;
v6 = InstallUILanguageId[0];
}
InstalledLanguageIndexByLangId = RtlpMuiRegGetInstalledLanguageIndexByLangId(
RegInfo,
v6,
0,
(INT16 *)&InstallUILanguageId[2]);
if( InstalledLanguageIndexByLangId == -1073741772 || InstalledLanguageIndexByLangId == -1073741637 )
{
InstallUILanguageId[0] = -1;
v26 = (wchar_t *)MuiRegAllocArray(v10, 0x55ui64);
v33 = v26;
v5 = v26;
if( !v26 )
return -1073741801;
String.Buffer = v26;
*(_DWORD *)&String.Length = 11141120;
if( !RtlLCIDToCultureName(v6, (INT64)&String) )
goto LABEL_12;
v27 = RtlpMuiRegGetOrAddString(RegInfo, String.Buffer, 1u, (INT16 *)InstallUILanguageId) < 0;
v28 = -1;
if( !v27 )
v28 = InstallUILanguageId[0];
LangInfo.LangNameIndex = v28;
*(_DWORD *)&LangInfo.Flags = 49;
LangInfo.LangId = v6;
memset(&LangInfo.FallbackTypes, 0, 20);
if( RtlpMuiRegGetOrAddLangInfo((_MUILANGUAGES **)RegInfo + 3, &LangInfo, 0i64) < 0 )
goto LABEL_12;
v11 = *((_QWORD *)RegInfo + 3);
v3 = *(unsigned __int16 *)(v11 + 6) - 1;
goto LABEL_8;
}
if( InstalledLanguageIndexByLangId >= 0 )
{
v3 = (__int16)InstallUILanguageId[2];
v11 = *((_QWORD *)RegInfo + 3);
LABEL_8:
if( v3 != -1 )
{
v12 = *(_QWORD *)(v11 + 16);
uString.Buffer = (wchar_t *)v37;
uString.MaximumLength = 170;
if( RtlpGetNameFromLangInfoNode(RegInfo, (_MUILANGINFO *)(28i64 * v3 + v12), &uString) >= 0 )
{
if( RtlpIsALicensedRegularLanguage(RegInfo, uString.Buffer) < 0 )
{
*(_WORD *)(*(_QWORD *)(*((_QWORD *)RegInfo + 3) + 16i64) + 28i64 * v3) &= ~0x20u;
*(_WORD *)(*(_QWORD *)(*((_QWORD *)RegInfo + 3) + 16i64) + 28i64 * v3) |= 0x8000u;
}
else
{
v4 = 1;
}
}
}
}
LABEL_12:
if( !v7 )
v2 = v3;
RtlpRemovePendingDeleteLanguages(RegInfo, v2);
v13 = *((_QWORD *)RegInfo + 3);
v14 = 0;
if( *(_WORD *)(v13 + 6) )
{
v15 = *((_QWORD *)RegInfo + 3);
v16 = 0i64;
do
{
v13 = v15;
if( (*(_BYTE *)(v16 + *(_QWORD *)(v15 + 16)) & 0x22) == 34 )
{
RtlpMuiRegValidatePartialLanguage((__int64)RegInfo, v14);
v29 = v4 + 1;
v13 = *((_QWORD *)RegInfo + 3);
v30 = *(_QWORD *)(v13 + 16);
v31 = *(_WORD *)(v30 + v16);
if( (v31 & 0x1000) != 0 )
v29 = v4;
v4 = v29;
if( !v7 && v14 != v3 && v29 > RegInfo[30] )
{
*(_WORD *)(v30 + v16) = v31 & 0xFFDF;
*(_WORD *)(*(_QWORD *)(*((_QWORD *)RegInfo + 3) + 16i64) + v16) |= 0x8000u;
v13 = *((_QWORD *)RegInfo + 3);
}
}
++v14;
v16 += 28i64;
v15 = v13;
}
while( v14 < *(unsigned __int16 *)(v13 + 6) );
v5 = v33;
}
v17 = 0;
if( *(_WORD *)(v13 + 6) )
{
v18 = v13;
v19 = 0i64;
do
{
v20 = *(_QWORD *)(v18 + 16);
v13 = v18;
v21 = *(_WORD *)(v20 + v19);
if( (v21 & 0x21) == 33 )
{
v22 = v4 + 1;
if( (v21 & 0x1000) != 0 )
v22 = v4;
v4 = v22;
if( !v7 && v17 != v3 && v22 > RegInfo[30] )
{
*(_WORD *)(v20 + v19) = v21 & 0xFFDF;
*(_WORD *)(*(_QWORD *)(*((_QWORD *)RegInfo + 3) + 16i64) + v19) |= 0x8000u;
v13 = *((_QWORD *)RegInfo + 3);
}
}
++v17;
v19 += 28i64;
v18 = v13;
}
while( v17 < *(unsigned __int16 *)(v13 + 6) );
v5 = v33;
}
v23 = 0;
if( *(_WORD *)(v13 + 6) )
{
v24 = 0i64;
do
{
v25 = v13;
if( (*(_BYTE *)(v24 + *(_QWORD *)(v13 + 16)) & 4) != 0 )
{
RtlpMuiRegValidateLIPLanguage((__int64)RegInfo, v23);
v25 = *((_QWORD *)RegInfo + 3);
}
++v23;
v24 += 28i64;
v13 = v25;
}
while( v23 < *(unsigned __int16 *)(v25 + 6) );
}
if( v5 )
ExFreePoolWithTag(v5, 0);
return 0;
}Referenced by:
RtlpMuiRegLoadInstalled