[PATCH v2 0/4] MR2185: ntoskrnl: PnP device case.
-- v2: Revert "ntoskrnl.exe: Enforce path case in WM_DEVICECHANGE notifications." ntoskrnl: Preserve the device instance ID case in IoRegisterDeviceInterface(). ntoskrnl/tests: Expand tests for device and interface naming. user32: Map DEV_BROADCAST_DEVICEINTERFACE to ANSI for registered device notifications. https://gitlab.winehq.org/wine/wine/-/merge_requests/2185
From: Zebediah Figura <zfigura(a)codeweavers.com> --- dlls/ntoskrnl.exe/tests/ntoskrnl.c | 4 +-- dlls/user32/input.c | 46 ++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c index ff93cfc98ec..c4521ed652a 100644 --- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c @@ -1400,7 +1400,7 @@ static LRESULT WINAPI device_notify_proc(HWND window, UINT message, WPARAM wpara if (IsEqualGUID(&iface->dbcc_classguid, &bus_class)) { ++got_bus_arrival; - todo_wine ok(!strcmp(iface->dbcc_name, "\\\\?\\ROOT#WINETEST#0#{deadbeef-29ef-4538-a5fd-b69573a362c1}"), + ok(!strcmp(iface->dbcc_name, "\\\\?\\ROOT#WINETEST#0#{deadbeef-29ef-4538-a5fd-b69573a362c1}"), "got name %s\n", debugstr_a(iface->dbcc_name)); } else if (IsEqualGUID(&iface->dbcc_classguid, &child_class)) @@ -1428,7 +1428,7 @@ static LRESULT WINAPI device_notify_proc(HWND window, UINT message, WPARAM wpara if (IsEqualGUID(&iface->dbcc_classguid, &bus_class)) { ++got_bus_removal; - todo_wine ok(!strcmp(iface->dbcc_name, "\\\\?\\ROOT#WINETEST#0#{deadbeef-29ef-4538-a5fd-b69573a362c1}"), + ok(!strcmp(iface->dbcc_name, "\\\\?\\ROOT#WINETEST#0#{deadbeef-29ef-4538-a5fd-b69573a362c1}"), "got name %s\n", debugstr_a(iface->dbcc_name)); } else if (IsEqualGUID(&iface->dbcc_classguid, &child_class)) diff --git a/dlls/user32/input.c b/dlls/user32/input.c index 3b0a13842c8..2f4dc06f6ce 100644 --- a/dlls/user32/input.c +++ b/dlls/user32/input.c @@ -495,12 +495,52 @@ BOOL WINAPI UnloadKeyboardLayout( HKL layout ) } -static DWORD CALLBACK devnotify_window_callback(HANDLE handle, DWORD flags, DEV_BROADCAST_HDR *header) +static DWORD CALLBACK devnotify_window_callbackW(HANDLE handle, DWORD flags, DEV_BROADCAST_HDR *header) { SendMessageTimeoutW(handle, WM_DEVICECHANGE, flags, (LPARAM)header, SMTO_ABORTIFHUNG, 2000, NULL); return 0; } +static DWORD CALLBACK devnotify_window_callbackA(HANDLE handle, DWORD flags, DEV_BROADCAST_HDR *header) +{ + if (flags & 0x8000) + { + switch (header->dbch_devicetype) + { + case DBT_DEVTYP_DEVICEINTERFACE: + { + const DEV_BROADCAST_DEVICEINTERFACE_W *ifaceW = (const DEV_BROADCAST_DEVICEINTERFACE_W *)header; + size_t lenW = wcslen( ifaceW->dbcc_name ); + DEV_BROADCAST_DEVICEINTERFACE_A *ifaceA; + DWORD lenA; + + if (!(ifaceA = malloc( offsetof(DEV_BROADCAST_DEVICEINTERFACE_A, dbcc_name[lenW * 3 + 1]) ))) + return 0; + lenA = WideCharToMultiByte( CP_ACP, 0, ifaceW->dbcc_name, lenW + 1, + ifaceA->dbcc_name, lenW * 3 + 1, NULL, NULL ); + + ifaceA->dbcc_size = offsetof(DEV_BROADCAST_DEVICEINTERFACE_A, dbcc_name[lenA + 1]); + ifaceA->dbcc_devicetype = ifaceW->dbcc_devicetype; + ifaceA->dbcc_reserved = ifaceW->dbcc_reserved; + ifaceA->dbcc_classguid = ifaceW->dbcc_classguid; + SendMessageTimeoutA( handle, WM_DEVICECHANGE, flags, (LPARAM)ifaceA, SMTO_ABORTIFHUNG, 2000, NULL ); + 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; + } + } + + SendMessageTimeoutA( handle, WM_DEVICECHANGE, flags, (LPARAM)header, SMTO_ABORTIFHUNG, 2000, NULL ); + return 0; +} + static DWORD CALLBACK devnotify_service_callback(HANDLE handle, DWORD flags, DEV_BROADCAST_HDR *header) { FIXME("Support for service handles is not yet implemented!\n"); @@ -580,8 +620,10 @@ HDEVNOTIFY WINAPI RegisterDeviceNotificationW( HANDLE handle, void *filter, DWOR if (flags & DEVICE_NOTIFY_SERVICE_HANDLE) details.cb = devnotify_service_callback; + else if (IsWindowUnicode( handle )) + details.cb = devnotify_window_callbackW; else - details.cb = devnotify_window_callback; + details.cb = devnotify_window_callbackA; return I_ScRegisterDeviceNotification( &details, filter, 0 ); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/2185
From: Zebediah Figura <zfigura(a)codeweavers.com> --- dlls/ntoskrnl.exe/tests/driver_pnp.c | 20 ++++++++++++++++++++ dlls/ntoskrnl.exe/tests/ntoskrnl.c | 22 +++++++++++++++++----- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/dlls/ntoskrnl.exe/tests/driver_pnp.c b/dlls/ntoskrnl.exe/tests/driver_pnp.c index 9a965f584cd..50b3ce29d58 100644 --- a/dlls/ntoskrnl.exe/tests/driver_pnp.c +++ b/dlls/ntoskrnl.exe/tests/driver_pnp.c @@ -34,6 +34,19 @@ #include "driver.h" #include "utils.h" +/* memcmp() isn't exported from ntoskrnl on i386 */ +static int kmemcmp( const void *ptr1, const void *ptr2, size_t n ) +{ + const unsigned char *p1, *p2; + + for (p1 = ptr1, p2 = ptr2; n; n--, p1++, p2++) + { + if (*p1 < *p2) return -1; + if (*p1 > *p2) return 1; + } + return 0; +} + 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 UNICODE_STRING control_symlink, bus_symlink; @@ -256,6 +269,7 @@ static NTSTATUS pdo_pnp(DEVICE_OBJECT *device_obj, IRP *irp) case IRP_MN_START_DEVICE: { + static const WCHAR expect_symlink[] = L"\\??\\Wine#Test#1#{deadbeef-29ef-4538-a5fd-b69573a362c2}"; static const LARGE_INTEGER wait_time = {.QuadPart = -500 * 10000}; POWER_STATE state = {.DeviceState = PowerDeviceD0}; NTSTATUS status; @@ -267,6 +281,12 @@ static NTSTATUS pdo_pnp(DEVICE_OBJECT *device_obj, IRP *irp) status = IoRegisterDeviceInterface(device_obj, &child_class, NULL, &device->child_symlink); ok(!status, "Failed to register interface, status %#lx.\n", status); + ok(device->child_symlink.Length == sizeof(expect_symlink) - sizeof(WCHAR), + "Got length %u.\n", device->child_symlink.Length); + ok(device->child_symlink.MaximumLength == sizeof(expect_symlink), + "Got maximum length %u.\n", device->child_symlink.MaximumLength); + todo_wine ok(!kmemcmp(device->child_symlink.Buffer, expect_symlink, device->child_symlink.MaximumLength), + "Got symlink \"%ls\".\n", device->child_symlink.Buffer); IoSetDeviceInterfaceState(&device->child_symlink, TRUE); diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c index c4521ed652a..c5362e3fb2b 100644 --- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c @@ -1406,7 +1406,7 @@ static LRESULT WINAPI device_notify_proc(HWND window, UINT message, WPARAM wpara else if (IsEqualGUID(&iface->dbcc_classguid, &child_class)) { ++got_child_arrival; - todo_wine ok(!strcmp(iface->dbcc_name, "\\\\?\\wine#test#1#{deadbeef-29ef-4538-a5fd-b69573a362c2}"), + todo_wine ok(!strcmp(iface->dbcc_name, "\\\\?\\Wine#Test#1#{deadbeef-29ef-4538-a5fd-b69573a362c2}"), "got name %s\n", debugstr_a(iface->dbcc_name)); } break; @@ -1434,7 +1434,7 @@ static LRESULT WINAPI device_notify_proc(HWND window, UINT message, WPARAM wpara else if (IsEqualGUID(&iface->dbcc_classguid, &child_class)) { ++got_child_removal; - todo_wine ok(!strcmp(iface->dbcc_name, "\\\\?\\wine#test#1#{deadbeef-29ef-4538-a5fd-b69573a362c2}"), + todo_wine ok(!strcmp(iface->dbcc_name, "\\\\?\\Wine#Test#1#{deadbeef-29ef-4538-a5fd-b69573a362c2}"), "got name %s\n", debugstr_a(iface->dbcc_name)); } break; @@ -1506,7 +1506,7 @@ static void test_pnp_devices(void) ret = SetupDiGetDeviceInstanceIdA(set, &device, buffer, sizeof(buffer), NULL); ok(ret, "failed to get device ID, error %#lx\n", GetLastError()); - ok(!strcasecmp(buffer, "root\\winetest\\0"), "got ID %s\n", debugstr_a(buffer)); + ok(!strcmp(buffer, "ROOT\\WINETEST\\0"), "got ID %s\n", debugstr_a(buffer)); ret = SetupDiEnumDeviceInterfaces(set, NULL, &control_class, 0, &iface); ok(ret, "failed to get interface, error %#lx\n", GetLastError()); @@ -1517,7 +1517,7 @@ static void test_pnp_devices(void) iface_detail->cbSize = sizeof(*iface_detail); ret = SetupDiGetDeviceInterfaceDetailA(set, &iface, iface_detail, sizeof(buffer), NULL, NULL); ok(ret, "failed to get interface path, error %#lx\n", GetLastError()); - ok(!strcasecmp(iface_detail->DevicePath, "\\\\?\\root#winetest#0#{deadbeef-29ef-4538-a5fd-b69573a362c0}"), + ok(!strcmp(iface_detail->DevicePath, "\\\\?\\root#winetest#0#{deadbeef-29ef-4538-a5fd-b69573a362c0}"), "wrong path %s\n", debugstr_a(iface_detail->DevicePath)); SetupDiDestroyDeviceInfoList(set); @@ -1614,7 +1614,7 @@ static void test_pnp_devices(void) ret = SetupDiGetDeviceInstanceIdA(set, &device, buffer, sizeof(buffer), NULL); ok(ret, "failed to get device ID, error %#lx\n", GetLastError()); - ok(!strcasecmp(buffer, "wine\\test\\1"), "got ID %s\n", debugstr_a(buffer)); + ok(!strcmp(buffer, "WINE\\TEST\\1"), "got ID %s\n", debugstr_a(buffer)); ret = SetupDiGetDeviceRegistryPropertyA(set, &device, SPDRP_CAPABILITIES, &type, (BYTE *)&dword, sizeof(dword), NULL); @@ -1680,6 +1680,18 @@ static void test_pnp_devices(void) ok(!strcmp(buffer, "\\Device\\winetest_pnp_1"), "got PDO name %s\n", debugstr_a(buffer)); } + ret = SetupDiEnumDeviceInterfaces(set, NULL, &child_class, 0, &iface); + ok(ret, "failed to get interface, error %#lx\n", GetLastError()); + ok(IsEqualGUID(&iface.InterfaceClassGuid, &child_class), + "wrong class %s\n", debugstr_guid(&iface.InterfaceClassGuid)); + ok(iface.Flags == SPINT_ACTIVE, "got flags %#lx\n", iface.Flags); + + iface_detail->cbSize = sizeof(*iface_detail); + ret = SetupDiGetDeviceInterfaceDetailA(set, &iface, iface_detail, sizeof(buffer), NULL, NULL); + ok(ret, "failed to get interface path, error %#lx\n", GetLastError()); + ok(!strcmp(iface_detail->DevicePath, "\\\\?\\wine#test#1#{deadbeef-29ef-4538-a5fd-b69573a362c2}"), + "wrong path %s\n", debugstr_a(iface_detail->DevicePath)); + SetupDiDestroyDeviceInfoList(set); RtlInitUnicodeString(&string, L"\\Device\\winetest_pnp_1"); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/2185
From: Zebediah Figura <zfigura(a)codeweavers.com> --- dlls/ntoskrnl.exe/pnp.c | 40 ++++++++++++++++------------ dlls/ntoskrnl.exe/tests/driver_pnp.c | 2 +- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c index 7c77a9a7145..36ceeac8dae 100644 --- a/dlls/ntoskrnl.exe/pnp.c +++ b/dlls/ntoskrnl.exe/pnp.c @@ -883,13 +883,12 @@ NTSTATUS WINAPI IoRegisterDeviceInterface(DEVICE_OBJECT *device, const GUID *cla SP_DEVICE_INTERFACE_DATA sp_iface = {sizeof(sp_iface)}; SP_DEVINFO_DATA sp_device = {sizeof(sp_device)}; WCHAR device_instance_id[MAX_DEVICE_ID_LEN]; - SP_DEVICE_INTERFACE_DETAIL_DATA_W *data; NTSTATUS status = STATUS_SUCCESS; UNICODE_STRING device_path; struct device_interface *iface; struct wine_rb_entry *entry; - DWORD required; HDEVINFO set; + WCHAR *p; TRACE("device %p, class_guid %s, refstr %s, symbolic_link %p.\n", device, debugstr_guid(class_guid), debugstr_us(refstr), symbolic_link); @@ -910,22 +909,31 @@ NTSTATUS WINAPI IoRegisterDeviceInterface(DEVICE_OBJECT *device, const GUID *cla if (!SetupDiCreateDeviceInterfaceW( set, &sp_device, class_guid, refstr ? refstr->Buffer : NULL, 0, &sp_iface )) return STATUS_UNSUCCESSFUL; - required = 0; - SetupDiGetDeviceInterfaceDetailW( set, &sp_iface, NULL, 0, &required, NULL ); - if (required == 0) return STATUS_UNSUCCESSFUL; + /* setupapi mangles the case; construct the interface path manually. */ - data = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, required ); - data->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_W); + device_path.Length = (4 + wcslen( device_instance_id ) + 1 + 38) * sizeof(WCHAR); + if (refstr) + device_path.Length += sizeof(WCHAR) + refstr->Length; + device_path.MaximumLength = device_path.Length + sizeof(WCHAR); - if (!SetupDiGetDeviceInterfaceDetailW( set, &sp_iface, data, required, NULL, NULL )) + device_path.Buffer = RtlAllocateHeap( GetProcessHeap(), 0, device_path.MaximumLength ); + swprintf( device_path.Buffer, device_path.MaximumLength / sizeof(WCHAR), + L"\\??\\%s#{%08lx-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}", + device_instance_id, class_guid->Data1, class_guid->Data2, class_guid->Data3, + class_guid->Data4[0], class_guid->Data4[1], class_guid->Data4[2], class_guid->Data4[3], + class_guid->Data4[4], class_guid->Data4[5], class_guid->Data4[6], class_guid->Data4[7] ); + for (p = device_path.Buffer + 4; *p; p++) { - HeapFree( GetProcessHeap(), 0, data ); - return STATUS_UNSUCCESSFUL; + if (*p == '\\') + *p = '#'; + } + if (refstr) + { + *p++ = '\\'; + wcscpy( p, refstr->Buffer ); } - data->DevicePath[1] = '?'; - TRACE("Returning path %s.\n", debugstr_w(data->DevicePath)); - RtlCreateUnicodeString( &device_path, data->DevicePath); + TRACE("Returning path %s.\n", debugstr_us(&device_path)); entry = wine_rb_get( &device_interfaces, &device_path ); if (entry) @@ -937,7 +945,7 @@ NTSTATUS WINAPI IoRegisterDeviceInterface(DEVICE_OBJECT *device, const GUID *cla else { iface = heap_alloc_zero( sizeof(struct device_interface) ); - RtlCreateUnicodeString(&iface->symbolic_link, data->DevicePath); + RtlDuplicateUnicodeString( 1, &device_path, &iface->symbolic_link ); if (wine_rb_put( &device_interfaces, &iface->symbolic_link, &iface->entry )) ERR("Failed to insert interface %s into tree.\n", debugstr_us(&iface->symbolic_link)); } @@ -945,9 +953,7 @@ NTSTATUS WINAPI IoRegisterDeviceInterface(DEVICE_OBJECT *device, const GUID *cla iface->device = device; iface->interface_class = *class_guid; if (symbolic_link) - RtlCreateUnicodeString( symbolic_link, data->DevicePath); - - HeapFree( GetProcessHeap(), 0, data ); + RtlDuplicateUnicodeString( 1, &device_path, symbolic_link ); RtlFreeUnicodeString( &device_path ); diff --git a/dlls/ntoskrnl.exe/tests/driver_pnp.c b/dlls/ntoskrnl.exe/tests/driver_pnp.c index 50b3ce29d58..b8876dd60d1 100644 --- a/dlls/ntoskrnl.exe/tests/driver_pnp.c +++ b/dlls/ntoskrnl.exe/tests/driver_pnp.c @@ -285,7 +285,7 @@ static NTSTATUS pdo_pnp(DEVICE_OBJECT *device_obj, IRP *irp) "Got length %u.\n", device->child_symlink.Length); ok(device->child_symlink.MaximumLength == sizeof(expect_symlink), "Got maximum length %u.\n", device->child_symlink.MaximumLength); - todo_wine ok(!kmemcmp(device->child_symlink.Buffer, expect_symlink, device->child_symlink.MaximumLength), + ok(!kmemcmp(device->child_symlink.Buffer, expect_symlink, device->child_symlink.MaximumLength), "Got symlink \"%ls\".\n", device->child_symlink.Buffer); IoSetDeviceInterfaceState(&device->child_symlink, TRUE); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/2185
From: Zebediah Figura <zfigura(a)codeweavers.com> This reverts commit c489356d0b5bf01f2a09f6df8f5a5b9b1894fb17. --- dlls/ntoskrnl.exe/pnp.c | 8 +------- dlls/ntoskrnl.exe/tests/ntoskrnl.c | 4 ++-- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c index 36ceeac8dae..76700de0b7c 100644 --- a/dlls/ntoskrnl.exe/pnp.c +++ b/dlls/ntoskrnl.exe/pnp.c @@ -727,11 +727,11 @@ NTSTATUS WINAPI IoSetDeviceInterfaceState( UNICODE_STRING *name, BOOLEAN enable size_t namelen = name->Length / sizeof(WCHAR); DEV_BROADCAST_DEVICEINTERFACE_W *broadcast; - WCHAR *path, *refstr, *p, *upper_end; struct device_interface *iface; HANDLE iface_key, control_key; OBJECT_ATTRIBUTES attr = {0}; struct wine_rb_entry *entry; + WCHAR *path, *refstr, *p; UNICODE_STRING string; DWORD data = enable; NTSTATUS ret; @@ -817,12 +817,6 @@ 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] = '\\'; - - upper_end = wcschr( broadcast->dbcc_name, '#' ); - if (upper_end) upper_end = wcschr( upper_end + 1, '#' ); - while (upper_end && upper_end-- != broadcast->dbcc_name) - *upper_end = towupper( *upper_end ); - send_devicechange( enable ? DBT_DEVICEARRIVAL : DBT_DEVICEREMOVECOMPLETE, broadcast, len ); heap_free( broadcast ); } diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c index c5362e3fb2b..859dab4b3a9 100644 --- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c @@ -1406,7 +1406,7 @@ static LRESULT WINAPI device_notify_proc(HWND window, UINT message, WPARAM wpara else if (IsEqualGUID(&iface->dbcc_classguid, &child_class)) { ++got_child_arrival; - todo_wine ok(!strcmp(iface->dbcc_name, "\\\\?\\Wine#Test#1#{deadbeef-29ef-4538-a5fd-b69573a362c2}"), + ok(!strcmp(iface->dbcc_name, "\\\\?\\Wine#Test#1#{deadbeef-29ef-4538-a5fd-b69573a362c2}"), "got name %s\n", debugstr_a(iface->dbcc_name)); } break; @@ -1434,7 +1434,7 @@ static LRESULT WINAPI device_notify_proc(HWND window, UINT message, WPARAM wpara else if (IsEqualGUID(&iface->dbcc_classguid, &child_class)) { ++got_child_removal; - todo_wine ok(!strcmp(iface->dbcc_name, "\\\\?\\Wine#Test#1#{deadbeef-29ef-4538-a5fd-b69573a362c2}"), + ok(!strcmp(iface->dbcc_name, "\\\\?\\Wine#Test#1#{deadbeef-29ef-4538-a5fd-b69573a362c2}"), "got name %s\n", debugstr_a(iface->dbcc_name)); } break; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/2185
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 full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=129479 Your paranoid android. === build (build log) === error: patch failed: dlls/ntoskrnl.exe/pnp.c:727 Task: Patch failed to apply === debian11 (build log) === error: patch failed: dlls/ntoskrnl.exe/pnp.c:727 Task: Patch failed to apply === debian11b (build log) === error: patch failed: dlls/ntoskrnl.exe/pnp.c:727 Task: Patch failed to apply
On Thu Feb 16 04:23:34 2023 +0000, Zebediah Figura wrote:
changed this line in [version 2 of the diff](/wine/wine/-/merge_requests/2185/diffs?diff_id=32889&start_sha=ee84f36857edd5b060be3274171e57ea3ebeb917#794c39e43a4d43f839ab6347f34a7eff70daac10_498_498) I don't see why, but sure.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/2185#note_24479
They are, caused by https://gitlab.winehq.org/wine/wine/-/merge_requests/2185/diffs?commit_id=c7... somehow.
Yes, they indeed were, in a rather subtle way: the patch used memcmp() in the kernel, which isn't exported from 32-bit ntoskrnl on windows 7 or older. Fixed in v2. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/2185#note_24480
A -> W conversion would fail to send messages for messages not including the 0x8000 flag, fixed in v2. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/2185#note_24481
participants (3)
-
Marvin -
Zebediah Figura -
Zebediah Figura (@zfigura)