[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [PATCH 3/4] Determine emulated device type from HardwareIDs or CompatibleIDs


  • To: <win-pv-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Paul Durrant <paul.durrant@xxxxxxxxxx>
  • Date: Wed, 2 Oct 2019 12:24:49 +0100
  • Authentication-results: esa2.hc3370-68.iphmx.com; dkim=none (message not signed) header.i=none; spf=None smtp.pra=paul.durrant@xxxxxxxxxx; spf=Pass smtp.mailfrom=Paul.Durrant@xxxxxxxxxx; spf=None smtp.helo=postmaster@xxxxxxxxxxxxxxx
  • Cc: Paul Durrant <paul.durrant@xxxxxxxxxx>
  • Delivery-date: Wed, 02 Oct 2019 11:25:10 +0000
  • Ironport-sdr: s0qJ1PFthoE+N9ulzgFhq16IOxkTIakH5Sb0sq5rSUfD8qpbegCJULiR0RAYYU3jtzvQhO/hqI 5ccrpxT8yAviYZYQqGwtPMVyBcy/5YVTikQiCLCKVSHP9VQv+Obs0bAopb2JEhV7AUshfeCxpR g/ZEiLI3sle5BRDipIY0jVyOufdrB+kWlv450ZSseuSSTCtNM/bJrtFhnWULOU7aKaJnQ2Xmwg J8CXnpJEH/8dnNXEGn4lcdNo6/SxaMqtIcp/Y4np37TBmsqVB9K+Ou//2q/ZKxUGCH+tqy2S1j /FE=
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>

These names are a little less arbitrary than the DeviceID and this change
also allows matching on class code for PCI devices, rather than a specific
vendor/device combo.

Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
 src/xenbus.inf       |   4 +-
 src/xenfilt/driver.c | 167 +++++++++++++++++++++++++++++++++++++++++----------
 2 files changed, 137 insertions(+), 34 deletions(-)

diff --git a/src/xenbus.inf b/src/xenbus.inf
index 356e40b..bf3f0a1 100644
--- a/src/xenbus.inf
+++ b/src/xenbus.inf
@@ -117,8 +117,8 @@ AddReg = XenFilt_Parameters
 
 [XenFilt_Parameters]
 HKR,"Parameters",,0x00000010
-HKR,"Parameters","ACPI\PNP0A03",0x00000000,"PCI"
-HKR,"Parameters","PCIIDE\IDEChannel",0x00000000,"IDE"
+HKR,"Parameters","*PNP0A03",0x00000000,"PCI"
+HKR,"Parameters","Internal_IDE_Channel",0x00000000,"IDE"
 
 [Monitor_Service]
 DisplayName=%MonitorName%
diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c
index 18ffeaa..0167c21 100644
--- a/src/xenfilt/driver.c
+++ b/src/xenfilt/driver.c
@@ -480,18 +480,33 @@ DriverQueryId(
     KEVENT                  Event;
     PIO_STACK_LOCATION      StackLocation;
     PWCHAR                  Buffer;
-    ULONG                   Length;
     NTSTATUS                status;
 
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
 
+    switch (Type) {
+    case BusQueryDeviceID:
+    case BusQueryInstanceID:
+    case BusQueryHardwareIDs:
+    case BusQueryCompatibleIDs:
+        status = STATUS_SUCCESS;
+        break;
+
+    default:
+        status = STATUS_NOT_SUPPORTED;
+        break;
+    }
+
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
     ObReferenceObject(DeviceObject);
 
     Irp = IoAllocateIrp(DeviceObject->StackSize, FALSE);
 
     status = STATUS_INSUFFICIENT_RESOURCES;
     if (Irp == NULL)
-        goto fail1;
+        goto fail2;
 
     StackLocation = IoGetNextIrpStackLocation(Irp);
 
@@ -527,19 +542,78 @@ DriverQueryId(
     }
 
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail3;
 
     Buffer = (PWCHAR)Irp->IoStatus.Information;
-    Length = (ULONG)(wcslen(Buffer) + 1) * sizeof (CHAR);
 
-    *Id = __AllocatePoolWithTag(PagedPool, Length, 'TLIF');
+    switch (Type) {
+    case BusQueryDeviceID:
+    case BusQueryInstanceID: {
+        ULONG   Length;
+        ULONG   Size;
+
+        Length = (ULONG)(wcslen(Buffer));
+        Size = (Length + 1) * sizeof (CHAR);
+
+        *Id = __AllocatePoolWithTag(PagedPool, Size, 'TLIF');
+        if (*Id == NULL)
+            break;
+
+        status = RtlStringCbPrintfA(*Id, Size, "%ws", Buffer);
+        ASSERT(NT_SUCCESS(status));
+
+        break;
+    }
+    case BusQueryHardwareIDs:
+    case BusQueryCompatibleIDs: {
+        ULONG   Index;
+        ULONG   Size;
+
+        Index = 0;
+        for (;;) {
+            ULONG   Length;
+
+            Length = (ULONG)wcslen(&Buffer[Index]);
+            if (Length == 0)
+                break;
+
+            Index += Length + 1;
+        }
+        ASSERT(Index > 0);
+
+        Size = (Index + 1) * sizeof (CHAR);
+
+        *Id = __AllocatePoolWithTag(PagedPool, Size, 'TLIF');
+        if (*Id == NULL)
+            break;
+
+        Index = 0;
+        for (;;) {
+            ULONG   Length;
+
+            Length = (ULONG)wcslen(&Buffer[Index]);
+            if (Length == 0)
+                break;
+
+            status = RtlStringCbPrintfA(*Id + Index, Size, "%ws",
+                                        &Buffer[Index]);
+            ASSERT(NT_SUCCESS(status));
+
+            Index += Length + 1;
+            Size -= Length + 1;
+        }
+
+        break;
+    }
+    default:
+        ASSERT(FALSE);
+        *Id = NULL;
+        break;
+    }
 
     status = STATUS_NO_MEMORY;
     if (*Id == NULL)
-        goto fail3;
-
-    status = RtlStringCbPrintfA(*Id, Length, "%ws", Buffer);
-    ASSERT(NT_SUCCESS(status));
+        goto fail4;
 
     ExFreePool(Buffer);
     IoFreeIrp(Irp);
@@ -547,15 +621,16 @@ DriverQueryId(
 
     return STATUS_SUCCESS;
 
-fail3:
+fail4:
     ExFreePool(Buffer);
 
-fail2:
+fail3:
     IoFreeIrp(Irp);
 
-fail1:
+fail2:
     ObDereferenceObject(DeviceObject);
 
+fail1:
     return status;
 }
 
@@ -651,29 +726,46 @@ fail1:
 
 static XENFILT_EMULATED_OBJECT_TYPE
 DriverGetEmulatedType(
-    IN  PCHAR                       DeviceID
+    IN  PCHAR                       Id
     )
 {
     HANDLE                          ParametersKey;
     XENFILT_EMULATED_OBJECT_TYPE    Type;
-    PANSI_STRING                    Ansi;
-    NTSTATUS                        status;
+    ULONG                           Index;
 
     ParametersKey = __DriverGetParametersKey();
 
     Type = XENFILT_EMULATED_OBJECT_TYPE_UNKNOWN;
+    Index = 0;
 
-    status = RegistryQuerySzValue(ParametersKey,
-                                  DeviceID,
-                                  NULL,
-                                  &Ansi);
-    if (NT_SUCCESS(status)) {
-        if (_strnicmp(Ansi->Buffer, "PCI", Ansi->Length) == 0)
-            Type = XENFILT_EMULATED_OBJECT_TYPE_PCI;
-        else if (_strnicmp(Ansi->Buffer, "IDE", Ansi->Length) == 0)
-            Type = XENFILT_EMULATED_OBJECT_TYPE_IDE;
+    for (;;) {
+        ULONG           Length;
+        PANSI_STRING    Ansi;
+        NTSTATUS        status;
+
+        Length = (ULONG)strlen(&Id[Index]);
+        if (Length == 0)
+            break;
+
+        status = RegistryQuerySzValue(ParametersKey,
+                                      &Id[Index],
+                                      NULL,
+                                      &Ansi);
+        if (NT_SUCCESS(status)) {
+            Info("MATCH: %s -> %Z\n", &Id[Index], Ansi);
+
+            if (_strnicmp(Ansi->Buffer, "PCI", Ansi->Length) == 0)
+                Type = XENFILT_EMULATED_OBJECT_TYPE_PCI;
+            else if (_strnicmp(Ansi->Buffer, "IDE", Ansi->Length) == 0)
+                Type = XENFILT_EMULATED_OBJECT_TYPE_IDE;
+
+            RegistryFreeSzValue(Ansi);
+            break;
+        } else {
+            Trace("NO MATCH: %s\n", &Id[Index]);
+        }
 
-        RegistryFreeSzValue(Ansi);
+        Index += Length + 1;
     }
 
     return Type;
@@ -688,20 +780,31 @@ DriverAddDevice(
     IN  PDEVICE_OBJECT              PhysicalDeviceObject
     )
 {
-    PCHAR                           DeviceID;
+    PCHAR                           Id;
     XENFILT_EMULATED_OBJECT_TYPE    Type;
     NTSTATUS                        status;
 
     ASSERT3P(DriverObject, ==, __DriverGetDriverObject());
 
+    Type = XENFILT_EMULATED_OBJECT_TYPE_UNKNOWN;
+
     status = DriverQueryId(PhysicalDeviceObject,
-                           BusQueryDeviceID,
-                           &DeviceID);
-    if (!NT_SUCCESS(status))
-        goto done;
+                           BusQueryHardwareIDs,
+                           &Id);
+    if (NT_SUCCESS(status)) {
+        Type = DriverGetEmulatedType(Id);
+        ExFreePool(Id);
+    }
 
-    Type = DriverGetEmulatedType(DeviceID);
-    ExFreePool(DeviceID);
+    if (Type == XENFILT_EMULATED_OBJECT_TYPE_UNKNOWN) {
+        status = DriverQueryId(PhysicalDeviceObject,
+                               BusQueryCompatibleIDs,
+                               &Id);
+        if (NT_SUCCESS(status)) {
+            Type = DriverGetEmulatedType(Id);
+            ExFreePool(Id);
+        }
+    }
 
     status = STATUS_SUCCESS;
     if (Type == XENFILT_EMULATED_OBJECT_TYPE_UNKNOWN)
-- 
2.5.3


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/win-pv-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.