Disable DPMI

Robert Shearman rob at codeweavers.com
Tue Sep 21 10:38:35 CDT 2004


Hi,

This patch disables DPMI. If sti has been executed beforehand and an 
instruction (such as an interrupt) must be emulated then it can cause an 
infinite loop around the enumation of the iret instruction in the DPMI 
call. Even after (probably rather poorly) hacking around this issue I 
still got unprivileged instruction exceptions from the iret instruction. 
Without more expert eyes being cast on this code the only thing I can 
suggest to fix non-DPMI applications with the above case is to disable 
DPMI event checking.

Rob

Changelog:
Disable DPMI event checking as it can cause infinite loops in some cases.
-------------- next part --------------
Index: wine/dlls/kernel/wowthunk.c
===================================================================
RCS file: /home/wine/wine/dlls/kernel/wowthunk.c,v
retrieving revision 1.52
diff -u -p -r1.52 wowthunk.c
--- wine/dlls/kernel/wowthunk.c	17 May 2004 21:08:31 -0000	1.52
+++ wine/dlls/kernel/wowthunk.c	21 Sep 2004 15:30:43 -0000
@@ -194,6 +194,14 @@ static void insert_event_check( CONTEXT 
 {
     char *stack = wine_ldt_get_ptr( context->SegSs, context->Esp );
 
+    /* 
+     * FIXME: DPMI seems rather buggy so it is disabled for the moment.
+     * In particular, if sti has been executed beforehand and an instruction
+     * (such as an interrupt) must be emulated then it can cause an infinite
+     * loop around the enumation of the iret instruction in the DPMI call
+     */
+    return;
+
     if(context->SegCs == dpmi_checker_selector &&
        context->Eip   >= dpmi_checker_offset_call && 
        context->Eip   <= dpmi_checker_offset_cleanup)


More information about the wine-patches mailing list