Release 960928

Fri Sep 27 14:18:42 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [controls/button.c]
	Fixed focus rectangle size and clipping.

	* [controls/scroll.c]
	Converted to Win32 and added support for scroll page.
	Completed SetScrollInfo() and implemented other Win32 functions.

	* [files/file.c]
	Removed FILE_Read() (use _lread32 instead).

	* [objects/dce.c] [include/dce.h]
	Allocate DCE on the Win32 heap, and use pointers instead of
	handles.
	Implemented Win32 version of DC functions.

	* [windows/painting.c]
	Attempt to make CS_PARENTDC style work again.

Wed Sep 25 23:40:52 1996 Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [windows/dce.c] [windows/winpos.c]
	Override SaveUnder attribute when painting took place
	in a window below. Force X to raise activated window 
	in seamless mode.

	* [misc/clipboard.c] [windows/event.c]
	Translation between DOS and Unix text formats and several
	other fixes for the sudden selection loss.

	* [windows/message.c]
	Apply "first" and "last" when checking for WM_QUIT in 
        MSG_PeekMessage().

	* [windows/win.c]
	Rearranged DestroyWindow() to fit "Windows Internals"
	description.

	* [windows/win.c] [windows/winpos.c] [windows/nonclient.c]
	Misc. fixes to CBT hook calls.

	* [controls/menu.c] [misc/user.c]
	Fixup resident popup menu window so that it doesn't get
	destroyed by USER_AppExit().

	* [loader/module.c] [loader/task.c] [windows/event.c]
	Process "unsafe" X events outside the scheduler to prevent
	deadlocks.

	* [windows/message.c] [windows/queue.c] [windows/winpos.c]
	Lots of fixes for better Win16 multitasking.

Wed Sep 25 20:36:30 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [include/windows.h]
	Added some missing HOOK defines.

	* [misc/shell.c][if1632/shell32.spec][include/shell.h]
	SHGetFileInfoA stub added (win95 mplayer.exe /play bla.avi).

	* [win32/console.c][include/wincon.h]
	GetConsoleScreenBufferInfo, GetLargestConsoleWindowSize added.

	* [misc/registry.c]
	Some null ptr fixes.

	* [loader/pe_image.c]
	Fixed exported function lookup. (msvcrt20.dll)
	Add debugsyms for entrypoint, exported functions and sections.

	* [multimedia/mmsystem.c]
	MCIOpen: support for element opens (mplayer.exe /play bla.avi).

	* [several]
	Added several missing things/stubs/simple thunks from win32
	to win16 code.

Sat Sep 21 17:27:44 1996  O.Flebbe  <flebbe@science-computing.uni-tuebingen.de>

	* [windows/property.c]
	Fixed debugging of 16 Bit RemoveProp().

	* [debugger/memory.c]
	Added DEBUG_checkmap_bad() for linux.

Thu Sep 19 20:48:31 1996  Albrecht Kleine  <kleine@ak.sax.de>

	* [windows/event.c] [windows/hook.c]
	Use EnableHardwareInput() for JournalPlayback hook.

	* [controls/listbox.c]
	Changed handling of LB_GETITEMRECT in empty listboxes.

Thu Sep 19 13:34:35 1996  Slaven Rezic  <eserte@cs.tu-berlin.de>

	* [misc/main.c]
	Fixes to X resources handling.	

Wed Sep 18 00:31:15 1996  Huw D. M. Davies <h.davies1@physics.oxford.ac.uk>

	* [objects/metafile.c] [include/gdi.h] [objects/dc.c]
	Individual handle table created for each metafile. Fixed
 	GlobalReAlloc() bug in MF_AddHandleDC() (was MF_AddHandleInternal).

	* [windows/graphics.c] [objects/dc.c]
	Rectangle() changed to work better with wide pens and PS_NULL.
	Use JoinMiter.

	* [windows/winpos.c]
	Make the whole (non X) window invalid on resize if CS_[VH]REDRAW
 	is set.

	* [windows/nonclient.c]
	AdjustWindowRectEx() should perform calculations even if the
 	window is minimized.

	* [windows/mdi.c]
	Better handling of system button painting. Maximized windows can
 	contain scroll bars. Icons now maximize properly.

	* [windows/defwnd.c] [windows/nonclient.c] [controls/menu.c]
	Improved greying of items in system menu. WM_INITMEMUPOPUP no
 	longer caught in DefWndProc, DEFWND_InitSysMenuPopup moved to
 	menu.c.

Mon Sep 16 21:30:00 1996  Uwe Bonnes <bon@elektron.ikp.physik.th-darmstadt.de>

	* [several files]
	Fix missing includes and wrong printing arguments.

	* [controls/listbox.c]
	Don't sort drives in ListBoxDirectory().
	
Sat Sep 14 09:05:47 1996  Petri Tuomola <ptuomola@xs4all.nl>

	* [windows/dialog.c]
	Fixed handling of Shift-TAB in dialogs.

Thu Sep 12 18:31:00 1996  Thomas Sandford <t.d.g.sandford@prds-grn.demon.co.uk>

	* [if1632/gdi32.spec]
	Added SelectClipRgn - call win16 version.

	* [if1632/user32.spec]
	Added GetAsyncKeyState, GetMenuItemID and GetMenuStringA.

	* [include/wincon.h]
	Added COORD and SMALL_RECT typedefs, moved CONSOLE_SCREEN_BUFFER_INFO
	out of #if 0 protected portion of file.

	* [loader/pe_image.c]
	PE_InitTEB() - Tidy up, bug fix to stack pointer value (Borland
	programs now work better)

	* [win32/console.c]
	Added stub functions for GetConsoleScreenBufferInfo and 
	GetLargestConsoleWindowSize

	* [win32/findfile.c]
	FindFirstFile32A() - removed erroneous strcpy

	* [windows/keyboard.c]
	GetAsyncKeyState() - bug fix - now returns value as per Microsoft
	specification. NB - I still have doubts about some other functions
	in this file.
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 6514c18..8ab35e9 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -2,6 +2,7 @@
 /* 
  *  Copyright	1994	Eric Youndale & Erik Bos
  *  Copyright	1995	Martin von Löwis
+ *  Copyright   1996    Marcus Meissner
  *
  *	based on Eric Youndale's pe-test and:
  *
@@ -30,6 +31,7 @@
 #include "registers.h"
 #include "stddebug.h"
 #include "debug.h"
+#include "debugger.h"
 #include "xmalloc.h"
 
 void my_wcstombs(char * result, u_short * source, int len)
@@ -77,34 +79,53 @@
 
 void dump_exports(struct PE_Export_Directory * pe_exports, unsigned int load_addr)
 { 
-  char * Module;
-  int i;
-  u_short * ordinal;
-  u_long * function;
-  u_char ** name, *ename;
+  char		*Module;
+  int		i;
+  u_short	*ordinal;
+  u_long	*function,*functions;
+  u_char	**name,*ename;
+  char		buffer[1000];
+  DBG_ADDR	daddr;
 
-  Module = ((char *) load_addr) + pe_exports->Name;
+  daddr.seg = 0;
+  Module = ((char*)load_addr)+pe_exports->Name;
   dprintf_win32(stddeb,"\n*******EXPORT DATA*******\nModule name is %s, %ld functions, %ld names\n", 
 	 Module,
 	 pe_exports->Number_Of_Functions,
 	 pe_exports->Number_Of_Names);
 
-  ordinal = (u_short *) (((char *) load_addr) + (int) pe_exports->Address_Of_Name_Ordinals);
-  function = (u_long *)  (((char *) load_addr) + (int) pe_exports->AddressOfFunctions);
-  name = (u_char **)  (((char *) load_addr) + (int) pe_exports->AddressOfNames);
+  ordinal=(u_short*)(((char*)load_addr)+(int)pe_exports->Address_Of_Name_Ordinals);
+  functions=function=(u_long*)(((char*)load_addr)+(int)pe_exports->AddressOfFunctions);
+  name=(u_char**)(((char*)load_addr)+(int)pe_exports->AddressOfNames);
 
   dprintf_win32(stddeb,"%-32s Ordinal Virt Addr\n", "Function Name");
-  for(i=0; i< pe_exports->Number_Of_Functions; i++) {
+  for (i=0;i<pe_exports->Number_Of_Functions;i++) {
       if (i<pe_exports->Number_Of_Names) {
-	  ename =  (char *) (((char *) load_addr) + (int) *name++);
-	  dprintf_win32(stddeb,"%-32s %4d    %8.8lx\n", ename, *ordinal++, *function++);
+	  ename=(char*)(((char*)load_addr)+(int)*name++);
+	  dprintf_win32(stddeb,"%-32s %4d    %8.8lx (%8.8lx)\n",ename,*ordinal,functions[*ordinal],*function);
+	  sprintf(buffer,"%s.%s",Module,ename);
+	  daddr.off=load_addr+functions[*ordinal];
+	  ordinal++;
+	  function++;
       } else {
       	  /* ordinals/names no longer valid, but we still got functions */
-	  dprintf_win32(stddeb,"%-32s %4s    %8.8lx\n","","",*function++);
+	  dprintf_win32(stddeb,"%-32s %4s    %8s %8.8lx\n","","","",*function);
+	  sprintf(buffer,"%s.%d",Module,i);
+	  daddr.off=load_addr+*functions;
+	  function++;
       }
+      DEBUG_AddSymbol(buffer,&daddr);
   }
 }
 
+/* Look up the specified function or ordinal in the exportlist:
+ * If it is a string:
+ * 	- look up the name in the Name list. 
+ *	- look up the ordinal with that index.
+ *	- use the ordinal as offset into the functionlist
+ * If it is a ordinal:
+ *	- use ordinal-pe_export->Base as offset into the functionlist
+ */
 FARPROC32 PE_FindExportedFunction(struct pe_data *pe, LPCSTR funcName)
 {
 	struct PE_Export_Directory * exports = pe->pe_export;
@@ -114,32 +135,29 @@
 	u_char ** name, *ename;
 	int i;
 
+	if (HIWORD(funcName))
+		dprintf_win32(stddeb,"PE_FindExportedFunction(%s)\n",funcName);
+	else
+		dprintf_win32(stddeb,"PE_FindExportedFunction(%d)\n",(int)funcName);
 	if (!exports)
 		return NULL;
 	ordinal=(u_short*)(((char*)load_addr)+(int)exports->Address_Of_Name_Ordinals);
 	function=(u_long*)(((char*)load_addr)+(int)exports->AddressOfFunctions);
 	name=(u_char **)(((char*)load_addr)+(int)exports->AddressOfNames);
 	if (HIWORD(funcName)) {
-		for(i=0; i<exports->Number_Of_Names; i++)
-		{
-			ename =  (char *) (((char *) load_addr) + (int) *name);
-			if(strcmp(ename,funcName)==0)
-				return (FARPROC32)(load_addr + *function);
-			function++;
+		for(i=0; i<exports->Number_Of_Names; i++) {
+			ename=(char*)(((char*)load_addr)+(int)*name);
+			if(!strcmp(ename,funcName))
+				return (FARPROC32)(load_addr+function[*ordinal]);
+			ordinal++;
 			name++;
 		}
 	} else {
-		/* if we got no name directory, we use the ordinal as offset */
-		if (!exports->Number_Of_Names) {
-			i = function[(int)funcName-exports->Base];
-			return (FARPROC32)(load_addr+i);
+		if (funcName-exports->Base > exports->Number_Of_Functions) {
+			dprintf_win32(stddeb,"	ordinal %d out of range!\n",funcName);
+			return NULL;
 		}
-		for(i=0; i<exports->Number_Of_Names; i++) {
-			if((int)funcName == (int)*ordinal + exports->Base)
-				return (FARPROC32)(load_addr + *function);
-			function++;
-			ordinal++;
-		}
+		return (FARPROC32)(load_addr+function[(int)funcName-exports->Base]);
 	}
 	return NULL;
 }
@@ -357,6 +375,10 @@
     int i, result;
     unsigned int load_addr;
     struct Directory dir;
+    char	buffer[200];
+    DBG_ADDR	daddr;
+
+	daddr.seg=0;
 
 	pe = xmalloc(sizeof(struct pe_data));
 	memset(pe,0,sizeof(struct pe_data));
@@ -511,9 +533,28 @@
 		dprintf_win32(stdnimp,"Callback directory ignored\n");
 
 
+	if(pe->pe_reloc) do_relocations(pe);
 	if(pe->pe_import) fixup_imports(pe, hModule);
 	if(pe->pe_export) dump_exports(pe->pe_export,load_addr);
-	if(pe->pe_reloc) do_relocations(pe);
+  		
+	if (pe->pe_export) {
+		/* add start of sections as debugsymbols */
+		for(i=0;i<pe->pe_header->coff.NumberOfSections;i++) {
+			sprintf(buffer,"%s.%s",
+				((char*)load_addr)+pe->pe_export->Name,
+				pe->pe_seg[i].Name
+			);
+			daddr.off=load_addr+pe->pe_seg[i].Virtual_Address;
+			DEBUG_AddSymbol(buffer,&daddr);
+		}
+		/* add entry point */
+		sprintf(buffer,"%s.EntryPoint",((char*)load_addr)+pe->pe_export->Name);
+		daddr.off=load_addr+pe->pe_header->opt_coff.AddressOfEntryPoint;
+		DEBUG_AddSymbol(buffer,&daddr);
+		/* add start of DLL */
+		daddr.off=load_addr;
+		DEBUG_AddSymbol(((char*)load_addr)+pe->pe_export->Name,&daddr);
+	}
         return pe;
 }
 
@@ -607,7 +648,7 @@
         printf("InitPEDLL() called!\n");
         CallDLLEntryProc32( (FARPROC32)(pe->load_addr + 
                                   pe->pe_header->opt_coff.AddressOfEntryPoint),
-                            hModule, DLL_PROCESS_ATTACH, 0 );
+                            hModule, DLL_PROCESS_ATTACH, (void *)-1 );
     }
 }
 
@@ -631,8 +672,8 @@
     TEB *pTEB;
 
     pTask = (TDB *)(GlobalLock16(GetCurrentTask() & 0xffff));
-    pTEB = (TEB *)(PTR_SEG_OFF_TO_LIN(hTEB, 0));
-    pTEB->stack = (void *)(GlobalLock16(pTask->hStack32));
+    pTEB  = (TEB *)(GlobalLock16(hTEB));
+    pTEB->stack = pTask->esp;
     pTEB->Except = (void *)(-1); 
     pTEB->TEBDSAlias = pTEB;
     pTEB->taskid = getpid();