HV_HYPERVISOR_FEATURES

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

Availability

The HV_HYPERVISOR_FEATURES is known only for Windows 8.1, being superseded by the HV_X64_HYPERVISOR_FEATURES. It seems to have developed from the MsHvFeatures member of the HV_CPUID_RESULT union.

Documentation Status

The HV_HYPERVISOR_FEATURES 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_HYPERVISOR_FEATURES is 0x10 bytes. Names and definitions below are from type information in the symbol files for the Windows 8.1 kernel.

Offset Definition
0x00
HV_PARTITION_PRIVILEGE_MASK PartitionPrivileges;
0x08
UINT MaxSupportedCState : 4;                        // 0x0000000F (6.1)
UINT HpetNeededForC3PowerState : 1;                 // 0x00000010 (6.2)
UINT Reserved : 27;
0x0C
UINT MwaitAvailable : 1;                            // 0x00000001 (6.1)
UINT GuestDebuggingAvailable : 1;                   // 0x00000002 (6.1)
UINT PerformanceMonitorsAvailable : 1;              // 0x00000004 (6.1)
UINT CpuDynamicPartitioningAvailable : 1;           // 0x00000008 (6.1)
UINT XmmRegistersForFastHypercallAvailable : 1;     // 0x00000010 (6.1)
UINT GuestIdleAvailable : 1;                        // 0x00000020 (6.1)
UINT HypervisorSleepStateSupportAvailable : 1;      // 0x00000040 (6.2)
UINT NumaDistanceQueryAvailable : 1;                // 0x00000080 (6.2)
UINT FrequencyMsrsAvailable : 1;                    // 0x00000100 (6.2)
UINT SyntheticMachineCheckAvailable : 1;            // 0x00000200 (6.2)
UINT GuestCrashMsrsAvailable : 1;                   // 0x00000400 (6.2)
UINT DebugMsrsAvailable : 1;                        // 0x00000800 (6.2)
UINT Npiep1Available : 1;                           // 0x00001000
UINT DisableHypervisorAvailable : 1;                // 0x00002000
UINT Reserved1 : 18;

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