]> xenbits.xensource.com Git - pvdrivers/win/xenbus.git/commitdiff
Add strict version check between XEN and XENFILT/XENBUS
authorPaul Durrant <paul.durrant@citrix.com>
Thu, 19 Mar 2015 12:35:15 +0000 (12:35 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Thu, 19 Mar 2015 12:48:23 +0000 (12:48 +0000)
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@citrix.com>
include/xen.h
src/coinst/coinst.c
src/xen/driver.c
src/xenbus/driver.c
src/xenfilt/driver.c

index 0c76fe7efbdc826bf09a58635b19b5a0314224bb..29e32f9ab152bef59e50dc34d60e24287ef84fc5 100644 (file)
 
 // 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
index bc331824b6a8faa88f010991bb62ceb8305efb34..4b3e5325384fe3f95ad2784f425f1e3121948b6c 100644 (file)
@@ -1826,6 +1826,50 @@ fail1:
     return FALSE;
 }
 
+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,
@@ -2205,6 +2249,7 @@ DifInstallPostProcess(
 
         (VOID) InstallFilter(&GUID_DEVCLASS_SYSTEM, "XENFILT");
         (VOID) InstallFilter(&GUID_DEVCLASS_HDC, "XENFILT");
+        (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
     }
 
     free(DeviceID);
index 716367c3cdd8817ece968493e30a45c3c4c4defa..a319541e00447df6d44369adb6749f620375a2b1 100644 (file)
@@ -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,
index 628e0fa07217fdcd85a08f9a3b922bf18e1b399d..e74d369229091b4d49c6f633de710350f1df47ed 100644 (file)
@@ -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;
index 8279bd74feaa871fae1280b429aee665acb0939a..420e8274c4c8a9397c2a2c7dd68bcc156d75d106 100644 (file)
@@ -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;