From 816e25c1949a6d0bc6c98e599923768eba9e91b2 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Tue, 25 Jun 2019 21:35:16 -0500 Subject: [PATCH] ntoskrnl.exe: Handle IRP_MN_QUERY_ID for root PnP devices. Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- dlls/ntoskrnl.exe/pnp.c | 44 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c index 90da2b7ee37..f5315275859 100644 --- a/dlls/ntoskrnl.exe/pnp.c +++ b/dlls/ntoskrnl.exe/pnp.c @@ -782,6 +782,7 @@ static struct wine_rb_tree root_pnp_devices = { root_pnp_devices_rb_compare }; static NTSTATUS WINAPI pnp_manager_device_pnp( DEVICE_OBJECT *device, IRP *irp ) { IO_STACK_LOCATION *stack = IoGetCurrentIrpStackLocation( irp ); + struct root_pnp_device *root_device = device->DeviceExtension; TRACE("device %p, irp %p, minor function %#x.\n", device, irp, stack->MinorFunction); @@ -793,6 +794,49 @@ static NTSTATUS WINAPI pnp_manager_device_pnp( DEVICE_OBJECT *device, IRP *irp ) /* Nothing to do. */ irp->IoStatus.u.Status = STATUS_SUCCESS; break; + case IRP_MN_QUERY_ID: + { + BUS_QUERY_ID_TYPE type = stack->Parameters.QueryId.IdType; + WCHAR *id, *p; + + TRACE("Received IRP_MN_QUERY_ID, type %#x.\n", type); + + switch (type) + { + case BusQueryDeviceID: + p = wcsrchr( root_device->id, '\\' ); + if ((id = ExAllocatePool( NonPagedPool, (p - root_device->id + 1) * sizeof(WCHAR) ))) + { + memcpy( id, root_device->id, (p - root_device->id) * sizeof(WCHAR) ); + id[p - root_device->id] = 0; + irp->IoStatus.Information = (ULONG_PTR)id; + irp->IoStatus.u.Status = STATUS_SUCCESS; + } + else + { + irp->IoStatus.Information = 0; + irp->IoStatus.u.Status = STATUS_NO_MEMORY; + } + break; + case BusQueryInstanceID: + p = wcsrchr( root_device->id, '\\' ); + if ((id = ExAllocatePool( NonPagedPool, (wcslen( p + 1 ) + 1) * sizeof(WCHAR) ))) + { + wcscpy( id, p + 1 ); + irp->IoStatus.Information = (ULONG_PTR)id; + irp->IoStatus.u.Status = STATUS_SUCCESS; + } + else + { + irp->IoStatus.Information = 0; + irp->IoStatus.u.Status = STATUS_NO_MEMORY; + } + break; + default: + FIXME("Unhandled IRP_MN_QUERY_ID type %#x.\n", type); + } + break; + } default: FIXME("Unhandled PnP request %#x.\n", stack->MinorFunction); }