]> xenbits.xensource.com Git - pvdrivers/win/xenbus.git/commitdiff
Handle ActiveLocationInformation value not found
authorOwen Smith <owen.smith@citrix.com>
Wed, 21 Aug 2019 09:55:22 +0000 (10:55 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Wed, 21 Aug 2019 09:55:22 +0000 (10:55 +0100)
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@citrix.com>
src/xenbus/driver.c
src/xenbus/driver.h
src/xenbus/fdo.c
src/xenfilt/pdo.c

index c49a7dee99790f557449c483271cdf606a817d61..a1c7b560b50ce2e7b8203b7aceafb92a11450be9 100644 (file)
@@ -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
index 3875b42e4a741cf931846c5c849ebc5f46e0df49..55ec97be42b832229dd6c28b0888071f281a8c4c 100644 (file)
@@ -77,6 +77,13 @@ DriverSetActive(
     IN  PCHAR   LocationInformation
     );
 
+NTSTATUS
+DriverUpdateActive(
+    IN  PCHAR   DeviceID,
+    IN  PCHAR   InstanceID,
+    IN  PCHAR   LocationInformation
+    );
+
 NTSTATUS
 DriverClearActive(
     VOID
index 60201fce74703e7dd9bcc8506cdcedc78a278ca9..7047f6a175f62e81a37307d3f98932e94ef6da66 100644 (file)
@@ -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);
index 9fba36cc94b458493829b81a3a123064d48427c6..37b4a45ef22c4105ee7d8bd9da685519a1de4e25 100644 (file)
@@ -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");