don't share some protected mode interrupts in winedos
Mike McCormack
mike at codeweavers.com
Thu Oct 9 15:18:39 CDT 2003
Patch updated with Jukka's recommendation (changed TASK_GetCurrent() to
GlobalLock(GetCurrentTask()) ... )
ChangeLog:
* don't share some protected mode interrupts in winedos
-------------- next part --------------
Index: include/task.h
===================================================================
RCS file: /home/wine/wine/include/task.h,v
retrieving revision 1.32
diff -u -r1.32 task.h
--- include/task.h 28 Aug 2003 21:43:35 -0000 1.32
+++ include/task.h 8 Oct 2003 06:48:46 -0000
@@ -98,13 +98,13 @@
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 */
Index: dlls/winedos/interrupts.c
===================================================================
RCS file: /home/wine/wine/dlls/winedos/interrupts.c,v
retrieving revision 1.22
diff -u -r1.22 interrupts.c
--- dlls/winedos/interrupts.c 7 Oct 2003 03:32:03 -0000 1.22
+++ dlls/winedos/interrupts.c 8 Oct 2003 06:48:47 -0000
@@ -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 @@
*/
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 @@
*/
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;
+ }
}
More information about the wine-patches
mailing list