Exec a separate wine binary for every win32 process so that they run in separate address spaces. Run 16-bit tasks as Win32 threads, not processes.
diff --git a/include/main.h b/include/main.h index 9341f36..b724c07 100644 --- a/include/main.h +++ b/include/main.h
@@ -7,8 +7,8 @@ #include "windef.h" -extern BOOL MAIN_MainInit( int argc, char *argv[], BOOL win32 ); -extern BOOL MAIN_WineInit( int argc, char *argv[] ); +extern BOOL MAIN_MainInit( char *argv[] ); +extern void MAIN_WineInit(void); extern int MAIN_GetLanguageID(char*lang, char*country, char*charset, char*dialect); extern void MAIN_ParseDebugOptions(const char *options); extern void MAIN_ParseLanguageOption( const char *arg );
diff --git a/include/module.h b/include/module.h index 34bf2fe..5844b02 100644 --- a/include/module.h +++ b/include/module.h
@@ -183,6 +183,7 @@ extern WINE_MODREF *MODULE_LoadLibraryExA( LPCSTR libname, HFILE hfile, DWORD flags ); extern BOOL MODULE_FreeLibrary( WINE_MODREF *wm ); extern WINE_MODREF *MODULE_FindModule( LPCSTR path ); +extern BOOL MODULE_GetBinaryType( HANDLE hfile, LPCSTR filename, LPDWORD lpBinaryType ); extern HMODULE MODULE_CreateDummyModule( LPCSTR filename, HMODULE module32 ); extern FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE hmodule, LPCSTR name ); extern SEGPTR WINAPI HasGPHandler16( SEGPTR address ); @@ -201,12 +202,6 @@ extern FARPROC16 NE_GetEntryPointEx( HMODULE16 hModule, WORD ordinal, BOOL16 snoop ); extern BOOL16 NE_SetEntryPoint( HMODULE16 hModule, WORD ordinal, WORD offset ); extern HANDLE NE_OpenFile( NE_MODULE *pModule ); -extern BOOL NE_CreateProcess( HANDLE hFile, LPCSTR filename, LPCSTR cmd_line, LPCSTR env, - LPSECURITY_ATTRIBUTES psa, LPSECURITY_ATTRIBUTES tsa, - BOOL inherit, DWORD flags, LPSTARTUPINFOA startup, - LPPROCESS_INFORMATION info ); -extern BOOL NE_InitProcess( NE_MODULE *pModule ); - /* loader/ne/resource.c */ extern HGLOBAL16 WINAPI NE_DefResourceHandler(HGLOBAL16,HMODULE16,HRSRC16);
diff --git a/include/options.h b/include/options.h index 7ba4f99..b202de4 100644 --- a/include/options.h +++ b/include/options.h
@@ -70,7 +70,7 @@ extern const char *argv0; extern void OPTIONS_Usage(void) WINE_NORETURN; -extern void OPTIONS_ParseOptions( int argc, char *argv[] ); +extern void OPTIONS_ParseOptions( char *argv[] ); /* Profile functions */
diff --git a/include/pe_image.h b/include/pe_image.h index 809c289..4aaac26 100644 --- a/include/pe_image.h +++ b/include/pe_image.h
@@ -41,11 +41,6 @@ extern HMODULE PE_LoadImage( HANDLE hFile, LPCSTR filename ); extern struct _wine_modref *PE_CreateModule( HMODULE hModule, LPCSTR filename, DWORD flags, BOOL builtin ); -extern BOOL PE_CreateProcess( HANDLE hFile, LPCSTR filename, LPCSTR cmd_line, LPCSTR env, - LPSECURITY_ATTRIBUTES psa, LPSECURITY_ATTRIBUTES tsa, - BOOL inherit, DWORD flags, LPSTARTUPINFOA startup, - LPPROCESS_INFORMATION info ); - extern void PE_InitTls(void); extern BOOL PE_InitDLL(struct _wine_modref *wm, DWORD type, LPVOID lpReserved);
diff --git a/include/process.h b/include/process.h index 48a7c9b..f7bf458 100644 --- a/include/process.h +++ b/include/process.h
@@ -88,9 +88,7 @@ DWORD unknown8; /* c0 Unknown (NT) */ LCID locale; /* c4 Locale to be queried by GetThreadLocale (NT) */ /* The following are Wine-specific fields */ - void *server_pid; /* Server id for this process */ HANDLE *dos_handles; /* Handles mapping DOS -> Win32 */ - struct _PDB *next; /* List reference - list of PDB's */ WORD winver; /* Windows version figured out by VERSION_GetVersion */ struct _SERVICETABLE *service_table; /* Service table for service thread */ HANDLE idle_event; /* event to signal, when the process is idle */ @@ -149,22 +147,17 @@ /* memory/environ.c */ extern BOOL ENV_BuildEnvironment(void); -extern BOOL ENV_InheritEnvironment( PDB *pdb, LPCSTR env ); -extern void ENV_FreeEnvironment( PDB *pdb ); /* scheduler/process.c */ -extern BOOL PROCESS_Init( BOOL win32 ); +extern BOOL PROCESS_Init(void); +extern void PROCESS_InitWine( int argc, char *argv[] ) WINE_NORETURN; +extern void PROCESS_InitWinelib( int argc, char *argv[] ) WINE_NORETURN; extern PDB *PROCESS_IdToPDB( DWORD id ); extern void PROCESS_CallUserSignalProc( UINT uCode, HMODULE hModule ); -extern PDB *PROCESS_Create( struct _NE_MODULE *pModule, HFILE hFile, - LPCSTR cmd_line, LPCSTR env, +extern BOOL PROCESS_Create( HFILE hFile, LPCSTR filename, LPCSTR cmd_line, LPCSTR env, LPSECURITY_ATTRIBUTES psa, LPSECURITY_ATTRIBUTES tsa, BOOL inherit, DWORD flags, STARTUPINFOA *startup, PROCESS_INFORMATION *info ); -extern BOOL PROCESS_CreateUnixProcess( LPCSTR filename, LPCSTR cmd_line, LPCSTR env, - LPSECURITY_ATTRIBUTES psa, LPSECURITY_ATTRIBUTES tsa, - BOOL inherit, DWORD flags, LPSTARTUPINFOA startup, - LPPROCESS_INFORMATION info ); static inline PDB * WINE_UNUSED PROCESS_Current(void) {
diff --git a/include/task.h b/include/task.h index d3e6a12..eeb6939 100644 --- a/include/task.h +++ b/include/task.h
@@ -144,7 +144,8 @@ extern THHOOK *pThhook; -extern BOOL TASK_Create( struct _NE_MODULE *pModule, UINT16 cmdShow ); +extern BOOL TASK_Create( struct _NE_MODULE *pModule, UINT16 cmdShow, + struct _TEB *teb, LPCSTR cmdline, BYTE len ); extern void TASK_KillTask( HTASK16 hTask ); extern HTASK16 TASK_GetNextTask( HTASK16 hTask ); extern void TASK_Reschedule(void);
diff --git a/include/thread.h b/include/thread.h index 9939f32..e58b95d 100644 --- a/include/thread.h +++ b/include/thread.h
@@ -120,7 +120,7 @@ /* scheduler/thread.c */ extern void THREAD_Init(void); -extern TEB *THREAD_Create( struct _PDB *pdb, int fd, DWORD stack_size, BOOL alloc_stack16 ); +extern TEB *THREAD_Create( int fd, DWORD stack_size, BOOL alloc_stack16 ); extern TEB *THREAD_InitStack( TEB *teb, DWORD stack_size, BOOL alloc_stack16 ); extern BOOL THREAD_IsWin16( TEB *thdb ); extern TEB *THREAD_IdToTEB( DWORD id );