|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 5/6] Add strict version check between XEN and XENFILT/XENBUS
Because the ABI between XEN and the other drivers in the package is
(intentionally) unstable, add a strict version check using the single
function XenTouch to prevent XENBUS or XENFILT loading if an incumbent
XEN is from a previous package installation.
Also add code to the co-installer to request a reboot, as this is needed
to bring up a compatible set of modules.
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
include/xen.h | 8 ++++++--
src/coinst/coinst.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
src/xen/driver.c | 28 +++++++++++++++++++++++-----
src/xenbus/driver.c | 12 +++++++++---
src/xenfilt/driver.c | 12 +++++++++---
5 files changed, 92 insertions(+), 13 deletions(-)
diff --git a/include/xen.h b/include/xen.h
index 0c76fe7..29e32f9 100644
--- a/include/xen.h
+++ b/include/xen.h
@@ -62,9 +62,13 @@
// Dummy function to cause XEN.SYS to be loaded and initialized
XEN_API
-VOID
+NTSTATUS
XenTouch(
- VOID
+ IN const CHAR *Name,
+ IN ULONG MajorVersion,
+ IN ULONG MinorVersion,
+ IN ULONG MicroVersion,
+ IN ULONG BuildNumber
);
// HYPERCALL
diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index bc33182..4b3e532 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -1827,6 +1827,50 @@ fail1:
}
static BOOLEAN
+RequestReboot(
+ IN HDEVINFO DeviceInfoSet,
+ IN PSP_DEVINFO_DATA DeviceInfoData
+ )
+{
+ SP_DEVINSTALL_PARAMS DeviceInstallParams;
+ HRESULT Error;
+
+ DeviceInstallParams.cbSize = sizeof (DeviceInstallParams);
+
+ if (!SetupDiGetDeviceInstallParams(DeviceInfoSet,
+ DeviceInfoData,
+ &DeviceInstallParams))
+ goto fail1;
+
+ DeviceInstallParams.Flags |= DI_NEEDREBOOT;
+
+ Log("Flags = %08x", DeviceInstallParams.Flags);
+
+ if (!SetupDiSetDeviceInstallParams(DeviceInfoSet,
+ DeviceInfoData,
+ &DeviceInstallParams))
+ goto fail2;
+
+ return TRUE;
+
+fail2:
+ Log("fail2");
+
+fail1:
+ Error = GetLastError();
+
+ {
+ PTCHAR Message;
+
+ Message = GetErrorMessage(Error);
+ Log("fail1 (%s)", Message);
+ LocalFree(Message);
+ }
+
+ return FALSE;
+}
+
+static BOOLEAN
SetFriendlyName(
IN HDEVINFO DeviceInfoSet,
IN PSP_DEVINFO_DATA DeviceInfoData,
@@ -2205,6 +2249,7 @@ DifInstallPostProcess(
(VOID) InstallFilter(&GUID_DEVCLASS_SYSTEM, "XENFILT");
(VOID) InstallFilter(&GUID_DEVCLASS_HDC, "XENFILT");
+ (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
}
free(DeviceID);
diff --git a/src/xen/driver.c b/src/xen/driver.c
index 716367c..a319541 100644
--- a/src/xen/driver.c
+++ b/src/xen/driver.c
@@ -55,10 +55,14 @@ typedef struct _XEN_DRIVER {
static XEN_DRIVER Driver;
XEN_API
-VOID
+NTSTATUS
XenTouch(
- VOID
- )
+ IN const CHAR *Name,
+ IN ULONG MajorVersion,
+ IN ULONG MinorVersion,
+ IN ULONG MicroVersion,
+ IN ULONG BuildNumber
+ )
{
static ULONG Reference;
ULONG Major;
@@ -66,8 +70,14 @@ XenTouch(
CHAR Extra[XEN_EXTRAVERSION_LEN];
NTSTATUS status;
+ if (MajorVersion != MAJOR_VERSION ||
+ MinorVersion != MINOR_VERSION ||
+ MicroVersion != MICRO_VERSION ||
+ BuildNumber != BUILD_NUMBER)
+ goto fail1;
+
if (Reference++ != 0)
- return;
+ goto done;
status = XenVersion(&Major, &Minor);
ASSERT(NT_SUCCESS(status));
@@ -81,6 +91,14 @@ XenTouch(
Minor,
Extra,
__XEN_INTERFACE_VERSION__);
+
+done:
+ return STATUS_SUCCESS;
+
+fail1:
+ Info("MODULE '%s' NOT COMPATIBLE (REBOOT REQUIRED)\n", Name);
+
+ return STATUS_INCOMPATIBLE_DRIVER_BLOCKED;
}
static VOID
@@ -136,7 +154,7 @@ DllInitialize(
&Driver.InfoDisposition);
ASSERT(NT_SUCCESS(status));
- Info("XEN %d.%d.%d (%d) (%02d.%02d.%04d)\n",
+ Info("%d.%d.%d (%d) (%02d.%02d.%04d)\n",
MAJOR_VERSION,
MINOR_VERSION,
MICRO_VERSION,
diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c
index 628e0fa..e74d369 100644
--- a/src/xenbus/driver.c
+++ b/src/xenbus/driver.c
@@ -512,9 +512,7 @@ DriverEntry(
if (*InitSafeBootMode > 0)
goto done;
- XenTouch();
-
- Info("XENBUS %d.%d.%d (%d) (%02d.%02d.%04d)\n",
+ Info("%d.%d.%d (%d) (%02d.%02d.%04d)\n",
MAJOR_VERSION,
MINOR_VERSION,
MICRO_VERSION,
@@ -523,6 +521,14 @@ DriverEntry(
MONTH,
YEAR);
+ status = XenTouch(__MODULE__,
+ MAJOR_VERSION,
+ MINOR_VERSION,
+ MICRO_VERSION,
+ BUILD_NUMBER);
+ if (!NT_SUCCESS(status))
+ goto done;
+
status = RegistryInitialize(RegistryPath);
if (!NT_SUCCESS(status))
goto fail1;
diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c
index 8279bd7..420e827 100644
--- a/src/xenfilt/driver.c
+++ b/src/xenfilt/driver.c
@@ -787,9 +787,7 @@ DriverEntry(
if (*InitSafeBootMode > 0)
goto done;
- XenTouch();
-
- Info("XENFILT %d.%d.%d (%d) (%02d.%02d.%04d)\n",
+ Info("%d.%d.%d (%d) (%02d.%02d.%04d)\n",
MAJOR_VERSION,
MINOR_VERSION,
MICRO_VERSION,
@@ -798,6 +796,14 @@ DriverEntry(
MONTH,
YEAR);
+ status = XenTouch(__MODULE__,
+ MAJOR_VERSION,
+ MINOR_VERSION,
+ MICRO_VERSION,
+ BUILD_NUMBER);
+ if (!NT_SUCCESS(status))
+ goto done;
+
status = RegistryInitialize(RegistryPath);
if (!NT_SUCCESS(status))
goto fail1;
--
2.1.1
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |