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