From d8539b241cac71a6630f9c49385e8ce0e406455a Mon Sep 17 00:00:00 2001 From: novenary Date: Sat, 18 Mar 2023 15:16:17 +0200 Subject: [PATCH] d3d9-nine: introduce forwarder DLL Because Wine appears to ignore override settings for .dll.so libraries, introduce a forwarding DLL that will always be identified as native. Fixes #150 --- d3d9-nine/d3d9-nine-forwarder.dll | Bin 0 -> 8192 bytes d3d9-nine/d3d9-nine-forwarder.spec | 15 ++++++++++ d3d9-nine/meson.build | 43 +++++++++++++++++++++++++++++ meson.build | 10 +++++++ ninewinecfg/main.c | 9 +++--- tools/nine-install.sh | 2 ++ 6 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 d3d9-nine/d3d9-nine-forwarder.dll create mode 100644 d3d9-nine/d3d9-nine-forwarder.spec diff --git a/d3d9-nine/d3d9-nine-forwarder.dll b/d3d9-nine/d3d9-nine-forwarder.dll new file mode 100644 index 0000000000000000000000000000000000000000..9786b656a0220a102b99b75212aa6c6521ecf8a4 GIT binary patch literal 8192 zcmeI0J#Q015QfJNNg$tm)yQ;EU@3ByE=qh!6NBSJ6e%DJH%U&h@2q7nBpnqEqNjoq z(NiEHI(qmCAn^l`XwoI`p6|o<#p$9b(yaX4dS-U-R?k+ujm;%05zz!VJ|_B#-nOmy zdG^DOdFTgR*$(w9r9IY_%J7V)L*%_F(YwQ+AJW=CD&L(hPfo@0^)#FHy^MVVyEfad z^g5yn{v>n8;&KusT~^HEB!k$&go|ob_LNb{8tmFq`WCcAgr77qAO^&M7!U(uKn#ch zF(3xSfEW-1=VKr}n}5NX)SkEJ67C`10`I}M8$^G>5x9MmXaTH)UGNrs0zbfSa0KRW z5#0yhG4~hv1O9^<%)bK`zzWy^PeA})gOA`d7{iHw9Jdmabd|2r6iw3%&0<|8Dw9|9 z7OP&nP4!y6>9kg#E%S~aIQtx!Eae2=U}BApYm|vzWKZ=`^4S>F!e_&P>ij&~LAcKQj5Q@uBQkiSula?k)mJn=!i&SPbC6}+U4{FT zC#vn^o*>legr>XJbhHjN*?+F;bld!x4@{&v*6<*}{Yy3d%!rp*U%i3(>jrZpUtAQN zPfYD+s*9yuda+i}UmTKe#HqD(OHM5&o6}bt*rsAW-mt#((AJHtU=yW@0Wly3#DEwO Q17bi7hygJm1}=et6FQg$$^ZZW literal 0 HcmV?d00001 diff --git a/d3d9-nine/d3d9-nine-forwarder.spec b/d3d9-nine/d3d9-nine-forwarder.spec new file mode 100644 index 0000000..dd87d6a --- /dev/null +++ b/d3d9-nine/d3d9-nine-forwarder.spec @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +@ stdcall Direct3DShaderValidatorCreate9() d3d9-nine.Direct3DShaderValidatorCreate9 +@ stdcall PSGPError() d3d9-nine.PSGPError +@ stdcall PSGPSampleTexture() d3d9-nine.PSGPSampleTexture +@ stdcall D3DPERF_BeginEvent(long wstr) d3d9-nine.D3DPERF_BeginEvent +@ stdcall D3DPERF_EndEvent() d3d9-nine.D3DPERF_EndEvent +@ stdcall D3DPERF_GetStatus() d3d9-nine.D3DPERF_GetStatus +@ stdcall D3DPERF_QueryRepeatFrame() d3d9-nine.D3DPERF_QueryRepeatFrame +@ stdcall D3DPERF_SetMarker(long wstr) d3d9-nine.D3DPERF_SetMarker +@ stdcall D3DPERF_SetOptions(long) d3d9-nine.D3DPERF_SetOptions +@ stdcall D3DPERF_SetRegion(long wstr) d3d9-nine.D3DPERF_SetRegion +@ stdcall DebugSetLevel() d3d9-nine.DebugSetLevel +@ stdcall DebugSetMute() d3d9-nine.DebugSetMute +@ stdcall Direct3DCreate9(long) d3d9-nine.Direct3DCreate9 +@ stdcall Direct3DCreate9Ex(long ptr) d3d9-nine.Direct3DCreate9Ex diff --git a/d3d9-nine/meson.build b/d3d9-nine/meson.build index c861451..ee1bd1a 100644 --- a/d3d9-nine/meson.build +++ b/d3d9-nine/meson.build @@ -73,3 +73,46 @@ custom_target( '@OUTPUT@', ], ) + +if wine_version.version_compare('>= 7.3') + d3d9_forwarder_builtin = shared_library( + 'd3d9-nine-forwarder', + [ + d3d9_res, + ], + name_prefix : '', + name_suffix : 'dll.builtin', + install : false, + vs_module_defs : 'd3d9-nine-forwarder.spec', + objects : 'd3d9-nine-forwarder.spec', + link_args : [ + '-Wb,--data-only', + '-Wb,--filename=d3d9', + ], + ) + + # Wine checks for a string in the header to identify builtin DLLs. + # Work around this with a simple substitution. + d3d9_forwarder = custom_target( + 'd3d9-nine-forwarder.dll', + input : d3d9_forwarder_builtin, + output : 'd3d9-nine-forwarder.dll', + install : true, + install_dir : pe_dir, + command : [ + sed, + '-e', 's|Wine builtin DLL|Nine forwarder |', + '@INPUT@', + ], + capture : true, + ) +else + # Support for building data-only modules was added in wine 7.3. + # For binary releases, use a prebuilt version (without resources). + # This is a small (8KiB) and reproducible file that contains + # no executable code, so it shouldn't be a problem. + install_data( + 'd3d9-nine-forwarder.dll', + install_dir : pe_dir, + ) +endif diff --git a/meson.build b/meson.build index a0ca6c4..e5a00bf 100644 --- a/meson.build +++ b/meson.build @@ -57,6 +57,16 @@ wrc = [ '-o', '@OUTPUT@', ] +wine_version = run_command( + [ + find_program('winebuild'), + '--version', + ], + check : true, +).stdout().split()[-1] + +sed = find_program('sed') + if cc.has_function('dlopen') dep_dl = null_dep else diff --git a/ninewinecfg/main.c b/ninewinecfg/main.c index 07907ca..987c881 100644 --- a/ninewinecfg/main.c +++ b/ninewinecfg/main.c @@ -29,6 +29,7 @@ #include "resource.h" static const char * const fn_nine_dll = "d3d9-nine.dll"; +static const char * const fn_forwarder_dll = "d3d9-nine-forwarder.dll"; static const char * const fn_backup_dll = "d3d9-nine.bak"; static const char * const fn_d3d9_dll = "d3d9.dll"; static const char * const fn_nine_exe = "ninewinecfg.exe"; @@ -253,11 +254,11 @@ static BOOL is_nine_symlink(LPCSTR filename) return FALSE; ret = readlink(fn, buf, sizeof(buf)); - if ((ret < strlen(fn_nine_dll)) || (ret == sizeof(buf))) + if ((ret < strlen(fn_forwarder_dll)) || (ret == sizeof(buf))) return FALSE; buf[ret] = 0; - return !strcmp(buf + ret - strlen(fn_nine_dll), fn_nine_dll); + return !strcmp(buf + ret - strlen(fn_forwarder_dll), fn_forwarder_dll); } static BOOL nine_get_system_path(CHAR *pOut, DWORD SizeOut) @@ -397,7 +398,7 @@ static void nine_set(BOOL status, BOOL NoOtherArch) remove_file(dst); } - hmod = LoadLibraryExA(fn_nine_dll, NULL, DONT_RESOLVE_DLL_REFERENCES); + hmod = LoadLibraryExA(fn_forwarder_dll, NULL, DONT_RESOLVE_DLL_REFERENCES); if (hmod) { Dl_info info; @@ -410,7 +411,7 @@ static void nine_set(BOOL status, BOOL NoOtherArch) FreeLibrary(hmod); } else { LPWSTR msg = load_message(GetLastError()); - ERR("Couldn't load %s: %s\n", fn_nine_dll, nine_dbgstr_w(msg)); + ERR("Couldn't load %s: %s\n", fn_forwarder_dll, nine_dbgstr_w(msg)); LocalFree(msg); } } else { diff --git a/tools/nine-install.sh b/tools/nine-install.sh index d5a1d7d..41a40cc 100644 --- a/tools/nine-install.sh +++ b/tools/nine-install.sh @@ -13,6 +13,7 @@ DST=$(wine winepath -u 'c:\windows\system32') echo "installing 32bit binaries to $DST" pe_dir='i386-windows' so_dir='i386-unix' +ln -sf "$BASE/wine/$pe_dir/d3d9-nine-forwarder.dll" "$DST/" ln -sf "$BASE/wine/$so_dir/d3d9-nine.dll.so" "$DST/d3d9-nine.dll" ln -sf "$BASE/wine/$so_dir/ninewinecfg.exe.so" "$DST/ninewinecfg.exe" @@ -31,6 +32,7 @@ DST=$(wine64 winepath -u 'c:\windows\system32') echo "installing 64bit binaries to $DST" pe_dir='x86_64-windows' so_dir='x86_64-unix' +ln -sf "$BASE/wine/$pe_dir/d3d9-nine-forwarder.dll" "$DST/" ln -sf "$BASE/wine/$so_dir/d3d9-nine.dll.so" "$DST/d3d9-nine.dll" ln -sf "$BASE/wine/$so_dir/ninewinecfg.exe.so" "$DST/ninewinecfg.exe"