Instead of statically importing dinput8 and creating the class at load time, which causes some native hooks to fail loading.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52222 Signed-off-by: Rémi Bernon rbernon@codeweavers.com ---
v3: Use lazy init and delay load instead of COM.
dlls/winmm/Makefile.in | 3 ++- dlls/winmm/joystick.c | 11 ++++++++--- dlls/winmm/winemm.h | 1 - dlls/winmm/winmm.c | 2 -- 4 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/dlls/winmm/Makefile.in b/dlls/winmm/Makefile.in index 5439ae21678..c515a3aba2e 100644 --- a/dlls/winmm/Makefile.in +++ b/dlls/winmm/Makefile.in @@ -1,7 +1,8 @@ EXTRADEFS = -D_WINMM_ MODULE = winmm.dll IMPORTLIB = winmm -IMPORTS = uuid user32 advapi32 ole32 msacm32 dinput8 +IMPORTS = uuid user32 advapi32 ole32 msacm32 +DELAYIMPORTS = dinput8
C_SRCS = \ driver.c \ diff --git a/dlls/winmm/joystick.c b/dlls/winmm/joystick.c index 5f5683e3e35..5a6e1203513 100644 --- a/dlls/winmm/joystick.c +++ b/dlls/winmm/joystick.c @@ -152,11 +152,12 @@ static BOOL CALLBACK enum_instances( const DIDEVICEINSTANCEW *instance, void *co return DIENUM_CONTINUE; }
-void joystick_load( HINSTANCE instance ) +static BOOL WINAPI joystick_load_once( INIT_ONCE *once, void *param, void **context ) { - HRESULT hr = DirectInput8Create( instance, DIRECTINPUT_VERSION, &IID_IDirectInput8W, + HRESULT hr = DirectInput8Create( hWinMM32Instance, DIRECTINPUT_VERSION, &IID_IDirectInput8W, (void **)&dinput, NULL ); - if (FAILED(hr)) WARN( "could not create dinput instance, hr %#x\n", hr ); + if (FAILED(hr)) ERR( "Could not create dinput instance, hr %#x\n", hr ); + return TRUE; }
void joystick_unload() @@ -177,11 +178,15 @@ void joystick_unload()
static void find_joysticks(void) { + static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT; + IDirectInputDevice8W *device; HANDLE event; DWORD index; HRESULT hr;
+ InitOnceExecuteOnce( &init_once, joystick_load_once, NULL, NULL ); + if (!dinput) return;
index = 0; diff --git a/dlls/winmm/winemm.h b/dlls/winmm/winemm.h index 3459c2a85ef..52cab64b1c5 100644 --- a/dlls/winmm/winemm.h +++ b/dlls/winmm/winemm.h @@ -153,7 +153,6 @@ MMRESULT WINMM_CheckCallback(DWORD_PTR dwCallback, DWORD fdwOpen, BOOL mixer) DE
void WINMM_DeleteWaveform(void) DECLSPEC_HIDDEN;
-void joystick_load( HMODULE instance ) DECLSPEC_HIDDEN; void joystick_unload( void ) DECLSPEC_HIDDEN;
/* Global variables */ diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c index aab8bfb51a9..aa2dd50c4c1 100644 --- a/dlls/winmm/winmm.c +++ b/dlls/winmm/winmm.c @@ -144,8 +144,6 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID fImpLoad)
if (!WINMM_CreateIData(hInstDLL)) return FALSE; - - joystick_load( hInstDLL ); break; case DLL_PROCESS_DETACH: if(fImpLoad)
Signed-off-by: Andrew Eikum aeikum@codeweavers.com
---
I'm not great at loader stuff, but I don't see any problems.
On Fri, Dec 17, 2021 at 04:42:05PM +0100, Rémi Bernon wrote:
Instead of statically importing dinput8 and creating the class at load time, which causes some native hooks to fail loading.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52222 Signed-off-by: Rémi Bernon rbernon@codeweavers.com
v3: Use lazy init and delay load instead of COM.
dlls/winmm/Makefile.in | 3 ++- dlls/winmm/joystick.c | 11 ++++++++--- dlls/winmm/winemm.h | 1 - dlls/winmm/winmm.c | 2 -- 4 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/dlls/winmm/Makefile.in b/dlls/winmm/Makefile.in index 5439ae21678..c515a3aba2e 100644 --- a/dlls/winmm/Makefile.in +++ b/dlls/winmm/Makefile.in @@ -1,7 +1,8 @@ EXTRADEFS = -D_WINMM_ MODULE = winmm.dll IMPORTLIB = winmm -IMPORTS = uuid user32 advapi32 ole32 msacm32 dinput8 +IMPORTS = uuid user32 advapi32 ole32 msacm32 +DELAYIMPORTS = dinput8
C_SRCS = \ driver.c \ diff --git a/dlls/winmm/joystick.c b/dlls/winmm/joystick.c index 5f5683e3e35..5a6e1203513 100644 --- a/dlls/winmm/joystick.c +++ b/dlls/winmm/joystick.c @@ -152,11 +152,12 @@ static BOOL CALLBACK enum_instances( const DIDEVICEINSTANCEW *instance, void *co return DIENUM_CONTINUE; }
-void joystick_load( HINSTANCE instance ) +static BOOL WINAPI joystick_load_once( INIT_ONCE *once, void *param, void **context ) {
- HRESULT hr = DirectInput8Create( instance, DIRECTINPUT_VERSION, &IID_IDirectInput8W,
- HRESULT hr = DirectInput8Create( hWinMM32Instance, DIRECTINPUT_VERSION, &IID_IDirectInput8W, (void **)&dinput, NULL );
- if (FAILED(hr)) WARN( "could not create dinput instance, hr %#x\n", hr );
- if (FAILED(hr)) ERR( "Could not create dinput instance, hr %#x\n", hr );
- return TRUE;
}
void joystick_unload() @@ -177,11 +178,15 @@ void joystick_unload()
static void find_joysticks(void) {
static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT;
IDirectInputDevice8W *device; HANDLE event; DWORD index; HRESULT hr;
InitOnceExecuteOnce( &init_once, joystick_load_once, NULL, NULL );
if (!dinput) return;
index = 0;
diff --git a/dlls/winmm/winemm.h b/dlls/winmm/winemm.h index 3459c2a85ef..52cab64b1c5 100644 --- a/dlls/winmm/winemm.h +++ b/dlls/winmm/winemm.h @@ -153,7 +153,6 @@ MMRESULT WINMM_CheckCallback(DWORD_PTR dwCallback, DWORD fdwOpen, BOOL mixer) DE
void WINMM_DeleteWaveform(void) DECLSPEC_HIDDEN;
-void joystick_load( HMODULE instance ) DECLSPEC_HIDDEN; void joystick_unload( void ) DECLSPEC_HIDDEN;
/* Global variables */ diff --git a/dlls/winmm/winmm.c b/dlls/winmm/winmm.c index aab8bfb51a9..aa2dd50c4c1 100644 --- a/dlls/winmm/winmm.c +++ b/dlls/winmm/winmm.c @@ -144,8 +144,6 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID fImpLoad)
if (!WINMM_CreateIData(hInstDLL)) return FALSE;
case DLL_PROCESS_DETACH: if(fImpLoad)joystick_load( hInstDLL ); break;
-- 2.34.0