Alexandre Julliard : vwin32.vxd: Load winedos dynamically.

Alexandre Julliard julliard at winehq.org
Fri Mar 13 09:13:58 CDT 2009


Module: wine
Branch: master
Commit: 50c747388254a33526c20d8f672edc7a09eca3b8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=50c747388254a33526c20d8f672edc7a09eca3b8

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri Mar 13 11:59:48 2009 +0100

vwin32.vxd: Load winedos dynamically.

---

 dlls/vwin32.vxd/Makefile.in |    2 +-
 dlls/vwin32.vxd/vwin32.c    |   35 ++++++++++++++++++++++++++++++++---
 2 files changed, 33 insertions(+), 4 deletions(-)

diff --git a/dlls/vwin32.vxd/Makefile.in b/dlls/vwin32.vxd/Makefile.in
index b7236a0..128ac90 100644
--- a/dlls/vwin32.vxd/Makefile.in
+++ b/dlls/vwin32.vxd/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = vwin32.vxd
-IMPORTS   = winedos kernel32
+IMPORTS   = kernel32
 
 C_SRCS = \
 	vwin32.c
diff --git a/dlls/vwin32.vxd/vwin32.c b/dlls/vwin32.vxd/vwin32.c
index 7e070d1..ba78f74 100644
--- a/dlls/vwin32.vxd/vwin32.c
+++ b/dlls/vwin32.vxd/vwin32.c
@@ -55,7 +55,22 @@ typedef struct tagMID {
 } MID, *PMID;
 #include <poppack.h>
 
-extern void WINAPI CallBuiltinHandler( CONTEXT86 *context, BYTE intnum );  /* from winedos */
+typedef void (WINAPI *CallBuiltinHandler)( CONTEXT *context, BYTE intnum );
+
+static CallBuiltinHandler load_builtin_handler(void)
+{
+    static CallBuiltinHandler handler;
+    static BOOL init_done;
+
+    if (!init_done)
+    {
+        HMODULE mod = LoadLibraryA( "winedos.dll" );
+        if (mod) handler = (void *)GetProcAddress( mod, "CallBuiltinHandler" );
+        if (!handler) FIXME( "DOS calls not supported\n" );
+        init_done = TRUE;
+    }
+    return handler;
+}
 
 /* Pop a DWORD from the 32-bit stack */
 static inline DWORD stack32_pop( CONTEXT86 *context )
@@ -121,6 +136,13 @@ BOOL WINAPI VWIN32_DeviceIoControl(DWORD dwIoControlCode,
             DIOC_REGISTERS *pIn  = lpvInBuffer;
             DIOC_REGISTERS *pOut = lpvOutBuffer;
             BYTE intnum = 0;
+            CallBuiltinHandler handler;
+
+            if (!(handler = load_builtin_handler()))
+            {
+                pOut->reg_Flags |= 0x0001;
+                return FALSE;
+            }
 
             TRACE( "Control '%s': "
                    "eax=0x%08x, ebx=0x%08x, ecx=0x%08x, "
@@ -155,7 +177,7 @@ BOOL WINAPI VWIN32_DeviceIoControl(DWORD dwIoControlCode,
                 break;
             }
 
-            CallBuiltinHandler( &cxt, intnum );
+            handler( &cxt, intnum );
             CONTEXT_2_DIOCRegs( &cxt, pOut );
         }
         return TRUE;
@@ -203,12 +225,19 @@ DWORD WINAPI VWIN32_VxDCall( DWORD service, CONTEXT86 *context )
         {
             DWORD callnum = stack32_pop(context);
             DWORD parm    = stack32_pop(context);
+            CallBuiltinHandler handler;
 
             TRACE("Int31/DPMI dispatch(%08x)\n", callnum);
 
+            if (!(handler = load_builtin_handler()))
+            {
+                context->EFlags |= 0x0001;
+                return 0;
+            }
+
             context->Eax = callnum;
             context->Ecx = parm;
-            CallBuiltinHandler( context, 0x31 );
+            handler( context, 0x31 );
             return LOWORD(context->Eax);
         }
     case 0x002a: /* Int41 dispatch - parm = int41 service number */




More information about the wine-cvs mailing list