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