I think you must revide VMCS settings - something is missing or misconfigured - at first try to check all guest-state fields
I encountered also some strange behaviour with my hypervisor, luckily solved that already.
Does you hypervisor share paging tables with guest (host CR3 = guest CR3 at the first execution of VMLAUNCH)?
I had olways hangs while sharing virtual spaces. No matter only my hypervisor, I also tried another which host_CR3=guest_CR3 and had hangs.
That ugly thing disappeared after creating private paging tables and private system structures for hypervisor.
I'm loading it as driver from running ms win. Later was also able to turn it off and resume OS without necessity of reboot (much less effort although it is not so well documented as detailed documentation how to create and launch hypervisor) - it saves a lot of time if you recompile more versions every day after implementig every small step.
My hypervisor driver (after made it stable) is doing these things:
[0] preparing few MB of nonpaged aligned memory (MmAllocateContiguousMemorySpecifyCache + MmProbeAndLockPages + zeroing memory). 2 MB without virtualization of guest memory, 4 MB when virtualizing guest memory.
[1] creating all necessary hypervisor things shared among all CPUs (paging tables, IDT, GDT, TSS, ...) + copying the hypervisor code from driver memory into hypervisor memory allocated in step 0
[2] now per CPU private things:
2a. detecting CPU capabilities
2b. setting some MSRs
2c. setting vmxon region and doing vmxon
2d. setting VMCS region
2e. vmlaunch
2f. guests goes on under control of hypervisor
[3] when all CPUs finish the step 2. then unmap the hypervisor memory from guest paging tables (MmFreeContiguousMemory) so guest cannot see it easily (guest still able to access host if it knows host physical memory address and calls MmGetSystemAddressForMdlSafe or another way using DMA transfer, that can be defeated using memory virtualization and protection against DMA)
What helped in my case - it seems that completely splitting hypervisor memory from guest. It was years ago but till today I still don't know why.
Maybe I had only bug in the first design and rewriting the source file caused to correct the previous mistake, but was unable to find anything suspicious.
Disadvantage in that design is the separation - not easy to detect what happened in host in case of malfunction. Solved that by not clever solution (didn't find another choice, my developmental PC didn't have serial port) - didn't call MmFreeContiguousMemory in step 3, storing debug data in hypervisor memory, storing pointer in driver pointing to the new location of hypervisor memory, analyzing crash dump file). Later I developed simple ring3 interface to read the whole hypervisor memory (its contiguous physical memory) and display it under guest (was able to see some debug info stored in hypervisor memory at certain positions).
The nightmare for me were hangs as in your case (no crash dump file, no opinion what went wrong).
first instruction in guest before calling "VMLaunch"
is it like this?
int3
vmlaunch
I think the guest is running
after succesfully executing VMLAUNCH
immediately before VMLAUNCH it is not yet guest
What is in zero flag and carry flag after failure of VMLAUNCH?
What is in VM-exit information field after VMLAUNCH failure?