1 /*++ 2 3 Copyright (c) Microsoft Corporation. All rights reserved. 4 5 Module Name: 6 7 WinHvEmu.ext 8 9 Abstract: 10 11 ApiSet contract for the Windows Hyper-V Instruction Emulator APIs. 12 13 --*/ 14 15 #ifndef _WINHVEMUAPI_H_ 16 #define _WINHVEMUAPI_H_ 17 18 #if defined(_MSC_VER) && (_MSC_VER >= 1200) 19 #pragma once 20 #pragma warning(push) 21 #pragma warning(disable:4201) /* nonstandard extension used : nameless struct/union */ 22 #endif 23 24 /*#include <apiset.h> 25 #include <apisetcconv.h> 26 #include <minwindef.h> 27 #include <winapifamily.h> 28 29 #pragma region Desktop Family or OneCore Family 30 #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) 31 32 #include <WinHvPlatformDefs.h>*/ 33 34 #define CALLBACK __stdcall 35 #define _Inout_ 36 37 typedef union WHV_EMULATOR_STATUS 38 { 39 struct 40 { 41 UINT32 EmulationSuccessful : 1; 42 UINT32 InternalEmulationFailure : 1; 43 UINT32 IoPortCallbackFailed : 1; 44 UINT32 MemoryCallbackFailed : 1; 45 UINT32 TranslateGvaPageCallbackFailed : 1; 46 UINT32 TranslateGvaPageCallbackGpaIsNotAligned : 1; 47 UINT32 GetVirtualProcessorRegistersCallbackFailed : 1; 48 UINT32 SetVirtualProcessorRegistersCallbackFailed : 1; 49 UINT32 InterruptCausedIntercept : 1; 50 UINT32 GuestCannotBeFaulted : 1; 51 UINT32 Reserved : 22; 52 }; 53 54 UINT32 AsUINT32; 55 } WHV_EMULATOR_STATUS; 56 57 #if defined(_MSC_VER) && (_MSC_VER >= 1200) 58 #pragma warning(pop) 59 #endif 60 61 // 62 // Callbacks registered in emulator creation 63 // 64 65 typedef struct WHV_EMULATOR_MEMORY_ACCESS_INFO 66 { 67 WHV_GUEST_PHYSICAL_ADDRESS GpaAddress; 68 UINT8 Direction; 69 UINT8 AccessSize; 70 UINT8 Data[8]; 71 } WHV_EMULATOR_MEMORY_ACCESS_INFO; 72 73 typedef struct WHV_EMULATOR_IO_ACCESS_INFO 74 { 75 UINT8 Direction; 76 UINT16 Port; 77 UINT16 AccessSize; 78 UINT32 Data; 79 } WHV_EMULATOR_IO_ACCESS_INFO; 80 81 typedef HRESULT (CALLBACK *WHV_EMULATOR_IO_PORT_CALLBACK)( 82 _In_ VOID* Context, 83 _Inout_ WHV_EMULATOR_IO_ACCESS_INFO* IoAccess 84 ); 85 86 typedef HRESULT (CALLBACK *WHV_EMULATOR_MEMORY_CALLBACK)( 87 _In_ VOID* Context, 88 _Inout_ WHV_EMULATOR_MEMORY_ACCESS_INFO* MemoryAccess 89 ); 90 91 typedef HRESULT (CALLBACK *WHV_EMULATOR_GET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK)( 92 _In_ VOID* Context, 93 _In_reads_(RegisterCount) const WHV_REGISTER_NAME* RegisterNames, 94 _In_ UINT32 RegisterCount, 95 _Out_writes_(RegisterCount) WHV_REGISTER_VALUE* RegisterValues 96 ); 97 98 typedef HRESULT (CALLBACK *WHV_EMULATOR_SET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK)( 99 _In_ VOID* Context, 100 _In_reads_(RegisterCount) const WHV_REGISTER_NAME* RegisterNames, 101 _In_ UINT32 RegisterCount, 102 _In_reads_(RegisterCount) const WHV_REGISTER_VALUE* RegisterValues 103 ); 104 105 typedef HRESULT (CALLBACK *WHV_EMULATOR_TRANSLATE_GVA_PAGE_CALLBACK)( 106 _In_ VOID* Context, 107 _In_ WHV_GUEST_VIRTUAL_ADDRESS Gva, 108 _In_ WHV_TRANSLATE_GVA_FLAGS TranslateFlags, 109 _Out_ WHV_TRANSLATE_GVA_RESULT_CODE* TranslationResult, 110 _Out_ WHV_GUEST_PHYSICAL_ADDRESS* Gpa 111 ); 112 113 typedef struct WHV_EMULATOR_CALLBACKS 114 { 115 UINT32 Size; 116 UINT32 Reserved; 117 WHV_EMULATOR_IO_PORT_CALLBACK WHvEmulatorIoPortCallback; 118 WHV_EMULATOR_MEMORY_CALLBACK WHvEmulatorMemoryCallback; 119 WHV_EMULATOR_GET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK WHvEmulatorGetVirtualProcessorRegisters; 120 WHV_EMULATOR_SET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK WHvEmulatorSetVirtualProcessorRegisters; 121 WHV_EMULATOR_TRANSLATE_GVA_PAGE_CALLBACK WHvEmulatorTranslateGvaPage; 122 } WHV_EMULATOR_CALLBACKS; 123 124 typedef VOID* WHV_EMULATOR_HANDLE; 125 126 // 127 // Public callable functions 128 // 129 130 #ifdef __cplusplus 131 extern "C" { 132 #endif 133 134 HRESULT 135 WINAPI 136 WHvEmulatorCreateEmulator( 137 _In_ const WHV_EMULATOR_CALLBACKS* Callbacks, 138 _Out_ WHV_EMULATOR_HANDLE* Emulator 139 ); 140 141 142 HRESULT 143 WINAPI 144 WHvEmulatorDestroyEmulator( 145 _In_ WHV_EMULATOR_HANDLE Emulator 146 ); 147 148 149 150 HRESULT 151 WINAPI 152 WHvEmulatorTryIoEmulation( 153 _In_ WHV_EMULATOR_HANDLE Emulator, 154 _In_ VOID* Context, 155 _In_ const WHV_VP_EXIT_CONTEXT* VpContext, 156 _In_ const WHV_X64_IO_PORT_ACCESS_CONTEXT* IoInstructionContext, 157 _Out_ WHV_EMULATOR_STATUS* EmulatorReturnStatus 158 ); 159 160 161 HRESULT 162 WINAPI 163 WHvEmulatorTryMmioEmulation( 164 _In_ WHV_EMULATOR_HANDLE Emulator, 165 _In_ VOID* Context, 166 _In_ const WHV_VP_EXIT_CONTEXT* VpContext, 167 _In_ const WHV_MEMORY_ACCESS_CONTEXT* MmioInstructionContext, 168 _Out_ WHV_EMULATOR_STATUS* EmulatorReturnStatus 169 ); 170 171 172 #ifdef __cplusplus 173 } 174 #endif 175 176 //#endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_SYSTEM) 177 //#pragma endregion 178 179 #endif // _WINHVEMUAPI_H_ 180 181 182 #ifndef ext_ms_win_hyperv_hvemulation_l1_1_0_query_routines 183 #define ext_ms_win_hyperv_hvemulation_l1_1_0_query_routines 184 185 186 187 // 188 //Private Extension API Query Routines 189 // 190 191 #ifdef __cplusplus 192 extern "C" { 193 #endif 194 195 BOOLEAN 196 __stdcall 197 IsWHvEmulatorCreateEmulatorPresent( 198 VOID 199 ); 200 201 BOOLEAN 202 __stdcall 203 IsWHvEmulatorDestroyEmulatorPresent( 204 VOID 205 ); 206 207 BOOLEAN 208 __stdcall 209 IsWHvEmulatorTryIoEmulationPresent( 210 VOID 211 ); 212 213 BOOLEAN 214 __stdcall 215 IsWHvEmulatorTryMmioEmulationPresent( 216 VOID 217 ); 218 219 #ifdef __cplusplus 220 } 221 #endif 222 223 #endif // endof guard 224 225