From: Connor McAdams <cmcadams@codeweavers.com> Signed-off-by: Connor McAdams <cmcadams@codeweavers.com> --- dlls/ntoskrnl.exe/pnp.c | 21 +++++++++++++-------- dlls/ntoskrnl.exe/tests/driver_pnp.c | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c index 1a99262d280..ec25250949c 100644 --- a/dlls/ntoskrnl.exe/pnp.c +++ b/dlls/ntoskrnl.exe/pnp.c @@ -768,25 +768,30 @@ NTSTATUS WINAPI IoGetDeviceProperty( DEVICE_OBJECT *device, DEVICE_REGISTRY_PROP { case DevicePropertyEnumeratorName: { - WCHAR *id, *ptr; + WCHAR *ptr; - status = get_device_id( device, BusQueryDeviceID, &id ); + status = get_device_instance_id( device, device_instance_id ); if (status != STATUS_SUCCESS) { ERR("Failed to get instance ID, status %#lx.\n", status); - break; + return status; } - ptr = wcschr( id, '\\' ); - if (ptr) *ptr = 0; + if (!(ptr = wcschr( device_instance_id, '\\' ))) + { + ERR( "Instance ID %s has no enumerator separator.\n", debugstr_w(device_instance_id) ); + return STATUS_UNSUCCESSFUL; + } - *needed = sizeof(WCHAR) * (lstrlenW(id) + 1); + *needed = ((ptr - device_instance_id) + 1) * sizeof(WCHAR); if (length >= *needed) - memcpy( buffer, id, *needed ); + { + memcpy( buffer, device_instance_id, *needed - sizeof(WCHAR) ); + ((WCHAR *)buffer)[((ptr - device_instance_id) + 1)] = 0; + } else status = STATUS_BUFFER_TOO_SMALL; - ExFreePool( id ); return status; } case DevicePropertyPhysicalDeviceObjectName: diff --git a/dlls/ntoskrnl.exe/tests/driver_pnp.c b/dlls/ntoskrnl.exe/tests/driver_pnp.c index cd7f30ef82d..ea7306a8900 100644 --- a/dlls/ntoskrnl.exe/tests/driver_pnp.c +++ b/dlls/ntoskrnl.exe/tests/driver_pnp.c @@ -876,7 +876,7 @@ static void test_child_enumerator_name(DEVICE_OBJECT *device) query_id_count = 0; status = IoGetDeviceProperty(device, DevicePropertyEnumeratorName, sizeof(buffer), buffer, &req_size); - todo_wine ok(query_id_count == 0, "expected no IRP_MN_QUERY_ID\n"); + ok(query_id_count == 0, "expected no IRP_MN_QUERY_ID\n"); ok(status == STATUS_SUCCESS, "IoGetDeviceProperty failed: %#lx\n", status); ok(req_size == sizeof(wine), "unexpected size %lu\n", req_size); if (status == STATUS_SUCCESS) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11263