-- v8: ntoskrnl: Implement IoReportTargetDeviceChange. plugplay: Add support for DBT_DEVTYP_HANDLE notifications.
From: Vibhav Pant vibhavp@gmail.com
--- dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- dlls/ntoskrnl.exe/pnp.c | 6 ++++++ include/ddk/wdm.h | 10 ++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index e9ad2aa7e74..690b4e166c3 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -465,7 +465,7 @@ @ stub IoReportHalResourceUsage @ stdcall IoReportResourceForDetection(ptr ptr long ptr ptr long ptr) @ stdcall IoReportResourceUsage(ptr ptr ptr long ptr ptr long long ptr) -@ stub IoReportTargetDeviceChange +@ stdcall IoReportTargetDeviceChange(ptr ptr) @ stub IoReportTargetDeviceChangeAsynchronous @ stub IoRequestDeviceEject @ stdcall IoReuseIrp(ptr long) diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c index cbd5cf6ff2a..bb10c27fbee 100644 --- a/dlls/ntoskrnl.exe/pnp.c +++ b/dlls/ntoskrnl.exe/pnp.c @@ -1001,6 +1001,12 @@ NTSTATUS WINAPI IoRegisterDeviceInterface(DEVICE_OBJECT *device, const GUID *cla return status; }
+NTSTATUS WINAPI IoReportTargetDeviceChange( DEVICE_OBJECT *pdo, void *notification ) +{ + FIXME( "(%p, %p) stub!\n", pdo, notification ); + return STATUS_NOT_SUPPORTED; +} + /*********************************************************************** * IoOpenDeviceRegistryKey (NTOSKRNL.EXE.@) */ diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index e0c21d0ccfd..9d5f9e1ee07 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -1613,6 +1613,15 @@ typedef enum _DIRECTORY_NOTIFY_INFORMATION_CLASS { DirectoryNotifyExtendedInformation } DIRECTORY_NOTIFY_INFORMATION_CLASS, *PDIRECTORY_NOTIFY_INFORMATION_CLASS;
+typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION { + USHORT Version; + USHORT Size; + GUID Event; + FILE_OBJECT *FileObject; + LONG NameBufferOffset; + UCHAR CustomDataBuffer[1]; +} TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION; + typedef enum _WORK_QUEUE_TYPE { CriticalWorkQueue, DelayedWorkQueue, @@ -1781,6 +1790,7 @@ NTSTATUS WINAPI IoRegisterDeviceInterface(PDEVICE_OBJECT,const GUID*,PUNICODE_S void WINAPI IoReleaseCancelSpinLock(KIRQL); void WINAPI IoReleaseRemoveLockAndWaitEx(IO_REMOVE_LOCK*,void*,ULONG); void WINAPI IoReleaseRemoveLockEx(IO_REMOVE_LOCK*,void*,ULONG); +NTSTATUS WINAPI IoReportTargetDeviceChange(DEVICE_OBJECT*, void*); void WINAPI IoReuseIrp(IRP*,NTSTATUS); NTSTATUS WINAPI IoSetDeviceInterfaceState(UNICODE_STRING*,BOOLEAN); NTSTATUS WINAPI IoSetDevicePropertyData(DEVICE_OBJECT*,const DEVPROPKEY*,LCID,ULONG,DEVPROPTYPE,ULONG,void*);
From: Vibhav Pant vibhavp@gmail.com
--- dlls/ntoskrnl.exe/tests/driver.h | 38 ++++++++++++ dlls/ntoskrnl.exe/tests/driver_pnp.c | 43 +++++++++++++ dlls/ntoskrnl.exe/tests/ntoskrnl.c | 92 ++++++++++++++++++++++++++-- 3 files changed, 168 insertions(+), 5 deletions(-)
diff --git a/dlls/ntoskrnl.exe/tests/driver.h b/dlls/ntoskrnl.exe/tests/driver.h index 9c51af0a4c6..a3a3c622097 100644 --- a/dlls/ntoskrnl.exe/tests/driver.h +++ b/dlls/ntoskrnl.exe/tests/driver.h @@ -78,6 +78,44 @@ struct return_status_params
static const GUID control_class = {0xdeadbeef, 0x29ef, 0x4538, {0xa5, 0xfd, 0xb6, 0x95, 0x73, 0xa3, 0x62, 0xc0}};
+static const struct +{ + GUID eventguid; + BYTE *data; + SIZE_T data_size; + const WCHAR *str; + const CHAR *strA; +} custom_events[] = { + { + {0xdeadbeef, 0xdead, 0xbeef, { 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0x01}}, + NULL, + 0, + NULL, + NULL, + }, + { + {0xdeadbeef, 0xdead, 0xbeef, { 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0x02}}, + (BYTE *)(&custom_events[1].eventguid), + sizeof(GUID), + NULL, + NULL, + }, + { + {0xdeadbeef, 0xdead, 0xbeef, { 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0x03}}, + (BYTE *)(&custom_events[2].eventguid), + sizeof(GUID), + L"Wine is not an emulator", + "Wine is not an emulator" + }, + { + {0xdeadbeef, 0xdead, 0xbeef, { 0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0x04}}, + NULL, + 0, + L"Wine is not an emulator", + "Wine is not an emulator" + } +}; + #define SERVER_LISTEN_PORT 9374 #define CLIENT_LISTEN_PORT 9375
diff --git a/dlls/ntoskrnl.exe/tests/driver_pnp.c b/dlls/ntoskrnl.exe/tests/driver_pnp.c index 70678b1a45c..e79edae7125 100644 --- a/dlls/ntoskrnl.exe/tests/driver_pnp.c +++ b/dlls/ntoskrnl.exe/tests/driver_pnp.c @@ -686,6 +686,48 @@ static void test_device_properties( DEVICE_OBJECT *device ) return; }
+static void test_devicechange( DEVICE_OBJECT *obj ) +{ + INT i; + + for (i = 0; i < ARRAY_SIZE( custom_events ); i++) + { + TARGET_DEVICE_CUSTOM_NOTIFICATION *notif = NULL; + SIZE_T size = offsetof(TARGET_DEVICE_CUSTOM_NOTIFICATION, CustomDataBuffer[1]); + NTSTATUS status; + + winetest_push_context( "custom_events %d", i ); + if (custom_events[i].data) + size += custom_events[i].data_size; + + if (custom_events[i].str) + size += wcslen(custom_events[i].str) * sizeof(WCHAR) + 1; + + notif = ExAllocatePool( PagedPool, size ); + ok( notif != NULL, "Failed to allocate memory for notification.\n" ); + notif->Version = 1; + notif->Size = size; + notif->Event = custom_events[i].eventguid; + notif->FileObject = NULL; + + if (custom_events[i].data) + memcpy(notif->CustomDataBuffer, custom_events[i].data, custom_events[i].data_size); + + if (custom_events[i].str) + { + notif->NameBufferOffset = custom_events[i].data_size; + wcscpy( (WCHAR *)¬if->CustomDataBuffer[notif->NameBufferOffset], custom_events[i].str ); + } + else + notif->NameBufferOffset = -1; + + status = IoReportTargetDeviceChange( obj, notif ); + todo_wine ok( status == STATUS_SUCCESS, "IoReportTargetDeviceChange failed, status %#lx size %d,\n", status, notif->Size ); + ExFreePool( notif ); + winetest_pop_context(); + } +} + static NTSTATUS fdo_ioctl(IRP *irp, IO_STACK_LOCATION *stack, ULONG code) { switch (code) @@ -693,6 +735,7 @@ static NTSTATUS fdo_ioctl(IRP *irp, IO_STACK_LOCATION *stack, ULONG code) case IOCTL_WINETEST_BUS_MAIN: test_bus_query(); test_device_properties( bus_pdo ); + test_devicechange( bus_pdo ); return STATUS_SUCCESS;
case IOCTL_WINETEST_BUS_REGISTER_IFACE: diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c index 48deda7c455..ea011e9e397 100644 --- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c @@ -1356,7 +1356,10 @@ static void add_file_to_catalog(HANDLE catalog, const WCHAR *file) static const GUID bus_class = {0xdeadbeef, 0x29ef, 0x4538, {0xa5, 0xfd, 0xb6, 0x95, 0x73, 0xa3, 0x62, 0xc1}}; static const GUID child_class = {0xdeadbeef, 0x29ef, 0x4538, {0xa5, 0xfd, 0xb6, 0x95, 0x73, 0xa3, 0x62, 0xc2}};
-static unsigned int got_bus_arrival, got_bus_removal, got_child_arrival, got_child_removal; +static unsigned int got_bus_arrival, got_bus_removal, got_child_arrival, got_child_removal, got_custom_event; + +static HDEVNOTIFY notify_handle_custom; +static HANDLE bus;
static LRESULT WINAPI device_notify_proc(HWND window, UINT message, WPARAM wparam, LPARAM lparam) { @@ -1427,6 +1430,69 @@ static LRESULT WINAPI device_notify_proc(HWND window, UINT message, WPARAM wpara } break; } + + case DBT_CUSTOMEVENT: + { + const DEV_BROADCAST_HANDLE *handle = (const DEV_BROADCAST_HANDLE *)lparam; + INT i; + + if (handle->dbch_devicetype != DBT_DEVTYP_HANDLE) + break; + + if (winetest_debug > 1) trace("custom device event\n"); + + ok( handle->dbch_handle == bus, "Expected dbch_handle %p, got %p.\n", bus, handle->dbch_handle ); + + for (i = 0; i < ARRAY_SIZE( custom_events ); i++) + { + const GUID *guid = &custom_events[i].eventguid; + DWORD expect_size; + DWORD size = 0; + + if (!IsEqualGUID( &handle->dbch_eventguid, guid )) + continue; + + winetest_push_context( "custom_events %d", i ); + got_custom_event++; + + if (custom_events[i].data) size = custom_events[i].data_size; + if (custom_events[i].strA) size += strlen( custom_events[i].strA ); + + expect_size = offsetof( DEV_BROADCAST_HANDLE, dbch_data[size] ); + ok( handle->dbch_size >= expect_size, + "Unexpected dbch_size=%lu, expected atleast %lu.\n", handle->dbch_size, + expect_size ); + ok( handle->dbch_handle == bus, "Expected dbch_handle=%p, got %p.\n", bus, + handle->dbch_handle ); + ok( handle->dbch_hdevnotify == notify_handle_custom, + "Expected dbch_hdevnotify=%p, got %p.\n", notify_handle_custom, + handle->dbch_hdevnotify ); + + if (handle->dbch_size < expect_size) + { + winetest_pop_context(); + continue; + } + + if (custom_events[i].data) + ok( !memcmp( handle->dbch_data, custom_events[i].data, custom_events[i].data_size ), + "Unexpected dbch_data contents.\n"); + + if (custom_events[i].strA) + { + const CHAR *strA = (CHAR *)&handle->dbch_data[handle->dbch_nameoffset]; + + ok( handle->dbch_nameoffset != -1, "Expected dbch_nameoffset = %lu, got -1.\n", + handle->dbch_nameoffset ); + ok( !strcmp( strA, custom_events[i].strA ), "Expected %s, got %s\n", + debugstr_a( custom_events[i].strA ), debugstr_a( strA ) ); + } + else + ok( handle->dbch_nameoffset == -1, "%lu != -1\n", handle->dbch_nameoffset); + winetest_pop_context(); + } + break; + } } return DefWindowProcA(window, message, wparam, lparam); } @@ -1456,11 +1522,16 @@ static void test_pnp_devices(void) SP_DEVICE_INTERFACE_DETAIL_DATA_A *iface_detail = (void *)buffer; SP_DEVICE_INTERFACE_DATA iface = {sizeof(iface)}; SP_DEVINFO_DATA device = {sizeof(device)}; - DEV_BROADCAST_DEVICEINTERFACE_A filter = + DEV_BROADCAST_DEVICEINTERFACE_A filter_iface = { - .dbcc_size = sizeof(filter), + .dbcc_size = sizeof(filter_iface), .dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE, }; + DEV_BROADCAST_HANDLE filter_handle = + { + .dbch_size = sizeof(filter_handle), + .dbch_devicetype = DBT_DEVTYP_HANDLE, + }; static const WNDCLASSA class = { .lpszClassName = "ntoskrnl_test_wc", @@ -1468,7 +1539,7 @@ static void test_pnp_devices(void) }; HDEVNOTIFY notify_handle; DWORD size, type, dword; - HANDLE bus, child, tmp; + HANDLE child, tmp; OBJECT_ATTRIBUTES attr; UNICODE_STRING string; OVERLAPPED ovl = {0}; @@ -1477,12 +1548,13 @@ static void test_pnp_devices(void) HWND window; BOOL ret; int id; + INT i;
ret = RegisterClassA(&class); ok(ret, "failed to register class\n"); window = CreateWindowA("ntoskrnl_test_wc", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL); ok(!!window, "failed to create window\n"); - notify_handle = RegisterDeviceNotificationA(window, &filter, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES); + notify_handle = RegisterDeviceNotificationA(window, &filter_iface, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES); ok(!!notify_handle, "failed to register window, error %lu\n", GetLastError());
set = SetupDiGetClassDevsA(&control_class, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); @@ -1513,8 +1585,17 @@ static void test_pnp_devices(void) bus = CreateFileA(iface_detail->DevicePath, 0, 0, NULL, OPEN_EXISTING, 0, NULL); ok(bus != INVALID_HANDLE_VALUE, "got error %lu\n", GetLastError());
+ filter_handle.dbch_handle = bus; + notify_handle_custom = RegisterDeviceNotificationA(window, &filter_handle, 0); + todo_wine ok(!!notify_handle_custom, "failed to register for device notifications, error %lu\n", GetLastError()); + ret = DeviceIoControl(bus, IOCTL_WINETEST_BUS_MAIN, NULL, 0, NULL, 0, &size, NULL); ok(ret, "got error %lu\n", GetLastError()); + for (i = 0; i < ARRAY_SIZE(custom_events); i++) + pump_messages(); + todo_wine ok(got_custom_event == ARRAY_SIZE(custom_events), + "got %u custom event messages, expected %d\n", got_custom_event, + (int)ARRAY_SIZE(custom_events));
/* Test IoRegisterDeviceInterface() and IoSetDeviceInterfaceState(). */
@@ -1734,6 +1815,7 @@ static void test_pnp_devices(void) CloseHandle(bus);
UnregisterDeviceNotification(notify_handle); + UnregisterDeviceNotification(notify_handle_custom); DestroyWindow(window); UnregisterClassA("ntoskrnl_test_wc", GetModuleHandleA(NULL)); }
From: Vibhav Pant vibhavp@gmail.com
Instead of using the user-passed DEV_BROADCAST_* value to filter incoming notifications, simplify device_notification_details to precisely reflect filtering semantics, additionally making it a public definition in wine/dbt.h. --- dlls/sechost/service.c | 73 +++++++++++++++++++++++++++--------------- dlls/user32/input.c | 32 ++++++------------ include/Makefile.in | 1 + include/wine/dbt.h | 47 +++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 48 deletions(-) create mode 100644 include/wine/dbt.h
diff --git a/dlls/sechost/service.c b/dlls/sechost/service.c index 788bb61bf48..83bfc42c9c6 100644 --- a/dlls/sechost/service.c +++ b/dlls/sechost/service.c @@ -36,6 +36,8 @@ #include "svcctl.h" #include "plugplay.h"
+#include "wine/dbt.h" + WINE_DEFAULT_DEBUG_CHANNEL(service);
struct notify_data @@ -1976,17 +1978,6 @@ BOOL WINAPI DECLSPEC_HOTPATCH StartServiceCtrlDispatcherW( const SERVICE_TABLE_E return service_run_main_thread(); }
-struct device_notification_details -{ - DWORD (CALLBACK *cb)(HANDLE handle, DWORD flags, DEV_BROADCAST_HDR *header); - HANDLE handle; - union - { - DEV_BROADCAST_HDR header; - DEV_BROADCAST_DEVICEINTERFACE_W iface; - } filter; -}; - static HANDLE device_notify_thread; static struct list device_notify_list = LIST_INIT(device_notify_list);
@@ -1996,23 +1987,33 @@ struct device_notify_registration struct device_notification_details details; };
-static BOOL notification_filter_matches( DEV_BROADCAST_HDR *filter, DEV_BROADCAST_HDR *event ) +static BOOL notification_filter_matches( const struct device_notification_details *filter, const DEV_BROADCAST_HDR *event ) { - if (!filter->dbch_devicetype) return TRUE; - if (filter->dbch_devicetype != event->dbch_devicetype) return FALSE; + if (!filter->devicetype) return TRUE; + if (filter->devicetype != event->dbch_devicetype) return FALSE;
- if (filter->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) + switch (filter->devicetype) { - DEV_BROADCAST_DEVICEINTERFACE_W *filter_iface = (DEV_BROADCAST_DEVICEINTERFACE_W *)filter; - DEV_BROADCAST_DEVICEINTERFACE_W *event_iface = (DEV_BROADCAST_DEVICEINTERFACE_W *)event; - if (filter_iface->dbcc_size == offsetof(DEV_BROADCAST_DEVICEINTERFACE_W, dbcc_classguid)) return TRUE; - return IsEqualGUID( &filter_iface->dbcc_classguid, &event_iface->dbcc_classguid ); + case DBT_DEVTYP_DEVICEINTERFACE: + { + DEV_BROADCAST_DEVICEINTERFACE_W *event_iface = (DEV_BROADCAST_DEVICEINTERFACE_W *)event; + if (filter->filter.deviceinterface.all_classes) return TRUE; + return IsEqualGUID( &filter->filter.deviceinterface.class, + &event_iface->dbcc_classguid ); + } + default: + FIXME( "Filter devicetype %lu not implemented \n", filter->devicetype ); }
- FIXME( "Filter dbch_devicetype %lu not implemented\n", filter->dbch_devicetype ); return TRUE; }
+struct device_notification_details_with_hdevnotify +{ + HDEVNOTIFY notify_handle; + struct device_notification_details details; +}; + static DWORD WINAPI device_notify_proc( void *arg ) { WCHAR endpoint[] = L"\pipe\wine_plugplay"; @@ -2020,7 +2021,7 @@ static DWORD WINAPI device_notify_proc( void *arg ) RPC_WSTR binding_str; DWORD err = ERROR_SUCCESS; struct device_notify_registration *registration; - struct device_notification_details *details_copy; + struct device_notification_details_with_hdevnotify *details_copy; unsigned int details_copy_nelems, details_copy_size; plugplay_rpc_handle handle = NULL; DWORD code = 0; @@ -2087,7 +2088,8 @@ static DWORD WINAPI device_notify_proc( void *arg ) EnterCriticalSection( &service_cs ); LIST_FOR_EACH_ENTRY(registration, &device_notify_list, struct device_notify_registration, entry) { - details_copy[i++] = registration->details; + details_copy[i].details = registration->details; + details_copy[i++].notify_handle = registration; details_copy_nelems++; if (i == details_copy_size) { @@ -2099,8 +2101,10 @@ static DWORD WINAPI device_notify_proc( void *arg )
for (i = 0; i < details_copy_nelems; i++) { - if (!notification_filter_matches( &details_copy[i].filter.header, (DEV_BROADCAST_HDR *)buf )) continue; - details_copy[i].cb( details_copy[i].handle, code, (DEV_BROADCAST_HDR *)buf ); + const struct device_notification_details *details = &details_copy[i].details; + + if (!notification_filter_matches( details, (DEV_BROADCAST_HDR *)buf )) continue; + details->cb( details->handle, code, (DEV_BROADCAST_HDR *)buf ); } MIDL_user_free(buf); } @@ -2119,6 +2123,24 @@ static DWORD WINAPI device_notify_proc( void *arg ) return 0; }
+static inline const char * +debugstr_device_notification_details( const struct device_notification_details *details ) +{ + if (!details) return "(null)"; + switch (details->devicetype) + { + case DBT_DEVTYP_DEVICEINTERFACE: + if (details->filter.deviceinterface.all_classes) + return wine_dbg_sprintf( "{%p %p DBT_DEVTYP_DEVICEINTERFACE {all_classes=1}}", + details->cb, details->handle ); + return wine_dbg_sprintf( "{%p %p DBT_DEVTYP_DEVICEINTERFACE {%s}}", details->cb, + details->handle, + debugstr_guid( &details->filter.deviceinterface.class ) ); + default: + return wine_dbg_sprintf( "{%p %p (unknown %#lx)}", details->cb, details->handle, details->devicetype); + } +} + /****************************************************************************** * I_ScRegisterDeviceNotification (sechost.@) */ @@ -2127,7 +2149,8 @@ HDEVNOTIFY WINAPI I_ScRegisterDeviceNotification( struct device_notification_det { struct device_notify_registration *registration;
- TRACE("callback %p, handle %p, filter %p, flags %#lx\n", details->cb, details->handle, filter, flags); + TRACE( "details %s, filter %p, flags %#lx\n", debugstr_device_notification_details( details ), + filter, flags );
if (!(registration = malloc( sizeof(struct device_notify_registration) ))) { diff --git a/dlls/user32/input.c b/dlls/user32/input.c index b4ee52f3474..c85d10b0761 100644 --- a/dlls/user32/input.c +++ b/dlls/user32/input.c @@ -24,11 +24,15 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include "ntstatus.h" +#define WIN32_NO_STATUS #include "user_private.h" #include "dbt.h" #include "wine/server.h" #include "wine/debug.h"
+#include "wine/dbt.h" + WINE_DEFAULT_DEBUG_CHANNEL(win); WINE_DECLARE_DEBUG_CHANNEL(keyboard);
@@ -530,10 +534,8 @@ static DWORD CALLBACK devnotify_window_callbackA(HANDLE handle, DWORD flags, DEV free( ifaceA ); return 0; } - default: FIXME( "unimplemented W to A mapping for %#lx\n", header->dbch_devicetype ); - /* fall through */ case DBT_DEVTYP_HANDLE: case DBT_DEVTYP_OEM: break; @@ -550,21 +552,6 @@ static DWORD CALLBACK devnotify_service_callback(HANDLE handle, DWORD flags, DEV return 0; }
-struct device_notification_details -{ - DWORD (CALLBACK *cb)(HANDLE handle, DWORD flags, DEV_BROADCAST_HDR *header); - HANDLE handle; - union - { - DEV_BROADCAST_HDR header; - DEV_BROADCAST_DEVICEINTERFACE_W iface; - } filter; -}; - -extern HDEVNOTIFY WINAPI I_ScRegisterDeviceNotification( struct device_notification_details *details, - void *filter, DWORD flags ); -extern BOOL WINAPI I_ScUnregisterDeviceNotification( HDEVNOTIFY handle ); - /*********************************************************************** * RegisterDeviceNotificationA (USER32.@) * @@ -580,7 +567,7 @@ HDEVNOTIFY WINAPI RegisterDeviceNotificationA( HANDLE handle, void *filter, DWOR */ HDEVNOTIFY WINAPI RegisterDeviceNotificationW( HANDLE handle, void *filter, DWORD flags ) { - struct device_notification_details details; + struct device_notification_details details = {0}; DEV_BROADCAST_HDR *header = filter;
TRACE("handle %p, filter %p, flags %#lx\n", handle, filter, flags); @@ -597,21 +584,20 @@ HDEVNOTIFY WINAPI RegisterDeviceNotificationW( HANDLE handle, void *filter, DWOR return NULL; }
- if (!header) details.filter.header.dbch_devicetype = 0; + if (!header) details.devicetype = 0; else if (header->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) { DEV_BROADCAST_DEVICEINTERFACE_W *iface = (DEV_BROADCAST_DEVICEINTERFACE_W *)header; - details.filter.iface = *iface;
+ details.devicetype = DBT_DEVTYP_DEVICEINTERFACE; if (flags & DEVICE_NOTIFY_ALL_INTERFACE_CLASSES) - details.filter.iface.dbcc_size = offsetof( DEV_BROADCAST_DEVICEINTERFACE_W, dbcc_classguid ); + details.filter.deviceinterface.all_classes = TRUE; else - details.filter.iface.dbcc_size = offsetof( DEV_BROADCAST_DEVICEINTERFACE_W, dbcc_name ); + details.filter.deviceinterface.class = iface->dbcc_classguid; } else if (header->dbch_devicetype == DBT_DEVTYP_HANDLE) { FIXME( "DBT_DEVTYP_HANDLE filter type not implemented\n" ); - details.filter.header.dbch_devicetype = 0; } else { diff --git a/include/Makefile.in b/include/Makefile.in index 8d25e40ba05..020282d29cb 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -901,6 +901,7 @@ SOURCES = \ wine/asm.h \ wine/atsvc.idl \ wine/condrv.h \ + wine/dbt.h \ wine/dcetypes.idl \ wine/debug.h \ wine/dplaysp.h \ diff --git a/include/wine/dbt.h b/include/wine/dbt.h new file mode 100644 index 00000000000..702fda17126 --- /dev/null +++ b/include/wine/dbt.h @@ -0,0 +1,47 @@ +/* + * Definitions for registering device notifications + * + * Copyright 2024 Vibhav Pant + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef __WINE_WINE_DBT_H_ +#define __WINE_WINE_DBT_H_ + +#include <wine/debug.h> + +struct device_notification_details +{ + DWORD (CALLBACK *cb)(HANDLE handle, DWORD flags, DEV_BROADCAST_HDR *header); + HANDLE handle; + DWORD devicetype; + union + { + struct + { + /* Used to implement DEVICE_NOTIFY_ALL_INTERFACE_CLASSES. If true, the class field below + * should be ignored. */ + BOOL all_classes; + GUID class; + } deviceinterface; + } filter; +}; + +extern HDEVNOTIFY WINAPI I_ScRegisterDeviceNotification( struct device_notification_details *details, + void *filter, DWORD flags ); +extern BOOL WINAPI I_ScUnregisterDeviceNotification( HDEVNOTIFY handle ); + +#endif /* __WINE_WINE_DBT_H_ */
From: Vibhav Pant vibhavp@gmail.com
--- dlls/ntoskrnl.exe/pnp.c | 6 ++-- dlls/sechost/service.c | 25 ++++++++++++-- dlls/user32/input.c | 72 +++++++++++++++++++++++++++++++++++++-- include/wine/dbt.h | 8 +++++ include/wine/plugplay.idl | 4 +-- programs/plugplay/main.c | 22 +++++++++--- 6 files changed, 122 insertions(+), 15 deletions(-)
diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c index bb10c27fbee..b330a0eacc6 100644 --- a/dlls/ntoskrnl.exe/pnp.c +++ b/dlls/ntoskrnl.exe/pnp.c @@ -744,11 +744,11 @@ static LONG WINAPI rpc_filter( EXCEPTION_POINTERS *eptr ) return I_RpcExceptionFilter( eptr->ExceptionRecord->ExceptionCode ); }
-static void send_devicechange( DWORD code, void *data, unsigned int size ) +static void send_devicechange( DWORD code, const WCHAR *path, void *data, unsigned int size ) { __TRY { - plugplay_send_event( code, data, size ); + plugplay_send_event( code, path, data, size ); } __EXCEPT(rpc_filter) { @@ -864,7 +864,7 @@ NTSTATUS WINAPI IoSetDeviceInterfaceState( UNICODE_STRING *name, BOOLEAN enable broadcast->dbcc_classguid = iface->interface_class; lstrcpynW( broadcast->dbcc_name, name->Buffer, namelen + 1 ); if (namelen > 1) broadcast->dbcc_name[1] = '\'; - send_devicechange( enable ? DBT_DEVICEARRIVAL : DBT_DEVICEREMOVECOMPLETE, broadcast, len ); + send_devicechange( enable ? DBT_DEVICEARRIVAL : DBT_DEVICEREMOVECOMPLETE, L"", broadcast, len ); heap_free( broadcast ); } return ret; diff --git a/dlls/sechost/service.c b/dlls/sechost/service.c index 83bfc42c9c6..307b0f9ce94 100644 --- a/dlls/sechost/service.c +++ b/dlls/sechost/service.c @@ -36,6 +36,7 @@ #include "svcctl.h" #include "plugplay.h"
+#include "wine/heap.h" #include "wine/dbt.h"
WINE_DEFAULT_DEBUG_CHANNEL(service); @@ -1987,7 +1988,8 @@ struct device_notify_registration struct device_notification_details details; };
-static BOOL notification_filter_matches( const struct device_notification_details *filter, const DEV_BROADCAST_HDR *event ) +static BOOL notification_filter_matches( const struct device_notification_details *filter, + const WCHAR *path, const DEV_BROADCAST_HDR *event ) { if (!filter->devicetype) return TRUE; if (filter->devicetype != event->dbch_devicetype) return FALSE; @@ -2001,6 +2003,8 @@ static BOOL notification_filter_matches( const struct device_notification_detail return IsEqualGUID( &filter->filter.deviceinterface.class, &event_iface->dbcc_classguid ); } + case DBT_DEVTYP_HANDLE: + return !wcscmp( path, filter->filter.device.name_info->Name.Buffer ); default: FIXME( "Filter devicetype %lu not implemented \n", filter->devicetype ); } @@ -2027,6 +2031,7 @@ static DWORD WINAPI device_notify_proc( void *arg ) DWORD code = 0; unsigned int i, size; BYTE *buf; + WCHAR *path;
SetThreadDescription( GetCurrentThread(), L"wine_sechost_device_notify" );
@@ -2065,9 +2070,10 @@ static DWORD WINAPI device_notify_proc( void *arg ) for (;;) { buf = NULL; + path = NULL; __TRY { - code = plugplay_get_event( handle, &buf, &size ); + code = plugplay_get_event( handle, &path, &buf, &size ); err = ERROR_SUCCESS; } __EXCEPT(rpc_filter) @@ -2103,10 +2109,17 @@ static DWORD WINAPI device_notify_proc( void *arg ) { const struct device_notification_details *details = &details_copy[i].details;
- if (!notification_filter_matches( details, (DEV_BROADCAST_HDR *)buf )) continue; + if (!notification_filter_matches( details, path, (DEV_BROADCAST_HDR *)buf )) continue; + if (details->devicetype == DBT_DEVTYP_HANDLE) + { + DEV_BROADCAST_HANDLE *handle = (DEV_BROADCAST_HANDLE *)buf; + handle->dbch_handle = details->filter.device.device; + handle->dbch_hdevnotify = details_copy[i].notify_handle; + } details->cb( details->handle, code, (DEV_BROADCAST_HDR *)buf ); } MIDL_user_free(buf); + MIDL_user_free( path ); }
__TRY @@ -2136,6 +2149,10 @@ debugstr_device_notification_details( const struct device_notification_details * return wine_dbg_sprintf( "{%p %p DBT_DEVTYP_DEVICEINTERFACE {%s}}", details->cb, details->handle, debugstr_guid( &details->filter.deviceinterface.class ) ); + case DBT_DEVTYP_HANDLE: + return wine_dbg_sprintf( "{%p %p DBT_DEVTYP_HANDLE {%s %p}}", details->cb, details->handle, + debugstr_w( details->filter.device.name_info->Name.Buffer ), + details->filter.device.device ); default: return wine_dbg_sprintf( "{%p %p (unknown %#lx)}", details->cb, details->handle, details->devicetype); } @@ -2186,6 +2203,8 @@ BOOL WINAPI I_ScUnregisterDeviceNotification( HDEVNOTIFY handle ) EnterCriticalSection( &service_cs ); list_remove( ®istration->entry ); LeaveCriticalSection(&service_cs); + if (registration->details.devicetype == DBT_DEVTYP_HANDLE) + heap_free( registration->details.filter.device.name_info ); free( registration ); return TRUE; } diff --git a/dlls/user32/input.c b/dlls/user32/input.c index c85d10b0761..3afe3f32b32 100644 --- a/dlls/user32/input.c +++ b/dlls/user32/input.c @@ -534,9 +534,49 @@ static DWORD CALLBACK devnotify_window_callbackA(HANDLE handle, DWORD flags, DEV free( ifaceA ); return 0; } + case DBT_DEVTYP_HANDLE: + { + const DEV_BROADCAST_HANDLE *handleW = (const DEV_BROADCAST_HANDLE *)header; + DEV_BROADCAST_HANDLE *handleA; + size_t lenA = 0; + size_t name_lenW = + handleW->dbch_nameoffset == -1 + ? 0 + : wcslen( (WCHAR *)&handleW->dbch_data[handleW->dbch_nameoffset] ); + size_t data_size = + handleW->dbch_nameoffset == -1 + ? handleW->dbch_size - offsetof( DEV_BROADCAST_HANDLE, dbch_data ) + : handleW->dbch_nameoffset + (name_lenW * 3 + 1); + handleA = malloc( offsetof( DEV_BROADCAST_HANDLE, dbch_data[data_size] ) ); + if (!handleA) + return 0; + + handleA->dbch_devicetype = DBT_DEVTYP_HANDLE; + if (handleW->dbch_nameoffset != -1) + { + lenA = WideCharToMultiByte( + CP_ACP, 0, (WCHAR *)&handleW->dbch_data[handleW->dbch_nameoffset], + name_lenW + 1, (CHAR *)&handleA->dbch_data[handleW->dbch_nameoffset], + name_lenW * 3 + 1, NULL, NULL ); + handleA->dbch_size = offsetof( DEV_BROADCAST_HANDLE, + dbch_data[handleW->dbch_nameoffset + lenA + 1] ); + } + else + handleA->dbch_size = handleW->dbch_size; + + handleA->dbch_handle = handleW->dbch_handle; + handleA->dbch_hdevnotify = handleW->dbch_hdevnotify; + handleA->dbch_eventguid = handleW->dbch_eventguid; + handleA->dbch_nameoffset = handleW->dbch_nameoffset; + memcpy( &handleA->dbch_data, &handleW->dbch_data, + handleW->dbch_nameoffset == -1 ? data_size : handleW->dbch_nameoffset ); + SendMessageTimeoutA( handle, WM_DEVICECHANGE, flags, (LPARAM)handleA, SMTO_ABORTIFHUNG, + 2000, NULL ); + free( handleA ); + return 0; + } default: FIXME( "unimplemented W to A mapping for %#lx\n", header->dbch_devicetype ); - case DBT_DEVTYP_HANDLE: case DBT_DEVTYP_OEM: break; } @@ -597,7 +637,35 @@ HDEVNOTIFY WINAPI RegisterDeviceNotificationW( HANDLE handle, void *filter, DWOR } else if (header->dbch_devicetype == DBT_DEVTYP_HANDLE) { - FIXME( "DBT_DEVTYP_HANDLE filter type not implemented\n" ); + OBJECT_NAME_INFORMATION *name_info; + DEV_BROADCAST_HANDLE *handle = (DEV_BROADCAST_HANDLE *)header; + HANDLE device = handle->dbch_handle; + NTSTATUS status; + DWORD size; + + details.devicetype = DBT_DEVTYP_HANDLE; + status = NtQueryObject( device, ObjectNameInformation, NULL, 0, &size ); + if (status != STATUS_INFO_LENGTH_MISMATCH) + { + SetLastError( RtlNtStatusToDosError( status ) ); + return NULL; + } + name_info = heap_alloc( size ); + if (!name_info) + { + SetLastError( ERROR_NOT_ENOUGH_MEMORY ); + return NULL; + } + + status = NtQueryObject( device, ObjectNameInformation, name_info, size, 0 ); + if (status != STATUS_SUCCESS) + { + SetLastError( RtlNtStatusToDosError( status )); + heap_free( name_info ); + return NULL; + } + details.filter.device.name_info = name_info; + details.filter.device.device = handle->dbch_handle; } else { diff --git a/include/wine/dbt.h b/include/wine/dbt.h index 702fda17126..b8a82a87b08 100644 --- a/include/wine/dbt.h +++ b/include/wine/dbt.h @@ -37,6 +37,14 @@ struct device_notification_details BOOL all_classes; GUID class; } deviceinterface; + struct + { + /* The path for the device file the notification is originating from. */ + OBJECT_NAME_INFORMATION *name_info; + /* HANDLE to the device the event originates from. Is passed to the callback as-is, even + * if the user has closed this handle. */ + HANDLE device; + } device; } filter; };
diff --git a/include/wine/plugplay.idl b/include/wine/plugplay.idl index a3e7b04bf30..04272457390 100644 --- a/include/wine/plugplay.idl +++ b/include/wine/plugplay.idl @@ -28,7 +28,7 @@ interface plugplay typedef [context_handle] void *plugplay_rpc_handle;
plugplay_rpc_handle plugplay_register_listener(); - DWORD plugplay_get_event([in] plugplay_rpc_handle handle, [out, size_is(,*size)] BYTE **data, [out] unsigned int *size); + DWORD plugplay_get_event([in] plugplay_rpc_handle handle, [out, string] WCHAR **path, [out, size_is(,*size)] BYTE **data, [out] unsigned int *size); void plugplay_unregister_listener([in] plugplay_rpc_handle handle); - void plugplay_send_event([in] DWORD event_code, [in, size_is(size)] const BYTE *data, [in] unsigned int size); + void plugplay_send_event([in] DWORD event_code, [in, string] const WCHAR *path, [in, size_is(size)] const BYTE *data, [in] unsigned int size); } diff --git a/programs/plugplay/main.c b/programs/plugplay/main.c index 8426f2204a3..6e52a3b710d 100644 --- a/programs/plugplay/main.c +++ b/programs/plugplay/main.c @@ -64,6 +64,7 @@ struct event { struct list entry; DWORD code; + WCHAR *path; BYTE *data; unsigned int size; }; @@ -108,7 +109,7 @@ plugplay_rpc_handle __cdecl plugplay_register_listener(void) return listener; }
-DWORD __cdecl plugplay_get_event( plugplay_rpc_handle handle, BYTE **data, unsigned int *size ) +DWORD __cdecl plugplay_get_event( plugplay_rpc_handle handle, WCHAR **path, BYTE **data, unsigned int *size ) { struct listener *listener = handle; struct event *event; @@ -128,6 +129,7 @@ DWORD __cdecl plugplay_get_event( plugplay_rpc_handle handle, BYTE **data, unsig ret = event->code; *data = event->data; *size = event->size; + *path = event->path; free( event ); return ret; } @@ -137,14 +139,17 @@ void __cdecl plugplay_unregister_listener( plugplay_rpc_handle handle ) destroy_listener( handle ); }
-void __cdecl plugplay_send_event( DWORD code, const BYTE *data, unsigned int size ) +void __cdecl plugplay_send_event( DWORD code, const WCHAR *path, const BYTE *data, unsigned int size ) { struct listener *listener; struct event *event; + const DEV_BROADCAST_HDR *header = (const DEV_BROADCAST_HDR *)data;
- BroadcastSystemMessageW( 0, NULL, WM_DEVICECHANGE, code, (LPARAM)data ); - BroadcastSystemMessageW( 0, NULL, WM_DEVICECHANGE, DBT_DEVNODES_CHANGED, 0 ); - + if (header->dbch_devicetype == DBT_DEVTYP_DEVICEINTERFACE) + { + BroadcastSystemMessageW( 0, NULL, WM_DEVICECHANGE, code, (LPARAM)data ); + BroadcastSystemMessageW( 0, NULL, WM_DEVICECHANGE, DBT_DEVNODES_CHANGED, 0 ); + } EnterCriticalSection( &plugplay_cs );
LIST_FOR_EACH_ENTRY(listener, &listener_list, struct listener, entry) @@ -158,6 +163,13 @@ void __cdecl plugplay_send_event( DWORD code, const BYTE *data, unsigned int siz break; }
+ event->path = NULL; + if (!(event->path = wcsdup( path ))) + { + free( event ); + break; + } + event->code = code; memcpy( event->data, data, size ); event->size = size;
From: Vibhav Pant vibhavp@gmail.com
--- dlls/ntoskrnl.exe/pnp.c | 51 ++++++++++++++++++++++++++-- dlls/ntoskrnl.exe/tests/driver_pnp.c | 2 +- dlls/ntoskrnl.exe/tests/ntoskrnl.c | 8 ++--- 3 files changed, 53 insertions(+), 8 deletions(-)
diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c index b330a0eacc6..13e6005c239 100644 --- a/dlls/ntoskrnl.exe/pnp.c +++ b/dlls/ntoskrnl.exe/pnp.c @@ -1001,10 +1001,55 @@ NTSTATUS WINAPI IoRegisterDeviceInterface(DEVICE_OBJECT *device, const GUID *cla return status; }
-NTSTATUS WINAPI IoReportTargetDeviceChange( DEVICE_OBJECT *pdo, void *notification ) +/*********************************************************************** + * IoReportTargetDeviceChange (NTOSKRNL.EXE.@) + */ +NTSTATUS WINAPI IoReportTargetDeviceChange( DEVICE_OBJECT *pdo, VOID *n ) { - FIXME( "(%p, %p) stub!\n", pdo, notification ); - return STATUS_NOT_SUPPORTED; + OBJECT_NAME_INFORMATION *name_info; + DEV_BROADCAST_HANDLE *event_handle; + DWORD data_size; + TARGET_DEVICE_CUSTOM_NOTIFICATION *notification = n; + ULONG size; + NTSTATUS ret; + + TRACE( "(%p, %p)\n", pdo, n ); + + if (notification->Version != 1) + return STATUS_INVALID_PARAMETER; + + ret = ObQueryNameString( pdo, NULL, 0, &size ); + if (ret != STATUS_INFO_LENGTH_MISMATCH) + return ret; + + name_info = heap_alloc( size ); + if (!name_info) + return STATUS_NO_MEMORY; + + ret = ObQueryNameString( pdo, name_info, size, &size ); + if (ret != STATUS_SUCCESS) return ret; + + data_size = notification->Size - offsetof(TARGET_DEVICE_CUSTOM_NOTIFICATION, CustomDataBuffer); + if (notification->NameBufferOffset != -1 && notification->CustomDataBuffer[data_size - 1] != '\0') + data_size++; + event_handle = heap_alloc_zero( offsetof( DEV_BROADCAST_HANDLE, dbch_data[data_size] ) ); + if (!event_handle) + { + heap_free( name_info ); + return STATUS_NO_MEMORY; + } + event_handle->dbch_size = offsetof( DEV_BROADCAST_HANDLE, dbch_data[data_size] ); + event_handle->dbch_devicetype = DBT_DEVTYP_HANDLE; + event_handle->dbch_eventguid = notification->Event; + event_handle->dbch_nameoffset = notification->NameBufferOffset; + memcpy( event_handle->dbch_data, notification->CustomDataBuffer, + notification->Size - + offsetof( TARGET_DEVICE_CUSTOM_NOTIFICATION, CustomDataBuffer[1] ) ); + send_devicechange( DBT_CUSTOMEVENT, name_info->Name.Buffer, (BYTE *)event_handle, event_handle->dbch_size ); + heap_free( event_handle ); + heap_free( name_info ); + + return STATUS_SUCCESS; }
/*********************************************************************** diff --git a/dlls/ntoskrnl.exe/tests/driver_pnp.c b/dlls/ntoskrnl.exe/tests/driver_pnp.c index e79edae7125..210da969bfc 100644 --- a/dlls/ntoskrnl.exe/tests/driver_pnp.c +++ b/dlls/ntoskrnl.exe/tests/driver_pnp.c @@ -722,7 +722,7 @@ static void test_devicechange( DEVICE_OBJECT *obj ) notif->NameBufferOffset = -1;
status = IoReportTargetDeviceChange( obj, notif ); - todo_wine ok( status == STATUS_SUCCESS, "IoReportTargetDeviceChange failed, status %#lx size %d,\n", status, notif->Size ); + ok( status == STATUS_SUCCESS, "IoReportTargetDeviceChange failed, status %#lx size %d,\n", status, notif->Size ); ExFreePool( notif ); winetest_pop_context(); } diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c index ea011e9e397..ff707186c15 100644 --- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c @@ -1587,15 +1587,15 @@ static void test_pnp_devices(void)
filter_handle.dbch_handle = bus; notify_handle_custom = RegisterDeviceNotificationA(window, &filter_handle, 0); - todo_wine ok(!!notify_handle_custom, "failed to register for device notifications, error %lu\n", GetLastError()); + ok(!!notify_handle_custom, "failed to register for device notifications, error %lu\n", GetLastError());
ret = DeviceIoControl(bus, IOCTL_WINETEST_BUS_MAIN, NULL, 0, NULL, 0, &size, NULL); ok(ret, "got error %lu\n", GetLastError()); for (i = 0; i < ARRAY_SIZE(custom_events); i++) pump_messages(); - todo_wine ok(got_custom_event == ARRAY_SIZE(custom_events), - "got %u custom event messages, expected %d\n", got_custom_event, - (int)ARRAY_SIZE(custom_events)); + ok(got_custom_event == ARRAY_SIZE(custom_events), + "got %u custom event messages, expected %d\n", got_custom_event, + (int)ARRAY_SIZE(custom_events));
/* Test IoRegisterDeviceInterface() and IoSetDeviceInterfaceState(). */
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=148741
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w7u_adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w7u_el (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w8adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w864 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064v1507 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064v1809 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064_tsign (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w10pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w10pro64_en_AE_u8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w11pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w7pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w864 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064v1507 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064v1809 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064_2qxl (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064_adm (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064_tsign (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w10pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w10pro64_ar (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w10pro64_ja (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w10pro64_zh_CN (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w11pro64_amd (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w7u_adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w7u_el (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w8adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w864 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064v1507 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064v1809 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064_tsign (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w10pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w10pro64_en_AE_u8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w11pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w7pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w864 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064v1507 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064v1809 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064_2qxl (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064_adm (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064_tsign (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w10pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w10pro64_ar (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w10pro64_ja (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w10pro64_zh_CN (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w11pro64_amd (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w7u_adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w7u_el (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w8adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w864 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064v1507 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064v1809 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064_tsign (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w10pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w10pro64_en_AE_u8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w11pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w7pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w864 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064v1507 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064v1809 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064_2qxl (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064_adm (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064_tsign (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w10pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w10pro64_ar (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w10pro64_ja (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w10pro64_zh_CN (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w11pro64_amd (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w7u_adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w7u_el (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w8adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w864 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064v1507 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064v1809 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064_tsign (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w10pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w10pro64_en_AE_u8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w11pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w7pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w864 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064v1507 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064v1809 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064_2qxl (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064_adm (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064_tsign (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w10pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w10pro64_ar (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w10pro64_ja (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w10pro64_zh_CN (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w11pro64_amd (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w7u_adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w7u_el (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w8adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w864 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064v1507 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064v1809 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064_tsign (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w10pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w10pro64_en_AE_u8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w11pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w7pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w864 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064v1507 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064v1809 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064_2qxl (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064_adm (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064_tsign (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w10pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w10pro64_ar (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w10pro64_ja (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w10pro64_zh_CN (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w11pro64_amd (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: ntoskrnl.c:1590: Test failed: failed to register for device notifications, error 1066 ntoskrnl.c:1596: Test failed: got 0 custom event messages, expected 4 ntoskrnl.c:1725: Test failed: got size 488 ntoskrnl.c:1726: Test failed: got hardware IDs "\x05\x00\x00\x00\\x00w\x00\x04\x00\x00\x00e\x00t\x00e\x00s\x00\x04\x00\x00\x00\xa8\xf1=\x00\x00\x00\x00\x00R\x00O\x00O\x00T\x00\\x00W\x00I\x00N\x00E\x00T\x00E\x00S\x00T\x00\\x000\x00\x00\x00i\x00n\x00e\x00t\x00e\x00s\x00t\x00.\x00i\x00n\x00f\x00\x00\x00\x00\x00\x00\x00\xcaj\xf4t\x93\x90\"... ntoskrnl.c:1733: Test failed: got size 488 ntoskrnl.c:1734: Test failed: got container ID L"" ntoskrnl.c:1740: Test failed: got size 488 ntoskrnl.c:1741: Test failed: got compatible IDs "\x05\x00\x00\x00\\x00w\x00\x04\x00\x00\x00e\x00t\x00e\x00s\x00\x04\x00\x00\x00\xa8\xf1=\x00\x00\x00\x00\x00R\x00O\x00O\x00T\x00\\x00W\x00I\x00N\x00E\x00T\x00E\x00S\x00T\x00\\x000\x00\x00\x00i\x00n\x00e\x00t\x00e\x00s\x00t\x00.\x00i\x00n\x00f\x00\x00\x00\x00\x00\x00\x00\xcaj\xf4t\x93\x90\"... ntoskrnl.c:1775: Test failed: got size 488 ntoskrnl.c:1785: Test failed: got size 488 ntoskrnl.c:1804: Test failed: got size 488
=== w7u_el (32 bit report) ===
ntoskrnl.exe: ntoskrnl.c:1590: Test failed: failed to register for device notifications, error 1066 ntoskrnl.c:1596: Test failed: got 0 custom event messages, expected 4 ntoskrnl.c:1725: Test failed: got size 488 ntoskrnl.c:1726: Test failed: got hardware IDs "\x05\x00\x00\x00\\x00w\x00\x04\x00\x00\x00e\x00t\x00e\x00s\x00\x04\x00\x00\x00\xcc\xef'\x00\x00\x00\x00\x00R\x00O\x00O\x00T\x00\\x00W\x00I\x00N\x00E\x00T\x00E\x00S\x00T\x00\\x000\x00\x00\x00i\x00n\x00e\x00t\x00e\x00s\x00t\x00.\x00i\x00n\x00f\x00\x00\x00\x00\x00\x00\x00\xcaj\x0euj\x7fCG\x02"... ntoskrnl.c:1733: Test failed: got size 488 ntoskrnl.c:1734: Test failed: got container ID L"" ntoskrnl.c:1740: Test failed: got size 488 ntoskrnl.c:1741: Test failed: got compatible IDs "\x05\x00\x00\x00\\x00w\x00\x04\x00\x00\x00e\x00t\x00e\x00s\x00\x04\x00\x00\x00\xcc\xef'\x00\x00\x00\x00\x00R\x00O\x00O\x00T\x00\\x00W\x00I\x00N\x00E\x00T\x00E\x00S\x00T\x00\\x000\x00\x00\x00i\x00n\x00e\x00t\x00e\x00s\x00t\x00.\x00i\x00n\x00f\x00\x00\x00\x00\x00\x00\x00\xcaj\x0euj\x7fCG\x02"... ntoskrnl.c:1775: Test failed: got size 488 ntoskrnl.c:1785: Test failed: got size 488 ntoskrnl.c:1804: Test failed: got size 488
=== w8 (testbot log) ===
WineRunTask.pl:error: An error occurred while waiting for the test to complete: the 3128 process does not exist or is not a child process WineRunTask.pl:error: The test VM has crashed, rebooted or lost connectivity (or the TestAgent server died)
=== w1064_tsign (testbot log) ===
WineRunTask.pl:error: An error occurred while waiting for the test to complete: the 7684 process does not exist or is not a child process WineRunTask.pl:error: The test VM has crashed, rebooted or lost connectivity (or the TestAgent server died)
=== debian11 (32 bit report) ===
user32: monitor.c:3584: Test failed: got MDT_ANGULAR_DPI x 96 monitor.c:3585: Test failed: got MDT_ANGULAR_DPI y 96 monitor.c:3601: Test failed: got MDT_RAW_DPI x 96 monitor.c:3602: Test failed: got MDT_RAW_DPI y 96 monitor.c:3202: Test failed: ctx 00000000: got SM_CXSCREEN 1024 monitor.c:3204: Test failed: ctx 00000000: got SM_CYSCREEN 768 monitor.c:3213: Test failed: ctx 00000000: got HORZRES 1024 monitor.c:3215: Test failed: ctx 00000000: got VERTRES 768 monitor.c:3220: Test failed: ctx 00000000: got dwFlags 0 monitor.c:3222: Test failed: ctx 00000000: got rect (1024,0)-(2048,768) monitor.c:3202: Test failed: ctx FFFFFFFF: got SM_CXSCREEN 1024 monitor.c:3204: Test failed: ctx FFFFFFFF: got SM_CYSCREEN 768 monitor.c:3213: Test failed: ctx FFFFFFFF: got HORZRES 1024 monitor.c:3215: Test failed: ctx FFFFFFFF: got VERTRES 768 monitor.c:3220: Test failed: ctx FFFFFFFF: got dwFlags 0 monitor.c:3222: Test failed: ctx FFFFFFFF: got rect (1024,0)-(2048,768) monitor.c:3202: Test failed: ctx FFFFFFFE: got SM_CXSCREEN 1024 monitor.c:3204: Test failed: ctx FFFFFFFE: got SM_CYSCREEN 768 monitor.c:3213: Test failed: ctx FFFFFFFE: got HORZRES 1024 monitor.c:3215: Test failed: ctx FFFFFFFE: got VERTRES 768 monitor.c:3220: Test failed: ctx FFFFFFFE: got dwFlags 0 monitor.c:3222: Test failed: ctx FFFFFFFE: got rect (1024,0)-(2048,768) monitor.c:3202: Test failed: ctx FFFFFFFD: got SM_CXSCREEN 1024 monitor.c:3204: Test failed: ctx FFFFFFFD: got SM_CYSCREEN 768 monitor.c:3213: Test failed: ctx FFFFFFFD: got HORZRES 1024 monitor.c:3215: Test failed: ctx FFFFFFFD: got VERTRES 768 monitor.c:3220: Test failed: ctx FFFFFFFD: got dwFlags 0 monitor.c:3221: Test failed: ctx FFFFFFFD: got rect (1024,0)-(2048,768) monitor.c:3202: Test failed: ctx FFFFFFFC: got SM_CXSCREEN 1024 monitor.c:3204: Test failed: ctx FFFFFFFC: got SM_CYSCREEN 768 monitor.c:3213: Test failed: ctx FFFFFFFC: got HORZRES 1024 monitor.c:3215: Test failed: ctx FFFFFFFC: got VERTRES 768 monitor.c:3220: Test failed: ctx FFFFFFFC: got dwFlags 0 monitor.c:3221: Test failed: ctx FFFFFFFC: got rect (1024,0)-(2048,768) monitor.c:3202: Test failed: ctx FFFFFFFB: got SM_CXSCREEN 1024 monitor.c:3204: Test failed: ctx FFFFFFFB: got SM_CYSCREEN 768 monitor.c:3213: Test failed: ctx FFFFFFFB: got HORZRES 1024 monitor.c:3215: Test failed: ctx FFFFFFFB: got VERTRES 768 monitor.c:3220: Test failed: ctx FFFFFFFB: got dwFlags 0 monitor.c:3222: Test failed: ctx FFFFFFFB: got rect (1024,0)-(2048,768) monitor.c:3202: Test failed: ctx 00007811: got SM_CXSCREEN 1024 monitor.c:3204: Test failed: ctx 00007811: got SM_CYSCREEN 768 monitor.c:3213: Test failed: ctx 00007811: got HORZRES 1024 monitor.c:3215: Test failed: ctx 00007811: got VERTRES 768 monitor.c:3220: Test failed: ctx 00007811: got dwFlags 0 monitor.c:3222: Test failed: ctx 00007811: got rect (1024,0)-(2048,768) win.c:10657: Test failed: GetActiveWindow() = 006D00F2 win.c:10657: Test failed: GetFocus() = 006D00F2
=== debian11b (64 bit WoW report) ===
user32: input.c:4305: Test succeeded inside todo block: button_down_hwnd_todo 1: got MSG_TEST_WIN hwnd 00000000007B00E8, msg WM_LBUTTONDOWN, wparam 0x1, lparam 0x320032
Made various changes and opened https://gitlab.winehq.org/wine/wine/-/merge_requests/6610. I moved the tests to dinput which had RegisterDeviceNotification tests already and doesn't crash the windows kernel.
On Wed Oct 2 21:09:26 2024 +0000, Rémi Bernon wrote:
Made various changes and opened https://gitlab.winehq.org/wine/wine/-/merge_requests/6610. I moved the tests to dinput which had RegisterDeviceNotification tests already and doesn't crash the windows kernel.
Ah, that's much better. I'll close this MR. Thank you!
This merge request was closed by Vibhav Pant.