Resurrected Raw Mode Switch routine that had been commented out. The actual code that calls this routine will be in the next patch. Changelog: DOSVM now exports DPMI Raw Mode Switch routine. Index: dlls/winedos/int31.c =================================================================== RCS file: /home/wine/wine/dlls/winedos/int31.c,v retrieving revision 1.4 diff -u -r1.4 int31.c --- dlls/winedos/int31.c 25 Apr 2002 21:40:56 -0000 1.4 +++ dlls/winedos/int31.c 5 May 2002 09:33:43 -0000 @@ -512,31 +512,23 @@ /* DPMI Raw Mode Switch handler */ -#if 0 -void WINAPI DPMI_RawModeSwitch( SIGCONTEXT *context ) +void WINAPI DOSVM_RawModeSwitch( CONTEXT86 *context ) { - LPDOSTASK lpDosTask = MZ_Current(); CONTEXT86 rm_ctx; int ret; - if (!lpDosTask) { - /* we could probably start a DPMI-only dosmod task here, but I doubt - anything other than real DOS apps want to call raw mode switch */ - ERR("attempting raw mode switch without DOS task!\n"); - ExitProcess(1); - } /* initialize real-mode context as per spec */ memset(&rm_ctx, 0, sizeof(rm_ctx)); - rm_ctx.SegDs = AX_sig(context); - rm_ctx.SegEs = CX_sig(context); - rm_ctx.SegSs = DX_sig(context); - rm_ctx.Esp = EBX_sig(context); - rm_ctx.SegCs = SI_sig(context); - rm_ctx.Eip = EDI_sig(context); - rm_ctx.Ebp = EBP_sig(context); + rm_ctx.SegDs = AX_reg(context); + rm_ctx.SegEs = CX_reg(context); + rm_ctx.SegSs = DX_reg(context); + rm_ctx.Esp = context->Ebx; + rm_ctx.SegCs = SI_reg(context); + rm_ctx.Eip = context->Edi; + rm_ctx.Ebp = context->Ebp; rm_ctx.SegFs = 0; rm_ctx.SegGs = 0; - rm_ctx.EFlags = EFL_sig(context); /* at least we need the IF flag */ + rm_ctx.EFlags = context->EFlags; /* at least we need the IF flag */ /* enter real mode again */ TRACE("re-entering real mode at %04lx:%04lx\n",rm_ctx.SegCs,rm_ctx.Eip); @@ -545,26 +537,26 @@ DOSVM_Enter will return and we will continue here */ if (ret<0) { + ERR("Sync lost!\n"); /* if the sync was lost, there's no way to recover */ ExitProcess(1); } /* alter protected-mode context as per spec */ - DS_sig(context) = LOWORD(rm_ctx.Eax); - ES_sig(context) = LOWORD(rm_ctx.Ecx); - SS_sig(context) = LOWORD(rm_ctx.Edx); - ESP_sig(context) = rm_ctx.Ebx; - CS_sig(context) = LOWORD(rm_ctx.Esi); - EIP_sig(context) = rm_ctx.Edi; - EBP_sig(context) = rm_ctx.Ebp; - FS_sig(context) = 0; - GS_sig(context) = 0; + context->SegDs = LOWORD(rm_ctx.Eax); + context->SegEs = LOWORD(rm_ctx.Ecx); + context->SegSs = LOWORD(rm_ctx.Edx); + context->Esp = rm_ctx.Ebx; + context->SegCs = LOWORD(rm_ctx.Esi); + context->Eip = rm_ctx.Edi; + context->Ebp = rm_ctx.Ebp; + context->SegFs = 0; + context->SegGs = 0; /* Return to new address and hope that we didn't mess up */ - TRACE("re-entering protected mode at %04x:%08lx\n", - CS_sig(context), EIP_sig(context)); + TRACE("re-entering protected mode at %04lx:%08lx\n", + context->SegCs, context->Eip); } -#endif /********************************************************************** Index: dlls/winedos/winedos.spec =================================================================== RCS file: /home/wine/wine/dlls/winedos/winedos.spec,v retrieving revision 1.7 diff -u -r1.7 winedos.spec --- dlls/winedos/winedos.spec 7 Jan 2002 21:16:47 -0000 1.7 +++ dlls/winedos/winedos.spec 5 May 2002 09:35:17 -0000 @@ -15,6 +15,7 @@ @ stdcall CallRMProc(ptr long) DOSVM_CallRMProc @ stdcall AllocRMCB(ptr) DOSVM_AllocRMCB @ stdcall FreeRMCB(ptr) DOSVM_FreeRMCB +@ stdcall RawModeSwitch(ptr) DOSVM_RawModeSwitch # I/O functions @ stdcall SetTimer(long) DOSVM_SetTimer -- Jukka Heinonen <http://www.iki.fi/jhei/>