RtlpMuiRegValidateInstalled
NTSTATUS __fastcall RtlpMuiRegValidateInstalled(__int64 a1){
__int16 v2;
int v3;
int v4;
wchar_t *v5;
unsigned __int16 v6;
unsigned int v7;
NTSTATUS InstallUILanguage;
int InstalledLanguageIndexByLangId;
__int64 v10;
WCHAR v11;
__int64 v12;
__int64 v13;
__int64 v14;
int v15;
__int64 v16;
__int64 v17;
int v18;
__int64 v19;
__int64 v20;
__int64 v21;
__int16 v22;
unsigned int v23;
int v24;
__int64 v25;
__int64 v26;
wchar_t *v27;
bool v28;
LANGID v29;
unsigned int v30;
__int64 v31;
__int16 v32;
LANGID LanguageId[4];
wchar_t *v34;
_UNICODE_STRING String;
UNICODE_STRING v36;
int v37;
unsigned __int16 v38;
int v39;
__int16 v40;
__int128 v41;
INT64 result[22];
LanguageId[0] = 0;
v2 = -1;
*(_DWORD *)(&String.MaximumLength + 1) = 0;
LanguageId[2] = -1;
v34 = 0i64;
v3 = -1;
v4 = 0;
v5 = 0i64;
v41 = 0i64;
v36 = 0i64;
memset((INT64)result, 0i64);
v6 = *(_WORD *)(a1 + 4);
v7 = PsUILanguageComitted == 0 ? 0xC0000034 : 0;
if( !v6 )
{
InstallUILanguage = NtQueryInstallUILanguage(LanguageId);
if( InstallUILanguage < 0 )
return InstallUILanguage;
v6 = LanguageId[0];
}
InstalledLanguageIndexByLangId = RtlpMuiRegGetInstalledLanguageIndexByLangId(a1, v6, 0, &LanguageId[2]);
if( InstalledLanguageIndexByLangId == -1073741772 || InstalledLanguageIndexByLangId == -1073741637 )
{
LanguageId[0] = -1;
v27 = (wchar_t *)MuiRegAllocArray(v10, 0x55u);
v34 = v27;
v5 = v27;
if( !v27 )
return -1073741801;
String.Buffer = v27;
*(_DWORD *)&String.Length = 11141120;
if( !RtlLCIDToCultureName(v6, &String) )
goto LABEL_12;
v28 = (int)RtlpMuiRegGetOrAddString(a1, String.Buffer, 1, (__int16 *)LanguageId) < 0;
v29 = -1;
if( !v28 )
v29 = LanguageId[0];
v39 = v29;
v37 = 49;
v38 = v6;
v41 = 0ui64;
v40 = 0;
if( (int)RtlpMuiRegGetOrAddLangInfo((__int64 *)(a1 + 24), (__int64)&v37, 0i64) < 0 )
goto LABEL_12;
v12 = *(_QWORD *)(a1 + 24);
v3 = *(unsigned __int16 *)(v12 + 6) - 1;
goto LABEL_8;
}
if( InstalledLanguageIndexByLangId >= 0 )
{
v3 = (__int16)LanguageId[2];
v12 = *(_QWORD *)(a1 + 24);
LABEL_8:
if( v3 != -1 )
{
v13 = *(_QWORD *)(v12 + 16);
v36.Buffer = (wchar_t *)result;
v36.MaximumLength = 170;
if( (int)RtlpGetNameFromLangInfoNode(a1, 28i64 * v3 + v13, &v36) >= 0 )
{
if( (int)RtlpIsALicensedRegularLanguage((_QWORD *)a1, v36.Buffer) < 0 )
{
*(_WORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 24) + 16i64) + 28i64 * v3) &= ~0x20u;
*(_WORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 24) + 16i64) + 28i64 * v3) |= 0x8000u;
}
else
{
v4 = 1;
}
}
}
}
LABEL_12:
if( !v7 )
v2 = v3;
RtlpRemovePendingDeleteLanguages(a1, v2, v11);
v14 = *(_QWORD *)(a1 + 24);
v15 = 0;
if( *(_WORD *)(v14 + 6) )
{
v16 = *(_QWORD *)(a1 + 24);
v17 = 0i64;
do
{
v14 = v16;
if( (*(_BYTE *)(v17 + *(_QWORD *)(v16 + 16)) & 0x22) == 34 )
{
RtlpMuiRegValidatePartialLanguage(a1, v15);
v30 = v4 + 1;
v14 = *(_QWORD *)(a1 + 24);
v31 = *(_QWORD *)(v14 + 16);
v32 = *(_WORD *)(v31 + v17);
if( (v32 & 0x1000) != 0 )
v30 = v4;
v4 = v30;
if( !v7 && v15 != v3 && v30 > *(_DWORD *)(a1 + 120) )
{
*(_WORD *)(v31 + v17) = v32 & 0xFFDF;
*(_WORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 24) + 16i64) + v17) |= 0x8000u;
v14 = *(_QWORD *)(a1 + 24);
}
}
++v15;
v17 += 28i64;
v16 = v14;
}
while( v15 < *(unsigned __int16 *)(v14 + 6) );
v5 = v34;
}
v18 = 0;
if( *(_WORD *)(v14 + 6) )
{
v19 = v14;
v20 = 0i64;
do
{
v21 = *(_QWORD *)(v19 + 16);
v14 = v19;
v22 = *(_WORD *)(v21 + v20);
if( (v22 & 0x21) == 33 )
{
v23 = v4 + 1;
if( (v22 & 0x1000) != 0 )
v23 = v4;
v4 = v23;
if( !v7 && v18 != v3 && v23 > *(_DWORD *)(a1 + 120) )
{
*(_WORD *)(v21 + v20) = v22 & 0xFFDF;
*(_WORD *)(*(_QWORD *)(*(_QWORD *)(a1 + 24) + 16i64) + v20) |= 0x8000u;
v14 = *(_QWORD *)(a1 + 24);
}
}
++v18;
v20 += 28i64;
v19 = v14;
}
while( v18 < *(unsigned __int16 *)(v14 + 6) );
v5 = v34;
}
v24 = 0;
if( *(_WORD *)(v14 + 6) )
{
v25 = 0i64;
do
{
v26 = v14;
if( (*(_BYTE *)(v25 + *(_QWORD *)(v14 + 16)) & 4) != 0 )
{
RtlpMuiRegValidateLIPLanguage(a1, v24);
v26 = *(_QWORD *)(a1 + 24);
}
++v24;
v25 += 28i64;
v14 = v26;
}
while( v24 < *(unsigned __int16 *)(v26 + 6) );
}
if( v5 )
ExFreePoolWithTag(v5, 0);
return 0;
}Referenced by:
RtlpMuiRegLoadInstalled