RtlpMuiRegAddBaseLanguage
__int64 __fastcall RtlpMuiRegAddBaseLanguage(
_MUIREGISTRYINFO *RegInfo,
_WORD *a2,
unsigned int a3,
__int64 a4,
__int64 a5){
INT16 LangId;
UINT8 v8;
WCHAR *v9;
unsigned __int64 v10;
UINT8 v11;
wchar_t *Buffer;
UINT8 v13;
NTSTATUS v14;
__int16 v15;
__int16 v16;
int v17;
_MUIREGISTRYINFO *v18;
int v19;
NTSTATUS LanguageSpec;
char v21;
__int16 v22;
__int16 v23;
WCHAR *v24;
__int64 v25;
__int64 v26;
_WORD *v27;
UINT8 v29;
UINT8 LanguageSpecTypeRtrn;
char v31;
INT16 ResultIndexRtrn[2];
__int16 v33;
INT16 LanguageSpecRtrn;
WCHAR *LanguageName;
NTSTATUS inited;
unsigned int v37;
_MUIREGISTRYINFO *RegInfoa;
_WORD *v39;
_UNICODE_STRING DestinationString;
_MUILANGINFO LangInfo;
LangId = 0;
LanguageName = (WCHAR *)a5;
v37 = a3;
v39 = a2;
RegInfoa = RegInfo;
v8 = 0;
v29 = 0;
LanguageSpecTypeRtrn = 0;
LanguageSpecRtrn = 0;
DestinationString = 0i64;
memset(&LangInfo, 0, sizeof(LangInfo));
if( RegInfo && a2 && a4 && a3 <= 3 )
{
v9 = (WCHAR *)(a4 + *(unsigned int *)(a4 + 8));
if( !*(_DWORD *)(a4 + 12) || !v9 || (v31 = 1, !*v9) )
v31 = 0;
v10 = (unsigned __int64)*(unsigned int *)(a4 + 16) >> 1;
v33 = *(_WORD *)(a4 + 2 * v10 + 20);
*(_WORD *)(a4 + 2 * v10 + 20) = 0;
RtlInitUnicodeString(&DestinationString, (PCWSTR)(a4 + 20));
ResultIndexRtrn[0] = 0;
if( v31 )
{
Buffer = DestinationString.Buffer;
v9[(unsigned __int64)*(unsigned int *)(a4 + 12) >> 1] = 0;
inited = RtlpMuiRegInitAnyLanguage(RegInfo, (__int64)&LangInfo, Buffer, 1026);
v14 = inited;
if( inited < 0 )
return(unsigned int)v14;
v15 = v33;
v16 = (LOBYTE(LangInfo.Flags) ^ (unsigned __int8)*v39) & 0x18;
LOBYTE(v33) = 0;
LangInfo.Flags ^= v16;
*(_WORD *)(a4 + 2 * v10 + 20) = v15;
v17 = 0;
if( LanguageName
&& *LanguageName
&& RtlpLangNameInMultiSzString(v9, LanguageName)
&& RtlpMuiRegGetLanguageSpec(RegInfoa, LanguageName, &LanguageSpecTypeRtrn, v13, &LanguageSpecRtrn) >= 0 )
{
v17 = 1;
LOBYTE(v33) = 1;
LangInfo.FallbackSpecs[0] = LanguageSpecRtrn;
LangInfo.FallbackTypes = LangInfo.FallbackTypes & 0xFFFC | LanguageSpecTypeRtrn & 3;
}
if( v9 )
{
v18 = RegInfoa;
v19 = 2 * v17;
LanguageName = (WCHAR *)&LangInfo.FallbackSpecs[v17];
do
{
if( !*v9 || v19 >= 8 )
break;
LanguageSpec = RtlpMuiRegGetLanguageSpec(v18, v9, &v29, v13, ResultIndexRtrn);
v8 = v29;
LangId = ResultIndexRtrn[0];
if( LanguageSpec >= 0
&& (!(_BYTE)v33 || LanguageSpecTypeRtrn != v29 || LanguageSpecRtrn != ResultIndexRtrn[0]) )
{
v21 = v19;
v22 = LangInfo.FallbackTypes & ~(3 << v19);
++v17;
v19 += 2;
v23 = (v29 & 3) << v21;
v24 = LanguageName;
LangInfo.FallbackTypes = v23 | v22;
*LanguageName = ResultIndexRtrn[0];
LanguageName = v24 + 1;
}
v25 = -1i64;
do
++v25;
while( v9[v25] );
v9 += v25 + 1;
}
while( v9 );
v14 = inited;
}
if( v17 < 0 )
{
LangId = LangInfo.LangId;
if( LangInfo.LangId )
{
v8 = 1;
LABEL_40:
v26 = (int)v37;
v27 = v39;
v39[4] = v39[4] & ~(3 << (2 * v37)) | ((v8 & 3) << (2 * v37));
v27[v26 + 6] = LangId;
return(unsigned int)v14;
}
LangId = LangInfo.LangNameIndex;
if( LangInfo.LangNameIndex > 0 )
{
v8 = 3;
goto LABEL_40;
}
return(unsigned int)-1073741823;
}
}
else
{
v14 = RtlpMuiRegGetLanguageSpec(RegInfo, DestinationString.Buffer, &v29, v11, ResultIndexRtrn);
if( v14 < 0 )
return(unsigned int)v14;
v8 = v29;
LangId = ResultIndexRtrn[0];
}
if( !v31 )
goto LABEL_40;
LangInfo.Flags &= ~0x20u;
v14 = RtlpMuiRegGetOrAddLangInfo((_MUILANGUAGES **)RegInfoa + 3, &LangInfo, ResultIndexRtrn);
if( v14 >= 0 )
{
LangId = ResultIndexRtrn[0];
v8 = 2;
goto LABEL_40;
}
return(unsigned int)v14;
}
return 3221225485i64;
}Referenced by:
RtlpMuiRegPopulateBaseLanguages