Hi all!
I think i found a bug in VM86 exception handling (must be regression, i guess). Short Wine function flow:
On privileged instruction __wine_enter_vm86 saves vm86 registers in CONTEXT and starts raise_segv_exception. raise_segv_exception routes exception to the INSTR_EmulateInstruction and then to winedos I/O emulator, then tries to use NtSetContextThread(GetCurrentThread(), CONTEXT). NtSetContextThread obviously fails because of VM86 segment values in CONTEXT.
My opinion is that NtSetContextThread call is wrong; __wine_enter_vm86 would restore vm86 registers correctly. I think i know what is the problem; however, I lack experience to fix it myself :) I need help; any hints would be appreciated.