#pragma once #include #include #include #define PORT_NUM 0x2F8 #define VMEXIT_KEY 0xDEADBEEFDEADBEEF #define DBG_PRINT(arg) \ __outbytestring(PORT_NUM, (unsigned char*)arg, sizeof arg); using u8 = unsigned char; using u16 = unsigned short; using u32 = unsigned int; using u64 = unsigned long long; using u128 = __m128; enum class vmexit_command_t { init_paging_tables = 0x111 // add your commands here... }; typedef struct _context_t { u64 rax; u64 rcx; u64 rdx; u64 rbx; u64 rsp; u64 rbp; u64 rsi; u64 rdi; u64 r8; u64 r9; u64 r10; u64 r11; u64 r12; u64 r13; u64 r14; u64 r15; u128 xmm0; u128 xmm1; u128 xmm2; u128 xmm3; u128 xmm4; u128 xmm5; } context_t, *pcontext_t; #if WINVER > 1803 using vmexit_handler_t = void (__fastcall*)(pcontext_t* context, void* unknown); #else using vmexit_handler_t = void(__fastcall*)(pcontext_t context, void* unknown); #endif #pragma pack(push, 1) typedef struct _voyager_t { // RVA from golden record entry ---> back to original vmexit handler... u64 vmexit_handler_rva; u64 hyperv_module_base; u64 hyperv_module_size; u64 record_base; u64 record_size; } voyager_t, *pvoyager_t; #pragma pack(pop) __declspec(dllexport) inline voyager_t voyager_context;