DICHook/DICHook_OpenSource/vtstruct.h

606 lines
22 KiB
C

#pragma once
#ifndef _VTSTRUCT__INCLUDED__
#define _VTSTRUCT__INCLUDED__
#include "ntifs.h"
enum class Msr : unsigned long {
kIa32ApicBase = 0x01B,
kIa32FeatureControl = 0x03A,
kIa32SysenterCs = 0x174,
kIa32SysenterEsp = 0x175,
kIa32SysenterEip = 0x176,
kIa32Debugctl = 0x1D9,
kIa32MtrrCap = 0xFE,
kIa32MtrrDefType = 0x2FF,
kIa32MtrrPhysBaseN = 0x200,
kIa32MtrrPhysMaskN = 0x201,
kIa32MtrrFix64k00000 = 0x250,
kIa32MtrrFix16k80000 = 0x258,
kIa32MtrrFix16kA0000 = 0x259,
kIa32MtrrFix4kC0000 = 0x268,
kIa32MtrrFix4kC8000 = 0x269,
kIa32MtrrFix4kD0000 = 0x26A,
kIa32MtrrFix4kD8000 = 0x26B,
kIa32MtrrFix4kE0000 = 0x26C,
kIa32MtrrFix4kE8000 = 0x26D,
kIa32MtrrFix4kF0000 = 0x26E,
kIa32MtrrFix4kF8000 = 0x26F,
kIa32VmxBasic = 0x480,
kIa32VmxPinbasedCtls = 0x481,
kIa32VmxProcBasedCtls = 0x482,
kIa32VmxExitCtls = 0x483,
kIa32VmxEntryCtls = 0x484,
kIa32VmxMisc = 0x485,
kIa32VmxCr0Fixed0 = 0x486,
kIa32VmxCr0Fixed1 = 0x487,
kIa32VmxCr4Fixed0 = 0x488,
kIa32VmxCr4Fixed1 = 0x489,
kIa32VmxVmcsEnum = 0x48A,
kIa32VmxProcBasedCtls2 = 0x48B,
kIa32VmxEptVpidCap = 0x48C,
kIa32VmxTruePinbasedCtls = 0x48D,
kIa32VmxTrueProcBasedCtls = 0x48E,
kIa32VmxTrueExitCtls = 0x48F,
kIa32VmxTrueEntryCtls = 0x490,
kIa32VmxVmfunc = 0x491,
kIa32Efer = 0xC0000080,
kIa32Star = 0xC0000081,
kIa32Lstar = 0xC0000082,
kIa32Fmask = 0xC0000084,
kIa32FsBase = 0xC0000100,
kIa32GsBase = 0xC0000101,
kIa32KernelGsBase = 0xC0000102,
kIa32TscAux = 0xC0000103,
};
enum class VmcsField : unsigned __int32 {
// 16-Bit Control Field
kVirtualProcessorId = 0x00000000,
kPostedInterruptNotification = 0x00000002,
kEptpIndex = 0x00000004,
// 16-Bit Guest-State Fields
kGuestEsSelector = 0x00000800,
kGuestCsSelector = 0x00000802,
kGuestSsSelector = 0x00000804,
kGuestDsSelector = 0x00000806,
kGuestFsSelector = 0x00000808,
kGuestGsSelector = 0x0000080a,
kGuestLdtrSelector = 0x0000080c,
kGuestTrSelector = 0x0000080e,
kGuestInterruptStatus = 0x00000810,
kPmlIndex = 0x00000812,
// 16-Bit Host-State Fields
kHostEsSelector = 0x00000c00,
kHostCsSelector = 0x00000c02,
kHostSsSelector = 0x00000c04,
kHostDsSelector = 0x00000c06,
kHostFsSelector = 0x00000c08,
kHostGsSelector = 0x00000c0a,
kHostTrSelector = 0x00000c0c,
// 64-Bit Control Fields
kIoBitmapA = 0x00002000,
kIoBitmapAHigh = 0x00002001,
kIoBitmapB = 0x00002002,
kIoBitmapBHigh = 0x00002003,
kMsrBitmap = 0x00002004,
kMsrBitmapHigh = 0x00002005,
kVmExitMsrStoreAddr = 0x00002006,
kVmExitMsrStoreAddrHigh = 0x00002007,
kVmExitMsrLoadAddr = 0x00002008,
kVmExitMsrLoadAddrHigh = 0x00002009,
kVmEntryMsrLoadAddr = 0x0000200a,
kVmEntryMsrLoadAddrHigh = 0x0000200b,
kExecutiveVmcsPointer = 0x0000200c,
kExecutiveVmcsPointerHigh = 0x0000200d,
kTscOffset = 0x00002010,
kTscOffsetHigh = 0x00002011,
kVirtualApicPageAddr = 0x00002012,
kVirtualApicPageAddrHigh = 0x00002013,
kApicAccessAddr = 0x00002014,
kApicAccessAddrHigh = 0x00002015,
kEptPointer = 0x0000201a,
kEptPointerHigh = 0x0000201b,
kEoiExitBitmap0 = 0x0000201c,
kEoiExitBitmap0High = 0x0000201d,
kEoiExitBitmap1 = 0x0000201e,
kEoiExitBitmap1High = 0x0000201f,
kEoiExitBitmap2 = 0x00002020,
kEoiExitBitmap2High = 0x00002021,
kEoiExitBitmap3 = 0x00002022,
kEoiExitBitmap3High = 0x00002023,
kEptpListAddress = 0x00002024,
kEptpListAddressHigh = 0x00002025,
kVmreadBitmapAddress = 0x00002026,
kVmreadBitmapAddressHigh = 0x00002027,
kVmwriteBitmapAddress = 0x00002028,
kVmwriteBitmapAddressHigh = 0x00002029,
kVirtualizationExceptionInfoAddress = 0x0000202a,
kVirtualizationExceptionInfoAddressHigh = 0x0000202b,
kXssExitingBitmap = 0x0000202c,
kXssExitingBitmapHigh = 0x0000202d,
kEnclsExitingBitmap = 0x0000202e,
kEnclsExitingBitmapHigh = 0x0000202f,
kTscMultiplier = 0x00002032,
kTscMultiplierHigh = 0x00002033,
// 64-Bit Read-Only Data Field
kGuestPhysicalAddress = 0x00002400,
kGuestPhysicalAddressHigh = 0x00002401,
// 64-Bit Guest-State Fields
kVmcsLinkPointer = 0x00002800,
kVmcsLinkPointerHigh = 0x00002801,
kGuestIa32Debugctl = 0x00002802,
kGuestIa32DebugctlHigh = 0x00002803,
kGuestIa32Pat = 0x00002804,
kGuestIa32PatHigh = 0x00002805,
kGuestIa32Efer = 0x00002806,
kGuestIa32EferHigh = 0x00002807,
kGuestIa32PerfGlobalCtrl = 0x00002808,
kGuestIa32PerfGlobalCtrlHigh = 0x00002809,
kGuestPdptr0 = 0x0000280a,
kGuestPdptr0High = 0x0000280b,
kGuestPdptr1 = 0x0000280c,
kGuestPdptr1High = 0x0000280d,
kGuestPdptr2 = 0x0000280e,
kGuestPdptr2High = 0x0000280f,
kGuestPdptr3 = 0x00002810,
kGuestPdptr3High = 0x00002811,
kGuestIa32Bndcfgs = 0x00002812,
kGuestIa32BndcfgsHigh = 0x00002813,
// 64-Bit Host-State Fields
kHostIa32Pat = 0x00002c00,
kHostIa32PatHigh = 0x00002c01,
kHostIa32Efer = 0x00002c02,
kHostIa32EferHigh = 0x00002c03,
kHostIa32PerfGlobalCtrl = 0x00002c04,
kHostIa32PerfGlobalCtrlHigh = 0x00002c05,
// 32-Bit Control Fields
kPinBasedVmExecControl = 0x00004000,
kCpuBasedVmExecControl = 0x00004002,
kExceptionBitmap = 0x00004004,
kPageFaultErrorCodeMask = 0x00004006,
kPageFaultErrorCodeMatch = 0x00004008,
kCr3TargetCount = 0x0000400a,
kVmExitControls = 0x0000400c,
kVmExitMsrStoreCount = 0x0000400e,
kVmExitMsrLoadCount = 0x00004010,
kVmEntryControls = 0x00004012,
kVmEntryMsrLoadCount = 0x00004014,
kVmEntryIntrInfoField = 0x00004016,
kVmEntryExceptionErrorCode = 0x00004018,
kVmEntryInstructionLen = 0x0000401a,
kTprThreshold = 0x0000401c,
kSecondaryVmExecControl = 0x0000401e,
kPleGap = 0x00004020,
kPleWindow = 0x00004022,
// 32-Bit Read-Only Data Fields
kVmInstructionError = 0x00004400, // See: VM-Instruction Error Numbers
kVmExitReason = 0x00004402,
kVmExitIntrInfo = 0x00004404,
kVmExitIntrErrorCode = 0x00004406,
kIdtVectoringInfoField = 0x00004408,
kIdtVectoringErrorCode = 0x0000440a,
kVmExitInstructionLen = 0x0000440c,
kVmxInstructionInfo = 0x0000440e,
// 32-Bit Guest-State Fields
kGuestEsLimit = 0x00004800,
kGuestCsLimit = 0x00004802,
kGuestSsLimit = 0x00004804,
kGuestDsLimit = 0x00004806,
kGuestFsLimit = 0x00004808,
kGuestGsLimit = 0x0000480a,
kGuestLdtrLimit = 0x0000480c,
kGuestTrLimit = 0x0000480e,
kGuestGdtrLimit = 0x00004810,
kGuestIdtrLimit = 0x00004812,
kGuestEsArBytes = 0x00004814,
kGuestCsArBytes = 0x00004816,
kGuestSsArBytes = 0x00004818,
kGuestDsArBytes = 0x0000481a,
kGuestFsArBytes = 0x0000481c,
kGuestGsArBytes = 0x0000481e,
kGuestLdtrArBytes = 0x00004820,
kGuestTrArBytes = 0x00004822,
kGuestInterruptibilityInfo = 0x00004824,
kGuestActivityState = 0x00004826,
kGuestSmbase = 0x00004828,
kGuestSysenterCs = 0x0000482a,
kVmxPreemptionTimerValue = 0x0000482e,
// 32-Bit Host-State Field
kHostIa32SysenterCs = 0x00004c00,
// Natural-Width Control Fields
kCr0GuestHostMask = 0x00006000,
kCr4GuestHostMask = 0x00006002,
kCr0ReadShadow = 0x00006004,
kCr4ReadShadow = 0x00006006,
kCr3TargetValue0 = 0x00006008,
kCr3TargetValue1 = 0x0000600a,
kCr3TargetValue2 = 0x0000600c,
kCr3TargetValue3 = 0x0000600e,
// Natural-Width Read-Only Data Fields
kExitQualification = 0x00006400,
kIoRcx = 0x00006402,
kIoRsi = 0x00006404,
kIoRdi = 0x00006406,
kIoRip = 0x00006408,
kGuestLinearAddress = 0x0000640a,
// Natural-Width Guest-State Fields
kGuestCr0 = 0x00006800,
kGuestCr3 = 0x00006802,
kGuestCr4 = 0x00006804,
kGuestEsBase = 0x00006806,
kGuestCsBase = 0x00006808,
kGuestSsBase = 0x0000680a,
kGuestDsBase = 0x0000680c,
kGuestFsBase = 0x0000680e,
kGuestGsBase = 0x00006810,
kGuestLdtrBase = 0x00006812,
kGuestTrBase = 0x00006814,
kGuestGdtrBase = 0x00006816,
kGuestIdtrBase = 0x00006818,
kGuestDr7 = 0x0000681a,
kGuestRsp = 0x0000681c,
kGuestRip = 0x0000681e,
kGuestRflags = 0x00006820,
kGuestPendingDbgExceptions = 0x00006822,
kGuestSysenterEsp = 0x00006824,
kGuestSysenterEip = 0x00006826,
// Natural-Width Host-State Fields
kHostCr0 = 0x00006c00,
kHostCr3 = 0x00006c02,
kHostCr4 = 0x00006c04,
kHostFsBase = 0x00006c06,
kHostGsBase = 0x00006c08,
kHostTrBase = 0x00006c0a,
kHostGdtrBase = 0x00006c0c,
kHostIdtrBase = 0x00006c0e,
kHostIa32SysenterEsp = 0x00006c10,
kHostIa32SysenterEip = 0x00006c12,
kHostRsp = 0x00006c14,
kHostRip = 0x00006c16
};
enum class InvVpidType : ULONG_PTR {
kIndividualAddressInvalidation = 0,
kSingleContextInvalidation = 1,
kAllContextInvalidation = 2,
kSingleContextInvalidationExceptGlobal = 3,
};
struct InvVpidDescriptor {
USHORT vpid;
USHORT reserved1;
ULONG32 reserved2;
ULONG64 linear_address;
};
enum class InvEptType : ULONG_PTR {
kSingleContextInvalidation = 1,
kGlobalInvalidation = 2,
};
union EptPointer {
ULONG64 all;
struct {
ULONG64 memory_type : 3; //!< [0:2]
ULONG64 page_walk_length : 3; //!< [3:5]
ULONG64 enable_accessed_and_dirty_flags : 1; //!< [6]
ULONG64 reserved1 : 5; //!< [7:11]
ULONG64 pml4_address : 36; //!< [12:48-1]
ULONG64 reserved2 : 16; //!< [48:63]
} fields;
};
struct InvEptDescriptor {
EptPointer ept_pointer;
ULONG64 reserved1;
};
union Ia32VmxBasicMsr {
unsigned __int64 all;
struct {
unsigned revision_identifier : 31; //!< [0:30]
unsigned reserved1 : 1; //!< [31]
unsigned region_size : 12; //!< [32:43]
unsigned region_clear : 1; //!< [44]
unsigned reserved2 : 3; //!< [45:47]
unsigned supported_ia64 : 1; //!< [48]
unsigned supported_dual_moniter : 1; //!< [49]
unsigned memory_type : 4; //!< [50:53]
unsigned vm_exit_report : 1; //!< [54]
unsigned vmx_capability_hint : 1; //!< [55]
unsigned reserved3 : 8; //!< [56:63]
} fields;
};
union VmxVmEntryControls {
unsigned int all;
struct {
unsigned reserved1 : 2; //!< [0:1]
unsigned load_debug_controls : 1; //!< [2]
unsigned reserved2 : 6; //!< [3:8]
unsigned ia32e_mode_guest : 1; //!< [9]
unsigned entry_to_smm : 1; //!< [10]
unsigned deactivate_dual_monitor_treatment : 1; //!< [11]
unsigned reserved3 : 1; //!< [12]
unsigned load_ia32_perf_global_ctrl : 1; //!< [13]
unsigned load_ia32_pat : 1; //!< [14]
unsigned load_ia32_efer : 1; //!< [15]
unsigned load_ia32_bndcfgs : 1; //!< [16]
unsigned conceal_vmentries_from_intel_pt : 1; //!< [17]
} fields;
};
union VmxVmExitControls {
unsigned int all;
struct {
unsigned reserved1 : 2; //!< [0:1]
unsigned save_debug_controls : 1; //!< [2]
unsigned reserved2 : 6; //!< [3:8]
unsigned host_address_space_size : 1; //!< [9]
unsigned reserved3 : 2; //!< [10:11]
unsigned load_ia32_perf_global_ctrl : 1; //!< [12]
unsigned reserved4 : 2; //!< [13:14]
unsigned acknowledge_interrupt_on_exit : 1; //!< [15]
unsigned reserved5 : 2; //!< [16:17]
unsigned save_ia32_pat : 1; //!< [18]
unsigned load_ia32_pat : 1; //!< [19]
unsigned save_ia32_efer : 1; //!< [20]
unsigned load_ia32_efer : 1; //!< [21]
unsigned save_vmx_preemption_timer_value : 1; //!< [22]
unsigned clear_ia32_bndcfgs : 1; //!< [23]
unsigned conceal_vmexits_from_intel_pt : 1; //!< [24]
} fields;
};
union VmxPinBasedControls {
unsigned int all;
struct {
unsigned external_interrupt_exiting : 1; //!< [0]
unsigned reserved1 : 2; //!< [1:2]
unsigned nmi_exiting : 1; //!< [3]
unsigned reserved2 : 1; //!< [4]
unsigned virtual_nmis : 1; //!< [5]
unsigned activate_vmx_peemption_timer : 1; //!< [6]
unsigned process_posted_interrupts : 1; //!< [7]
} fields;
};
union VmxProcessorBasedControls {
unsigned int all;
struct {
unsigned reserved1 : 2; //!< [0:1]
unsigned interrupt_window_exiting : 1; //!< [2]
unsigned use_tsc_offseting : 1; //!< [3]
unsigned reserved2 : 3; //!< [4:6]
unsigned hlt_exiting : 1; //!< [7]
unsigned reserved3 : 1; //!< [8]
unsigned invlpg_exiting : 1; //!< [9]
unsigned mwait_exiting : 1; //!< [10]
unsigned rdpmc_exiting : 1; //!< [11]
unsigned rdtsc_exiting : 1; //!< [12]
unsigned reserved4 : 2; //!< [13:14]
unsigned cr3_load_exiting : 1; //!< [15]
unsigned cr3_store_exiting : 1; //!< [16]
unsigned reserved5 : 2; //!< [17:18]
unsigned cr8_load_exiting : 1; //!< [19]
unsigned cr8_store_exiting : 1; //!< [20]
unsigned use_tpr_shadow : 1; //!< [21]
unsigned nmi_window_exiting : 1; //!< [22]
unsigned mov_dr_exiting : 1; //!< [23]
unsigned unconditional_io_exiting : 1; //!< [24]
unsigned use_io_bitmaps : 1; //!< [25]
unsigned reserved6 : 1; //!< [26]
unsigned monitor_trap_flag : 1; //!< [27]
unsigned use_msr_bitmaps : 1; //!< [28]
unsigned monitor_exiting : 1; //!< [29]
unsigned pause_exiting : 1; //!< [30]
unsigned activate_secondary_control : 1; //!< [31]
} fields;
};
/// See: Definitions of Secondary Processor-Based VM-Execution Controls
union VmxSecondaryProcessorBasedControls {
unsigned int all;
struct {
unsigned virtualize_apic_accesses : 1; //!< [0]
unsigned enable_ept : 1; //!< [1]
unsigned descriptor_table_exiting : 1; //!< [2]
unsigned enable_rdtscp : 1; //!< [3]
unsigned virtualize_x2apic_mode : 1; //!< [4]
unsigned enable_vpid : 1; //!< [5]
unsigned wbinvd_exiting : 1; //!< [6]
unsigned unrestricted_guest : 1; //!< [7]
unsigned apic_register_virtualization : 1; //!< [8]
unsigned virtual_interrupt_delivery : 1; //!< [9]
unsigned pause_loop_exiting : 1; //!< [10]
unsigned rdrand_exiting : 1; //!< [11]
unsigned enable_invpcid : 1; //!< [12]
unsigned enable_vm_functions : 1; //!< [13]
unsigned vmcs_shadowing : 1; //!< [14]
unsigned reserved1 : 1; //!< [15]
unsigned rdseed_exiting : 1; //!< [16]
unsigned reserved2 : 1; //!< [17]
unsigned ept_violation_ve : 1; //!< [18]
unsigned reserved3 : 1; //!< [19]
unsigned enable_xsaves_xstors : 1; //!< [20]
unsigned reserved4 : 1; //!< [21]
unsigned mode_based_execute_control_for_ept : 1; //!< [22]
unsigned reserved5 : 2; //!< [23:24]
unsigned use_tsc_scaling : 1; //!< [25]
} fields;
};
/// See: Guest Register State
union VmxRegmentDescriptorAccessRight {
unsigned int all;
struct {
unsigned type : 4; //!< [0:3]
unsigned system : 1; //!< [4]
unsigned dpl : 2; //!< [5:6]
unsigned present : 1; //!< [7]
unsigned reserved1 : 4; //!< [8:11]
unsigned avl : 1; //!< [12]
unsigned l : 1; //!< [13] Reserved (except for CS) 64-bit mode
unsigned db : 1; //!< [14]
unsigned gran : 1; //!< [15]
unsigned unusable : 1; //!< [16] Segment unusable
unsigned reserved2 : 15; //!< [17:31]
} fields;
};
union Cr0 {
ULONG_PTR all;
struct {
unsigned pe : 1; //!< [0] Protected Mode Enabled
unsigned mp : 1; //!< [1] Monitor Coprocessor FLAG
unsigned em : 1; //!< [2] Emulate FLAG
unsigned ts : 1; //!< [3] Task Switched FLAG
unsigned et : 1; //!< [4] Extension Type FLAG
unsigned ne : 1; //!< [5] Numeric Error
unsigned reserved1 : 10; //!< [6:15]
unsigned wp : 1; //!< [16] Write Protect
unsigned reserved2 : 1; //!< [17]
unsigned am : 1; //!< [18] Alignment Mask
unsigned reserved3 : 10; //!< [19:28]
unsigned nw : 1; //!< [29] Not Write-Through
unsigned cd : 1; //!< [30] Cache Disable
unsigned pg : 1; //!< [31] Paging Enabled
} fields;
};
static_assert(sizeof(Cr0) == sizeof(void*), "Size check");
/// See: CONTROL REGISTERS
union Cr4 {
ULONG_PTR all;
struct {
unsigned vme : 1; //!< [0] Virtual Mode Extensions
unsigned pvi : 1; //!< [1] Protected-Mode Virtual Interrupts
unsigned tsd : 1; //!< [2] Time Stamp Disable
unsigned de : 1; //!< [3] Debugging Extensions
unsigned pse : 1; //!< [4] Page Size Extensions
unsigned pae : 1; //!< [5] Physical Address Extension
unsigned mce : 1; //!< [6] Machine-Check Enable
unsigned pge : 1; //!< [7] Page Global Enable
unsigned pce : 1; //!< [8] Performance-Monitoring Counter Enable
unsigned osfxsr : 1; //!< [9] OS Support for FXSAVE/FXRSTOR
unsigned osxmmexcpt : 1; //!< [10] OS Support for Unmasked SIMD Exceptions
unsigned reserved1 : 2; //!< [11:12]
unsigned vmxe : 1; //!< [13] Virtual Machine Extensions Enabled
unsigned smxe : 1; //!< [14] SMX-Enable Bit
unsigned reserved2 : 2; //!< [15:16]
unsigned pcide : 1; //!< [17] PCID Enable
unsigned osxsave : 1; //!< [18] XSAVE and Processor Extended States-Enable
unsigned reserved3 : 1; //!< [19]
unsigned smep : 1; //!< [20] Supervisor Mode Execution Protection Enable
unsigned smap : 1; //!< [21] Supervisor Mode Access Protection Enable
} fields;
};
static_assert(sizeof(Cr4) == sizeof(void*), "Size check");
/// Represents a stack layout after PUSHAQ
union GpRegistersX64 {
ULONG_PTR all[16];
struct {
ULONG_PTR r15;
ULONG_PTR r14;
ULONG_PTR r13;
ULONG_PTR r12;
ULONG_PTR r11;
ULONG_PTR r10;
ULONG_PTR r9;
ULONG_PTR r8;
ULONG_PTR di;
ULONG_PTR si;
ULONG_PTR bp;
ULONG_PTR sp;
ULONG_PTR bx;
ULONG_PTR dx;
ULONG_PTR cx;
ULONG_PTR ax;
};
};
/// Represents a stack layout after PUSHAD
struct GpRegistersX86 {
ULONG_PTR di;
ULONG_PTR si;
ULONG_PTR bp;
ULONG_PTR sp;
ULONG_PTR bx;
ULONG_PTR dx;
ULONG_PTR cx;
ULONG_PTR ax;
};
/// Represents a stack layout after PUSHAx
#if defined(_AMD64_)
using GpRegisters = GpRegistersX64;
#else
using GpRegisters = GpRegistersX86;
#endif
struct KtrapFrameX86 {
ULONG reserved1[26];
ULONG ip; //!< Called EIP in _KTRAP_FRAME
ULONG reserved2[2];
ULONG sp; //!< Called HardwareEsp in _KTRAP_FRAME
ULONG reserved3[5];
};
static_assert(sizeof(KtrapFrameX86) == 0x8c, "structure size mismatch");
#if !defined(__clang__)
static_assert(FIELD_OFFSET(KtrapFrameX86, ip) == 0x68, "structure size mismatch");
static_assert(FIELD_OFFSET(KtrapFrameX86, sp) == 0x74, "structure size mismatch");
#endif
/// nt!_KTRAP_FRAME on x64
struct KtrapFrameX64 {
ULONG64 reserved1[45];
ULONG64 ip; //!< Called EIP in _KTRAP_FRAME
ULONG64 reserved2[2];
ULONG64 sp; //!< Called Rsp in _KTRAP_FRAME
ULONG64 reserved3;
};
static_assert(sizeof(KtrapFrameX64) == 0x190, "structure size mismatch");
#if !defined(__clang__)
static_assert(FIELD_OFFSET(KtrapFrameX64, ip) == 0x168, "structure size mismatch");
static_assert(FIELD_OFFSET(KtrapFrameX64, sp) == 0x180, "structure size mismatch");
#endif
/// See: Stack Usage on Transfers to Interrupt and Exception-Handling Routines
struct MachineFrame {
ULONG_PTR ip;
ULONG_PTR cs;
ULONG_PTR flags;
ULONG_PTR sp;
ULONG_PTR ss;
};
#if defined(_AMD64_)
using KtrapFrame = KtrapFrameX64;
#else
using KtrapFrame = KtrapFrameX86;
#endif
struct VmmInitialStack {
GpRegisters gp_regs;
KtrapFrame trap_frame;
//ProcessorData* processor_data;
};
union MovCrQualification {
ULONG_PTR all;
struct {
ULONG_PTR control_register : 4; //!< [0:3]
ULONG_PTR access_type : 2; //!< [4:5]
ULONG_PTR lmsw_operand_type : 1; //!< [6]
ULONG_PTR reserved1 : 1; //!< [7]
ULONG_PTR gp_register : 4; //!< [8:11]
ULONG_PTR reserved2 : 4; //!< [12:15]
ULONG_PTR lmsw_source_data : 16; //!< [16:31]
ULONG_PTR reserved3 : 32; //!< [32:63]
} fields;
};
#endif // !_VTSTRUCT__INCLUDED__
/// See: BASIC VMX INFORMATION