Release 970720

Sat Jul 19 13:03:01 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [tools/build.c] [include/stackframe.h]
	Save the complete %ebp register in CallFrom16; fixes a crash with
	LabView reported by Andreas Mohr.

	* [loader/main.c]
	Avoid executing a built-in DLL.

	* [controls/static.c]
	Converted static window procedure to Win32.

	* [windows/message.c] [windows/queue.c] [include/queue.h]
	Hacked SendMessage functions to support inter-task messages with
	SendMessage32A/W.

Sun Jul 13 16:55:35 1997  Bernhard Rosenkraenzer <bero@bero-online.ml.org>

	* [ipc/bit_array.c]
	Don't use bitops.h in Linux 2.1.x (these versions do not return
	the previous state for clear_bit and set_bit)

	* [ipc/shm_main_blk.c]
	Adapt to GLIBC's ipc_perm structure.

	* [memory/ldt.c]
	Include <asm/unistd.h> on Linux/GLIBC systems (required for
	_syscall3).

Wed Jul 9 23:53:19 1997  David A. Cuthbert  <dacut@henry.ece.cmu.edu>

	* [include/options.h] [files/profile.c]
	Added PROFILE_GetWineIniBool and PROFILE_EnumerateWineIniSection.

	* [include/sysmetrics.h] [include/windows.h] [windows/sysmetrics.c]
	All sysmetrics moved to array (no more constant macros).  Added
	MOUSEWHEELPRESENT metric.

	* [include/bitmap.h] [objects/oembitmap.c]
	Added OBM_Init() (see also loader/main.c) and more support for Win95
	bitmaps; added size info to OEM bitmaps.

	* [include/graphics.h] [windows/graphics.h]
	Added GRAPH_DrawGenericReliefRect.

	* [loader/main.c]
	Added TWEAK_Init() and TWEAK_CheckConfiguration() calls (the
	latter checks for invalid entries in wine.conf).

	* [include/debug.h] [include/stddebug.h] [include/nonclient.h]
	  [include/tweak.h] [controls/menu.c] [misc/tweak.c]
	  [objects/gdiobj.c] [windows/syscolor.c] [windows/nonclient.c]
	  [BUGS] [documentation/win95look]
	Added tweaks for Windows 95 interface support.  See
 	documentation/win95look for more information.

	* [controls/edit.c]
	Fixed EDIT_MoveHome bug.

	* [misc/ver.c]
	Changed name of dprintf_ver_string to ver_dstring to fix
	problem with tools/make_debug utility.

Wed Jul 9 21:31:54 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [objects/dib.c]
	Don't use palettes with dibs with biBitCount > 8.

	* [misc/ole2nls.c][misc/ver.c]
	IsValidLocale, EnumSystemLocales fixed (winhlp32.exe works)
	Some VerLanguage coded moved to ole2nls.c, some cleanups.

	* [multimedia/mcistring.c]
	Fixed "capabilities <dev> device type" crash (cool.exe).

	* [misc/main.c]
	SystemParametersInfo*: added stub option 41
	(GETNONCLIENTMETRICS), duplicated some stuff away from SPI16
	that writes 32bit vars.(one COMCTL32.DLL crash, freecell.exe)

Tue Jul  8 22:40:53 1997  Morten Welinder  <terra@diku.dk>

	* [if1632/shell32.spec]
	Use Windows 95's ordinals. Help wanted, inquire within.

Mon Jul  7 11:20:36 1997  Philippe De Muyter  <phdm@info.ucl.ac.be>

	* [if1632/relay.c] [if1632/user.spec] [if1632/kernel.spec]
	  [tools/build-spec.txt] [tools/build.c]
	Added type 'segstr' (segmented pointer to null-terminated string)
	to .spec files.

	* [windows/user.c] [if1632/user.spec]
	ExitWindowsExec stub function added.

Mon Jul  7 01:18:25 1997  U. Bonnes <bon@elektron.ikp.physik.th-darmstadt.de>

	* [files/file.c] [include/winbase.h] [if1632/kernel32.spec]
	Implement MoveFileEx32, some enhancement for Movefile32.

Sat Jul  5 18:13:48 1997  Bruce Milner <Bruce.Milner@genetics.utah.edu.

	* [files/file.c] [if1632/kernel32.spec] [include/winerror.h]
          [msdos/int21.c] [win32/file.c]
	Add LockFile/UnlockFile implementation.
	Add back in int21 func(0x5c) Record locking functions.

	* [files/file.c]
	Fixed bug with OF_REOPEN in FILE_DoOpenFile.

Fri Jul 4 12:00:00 1997  Henrik Olsen <Henrik.Olsen@iaeste.dk>

	* [misc/ole2nls.c] [programs/progman/Da.rc] [programs/winhelp/Da.rc]
	  [resources/sysres_Da.rc]
	Added/updated Danish language support.

Thu Jul  3 13:04:20 1997  Claus Fischer  <fischer@iue.tuwien.ac.at>

	* [files/dos_fs.c]
	Properly implemented DOSFS_UnixTimeToFileTime and
	DOSFS_FileTimeToUnixTime.

	* [documentation/wine.texinfo]
	First version of texinfo documentation.
diff --git a/loader/task.c b/loader/task.c
index 899e577..93756c8 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -44,8 +44,7 @@
 extern void PE_InitTls( PE_MODULE *module );
 
   /* Saved 16-bit stack for current process (Win16 only) */
-WORD IF1632_Saved16_ss = 0;
-WORD IF1632_Saved16_sp = 0;
+DWORD IF1632_Saved16_ss_sp = 0;
 
   /* Saved 32-bit stack for current process (Win16 only) */
 DWORD IF1632_Saved32_esp = 0;
@@ -360,9 +359,7 @@
     NE_MODULE *pModule = MODULE_GetPtr( pTask->hModule );
     SEGTABLEENTRY *pSegTable = NE_SEG_TABLE( pModule );
 
-    IF1632_Saved16_ss = pTask->ss;
-    IF1632_Saved16_sp = pTask->sp;
-
+    IF1632_Saved16_ss_sp = pTask->ss_sp;
     if (pModule->flags & NE_FFLAGS_WIN32)
     {
         /* FIXME: all this is an ugly hack */
@@ -404,7 +401,8 @@
 
         dprintf_task( stddeb, "Starting main program: cs:ip=%04lx:%04x ds=%04lx ss:sp=%04x:%04x\n",
                       CS_reg(&context), IP_reg(&context), DS_reg(&context),
-                      IF1632_Saved16_ss, IF1632_Saved16_sp );
+                      SELECTOROF(IF1632_Saved16_ss_sp),
+                      OFFSETOF(IF1632_Saved16_ss_sp) );
 
         CallTo16_regs_( &context );
         /* This should never return */
@@ -580,13 +578,13 @@
 
       /* Create the 16-bit stack frame */
 
-    pTask->ss = hInstance;
-    pTask->sp = ((pModule->sp != 0) ? pModule->sp :
-                 pSegTable[pModule->ss-1].minsize + pModule->stack_size) & ~1;
-    stack16Top = (char *)PTR_SEG_OFF_TO_LIN( pTask->ss, pTask->sp );
+    pTask->ss_sp = MAKELONG( ((pModule->sp != 0) ? pModule->sp :
+                 pSegTable[pModule->ss-1].minsize + pModule->stack_size) & ~1,
+                             hInstance );
+    stack16Top = (char *)PTR_SEG_TO_LIN( pTask->ss_sp );
     frame16 = (STACK16FRAME *)stack16Top - 1;
-    frame16->saved_ss = 0;
-    frame16->saved_sp = 0;
+    frame16->saved_ss_sp = 0;
+    frame16->ebp = 0;
     frame16->ds = frame16->es = pTask->hInstance;
     frame16->entry_point = 0;
     frame16->entry_ip = OFFSETOF(TASK_RescheduleProc) + 14;
@@ -596,17 +594,13 @@
     frame16->ip = LOWORD( CALLTO16_RetAddr_word );
     frame16->cs = HIWORD( CALLTO16_RetAddr_word );
 #endif  /* WINELIB */
-    pTask->sp -= sizeof(STACK16FRAME);
+    pTask->ss_sp -= sizeof(STACK16FRAME);
 
       /* If there's no 16-bit stack yet, use a part of the new task stack */
       /* This is only needed to have a stack to switch from on the first  */
       /* call to DirectedYield(). */
 
-    if (!IF1632_Saved16_ss)
-    {
-        IF1632_Saved16_ss = pTask->ss;
-        IF1632_Saved16_sp = pTask->sp;
-    }
+    if (!IF1632_Saved16_ss_sp) IF1632_Saved16_ss_sp = pTask->ss_sp;
 
       /* Add a breakpoint at the start of the task */
 
@@ -810,9 +804,8 @@
 
     if (pOldTask)
     {
-        pOldTask->ss  = IF1632_Saved16_ss;
-        pOldTask->sp  = IF1632_Saved16_sp;
-        pOldTask->esp = IF1632_Saved32_esp;
+        pOldTask->ss_sp = IF1632_Saved16_ss_sp;
+        pOldTask->esp   = IF1632_Saved32_esp;
     }
     else IF1632_Original32_esp = IF1632_Saved32_esp;
 
@@ -828,9 +821,8 @@
     hCurrentTask = hTask;
     pCurrentThread = pNewTask->thdb;
     pCurrentProcess = pCurrentThread->process;
-    IF1632_Saved16_ss   = pNewTask->ss;
-    IF1632_Saved16_sp   = pNewTask->sp;
-    IF1632_Saved32_esp  = pNewTask->esp;
+    IF1632_Saved16_ss_sp = pNewTask->ss_sp;
+    IF1632_Saved32_esp   = pNewTask->esp;
 }
 
 
@@ -912,7 +904,7 @@
     pinstance->stackbottom = stackhi; /* yup, that's right. Confused me too. */
     pinstance->stacktop    = stacklow; 
 #ifndef WINELIB
-    pinstance->stackmin    = IF1632_Saved16_sp;
+    pinstance->stackmin    = OFFSETOF(IF1632_Saved16_ss_sp);
 #endif
 }
 
@@ -1154,26 +1146,26 @@
     if (!(pTask = (TDB *)GlobalLock16( hCurrentTask ))) return;
     if (!(pData = (INSTANCEDATA *)GlobalLock16( seg ))) return;
     dprintf_task( stddeb, "SwitchStackTo: old=%04x:%04x new=%04x:%04x\n",
-                  IF1632_Saved16_ss, IF1632_Saved16_sp, seg, ptr );
+                  SELECTOROF(IF1632_Saved16_ss_sp),
+                  OFFSETOF(IF1632_Saved16_ss_sp), seg, ptr );
 
     /* Save the old stack */
 
     oldFrame           = CURRENT_STACK16;
-    pData->old_sp      = IF1632_Saved16_sp;
-    pData->old_ss      = IF1632_Saved16_ss;
+    pData->old_ss_sp   = IF1632_Saved16_ss_sp;
     pData->stacktop    = top;
     pData->stackmin    = ptr;
     pData->stackbottom = ptr;
 
     /* Switch to the new stack */
 
-    IF1632_Saved16_ss = pTask->ss = seg;
-    IF1632_Saved16_sp = pTask->sp = ptr - sizeof(STACK16FRAME);
+    IF1632_Saved16_ss_sp = pTask->ss_sp = MAKELONG( ptr - sizeof(STACK16FRAME),
+                                                    seg );
     newFrame = CURRENT_STACK16;
 
     /* Copy the stack frame and the local variables to the new stack */
 
-    copySize = oldFrame->bp - pData->old_sp;
+    copySize = oldFrame->bp - OFFSETOF(pData->old_ss_sp);
     memcpy( newFrame, oldFrame, MAX( copySize, sizeof(STACK16FRAME) ));
 }
 
@@ -1192,33 +1184,32 @@
     INSTANCEDATA *pData;
 
     if (!(pTask = (TDB *)GlobalLock16( hCurrentTask ))) return;
-    if (!(pData = (INSTANCEDATA *)GlobalLock16( IF1632_Saved16_ss ))) return;
-    if (!pData->old_ss)
+    if (!(pData = (INSTANCEDATA *)GlobalLock16(SELECTOROF(IF1632_Saved16_ss_sp))))
+        return;
+    if (!pData->old_ss_sp)
     {
         fprintf( stderr, "SwitchStackBack: no previous SwitchStackTo\n" );
         return;
     }
     dprintf_task( stddeb, "SwitchStackBack: restoring stack %04x:%04x\n",
-                  pData->old_ss, pData->old_sp );
+                  SELECTOROF(pData->old_ss_sp), OFFSETOF(pData->old_ss_sp) );
 
     oldFrame = CURRENT_STACK16;
 
     /* Switch back to the old stack */
 
-    IF1632_Saved16_ss = pTask->ss = pData->old_ss;
-    IF1632_Saved16_sp = pTask->sp = pData->old_sp;
-    pData->old_ss = pData->old_sp = 0;
+    IF1632_Saved16_ss_sp = pTask->ss_sp = pData->old_ss_sp;
+    pData->old_ss_sp = 0;
 
     /* Build a stack frame for the return */
 
     newFrame = CURRENT_STACK16;
-    newFrame->saved_ss = oldFrame->saved_ss;
-    newFrame->saved_sp = oldFrame->saved_sp;
-    newFrame->entry_ip = oldFrame->entry_ip;
-    newFrame->entry_cs = oldFrame->entry_cs;
-    newFrame->bp       = oldFrame->bp;
-    newFrame->ip       = oldFrame->ip;
-    newFrame->cs       = oldFrame->cs;
+    newFrame->saved_ss_sp = oldFrame->saved_ss_sp;
+    newFrame->entry_ip    = oldFrame->entry_ip;
+    newFrame->entry_cs    = oldFrame->entry_cs;
+    newFrame->bp          = oldFrame->bp;
+    newFrame->ip          = oldFrame->ip;
+    newFrame->cs          = oldFrame->cs;
 }
 
 
@@ -1491,8 +1482,8 @@
     lpte->hTaskParent   = pTask->hParent;
     lpte->hInst         = pTask->hInstance;
     lpte->hModule       = pTask->hModule;
-    lpte->wSS           = pTask->ss;
-    lpte->wSP           = pTask->sp;
+    lpte->wSS           = SELECTOROF( pTask->ss_sp );
+    lpte->wSP           = OFFSETOF( pTask->ss_sp );
     lpte->wStackTop     = pInstData->stacktop;
     lpte->wStackMinimum = pInstData->stackmin;
     lpte->wStackBottom  = pInstData->stackbottom;