Module: wine Branch: master Commit: 5815c7b520794c703037fefa9bdc0b796eb13493 URL: https://source.winehq.org/git/wine.git/?a=commit;h=5815c7b520794c703037fefa9...
Author: Aric Stewart aric@codeweavers.com Date: Wed Sep 12 11:23:29 2018 -0500
winebus.sys: Implement IRP_MN_QUERY_DEVICE_RELATIONS.
Signed-off-by: Aric Stewart aric@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/winebus.sys/main.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+)
diff --git a/dlls/winebus.sys/main.c b/dlls/winebus.sys/main.c index fd795f1..6b1949c 100644 --- a/dlls/winebus.sys/main.c +++ b/dlls/winebus.sys/main.c @@ -360,6 +360,57 @@ void bus_remove_hid_device(DEVICE_OBJECT *device) HeapFree(GetProcessHeap(), 0, pnp_device); }
+static NTSTATUS build_device_relations(DEVICE_RELATIONS **devices) +{ + int i; + struct pnp_device *ptr; + + EnterCriticalSection(&device_list_cs); + *devices = HeapAlloc(GetProcessHeap(), 0, sizeof(DEVICE_RELATIONS) + + list_count(&pnp_devset) * sizeof (void *)); + + if (!*devices) + { + LeaveCriticalSection(&device_list_cs); + return STATUS_INSUFFICIENT_RESOURCES; + } + + i = 0; + LIST_FOR_EACH_ENTRY(ptr, &pnp_devset, struct pnp_device, entry) + { + (*devices)->Objects[i] = (DEVICE_OBJECT*)ptr->device; + i++; + } + LeaveCriticalSection(&device_list_cs); + (*devices)->Count = i; + return STATUS_SUCCESS; +} + +static NTSTATUS handle_IRP_MN_QUERY_DEVICE_RELATIONS(IRP *irp) +{ + NTSTATUS status = 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: + status = build_device_relations((DEVICE_RELATIONS**)&irp->IoStatus.Information); + break; + default: + FIXME("Unknown Device Relation %x\n",irpsp->Parameters.QueryDeviceRelations.Type); + break; + } + + return status; +} + static NTSTATUS handle_IRP_MN_QUERY_ID(DEVICE_OBJECT *device, IRP *irp) { NTSTATUS status = irp->IoStatus.u.Status; @@ -404,6 +455,8 @@ NTSTATUS WINAPI common_pnp_dispatch(DEVICE_OBJECT *device, IRP *irp) { case IRP_MN_QUERY_DEVICE_RELATIONS: TRACE("IRP_MN_QUERY_DEVICE_RELATIONS\n"); + status = handle_IRP_MN_QUERY_DEVICE_RELATIONS(irp); + irp->IoStatus.u.Status = status; break; case IRP_MN_QUERY_ID: TRACE("IRP_MN_QUERY_ID\n");