Release 970914

Thu Sep 11 18:24:56 1997  Philippe De Muyter  <phdm@info.ucl.ac.be>

	* [objects/dc.c]
	In DC_SetupGCForPatBlt, replace R2_NOT by GXxor with (black xor white).

Tue Sep  9 23:04:02 1997  U. Bonnes <bon@elektron.ikp.physik.th-darmstadt.de>

	* [memory/virtual.c] 
	Do not write debugging info unconditionally to stderr.

	* [files/profile.c]
	Call PROFILE_GetSection in PROFILE_GetString for key_name "" too.

	* [misc/crtdll.c]
	Many new functions.

	* [include/windows.h] [windows/winpos.c]
	ClientToScreen16 doesn't have a return value.

Sun Sep  7 10:06:39 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [misc/main.c] [AUTHORS]
	Update the list of contributors. Please let me know if I forgot
	someone.

	* [if1632/*.spec] [if1632/builtin.c] [tools/build.c]
	Ordinal base for Win32 DLLs is now computed automatically from the
	lowest ordinal found.

	* [include/wintypes.h]
	WINAPI is now defined as attribute((stdcall)). This will require
	gcc to compile.

	* [if1632/thunk.c]
	Removed Win32 thunks (no longer needed with stdcall).

	* [if1632/crtdll.spec] [misc/crtdll.c]
	Make sure we only reference cdecl functions in the spec file.

	* [objects/dc.c]
	Use CapNotLast drawing style for 1-pixel wide lines.

	* [tools/build.c]
	Added 'double' argument type.
	Added 'varargs' function type for Win32.
	Made CallTo16_xxx functions stdcall.

Fri Sep  5 14:50:49 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [tools/build.c] [windows/win.c] [windows/event.c] [windows/message.c]
	More fixes to get message exchange closer to the original.

	* [misc/spy.c]
	Message logs now contain window names.

	* [loader/resource.c] [loader/ne_resource.c] [loader/task.c]
	  [objects/cursoricon.c] [windows/user.c]
	Added some obscure features to fix memory leaks.

Fri Sep  5 00:46:28 1997  Jan Willamowius <jan@janhh.shnet.org>

	* [if1632/kernel32.spec] [win32/newfns.c]
	Added stub for UTRegister() and UTUnRegister().

Thu Sep  4 12:03:12 1997  Frans van Dorsselaer <dorssel@rulhmpc49.LeidenUniv.nl>
	* [controls/edit.c]
	Allow ASCII codes > 127 in WM_CHAR.

Mon Sep  1 17:23:24 1997  Dimitrie O. Paun  <dimi@mail.cs.toronto.edu>

	* [controls/widgets.c]
	In InitCommonControls, remember the name of the class
	because lpszClassName was made to point to a local array
	Added the ProgressBar to the list of implemented controls.
	Call InitCommonControls from WIDGETS_Init to register all
	implemented Common Controls.
	
	* [include/commctrl.h]
	Added misc decl for the Progress Bar.

	* [controls/progress.c] [include/progress.h]
	First attempt at implementiong the Progress Bar class.

	* [objects/brush.h]
	Implementation for GetSysColorBrush[16|32]

	* [controls/status.c]
	Use DrawEdge to draw the borders and fill the background

	* [controls/uitools.c]
	Added DrawDiagEdge32 and DrawRectEdge32

	* [graphics/painting.c]
	Implement DrawEdge[16|32]
	Started DrawFrameControl32

Mon Sep  1 10:07:09 1997  Lawson Whitney <lawson_whitney@juno.com>

	* [misc/comm.c] [include/windows.h]
	SetCommEventMask returns a SEGPTR.

Sun Aug 31 23:28:32 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [loader/pe_image.c][loader/module.c][include/pe_image.h]
	  [include/module.h]
	Cleaned up the whole Win32 library mess (a bit).

	* [debugger/stabs.c]
	If 'wine' has no absolute path and isn't found, check $PATH too.

	* [misc/ole2nls.c]
	Some fixes.

	* [misc/ver.c]
	Added support for PE style version resources.

	* [memory/string.c]
	Check for NULL pointers to _lstr* functions, just as Windows95 does.

	* [multimedia/time.c]
	Made list of timers a simple linked list.

	* [loader/resource.c]
	Netscape 3 seems to pass NEGATIVE resource Ids (in an
	unsigned int, yes). Don't know why, fixed it anyway.

	* [objects/bitmap.c]
	LoadImageW added.

	* [include/win.h][windows/win.c]
	Change wIDmenu from UINT16 to UINT32 and changed the
	SetWindow(Long|Word) accordingly.

Thu Aug 28 19:30:08 1997  Morten Welinder  <terra@diku.dk>

	* [include/windows.h]
	Add a few more colors defined for Win95.
	Add a few more brush styles.

	* [windows/syscolor.c]
 	Add error checks for SYSCOLOR_SetColor, SYSCOLOR_Init,
	GetSysColor16, GetSysColor32.  Add support for above colors.

Sun Aug 24 16:22:57 1997  Andrew Taylor <andrew@riscan.com>

	* [multimedia/mmsystem.c]
	Changed mmioDescend to use mmio functions for file I/O, neccessary
	for memory files.
diff --git a/loader/pe_resource.c b/loader/pe_resource.c
index 2d2bbaf..9b8ae7e 100644
--- a/loader/pe_resource.c
+++ b/loader/pe_resource.c
@@ -18,6 +18,8 @@
 #include "pe_image.h"
 #include "module.h"
 #include "heap.h"
+#include "task.h"
+#include "process.h"
 #include "libres.h"
 #include "stackframe.h"
 #include "neexe.h"
@@ -25,20 +27,24 @@
 #include "debug.h"
 
 /**********************************************************************
- *  HMODULE32toPE_MODULE 
+ *  HMODULE32toPE_MODREF 
  *
- * small helper function to get a PE_MODULE from a passed HMODULE32
+ * small helper function to get a PE_MODREF from a passed HMODULE32
  */
-static PE_MODULE*
-HMODULE32toPE_MODULE(HMODULE32 hmod) {
+static PE_MODREF*
+HMODULE32toPE_MODREF(HMODULE32 hmod) {
 	NE_MODULE	*pModule;
+	PDB32		*pdb = (PDB32*)GetCurrentProcessId();
+	PE_MODREF	*pem;
 
 	if (!hmod) hmod = GetTaskDS(); /* FIXME: correct? */
-	hmod = GetExePtr( hmod );  /* In case we were passed an hInstance */
-
+	hmod = MODULE_HANDLEtoHMODULE32( hmod );
+	if (!hmod) return NULL;
 	if (!(pModule = MODULE_GetPtr( hmod ))) return 0;
-	if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0;
-	return pModule->pe_module;
+	pem = pdb->modref_list;
+	while (pem && pem->pe_module->mappeddll != hmod)
+		pem=pem->next;
+	return pem;
 }
 
 /**********************************************************************
@@ -106,12 +112,12 @@
     LPIMAGE_RESOURCE_DIRECTORY resdirptr;
     DWORD root;
     HANDLE32 result;
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hModule);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hModule);
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return 0;
 
-    resdirptr = pe->pe_resource;
+    resdirptr = pem->pe_resource;
     root = (DWORD) resdirptr;
     if ((resdirptr = GetResDirEntryW(resdirptr, type, root)) == NULL)
 	return 0;
@@ -130,13 +136,13 @@
  */
 HANDLE32 PE_LoadResource32( HINSTANCE32 hModule, HANDLE32 hRsrc )
 {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hModule);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hModule);
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return 0;
     if (!hRsrc)
    	 return 0;
-    return (HANDLE32) (pe->load_addr+((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
+    return (HANDLE32) (pem->load_addr+((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
 }
 
 
@@ -169,21 +175,21 @@
 
 DWORD PE_SizeofResource32( HINSTANCE32 hModule, HANDLE32 hRsrc )
 {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hModule);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hModule);
     DWORD	max,data;
     IMAGE_DATA_DIRECTORY	dir;
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return 0;
     if (!hRsrc) return 0;
 
     max=(DWORD)-1;
-    dir=pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
+    dir=pem->pe_module->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE];
     if(dir.Size)
-    	max=(DWORD)pe->pe_resource+dir.Size;
+    	max=(DWORD)pem->pe_resource+dir.Size;
 
-    data=((DWORD)pe->load_addr+((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
-    walk_resdir(pe->load_addr,(DWORD)pe->pe_resource,0,data,0,&max);
+    data=((DWORD)pem->load_addr+((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
+    walk_resdir(pem->load_addr,(DWORD)pem->pe_resource,0,data,0,&max);
     return max-data;
 }
 
@@ -192,24 +198,24 @@
  */
 BOOL32
 PE_EnumResourceTypes32A(HMODULE32 hmod,ENUMRESTYPEPROC32A lpfun,LONG lparam) {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hmod);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hmod);
     int		i;
     LPIMAGE_RESOURCE_DIRECTORY		resdir;
     LPIMAGE_RESOURCE_DIRECTORY_ENTRY	et;
     BOOL32	ret;
     HANDLE32	heap = GetProcessHeap();	
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return FALSE;
 
-    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
+    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pem->pe_resource;
     et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
     ret = FALSE;
     for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++) {
     	LPSTR	name;
 
 	if (HIWORD(et[i].u1.Name))
-		name = HEAP_strdupWtoA(heap,0,(LPWSTR)((LPBYTE)pe->pe_resource+et[i].u1.Name));
+		name = HEAP_strdupWtoA(heap,0,(LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.Name));
 	else
 		name = (LPSTR)et[i].u1.Name;
 	ret = lpfun(hmod,name,lparam);
@@ -226,22 +232,22 @@
  */
 BOOL32
 PE_EnumResourceTypes32W(HMODULE32 hmod,ENUMRESTYPEPROC32W lpfun,LONG lparam) {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hmod);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hmod);
     int		i;
     LPIMAGE_RESOURCE_DIRECTORY		resdir;
     LPIMAGE_RESOURCE_DIRECTORY_ENTRY	et;
     BOOL32	ret;
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return FALSE;
 
-    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
+    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pem->pe_resource;
     et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
     ret = FALSE;
     for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++) {
 	LPWSTR	type;
     	if (HIWORD(et[i].u1.Name))
-		type = (LPWSTR)((LPBYTE)pe->pe_resource+et[i].u1.Name);
+		type = (LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.Name);
 	else
 		type = (LPWSTR)et[i].u1.Name;
 
@@ -259,7 +265,7 @@
 PE_EnumResourceNames32A(
 	HMODULE32 hmod,LPCSTR type,ENUMRESNAMEPROC32A lpfun,LONG lparam
 ) {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hmod);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hmod);
     int		i;
     LPIMAGE_RESOURCE_DIRECTORY		resdir;
     LPIMAGE_RESOURCE_DIRECTORY_ENTRY	et;
@@ -267,14 +273,14 @@
     HANDLE32	heap = GetProcessHeap();	
     LPWSTR	typeW;
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return FALSE;
-    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
+    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pem->pe_resource;
     if (HIWORD(type))
 	typeW = HEAP_strdupAtoW(heap,0,type);
     else
 	typeW = (LPWSTR)type;
-    resdir = GetResDirEntryW(resdir,typeW,(DWORD)pe->pe_resource);
+    resdir = GetResDirEntryW(resdir,typeW,(DWORD)pem->pe_resource);
     if (HIWORD(typeW))
     	HeapFree(heap,0,typeW);
     if (!resdir)
@@ -285,7 +291,7 @@
     	LPSTR	name;
 
 	if (HIWORD(et[i].u1.Name))
-	    name = HEAP_strdupWtoA(heap,0,(LPWSTR)((LPBYTE)pe->pe_resource+et[i].u1.Name));
+	    name = HEAP_strdupWtoA(heap,0,(LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.Name));
 	else
 	    name = (LPSTR)et[i].u1.Name;
 	ret = lpfun(hmod,type,name,lparam);
@@ -303,17 +309,17 @@
 PE_EnumResourceNames32W(
 	HMODULE32 hmod,LPCWSTR type,ENUMRESNAMEPROC32W lpfun,LONG lparam
 ) {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hmod);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hmod);
     int		i;
     LPIMAGE_RESOURCE_DIRECTORY		resdir;
     LPIMAGE_RESOURCE_DIRECTORY_ENTRY	et;
     BOOL32	ret;
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return FALSE;
 
-    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
-    resdir = GetResDirEntryW(resdir,type,(DWORD)pe->pe_resource);
+    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pem->pe_resource;
+    resdir = GetResDirEntryW(resdir,type,(DWORD)pem->pe_resource);
     if (!resdir)
     	return FALSE;
     et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
@@ -321,7 +327,7 @@
     for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++) {
 	LPWSTR	name;
     	if (HIWORD(et[i].u1.Name))
-		name = (LPWSTR)((LPBYTE)pe->pe_resource+et[i].u1.Name);
+		name = (LPWSTR)((LPBYTE)pem->pe_resource+et[i].u1.Name);
 	else
 		name = (LPWSTR)et[i].u1.Name;
 	ret = lpfun(hmod,type,name,lparam);
@@ -339,7 +345,7 @@
 	HMODULE32 hmod,LPCSTR name,LPCSTR type,ENUMRESLANGPROC32A lpfun,
 	LONG lparam
 ) {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hmod);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hmod);
     int		i;
     LPIMAGE_RESOURCE_DIRECTORY		resdir;
     LPIMAGE_RESOURCE_DIRECTORY_ENTRY	et;
@@ -347,15 +353,15 @@
     HANDLE32	heap = GetProcessHeap();	
     LPWSTR	nameW,typeW;
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return FALSE;
 
-    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
+    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pem->pe_resource;
     if (HIWORD(name))
 	nameW = HEAP_strdupAtoW(heap,0,name);
     else
     	nameW = (LPWSTR)name;
-    resdir = GetResDirEntryW(resdir,nameW,(DWORD)pe->pe_resource);
+    resdir = GetResDirEntryW(resdir,nameW,(DWORD)pem->pe_resource);
     if (HIWORD(nameW))
     	HeapFree(heap,0,nameW);
     if (!resdir)
@@ -364,7 +370,7 @@
 	typeW = HEAP_strdupAtoW(heap,0,type);
     else
 	typeW = (LPWSTR)type;
-    resdir = GetResDirEntryW(resdir,typeW,(DWORD)pe->pe_resource);
+    resdir = GetResDirEntryW(resdir,typeW,(DWORD)pem->pe_resource);
     if (HIWORD(typeW))
     	HeapFree(heap,0,typeW);
     if (!resdir)
@@ -372,7 +378,7 @@
     et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));
     ret = FALSE;
     for (i=0;i<resdir->NumberOfNamedEntries+resdir->NumberOfIdEntries;i++) {
-    	/* languages are just ids... I hope */
+    	/* languages are just ids... I hopem */
 	ret = lpfun(hmod,name,type,et[i].u1.Id,lparam);
 	if (!ret)
 		break;
@@ -388,20 +394,20 @@
 	HMODULE32 hmod,LPCWSTR name,LPCWSTR type,ENUMRESLANGPROC32W lpfun,
 	LONG lparam
 ) {
-    PE_MODULE	*pe = HMODULE32toPE_MODULE(hmod);
+    PE_MODREF	*pem = HMODULE32toPE_MODREF(hmod);
     int		i;
     LPIMAGE_RESOURCE_DIRECTORY		resdir;
     LPIMAGE_RESOURCE_DIRECTORY_ENTRY	et;
     BOOL32	ret;
 
-    if (!pe || !pe->pe_resource)
+    if (!pem || !pem->pe_resource)
     	return FALSE;
 
-    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pe->pe_resource;
-    resdir = GetResDirEntryW(resdir,name,(DWORD)pe->pe_resource);
+    resdir = (LPIMAGE_RESOURCE_DIRECTORY)pem->pe_resource;
+    resdir = GetResDirEntryW(resdir,name,(DWORD)pem->pe_resource);
     if (!resdir)
     	return FALSE;
-    resdir = GetResDirEntryW(resdir,type,(DWORD)pe->pe_resource);
+    resdir = GetResDirEntryW(resdir,type,(DWORD)pem->pe_resource);
     if (!resdir)
     	return FALSE;
     et =(LPIMAGE_RESOURCE_DIRECTORY_ENTRY)((LPBYTE)resdir+sizeof(IMAGE_RESOURCE_DIRECTORY));