Commit 7df1fbb3 authored by Ulrich Weigand's avatar Ulrich Weigand Committed by Alexandre Julliard

Run Winelib applications as 32-bit processes in the initial task.

Simplified/removed several special 'if (__winelib)' cases in Wine main code obsoleted by that change.
parent 718cbaea
...@@ -72,6 +72,7 @@ typedef struct { ...@@ -72,6 +72,7 @@ typedef struct {
ELF_STDCALL_STUB *stubs; ELF_STDCALL_STUB *stubs;
} ELF_MODREF; } ELF_MODREF;
extern struct _wine_modref *ELF_CreateDummyModule(LPCSTR,LPCSTR,struct _PDB32 *);
extern HMODULE32 ELF_LoadLibraryEx32A(LPCSTR,struct _PDB32*,HFILE32,DWORD); extern HMODULE32 ELF_LoadLibraryEx32A(LPCSTR,struct _PDB32*,HFILE32,DWORD);
extern FARPROC32 ELF_FindExportedFunction(struct _PDB32 *process,struct _wine_modref *wm, LPCSTR funcName); extern FARPROC32 ELF_FindExportedFunction(struct _PDB32 *process,struct _wine_modref *wm, LPCSTR funcName);
......
...@@ -5,8 +5,9 @@ ...@@ -5,8 +5,9 @@
#include "xmalloc.h" #include "xmalloc.h"
extern int PASCAL WinMain(HINSTANCE32,HINSTANCE32,LPSTR,int); extern int PASCAL WinMain(HINSTANCE32,HINSTANCE32,LPSTR,int);
extern BOOL32 MAIN_WinelibInit( int *argc, char *argv[] );
extern void TASK_Reschedule(void); /* external declaration here because we don't want to depend on Wine headers */
extern HINSTANCE32 MAIN_WinelibInit( int *argc, char *argv[] );
/* Most Windows C/C++ compilers use something like this to */ /* Most Windows C/C++ compilers use something like this to */
/* access argc and argv globally: */ /* access argc and argv globally: */
...@@ -21,7 +22,7 @@ int main( int argc, char *argv [] ) ...@@ -21,7 +22,7 @@ int main( int argc, char *argv [] )
_ARGC = argc; _ARGC = argc;
_ARGV = (char **)argv; _ARGV = (char **)argv;
if (!MAIN_WinelibInit( &argc, argv )) return 0; if (!(hInstance = MAIN_WinelibInit( &argc, argv ))) return 0;
/* Alloc szCmdParam */ /* Alloc szCmdParam */
for (i = 1; i < argc; i++) len += strlen(argv[i]) + 1; for (i = 1; i < argc; i++) len += strlen(argv[i]) + 1;
...@@ -31,10 +32,6 @@ int main( int argc, char *argv [] ) ...@@ -31,10 +32,6 @@ int main( int argc, char *argv [] )
else lpszCmdParam[0] = '\0'; else lpszCmdParam[0] = '\0';
for (i = 2; i < argc; i++) strcat(strcat(lpszCmdParam, " "), argv[i]); for (i = 2; i < argc; i++) strcat(strcat(lpszCmdParam, " "), argv[i]);
hInstance = WinExec32( *argv, SW_SHOWNORMAL );
TASK_Reschedule();
InitApp( hInstance );
return WinMain (hInstance, /* hInstance */ return WinMain (hInstance, /* hInstance */
0, /* hPrevInstance */ 0, /* hPrevInstance */
lpszCmdParam, /* lpszCmdParam */ lpszCmdParam, /* lpszCmdParam */
......
...@@ -25,67 +25,24 @@ ...@@ -25,67 +25,24 @@
#include "module.h" #include "module.h"
#include "debug.h" #include "debug.h"
#if defined(HAVE_LIBDL) && defined(HAVE_DLFCN_H) WINE_MODREF *
ELF_CreateDummyModule( LPCSTR libname, LPCSTR modname, PDB32 *process )
#define UNIX_DLL_ENDING "so" {
#define STUBSIZE 4095
#include <dlfcn.h>
HMODULE32
ELF_LoadLibraryEx32A(LPCSTR libname,PDB32 *process,HANDLE32 hf,DWORD flags) {
WINE_MODREF *wm;
char *modname,*s,*t,*x;
LPVOID *dlhandle;
PIMAGE_DOS_HEADER dh; PIMAGE_DOS_HEADER dh;
PIMAGE_NT_HEADERS nth; PIMAGE_NT_HEADERS nth;
PIMAGE_SECTION_HEADER sh; PIMAGE_SECTION_HEADER sh;
HMODULE32 hmod; WINE_MODREF *wm;
HMODULE32 hmod;
t = HeapAlloc(process->heap,HEAP_ZERO_MEMORY,strlen(libname)+strlen("lib.so")+1);
*t = '\0';
/* copy path to tempvar ... */
s=strrchr(libname,'/');
if (!s)
s=strrchr(libname,'\\');
if (s) {
strncpy(t,libname,s-libname+1);
t[s-libname+1]= '\0';
} else
s = (LPSTR)libname;
modname = s;
/* append "lib" foo ".so" */
strcat(t,"lib");
x = t+strlen(t);
strcat(t,s);
s = strchr(x,'.');
while (s) {
if (!strcasecmp(s,".dll")) {
strcpy(s+1,UNIX_DLL_ENDING);
break;
}
s=strchr(s+1,'.');
}
/* FIXME: make UNIX filename from DOS fn? */
/* ... and open it */
dlhandle = dlopen(t,RTLD_NOW);
if (!dlhandle) {
HeapFree(process->heap,0,t);
return 0;
}
wm=(WINE_MODREF*)HeapAlloc(process->heap,HEAP_ZERO_MEMORY,sizeof(*wm)); wm=(WINE_MODREF*)HeapAlloc(process->heap,HEAP_ZERO_MEMORY,sizeof(*wm));
wm->type = MODULE32_ELF; wm->type = MODULE32_ELF;
wm->binfmt.elf.dlhandle = dlhandle;
/* FIXME: hmm, order? */ /* FIXME: hmm, order? */
wm->next = process->modref_list; wm->next = process->modref_list;
process->modref_list = wm; process->modref_list = wm;
wm->modname = HEAP_strdupA(process->heap,0,modname); wm->modname = HEAP_strdupA(process->heap,0,modname);
wm->longname = HEAP_strdupA(process->heap,0,t); wm->longname = HEAP_strdupA(process->heap,0,libname);
hmod = (HMODULE32)HeapAlloc(process->heap,HEAP_ZERO_MEMORY,sizeof(IMAGE_DOS_HEADER)+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)+100); hmod = (HMODULE32)HeapAlloc(process->heap,HEAP_ZERO_MEMORY,sizeof(IMAGE_DOS_HEADER)+sizeof(IMAGE_NT_HEADERS)+sizeof(IMAGE_SECTION_HEADER)+100);
dh = (PIMAGE_DOS_HEADER)hmod; dh = (PIMAGE_DOS_HEADER)hmod;
...@@ -125,8 +82,63 @@ ELF_LoadLibraryEx32A(LPCSTR libname,PDB32 *process,HANDLE32 hf,DWORD flags) { ...@@ -125,8 +82,63 @@ ELF_LoadLibraryEx32A(LPCSTR libname,PDB32 *process,HANDLE32 hf,DWORD flags) {
sh->PointerToRawData = 0; sh->PointerToRawData = 0;
sh->Characteristics = IMAGE_SCN_CNT_CODE|IMAGE_SCN_CNT_INITIALIZED_DATA|IMAGE_SCN_MEM_EXECUTE|IMAGE_SCN_MEM_READ; sh->Characteristics = IMAGE_SCN_CNT_CODE|IMAGE_SCN_CNT_INITIALIZED_DATA|IMAGE_SCN_MEM_EXECUTE|IMAGE_SCN_MEM_READ;
wm->module = hmod; wm->module = hmod;
SNOOP_RegisterDLL(hmod,libname,STUBSIZE/sizeof(ELF_STDCALL_STUB)); return wm;
return hmod; }
#if defined(HAVE_LIBDL) && defined(HAVE_DLFCN_H)
#define UNIX_DLL_ENDING "so"
#define STUBSIZE 4095
#include <dlfcn.h>
HMODULE32
ELF_LoadLibraryEx32A(LPCSTR libname,PDB32 *process,HANDLE32 hf,DWORD flags) {
WINE_MODREF *wm;
char *modname,*s,*t,*x;
LPVOID *dlhandle;
t = HeapAlloc(process->heap,HEAP_ZERO_MEMORY,strlen(libname)+strlen("lib.so")+1);
*t = '\0';
/* copy path to tempvar ... */
s=strrchr(libname,'/');
if (!s)
s=strrchr(libname,'\\');
if (s) {
strncpy(t,libname,s-libname+1);
t[s-libname+1]= '\0';
} else
s = (LPSTR)libname;
modname = s;
/* append "lib" foo ".so" */
strcat(t,"lib");
x = t+strlen(t);
strcat(t,s);
s = strchr(x,'.');
while (s) {
if (!strcasecmp(s,".dll")) {
strcpy(s+1,UNIX_DLL_ENDING);
break;
}
s=strchr(s+1,'.');
}
/* FIXME: make UNIX filename from DOS fn? */
/* ... and open it */
dlhandle = dlopen(t,RTLD_NOW);
if (!dlhandle) {
HeapFree(process->heap,0,t);
return 0;
}
wm = ELF_CreateDummyModule( t, modname, process );
wm->binfmt.elf.dlhandle = dlhandle;
SNOOP_RegisterDLL(wm->module,libname,STUBSIZE/sizeof(ELF_STDCALL_STUB));
return wm->module;
} }
FARPROC32 FARPROC32
......
...@@ -407,29 +407,19 @@ static HINSTANCE16 NE_CreateProcess( LPCSTR name, LPCSTR cmd_line, LPCSTR env, ...@@ -407,29 +407,19 @@ static HINSTANCE16 NE_CreateProcess( LPCSTR name, LPCSTR cmd_line, LPCSTR env,
LPSTARTUPINFO32A startup, LPSTARTUPINFO32A startup,
LPPROCESS_INFORMATION info ) LPPROCESS_INFORMATION info )
{ {
HMODULE16 hModule;
HINSTANCE16 hInstance, hPrevInstance; HINSTANCE16 hInstance, hPrevInstance;
NE_MODULE *pModule; NE_MODULE *pModule;
if (__winelib) /* Load module */
{
OFSTRUCT ofs;
lstrcpyn32A( ofs.szPathName, name, sizeof(ofs.szPathName) );
if ((hModule = MODULE_CreateDummyModule( &ofs )) < 32) return hModule;
pModule = (NE_MODULE *)GlobalLock16( hModule );
hInstance = NE_CreateInstance( pModule, &hPrevInstance, FALSE );
}
else
{
hInstance = NE_LoadModule( name, &hPrevInstance, TRUE, FALSE );
if (hInstance < 32) return hInstance;
if ( !(pModule = NE_GetPtr(hInstance)) hInstance = NE_LoadModule( name, &hPrevInstance, TRUE, FALSE );
|| (pModule->flags & NE_FFLAGS_LIBMODULE)) if (hInstance < 32) return hInstance;
{
/* FIXME: cleanup */ if ( !(pModule = NE_GetPtr(hInstance))
return 11; || (pModule->flags & NE_FFLAGS_LIBMODULE))
} {
/* FIXME: cleanup */
return 11;
} }
/* Create a task for this instance */ /* Create a task for this instance */
...@@ -534,8 +524,13 @@ HINSTANCE32 WINAPI LoadModule32( LPCSTR name, LPVOID paramBlock ) ...@@ -534,8 +524,13 @@ HINSTANCE32 WINAPI LoadModule32( LPCSTR name, LPVOID paramBlock )
/* Get hInstance from process */ /* Get hInstance from process */
pdb = PROCESS_IdToPDB( info.dwProcessId ); pdb = PROCESS_IdToPDB( info.dwProcessId );
tdb = pdb? (TDB *)GlobalLock16( pdb->task ) : NULL; if ( pdb->exe_modref )
hInstance = tdb? tdb->hInstance : 0; hInstance = pdb->exe_modref->module;
else
{
tdb = pdb? (TDB *)GlobalLock16( pdb->task ) : NULL;
hInstance = tdb? tdb->hInstance : 0;
}
/* Close off the handles */ /* Close off the handles */
CloseHandle( info.hThread ); CloseHandle( info.hThread );
...@@ -676,7 +671,7 @@ BOOL32 WINAPI CreateProcess32A( LPCSTR lpApplicationName, LPSTR lpCommandLine, ...@@ -676,7 +671,7 @@ BOOL32 WINAPI CreateProcess32A( LPCSTR lpApplicationName, LPSTR lpCommandLine,
FIXME(module, "(%s,...): STARTF_USEHOTKEY ignored\n", name); FIXME(module, "(%s,...): STARTF_USEHOTKEY ignored\n", name);
/* Try NE (or winelib) module */ /* Try NE module */
hInstance = NE_CreateProcess( name, cmdline, lpEnvironment, hInstance = NE_CreateProcess( name, cmdline, lpEnvironment,
lpStartupInfo, lpProcessInfo ); lpStartupInfo, lpProcessInfo );
...@@ -902,7 +897,6 @@ HINSTANCE32 WINAPI WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow ) ...@@ -902,7 +897,6 @@ HINSTANCE32 WINAPI WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow )
{ {
HINSTANCE32 handle = 2; HINSTANCE32 handle = 2;
char *p, filename[256]; char *p, filename[256];
static int use_load_module = 1;
int spacelimit = 0, exhausted = 0; int spacelimit = 0, exhausted = 0;
LOADPARAMS32 params; LOADPARAMS32 params;
UINT16 paramCmdShow[2]; UINT16 paramCmdShow[2];
...@@ -954,10 +948,8 @@ HINSTANCE32 WINAPI WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow ) ...@@ -954,10 +948,8 @@ HINSTANCE32 WINAPI WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow )
/* Now load the executable file */ /* Now load the executable file */
if (use_load_module) if (!__winelib)
{ {
/* Winelib: Use LoadModule() only for the program itself */
if (__winelib) use_load_module = 0;
handle = LoadModule32( filename, &params ); handle = LoadModule32( filename, &params );
if (handle == 2) /* file not found */ if (handle == 2) /* file not found */
{ {
......
...@@ -66,7 +66,7 @@ HANDLE32 WINAPI FindResourceEx32A( HMODULE32 hModule, LPCSTR type, LPCSTR name, ...@@ -66,7 +66,7 @@ HANDLE32 WINAPI FindResourceEx32A( HMODULE32 hModule, LPCSTR type, LPCSTR name,
*/ */
HRSRC32 WINAPI FindResourceEx32W( HMODULE32 hModule, LPCWSTR type, HRSRC32 WINAPI FindResourceEx32W( HMODULE32 hModule, LPCWSTR type,
LPCWSTR name, WORD lang ) LPCWSTR name, WORD lang )
{ HRSRC32 ret; {
WINE_MODREF *wm = MODULE32_LookupHMODULE(PROCESS_Current(),hModule); WINE_MODREF *wm = MODULE32_LookupHMODULE(PROCESS_Current(),hModule);
HRSRC32 hrsrc; HRSRC32 hrsrc;
...@@ -75,24 +75,27 @@ HRSRC32 WINAPI FindResourceEx32W( HMODULE32 hModule, LPCWSTR type, ...@@ -75,24 +75,27 @@ HRSRC32 WINAPI FindResourceEx32W( HMODULE32 hModule, LPCWSTR type,
debugres_w (type), debugres_w (type),
debugres_w (name)); debugres_w (name));
if (__winelib) { if (!wm) return (HRSRC32)0;
hrsrc = LIBRES_FindResource( hModule, name, type );
if (hrsrc) switch (wm->type)
return hrsrc; {
} case MODULE32_PE:
if (wm) { hrsrc = PE_FindResourceEx32W(wm,name,type,lang);
switch (wm->type) { break;
case MODULE32_PE:
ret = PE_FindResourceEx32W(wm,name,type,lang); case MODULE32_ELF:
if ( ret==0 ) hrsrc = LIBRES_FindResource( hModule, name, type );
ERR(resource,"0x%08x(%s) %s(%s) not found!\n", hModule,wm->modname, debugres_w (name), debugres_w (type)); break;
return ret;
default: default:
ERR(module,"unknown module type %d\n",wm->type); ERR(module,"unknown module type %d\n",wm->type);
break; return (HRSRC32)0;
}
} }
return (HRSRC32)0;
if ( !hrsrc )
ERR(resource,"0x%08x(%s) %s(%s) not found!\n", hModule,wm->modname, debugres_w (name), debugres_w (type));
return hrsrc;
} }
...@@ -124,16 +127,20 @@ HGLOBAL32 WINAPI LoadResource32( ...@@ -124,16 +127,20 @@ HGLOBAL32 WINAPI LoadResource32(
ERR(resource,"hRsrc is 0, return 0.\n"); ERR(resource,"hRsrc is 0, return 0.\n");
return 0; return 0;
} }
if (wm) if (!wm) return 0;
switch (wm->type) {
case MODULE32_PE: switch (wm->type)
return PE_LoadResource32(wm,hRsrc); {
default: case MODULE32_PE:
ERR(resource,"unknown module type %d\n",wm->type); return PE_LoadResource32(wm,hRsrc);
break;
} case MODULE32_ELF:
if (__winelib) return LIBRES_LoadResource( hModule, hRsrc );
return LIBRES_LoadResource( hModule, hRsrc );
default:
ERR(resource,"unknown module type %d\n",wm->type);
break;
}
return 0; return 0;
} }
...@@ -175,23 +182,21 @@ DWORD WINAPI SizeofResource32( HINSTANCE32 hModule, HRSRC32 hRsrc ) ...@@ -175,23 +182,21 @@ DWORD WINAPI SizeofResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
WINE_MODREF *wm = MODULE32_LookupHMODULE(PROCESS_Current(),hModule); WINE_MODREF *wm = MODULE32_LookupHMODULE(PROCESS_Current(),hModule);
TRACE(resource, "module=%08x res=%08x\n", hModule, hRsrc ); TRACE(resource, "module=%08x res=%08x\n", hModule, hRsrc );
if (wm) if (!wm) return 0;
switch (wm->type)
{ switch (wm->type)
case MODULE32_PE: {
{ case MODULE32_PE:
DWORD ret; return PE_SizeofResource32(hModule,hRsrc);
ret = PE_SizeofResource32(hModule,hRsrc);
if (ret) case MODULE32_ELF:
return ret; FIXME(module,"Not implemented for ELF modules\n");
break; break;
}
default: default:
ERR(module,"unknown module type %d\n",wm->type); ERR(module,"unknown module type %d\n",wm->type);
break; break;
} }
if (__winelib)
FIXME(module,"Not implemented for WINELIB\n");
return 0; return 0;
} }
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "windows.h" #include "windows.h"
#include "callback.h" #include "callback.h"
#include "task.h" #include "task.h"
#include "syslevel.h"
/********************************************************************** /**********************************************************************
...@@ -232,6 +233,17 @@ static BOOL32 WINAPI CALLBACK_CallWOWCallback16Ex( ...@@ -232,6 +233,17 @@ static BOOL32 WINAPI CALLBACK_CallWOWCallback16Ex(
} }
/********************************************************************** /**********************************************************************
* CALLBACK_CallTaskRescheduleProc
*/
static void WINAPI CALLBACK_CallTaskRescheduleProc( void )
{
SYSLEVEL_EnterWin16Lock();
TASK_Reschedule();
SYSLEVEL_LeaveWin16Lock();
}
/**********************************************************************
* CALLBACK_WinelibTable * CALLBACK_WinelibTable
* *
* The callbacks function table for Winelib * The callbacks function table for Winelib
...@@ -240,7 +252,7 @@ static const CALLBACKS_TABLE CALLBACK_WinelibTable = ...@@ -240,7 +252,7 @@ static const CALLBACKS_TABLE CALLBACK_WinelibTable =
{ {
CALLBACK_CallRegisterProc, /* CallRegisterShortProc */ CALLBACK_CallRegisterProc, /* CallRegisterShortProc */
CALLBACK_CallRegisterProc, /* CallRegisterLongProc */ CALLBACK_CallRegisterProc, /* CallRegisterLongProc */
TASK_Reschedule, /* CallTaskRescheduleProc */ CALLBACK_CallTaskRescheduleProc, /* CallTaskRescheduleProc */
NULL, /* CallFrom16WndProc */ NULL, /* CallFrom16WndProc */
CALLBACK_CallWndProc, /* CallWndProc */ CALLBACK_CallWndProc, /* CallWndProc */
CALLBACK_CallDriverProc, /* CallDriverProc */ CALLBACK_CallDriverProc, /* CallDriverProc */
......
...@@ -665,11 +665,9 @@ static HWND32 WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom, ...@@ -665,11 +665,9 @@ static HWND32 WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom,
SEGPTR menuName = (SEGPTR)GetClassLong16( hwnd, GCL_MENUNAME ); SEGPTR menuName = (SEGPTR)GetClassLong16( hwnd, GCL_MENUNAME );
if (menuName) if (menuName)
{ {
/* hInstance is still 16-bit in 980215 winelib */ if (HIWORD(cs->hInstance))
if (HIWORD(cs->hInstance) || __winelib)
cs->hMenu = LoadMenu32A(cs->hInstance,PTR_SEG_TO_LIN(menuName)); cs->hMenu = LoadMenu32A(cs->hInstance,PTR_SEG_TO_LIN(menuName));
else else
/* doesn't work for winelib, since resources are unicode */
cs->hMenu = LoadMenu16(cs->hInstance,menuName); cs->hMenu = LoadMenu16(cs->hInstance,menuName);
if (cs->hMenu) SetMenu32( hwnd, cs->hMenu ); if (cs->hMenu) SetMenu32( hwnd, cs->hMenu );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment