CHAR Extra[XEN_EXTRAVERSION_LEN];
NTSTATUS status;
+ status = STATUS_INCOMPATIBLE_DRIVER_BLOCKED;
if (MajorVersion != MAJOR_VERSION ||
MinorVersion != MINOR_VERSION ||
MicroVersion != MICRO_VERSION ||
BuildNumber != BUILD_NUMBER)
goto fail1;
- if (Reference++ != 0)
+ if (Reference != 0)
goto done;
status = XenVersion(&Major, &Minor);
+ if (status == STATUS_NOT_IMPLEMENTED)
+ goto fail2;
+
ASSERT(NT_SUCCESS(status));
status = XenVersionExtra(Extra);
__XEN_INTERFACE_VERSION__);
done:
+ Reference++;
+
return STATUS_SUCCESS;
+fail2:
fail1:
- Info("MODULE '%s' NOT COMPATIBLE (REBOOT REQUIRED)\n", Name);
+ if (status == STATUS_INCOMPATIBLE_DRIVER_BLOCKED)
+ Info("MODULE '%s' NOT COMPATIBLE (REBOOT REQUIRED)\n", Name);
- return STATUS_INCOMPATIBLE_DRIVER_BLOCKED;
+ return status;
}
static VOID
if (!NT_SUCCESS(status))
goto fail7;
- status = HypercallInitialize();
- if (!NT_SUCCESS(status))
- goto fail8;
+ HypercallInitialize();
status = BugCheckInitialize();
if (!NT_SUCCESS(status))
- goto fail9;
+ goto fail8;
status = ModuleInitialize();
if (!NT_SUCCESS(status))
- goto fail10;
+ goto fail9;
status = ProcessInitialize();
if (!NT_SUCCESS(status))
- goto fail11;
+ goto fail10;
status = UnplugInitialize();
if (!NT_SUCCESS(status))
- goto fail12;
+ goto fail11;
RegistryCloseKey(ParametersKey);
return STATUS_SUCCESS;
-fail12:
- Error("fail12\n");
-
- ProcessTeardown();
-
fail11:
Error("fail11\n");
- ModuleTeardown();
+ ProcessTeardown();
fail10:
Error("fail10\n");
- BugCheckTeardown();
+ ModuleTeardown();
fail9:
Error("fail9\n");
+ BugCheckTeardown();
+
HypercallTeardown();
fail8:
static PHYSICAL_ADDRESS HypercallPage[MAXIMUM_HYPERCALL_PAGE_COUNT];
static ULONG HypercallPageCount;
+static BOOLEAN HypercallPageInitialized;
typedef UCHAR HYPERCALL_GATE[32];
typedef HYPERCALL_GATE *PHYPERCALL_GATE;
__writemsr(HypercallMsr, HypercallPage[Index].QuadPart);
}
+
+ HypercallPageInitialized = TRUE;
}
-NTSTATUS
+VOID
HypercallInitialize(
VOID
)
ULONG ECX = 'DEAD';
ULONG EDX = 'DEAD';
ULONG_PTR Index;
- NTSTATUS status;
- status = STATUS_UNSUCCESSFUL;
for (;;) {
CHAR Signature[13] = {0};
XenBaseLeaf += 0x100;
- if (XenBaseLeaf > 0x40000100)
- goto fail1;
+ if (XenBaseLeaf > 0x40000100) {
+ LogPrintf(LOG_LEVEL_INFO,
+ "XEN: BASE CPUID LEAF NOT FOUND\n");
+ return;
+ }
}
LogPrintf(LOG_LEVEL_INFO,
HypercallMsr = EBX;
HypercallPopulate();
-
- return STATUS_SUCCESS;
-
-fail1:
- Error("fail1 (%08x)", status);
-
- return status;
}
extern uintptr_t __stdcall hypercall2(uint32_t ord, uintptr_t arg1, uintptr_t arg2);
extern uintptr_t __stdcall hypercall3(uint32_t ord, uintptr_t arg1, uintptr_t arg2, uintptr_t arg3);
-ULONG_PTR
+LONG_PTR
__Hypercall(
ULONG Ordinal,
ULONG Count,
va_list Arguments;
ULONG_PTR Value;
+ if (!HypercallPageInitialized)
+ return -ENOSYS;
+
va_start(Arguments, Count);
switch (Count) {
case 2: {
#include <public/xen.h>
-extern NTSTATUS
+extern VOID
HypercallInitialize(
VOID
);
-extern ULONG_PTR
+extern LONG_PTR
__Hypercall(
ULONG Ordinal,
ULONG Count,
MICRO_VERSION,
BUILD_NUMBER);
if (!NT_SUCCESS(status)) {
- __DriverRequestReboot();
+ if (status == STATUS_INCOMPATIBLE_DRIVER_BLOCKED)
+ __DriverRequestReboot();
+
goto done;
}