Geoff Chappell, Software Analyst
The HV_X64_HYPERVISOR_HARDWARE_FEATURES structure collects the flags that a Microsoft-compatible hypervisor’s cpuid leaf 0x40000006 produces in the eax, ebx, ecx and edx registers.
The HV_X64_HYPERVISOR_HARDWARE_FEATURES is defined for Windows 10. Earlier versions have an HV_HYPERVISOR_HARDWARE_FEATURES. The new name suggests a specialisation to one processor architecture, yet the the structure appears to be defined for both 32-bit and 64-bit Windows.
The HV_X64_HYPERVISOR_HARDWARE_FEATURES is not documented.
The structure anyway repackages material that Microsoft does document—or represents as documented—in the Hypervisor Top-Level Functional Specification. If the structure 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. That said, the Specification that is offered today (12th November 2016) as the most recent version is a PDF that is three years old. Despite the Microsoft Open Specification Promise, flags that have been added since, notably for Windows 10, seem not yet to be documented anywhere in any sense.
The HV_X64_HYPERVISOR_HARDWARE_FEATURES is 0x10 bytes. Names and definitions below are from type information in the symbol files for URLMON.DLL in Windows 10. 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!
UINT ApicOverlayAssistInUse : 1; // 0x00000001 (6.2) UINT MsrBitmapsInUse : 1; // 0x00000002 (6.2) UINT ArchitecturalPerformanceCountersInUse : 1; // 0x00000004 (6.2) UINT SecondLevelAddressTranslationInUse : 1; // 0x00000008 (6.2) UINT DmaRemappingInUse : 1; // 0x00000010 (6.2) UINT InterruptRemappingInUse : 1; // 0x00000020 (6.2) UINT MemoryControlScrubberPresent : 1; // 0x00000040 (6.2) UINT DmaProtecionInUse : 1; // 0x00000080 UINT HpetRequested : 1; // 0x00000100 UINT SyntheticTimersVolatile : 1; // 0x00000200 UINT Reserved : 22;
Version numbers in parentheses date each member’s introduction, as known from prior appearance in the HV_HYPERVISOR_HARDWARE_FEATURES or in the even older HV_CPUID_RESULT.