Wine as shared library patch

Peter Dennis Bartok peter at novonyx.com
Thu Mar 4 19:22:33 CST 2004



> Perhaps this could be changed to a static variable in process.c
Wouldn't that make it rather hard to be set from outside process.c? I 
need to set it from wine-sharedlib.exe.so

> If you can resolve these issues then we can have a single Wine for Win32 and
> S.W.F!
Well, you basically saw the hole history of the patch, it started out as 
a separate piece of code outside of the wine build system, and in the 
rush to get it out I didn't have a chance to look for the forrest, with 
all those trees around :-)

The attached is cleaned up. Thanks for pointing it out.

Cheers,
   Peter
-------------- next part --------------
diff -ruN wine/configure.ac wine-patched/configure.ac
--- wine/configure.ac	2004-03-03 13:30:46.000000000 -0700
+++ wine-patched/configure.ac	2004-03-04 17:44:34.000000000 -0700
@@ -1670,6 +1670,7 @@
 programs/uninstaller/Makefile
 programs/view/Makefile
 programs/wcmd/Makefile
+programs/wine-sharedlib/Makefile
 programs/wineboot/Makefile
 programs/winebrowser/Makefile
 programs/winecfg/Makefile
diff -ruN wine/dlls/kernel/process.c wine-patched/dlls/kernel/process.c
--- wine/dlls/kernel/process.c	2004-02-20 13:19:24.000000000 -0700
+++ wine-patched/dlls/kernel/process.c	2004-03-04 17:44:34.000000000 -0700
@@ -756,8 +756,12 @@
 
         SetLastError( 0 );  /* clear error code */
         if (peb->BeingDebugged) DbgBreakPoint();
-        ExitProcess( entry( peb ) );
+        if (__wine_shared_lib==0) {
+            // This starts the main app and then exits wine
+            ExitProcess( entry( peb ) );
+        }
     }
+
     __EXCEPT(UnhandledExceptionFilter)
     {
         TerminateThread( GetCurrentThread(), GetExceptionCode() );
@@ -895,13 +899,20 @@
     set_library_wargv( __wine_main_argv );
     if (!build_command_line( __wine_main_wargv )) goto error;
 
-    stack_size = RtlImageNtHeader(peb->ImageBaseAddress)->OptionalHeader.SizeOfStackReserve;
+    if (__wine_shared_lib==1) {
+        /* We don't want a new stack if we're going shared. Screws up our return path */
+        start_process(NULL);
+    } else {
+        stack_size = RtlImageNtHeader(peb->ImageBaseAddress)->OptionalHeader.SizeOfStackReserve;
 
-    /* allocate main thread stack */
-    if (!THREAD_InitStack( NtCurrentTeb(), stack_size )) goto error;
+        /* allocate main thread stack */
+        if (!THREAD_InitStack( NtCurrentTeb(), stack_size )) goto error;
+
+        /* switch to the new stack */
+        wine_switch_to_stack( start_process, NULL, NtCurrentTeb()->Tib.StackBase );
+    }
+    return;
 
-    /* switch to the new stack */
-    wine_switch_to_stack( start_process, NULL, NtCurrentTeb()->Tib.StackBase );
 
  error:
     ExitProcess( GetLastError() );
diff -ruN wine/dlls/ntdll/loader.c wine-patched/dlls/ntdll/loader.c
--- wine/dlls/ntdll/loader.c	2004-02-23 18:25:03.000000000 -0700
+++ wine-patched/dlls/ntdll/loader.c	2004-03-04 17:44:34.000000000 -0700
@@ -1951,7 +1951,9 @@
     WINE_MODREF *wm;
     NTSTATUS status;
     ANSI_STRING func_name;
-    void (* DECLSPEC_NORETURN init_func)();
+    /* We might return for shared-lib startup */
+    /* void (* DECLSPEC_NORETURN init_func)(); */
+    void (* init_func)();
     extern void __wine_dbg_ntdll_init(void);
 
     thread_init();
diff -ruN wine/include/wine/library.h wine-patched/include/wine/library.h
--- wine/include/wine/library.h	2004-01-02 14:08:05.000000000 -0700
+++ wine-patched/include/wine/library.h	2004-03-04 17:44:34.000000000 -0700
@@ -49,6 +49,7 @@
 extern void wine_dll_unload( void *handle );
 extern int wine_dll_get_owner( const char *name, char *buffer, int size, int *file_exists );
 
+extern int __wine_shared_lib;
 extern int __wine_main_argc;
 extern char **__wine_main_argv;
 extern WCHAR **__wine_main_wargv;
diff -ruN wine/libs/wine/loader.c wine-patched/libs/wine/loader.c
--- wine/libs/wine/loader.c	2004-01-02 14:08:05.000000000 -0700
+++ wine-patched/libs/wine/loader.c	2004-03-04 17:44:34.000000000 -0700
@@ -46,6 +46,7 @@
 char **__wine_main_argv = NULL;
 WCHAR **__wine_main_wargv = NULL;
 char **__wine_main_environ = NULL;
+int __wine_shared_lib = 0;
 
 struct dll_path_context
 {
diff -ruN wine/libs/wine/wine.def wine-patched/libs/wine/wine.def
--- wine/libs/wine/wine.def	2004-02-04 19:01:35.000000000 -0700
+++ wine-patched/libs/wine/wine.def	2004-03-04 17:44:34.000000000 -0700
@@ -9,6 +9,7 @@
     __wine_dbgstr_an
     __wine_dbgstr_wn
     __wine_dll_register
+    __wine_shared_lib
     __wine_main_argc
     __wine_main_argv
     __wine_main_environ
diff -ruN wine/libs/wine/wine.map wine-patched/libs/wine/wine.map
--- wine/libs/wine/wine.map	2004-02-12 15:54:00.000000000 -0700
+++ wine-patched/libs/wine/wine.map	2004-03-04 17:44:34.000000000 -0700
@@ -9,6 +9,7 @@
     __wine_dbgstr_an;
     __wine_dbgstr_wn;
     __wine_dll_register;
+    __wine_shared_lib;
     __wine_main_argc;
     __wine_main_argv;
     __wine_main_environ;
diff -ruN wine/programs/Makefile.in wine-patched/programs/Makefile.in
--- wine/programs/Makefile.in	2004-01-06 13:49:59.000000000 -0700
+++ wine-patched/programs/Makefile.in	2004-03-04 17:44:34.000000000 -0700
@@ -11,6 +11,7 @@
 	cmdlgtst \
 	control \
 	expand \
+	wine-sharedlib \
 	notepad \
 	progman \
 	regedit \
@@ -41,6 +42,7 @@
 	clock \
 	control \
 	expand \
+	wine-sharedlib \
 	notepad \
 	progman \
 	regedit \
@@ -179,6 +181,9 @@
 icinfo.exe$(DLLEXT): avitools/icinfo.exe$(DLLEXT)
 	$(RM) $@ && $(LN_S) avitools/icinfo.exe$(DLLEXT) $@
 
+wine-sharedlib.exe$(DLLEXT): wine-sharedlib/wine-sharedlib.exe$(DLLEXT)
+	$(RM) $@ && $(LN_S) wine-sharedlib/wine-sharedlib.exe$(DLLEXT) $@
+
 notepad.exe$(DLLEXT): notepad/notepad.exe$(DLLEXT)
 	$(RM) $@ && $(LN_S) notepad/notepad.exe$(DLLEXT) $@
 
@@ -255,6 +260,7 @@
 control/control.exe$(DLLEXT): control
 expand/expand.exe$(DLLEXT): expand
 avitools/icinfo.exe$(DLLEXT): avitools
+wine-sharedlib/wine-sharedlib.exe$(DLLEXT): wine-sharedlib
 notepad/notepad.exe$(DLLEXT): notepad
 progman/progman.exe$(DLLEXT): progman
 regedit/regedit.exe$(DLLEXT): regedit
diff -ruN wine/programs/wine-sharedlib/Makefile.in wine-patched/programs/wine-sharedlib/Makefile.in
--- wine/programs/wine-sharedlib/Makefile.in	1969-12-31 17:00:00.000000000 -0700
+++ wine-patched/programs/wine-sharedlib/Makefile.in	2004-03-04 17:44:34.000000000 -0700
@@ -0,0 +1,27 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = wine-sharedlib.exe
+APPMODE   = -mwindows
+IMPORTS   = kernel32
+DELAYIMPORTS = user32
+EXTRAINCL = 
+EXTRADEFS = -DDLLPATH=\"${exec_prefix}/lib/wine\" -DLIBPATH=\"${exec_prefix}/lib\"
+EXTRALIBS = -ldl -lpthread
+C_SRCS = \
+	wine-sharedlib.c \
+	../../loader/pthread.c
+
+RC_SRCS =
+RC_BINSRC =
+RC_BINARIES =
+
+PLTESTS =
+
+EXTRASUBDIRS =
+
+ at MAKE_PROG_RULES@
+
+dlldir = ${exec_prefix}/lib
+### Dependencies:
diff -ruN wine/programs/wine-sharedlib/wine-sharedlib.c wine-patched/programs/wine-sharedlib/wine-sharedlib.c
--- wine/programs/wine-sharedlib/wine-sharedlib.c	1969-12-31 17:00:00.000000000 -0700
+++ wine-patched/programs/wine-sharedlib/wine-sharedlib.c	2004-03-04 17:47:06.000000000 -0700
@@ -0,0 +1,81 @@
+/*
+ * wine-sharedlib code
+ *
+ * Copyright 2004 Novell, Inc. (http://www.novell.com/)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+#include <wine/library.h>
+#include <stdio.h>
+#include <windows.h>
+#include <winsock.h>
+#include <dlfcn.h>
+
+/*
+	Dummy WinMain. If __wine_shared_lib is set this function is never actually called
+*/
+
+int WINAPI
+WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
+{
+	return(0);
+}
+
+HMODULE WINAPI (*LoadLibraryF)(LPCSTR libname);
+FARPROC WINAPI (*GetProcAddressF)(HMODULE hModule, LPCSTR function);
+
+/*
+	WineLoadLibrary is used by System.Windows.Forms to import the Wine dlls
+*/
+void *
+WineLoadLibrary(unsigned char *dll)
+{
+	return(LoadLibraryF(dll));
+}
+
+void *
+WineGetProcAddress(void *handle, unsigned char *function)
+{
+	return(GetProcAddressF(handle, function));
+}
+
+/*
+	SharedWineInit()	Must be called to initialize Wine. Sets the __wine_shared_lib flag
+							to make wine return after initialization instead of running WinMain
+*/
+
+int
+SharedWineInit(void)
+{
+	unsigned char	Error[1024]="";
+	char				*WineArguments[] = {"sharedapp", LIBPATH "/wine-sharedlib.exe.so", NULL};
+	
+	__wine_shared_lib=1;
+	
+	wine_init(2, WineArguments, Error, sizeof(Error));
+	if (Error[0]!='\0') {
+		printf("Wine initialization error:%s\n", Error);
+		exit(-1);
+	}
+
+	putenv ("_WINE_SHAREDLIB_PATH=" DLLPATH);
+
+	LoadLibraryF=LoadLibraryA;
+	GetProcAddressF=GetProcAddress;
+
+	return(0);
+}
diff -ruN wine/tools/winebuild/spec32.c wine-patched/tools/winebuild/spec32.c
--- wine/tools/winebuild/spec32.c	2004-02-16 13:24:32.000000000 -0700
+++ wine-patched/tools/winebuild/spec32.c	2004-03-04 17:44:34.000000000 -0700
@@ -568,6 +568,7 @@
     fprintf( outfile, "extern int __wine_main_argc;\n" );
     fprintf( outfile, "extern char **__wine_main_argv;\n" );
     fprintf( outfile, "extern char **__wine_main_environ;\n" );
+    fprintf( outfile, "extern int __wine_shared_lib;\n" );
     fprintf( outfile, "extern unsigned short **__wine_main_wargv;\n" );
     fprintf( outfile, "extern void _init(int, char**, char**);\n" );
     fprintf( outfile, "extern void _fini();\n" );


More information about the wine-patches mailing list