Alexandre Julliard : setupapi: Support loading builtins from the architecture-specific PE directory.
Alexandre Julliard
julliard at winehq.org
Mon Apr 26 15:51:31 CDT 2021
Module: wine
Branch: master
Commit: 717e394af31407e04459c25f589c5105dd126566
URL: https://source.winehq.org/git/wine.git/?a=commit;h=717e394af31407e04459c25f589c5105dd126566
Author: Alexandre Julliard <julliard at winehq.org>
Date: Mon Apr 26 12:41:32 2021 +0200
setupapi: Support loading builtins from the architecture-specific PE directory.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/setupapi/fakedll.c | 37 ++++++++++++++++++++++++-------------
1 file changed, 24 insertions(+), 13 deletions(-)
diff --git a/dlls/setupapi/fakedll.c b/dlls/setupapi/fakedll.c
index 7fcc4a6fe89..68d0bd0bc69 100644
--- a/dlls/setupapi/fakedll.c
+++ b/dlls/setupapi/fakedll.c
@@ -40,6 +40,23 @@
WINE_DEFAULT_DEBUG_CHANNEL(setupapi);
+#ifdef __i386__
+static const WCHAR pe_dir[] = L"\\i386-windows";
+static const char current_arch[] = "x86";
+#elif defined __x86_64__
+static const WCHAR pe_dir[] = L"\\x86_64-windows";
+static const char current_arch[] = "amd64";
+#elif defined __arm__
+static const WCHAR pe_dir[] = L"\\arm-windows";
+static const char current_arch[] = "arm";
+#elif defined __aarch64__
+static const WCHAR pe_dir[] = L"\\aarch64-windows";
+static const char current_arch[] = "arm64";
+#else
+static const WCHAR pe_dir[] = L"";
+static const char current_arch[] = "none";
+#endif
+
static const char builtin_signature[] = "Wine builtin DLL";
static const char fakedll_signature[] = "Wine placeholder DLL";
@@ -414,7 +431,7 @@ static void *load_fake_dll( const WCHAR *name, SIZE_T *size )
len = lstrlenW( name );
if (build_dir) maxlen = lstrlenW(build_dir) + ARRAY_SIZE(L"\\programs") + len + 1;
while ((path = enum_load_path( i++ ))) maxlen = max( maxlen, lstrlenW(path) );
- maxlen += ARRAY_SIZE(L"\\fakedlls") + len + ARRAY_SIZE(L".fake");
+ maxlen += ARRAY_SIZE(pe_dir) + len + ARRAY_SIZE(L".fake");
if (!(file = HeapAlloc( GetProcessHeap(), 0, maxlen * sizeof(WCHAR) ))) return NULL;
@@ -452,6 +469,9 @@ static void *load_fake_dll( const WCHAR *name, SIZE_T *size )
file[pos + len + 1] = 0;
for (i = 0; (path = enum_load_path( i )); i++)
{
+ ptr = prepend( file + pos, pe_dir, lstrlenW(pe_dir) );
+ ptr = prepend( ptr, path, lstrlenW(path) );
+ if ((res = read_file( ptr, &data, size ))) break;
ptr = prepend( file + pos, path, lstrlenW(path) );
if ((res = read_file( ptr, &data, size ))) break;
ptr = prepend( file + pos, L"\\fakedlls", 9 );
@@ -709,17 +729,6 @@ struct dll_data
static BOOL CALLBACK register_manifest( HMODULE module, const WCHAR *type, WCHAR *res_name, LONG_PTR arg )
{
-#ifdef __i386__
- static const char current_arch[] = "x86";
-#elif defined __x86_64__
- static const char current_arch[] = "amd64";
-#elif defined __arm__
- static const char current_arch[] = "arm";
-#elif defined __aarch64__
- static const char current_arch[] = "arm64";
-#else
- static const char current_arch[] = "none";
-#endif
const struct dll_data *dll_data = (const struct dll_data*)arg;
WCHAR *dest = NULL;
DWORD dest_len = 0;
@@ -1007,7 +1016,7 @@ static BOOL create_wildcard_dlls( const WCHAR *dirname, const WCHAR *wildcard, B
if (build_dir) maxlen = lstrlenW(build_dir) + ARRAY_SIZE(L"\\programs") + 1;
for (i = 0; (path = enum_load_path(i)); i++) maxlen = max( maxlen, lstrlenW(path) );
- maxlen += 2 * max_dll_name_len + 2 + 10; /* ".dll.fake" */
+ maxlen += 2 * max_dll_name_len + 2 + ARRAY_SIZE(pe_dir) + 10; /* ".dll.fake" */
if (!(file = HeapAlloc( GetProcessHeap(), 0, maxlen * sizeof(WCHAR) ))) return FALSE;
if (!(dest = HeapAlloc( GetProcessHeap(), 0, (lstrlenW(dirname) + max_dll_name_len) * sizeof(WCHAR) )))
@@ -1029,6 +1038,8 @@ static BOOL create_wildcard_dlls( const WCHAR *dirname, const WCHAR *wildcard, B
}
for (i = 0; (path = enum_load_path( i )); i++)
{
+ swprintf( file, maxlen, L"%s%s", path, pe_dir );
+ install_lib_dir( dest, file, wildcard, NULL, delete );
lstrcpyW( file, path );
install_lib_dir( dest, file, wildcard, NULL, delete );
lstrcpyW( file, path );
More information about the wine-cvs
mailing list