RtlpMuiRegPopulateBaseLanguages
NTSTATUS __fastcall RtlpMuiRegPopulateBaseLanguages(_MUIREGISTRYINFO *RegInfo, __int64 a2, _WORD *a3, __int64 a4){
unsigned __int64 v4;
__int64 v8;
__int16 v9;
NTSTATUS v10;
unsigned int v11;
NTSTATUS result;
unsigned __int16 v13;
unsigned __int16 v14;
__int64 v15;
VOID *v16;
__int64 v17;
unsigned int i;
unsigned __int64 v19;
__int16 v20;
__int64 v21;
unsigned int *v22;
UINT64 Length;
UINT64 Lengtha;
UINT16 InstallUILanguageId[2];
v4 = (unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64;
*(_QWORD *)(v4 + 48) = a2;
*(_QWORD *)(v4 + 56) = a4;
*(_DWORD *)(v4 + 44) = 0;
*(_OWORD *)(v4 + 24) = 0i64;
memset((VOID *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 64), 0i64, 0xAAu);
memset((VOID *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 768), 0i64, 0xAAu);
memset((VOID *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 944), 0i64, 0xAAu);
*(_WORD *)v4 = 0;
*(_QWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x10) = 0i64;
LODWORD(v8) = 0;
*(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 8) = 0;
*(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0xC) = 0;
if( !RegInfo || !a3 || !a2 )
return -1073741811;
v9 = *((_WORD *)RegInfo + 2);
v10 = 0;
*(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x28) = 0;
v11 = 0;
if( v9 )
{
v13 = *((_WORD *)RegInfo + 3);
v14 = *((_WORD *)RegInfo + 4);
}
else
{
result = NtQueryInstallUILanguage((UINT16 *)((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64));
v10 = result;
if( result < 0 )
return result;
if( RtlpLoadInstallLanguageFallback(RegInfo, (UINT16 *)(v4 + 8), (UINT16 *)(v4 + 12)) >= 0 )
{
v13 = *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 8);
v14 = *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0xC);
}
else
{
v13 = 0;
v14 = 0;
}
v9 = *(_WORD *)v4;
if( PsUILanguageComitted )
{
*((_WORD *)RegInfo + 4) = v14;
*((_WORD *)RegInfo + 3) = v13;
*((_WORD *)RegInfo + 2) = v9;
}
}
v15 = -1i64;
if( a3[2] == v9 )
{
if( v13 )
{
*(_QWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x20) = ((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64)
+ 768;
*(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 4) = 512;
*(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x1A) = 170;
if( RtlLCIDToCultureName(v13, v4 + 24) )
{
LODWORD(Length) = 512;
if( ZwQueryValueKey(
*(VOID **)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x30),
(_UNICODE_STRING *)(v4 + 24),
KeyValueFullInformation,
(VOID *)(v4 + 256),
Length,
(UINT64 *)(v4 + 4)) >= 0
&& (int)RtlpMuiRegValidateAndGetInstallFallbackBase(
(__int64)RegInfo,
(_DWORD *)(v4 + 256),
v14,
(wchar_t *)(v4 + 944)) >= 0
&& (int)RtlpMuiRegAddBaseLanguage(RegInfo, a3, 0, v4 + 256, v4 + 944) >= 0 )
{
v11 = 1;
v8 = -1i64;
do
++v8;
while( *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x300 + 2 * v8) );
}
}
}
}
RtlInitUnicodeString((PUNICODE_STRING)(v4 + 24), L"DefaultFallback");
v16 = *(VOID **)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x30);
*(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0xC) = 1;
*(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 4) = 170;
if( LdrpQueryValueKey(v16, (_UNICODE_STRING *)(v4 + 24), (UINT64 *)(v4 + 12), (VOID *)(v4 + 64), (UINT64 *)(v4 + 4)) >= 0
&& *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0xC) == 1
&& (!(_DWORD)v8
|| RtlCompareUnicodeStrings(
(WCHAR *)(v4 + 64),
(unsigned __int64)*(unsigned int *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 4) >> 1,
(WCHAR *)(v4 + 768),
(unsigned int)v8,
1u))
&& (RtlInitUnicodeString((PUNICODE_STRING)(v4 + 24), (PCWSTR)(v4 + 64)),
LODWORD(Lengtha) = 512,
*(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 4) = 512,
ZwQueryValueKey(
v16,
(_UNICODE_STRING *)(v4 + 24),
KeyValueFullInformation,
(VOID *)(v4 + 256),
Lengtha,
(UINT64 *)(v4 + 4)) >= 0)
&& *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x104) == 7
&& (int)RtlpMuiRegAddBaseLanguage(RegInfo, a3, v11, v4 + 256, 0i64) >= 0 )
{
++v11;
do
++v15;
while( *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x40 + 2 * v15) );
LODWORD(v17) = v15;
*(_QWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x10) = v15;
}
else
{
v17 = *(_QWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x10);
}
if( v10 != -2147483622 )
{
for( i = *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x28); ; ++i )
{
if( v11 >= 4 )
goto LABEL_47;
LODWORD(Lengtha) = 512;
if( ZwEnumerateValueKey(
*(VOID **)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x30),
i,
KeyValueFullInformation,
(VOID *)(v4 + 256),
Lengtha,
(UINT64 *)(v4 + 44)) < 0 )
goto LABEL_47;
if( *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x104) == 7
&& *(_DWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x110) <= 0x200u )
{
if( !(_DWORD)v17 && !(_DWORD)v8 )
goto LABEL_44;
v19 = (unsigned __int64)*(unsigned int *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64)
+ 0x110) >> 1;
v20 = *(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 2 * v19 + 0x114);
*(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 2 * v19 + 0x114) = 0;
if( !(_DWORD)v8
|| RtlCompareUnicodeStrings(
(WCHAR *)(v4 + 276),
(unsigned __int64)*(unsigned int *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64)
+ 0x110) >> 1,
(WCHAR *)(v4 + 768),
(unsigned int)v8,
1u) )
{
v21 = *(_QWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x10);
if( !(_DWORD)v21
|| RtlCompareUnicodeStrings(
(WCHAR *)(v4 + 276),
(unsigned __int64)*(unsigned int *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64)
+ 0x110) >> 1,
(WCHAR *)(v4 + 64),
(unsigned int)v21,
1u) )
{
break;
}
}
}
LABEL_46:
v17 = *(_QWORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x10);
}
*(_WORD *)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 2 * v19 + 0x114) = v20;
LABEL_44:
if( (int)RtlpMuiRegAddBaseLanguage(RegInfo, a3, v11, v4 + 256, 0i64) >= 0 )
++v11;
goto LABEL_46;
}
LABEL_47:
v22 = *(unsigned int **)(((unsigned __int64)InstallUILanguageId & 0xFFFFFFFFFFFFFFE0ui64) + 0x38);
if( v22 )
*v22 = v11;
return 0;
}Referenced by:
RtlpMuiRegInitPartialLanguage