RtlpMuiRegCreateKernelRegistryInfo
NTSTATUS __stdcall RtlpMuiRegCreateKernelRegistryInfo(
PVOID *RegInfoBlob,
UINT64 *RegInfoBlobSize,
UINT64 *pulNumberInstalled,
UINT64 ulInstallLanguage2Check,
UINT64 *pulInstallLanguage2CheckExists,
UINT64 ulMachineLanguage2Check,
UINT64 *pulMachineLanguage2CheckExists){
int v7;
int v9;
VOID **v10;
INT64 v11;
_MUIREGISTRYINFO *RegistryInfo;
UINT64 v13;
int v14;
__int64 v15;
unsigned int v16;
_WORD *v17;
__int64 v18;
size_t v19;
VOID **PoolWithTag;
UINT64 NumberOfBytes[9];
v7 = ulInstallLanguage2Check;
v9 = 0;
v10 = 0i64;
v11 = 0i64;
if( !RegInfoBlob
|| !RegInfoBlobSize
|| !pulNumberInstalled
|| !pulInstallLanguage2CheckExists
|| !pulMachineLanguage2CheckExists )
{
v14 = -1073741811;
goto LABEL_33;
}
RegistryInfo = RtlpMuiRegCreateRegistryInfo();
v11 = (INT64)RegistryInfo;
if( !RegistryInfo )
return -1073741801;
v14 = RtlpMuiRegLoadRegistryInfo(RegistryInfo, v13);
if( v14 >= 0 )
{
v15 = *(_QWORD *)(v11 + 24);
v16 = *(unsigned __int16 *)(v15 + 6);
if( (_WORD)v16 )
{
v17 = *(_WORD **)(v15 + 16);
v18 = v16;
do
{
if( (*v17 & 0x9020) == 32 && (*v17 & 3) != 0 )
++v9;
v17 += 14;
--v18;
}
while( v18 );
}
*(_DWORD *)pulNumberInstalled = v9;
*(_DWORD *)pulInstallLanguage2CheckExists = 0;
if( v7 && RtlpMuiRegGetInstalledLanguageIndexByLangId((_MUIREGISTRYINFO *)v11, v7, 1u, 0i64) >= 0 )
*(_DWORD *)pulInstallLanguage2CheckExists = 1;
*(_DWORD *)pulMachineLanguage2CheckExists = 0;
if( (_DWORD)ulMachineLanguage2Check
&& RtlpMuiRegGetInstalledLanguageIndexByLangId((_MUIREGISTRYINFO *)v11, ulMachineLanguage2Check, 1u, 0i64) >= 0 )
{
*(_DWORD *)pulMachineLanguage2CheckExists = 1;
}
LODWORD(NumberOfBytes[0]) = 0;
v14 = RtlpMuiRegSerializeRegistryInfo(v11, 0i64, NumberOfBytes);
if( v14 >= 0 )
{
if( LODWORD(NumberOfBytes[0]) )
{
v19 = NumberOfBytes[0];
PoolWithTag = ExAllocatePoolWithTag(1ui64, LODWORD(NumberOfBytes[0]), 1920232557i64);
v10 = PoolWithTag;
if( PoolWithTag )
memset(PoolWithTag, 0i64, v19);
}
if( v10 )
{
v14 = RtlpMuiRegSerializeRegistryInfo(v11, v10, NumberOfBytes);
if( v14 >= 0 )
{
*RegInfoBlob = v10;
*(_DWORD *)RegInfoBlobSize = NumberOfBytes[0];
goto LABEL_27;
}
LABEL_33:
if( v10 )
ExFreeHeapPool(v10);
goto LABEL_27;
}
v14 = -1073741801;
}
}
LABEL_27:
if( v11 )
{
RtlpMuiRegFreeRegistryInfo((_MUIREGISTRYINFO *)v11, 0xFFFui64);
ExFreeHeapPool((PVOID)v11);
}
return v14;
}Referenced by:
MUIRegistrySystemRoutine