winhvemulation.h 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /**
  2. * This file is part of the mingw-w64 runtime package.
  3. * No warranty is given; refer to the file DISCLAIMER within this package.
  4. */
  5. #ifndef _WINHVEMUAPI_H_
  6. #define _WINHVEMUAPI_H_
  7. #include <apiset.h>
  8. #include <apisetcconv.h>
  9. #include <minwindef.h>
  10. #include <winapifamily.h>
  11. #if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
  12. #include <winhvplatformdefs.h>
  13. typedef union WHV_EMULATOR_STATUS {
  14. __C89_NAMELESS struct {
  15. UINT32 EmulationSuccessful : 1;
  16. UINT32 InternalEmulationFailure : 1;
  17. UINT32 IoPortCallbackFailed : 1;
  18. UINT32 MemoryCallbackFailed : 1;
  19. UINT32 TranslateGvaPageCallbackFailed : 1;
  20. UINT32 TranslateGvaPageCallbackGpaIsNotAligned : 1;
  21. UINT32 GetVirtualProcessorRegistersCallbackFailed : 1;
  22. UINT32 SetVirtualProcessorRegistersCallbackFailed : 1;
  23. UINT32 InterruptCausedIntercept : 1;
  24. UINT32 GuestCannotBeFaulted : 1;
  25. UINT32 Reserved : 22;
  26. };
  27. UINT32 AsUINT32;
  28. } WHV_EMULATOR_STATUS;
  29. typedef struct WHV_EMULATOR_MEMORY_ACCESS_INFO {
  30. WHV_GUEST_PHYSICAL_ADDRESS GpaAddress;
  31. UINT8 Direction;
  32. UINT8 AccessSize;
  33. UINT8 Data[8];
  34. } WHV_EMULATOR_MEMORY_ACCESS_INFO;
  35. typedef struct WHV_EMULATOR_IO_ACCESS_INFO {
  36. UINT8 Direction;
  37. UINT16 Port;
  38. UINT16 AccessSize;
  39. UINT32 Data;
  40. } WHV_EMULATOR_IO_ACCESS_INFO;
  41. typedef HRESULT (CALLBACK *WHV_EMULATOR_IO_PORT_CALLBACK)(VOID *Context, WHV_EMULATOR_IO_ACCESS_INFO *IoAccess);
  42. typedef HRESULT (CALLBACK *WHV_EMULATOR_MEMORY_CALLBACK)(VOID *Context, WHV_EMULATOR_MEMORY_ACCESS_INFO *MemoryAccess);
  43. typedef HRESULT (CALLBACK *WHV_EMULATOR_GET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK)(VOID *Context, const WHV_REGISTER_NAME *RegisterNames, UINT32 RegisterCount, WHV_REGISTER_VALUE *RegisterValues);
  44. typedef HRESULT (CALLBACK *WHV_EMULATOR_SET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK)(VOID *Context, const WHV_REGISTER_NAME *RegisterNames, UINT32 RegisterCount, const WHV_REGISTER_VALUE *RegisterValues);
  45. typedef HRESULT (CALLBACK *WHV_EMULATOR_TRANSLATE_GVA_PAGE_CALLBACK)(VOID *Context, WHV_GUEST_VIRTUAL_ADDRESS Gva, WHV_TRANSLATE_GVA_FLAGS TranslateFlags, WHV_TRANSLATE_GVA_RESULT_CODE *TranslationResult, WHV_GUEST_PHYSICAL_ADDRESS *Gpa);
  46. typedef struct WHV_EMULATOR_CALLBACKS {
  47. UINT32 Size;
  48. UINT32 Reserved;
  49. WHV_EMULATOR_IO_PORT_CALLBACK WHvEmulatorIoPortCallback;
  50. WHV_EMULATOR_MEMORY_CALLBACK WHvEmulatorMemoryCallback;
  51. WHV_EMULATOR_GET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK WHvEmulatorGetVirtualProcessorRegisters;
  52. WHV_EMULATOR_SET_VIRTUAL_PROCESSOR_REGISTERS_CALLBACK WHvEmulatorSetVirtualProcessorRegisters;
  53. WHV_EMULATOR_TRANSLATE_GVA_PAGE_CALLBACK WHvEmulatorTranslateGvaPage;
  54. } WHV_EMULATOR_CALLBACKS;
  55. typedef VOID* WHV_EMULATOR_HANDLE;
  56. #ifdef __cplusplus
  57. extern "C" {
  58. #endif
  59. HRESULT WINAPI WHvEmulatorCreateEmulator(const WHV_EMULATOR_CALLBACKS *Callbacks, WHV_EMULATOR_HANDLE *Emulator);
  60. HRESULT WINAPI WHvEmulatorDestroyEmulator(WHV_EMULATOR_HANDLE Emulator);
  61. HRESULT WINAPI WHvEmulatorTryIoEmulation(WHV_EMULATOR_HANDLE Emulator, VOID *Context, const WHV_VP_EXIT_CONTEXT *VpContext, const WHV_X64_IO_PORT_ACCESS_CONTEXT *IoInstructionContext, WHV_EMULATOR_STATUS *EmulatorReturnStatus);
  62. HRESULT WINAPI WHvEmulatorTryMmioEmulation(WHV_EMULATOR_HANDLE Emulator, VOID *Context, const WHV_VP_EXIT_CONTEXT *VpContext, const WHV_MEMORY_ACCESS_CONTEXT *MmioInstructionContext, WHV_EMULATOR_STATUS *EmulatorReturnStatus);
  63. #ifdef __cplusplus
  64. }
  65. #endif
  66. #endif
  67. #endif