|
[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 |