extern exit_handler : proc extern vmresume_failure : proc .code vmxlaunch_processor proc pushfq ; vmlaunch sets some flags if an error happens... mov rcx, 0681Ch ; VMCS_GUEST_RSP vmwrite rcx, rsp ; current rsp pointer... mov rcx, 0681Eh ; VMCS_GUEST_RIP lea rdx, done ; vmwrite rcx, rdx ; return C0FFEE on success... vmlaunch pushfq ; push rflags to the stack then put it into rax... pop rax ; popfq ; restore rflags back to what it was in the c++ code... ret done: popfq ; restore flags and return back to c++ code... mov rax, 0C0FFEEh ret vmxlaunch_processor endp vmxexit_handler proc push rax push rbx push rcx push rdx push rsi push rdi push rbp push r8 push r9 push r10 push r11 push r12 push r13 push r14 push r15 sub rsp, 0108h ; 16 xmm registers... and +8 bytes for alignment... movaps [rsp], xmm0 movaps [rsp + 010h], xmm1 movaps [rsp + 020h], xmm2 movaps [rsp + 030h], xmm3 movaps [rsp + 040h], xmm4 movaps [rsp + 050h], xmm5 movaps [rsp + 060h], xmm6 movaps [rsp + 070h], xmm7 movaps [rsp + 080h], xmm8 movaps [rsp + 090h], xmm9 movaps [rsp + 0A0h], xmm10 movaps [rsp + 0B0h], xmm11 movaps [rsp + 0C0h], xmm12 movaps [rsp + 0D0h], xmm13 movaps [rsp + 0E0h], xmm14 movaps [rsp + 0F0h], xmm15 mov rcx, rsp sub rsp, 20h call exit_handler add rsp, 20h movups xmm0, [rsp] movups xmm1, [rsp + 010h] movups xmm2, [rsp + 020h] movups xmm3, [rsp + 030h] movups xmm4, [rsp + 040h] movups xmm5, [rsp + 050h] movups xmm6, [rsp + 060h] movups xmm7, [rsp + 070h] movups xmm8, [rsp + 080h] movups xmm9, [rsp + 090h] movups xmm10, [rsp + 0A0h] movups xmm11, [rsp + 0B0h] movups xmm12, [rsp + 0C0h] movups xmm13, [rsp + 0D0h] movups xmm14, [rsp + 0E0h] movups xmm15, [rsp + 0F0h] add rsp, 0108h ; 16 xmm registers... and +8 bytes for alignment... pop r15 pop r14 pop r13 pop r12 pop r11 pop r10 pop r9 pop r8 pop rbp pop rdi pop rsi pop rdx pop rcx pop rbx pop rax vmresume call vmresume_failure int 3 vmxexit_handler endp end