This small patch prevents Win32 applications from using interrupts. Even Windows95 applications really use Win16 code or VxDs if they want to use interrupts. And EXCEPTION_ACCESS_VIOLATION is the correct exception in this case so returning FALSE would not work. Changelog: Win32 applications are not supposed to be able to use intXX instructions. Index: memory/instr.c =================================================================== RCS file: /home/wine/wine/memory/instr.c,v retrieving revision 1.21 diff -u -r1.21 instr.c --- memory/instr.c 26 Feb 2003 20:34:45 -0000 1.21 +++ memory/instr.c 9 May 2003 18:28:32 -0000 @@ -32,6 +32,8 @@ #ifdef __i386__ +extern void WINAPI EXC_RtlRaiseException( PEXCEPTION_RECORD, PCONTEXT ); + /* macros to set parts of a DWORD */ #define SET_LOWORD(dw,val) ((dw) = ((dw) & 0xffff0000) | LOWORD(val)) #define SET_LOBYTE(dw,val) ((dw) = ((dw) & 0xffffff00) | LOBYTE(val)) @@ -686,14 +688,31 @@ break; /* Unable to emulate it */ case 0xcd: /* int <XX> */ - if(!Dosvm.EmulateInterruptPM && !DPMI_LoadDosSystem()) - ERR("could not initialize interrupt handling\n"); - else { - context->Eip += prefixlen + 2; - Dosvm.EmulateInterruptPM( context, instr[1] ); - return TRUE; - } - break; /* Unable to emulate it */ + if (IS_SELECTOR_SYSTEM(context->SegCs)) + { + /* + * Win32 applications cannot use interrupts. + */ + EXCEPTION_RECORD rec; + rec.ExceptionCode = EXCEPTION_ACCESS_VIOLATION; + rec.ExceptionRecord = NULL; + rec.ExceptionFlags = EXCEPTION_CONTINUABLE; + rec.ExceptionAddress = (LPVOID)context->Eip; + rec.NumberParameters = 0; + EXC_RtlRaiseException( &rec, context ); + return TRUE; + } + else if (!Dosvm.EmulateInterruptPM && !DPMI_LoadDosSystem()) + { + ERR("could not initialize interrupt handling\n"); + } + else + { + context->Eip += prefixlen + 2; + Dosvm.EmulateInterruptPM( context, instr[1] ); + return TRUE; + } + break; /* Unable to emulate it */ case 0xcf: /* iret */ if (long_op) -- Jukka Heinonen <http://www.iki.fi/jhei/>