Don't share some protected mode interrupts in winedos.

This commit is contained in:
Mike McCormack 2003-10-08 19:07:45 +00:00 committed by Alexandre Julliard
parent 7b7efbe031
commit 8365577125
2 changed files with 75 additions and 9 deletions

View File

@ -25,6 +25,7 @@
#include "wine/winbase16.h"
#include "thread.h"
#include "task.h"
WINE_DEFAULT_DEBUG_CHANNEL(int);
WINE_DECLARE_DEBUG_CHANNEL(relay);
@ -562,9 +563,42 @@ void DOSVM_SetRMHandler( BYTE intnum, FARPROC16 handler )
*/
FARPROC16 DOSVM_GetPMHandler16( BYTE intnum )
{
TDB *pTask;
FARPROC16 proc = 0;
pTask = GlobalLock16(GetCurrentTask());
if (pTask)
{
switch( intnum )
{
case 0x00:
proc = pTask->int0;
break;
case 0x02:
proc = pTask->int2;
break;
case 0x04:
proc = pTask->int4;
break;
case 0x06:
proc = pTask->int6;
break;
case 0x07:
proc = pTask->int7;
break;
case 0x3e:
proc = pTask->int3e;
break;
case 0x75:
proc = pTask->int75;
break;
}
if( proc )
return proc;
}
if (!DOSVM_Vectors16[intnum])
{
FARPROC16 proc = (FARPROC16)MAKESEGPTR( DOSVM_dpmi_segments->int16_sel,
proc = (FARPROC16)MAKESEGPTR( DOSVM_dpmi_segments->int16_sel,
DOSVM_STUB_PM16 * intnum );
DOSVM_Vectors16[intnum] = proc;
}
@ -579,9 +613,41 @@ FARPROC16 DOSVM_GetPMHandler16( BYTE intnum )
*/
void DOSVM_SetPMHandler16( BYTE intnum, FARPROC16 handler )
{
TDB *pTask;
TRACE("Set protected mode interrupt vector %02x <- %04x:%04x\n",
intnum, HIWORD(handler), LOWORD(handler) );
DOSVM_Vectors16[intnum] = handler;
pTask = GlobalLock16(GetCurrentTask());
if (!pTask)
return;
switch( intnum )
{
case 0x00:
pTask->int0 = handler;
break;
case 0x02:
pTask->int2 = handler;
break;
case 0x04:
pTask->int4 = handler;
break;
case 0x06:
pTask->int6 = handler;
break;
case 0x07:
pTask->int7 = handler;
break;
case 0x3e:
pTask->int3e = handler;
break;
case 0x75:
pTask->int75 = handler;
break;
default:
DOSVM_Vectors16[intnum] = handler;
break;
}
}

View File

@ -98,13 +98,13 @@ typedef struct _TDB
FARPROC16 sighandler WINE_PACKED; /* 26 Signal handler */
FARPROC16 userhandler WINE_PACKED; /* 2a USER signal handler */
FARPROC16 discardhandler WINE_PACKED; /* 2e Handler for GlobalNotify() */
DWORD int0 WINE_PACKED; /* 32 int 0 (divide by 0) handler */
DWORD int2 WINE_PACKED; /* 36 int 2 (NMI) handler */
DWORD int4 WINE_PACKED; /* 3a int 4 (INTO) handler */
DWORD int6 WINE_PACKED; /* 3e int 6 (invalid opc) handler */
DWORD int7 WINE_PACKED; /* 42 int 7 (coprocessor) handler */
DWORD int3e WINE_PACKED; /* 46 int 3e (80x87 emu) handler */
DWORD int75 WINE_PACKED; /* 4a int 75 (80x87 error) handler */
FARPROC16 int0 WINE_PACKED; /* 32 int 0 (divide by 0) handler */
FARPROC16 int2 WINE_PACKED; /* 36 int 2 (NMI) handler */
FARPROC16 int4 WINE_PACKED; /* 3a int 4 (INTO) handler */
FARPROC16 int6 WINE_PACKED; /* 3e int 6 (invalid opc) handler */
FARPROC16 int7 WINE_PACKED; /* 42 int 7 (coprocessor) handler */
FARPROC16 int3e WINE_PACKED; /* 46 int 3e (80x87 emu) handler */
FARPROC16 int75 WINE_PACKED; /* 4a int 75 (80x87 error) handler */
DWORD compat_flags WINE_PACKED; /* 4e Compatibility flags */
BYTE unused4[2]; /* 52 */
struct _TEB *teb; /* 54 Pointer to thread database */