Zebediah Figura : ntoskrnl.exe: Handle IRP_MN_QUERY_ID for root PnP devices.

Alexandre Julliard julliard at winehq.org
Wed Jun 26 16:15:40 CDT 2019


Module: wine
Branch: master
Commit: 816e25c1949a6d0bc6c98e599923768eba9e91b2
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=816e25c1949a6d0bc6c98e599923768eba9e91b2

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue Jun 25 21:35:16 2019 -0500

ntoskrnl.exe: Handle IRP_MN_QUERY_ID for root PnP devices.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 90da2b7..f531527 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);
     }




More information about the wine-cvs mailing list