From: Aric Stewart Subject: [PATCH v5 8/8] winebus.sys: Implement IRP_MN_QUERY_DEVICE_RELATIONS Message-Id: Date: Wed, 7 Sep 2016 14:24:30 -0500 v4: Initialize rc to irp->IoStatus.u.Status v5: reorder patches Signed-off-by: Aric Stewart --- dlls/winebus.sys/main.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c index b4dd7c0..67bde96 100644 --- a/dlls/winebus.sys/main.c +++ b/dlls/winebus.sys/main.c @@ -192,6 +192,54 @@ void* bus_remove_hid_device(cmp_native_device cmp, void* native) return ret; } +static NTSTATUS enumerate_devices(DEVICE_RELATIONS **devices) +{ + int i; + pnp_device *ptr; + + *devices = HeapAlloc(GetProcessHeap(), 0, sizeof(DEVICE_RELATIONS) + + list_count(&pnp_devset) * sizeof (void *)); + + if (!*devices) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + + i = 0; + LIST_FOR_EACH_ENTRY(ptr, &pnp_devset, pnp_device, entry) + { + (*devices)->Objects[i] = (DEVICE_OBJECT*)ptr->device; + i++; + } + (*devices)->Count = i; + return STATUS_SUCCESS; +} + +static NTSTATUS handle_IRP_MN_QUERY_DEVICE_RELATIONS(IRP *irp) +{ + NTSTATUS rc = irp->IoStatus.u.Status; + IO_STACK_LOCATION *irpsp = IoGetCurrentIrpStackLocation( irp ); + + TRACE("IRP_MN_QUERY_DEVICE_RELATIONS"); + switch (irpsp->Parameters.QueryDeviceRelations.Type) + { + case EjectionRelations: + case RemovalRelations: + case TargetDeviceRelation: + case PowerRelations: + FIXME("Unhandled Device Relation %x\n",irpsp->Parameters.QueryDeviceRelations.Type); + break; + case BusRelations: + rc = enumerate_devices((DEVICE_RELATIONS**)&irp->IoStatus.Information); + break; + default: + FIXME("Unknown Device Relation %x\n",irpsp->Parameters.QueryDeviceRelations.Type); + break; + } + + return rc; +} + static NTSTATUS handle_IRP_MN_QUERY_ID(DEVICE_OBJECT *device, IRP *irp) { NTSTATUS rc = irp->IoStatus.u.Status; @@ -249,6 +297,8 @@ NTSTATUS WINAPI common_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp) { case IRP_MN_QUERY_DEVICE_RELATIONS: TRACE("IRP_MN_QUERY_DEVICE_RELATIONS\n"); + rc = handle_IRP_MN_QUERY_DEVICE_RELATIONS(irp); + irp->IoStatus.u.Status = rc; break; case IRP_MN_QUERY_ID: {