-
Notifications
You must be signed in to change notification settings - Fork 258
/
shv_x.h
126 lines (98 loc) · 2.51 KB
/
shv_x.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*++
Copyright (c) Alex Ionescu. All rights reserved.
Header Name:
shv_x.h
Abstract:
This header defines the externally visible structures and functions of the
Simple Hyper Visor which are visible between the OS layer and SimpleVisor.
Author:
Alex Ionescu (@aionescu) 29-Aug-2016 - Initial version
Environment:
Kernel mode only.
--*/
#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
#define _1GB (1 * 1024 * 1024 * 1024)
#define _2MB (2 * 1024 * 1024)
struct _SHV_CALLBACK_CONTEXT;
typedef
void
SHV_CPU_CALLBACK (
_In_ 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_MTRR_RANGE
{
UINT32 Enabled;
UINT32 Type;
UINT64 PhysicalAddressMin;
UINT64 PhysicalAddressMax;
} SHV_MTRR_RANGE, *PSHV_MTRR_RANGE;
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];
SHV_MTRR_RANGE MtrrData[16];
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_PDPTE Epdpt[PDPTE_ENTRY_COUNT];
DECLSPEC_ALIGN(PAGE_SIZE) VMX_LARGE_PDE Epde[PDPTE_ENTRY_COUNT][PDE_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 + (512 + 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
);
VOID
ShvUnload (
VOID
);