LdrLoadAlternateResourceModuleEx

NTSTATUS __stdcall LdrLoadAlternateResourceModuleEx(
        PVOID Module,
        UINT16 LangId,
        PVOID *ReturnAlternateModule,
        UINT64 *AlternateViewSize,
        UINT64 Flags){
  unsigned int v7; 
  unsigned __int64 v9; 
  _KLDR_DATA_TABLE_ENTRY *DataTableEntry; 
  WCHAR *v12; 
  int v13; 
  _UNICODE_STRING *v14; 
  int ResourceFileName; 
  INT64 v16; 
  UINT64 v17; 
  UINT64 *pViewSize; 
  UINT64 v19; 
  INT64 ErrorCode; 
  PVOID pResourceFileView; 
  UINT64 Size; 
  PVOID pFileHandle; 
  int v24; 
  _UNICODE_STRING pResourceFileName; 
  _KLDR_DATA_TABLE_ENTRY *v26; 
  wchar_t Name[88]; 
  char v28; 

  v7 = LangId;
  pResourceFileView = 0i64;
  pFileHandle = 0i64;
  pResourceFileName = 0i64;
  memset(Name, 0i64, 0xAAu);
  Size = 0i64;
  if( !Module || !(_WORD)v7 || !ReturnAlternateModule )
    return -1073741811;
  v9 = (unsigned __int64)LdrpGetFromMUIMemCache(Module, v7, &Size, 4ui64);
  if( v9 == -1i64 )
  {
    *ReturnAlternateModule = 0i64;
    return -1073020922;
  }
  if( v9 )
  {
    *ReturnAlternateModule = (PVOID)v9;
    if( AlternateViewSize )
      *AlternateViewSize = Size;
    v24 = 0;
    return 0;
  }
  DataTableEntry = (_KLDR_DATA_TABLE_ENTRY *)LdrpKrnGetDataTableEntry(Module);
  v26 = DataTableEntry;
  if( DataTableEntry )
  {
    pResourceFileName.Buffer = (wchar_t *)&v28;
    *(_DWORD *)&pResourceFileName.Length = 34078720;
    v13 = Flags & 0x1000000;
    if( (Flags & 0x1000000) != 0 )
    {
LABEL_14:
      v14 = (_UNICODE_STRING *)L".mun";
      if( !v13 )
        v14 = (_UNICODE_STRING *)&::ResourceFileName;
      LOBYTE(v12) = v13 != 0;
      ResourceFileName = LdrpGetResourceFileName(DataTableEntry, v12, v14);
      if( ResourceFileName >= 0 )
      {
        ResourceFileName = LdrpMapResourceFile(Module, &pResourceFileName, &pFileHandle, &pResourceFileView, &Size);
        if( ResourceFileName >= 0 )
        {
          v9 = (unsigned __int64)pResourceFileView | 1;
          LODWORD(pViewSize) = Flags;
          if( !LdrpVerifyAlternateResourceModuleEx(
                  Module,
                  (VOID *)((unsigned __int64)pResourceFileView | 1),
                  v16,
                  Name,
                  (INT64)pViewSize) )
          {
            MmUnmapViewInSystemSpace(pResourceFileView);
            ZwClose((_HANDLE)pFileHandle);
            pFileHandle = 0i64;
            v9 = 0i64;
            ResourceFileName = -1073020926;
          }
        }
      }
      goto LABEL_20;
    }
    if( DownLevelLangIDToLanguageName(v7, Name, 85i64, 2ui64) )
    {
      DataTableEntry = v26;
      goto LABEL_14;
    }
    DbgPrintEx(0x55u, 1u, "LDR: No Locale name for LangId %d \n", v7);
  }
  ResourceFileName = -1073020927;
LABEL_20:
  if( !v9 )
    v9 = -1i64;
  pResourceFileView = (PVOID)v9;
  v17 = Size;
  LODWORD(ErrorCode) = ResourceFileName;
  LODWORD(v19) = 1;
  LdrpSetAlternateResourceModuleHandle(
    Module,
    &pResourceFileView,
    &pFileHandle,
    0i64,
    v7,
    v19,
    ErrorCode,
    Size,
    (UINT64)pResourceFileView);
  if( pResourceFileView == (PVOID)-1i64 )
  {
    *ReturnAlternateModule = 0i64;
  }
  else
  {
    *ReturnAlternateModule = pResourceFileView;
    if( AlternateViewSize )
      *AlternateViewSize = v17;
    return 0;
  }
  return ResourceFileName;
}

Referenced by:

LdrResSearchResource
LdrpLoadResourceFromAlternativeModule
LdrpResSearchResourceMappedFile