[PATCH v2 3/5] dinput: Wait for CancelIoEx completion when unacquiring HID joysticks.

Rémi Bernon rbernon at codeweavers.com
Fri Oct 8 08:36:01 CDT 2021


Otherwise we may later write the cancelled status to invalid memory.

Also use a manual-reset event, as it should be for overlapped I/O, so
all waiters are woken up on cancel.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/joystick_hid.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 35d03fbf7cc..0453cd7d529 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -543,7 +543,6 @@ static ULONG hid_joystick_private_decref( struct hid_joystick *impl )
         HeapFree( GetProcessHeap(), 0, tmp.input_report_buf );
         HeapFree( GetProcessHeap(), 0, tmp.input_extra_caps );
         HidD_FreePreparsedData( tmp.preparsed );
-        CancelIoEx( tmp.device, &tmp.read_ovl );
         CloseHandle( tmp.base.read_event );
         CloseHandle( tmp.device );
     }
@@ -925,7 +924,7 @@ static HRESULT WINAPI hid_joystick_Unacquire( IDirectInputDevice8W *iface )
     {
         ret = CancelIoEx( impl->device, &impl->read_ovl );
         if (!ret) WARN( "CancelIoEx failed, last error %u\n", GetLastError() );
-
+        else WaitForSingleObject( impl->base.read_event, INFINITE );
         IDirectInputDevice8_SendForceFeedbackCommand( iface, DISFFC_RESET );
         impl->base.acquired = FALSE;
     }
@@ -2009,7 +2008,7 @@ static HRESULT hid_joystick_create_device( IDirectInputImpl *dinput, const GUID
     if (FAILED(hr)) return hr;
     impl->base.crit.DebugInfo->Spare[0] = (DWORD_PTR)(__FILE__ ": hid_joystick.base.crit");
     impl->base.dwCoopLevel = DISCL_NONEXCLUSIVE | DISCL_BACKGROUND;
-    impl->base.read_event = CreateEventA( NULL, FALSE, FALSE, NULL );
+    impl->base.read_event = CreateEventW( NULL, TRUE, FALSE, NULL );
     impl->base.read_callback = hid_joystick_read_state;
 
     hr = hid_joystick_device_open( -1, &instance, impl->device_path, &impl->device, &impl->preparsed,
-- 
2.33.0




More information about the wine-devel mailing list