Release 971130

Sat Nov 29 12:35:26 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [if1632/builtin.c]
	Build a complete PE header for builtin Win32 modules.

	* [loader/pe_image.c] [loader/module.c]
	HMODULE32 now points to the loading address of the module. There
	is no longer a separate PE_MODULE structure.

Fri Nov 28 11:21:47 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [ole/*][configure.in][Makefile.in][include/interfaces.h]
	  [if1632/olesvr32.spec][if1632/olecli32.spec]
	New directory, moved OLE stuff there.
	new .spec files for olecli32,olesvr32, some stubs added.

	* [misc/shell.c]
	Added support for extracting icons from PE dlls.

	* [misc/shellord.c][if1632/shell32.spec]
	Added a huge heap of ordinal only exported shell functions
	(will work only in Win95).

	* [loader/task.c]
	Hack to make MakeProcInstance16 work in all cases (mplayer.exe).

	* [win32/string32.c][include/string32.h]
	Obsolete, removed.

	* [windows/keyboard.c]
	Added *RegisterHotkey.

	* [objects/font.c][objects/text.c]
	Added GetFontLanguageInfo, GetTextCharsetInfo.

Wed Nov 26 18:10:40 1997  Uwe Bonnes  <bon@elektron.ikp.physik.tu-darmstadt.de>

	* [misc/network.c]
	In WNetGetConnection16 return the Drive label and not the DOS-Cwd.
	Makes Wordview 6 start on a network connected machine.

	* [controls/status.c]
	Catch a Null pointer in SW_SetText.

	* [files/dos_fs.c]
 	Add NT5 functions GetLongPathName32.

	* [files/file.c]
	Make GetTempFileName16 accept drive 0 (Current Drive) too.
	Handle more errors and be more verbose in FILE_SetDosError, fix
	an error in DeleteFile32W

	* [memory/virtual.c]
	Implement FlushViewOfFile.

	* [misc/crtdll]
	Implement _rotl and splitpath and add a stub for 
	_abnormal_termination.

	* [misc/printdrv.c]
	Stub for EnumPrinters32A.

	* [win32/newfns]
	Add Stub for QueryPerformanceFrequency, change return value
	for QueryPerformanceCounter.
 	Add stub for DeviceIoControl.

Tue Nov 25 15:55:01 1997 Martin Boehme <boehme@informatik.mu-luebeck.de>

	* [controls/combo.c] [controls/edit.c] [windows/defwnd.c]
	  [windows/winpos.c] [windows/win.c]
	Removed WIN_NO_REDRAW flag.

Tue Nov 25 13:20:35 1997  Douglas Ridgway <ridgway@taiga.v-wave.com>

	* [graphics/x11drv/bitblt.c]
	Fixed memory leak in BITBLT_GetDstArea.

Sun Nov 23 14:05:23 1997  Andreas Mohr <100.30936@germany.net>

	* [files/directory.c]
	Export windows system directory to environment.

	* [if1632/Makefile.in] [if1632/builtin.c] [if1632/w32skrnl.spec]
	  [if1632/win32s16.spec] [misc/w32scomb.c] [misc/w32skrnl.c]
	Added Win32s DLLs W32SKRNL and WIN32S16.

	* [if1632/kernel32.spec] [loader/module.c]
	Added misc functions for Win32s.

	* [if1632/kernel.spec] [loader/task.c]
	Added DefineHandleTable().

	* [scheduler/process.c]
	Fixed SetEnvironmentVariable32A() to avoid heap corruption.

Sat Nov 22 14:11:42 1997  Kristian Nielsen  <kristian.nielsen@risoe.dk>

	* [windows/painting.c]
	Fix leak in BeginPaint16() for CS_PARENTDC windows where the
	update region was not properly released.

Thu Nov 20 03:55:29 1997  Gordon Chaffee <chaffee@CS.Berkeley.EDU>

	* [loader/pe_image.c]
	Implemented forwarded DLL functions.

	* [objects/dib.c]
	Added support for 16- and 32-bit mode DIBs.
	Support negative bitmap heights.

	* [win32/process.c]
	Added stub for CreateProcess32W.

	* [win32/security.c] [include/ntdll.h]
	Added stubs for LookupAccountSid32A/W.

	* [scheduler/process.c]
	Use the size specified in the PE header for the process heap.

Mon Nov 17 00:53:35 1997  Len White <phreak@cgocable.net>

	* [msdos/int3d.c]
	New file. Stubs for int3d.

Sun Nov 16 12:30:00 PST 1997  Jason Schonberg  <schon@mti.sgi.com>

	* [include/aspi.h]
	Changed comment style from C++ to C.
diff --git a/loader/module.c b/loader/module.c
index 202f189..f35bae4 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -53,18 +53,16 @@
 MODULE_HANDLEtoHMODULE16(HANDLE32 handle) {
     NE_MODULE	*pModule;
 
-    if (HIWORD(handle)) {
-	/* this is a HMODULE32 aka pe->mappeddll */
+    if (HIWORD(handle))
+    {
+	/* this is a HMODULE32 */
 
         /* walk the list looking for the correct startaddress */
     	pModule = (NE_MODULE *)GlobalLock16( hFirstModule );
-	while (pModule) { 
-		if (	((pModule->flags&(NE_FFLAGS_BUILTIN|NE_FFLAGS_WIN32))==NE_FFLAGS_WIN32) &&
-			pModule->pe_module &&
-			((HMODULE32)pModule->pe_module->mappeddll == handle)
-		)
-			return pModule->self;
-		pModule=(NE_MODULE*)GlobalLock16(pModule->next);
+	while (pModule)
+        {
+            if (pModule->module32 == handle) return pModule->self;
+            pModule = (NE_MODULE*)GlobalLock16(pModule->next);
 	}
 	return 0;
     }
@@ -89,10 +87,7 @@
 	if (!pModule)
 	    return 0;
 	
-	if (	((pModule->flags&(NE_FFLAGS_BUILTIN|NE_FFLAGS_WIN32))==NE_FFLAGS_WIN32) &&
-		pModule->pe_module
-	)
-		return (HMODULE32)pModule->pe_module->mappeddll;
+	if (pModule->module32) return pModule->module32;
 	return handle;
     }
 }
@@ -127,7 +122,7 @@
             pModule->os_flags, pModule->min_swap_area,
             pModule->expected_version );
     if (pModule->flags & NE_FFLAGS_WIN32)
-        printf( "PE module=%08x\n", (unsigned int)pModule->pe_module );
+        printf( "PE module=%08x\n", pModule->module32 );
 
       /* Dump the file info */
 
@@ -557,7 +552,7 @@
     pModule = (NE_MODULE *)GlobalLock16( hModule );
     memcpy( pModule, &ne_header, sizeof(ne_header) );
     pModule->count = 0;
-    pModule->pe_module = NULL;
+    pModule->module32 = 0;
     pModule->self = hModule;
     pModule->self_loading_sel = 0;
     pData = (BYTE *)(pModule + 1);
@@ -1139,7 +1134,7 @@
  */
 HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags)
 {
-    HMODULE16 hModule;
+    HMODULE32 hModule;
     HINSTANCE16 hInstance, hPrevInstance;
     NE_MODULE *pModule;
     LOADPARAMS *params = (LOADPARAMS *)paramBlock;
@@ -1161,7 +1156,8 @@
         if (!hModule)  /* We have to load the module */
         {
             /* Try to load the built-in first if not disabled */
-            if ((hModule = BUILTIN_LoadModule( name, FALSE ))) return hModule;
+            if ((hModule = BUILTIN_LoadModule( name, FALSE )))
+                return MODULE_HANDLEtoHMODULE16( hModule );
             
             if ((hFile = OpenFile32( name, &ofs, OF_READ )) == HFILE_ERROR32)
             {
@@ -1169,7 +1165,7 @@
                 if ((hModule = BUILTIN_LoadModule( name, TRUE )))
                 {
                     fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name );
-                    return hModule;
+                    return MODULE_HANDLEtoHMODULE16( hModule );
                 }
                 return 2;  /* File not found */
             }
@@ -1254,7 +1250,7 @@
                                 (LPSTR)PTR_SEG_TO_LIN( params->cmdLine ),
                                  showcmd );
 
-	if( hTask && TASK_GetNextTask(hTask)) Yield();
+	if( hTask && TASK_GetNextTask(hTask)) Yield16();
     }
 
     return hInstance;
@@ -1508,6 +1504,17 @@
 
 
 /***********************************************************************
+ *           PrivateLoadLibrary       (KERNEL32)
+ *
+ * FIXME: rough guesswork, don't know what "Private" means
+ */
+HMODULE32 WINAPI PrivateLoadLibrary(LPCSTR libname)
+{
+        return LoadLibrary16(libname);
+}
+
+
+/***********************************************************************
  *           FreeLibrary16   (KERNEL.96)
  */
 void WINAPI FreeLibrary16( HINSTANCE16 handle )
@@ -1518,6 +1525,17 @@
 
 
 /***********************************************************************
+ *           PrivateFreeLibrary       (KERNEL32)
+ *
+ * FIXME: rough guesswork, don't know what "Private" means
+ */
+void WINAPI PrivateFreeLibrary(HMODULE32 handle)
+{
+	FreeLibrary16(handle);
+}
+
+
+/***********************************************************************
  *           WinExec16   (KERNEL.166)
  */
 HINSTANCE16 WINAPI WinExec16( LPCSTR lpCmdLine, UINT16 nCmdShow )
@@ -1773,15 +1791,14 @@
 	dprintf_win32(stddeb,"GetProcAddress32(%08lx,%p)\n",(DWORD)hModule,function);
     if (!(pModule = MODULE_GetPtr( hModule )))
         return (FARPROC32)0;
-    if (pModule->flags & NE_FFLAGS_BUILTIN)
-        return BUILTIN_GetProcAddress32( pModule, function );
-    if (!pModule->pe_module) {
-    	fprintf(stderr,"Oops, Module 0x%08lx has got no pe_module?\n",
+    if (!pModule->module32)
+    {
+    	fprintf(stderr,"Oops, Module 0x%08lx has got no module32?\n",
 		(DWORD)MODULE_HANDLEtoHMODULE32(hModule)
 	);
 	return (FARPROC32)0;
     }
-    return PE_FindExportedFunction( pModule->pe_module, function );
+    return PE_FindExportedFunction( pModule->module32, function );
 }
 
 /***********************************************************************
@@ -1798,11 +1815,9 @@
 
     if (!(pModule = MODULE_GetPtr( hModule )))
         return (LPIMAGE_NT_HEADERS)0;
-    if (!(pModule->flags & NE_FFLAGS_WIN32) || !pModule->pe_module)
+    if (!(pModule->flags & NE_FFLAGS_WIN32) || !pModule->module32)
         return (LPIMAGE_NT_HEADERS)0;
-    if (pModule->flags & NE_FFLAGS_BUILTIN)
-        return (LPIMAGE_NT_HEADERS)0;
-    return pModule->pe_module->pe_header;
+    return PE_HEADER(pModule->module32);
 }