VMLAUNCH Returns 7
Posted: Sun Jul 13, 2025 5:36 pm
I'm trying to experiment using VMX to load a proprietary gpu driver from linux to my OS, now I just want to start simple it returns 7 on vmlaunch
the code is running in kernel mode, uefi, 64 Bit. VMWARE.
the code is running in kernel mode, uefi, 64 Bit. VMWARE.
Code: Select all
void VmStart(void* VmxMem) {
_disable();
EnhancedMemClr(VmxMem, 0x8000);
UINT32* VmxOn = VmxMem;
UINT32* VmCs = (UINT32*)((char*)VmxMem + 0x1000);
UINT32 RevId = (UINT32)(__readmsr(0x480) & 0x7FFFFFFF);
BOOTDATA->SimpleConOut(L" VM BASIC %lx FEATURE_CONTROL %lx VMXONRegion %lx", __readmsr(0x480), __readmsr(0x3A), VmxOn);
BOOTDATA->SimpleConOut(L"VMEXITHANDLER %lx GDTR B %lx L %lx IDTR B %lx L %lx TSS %lx", VmExitHandler, __GDTR.base, (UINT64)__GDTR.limit, __IDTR.base, (UINT64)__IDTR.limit, &__TSS);
*VmxOn = RevId;
*VmCs = RevId;
int Code;
if((Code = _VmxOn(VmxOn)))
{
BOOTDATA->SimpleConOut(L"VMXON Failed %d", Code);
}
UINT64 error;
__vmx_vmread(0x4400 /* VM_INSTRUCTION_ERROR */, &error);
BOOTDATA->SimpleConOut(L"VMERR = %llu", error);
UINT64 GuestStack = (UINT64)VmxMem + 0x5000;
__vmx_vmwrite(GUEST_CR0, __readcr0());
__vmx_vmwrite(GUEST_CR4, __readcr4());
__vmx_vmwrite(GUEST_CR3, __readcr3());
__vmx_vmwrite(GUEST_CS_SELECTOR, 0x8);
__vmx_vmwrite(GUEST_RIP, (UINT64)_VmxGuest);
__vmx_vmwrite(GUEST_RSP, GuestStack);
__vmx_vmwrite(GUEST_RFLAGS, __readeflags());
// Host state
__vmx_vmwrite(HOST_CR0, __readcr0());
__vmx_vmwrite(HOST_CR3, __readcr3());
__vmx_vmwrite(HOST_CR4, __readcr4());
__vmx_vmwrite(HOST_CS_SELECTOR, 0x8);
__vmx_vmwrite(HOST_SS_SELECTOR, 0x10);
__vmx_vmwrite(HOST_DS_SELECTOR, 0x10);
__vmx_vmwrite(HOST_RSP, (UINT64)GuestStack + 0x2000);
__vmx_vmwrite(HOST_RIP, (UINT64)VmExitHandler);
gvmcs(HOST_IA32_SYSENTER_CS, 0x10); // kernel data segment
gvmcs(HOST_IA32_SYSENTER_EIP, (UINT64)VmExitHandler); // or 0
gvmcs(HOST_IA32_SYSENTER_ESP, (UINT64)GuestStack +0x2000); // valid stack
if((Code = _VmxVmLaunch())) {
__vmx_vmread(0x4400 /* VM_INSTRUCTION_ERROR */, &error);
BOOTDATA->SimpleConOut(L"VMLAUNCH Err = %llu", error);
}
}