HV_ENLIGHTENMENT_INFORMATION

The HV_ENLIGHTENMENT_INFORMATION structure collects the flags that a Microsoft-compatible hypervisor’s cpuid leaf 0x40000004 produces in the eax, ebx, ecx and edx registers.

Availability

The HV_ENLIGHTENMENT_INFORMATION is known only for Windows 8.1, being superseded by the HV_X64_ENLIGHTENMENT_INFORMATION. It seems to have developed from the MsHvEnlightenmentInformation member of the HV_CPUID_RESULT union.

Documentation Status

The HV_ENLIGHTENMENT_INFORMATION is not documented. Some of its members, having previously been defined in the HV_CPUID_RESULT, are documented in the Windows Driver Kit (WDK) for Windows 7, which also provided a C-language definition in the HVGDK.H header file.

The structure anyway repackages material that Microsoft documents in the Hypervisor Top-Level Functional Specification. If it or its members’ previous definitions have become undocumented, it may be just that Microsoft regards the structure as no more than a convenience for Microsoft’s own programming in the loader and kernel, if not in the hypervisor itself.

Layout

The HV_ENLIGHTENMENT_INFORMATION is 0x10 bytes. Names and definitions below are from type information in the symbol files for URLMON.DLL in Windows 8.1. Well might you wonder what URLMON.DLL has to do with the hypervisor such that its symbol files have type information for this structure but the kernel’s don’t!

Offset Definition
0x00
UINT UseHypercallForAddressSpaceSwitch : 1;     // 0x00000001 (6.1)
UINT UseHypercallForLocalFlush : 1;             // 0x00000002 (6.1)
UINT UseHypercallForRemoteFlush : 1;            // 0x00000004 (6.1)
UINT UseApicMsrs : 1;                           // 0x00000008 (6.1)
UINT UseHvRegisterForReset : 1;                 // 0x00000010 (6.1)
UINT UseRelaxedTiming : 1;                      // 0x00000020 (6.1)
UINT UseDmaRemapping : 1;                       // 0x00000040 (6.2)
UINT UseInterruptRemapping : 1;                 // 0x00000080 (6.2)
UINT UseX2ApicMsrs : 1;                         // 0x00000100 (6.2)
UINT DeprecateAutoEoi : 1;                      // 0x00000200 (6.2)
UINT Reserved : 22;
0x04
UINT LongSpinWaitCount;                         // (6.1)
0x08
UINT ReservedEcx;
0x0C
UINT ReservedEdx;

Version numbers in parentheses date each member’s introduction, as known from prior appearance in the HV_CPUID_RESULT.