diff --git a/include/callback.h b/include/callback.h index f2b634ba449..ddf73daaf2b 100644 --- a/include/callback.h +++ b/include/callback.h @@ -32,6 +32,7 @@ typedef struct { void (WINAPI *CallRMProc)( CONTEXT86 *context, int iret ); void (WINAPI *AllocRMCB)( CONTEXT86 *context ); void (WINAPI *FreeRMCB)( CONTEXT86 *context ); + void (WINAPI *RawModeSwitch)( CONTEXT86 *context ); /* I/O functions */ void (WINAPI *SetTimer)( unsigned ticks ); diff --git a/msdos/dpmi.c b/msdos/dpmi.c index 021c94d273a..a3b37f3ba2e 100644 --- a/msdos/dpmi.c +++ b/msdos/dpmi.c @@ -65,6 +65,7 @@ BOOL DPMI_LoadDosSystem(void) GET_ADDR(CallRMProc); GET_ADDR(AllocRMCB); GET_ADDR(FreeRMCB); + GET_ADDR(RawModeSwitch); GET_ADDR(SetTimer); GET_ADDR(GetTimer); GET_ADDR(inport); @@ -190,6 +191,15 @@ static void FreeRMCB( CONTEXT86 *context ) else Dosvm.FreeRMCB( context ); } +static void RawModeSwitch( CONTEXT86 *context ) +{ + if (!Dosvm.RawModeSwitch) + { + ERR("could not setup real-mode calls\n"); + return; + } + else Dosvm.RawModeSwitch( context ); +} /********************************************************************** * INT_Int31Handler (WPROCS.149) @@ -207,6 +217,11 @@ void WINAPI INT_Int31Handler( CONTEXT86 *context ) DWORD dw; BYTE *ptr; + if (context->SegCs == DOSMEM_dpmi_sel) { + RawModeSwitch( context ); + return; + } + RESET_CFLAG(context); switch(AX_reg(context)) { diff --git a/msdos/int2f.c b/msdos/int2f.c index 4585c667aa3..9f83b674351 100644 --- a/msdos/int2f.c +++ b/msdos/int2f.c @@ -356,9 +356,6 @@ static void do_int2f_16( CONTEXT86 *context ) break; case 0x87: /* DPMI installation check */ -#if 1 /* DPMI still breaks pkunzip */ - if (ISV86(context)) break; /* so bail out for now if in v86 mode */ -#endif { SYSTEM_INFO si; GetSystemInfo(&si);