ntoskrnl.exe: Handle IRP_MN_QUERY_ID for root PnP devices.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
13e9d43127
commit
816e25c194
|
@ -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 )
|
static NTSTATUS WINAPI pnp_manager_device_pnp( DEVICE_OBJECT *device, IRP *irp )
|
||||||
{
|
{
|
||||||
IO_STACK_LOCATION *stack = IoGetCurrentIrpStackLocation( 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);
|
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. */
|
/* Nothing to do. */
|
||||||
irp->IoStatus.u.Status = STATUS_SUCCESS;
|
irp->IoStatus.u.Status = STATUS_SUCCESS;
|
||||||
break;
|
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:
|
default:
|
||||||
FIXME("Unhandled PnP request %#x.\n", stack->MinorFunction);
|
FIXME("Unhandled PnP request %#x.\n", stack->MinorFunction);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue