diff options
Diffstat (limited to 'shv_x.h')
-rw-r--r-- | shv_x.h | 80 |
1 files changed, 68 insertions, 12 deletions
@@ -23,26 +23,85 @@ Environment: #pragma once +#include "vmx.h" + #define SHV_STATUS_SUCCESS 0 #define SHV_STATUS_NOT_AVAILABLE -1 #define SHV_STATUS_NO_RESOURCES -2 #define SHV_STATUS_NOT_PRESENT -3 -typedef struct _SHV_CALLBACK_CONTEXT -{ - UINT64 Cr3; - volatile long InitCount; - INT32 FailedCpu; - INT32 FailureStatus; -} SHV_CALLBACK_CONTEXT, *PSHV_CALLBACK_CONTEXT; +struct _SHV_CALLBACK_CONTEXT; typedef void SHV_CPU_CALLBACK ( - _In_ PSHV_CALLBACK_CONTEXT Context + struct _SHV_CALLBACK_CONTEXT* Context ); typedef SHV_CPU_CALLBACK *PSHV_CPU_CALLBACK; +typedef struct _SHV_SPECIAL_REGISTERS +{ + UINT64 Cr0; + UINT64 Cr3; + UINT64 Cr4; + UINT64 MsrGsBase; + UINT16 Tr; + UINT16 Ldtr; + UINT64 DebugControl; + UINT64 KernelDr7; + KDESCRIPTOR Idtr; + KDESCRIPTOR Gdtr; +} SHV_SPECIAL_REGISTERS, *PSHV_SPECIAL_REGISTERS; + +typedef struct _SHV_VP_DATA +{ + union + { + DECLSPEC_ALIGN(PAGE_SIZE) UINT8 ShvStackLimit[KERNEL_STACK_SIZE]; + struct + { + SHV_SPECIAL_REGISTERS SpecialRegisters; + CONTEXT ContextFrame; + UINT64 SystemDirectoryTableBase; + LARGE_INTEGER MsrData[17]; + UINT64 VmxOnPhysicalAddress; + UINT64 VmcsPhysicalAddress; + UINT64 MsrBitmapPhysicalAddress; + UINT64 EptPml4PhysicalAddress; + UINT32 EptControls; + }; + }; + + DECLSPEC_ALIGN(PAGE_SIZE) UINT8 MsrBitmap[PAGE_SIZE]; + DECLSPEC_ALIGN(PAGE_SIZE) VMX_EPML4E Epml4[PML4E_ENTRY_COUNT]; + DECLSPEC_ALIGN(PAGE_SIZE) VMX_HUGE_PDPTE Epdpt[PDPTE_ENTRY_COUNT]; + + DECLSPEC_ALIGN(PAGE_SIZE) VMX_VMCS VmxOn; + DECLSPEC_ALIGN(PAGE_SIZE) VMX_VMCS Vmcs; +} SHV_VP_DATA, *PSHV_VP_DATA; + +C_ASSERT(sizeof(SHV_VP_DATA) == (KERNEL_STACK_SIZE + 5 * PAGE_SIZE)); + +VOID +_sldt ( + _In_ UINT16* Ldtr + ); + +VOID +_ltr ( + _In_ UINT16 Tr + ); + +VOID +_str ( + _In_ UINT16* Tr + ); + +VOID +__lgdt ( + _In_ VOID* Gdtr + ); + INT32 ShvLoad ( VOID @@ -51,7 +110,4 @@ ShvLoad ( VOID ShvUnload ( VOID - ); - -SHV_CPU_CALLBACK ShvVpLoadCallback; -SHV_CPU_CALLBACK ShvVpUnloadCallback; + );
\ No newline at end of file |