Release 950727

Sat Jul 22 22:39:09 IDT 1995 Michael Veksler <e1678223@tochnapc2.technion.ac.il>

	* [ipc/*]
	New directory. This directory contains the new inter-wine
 	communications support. It enables DDE protocols between two wine
 	instances.  Currently it is limited to DDE, but can be enhanced to
 	support OLE between 2 different wine instances.  This is very
 	important for libwine.a DDE/OLE support.

	* [tools/ipcl]
    	A script to delete garbage IPC handles (shared memory, semaphores
 	and message queues).  The current inter-wine communication is not
 	perfect, and sometimes leaves garbage behind.

	* [if1632/relay.c] [include/atom.h] [include/global.h]
 	[loader/selector.c] [loader/task.c] [loader/module.c]
 	[loader/signal.c] [memory/global.c] [misc/atom.c]
 	[windows/class.c] [windows/message.c] [windows/win.c]
	[Imakefile]
    	Hooks for inter-wine DDE support, current Global.*Atom functions
 	renamed to Local.*Atom since Global.*Atom are used for Inter-Wine
 	DDE communication. (The first call to these functions sets up the
 	IPC structures - which otherwise cause unneeded overhead.

Mon Jul 17 19:55:21 1995  Alexandre Julliard  <julliard@sunsite.unc.edu>

	* [controls/menu.c]
	Don't crash if a NULL string is passed to menu functions.

	* [memory/selector.c]
	We now use a bit in ldt_flags_copy to indicate free LDT entries.
	Fixed a bug in SELECTOR_ReallocBlock that could cause it to
	overwrite valid LDT entries when growing a block.

	* [miscemu/instr.c]
	Emulate int xx instruction by storing the interrupt vector in
	CS:IP and returning directly. This allows a program to install an
	interrupt vector.

	* [windows/win.c]
	Added function WIN_GetTopParent to get the top-level parent of a
	window.

Sun Jul  16 18:17:17 1995  Gregory Trubetskoy <grisha@mira.com>

        * [loader/resource.c]
        Added LoadIconHandler. It doesn't do anything yet, but now you
        can use borland help files with winhelp.exe.

Sun Jul 16 11:58:45 1995 Anand Kumria <akumria@ozemail.com.au>

	* [misc/main.c]
	Fixed to return 386 Enhanced mode correctly. Also return the same
 	type of CPU, for both Enhanced and Standard mode, namely a 386.

Sun Jul 16 00:02:04 1995    Martin von Loewis <loewis@informatik.hu-berlin.de>

	* [Configure] [include/options.h] [include/wineopts.h]
	  [misc/main.c][misc/spy.c]
	  Removed support of spy file. Redirected spy messages to stddeb.
	  Removed -spy option. Added -debugmsg +spy option.

	* [debugger/dbg.y][debugger/debug.l]
	Enabled segmented addresses (seg:offs) for break and x commands.

	* [if1632/gdi.spec] [objects/region.c] [windows/graphics.c]
	  [include/region.h]
	FrameRgn, REGION_FrameRgn: New functions

	* [if1632/kernel.spec]
	IsWinOldApTask: Return false

	* [if1632/mouse.spec]
	CplApplet: Removed

	* [if1632/user.spec] [windows/win.c]
	ShowOwnedPopups: New function

	* [if1632/winsock.spec] [misc/winsocket.c]
	inet_addr, select: New prototypes in relay code
	Fixed memory layout for netdb functions (getXbyY).
	WINSOCK_ioctlsocket: Translated FIONREAD, FIONBIO, and FIOASYNC

	* [objects/clipping.c]
	RectVisible: Fixed call to LPToDP

	* [rc/winerc.c]
	main: Removed extra argument to getopt for Linux.

Tue Jul 11 00:14:41 1995   Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>

        * [controls/listbox.c]
	Yet another fix for ListBoxDirectory().
	
	* [loader/module.c] [if1632/kernel.spec]
	Make GetModuleHandle() accept instance handles as parameter.

        * [if1632/relay.c] [loader/task.c]
	Put a magic cookie at the bottom of the 32 bit stack, and check on
	each return from a 32 bit function whether it's still there. Complain
	if it's not.

        * [if1632/user.spec]
	Wrong entry for CloseDriver().

	* [misc/dos_fs.c] [loader/task.c] [include/dos_fs.h] [misc/file.c]
	[miscemu/int21.c]
	Large parts of dos_fs.c simplified. Changed it to use one
	current drive/directory per task, which is set to the module path on
	task creation.
	Prevent CorelPaint from closing stdin.
	open() with O_CREAT set must be passed three parameters.
	DOS FindFirst()/FindNext() could crash when FA_LABEL was set. Fixed,
	it's in DOS_readdir() now.

	* [misc/profile.c]
	Some badly written software (Lotus Freelance Graphics) passes a bogus
	size parameter that caused Wine to write off the end of a segment.
	Fixed. (It's probably too paranoid now.)
	
	* [multimedia/mmsystem.c] [multimedia/time.c] [multimedia/joystick.c]
	[multimedia/Imakefile] [if1632/winprocs.spec]
	16 bit entry point for MMSysTimeCallback.
	Split off time.c and joystick.c from mmsystem.c.
	
	* [objects/dib.c]
	GetDIBits(): call XGetImage() via CallTo32_LargeStack.

        * [windows/cursor.c]
	DestroyCursor(): do nothing for builtin cursors.
	
	* [windows/mdi.c]
	Half of WM_MDISETMENU implemented.
	
	* [windows/win.c]
	EnumWindows() and EnumTaskWindows() never enumerated any windows.
	Fixed.

	* [windows/*.c]
	Fixed GetParent() to return correct values for owned windows.

	* [windows/message.c]
	Don't try to activate disabled top-level windows.

        * [windows/nonclient.c]
	Work around a bug in gcc-2.7.0.
	
	* [tools/build.c] [include/stackframe.h] [memory/global.c] 
	[loader/task.c] [memory/selector.c]
	Some Visual Basic programs (and possibly others, too) expect ES to be 
	preserved by a call to an API function, so we have to save it.
	In GlobalFree() and FreeSelector(), we must clear CURRENT_STACK16->es 
	to prevent segfaults if ES contained the selector to be freed.

Sun Jul  9 20:21:20 1995  Jon Tombs  <jon@gtex02.us.es>

	* [*/*]
	Added missing prototypes to header files and relevant includes
	to reduce compile time warnings.

Sun Jul  9 18:32:56 1995  Michael Patra  <micky@marie.physik.tu-berlin.de>

	* [configure.in] [include/config.h] [*/Makefile.in]
	New configuration scheme based on autoconf.

Sat Jul  8 14:12:45 1995  Morten Welinder  <terra+@cs.cmu.edu>

	* [miscemu/ioports.c]
	Revamp to have only one in- and one out- variant, both really
 	implemented.

	* [miscemu/instr.c]
	INSTR_EmulateInstruction: Use new ioport interface.  Implement
 	string io.  Correct instruction pointer for 32-bit code.

	* [include/miscemu.h]
	Update port function prototypes.

	* [include/registers.h]
	Defined FS and GS.

Sat Jul  8 13:38:54 1995  Hans de Graaff  <graaff@twi72.twi.tudelft.nl>

	* [misc/dos_fs.c]
	ChopOffSlash(): A path consisting off a single slash is left
 	intact, and multiple slashes are all removed.
diff --git a/include/atom.h b/include/atom.h
index 045c343..631f185 100644
--- a/include/atom.h
+++ b/include/atom.h
@@ -31,4 +31,14 @@
 #define LocalAlign(flags,bytes) LocalAlloc((flags),(bytes))
 #endif
 
+ATOM LocalAddAtom( LPCSTR str );
+ATOM LocalDeleteAtom( ATOM atom );
+ATOM LocalFindAtom( LPCSTR str );
+WORD LocalGetAtomName( ATOM atom, LPSTR buffer, short count );
+
+ATOM LocalAddAtom( LPCSTR str );
+ATOM LocalDeleteAtom( ATOM atom );
+ATOM LocalFindAtom( LPCSTR str );
+WORD LocalGetAtomName( ATOM atom, LPSTR buffer, short count );
+
 #endif  /* ATOM_H */
diff --git a/include/bit_array.h b/include/bit_array.h
new file mode 100644
index 0000000..b07cdf6
--- /dev/null
+++ b/include/bit_array.h
@@ -0,0 +1,53 @@
+/***************************************************************************
+ * Copyright 1995, Technion, Israel Institute of Technology
+ * Electrical Eng, Software Lab.
+ * Author:    Michael Veksler.
+ ***************************************************************************
+ * File:      bit_array.h
+ * Purpose :  manipulate array of bits,
+ * Important: operations may be considered atomic.
+ *
+ ***************************************************************************
+ */
+#ifndef __WINE_BIT_ARRAY_H
+#define __WINE_BIT_ARRAY_H
+
+
+#define BITS_PER_BYTE (8)
+#define BITS_PER_INT (sizeof(int)*BITS_PER_BYTE) /* must be power of 2 */
+
+#define BYTE_LOG2 (3)
+#if defined(INT_LOG2)
+/* nothing to do, IN_LOG2 is ok */
+#elif defined(__i386__)
+#  define INT_LOG2 (5)
+#else
+#  error "Can't find log2 of BITS_PER_INT, please code it manualy"
+#endif
+
+
+typedef struct bit_array {
+	int bits;		   /* number of bits in the array */
+	unsigned int *array;	   /* Actual array data (Never NULL) */
+} bit_array ;
+
+bit_array *AssembleArray(bit_array *new_array, unsigned int *buff, int bits);
+int ResetArray(bit_array *bits);
+
+/* Return index of first free bit, or -1 on failure */
+int VacantBit(bit_array *bits);
+
+
+/* Return the value of bit 'i' */
+int SampleBit(bit_array *bits, int i);
+
+/* Assign 'val' to a bit no. 'i'.      Return: old bit's value */
+int AssignBit(bit_array *bits, int i, int val);
+
+/*
+** Allocate a free bit (==0) and make it used (==1).
+** Return: allocated bit index, or -1 on failure.
+*/
+int AllocateBit(bit_array *bits);
+
+#endif /* __WINE_BIT_ARRAY_H */
diff --git a/include/config.h.in b/include/config.h.in
new file mode 100644
index 0000000..10c6b69
--- /dev/null
+++ b/include/config.h.in
@@ -0,0 +1,6 @@
+#undef HAVE_STDLIB_H
+#undef HAVE_TCGETATTR
+#undef HAVE_DIRENT_H
+#undef HAVE_SYS_NDIR_H
+#undef HAVE_NDIR_H
+#undef STAT_MACROS_BROKEN
diff --git a/include/dde.h b/include/dde.h
new file mode 100644
index 0000000..72d250c
--- /dev/null
+++ b/include/dde.h
@@ -0,0 +1,61 @@
+/*****************************************************************************
+ * Copyright 1995, Technion, Israel Institute of Technology
+ * Electrical Eng, Software Lab.
+ * Author:    Michael Veksler.
+ ***************************************************************************
+ * File:      dde.h
+ * Purpose:   dde declarations
+ *
+ *****************************************************************************
+ */
+#ifndef __WINE_DDE_H
+#define __WINE_DDE_H
+
+#include "wintypes.h"
+#include "dde_proc.h"
+
+#define WM_DDE_INITIATE   0x3E0
+#define WM_DDE_TERMINATE  0x3E1
+#define WM_DDE_ADVISE	  0x3E2
+#define WM_DDE_UNADVISE   0x3E3
+#define WM_DDE_ACK	  0x3E4
+#define WM_DDE_DATA	  0x3E5
+#define WM_DDE_REQUEST	  0x3E6
+#define WM_DDE_POKE	  0x3E7
+#define WM_DDE_EXECUTE	  0x3E8
+#define WM_DDE_LAST	  WM_DDE_EXECUTE
+#define WM_DDE_FIRST	  WM_DDE_INITIATE
+
+/* DDEACK: wStatus in WM_DDE_ACK message */
+struct tagDDEACK
+{
+    WORD bAppReturnCode:8, reserved:6, fBusy:1, fAck:1;
+};
+typedef struct tagDDEACK DDEACK;
+
+/* DDEDATA: hData in WM_DDE_DATA message */
+struct tagDDEDATA
+{
+    WORD unused:12, fResponse:1, fRelease:1, reserved:1, fAckReq:1,
+         cfFormat:16;
+    BYTE Value[1];		/* undetermined array */
+};
+typedef struct tagDDEDATA DDEDATA;
+
+
+/* DDEADVISE: hOptions in WM_DDE_ADVISE message */
+struct tagDDEADVISE
+{
+    WORD reserved:14, fDeferUpd:1, fAckReq:1, cfFormat:16;
+};
+typedef struct tagDDEADVISE DDEADVISE;
+
+/* DDEPOKE: hData in WM_DDE_POKE message. */
+struct tagDDEPOKE
+{
+    WORD unused:13, fRelease:1, fReserved:2, cfFormat:16;
+    BYTE Value[1];   	/* undetermined array */
+};
+typedef struct tagDDEPOKE DDEPOKE;
+
+#endif /* __WINE_DDE_H */
diff --git a/include/dde_atom.h b/include/dde_atom.h
new file mode 100644
index 0000000..56df6b7
--- /dev/null
+++ b/include/dde_atom.h
@@ -0,0 +1,23 @@
+/***************************************************************************
+ * Copyright 1995, Technion, Israel Institute of Technology
+ * Electrical Eng, Software Lab.
+ * Author:    Michael Veksler.
+ ***************************************************************************
+ * File:      dde_atom.h
+ * Purpose :  atom functionality for DDE
+ ***************************************************************************
+ */
+#ifndef __WINE_DDE_ATOM_H
+#define __WINE_DDE_ATOM_H
+#include "windows.h"
+
+#define DDE_ATOMS 157		   /* a prime number for hashing */
+
+void ATOM_GlobalInit(void);
+/*
+ATOM GlobalAddAtom( LPCSTR str );
+ATOM GlobalDeleteAtom( ATOM atom );
+ATOM GlobalFindAtom( LPCSTR str );
+WORD GlobalGetAtomName( ATOM atom, LPSTR buffer, short count )
+*/
+#endif __WINE_DDE_ATOM_H
diff --git a/include/dde_mem.h b/include/dde_mem.h
new file mode 100644
index 0000000..6a830e1
--- /dev/null
+++ b/include/dde_mem.h
@@ -0,0 +1,34 @@
+/***************************************************************************
+ * Copyright 1995, Technion, Israel Institute of Technology
+ * Electrical Eng, Software Lab.
+ * Author:    Michael Veksler.
+ ***************************************************************************
+ * File:      dde_mem.h
+ * Purpose :  shared DDE memory functionality for DDE
+ ***************************************************************************
+ */
+#ifndef __WINE_DDE_MEM_H
+#define __WINE_DDE_MEM_H
+#include "wintypes.h"
+#include "global.h"
+#include "shm_block.h"
+
+#define DDE_HANDLES 0x0400
+#define is_dde_handle(block) ( (block) >= (1<<15)  &&  (block) < (1<<15)+DDE_HANDLES )
+typedef struct {
+    int shmid;
+    REL_PTR rel;
+}DDE_HWND;
+
+WORD DDE_SyncHandle(HGLOBAL handle, WORD sel);
+void *DDE_malloc(unsigned int flags,unsigned long size, SHMDATA *shmdata);
+HANDLE DDE_GlobalReAlloc(WORD,long,WORD);
+HANDLE DDE_GlobalFree(WORD block);
+void *DDE_AttachHandle(HGLOBAL handle, SEGPTR *segptr);
+WORD DDE_GlobalHandleToSel( HGLOBAL handle );
+int DDE_GlobalUnlock(int);
+HANDLE DDE_GlobalSize(WORD);
+HANDLE DDE_GlobalHandle(WORD);
+HANDLE DDE_GlobalFlags(WORD);
+
+#endif /* __WINE_DDE_MEM_H */
diff --git a/include/dde_proc.h b/include/dde_proc.h
new file mode 100644
index 0000000..85e682a
--- /dev/null
+++ b/include/dde_proc.h
@@ -0,0 +1,57 @@
+/***************************************************************************
+ * Copyright 1995, Technion, Israel Institute of Technology
+ * Electrical Eng, Software Lab.
+ * Author:    Michael Veksler.
+ ***************************************************************************
+ * File:      dde_proc.h
+ * Purpose :  DDE signals and processes functionality for DDE
+ ***************************************************************************
+ */
+#ifndef __WINE_DDE_PROC_H
+#define __WINE_DDE_PROC_H
+#include <setjmp.h>
+#include "wintypes.h"
+#include "windows.h"
+#define DDE_PROCS 64
+#define DDE_WINDOWS 64
+struct _dde_proc {
+    int msg;			/* message queue for this process */
+    int shmid;			/* first shared memory block id. */
+    int sem;			/* semaphore for fragment allocation */
+    int pid;
+} ;
+typedef struct _dde_proc *dde_proc;
+
+extern sigjmp_buf env_wait_x;
+enum stop_wait_op {		/* The action to be taken upon SIGUSR2 */
+    CONT,			/* Don't do anything */
+    STOP_WAIT_ACK,		/* Use siglongjmp to stop wait_ack() */
+    STOP_WAIT_X			/* siglongjmp to stop MSG_WaitXEvent() */
+};
+
+typedef struct {
+    WORD  proc_idx;		/* index into wine's process table  */
+    HWND  wnd;			/* Window on the local proccess */
+} WND_DATA;
+extern enum stop_wait_op stop_wait_op;
+extern int had_SIGUSR2;
+
+extern int curr_proc_idx;
+void stop_wait(int a);		   /* signal handler for SIGUSR2
+				      (interrupts "select" system call) */
+void dde_proc_init(dde_proc proc); /* init proc array */
+void dde_proc_done(dde_proc proc); /* delete a proc entry */
+void dde_proc_refresh(dde_proc proc); /* delete entry, if old junk */
+void dde_proc_add(dde_proc proc);  /* Add current proc to proc array */
+void dde_msg_setup(int *msg_ptr);
+int  dde_reschedule();
+void dde_wnd_setup();		   /* setup Data structure of DDE windows */
+
+/* Send ack. to hnd indicating that posted/sent msg. got to destination*/
+void dde_proc_send_ack(HWND wnd, BOOL val);
+BOOL DDE_PostMessage( MSG *msg);
+BOOL DDE_SendMessage( MSG *msg);
+int DDE_GetRemoteMessage();
+void DDE_DestroyWindow(HWND hwnd); /* delete DDE info regarding hwnd */
+void DDE_TestDDE(HWND hwnd);	   /* do we have dde handling in the window ?*/
+#endif /* __WINE_DDE_PROC_H */
diff --git a/include/debug.h b/include/debug.h
index d728531..8d74615 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -17,6 +17,7 @@
 
 #ifdef DEBUG_NONE_EXT
 #undef DEBUG_ACCEL
+#undef DEBUG_ATOM
 #undef DEBUG_BITBLT
 #undef DEBUG_BITMAP
 #undef DEBUG_CARET
@@ -29,6 +30,7 @@
 #undef DEBUG_COMM
 #undef DEBUG_CURSOR
 #undef DEBUG_DC
+#undef DEBUG_DDE
 #undef DEBUG_DIALOG
 #undef DEBUG_DLL
 #undef DEBUG_DOSFS
@@ -77,6 +79,9 @@
 #undef DEBUG_SCROLL
 #undef DEBUG_SELECTOR
 #undef DEBUG_SELECTORS
+#undef DEBUG_SEM
+#undef DEBUG_SHM
+#undef DEBUG_SPY
 #undef DEBUG_STRESS
 #undef DEBUG_SYSCOLOR
 #undef DEBUG_TASK
@@ -90,6 +95,7 @@
 
 #ifdef DEBUG_ALL_EXT
 #define DEBUG_ACCEL
+#define DEBUG_ATOM
 #define DEBUG_BITBLT
 #define DEBUG_BITMAP
 #define DEBUG_CARET
@@ -102,6 +108,7 @@
 #define DEBUG_COMM
 #define DEBUG_CURSOR
 #define DEBUG_DC
+#define DEBUG_DDE
 #define DEBUG_DIALOG
 #define DEBUG_DLL
 #define DEBUG_DOSFS
@@ -150,6 +157,9 @@
 #define DEBUG_SCROLL
 #define DEBUG_SELECTOR
 #define DEBUG_SELECTORS
+#define DEBUG_SEM
+#define DEBUG_SHM
+#define DEBUG_SPY
 #define DEBUG_STRESS
 #define DEBUG_SYSCOLOR
 #define DEBUG_TASK
@@ -169,6 +179,11 @@
 #else
     0,
 #endif
+#ifdef DEBUG_ATOM
+    1,
+#else
+    0,
+#endif
 #ifdef DEBUG_BITBLT
     1,
 #else
@@ -229,6 +244,11 @@
 #else
     0,
 #endif
+#ifdef DEBUG_DDE
+    1,
+#else
+    0,
+#endif
 #ifdef DEBUG_DIALOG
     1,
 #else
@@ -469,6 +489,21 @@
 #else
     0,
 #endif
+#ifdef DEBUG_SEM
+    1,
+#else
+    0,
+#endif
+#ifdef DEBUG_SHM
+    1,
+#else
+    0,
+#endif
+#ifdef DEBUG_SPY
+    1,
+#else
+    0,
+#endif
 #ifdef DEBUG_STRESS
     1,
 #else
@@ -535,8 +570,21 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_bitblt if(!debug_msg_enabled[1]) ; else fprintf
-#define debugging_bitblt debug_msg_enabled[1]
+#define dprintf_atom if(!debug_msg_enabled[1]) ; else fprintf
+#define debugging_atom debug_msg_enabled[1]
+#else
+#ifdef DEBUG_ATOM
+#define dprintf_atom fprintf
+#define debugging_atom 1
+#else
+#define dprintf_atom while(0) fprintf
+#define debugging_atom 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_bitblt if(!debug_msg_enabled[2]) ; else fprintf
+#define debugging_bitblt debug_msg_enabled[2]
 #else
 #ifdef DEBUG_BITBLT
 #define dprintf_bitblt fprintf
@@ -548,8 +596,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_bitmap if(!debug_msg_enabled[2]) ; else fprintf
-#define debugging_bitmap debug_msg_enabled[2]
+#define dprintf_bitmap if(!debug_msg_enabled[3]) ; else fprintf
+#define debugging_bitmap debug_msg_enabled[3]
 #else
 #ifdef DEBUG_BITMAP
 #define dprintf_bitmap fprintf
@@ -561,8 +609,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_caret if(!debug_msg_enabled[3]) ; else fprintf
-#define debugging_caret debug_msg_enabled[3]
+#define dprintf_caret if(!debug_msg_enabled[4]) ; else fprintf
+#define debugging_caret debug_msg_enabled[4]
 #else
 #ifdef DEBUG_CARET
 #define dprintf_caret fprintf
@@ -574,8 +622,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_catch if(!debug_msg_enabled[4]) ; else fprintf
-#define debugging_catch debug_msg_enabled[4]
+#define dprintf_catch if(!debug_msg_enabled[5]) ; else fprintf
+#define debugging_catch debug_msg_enabled[5]
 #else
 #ifdef DEBUG_CATCH
 #define dprintf_catch fprintf
@@ -587,8 +635,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_cdaudio if(!debug_msg_enabled[5]) ; else fprintf
-#define debugging_cdaudio debug_msg_enabled[5]
+#define dprintf_cdaudio if(!debug_msg_enabled[6]) ; else fprintf
+#define debugging_cdaudio debug_msg_enabled[6]
 #else
 #ifdef DEBUG_CDAUDIO
 #define dprintf_cdaudio fprintf
@@ -600,8 +648,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_class if(!debug_msg_enabled[6]) ; else fprintf
-#define debugging_class debug_msg_enabled[6]
+#define dprintf_class if(!debug_msg_enabled[7]) ; else fprintf
+#define debugging_class debug_msg_enabled[7]
 #else
 #ifdef DEBUG_CLASS
 #define dprintf_class fprintf
@@ -613,8 +661,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_clipboard if(!debug_msg_enabled[7]) ; else fprintf
-#define debugging_clipboard debug_msg_enabled[7]
+#define dprintf_clipboard if(!debug_msg_enabled[8]) ; else fprintf
+#define debugging_clipboard debug_msg_enabled[8]
 #else
 #ifdef DEBUG_CLIPBOARD
 #define dprintf_clipboard fprintf
@@ -626,8 +674,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_clipping if(!debug_msg_enabled[8]) ; else fprintf
-#define debugging_clipping debug_msg_enabled[8]
+#define dprintf_clipping if(!debug_msg_enabled[9]) ; else fprintf
+#define debugging_clipping debug_msg_enabled[9]
 #else
 #ifdef DEBUG_CLIPPING
 #define dprintf_clipping fprintf
@@ -639,8 +687,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_combo if(!debug_msg_enabled[9]) ; else fprintf
-#define debugging_combo debug_msg_enabled[9]
+#define dprintf_combo if(!debug_msg_enabled[10]) ; else fprintf
+#define debugging_combo debug_msg_enabled[10]
 #else
 #ifdef DEBUG_COMBO
 #define dprintf_combo fprintf
@@ -652,8 +700,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_comm if(!debug_msg_enabled[10]) ; else fprintf
-#define debugging_comm debug_msg_enabled[10]
+#define dprintf_comm if(!debug_msg_enabled[11]) ; else fprintf
+#define debugging_comm debug_msg_enabled[11]
 #else
 #ifdef DEBUG_COMM
 #define dprintf_comm fprintf
@@ -665,8 +713,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_cursor if(!debug_msg_enabled[11]) ; else fprintf
-#define debugging_cursor debug_msg_enabled[11]
+#define dprintf_cursor if(!debug_msg_enabled[12]) ; else fprintf
+#define debugging_cursor debug_msg_enabled[12]
 #else
 #ifdef DEBUG_CURSOR
 #define dprintf_cursor fprintf
@@ -678,8 +726,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_dc if(!debug_msg_enabled[12]) ; else fprintf
-#define debugging_dc debug_msg_enabled[12]
+#define dprintf_dc if(!debug_msg_enabled[13]) ; else fprintf
+#define debugging_dc debug_msg_enabled[13]
 #else
 #ifdef DEBUG_DC
 #define dprintf_dc fprintf
@@ -691,8 +739,21 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_dialog if(!debug_msg_enabled[13]) ; else fprintf
-#define debugging_dialog debug_msg_enabled[13]
+#define dprintf_dde if(!debug_msg_enabled[14]) ; else fprintf
+#define debugging_dde debug_msg_enabled[14]
+#else
+#ifdef DEBUG_DDE
+#define dprintf_dde fprintf
+#define debugging_dde 1
+#else
+#define dprintf_dde while(0) fprintf
+#define debugging_dde 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_dialog if(!debug_msg_enabled[15]) ; else fprintf
+#define debugging_dialog debug_msg_enabled[15]
 #else
 #ifdef DEBUG_DIALOG
 #define dprintf_dialog fprintf
@@ -704,8 +765,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_dll if(!debug_msg_enabled[14]) ; else fprintf
-#define debugging_dll debug_msg_enabled[14]
+#define dprintf_dll if(!debug_msg_enabled[16]) ; else fprintf
+#define debugging_dll debug_msg_enabled[16]
 #else
 #ifdef DEBUG_DLL
 #define dprintf_dll fprintf
@@ -717,8 +778,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_dosfs if(!debug_msg_enabled[15]) ; else fprintf
-#define debugging_dosfs debug_msg_enabled[15]
+#define dprintf_dosfs if(!debug_msg_enabled[17]) ; else fprintf
+#define debugging_dosfs debug_msg_enabled[17]
 #else
 #ifdef DEBUG_DOSFS
 #define dprintf_dosfs fprintf
@@ -730,8 +791,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_driver if(!debug_msg_enabled[16]) ; else fprintf
-#define debugging_driver debug_msg_enabled[16]
+#define dprintf_driver if(!debug_msg_enabled[18]) ; else fprintf
+#define debugging_driver debug_msg_enabled[18]
 #else
 #ifdef DEBUG_DRIVER
 #define dprintf_driver fprintf
@@ -743,8 +804,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_edit if(!debug_msg_enabled[17]) ; else fprintf
-#define debugging_edit debug_msg_enabled[17]
+#define dprintf_edit if(!debug_msg_enabled[19]) ; else fprintf
+#define debugging_edit debug_msg_enabled[19]
 #else
 #ifdef DEBUG_EDIT
 #define dprintf_edit fprintf
@@ -756,8 +817,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_enum if(!debug_msg_enabled[18]) ; else fprintf
-#define debugging_enum debug_msg_enabled[18]
+#define dprintf_enum if(!debug_msg_enabled[20]) ; else fprintf
+#define debugging_enum debug_msg_enabled[20]
 #else
 #ifdef DEBUG_ENUM
 #define dprintf_enum fprintf
@@ -769,8 +830,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_event if(!debug_msg_enabled[19]) ; else fprintf
-#define debugging_event debug_msg_enabled[19]
+#define dprintf_event if(!debug_msg_enabled[21]) ; else fprintf
+#define debugging_event debug_msg_enabled[21]
 #else
 #ifdef DEBUG_EVENT
 #define dprintf_event fprintf
@@ -782,8 +843,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_exec if(!debug_msg_enabled[20]) ; else fprintf
-#define debugging_exec debug_msg_enabled[20]
+#define dprintf_exec if(!debug_msg_enabled[22]) ; else fprintf
+#define debugging_exec debug_msg_enabled[22]
 #else
 #ifdef DEBUG_EXEC
 #define dprintf_exec fprintf
@@ -795,8 +856,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_file if(!debug_msg_enabled[21]) ; else fprintf
-#define debugging_file debug_msg_enabled[21]
+#define dprintf_file if(!debug_msg_enabled[23]) ; else fprintf
+#define debugging_file debug_msg_enabled[23]
 #else
 #ifdef DEBUG_FILE
 #define dprintf_file fprintf
@@ -808,8 +869,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_fixup if(!debug_msg_enabled[22]) ; else fprintf
-#define debugging_fixup debug_msg_enabled[22]
+#define dprintf_fixup if(!debug_msg_enabled[24]) ; else fprintf
+#define debugging_fixup debug_msg_enabled[24]
 #else
 #ifdef DEBUG_FIXUP
 #define dprintf_fixup fprintf
@@ -821,8 +882,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_font if(!debug_msg_enabled[23]) ; else fprintf
-#define debugging_font debug_msg_enabled[23]
+#define dprintf_font if(!debug_msg_enabled[25]) ; else fprintf
+#define debugging_font debug_msg_enabled[25]
 #else
 #ifdef DEBUG_FONT
 #define dprintf_font fprintf
@@ -834,8 +895,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_gdi if(!debug_msg_enabled[24]) ; else fprintf
-#define debugging_gdi debug_msg_enabled[24]
+#define dprintf_gdi if(!debug_msg_enabled[26]) ; else fprintf
+#define debugging_gdi debug_msg_enabled[26]
 #else
 #ifdef DEBUG_GDI
 #define dprintf_gdi fprintf
@@ -847,8 +908,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_global if(!debug_msg_enabled[25]) ; else fprintf
-#define debugging_global debug_msg_enabled[25]
+#define dprintf_global if(!debug_msg_enabled[27]) ; else fprintf
+#define debugging_global debug_msg_enabled[27]
 #else
 #ifdef DEBUG_GLOBAL
 #define dprintf_global fprintf
@@ -860,8 +921,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_graphics if(!debug_msg_enabled[26]) ; else fprintf
-#define debugging_graphics debug_msg_enabled[26]
+#define dprintf_graphics if(!debug_msg_enabled[28]) ; else fprintf
+#define debugging_graphics debug_msg_enabled[28]
 #else
 #ifdef DEBUG_GRAPHICS
 #define dprintf_graphics fprintf
@@ -873,8 +934,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_icon if(!debug_msg_enabled[27]) ; else fprintf
-#define debugging_icon debug_msg_enabled[27]
+#define dprintf_icon if(!debug_msg_enabled[29]) ; else fprintf
+#define debugging_icon debug_msg_enabled[29]
 #else
 #ifdef DEBUG_ICON
 #define dprintf_icon fprintf
@@ -886,8 +947,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_int if(!debug_msg_enabled[28]) ; else fprintf
-#define debugging_int debug_msg_enabled[28]
+#define dprintf_int if(!debug_msg_enabled[30]) ; else fprintf
+#define debugging_int debug_msg_enabled[30]
 #else
 #ifdef DEBUG_INT
 #define dprintf_int fprintf
@@ -899,8 +960,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_key if(!debug_msg_enabled[29]) ; else fprintf
-#define debugging_key debug_msg_enabled[29]
+#define dprintf_key if(!debug_msg_enabled[31]) ; else fprintf
+#define debugging_key debug_msg_enabled[31]
 #else
 #ifdef DEBUG_KEY
 #define dprintf_key fprintf
@@ -912,8 +973,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_keyboard if(!debug_msg_enabled[30]) ; else fprintf
-#define debugging_keyboard debug_msg_enabled[30]
+#define dprintf_keyboard if(!debug_msg_enabled[32]) ; else fprintf
+#define debugging_keyboard debug_msg_enabled[32]
 #else
 #ifdef DEBUG_KEYBOARD
 #define dprintf_keyboard fprintf
@@ -925,8 +986,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_ldt if(!debug_msg_enabled[31]) ; else fprintf
-#define debugging_ldt debug_msg_enabled[31]
+#define dprintf_ldt if(!debug_msg_enabled[33]) ; else fprintf
+#define debugging_ldt debug_msg_enabled[33]
 #else
 #ifdef DEBUG_LDT
 #define dprintf_ldt fprintf
@@ -938,8 +999,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_listbox if(!debug_msg_enabled[32]) ; else fprintf
-#define debugging_listbox debug_msg_enabled[32]
+#define dprintf_listbox if(!debug_msg_enabled[34]) ; else fprintf
+#define debugging_listbox debug_msg_enabled[34]
 #else
 #ifdef DEBUG_LISTBOX
 #define dprintf_listbox fprintf
@@ -951,8 +1012,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_local if(!debug_msg_enabled[33]) ; else fprintf
-#define debugging_local debug_msg_enabled[33]
+#define dprintf_local if(!debug_msg_enabled[35]) ; else fprintf
+#define debugging_local debug_msg_enabled[35]
 #else
 #ifdef DEBUG_LOCAL
 #define dprintf_local fprintf
@@ -964,8 +1025,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_malloc if(!debug_msg_enabled[34]) ; else fprintf
-#define debugging_malloc debug_msg_enabled[34]
+#define dprintf_malloc if(!debug_msg_enabled[36]) ; else fprintf
+#define debugging_malloc debug_msg_enabled[36]
 #else
 #ifdef DEBUG_MALLOC
 #define dprintf_malloc fprintf
@@ -977,8 +1038,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_mci if(!debug_msg_enabled[35]) ; else fprintf
-#define debugging_mci debug_msg_enabled[35]
+#define dprintf_mci if(!debug_msg_enabled[37]) ; else fprintf
+#define debugging_mci debug_msg_enabled[37]
 #else
 #ifdef DEBUG_MCI
 #define dprintf_mci fprintf
@@ -990,8 +1051,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_mcianim if(!debug_msg_enabled[36]) ; else fprintf
-#define debugging_mcianim debug_msg_enabled[36]
+#define dprintf_mcianim if(!debug_msg_enabled[38]) ; else fprintf
+#define debugging_mcianim debug_msg_enabled[38]
 #else
 #ifdef DEBUG_MCIANIM
 #define dprintf_mcianim fprintf
@@ -1003,8 +1064,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_mciwave if(!debug_msg_enabled[37]) ; else fprintf
-#define debugging_mciwave debug_msg_enabled[37]
+#define dprintf_mciwave if(!debug_msg_enabled[39]) ; else fprintf
+#define debugging_mciwave debug_msg_enabled[39]
 #else
 #ifdef DEBUG_MCIWAVE
 #define dprintf_mciwave fprintf
@@ -1016,8 +1077,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_mdi if(!debug_msg_enabled[38]) ; else fprintf
-#define debugging_mdi debug_msg_enabled[38]
+#define dprintf_mdi if(!debug_msg_enabled[40]) ; else fprintf
+#define debugging_mdi debug_msg_enabled[40]
 #else
 #ifdef DEBUG_MDI
 #define dprintf_mdi fprintf
@@ -1029,8 +1090,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_menu if(!debug_msg_enabled[39]) ; else fprintf
-#define debugging_menu debug_msg_enabled[39]
+#define dprintf_menu if(!debug_msg_enabled[41]) ; else fprintf
+#define debugging_menu debug_msg_enabled[41]
 #else
 #ifdef DEBUG_MENU
 #define dprintf_menu fprintf
@@ -1042,8 +1103,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_menucalc if(!debug_msg_enabled[40]) ; else fprintf
-#define debugging_menucalc debug_msg_enabled[40]
+#define dprintf_menucalc if(!debug_msg_enabled[42]) ; else fprintf
+#define debugging_menucalc debug_msg_enabled[42]
 #else
 #ifdef DEBUG_MENUCALC
 #define dprintf_menucalc fprintf
@@ -1055,8 +1116,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_message if(!debug_msg_enabled[41]) ; else fprintf
-#define debugging_message debug_msg_enabled[41]
+#define dprintf_message if(!debug_msg_enabled[43]) ; else fprintf
+#define debugging_message debug_msg_enabled[43]
 #else
 #ifdef DEBUG_MESSAGE
 #define dprintf_message fprintf
@@ -1068,8 +1129,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_metafile if(!debug_msg_enabled[42]) ; else fprintf
-#define debugging_metafile debug_msg_enabled[42]
+#define dprintf_metafile if(!debug_msg_enabled[44]) ; else fprintf
+#define debugging_metafile debug_msg_enabled[44]
 #else
 #ifdef DEBUG_METAFILE
 #define dprintf_metafile fprintf
@@ -1081,8 +1142,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_midi if(!debug_msg_enabled[43]) ; else fprintf
-#define debugging_midi debug_msg_enabled[43]
+#define dprintf_midi if(!debug_msg_enabled[45]) ; else fprintf
+#define debugging_midi debug_msg_enabled[45]
 #else
 #ifdef DEBUG_MIDI
 #define dprintf_midi fprintf
@@ -1094,8 +1155,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_mmio if(!debug_msg_enabled[44]) ; else fprintf
-#define debugging_mmio debug_msg_enabled[44]
+#define dprintf_mmio if(!debug_msg_enabled[46]) ; else fprintf
+#define debugging_mmio debug_msg_enabled[46]
 #else
 #ifdef DEBUG_MMIO
 #define dprintf_mmio fprintf
@@ -1107,8 +1168,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_mmsys if(!debug_msg_enabled[45]) ; else fprintf
-#define debugging_mmsys debug_msg_enabled[45]
+#define dprintf_mmsys if(!debug_msg_enabled[47]) ; else fprintf
+#define debugging_mmsys debug_msg_enabled[47]
 #else
 #ifdef DEBUG_MMSYS
 #define dprintf_mmsys fprintf
@@ -1120,8 +1181,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_mmtime if(!debug_msg_enabled[46]) ; else fprintf
-#define debugging_mmtime debug_msg_enabled[46]
+#define dprintf_mmtime if(!debug_msg_enabled[48]) ; else fprintf
+#define debugging_mmtime debug_msg_enabled[48]
 #else
 #ifdef DEBUG_MMTIME
 #define dprintf_mmtime fprintf
@@ -1133,8 +1194,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_module if(!debug_msg_enabled[47]) ; else fprintf
-#define debugging_module debug_msg_enabled[47]
+#define dprintf_module if(!debug_msg_enabled[49]) ; else fprintf
+#define debugging_module debug_msg_enabled[49]
 #else
 #ifdef DEBUG_MODULE
 #define dprintf_module fprintf
@@ -1146,8 +1207,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_msg if(!debug_msg_enabled[48]) ; else fprintf
-#define debugging_msg debug_msg_enabled[48]
+#define dprintf_msg if(!debug_msg_enabled[50]) ; else fprintf
+#define debugging_msg debug_msg_enabled[50]
 #else
 #ifdef DEBUG_MSG
 #define dprintf_msg fprintf
@@ -1159,8 +1220,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_nonclient if(!debug_msg_enabled[49]) ; else fprintf
-#define debugging_nonclient debug_msg_enabled[49]
+#define dprintf_nonclient if(!debug_msg_enabled[51]) ; else fprintf
+#define debugging_nonclient debug_msg_enabled[51]
 #else
 #ifdef DEBUG_NONCLIENT
 #define dprintf_nonclient fprintf
@@ -1172,8 +1233,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_ole if(!debug_msg_enabled[50]) ; else fprintf
-#define debugging_ole debug_msg_enabled[50]
+#define dprintf_ole if(!debug_msg_enabled[52]) ; else fprintf
+#define debugging_ole debug_msg_enabled[52]
 #else
 #ifdef DEBUG_OLE
 #define dprintf_ole fprintf
@@ -1185,8 +1246,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_palette if(!debug_msg_enabled[51]) ; else fprintf
-#define debugging_palette debug_msg_enabled[51]
+#define dprintf_palette if(!debug_msg_enabled[53]) ; else fprintf
+#define debugging_palette debug_msg_enabled[53]
 #else
 #ifdef DEBUG_PALETTE
 #define dprintf_palette fprintf
@@ -1198,8 +1259,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_profile if(!debug_msg_enabled[52]) ; else fprintf
-#define debugging_profile debug_msg_enabled[52]
+#define dprintf_profile if(!debug_msg_enabled[54]) ; else fprintf
+#define debugging_profile debug_msg_enabled[54]
 #else
 #ifdef DEBUG_PROFILE
 #define dprintf_profile fprintf
@@ -1211,8 +1272,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_prop if(!debug_msg_enabled[53]) ; else fprintf
-#define debugging_prop debug_msg_enabled[53]
+#define dprintf_prop if(!debug_msg_enabled[55]) ; else fprintf
+#define debugging_prop debug_msg_enabled[55]
 #else
 #ifdef DEBUG_PROP
 #define dprintf_prop fprintf
@@ -1224,8 +1285,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_reg if(!debug_msg_enabled[54]) ; else fprintf
-#define debugging_reg debug_msg_enabled[54]
+#define dprintf_reg if(!debug_msg_enabled[56]) ; else fprintf
+#define debugging_reg debug_msg_enabled[56]
 #else
 #ifdef DEBUG_REG
 #define dprintf_reg fprintf
@@ -1237,8 +1298,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_region if(!debug_msg_enabled[55]) ; else fprintf
-#define debugging_region debug_msg_enabled[55]
+#define dprintf_region if(!debug_msg_enabled[57]) ; else fprintf
+#define debugging_region debug_msg_enabled[57]
 #else
 #ifdef DEBUG_REGION
 #define dprintf_region fprintf
@@ -1250,8 +1311,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_relay if(!debug_msg_enabled[56]) ; else fprintf
-#define debugging_relay debug_msg_enabled[56]
+#define dprintf_relay if(!debug_msg_enabled[58]) ; else fprintf
+#define debugging_relay debug_msg_enabled[58]
 #else
 #ifdef DEBUG_RELAY
 #define dprintf_relay fprintf
@@ -1263,8 +1324,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_resource if(!debug_msg_enabled[57]) ; else fprintf
-#define debugging_resource debug_msg_enabled[57]
+#define dprintf_resource if(!debug_msg_enabled[59]) ; else fprintf
+#define debugging_resource debug_msg_enabled[59]
 #else
 #ifdef DEBUG_RESOURCE
 #define dprintf_resource fprintf
@@ -1276,8 +1337,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_scroll if(!debug_msg_enabled[58]) ; else fprintf
-#define debugging_scroll debug_msg_enabled[58]
+#define dprintf_scroll if(!debug_msg_enabled[60]) ; else fprintf
+#define debugging_scroll debug_msg_enabled[60]
 #else
 #ifdef DEBUG_SCROLL
 #define dprintf_scroll fprintf
@@ -1289,8 +1350,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_selector if(!debug_msg_enabled[59]) ; else fprintf
-#define debugging_selector debug_msg_enabled[59]
+#define dprintf_selector if(!debug_msg_enabled[61]) ; else fprintf
+#define debugging_selector debug_msg_enabled[61]
 #else
 #ifdef DEBUG_SELECTOR
 #define dprintf_selector fprintf
@@ -1302,8 +1363,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_selectors if(!debug_msg_enabled[60]) ; else fprintf
-#define debugging_selectors debug_msg_enabled[60]
+#define dprintf_selectors if(!debug_msg_enabled[62]) ; else fprintf
+#define debugging_selectors debug_msg_enabled[62]
 #else
 #ifdef DEBUG_SELECTORS
 #define dprintf_selectors fprintf
@@ -1315,8 +1376,47 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_stress if(!debug_msg_enabled[61]) ; else fprintf
-#define debugging_stress debug_msg_enabled[61]
+#define dprintf_sem if(!debug_msg_enabled[63]) ; else fprintf
+#define debugging_sem debug_msg_enabled[63]
+#else
+#ifdef DEBUG_SEM
+#define dprintf_sem fprintf
+#define debugging_sem 1
+#else
+#define dprintf_sem while(0) fprintf
+#define debugging_sem 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_shm if(!debug_msg_enabled[64]) ; else fprintf
+#define debugging_shm debug_msg_enabled[64]
+#else
+#ifdef DEBUG_SHM
+#define dprintf_shm fprintf
+#define debugging_shm 1
+#else
+#define dprintf_shm while(0) fprintf
+#define debugging_shm 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_spy if(!debug_msg_enabled[65]) ; else fprintf
+#define debugging_spy debug_msg_enabled[65]
+#else
+#ifdef DEBUG_SPY
+#define dprintf_spy fprintf
+#define debugging_spy 1
+#else
+#define dprintf_spy while(0) fprintf
+#define debugging_spy 0
+#endif
+#endif
+
+#ifdef DEBUG_RUNTIME
+#define dprintf_stress if(!debug_msg_enabled[66]) ; else fprintf
+#define debugging_stress debug_msg_enabled[66]
 #else
 #ifdef DEBUG_STRESS
 #define dprintf_stress fprintf
@@ -1328,8 +1428,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_syscolor if(!debug_msg_enabled[62]) ; else fprintf
-#define debugging_syscolor debug_msg_enabled[62]
+#define dprintf_syscolor if(!debug_msg_enabled[67]) ; else fprintf
+#define debugging_syscolor debug_msg_enabled[67]
 #else
 #ifdef DEBUG_SYSCOLOR
 #define dprintf_syscolor fprintf
@@ -1341,8 +1441,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_task if(!debug_msg_enabled[63]) ; else fprintf
-#define debugging_task debug_msg_enabled[63]
+#define dprintf_task if(!debug_msg_enabled[68]) ; else fprintf
+#define debugging_task debug_msg_enabled[68]
 #else
 #ifdef DEBUG_TASK
 #define dprintf_task fprintf
@@ -1354,8 +1454,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_text if(!debug_msg_enabled[64]) ; else fprintf
-#define debugging_text debug_msg_enabled[64]
+#define dprintf_text if(!debug_msg_enabled[69]) ; else fprintf
+#define debugging_text debug_msg_enabled[69]
 #else
 #ifdef DEBUG_TEXT
 #define dprintf_text fprintf
@@ -1367,8 +1467,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_timer if(!debug_msg_enabled[65]) ; else fprintf
-#define debugging_timer debug_msg_enabled[65]
+#define dprintf_timer if(!debug_msg_enabled[70]) ; else fprintf
+#define debugging_timer debug_msg_enabled[70]
 #else
 #ifdef DEBUG_TIMER
 #define dprintf_timer fprintf
@@ -1380,8 +1480,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_toolhelp if(!debug_msg_enabled[66]) ; else fprintf
-#define debugging_toolhelp debug_msg_enabled[66]
+#define dprintf_toolhelp if(!debug_msg_enabled[71]) ; else fprintf
+#define debugging_toolhelp debug_msg_enabled[71]
 #else
 #ifdef DEBUG_TOOLHELP
 #define dprintf_toolhelp fprintf
@@ -1393,8 +1493,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_utility if(!debug_msg_enabled[67]) ; else fprintf
-#define debugging_utility debug_msg_enabled[67]
+#define dprintf_utility if(!debug_msg_enabled[72]) ; else fprintf
+#define debugging_utility debug_msg_enabled[72]
 #else
 #ifdef DEBUG_UTILITY
 #define dprintf_utility fprintf
@@ -1406,8 +1506,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_win if(!debug_msg_enabled[68]) ; else fprintf
-#define debugging_win debug_msg_enabled[68]
+#define dprintf_win if(!debug_msg_enabled[73]) ; else fprintf
+#define debugging_win debug_msg_enabled[73]
 #else
 #ifdef DEBUG_WIN
 #define dprintf_win fprintf
@@ -1419,8 +1519,8 @@
 #endif
 
 #ifdef DEBUG_RUNTIME
-#define dprintf_winsock if(!debug_msg_enabled[69]) ; else fprintf
-#define debugging_winsock debug_msg_enabled[69]
+#define dprintf_winsock if(!debug_msg_enabled[74]) ; else fprintf
+#define debugging_winsock debug_msg_enabled[74]
 #else
 #ifdef DEBUG_WINSOCK
 #define dprintf_winsock fprintf
@@ -1436,6 +1536,7 @@
 #ifdef DEBUG_DEFINE_VARIABLES
 static char *debug_msg_name[] = {
     "accel",
+    "atom",
     "bitblt",
     "bitmap",
     "caret",
@@ -1448,6 +1549,7 @@
     "comm",
     "cursor",
     "dc",
+    "dde",
     "dialog",
     "dll",
     "dosfs",
@@ -1496,6 +1598,9 @@
     "scroll",
     "selector",
     "selectors",
+    "sem",
+    "shm",
+    "spy",
     "stress",
     "syscolor",
     "task",
diff --git a/include/dos_fs.h b/include/dos_fs.h
index 01a458c..a6a91a3 100644
--- a/include/dos_fs.h
+++ b/include/dos_fs.h
@@ -10,10 +10,9 @@
 extern void DOS_SetDefaultDrive(int drive);
 extern void ToUnix(char *s); 
 extern void ToDos(char *s); 
-extern void ChopOffSlash(char *string);
 extern int DOS_DisableDrive(int drive);
 extern int DOS_EnableDrive(int drive); 
-extern char *DOS_GetUnixFileName(char *dosfilename);
+extern char *DOS_GetUnixFileName(const char *dosfilename);
 extern char *DOS_GetDosFileName(char *unixfilename);
 extern char *DOS_GetCurrentDir(int drive);
 extern int DOS_ChangeDir(int drive, char *dirname);
@@ -29,8 +28,6 @@
 extern struct dosdirent *DOS_opendir(char *dosdirname); 
 extern struct dosdirent *DOS_readdir(struct dosdirent *de);
 extern void DOS_closedir(struct dosdirent *de);
-extern void DOS_ExpandToFullPath(char *filename, int drive);
-extern void DOS_ExpandToFullUnixPath(char *filename);
 extern char *DOS_GetRedirectedDir(int drive);
 extern void errno_to_doserr(void);
 
diff --git a/include/global.h b/include/global.h
index dd912ce..6ea7b40 100644
--- a/include/global.h
+++ b/include/global.h
@@ -9,9 +9,17 @@
 
 #include "wintypes.h"
 
+typedef struct
+{
+    HGLOBAL handle;
+    WORD sel;
+    int shmid;
+} SHMDATA;
+
 extern HGLOBAL GLOBAL_CreateBlock( WORD flags, void *ptr, DWORD size,
                                    HGLOBAL hOwner, BOOL isCode,
-                                   BOOL is32Bit, BOOL isReadOnly );
+                                   BOOL is32Bit, BOOL isReadOnly,
+				   SHMDATA *shmdata);
 extern BOOL GLOBAL_FreeBlock( HGLOBAL handle );
 extern HGLOBAL GLOBAL_Alloc( WORD flags, DWORD size, HGLOBAL hOwner,
                              BOOL isCode, BOOL is32Bit, BOOL isReadOnly );
diff --git a/include/ldt.h b/include/ldt.h
index 6e7c853..76f9ca0 100644
--- a/include/ldt.h
+++ b/include/ldt.h
@@ -44,13 +44,13 @@
 
 extern ldt_copy_entry ldt_copy[LDT_SIZE];
 
-#define __AHSHIFT  3
+#define __AHSHIFT  3  /* don't change! */
 #define __AHINCR   (1 << __AHSHIFT)
 
 #ifndef WINELIB
 #define SELECTOR_TO_ENTRY(sel)  (((int)(sel) & 0xffff) >> __AHSHIFT)
 #define ENTRY_TO_SELECTOR(i)    ((i) ? (((int)(i) << __AHSHIFT) | 7) : 0)
-#define IS_LDT_ENTRY_FREE(i)    (!(ldt_copy[(i)].base || ldt_copy[(i)].limit))
+#define IS_LDT_ENTRY_FREE(i)    (!(ldt_flags_copy[(i)] & LDT_FLAGS_ALLOCATED))
 #define IS_SELECTOR_FREE(sel)   (IS_LDT_ENTRY_FREE(SELECTOR_TO_ENTRY(sel)))
 #define GET_SEL_BASE(sel)       (ldt_copy[SELECTOR_TO_ENTRY(sel)].base)
 #define GET_SEL_LIMIT(sel)      (ldt_copy[SELECTOR_TO_ENTRY(sel)].limit)
@@ -59,6 +59,7 @@
 #define SELECTOR_TO_ENTRY(sel)  error.error
 #define ENTRY_TO_SELECTOR(i)    error.error
 #define IS_LDT_ENTRY_FREE(i)    error.error
+#define IS_SELECTOR_FREE(sel)   error.error
 #define GET_SEL_BASE(sel)       error.error
 #define GET_SEL_LIMIT(sel)      error.error
 #endif
@@ -83,6 +84,7 @@
 #define LDT_FLAGS_EXECONLY  0x04  /* Segment is execute-only (code) */
 #define LDT_FLAGS_32BIT     0x08  /* Segment is 32-bit (code or stack) */
 #define LDT_FLAGS_BIG       0x10  /* Segment is big (limit is in pages) */
+#define LDT_FLAGS_ALLOCATED 0x80  /* Segment is allocated (no longer free) */
 
 #define GET_SEL_FLAGS(sel)   (ldt_flags_copy[SELECTOR_TO_ENTRY(sel)])
 
diff --git a/include/miscemu.h b/include/miscemu.h
index e979ff1..2507a80 100644
--- a/include/miscemu.h
+++ b/include/miscemu.h
@@ -4,31 +4,10 @@
 #include "wintypes.h"
 #include "wine.h"
 
-extern BOOL INSTR_HandleInstruction( struct sigcontext_struct *context );
+extern BOOL INSTR_EmulateInstruction( struct sigcontext_struct *context );
 
-extern int do_int10(struct sigcontext_struct *);
-extern int do_int13(struct sigcontext_struct *);
-extern int do_int15(struct sigcontext_struct *);
-extern int do_int16(struct sigcontext_struct *);
-extern int do_int1a(struct sigcontext_struct *);
-extern int do_int21(struct sigcontext_struct *);
-extern int do_int25(struct sigcontext_struct *);
-extern int do_int26(struct sigcontext_struct *);
-extern int do_int2a(struct sigcontext_struct *);
-extern int do_int2f(struct sigcontext_struct *);
-extern int do_int31(struct sigcontext_struct *);
-extern int do_int5c(struct sigcontext_struct *);
-
-extern void inportb( struct sigcontext_struct *context );
-extern void inport( struct sigcontext_struct *context, int long_op );
-extern void outportb( struct sigcontext_struct *context );
-extern void outport( struct sigcontext_struct *context, int long_op );
-extern void inportb_abs( struct sigcontext_struct *context);
-extern void inport_abs( struct sigcontext_struct *context, int long_op );
-extern void outportb_abs( struct sigcontext_struct *context );
-extern void outport_abs( struct sigcontext_struct *context, int long_op );
-
-extern void IntBarf(int i, struct sigcontext_struct *context);
+extern DWORD inport( int port, int count );
+extern void outport( int port, int count, DWORD value );
 
 extern BOOL INT_Init(void);
 extern SEGPTR INT_GetHandler( BYTE intnum );
@@ -36,4 +15,11 @@
 
 extern void INT21_Init(void);
 
+
+#define INT_BARF(num) \
+    fprintf( stderr, "int%x: unknown/not implemented parameters:\n" \
+                     "int%x: AX %04x, BX %04x, CX %04x, DX %04x, " \
+                     "SI %04x, DI %04x, DS %04x, ES %04x\n", \
+             (num), (num), AX, BX, CX, DX, SI, DI, DS, ES )
+
 #endif /* __WINE_MISCEMU_H */
diff --git a/include/msdos.h b/include/msdos.h
index 1a94bca..636ae22 100644
--- a/include/msdos.h
+++ b/include/msdos.h
@@ -40,21 +40,23 @@
 extern struct DosDeviceStruct COM[MAX_PORTS];
 extern struct DosDeviceStruct LPT[MAX_PORTS];
 
-#define setword(a,b)	*(BYTE*)(a)	  = (b) & 0xff; \
-			*((BYTE*)((a)+1)) = ((b)>>8) & 0xff;
+#define setword(a,b)	do { *(BYTE*)(a)	  = (b) & 0xff; \
+                             *((BYTE*)((a)+1)) = ((b)>>8) & 0xff;\
+                        } while(0)
 			
-#define setdword(a,b)	*(BYTE*)(a)	= (b) & 0xff; \
-			*((BYTE*)(a)+1) = ((b)>>8) & 0xff; \
-			*((BYTE*)(a)+2) = ((b)>>16) & 0xff; \
-			*((BYTE*)(a)+3) = ((b)>>24) & 0xff;
+#define setdword(a,b)	do { *(BYTE*)(a)	= (b) & 0xff; \
+			     *((BYTE*)(a)+1) = ((b)>>8) & 0xff; \
+			     *((BYTE*)(a)+2) = ((b)>>16) & 0xff; \
+			     *((BYTE*)(a)+3) = ((b)>>24) & 0xff; \
+                        } while(0)
 
-#define getword(a)	(WORD) *(BYTE*)(a) + \
-			(*((BYTE*)(a) + 1) << 8)
+#define getword(a)	( (WORD)*(BYTE*)(a) + \
+			  ((WORD)*((BYTE*)(a) + 1) << 8))
 
-#define getdword(a)	(DWORD) (*(BYTE*)(a) + \
-			(*((BYTE*)(a) + 1) << 8) + \
-			(*((BYTE*)(a) + 2) << 16) + \
-			(*((BYTE*)(a) + 3) << 24))
+#define getdword(a)	( (DWORD)*(BYTE*)(a) + \
+			  (DWORD)(*((BYTE*)(a) + 1) << 8) + \
+			  (DWORD)(*((BYTE*)(a) + 2) << 16) + \
+			  (DWORD)(*((BYTE*)(a) + 3) << 24))
 
 /* dos file attributes */
 
diff --git a/include/options.h b/include/options.h
index 80b8a73..a19ae57 100644
--- a/include/options.h
+++ b/include/options.h
@@ -9,7 +9,6 @@
 
 struct options
 {
-    char * spyFilename;
     char * desktopGeometry; /* NULL when no desktop */
     char * programName;     /* To use when loading resources */
     int    usePrivateMap;
diff --git a/include/pe_image.h b/include/pe_image.h
index d7fceee..169ddd8 100644
--- a/include/pe_image.h
+++ b/include/pe_image.h
@@ -1,6 +1,7 @@
 #ifndef __WINE_PE_IMAGE_H
 #define __WINE_PE_IMAGE_H
 
+extern void *RELAY32_GetEntryPoint(char *dll_name, char *item, int hint);
 extern int PE_unloadImage(struct w_files *wpnt);
 extern int PE_StartProgram(struct w_files *wpnt);
 extern void PE_InitDLL(struct w_files *wpnt);
diff --git a/include/prototypes.h b/include/prototypes.h
deleted file mode 100644
index 5c8d64d..0000000
--- a/include/prototypes.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/* $Id: prototypes.h,v 1.3 1993/07/04 04:04:21 root Exp root $
- */
-/*
- * Copyright  Robert J. Amstadt, 1993
- */
-#ifndef _WINE_PROTOTYPES_H
-#define _WINE_PROTOTYPES_H
-
-#include <sys/types.h>
-
-#include "windows.h"
-
-#ifndef WINELIB
-
-/* loader/resource.c */
-
-extern HBITMAP ConvertCoreBitmap( HDC hdc, BITMAPCOREHEADER * image );
-extern HBITMAP ConvertInfoBitmap( HDC hdc, BITMAPINFO * image );
-
-/* loader/signal.c */
-
-extern void init_wine_signals(void);
-
-/* loader/wine.c */
-
-extern int _WinMain(int argc, char **argv);
-
-/* misc/spy.c */
-
-extern void SpyInit(void);
-
-#endif /* WINELIB */
-#endif /* _WINE_PROTOTYPES_H */
diff --git a/include/region.h b/include/region.h
index 7d87c13..e8f6261 100644
--- a/include/region.h
+++ b/include/region.h
@@ -18,5 +18,6 @@
 
 
 extern BOOL REGION_DeleteObject( HRGN hrgn, RGNOBJ * obj );
+extern BOOL REGION_FrameRgn(HRGN dest,HRGN src,int x,int y);
 
 #endif  /* __WINE_REGION_H */
diff --git a/include/registers.h b/include/registers.h
index 4af04bc..e6253f3 100644
--- a/include/registers.h
+++ b/include/registers.h
@@ -37,6 +37,14 @@
 #define ES (context->sc_es)
 #define SS (context->sc_ss)
 
+#ifdef linux
+#define FS (context->sc_fs)
+#define GS (context->sc_gs)
+#else  /* FIXME: are fs and gs supported under *BSD? */
+#define FS  0
+#define GS  0
+#endif
+
 #ifndef __FreeBSD__
 #define EFL (context->sc_eflags)
 #define FL (*(WORD*)&context->sc_eflags)
diff --git a/include/resource.h b/include/resource.h
index d389ce4..6a5eeb2 100644
--- a/include/resource.h
+++ b/include/resource.h
@@ -17,6 +17,9 @@
 extern HGLOBAL NE_AllocResource( HMODULE hModule, HRSRC hRsrc, DWORD size );
 extern HGLOBAL NE_LoadResource( HMODULE hModule,  HRSRC hRsrc );
 
+extern HBITMAP ConvertCoreBitmap( HDC hdc, BITMAPCOREHEADER * image );
+extern HBITMAP ConvertInfoBitmap( HDC hdc, BITMAPINFO * image );
+
 struct ResourceTable
 {
         int id,type;
diff --git a/include/shell.h b/include/shell.h
index 6a30151..b222e7e 100644
--- a/include/shell.h
+++ b/include/shell.h
@@ -2,6 +2,8 @@
  * 				Shell Library definitions
  */
 
+extern INT ShellAbout(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON hIcon);
+
 #define ERROR_SUCCESS           0L
 #define ERROR_BADDB             1L
 #define ERROR_BADKEY            2L
diff --git a/include/shm_block.h b/include/shm_block.h
new file mode 100644
index 0000000..c19c84f
--- /dev/null
+++ b/include/shm_block.h
@@ -0,0 +1,86 @@
+/***************************************************************************
+ * Copyright 1995, Technion, Israel Institute of Technology
+ * Electrical Eng, Software Lab.
+ * Author:    Michael Veksler.
+ ***************************************************************************
+ * File:      shm_block.ch
+ * Purpose:   treat a shared memory block.
+ ***************************************************************************
+ */
+#ifndef __WINE_SHM_BLOCK_H
+#define __WINE_SHM_BLOCK_H
+#include <sys/shm.h>
+#include "wintypes.h"
+#define SEGSIZE                 0x10000 /* 64 */ 
+#define SHM_GRANULARITY         SEGSIZE
+#define SHM_MINBLOCK            SHM_GRANULARITY
+#define SHM_MAXBLOCK            (((int)SHMMAX/(int)SHM_GRANULARITY)*  \
+				 SHM_GRANULARITY)
+#define PTR2REL(block,ptr) (REL_PTR) ( (char *) (ptr) - (char *) (block) )
+#define REL2PTR(block,rel) (void *) ( (char *) (block) + (rel) )
+
+typedef  int REL_PTR;
+
+/* full info for each shm block. */
+struct shm_block {
+	/* private */
+	int next_shm_id;	   /* IPC shm ID (for initial linking) */
+    
+	/* public (read only) */
+	int size;		   /* size of the shm block */
+	int free;		   /* how much of the block is free */
+        int proc_idx;		   /* The index of the owner */
+	
+	/* public - writable for shm_fragment */
+	REL_PTR free_list;	   /* first item in the free list */
+};
+
+/* used for mapping local attachments */
+struct local_shm_map {
+	struct local_shm_map *next;
+	int shm_id;
+	int proc_idx;
+	
+	/* 32 bit pointer to the beginning of the block */
+	struct shm_block *ptr;
+};
+extern struct local_shm_map *shm_map;
+void shm_setup_block(struct shm_block *block, REL_PTR first, int size);
+
+/* shm_create_block:
+ *   allocate and setup a new block:
+ *   first - first non header byte.
+ *   size  - block size (in bytes).
+ *   shm_id- IPC shared memory ID.
+ */
+struct shm_block *shm_create_block(REL_PTR first, int size, int *shm_id);
+
+/* shm_locate_block:
+ *   locate existing block according to shm_id,
+ *   Attach the block if needed. Assume the shm_id is wine's
+ *   Set selectors also.
+ */
+struct shm_block *shm_locate_block(int shm_id, struct local_shm_map *map);
+
+/* shm_locate_attached_block: 
+ *   locate existing block according to shm_id,
+ *   Blocks are never attached.
+ * if proc_idx is not NULL, it will be set to owner's index.
+ * map - localy mapped info about block may be NULL;
+ */
+struct shm_block *shm_locate_attached_block(int shm_id, 
+					    struct local_shm_map *map);
+
+/* shm_attach_block: attach existing shm block, setup selectors
+ * shm_id - id of the block to attach.
+ * proc_idx - if not -1, puts this data into local mapping
+ * map - localy mapped info about this block. (may be NULL)
+ * NOTE: same block can be attached many times
+ */
+struct shm_block *shm_attach_block(int shm_id, int proc_idx,
+				   struct local_shm_map *map);
+
+/* delete chain of shm blocks (pointing to each other */
+void shm_delete_chain(int *shmid);
+
+#endif /* __WINE_SHM_BLOCK_H */
diff --git a/include/shm_fragment.h b/include/shm_fragment.h
new file mode 100644
index 0000000..81a4b66
--- /dev/null
+++ b/include/shm_fragment.h
@@ -0,0 +1,47 @@
+/***************************************************************************
+ * Copyright 1995, Technion, Israel Institute of Technology
+ * Electrical Eng, Software Lab.
+ * Author:    Michael Veksler.
+ ***************************************************************************
+ * File:      shm_fragment.h
+ * Purpose:   Data fragments and free list items. Allocate and free blocks.
+ ***************************************************************************
+ */
+#ifndef __WINE_SHM_FRAGMENT_H
+#define __WINE_SHM_FRAGMENT_H
+
+#include "shm_block.h"
+
+#define NIL ((int) 0)
+/* memory fragment: used or free (when free - it's an item of "free list",
+ * when allocated it contains the data, and it's size) 
+ */
+struct shm_fragment {
+	int size;		/* fragment's size */
+	
+	/* The type of info depends on fragment's status (free/allocated) */
+	union info {		
+		int next;	/* next free fragment */
+		char data[1];	/* the data */
+	} info;
+};
+
+/* setup first item in the free list */
+void shm_FragmentInit(struct shm_block *block,REL_PTR first,int size);
+
+/* allocate shm fragment. return: offset to data in fragment, or NULL */
+REL_PTR shm_FragmentAlloc(struct shm_block *block, int size);
+
+/* like shm_FragmentAlloc, returns pointer instead of offset */
+char *shm_FragPtrAlloc(struct shm_block *block, int size);
+
+/* free shm fragment - according to offset */
+void shm_FragmentFree(struct shm_block *block, int ofs);
+
+/* free shm fragment - according to pointer */
+void shm_FragPtrFree(struct shm_block *block, void *ptr);
+
+/* This is used for debugging only */
+void shm_print_free_list(struct shm_block *block);
+
+#endif /* __WINE_SHM_FRAGMENT_H */
diff --git a/include/shm_main_blk.h b/include/shm_main_blk.h
new file mode 100644
index 0000000..e3f9e5b
--- /dev/null
+++ b/include/shm_main_blk.h
@@ -0,0 +1,55 @@
+/***************************************************************************
+ * Copyright 1995, Technion, Israel Institute of Technology
+ * Electrical Eng, Software Lab.
+ * Author:    Michael Veksler.
+ ***************************************************************************
+ * File:      shm_main_blk.h
+ * Purpose:   Main Wine's shared memory block
+ ***************************************************************************
+ */
+#ifndef __WINE_SHM_MAIN_BLK_H
+#define __WINE_SHM_MAIN_BLK_H
+#include <sys/shm.h>
+#include "shm_block.h"
+#include "shm_semaph.h"
+#include "dde_proc.h"
+#include "dde_atom.h"
+#include "dde_mem.h"
+/*****************************************************************************
+ *
+ * main block object
+ *
+ *****************************************************************************
+ */
+#ifndef __inline__
+#ifndef __GNUC__
+#define __inline__
+#endif /* __GNUC__ */
+#endif /* __inline__ */
+
+#define DDE_HANDLES_BIT_ARRAY_SIZE (DDE_HANDLES/sizeof(int)/8)
+
+#define SHM_MAXID SHMSEG	/* maximum shm blocks (Wine's limit) */
+struct shm_main_block {
+	/* NOTE:  "block" declaration must be the first */
+	struct shm_block block;
+	char magic[64];		   /* magic string to identify the block */
+        int build_lock;		   /* =1 when data structure not stable yet */
+        shm_sem sem;		   /* semaphores for main_block integrity */
+	struct _dde_proc proc[DDE_PROCS];  /* information about processes  */
+	REL_PTR atoms[DDE_ATOMS];  /* relative reference to global atoms */
+        /* Translation from global window handles to local handles */
+        WND_DATA windows[DDE_WINDOWS];
+        DDE_HWND handles[DDE_HANDLES];
+	/* bit array stating if a handle is free (bit=0), LSB in */
+	/* free_handles[0] refers handle 0x8000, the MSB refers 0x801F */
+	unsigned free_handles[DDE_HANDLES_BIT_ARRAY_SIZE];
+};
+extern struct shm_main_block *main_block;
+int shm_init(void);
+void shm_delete_all(int shm_id);
+void DDE_mem_init();
+int DDE_no_of_attached();
+#define DDE_IPC_init()  ( (main_block==NULL) ?  (DDE_mem_init()) : 0 )
+
+#endif /* __WINE_SHM_MAIN_BLK_H */
diff --git a/include/shm_semaph.h b/include/shm_semaph.h
new file mode 100644
index 0000000..5562446
--- /dev/null
+++ b/include/shm_semaph.h
@@ -0,0 +1,24 @@
+/***************************************************************************
+ * Copyright 1995, Technion, Israel Institute of Technology
+ * Electrical Eng, Software Lab.
+ * Author:    Michael Veksler.
+ ***************************************************************************
+ * File:      shm_semaph.h
+ * Purpose:   Handle semaphores for shared memory operations.
+ ***************************************************************************
+ */
+
+#ifndef __WINE_SHM_SEMAPH_H
+#define __WINE_SHM_SEMAPH_H
+/* IMPORTANT: If possible, restrict usage of these functions. */
+
+typedef int shm_sem;
+
+void shm_read_wait(shm_sem semid);
+void shm_write_wait(shm_sem semid);
+void shm_write_signal(shm_sem semid);
+void shm_read_signal(shm_sem semid);
+void shm_sem_init(shm_sem *semptr);
+void shm_sem_done(shm_sem *semptr);
+
+#endif /* __WINE_SHM_SEMAPH_H */
diff --git a/include/stackframe.h b/include/stackframe.h
index ee0195b..81fcf8e 100644
--- a/include/stackframe.h
+++ b/include/stackframe.h
@@ -19,6 +19,7 @@
 {
     WORD    saved_ss;                /* saved previous 16-bit stack */
     WORD    saved_sp;
+    WORD    es;
     WORD    ds;                      /* 16-bit ds */
     DWORD   entry_point WINE_PACKED; /* entry point to call */
     WORD    ordinal_number;          /* ordinal number of entry point */
diff --git a/include/stddebug.h b/include/stddebug.h
index b568098..b262020 100644
--- a/include/stddebug.h
+++ b/include/stddebug.h
@@ -77,6 +77,7 @@
 
 #ifdef DEBUG_NONE
 #undef DEBUG_ACCEL
+#undef DEBUG_ATOM
 #undef DEBUG_BITBLT
 #undef DEBUG_BITMAP
 #undef DEBUG_CARET
@@ -89,6 +90,7 @@
 #undef DEBUG_COMM
 #undef DEBUG_CURSOR
 #undef DEBUG_DC
+#undef DEBUG_DDE
 #undef DEBUG_DIALOG
 #undef DEBUG_DLL
 #undef DEBUG_DOSFS
@@ -137,6 +139,9 @@
 #undef DEBUG_SCROLL
 #undef DEBUG_SELECTOR
 #undef DEBUG_SELECTORS
+#undef DEBUG_SEM
+#undef DEBUG_SHM
+#undef DEBUG_SPY
 #undef DEBUG_STRESS
 #undef DEBUG_SYSCOLOR
 #undef DEBUG_TASK
@@ -150,6 +155,7 @@
 
 #ifdef DEBUG_ALL
 #define DEBUG_ACCEL
+#define DEBUG_ATOM
 #define DEBUG_BITBLT
 #define DEBUG_BITMAP
 #define DEBUG_CARET
@@ -162,6 +168,7 @@
 #define DEBUG_COMM
 #define DEBUG_CURSOR
 #define DEBUG_DC
+#define DEBUG_DDE
 #define DEBUG_DIALOG
 #define DEBUG_DLL
 #define DEBUG_DOSFS
@@ -210,6 +217,9 @@
 #define DEBUG_SCROLL
 #define DEBUG_SELECTOR
 #define DEBUG_SELECTORS
+#define DEBUG_SEM
+#define DEBUG_SHM
+#define DEBUG_SPY
 #define DEBUG_STRESS
 #define DEBUG_SYSCOLOR
 #define DEBUG_TASK
diff --git a/include/task.h b/include/task.h
index cbd28ae..dd7e9e8 100644
--- a/include/task.h
+++ b/include/task.h
@@ -13,6 +13,10 @@
 #pragma pack(1)
 #endif
 
+
+extern BOOL TASK_Init(void);
+extern void TASK_KillCurrentTask( int exitCode );
+
   /* Process database (i.e. a normal DOS PSP) */
 
 typedef struct
diff --git a/include/user.h b/include/user.h
index f749007..dc5c68a 100644
--- a/include/user.h
+++ b/include/user.h
@@ -10,6 +10,7 @@
 #include "ldt.h"
 #include "local.h"
 
+extern BOOL USER_HeapInit(void);
 /* USER local heap */
 
 #ifdef WINELIB
diff --git a/include/win.h b/include/win.h
index e1d1efe..2322240 100644
--- a/include/win.h
+++ b/include/win.h
@@ -74,6 +74,7 @@
 extern HWND WIN_FindWinToRepaint( HWND hwnd );
 extern void WIN_SendParentNotify( HWND hwnd, WORD event, LONG lParam );
 extern BOOL WIN_CreateDesktopWindow(void);
+extern HWND WIN_GetTopParent( HWND hwnd );
 
 extern Display * display;
 extern Screen * screen;
diff --git a/include/windows.h b/include/windows.h
index 0389728..eb2f910 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -2455,6 +2455,8 @@
 Fa(DWORD,GetDCOrg,HDC,a)
 Fa(DWORD,GetFreeSpace,WORD,a)
 Fa(DWORD,GetHeapSpaces,HMODULE,a)
+Fa(DWORD,GetSelectorBase,WORD,a)
+Fa(DWORD,GetSelectorLimit,WORD,a)
 Fa(DWORD,GetViewportExt,HDC,a)
 Fa(DWORD,GetViewportOrg,HDC,a)
 Fa(DWORD,GetWindowExt,HDC,a)
@@ -2524,10 +2526,11 @@
 Fa(LPSTR,LockResource,HANDLE,a)
 Fa(SEGPTR,AnsiNext,SEGPTR,a)
 Fa(SEGPTR,GlobalWire,HGLOBAL,a)
-Fa(SEGPTR,WIN16_LockResource,HANDLE,a)
 Fa(SEGPTR,WIN16_GlobalLock,HGLOBAL,a)
+Fa(SEGPTR,WIN16_LockResource,HANDLE,a)
 Fa(UINT,GDIRealizePalette,HDC,a)
 Fa(UINT,RealizePalette,HDC,a)
+Fa(WORD,AllocCStoDSAlias,WORD,a)
 Fa(WORD,AllocDStoCSAlias,WORD,a)
 Fa(WORD,AllocSelector,WORD,a)
 Fa(WORD,AllocSelectorArray,WORD,a)
@@ -2716,6 +2719,8 @@
 Fb(WORD,SetPolyFillMode,HDC,a,WORD,b)
 Fb(WORD,SetROP2,HDC,a,WORD,b)
 Fb(WORD,SetRelAbs,HDC,a,WORD,b)
+Fb(WORD,SetSelectorBase,WORD,a,DWORD,b)
+Fb(WORD,SetSelectorLimit,WORD,a,DWORD,b)
 Fb(WORD,SetStretchBltMode,HDC,a,WORD,b)
 Fb(WORD,SetSystemPaletteUse,HDC,a,WORD,b)
 Fb(WORD,SetTextAlign,HDC,a,WORD,b)
@@ -2818,12 +2823,12 @@
 Fc(INT,OpenFile,LPSTR,a,LPOFSTRUCT,b,WORD,c)
 Fc(INT,_lread,INT,a,LPSTR,b,WORD,c)
 Fc(INT,_lwrite,INT,a,LPCSTR,b,WORD,c)
-Fc(LONG,_hread,INT,a,LPSTR,b,LONG,c)
-Fc(LONG,_hwrite,INT,a,LPCSTR,b,LONG,c)
 Fc(LONG,GetBitmapBits,HBITMAP,a,LONG,b,LPSTR,c)
 Fc(LONG,SetBitmapBits,HBITMAP,a,LONG,b,LPSTR,c)
 Fc(LONG,SetClassLong,HWND,a,short,b,LONG,c)
 Fc(LONG,SetWindowLong,HWND,a,short,b,LONG,c)
+Fc(LONG,_hread,INT,a,LPSTR,b,LONG,c)
+Fc(LONG,_hwrite,INT,a,LPCSTR,b,LONG,c)
 Fc(LONG,_llseek,INT,a,LONG,b,INT,c)
 Fc(SEGPTR,lstrcpyn,SEGPTR,a,SEGPTR,b,WORD,c)
 Fc(WORD,GetAtomName,ATOM,a,LPSTR,b,short,c)
@@ -2831,6 +2836,7 @@
 Fc(WORD,GetMenuState,HMENU,a,WORD,b,WORD,c)
 Fc(WORD,GetProfileInt,LPSTR,a,LPSTR,b,int,c)
 Fc(WORD,GlobalGetAtomName,ATOM,a,LPSTR,b,short,c)
+Fc(WORD,SelectorAccessRights,WORD,a,WORD,b,WORD,c)
 Fc(WORD,SetClassWord,HWND,a,short,b,WORD,c)
 Fc(WORD,SetWindowWord,HWND,a,short,b,WORD,c)
 Fc(int,FillRect,HDC,a,LPRECT,b,HBRUSH,c)
diff --git a/include/wineopts.h b/include/wineopts.h
deleted file mode 100644
index 6f3e66b..0000000
--- a/include/wineopts.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* WINEOPTS.H
- */
-
-#ifndef WINEOPTS_H
-#define WINEOPTS_H
-
-#include <stdio.h>
-
-FILE *SpyFp;
-
-#endif /* WINEOPTS_H */
diff --git a/include/winsock.h b/include/winsock.h
index 2a2674b..a0450c2 100644
--- a/include/winsock.h
+++ b/include/winsock.h
@@ -7,13 +7,13 @@
 #ifndef _WINSOCKAPI_
 #define _WINSOCKAPI_
 
-#include <windows.h>
 #include <sys/types.h>
 #include <sys/time.h>
 #include <fcntl.h>
 #include <netdb.h>
 #include <netinet/in.h>
 #include <sys/socket.h>
+#include "windows.h"
 
 /*
  * The new type to be used in all