From: Owen Smith Date: Wed, 21 Aug 2019 09:55:22 +0000 (+0100) Subject: Handle ActiveLocationInformation value not found X-Git-Tag: 9.0.0-rc1~15 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=82a3f070a5cc4762b1a4ecf8b7ebca661caa989d;p=pvdrivers%2Fwin%2Fxenbus.git 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 --- 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");