Alexandre Julliard : ifsmgr.vxd: Load winedos dynamically.

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


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

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

ifsmgr.vxd: Load winedos dynamically.

---

 dlls/ifsmgr.vxd/Makefile.in |    2 +-
 dlls/ifsmgr.vxd/ifsmgr.c    |   26 ++++++++++++++++++++++----
 2 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/dlls/ifsmgr.vxd/Makefile.in b/dlls/ifsmgr.vxd/Makefile.in
index 9a2a914..aace959 100644
--- a/dlls/ifsmgr.vxd/Makefile.in
+++ b/dlls/ifsmgr.vxd/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../..
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = ifsmgr.vxd
-IMPORTS   = winedos kernel32
+IMPORTS   = kernel32
 
 C_SRCS = \
 	ifsmgr.c
diff --git a/dlls/ifsmgr.vxd/ifsmgr.c b/dlls/ifsmgr.vxd/ifsmgr.c
index 47053e0..1e60ad5 100644
--- a/dlls/ifsmgr.vxd/ifsmgr.c
+++ b/dlls/ifsmgr.vxd/ifsmgr.c
@@ -36,8 +36,6 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(vxd);
 
-extern void WINAPI CallBuiltinHandler( CONTEXT86 *context, BYTE intnum );  /* from winedos */
-
 /*
  * IFSMgr DeviceIO service
  */
@@ -99,6 +97,23 @@ static void CONTEXT_2_win32apieq(const CONTEXT86 *pCxt, struct win32apireq *pOut
         /* FIXME: pOut->ar_pad ignored */
 }
 
+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;
+}
+
 /***********************************************************************
  *           DeviceIoControl   (IFSMGR.VXD.@)
  */
@@ -119,6 +134,9 @@ BOOL WINAPI IFSMGR_DeviceIoControl(DWORD dwIoControlCode, LPVOID lpvInBuffer, DW
             CONTEXT86 cxt;
             struct win32apireq *pIn=lpvInBuffer;
             struct win32apireq *pOut=lpvOutBuffer;
+            CallBuiltinHandler handler;
+
+            if (!(handler = load_builtin_handler())) return FALSE;
 
             TRACE( "Control '%s': "
                    "proid=0x%08lx, eax=0x%08lx, ebx=0x%08lx, ecx=0x%08lx, "
@@ -132,9 +150,9 @@ BOOL WINAPI IFSMGR_DeviceIoControl(DWORD dwIoControlCode, LPVOID lpvInBuffer, DW
             win32apieq_2_CONTEXT(pIn,&cxt);
 
             if(dwIoControlCode==IFS_IOCTL_21)
-                CallBuiltinHandler( &cxt, 0x21 );
+                handler( &cxt, 0x21 );
             else
-                CallBuiltinHandler( &cxt, 0x2f );
+                handler( &cxt, 0x2f );
 
             CONTEXT_2_win32apieq(&cxt,pOut);
             return TRUE;




More information about the wine-cvs mailing list