diff --git a/include/pe_image.h b/include/pe_image.h index 7f627ad7ceb..e9a4ca2f002 100644 --- a/include/pe_image.h +++ b/include/pe_image.h @@ -72,6 +72,7 @@ typedef struct { ELF_STDCALL_STUB *stubs; } ELF_MODREF; +extern struct _wine_modref *ELF_CreateDummyModule(LPCSTR,LPCSTR,struct _PDB32 *); extern HMODULE32 ELF_LoadLibraryEx32A(LPCSTR,struct _PDB32*,HFILE32,DWORD); extern FARPROC32 ELF_FindExportedFunction(struct _PDB32 *process,struct _wine_modref *wm, LPCSTR funcName); diff --git a/library/winestub.c b/library/winestub.c index f81eda60add..dd36af4b9f3 100644 --- a/library/winestub.c +++ b/library/winestub.c @@ -5,8 +5,9 @@ #include "xmalloc.h" 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 */ /* access argc and argv globally: */ @@ -21,7 +22,7 @@ int main( int argc, char *argv [] ) _ARGC = argc; _ARGV = (char **)argv; - if (!MAIN_WinelibInit( &argc, argv )) return 0; + if (!(hInstance = MAIN_WinelibInit( &argc, argv ))) return 0; /* Alloc szCmdParam */ for (i = 1; i < argc; i++) len += strlen(argv[i]) + 1; @@ -31,10 +32,6 @@ int main( int argc, char *argv [] ) else lpszCmdParam[0] = '\0'; for (i = 2; i < argc; i++) strcat(strcat(lpszCmdParam, " "), argv[i]); - hInstance = WinExec32( *argv, SW_SHOWNORMAL ); - TASK_Reschedule(); - InitApp( hInstance ); - return WinMain (hInstance, /* hInstance */ 0, /* hPrevInstance */ lpszCmdParam, /* lpszCmdParam */ diff --git a/loader/elf.c b/loader/elf.c index a7ff7013536..395f603ed5f 100644 --- a/loader/elf.c +++ b/loader/elf.c @@ -25,67 +25,24 @@ #include "module.h" #include "debug.h" -#if defined(HAVE_LIBDL) && defined(HAVE_DLFCN_H) - -#define UNIX_DLL_ENDING "so" - -#define STUBSIZE 4095 - -#include - -HMODULE32 -ELF_LoadLibraryEx32A(LPCSTR libname,PDB32 *process,HANDLE32 hf,DWORD flags) { - WINE_MODREF *wm; - char *modname,*s,*t,*x; - LPVOID *dlhandle; +WINE_MODREF * +ELF_CreateDummyModule( LPCSTR libname, LPCSTR modname, PDB32 *process ) +{ PIMAGE_DOS_HEADER dh; PIMAGE_NT_HEADERS nth; 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->type = MODULE32_ELF; - wm->binfmt.elf.dlhandle = dlhandle; /* FIXME: hmm, order? */ wm->next = process->modref_list; process->modref_list = wm; 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); dh = (PIMAGE_DOS_HEADER)hmod; @@ -125,8 +82,63 @@ ELF_LoadLibraryEx32A(LPCSTR libname,PDB32 *process,HANDLE32 hf,DWORD flags) { sh->PointerToRawData = 0; sh->Characteristics = IMAGE_SCN_CNT_CODE|IMAGE_SCN_CNT_INITIALIZED_DATA|IMAGE_SCN_MEM_EXECUTE|IMAGE_SCN_MEM_READ; wm->module = hmod; - SNOOP_RegisterDLL(hmod,libname,STUBSIZE/sizeof(ELF_STDCALL_STUB)); - return hmod; + return wm; +} + + +#if defined(HAVE_LIBDL) && defined(HAVE_DLFCN_H) + +#define UNIX_DLL_ENDING "so" + +#define STUBSIZE 4095 + +#include + +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 diff --git a/loader/module.c b/loader/module.c index 8787e836fc7..200b22c86d1 100644 --- a/loader/module.c +++ b/loader/module.c @@ -407,29 +407,19 @@ static HINSTANCE16 NE_CreateProcess( LPCSTR name, LPCSTR cmd_line, LPCSTR env, LPSTARTUPINFO32A startup, LPPROCESS_INFORMATION info ) { - HMODULE16 hModule; HINSTANCE16 hInstance, hPrevInstance; NE_MODULE *pModule; - if (__winelib) - { - 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; + /* Load module */ - if ( !(pModule = NE_GetPtr(hInstance)) - || (pModule->flags & NE_FFLAGS_LIBMODULE)) - { - /* FIXME: cleanup */ - return 11; - } + hInstance = NE_LoadModule( name, &hPrevInstance, TRUE, FALSE ); + if (hInstance < 32) return hInstance; + + if ( !(pModule = NE_GetPtr(hInstance)) + || (pModule->flags & NE_FFLAGS_LIBMODULE)) + { + /* FIXME: cleanup */ + return 11; } /* Create a task for this instance */ @@ -534,8 +524,13 @@ HINSTANCE32 WINAPI LoadModule32( LPCSTR name, LPVOID paramBlock ) /* Get hInstance from process */ pdb = PROCESS_IdToPDB( info.dwProcessId ); - tdb = pdb? (TDB *)GlobalLock16( pdb->task ) : NULL; - hInstance = tdb? tdb->hInstance : 0; + if ( pdb->exe_modref ) + hInstance = pdb->exe_modref->module; + else + { + tdb = pdb? (TDB *)GlobalLock16( pdb->task ) : NULL; + hInstance = tdb? tdb->hInstance : 0; + } /* Close off the handles */ CloseHandle( info.hThread ); @@ -676,7 +671,7 @@ BOOL32 WINAPI CreateProcess32A( LPCSTR lpApplicationName, LPSTR lpCommandLine, FIXME(module, "(%s,...): STARTF_USEHOTKEY ignored\n", name); - /* Try NE (or winelib) module */ + /* Try NE module */ hInstance = NE_CreateProcess( name, cmdline, lpEnvironment, lpStartupInfo, lpProcessInfo ); @@ -902,7 +897,6 @@ HINSTANCE32 WINAPI WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow ) { HINSTANCE32 handle = 2; char *p, filename[256]; - static int use_load_module = 1; int spacelimit = 0, exhausted = 0; LOADPARAMS32 params; UINT16 paramCmdShow[2]; @@ -954,10 +948,8 @@ HINSTANCE32 WINAPI WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow ) /* 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, ¶ms ); if (handle == 2) /* file not found */ { diff --git a/loader/resource.c b/loader/resource.c index a513966432b..d482549b2f1 100644 --- a/loader/resource.c +++ b/loader/resource.c @@ -66,7 +66,7 @@ HANDLE32 WINAPI FindResourceEx32A( HMODULE32 hModule, LPCSTR type, LPCSTR name, */ HRSRC32 WINAPI FindResourceEx32W( HMODULE32 hModule, LPCWSTR type, LPCWSTR name, WORD lang ) -{ HRSRC32 ret; +{ WINE_MODREF *wm = MODULE32_LookupHMODULE(PROCESS_Current(),hModule); HRSRC32 hrsrc; @@ -75,24 +75,27 @@ HRSRC32 WINAPI FindResourceEx32W( HMODULE32 hModule, LPCWSTR type, debugres_w (type), debugres_w (name)); - if (__winelib) { - hrsrc = LIBRES_FindResource( hModule, name, type ); - if (hrsrc) - return hrsrc; + if (!wm) return (HRSRC32)0; + + switch (wm->type) + { + case MODULE32_PE: + hrsrc = PE_FindResourceEx32W(wm,name,type,lang); + break; + + case MODULE32_ELF: + hrsrc = LIBRES_FindResource( hModule, name, type ); + break; + + default: + ERR(module,"unknown module type %d\n",wm->type); + return (HRSRC32)0; } - if (wm) { - switch (wm->type) { - case MODULE32_PE: - ret = PE_FindResourceEx32W(wm,name,type,lang); - if ( ret==0 ) - ERR(resource,"0x%08x(%s) %s(%s) not found!\n", hModule,wm->modname, debugres_w (name), debugres_w (type)); - return ret; - default: - ERR(module,"unknown module type %d\n",wm->type); - break; - } - } - 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( ERR(resource,"hRsrc is 0, return 0.\n"); return 0; } - if (wm) - switch (wm->type) { - case MODULE32_PE: - return PE_LoadResource32(wm,hRsrc); - default: - ERR(resource,"unknown module type %d\n",wm->type); - break; - } - if (__winelib) - return LIBRES_LoadResource( hModule, hRsrc ); + if (!wm) return 0; + + switch (wm->type) + { + case MODULE32_PE: + return PE_LoadResource32(wm,hRsrc); + + case MODULE32_ELF: + return LIBRES_LoadResource( hModule, hRsrc ); + + default: + ERR(resource,"unknown module type %d\n",wm->type); + break; + } return 0; } @@ -175,23 +182,21 @@ DWORD WINAPI SizeofResource32( HINSTANCE32 hModule, HRSRC32 hRsrc ) WINE_MODREF *wm = MODULE32_LookupHMODULE(PROCESS_Current(),hModule); TRACE(resource, "module=%08x res=%08x\n", hModule, hRsrc ); - if (wm) - switch (wm->type) - { - case MODULE32_PE: - { - DWORD ret; - ret = PE_SizeofResource32(hModule,hRsrc); - if (ret) - return ret; - break; - } - default: - ERR(module,"unknown module type %d\n",wm->type); - break; - } - if (__winelib) - FIXME(module,"Not implemented for WINELIB\n"); + if (!wm) return 0; + + switch (wm->type) + { + case MODULE32_PE: + return PE_SizeofResource32(hModule,hRsrc); + + case MODULE32_ELF: + FIXME(module,"Not implemented for ELF modules\n"); + break; + + default: + ERR(module,"unknown module type %d\n",wm->type); + break; + } return 0; } diff --git a/misc/callback.c b/misc/callback.c index 3907fc3141e..13059612934 100644 --- a/misc/callback.c +++ b/misc/callback.c @@ -9,6 +9,7 @@ #include "windows.h" #include "callback.h" #include "task.h" +#include "syslevel.h" /********************************************************************** @@ -231,6 +232,17 @@ static BOOL32 WINAPI CALLBACK_CallWOWCallback16Ex( return TRUE; } +/********************************************************************** + * CALLBACK_CallTaskRescheduleProc + */ +static void WINAPI CALLBACK_CallTaskRescheduleProc( void ) +{ + SYSLEVEL_EnterWin16Lock(); + TASK_Reschedule(); + SYSLEVEL_LeaveWin16Lock(); +} + + /********************************************************************** * CALLBACK_WinelibTable * @@ -240,7 +252,7 @@ static const CALLBACKS_TABLE CALLBACK_WinelibTable = { CALLBACK_CallRegisterProc, /* CallRegisterShortProc */ CALLBACK_CallRegisterProc, /* CallRegisterLongProc */ - TASK_Reschedule, /* CallTaskRescheduleProc */ + CALLBACK_CallTaskRescheduleProc, /* CallTaskRescheduleProc */ NULL, /* CallFrom16WndProc */ CALLBACK_CallWndProc, /* CallWndProc */ CALLBACK_CallDriverProc, /* CallDriverProc */ diff --git a/windows/win.c b/windows/win.c index bacc1d1efc2..ba8df034ea1 100644 --- a/windows/win.c +++ b/windows/win.c @@ -665,11 +665,9 @@ static HWND32 WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom, SEGPTR menuName = (SEGPTR)GetClassLong16( hwnd, GCL_MENUNAME ); if (menuName) { - /* hInstance is still 16-bit in 980215 winelib */ - if (HIWORD(cs->hInstance) || __winelib) + if (HIWORD(cs->hInstance)) cs->hMenu = LoadMenu32A(cs->hInstance,PTR_SEG_TO_LIN(menuName)); else - /* doesn't work for winelib, since resources are unicode */ cs->hMenu = LoadMenu16(cs->hInstance,menuName); if (cs->hMenu) SetMenu32( hwnd, cs->hMenu );