// 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
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,
(VOID) InstallFilter(&GUID_DEVCLASS_SYSTEM, "XENFILT");
(VOID) InstallFilter(&GUID_DEVCLASS_HDC, "XENFILT");
+ (VOID) RequestReboot(DeviceInfoSet, DeviceInfoData);
}
free(DeviceID);
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;
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));
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
&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,
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,
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;
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,
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;