| 
    
 [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Handle ActiveLocationInformation value not found
 v8.2 drivers do not set ActiveLocationInformation, so when upgrading
xenbus to v9.0, xenfilt fails during PdoSetDeviceInformation.
Allow xenfilt to handle missing ActiveLocationInformation, and make
xenbus add ActiveLocationInformation and ActiveInstanceID, if missing,
for the active device.
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
 src/xenbus/driver.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/xenbus/driver.h |  7 +++++
 src/xenbus/fdo.c    |  4 +++
 src/xenfilt/pdo.c   | 15 +++++-----
 4 files changed, 102 insertions(+), 8 deletions(-)
diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c
index c49a7de..a1c7b56 100644
--- a/src/xenbus/driver.c
+++ b/src/xenbus/driver.c
@@ -532,6 +532,90 @@ fail1:
     return status;
 }
 
+NTSTATUS
+DriverUpdateActive(
+    IN  PCHAR   DeviceID,
+    IN  PCHAR   InstanceID,
+    IN  PCHAR   LocationInformation
+    )
+{
+    HANDLE      ActiveKey;
+    ANSI_STRING Ansi[2];
+    PCHAR       ActiveInstanceID;
+    PCHAR       ActiveLocationInformation;
+    NTSTATUS    status;
+
+    Trace("====>\n");
+
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+
+    status = RegistryOpenSubKey(NULL,
+                                ACTIVE_PATH,
+                                KEY_ALL_ACCESS,
+                                &ActiveKey);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = STATUS_UNSUCCESSFUL;
+    if (__DriverIsDeviceLegacy(DeviceID) &&
+        __DriverIsVendorDevicePresent())
+        goto fail2;
+
+    RtlZeroMemory(Ansi, sizeof (ANSI_STRING) * 2);
+
+    status = DriverGetActive("InstanceID", &ActiveInstanceID);
+    if (NT_SUCCESS(status)) {
+        ExFreePool(ActiveInstanceID);
+    } else {
+        RtlInitAnsiString(&Ansi[0], InstanceID);
+
+        status = RegistryUpdateSzValue(ActiveKey,
+                                       "ActiveInstanceID",
+                                       REG_SZ,
+                                       Ansi);
+        if (!NT_SUCCESS(status))
+            goto fail3;
+    }
+
+    status = DriverGetActive("LocationInformation", 
&ActiveLocationInformation);
+    if (NT_SUCCESS(status)) {
+        ExFreePool(ActiveLocationInformation);
+    } else {
+        RtlInitAnsiString(&Ansi[0], LocationInformation);
+
+        status = RegistryUpdateSzValue(ActiveKey,
+                                       "ActiveLocationInformation",
+                                       REG_SZ,
+                                       Ansi);
+        if (!NT_SUCCESS(status))
+            goto fail4;
+    }
+
+    Info("%s\\%s: %s\n", DeviceID, InstanceID, LocationInformation);
+
+    RegistryCloseKey(ActiveKey);
+
+    Trace("<====\n");
+
+    return STATUS_SUCCESS;
+
+fail4:
+    Error("fail4\n");
+
+fail3:
+    Error("fail3\n");
+
+fail2:
+    Error("fail2\n");
+
+    RegistryCloseKey(ActiveKey);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
 NTSTATUS
 DriverClearActive(
     VOID
diff --git a/src/xenbus/driver.h b/src/xenbus/driver.h
index 3875b42..55ec97b 100644
--- a/src/xenbus/driver.h
+++ b/src/xenbus/driver.h
@@ -77,6 +77,13 @@ DriverSetActive(
     IN  PCHAR   LocationInformation
     );
 
+NTSTATUS
+DriverUpdateActive(
+    IN  PCHAR   DeviceID,
+    IN  PCHAR   InstanceID,
+    IN  PCHAR   LocationInformation
+    );
+
 NTSTATUS
 DriverClearActive(
     VOID
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 60201fc..7047f6a 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -745,6 +745,10 @@ FdoSetActive(
     status = DriverGetActive("DeviceID", &ActiveDeviceID);
     if (NT_SUCCESS(status)) {
         Fdo->Active = (_stricmp(DeviceID, ActiveDeviceID) == 0) ? TRUE : FALSE;
+
+        if (Fdo->Active)
+            (VOID) DriverUpdateActive(DeviceID, InstanceID, 
LocationInformation);
+
         ExFreePool(ActiveDeviceID);
     } else {
         status = DriverSetActive(DeviceID, InstanceID, LocationInformation);
diff --git a/src/xenfilt/pdo.c b/src/xenfilt/pdo.c
index 9fba36c..37b4a45 100644
--- a/src/xenfilt/pdo.c
+++ b/src/xenfilt/pdo.c
@@ -289,8 +289,13 @@ PdoSetDeviceInformation(
 
         status = DriverGetActive("LocationInformation",
                                  &LocationInformation);
-        if (!NT_SUCCESS(status))
-            goto fail3;
+        if (!NT_SUCCESS(status)) {
+            status = DriverQueryDeviceText(Pdo->LowerDeviceObject,
+                                           DeviceTextLocationInformation,
+                                           &LocationInformation);
+            if (!NT_SUCCESS(status))
+                LocationInformation = NULL;
+        }
     } else {
         status = DriverQueryId(Pdo->LowerDeviceObject,
                                BusQueryInstanceID,
@@ -311,12 +316,6 @@ PdoSetDeviceInformation(
 
     return STATUS_SUCCESS;
 
-fail3:
-    Error("fail3\n");
-
-    ASSERT(Pdo->Active);
-    ExFreePool(InstanceID);
-
 fail2:
     Error("fail2\n");
 
-- 
2.16.2.windows.1
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/win-pv-devel
 
  | 
  
![]()  | 
            
         Lists.xenproject.org is hosted with RackSpace, monitoring our  |