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