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.

diff --git a/include/pe_image.h b/include/pe_image.h
index 7f627ad..e9a4ca2 100644
--- a/include/pe_image.h
+++ b/include/pe_image.h
@@ -72,6 +72,7 @@
 	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 f81eda6..dd36af4 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 @@
   _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 @@
   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 a7ff701..395f603 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 <dlfcn.h>
-
-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 @@
 	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 <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
diff --git a/loader/module.c b/loader/module.c
index 8787e83..200b22c 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -407,29 +407,19 @@
                                      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 @@
     
     /* 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 @@
         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 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 @@
 
 	/* 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 );
 	    if (handle == 2)  /* file not found */
 	    {
diff --git a/loader/resource.c b/loader/resource.c
index a513966..d482549 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -66,7 +66,7 @@
  */
 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 @@
 	  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 @@
     	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 @@
     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 3907fc3..1305961 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"
 
 
 /**********************************************************************
@@ -232,6 +233,17 @@
 }
 
 /**********************************************************************
+ *	     CALLBACK_CallTaskRescheduleProc
+ */
+static void WINAPI CALLBACK_CallTaskRescheduleProc( void )
+{
+    SYSLEVEL_EnterWin16Lock();
+    TASK_Reschedule();
+    SYSLEVEL_LeaveWin16Lock();
+}
+
+
+/**********************************************************************
  *	     CALLBACK_WinelibTable
  *
  * The callbacks function table for Winelib
@@ -240,7 +252,7 @@
 {
     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 bacc1d1..ba8df03 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -665,11 +665,9 @@
 	    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 );