Aric Stewart : winebus.sys: Implement IRP_MN_QUERY_DEVICE_RELATIONS.
Alexandre Julliard
julliard at winehq.org
Thu Sep 13 15:14:47 CDT 2018
Module: wine
Branch: master
Commit: 5815c7b520794c703037fefa9bdc0b796eb13493
URL: https://source.winehq.org/git/wine.git/?a=commit;h=5815c7b520794c703037fefa9bdc0b796eb13493
Author: Aric Stewart <aric at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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");
More information about the wine-cvs
mailing list