From: Craig Schulstad <craigaschulstad@gmail.com> Within the loader.c module, additional functions are called to search for an associated "mui" file that contains resources for menus, menu items, dialog boxes, and similar resources. --- dlls/kernelbase/loader.c | 135 +++++++++++++++++---------------------- 1 file changed, 58 insertions(+), 77 deletions(-) diff --git a/dlls/kernelbase/loader.c b/dlls/kernelbase/loader.c index f6bc614ea65..9bcf315c103 100755 --- a/dlls/kernelbase/loader.c +++ b/dlls/kernelbase/loader.c @@ -20,6 +20,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ + #include <stdarg.h> #include "ntstatus.h" @@ -56,7 +57,7 @@ static CRITICAL_SECTION_DEBUG critsect_debug = }; static CRITICAL_SECTION exclusive_datafile_list_section = { &critsect_debug, -1, 0, 0, 0, 0 }; -static WCHAR mui_locale[LOCALE_NAME_MAX_LENGTH]; /* MUI work variables */ +static WCHAR mui_locale[LOCALE_NAME_MAX_LENGTH]; static BOOL locale_found = FALSE; static BOOL recursion_flag = FALSE; @@ -1060,16 +1061,15 @@ BOOL WINAPI DECLSPEC_HOTPATCH EnumResourceTypesExW( HMODULE module, ENUMRESTYPEP return ret; } + /***********************************************************************/ /* get_mui - Acquire an MUI module for the associated resource */ /***********************************************************************/ HMODULE get_mui(HMODULE module) - { - HMODULE mui_module = NULL; - WCHAR module_name[MAX_PATH], mui_name[MAX_PATH]; + HMODULE mui_module; INT i, j, k, l; @@ -1080,28 +1080,15 @@ HMODULE get_mui(HMODULE module) mui_name[i] = 0; } - /* Note - the reference to the Windows file name for an "MUI" file has a structure such as */ - /* "C:\Program Files\Application Directory\xx-XX\Application.exe.mui"; however, in testing */ - /* out the usage of the "GetModuleFileNameW" function, it was determined that it works with */ - /* a relative Linux file structure such as "xx-XX/Application.exe.mui". */ - - if (!(GetModuleFileNameW(module, module_name, MAX_PATH))) /* Acquire the base resource file name */ - return module; + /* Acquire the base resource file name */ - /* Stay with the original module reference if this file is not an executable file. */ - - if (!(wcsstr(module_name, L".exe"))) - return module; - - /* Acquire the locale name using LCIDToLocaleName. Since this function utilizes the FindResourceExW function, this */ - /* sets up a recursive call to this function. In order to avoid a stack overflow condition that would be caused by */ - /* repeated calls, a flag will be set on to return back to the FindResourceExW function without again calling the */ - /* locale acquisition function. */ + if (!(GetModuleFileNameW(module, module_name, MAX_PATH))) + return module; if (!(locale_found)) { if (recursion_flag) - return module; + return module; recursion_flag = TRUE; @@ -1119,11 +1106,9 @@ HMODULE get_mui(HMODULE module) for (i = 0; i < MAX_PATH; i++) { - if (module_name[i] == 0) - break; + if (module_name[i] == 0) break; - if (module_name[i] == '\\') - j = i; + if (module_name[i] == '\\') j = i; } /* Set up the work index that will be used to extract just the executable file from the fully qualified file name. */ @@ -1132,19 +1117,18 @@ HMODULE get_mui(HMODULE module) for (i = 0; i < MAX_PATH; i++) { - if (module_name[i] == 0) - break; + if (module_name[i] == 0) break; - /* If work index "j" has been set to -1, then the file portion of the qualified name has been reached and will */ - /* be copied to the "MUI" file reference. */ + /* If work index "j" has been set to -1, then the file portion of the qualified */ + /* name has been reached and will be copied to the "MUI" file reference. */ if (j < 0) { mui_name[k] = module_name[i]; k++; } - /* When the position of the final backslash has been reached, add the locale name as the folder/directory */ - /* containing the "MUI" file and reset work index "j" to -1. */ + /* When the position of the final backslash has been reached, add the locale name as */ + /* the folder/directory containing the "MUI" file and reset work index "j" to -1. */ if (i >= j && j > 0) { for (l = 0; l < 5; l++) { @@ -1161,16 +1145,18 @@ HMODULE get_mui(HMODULE module) wcscat(mui_name, L".mui"); - /* Now, see if there is an associated "MUI" file and if so use its handle for the module handle. */ + /* Now, see if there is an associated "MUI" file and if so, use its handle for the module handle. */ mui_module = LoadLibraryExW(mui_name, 0, 0); + + if (mui_module != NULL) + TRACE("MUI module found: %s Address: %p\n", debugstr_w(module_name), mui_module); - if (mui_module) { + if (mui_module != NULL) return mui_module; - } else { + else return module; - } - + } /***********************************************************************/ @@ -1195,7 +1181,7 @@ HRSRC get_res_handle(HMODULE module, LPCWSTR type, LPCWSTR name, WORD lang) if ((status = get_res_nameW( type, &typeW )) != STATUS_SUCCESS) goto done; info.Type = (ULONG_PTR)typeW.Buffer; info.Name = (ULONG_PTR)nameW.Buffer; - info.Language = lang; + info.Language = lang; status = LdrFindResource_U( module, &info, 3, &entry ); done: if (status != STATUS_SUCCESS) SetLastError( RtlNtStatusToDosError(status) ); @@ -1210,38 +1196,34 @@ HRSRC get_res_handle(HMODULE module, LPCWSTR type, LPCWSTR name, WORD lang) if (!IS_INTRESOURCE(typeW.Buffer)) HeapFree( GetProcessHeap(), 0, typeW.Buffer ); return (HRSRC)entry; - } /********************************************************************** * FindResourceExW (kernelbase.@) */ HRSRC WINAPI DECLSPEC_HOTPATCH FindResourceExW( HMODULE module, LPCWSTR type, LPCWSTR name, WORD lang ) -{ +{ + HRSRC rsrc; - - TRACE( "%p %s %s %04x\n", module, debugstr_w(type), debugstr_w(name), lang ); + HMODULE work_module = NULL; + + TRACE( "FindResourceW: %p %s %s %04x\n", module, debugstr_w(type), debugstr_w(name), lang ); if (!module) module = GetModuleHandleW( 0 ); - - rsrc = get_res_handle(module, type, name, lang); - - if (rsrc) { - - return rsrc; - - } else { - - /* If a resource retrieval failed using the initial module value, attempt to */ - /* locate an associated MUI file and retry the resource retrieval. */ - - module = get_mui(module); - + + work_module = GetModuleHandleW( 0 ); + + if (module != work_module) { rsrc = get_res_handle(module, type, name, lang); + } else { + rsrc = get_res_handle(get_mui(module), type, name, lang); + + if (!rsrc) + TRACE("Resource not found from MUI\n"); + } + + return rsrc; - return rsrc; - - } } /********************************************************************** @@ -1269,29 +1251,28 @@ HGLOBAL WINAPI DECLSPEC_HOTPATCH LoadResource( HINSTANCE module, HRSRC rsrc ) { void *ret; - HMODULE mui_module = NULL; - - TRACE( "%p %p\n", module, rsrc ); - - if (!rsrc) - return 0; - - if (!module) - module = GetModuleHandleW( 0 ); - - /* Only check for an MUI reference if the resource handle value is less than the module value, */ - /* or if an MUI reference was found and the MUI reference and handle value are larger than the */ - /* module value for the executable file. That is a signal that the resource handle is to be */ - /* associated with the MUI file instead of the executable file. */ - - mui_module = get_mui(module); + HMODULE work_module = NULL; + + TRACE( "LoadResource: %p %p\n", module, rsrc ); - if (((HMODULE)rsrc < module) || ((mui_module > module) && ((HMODULE)rsrc > mui_module))) - module = mui_module; + if (!rsrc) return 0; + if (!module) module = GetModuleHandleW( 0 ); + + work_module = GetModuleHandleW( 0 ); + + if (module != work_module) { + if (!set_ntstatus( LdrAccessResource( module, (IMAGE_RESOURCE_DATA_ENTRY *)rsrc, &ret, NULL ))) + return 0; + return ret; + } - if (!set_ntstatus( LdrAccessResource( module, (IMAGE_RESOURCE_DATA_ENTRY *)rsrc, &ret, NULL ))) + if (!set_ntstatus( LdrAccessResource( get_mui(module), (IMAGE_RESOURCE_DATA_ENTRY *)rsrc, &ret, NULL ))) { + TRACE("Resource was not loaded\n"); return 0; + } + return ret; + } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10209