Release 980927

Sun Sep 27 14:25:38 1998  Petter Reinholdtsen <pere@td.org.uit.no>

	* [files/drive.c]
	Make sure GetDriveType32A() handles param NULL.  Added some
	doc on function.

Sun Sep 27 14:07:26 1998  Huw D M Davies <daviesh@abacus.physics.ox.ac.uk>

	* [controls/edit.c] [windows/win.c]
	Don't call SetWindowLong() in EDIT_WM_NCREATE.
	Fix SetWindowLong(GWL_[EX]STYLE) to work for 16bit windows. Remove
	UpdateWindow() call. 

Sun Sep 27 13:41:22 1998  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [scheduler/*.c] [server/event.c] [server/mutex.c]
	  [server/semaphore.c]
	Implemented server-side synchronisation objects.

Sun Sep 27 01:13:35 1998  Alex Priem <alexp@sci.kun.nl>

	* [dlls/comctl32/treeview.c] [include/treeview.h] [include/comctl.h]
	Treeview implementation.

	* [dlls/comctl32/trackbar.c] [include/trackbar.h] 
	Trackbar implementation.

Sat Sep 26 20:49:13 1998  Ulrich Weigand <weigand@informatik.uni-erlangen.de>

	* [if1632/thunk.c] [tools/build.c] [win32/kernel32.c]
	Bugfix: several problems with flat thunks fixed.

	* [memory/selector.c]
	Bugfix: IsBad...Ptr16 didn't work for limit_in_pages segments.

	* [scheduler/thread.c]
	Bugfix: CreateThread: Allow id parameter == NULL.

	* [objects/gdiobj.c]
	Bugfix: IsGDIObject: Return correct object type for stock objects.

	* [msdos/dpmi.c]
	Bugfix: fixed typo in INT_DoRealModeInt.

	* [msdos/int21.c]
	Bugfix: int21 READ *must* use WIN16_hread, not _hread16.

	* [if1632/kernel.spec] [if1632/dummy.c] [if1632/thunk.c]
	  [loader/ne/module.c] [scheduler/event.c] [scheduler/synchro.c]
	  [scheduler/thread.c] [win32/kernel32.c] [win32/ordinals.c]
	Added names/stubs for all undocumented KERNEL routines (Win95).
	Added the following undoc. 16-bit equivalents to Win32 routines:
	KERNEL.441-443,449-453,456-462,471-476,479-486,488.
	Added stubs for some other KERNEL routines.

	* [memory/heap.c] [memory/global.c] [include/global.h]
	Implemented Local32... 32-bit local heap routines (KERNEL.208-215, 229).

	* [miscemu/instr.c] [loader/module.c] [include/module.h]
	Implemented __GP fault handling and HasGPHandler (KERNEL.338).

	* [misc/error.c]
	Implemented LogParamErrorRegs (KERNEL.327).

	* [loader/task.c] [include/windows.h]
	Implemented GetCodeInfo (KERNEL.104).

	* [loader/task.c] [scheduler/thread.c] [include/thread.h]
	Implemented [GS]etThreadQueue and [GS]etFastQueue (KERNEL.463/4, 624/5).

	* [if1632/gdi.spec] [objects/dc.c] [objects/dib.c]
	  [objects/bitmap.c] [include/windows.h]
	Bugfix: fixed wrong parameter for CreateDIBSection16.
	Added [GS]etDIBColorTable16, stub for GetBoundsRect16.
	Partially implemented BITMAP_GetObject16 for DIBs.

	* [if1632/gdi.spec] [relay32/gdi32.spec] [objects/palette.c]
	Added some GDI stubs.

	* [if1632/Makefile.in] [if1632/display.spec] [if1632/mouse.spec]
	  [if1632/keyboard.spec] [if1632/builtin.c] [windows/keyboard.c]
	Added some stubs for Win16 drivers: KEYBOARD, MOUSE, DISPLAY.

	* [if1632/wprocs.spec] [msdos/vxd.c]
	Added some stubs for VxDs: VMM, ConfigMG, TimerAPI.

	* [msdos/int2f.c]
	Added some stubs for real-mode network drivers.

Sat Sep 26 18:18:18 1998  Marcus Meissner <marcus@jet.franken.de>

	* [configure.in]
	Merged in some more of the FreeBSD ports/emulators/wine patches. 
	(Maintainer(s) of this port: You can just submit these
	patches to Alexandre directly.)

	 * [loader/pe_image.c]
	Check filesize of image against size derived from header
	to spot truncated executeables without crashing.

	* [files/directory.c]
	Set envvar "COMSPEC". One win32(!!) program crashes without it.

	* [multimedia/mmio.c]
	Added mmioSetInfo32.

	* [include/file.h]
	Return STD_ERROR_HANDLE for AUX and PRT dos handles.

	* [loader/module.c]
	Handle executeables with spaces in their names a bit better in
	CreateProcess.

	* [relay32/msvfw32.spec][if1632/msvideo.spec][multimedia/msvideo.c][include/vfw.h]
	Started on MS Video support (can load Win32 ICMs).

	* [tools/testrun]
	A bit smarter use of ps.

	* [memory/virtual.c]
	Report PAGE_GUARDed pages as PAGE_PROTECTED (AutoCAD LT R17 fails
	without that check (since Win95 doesn't know about PAGE_GUARD)).

Sat Sep 26 15:04:05 1998  Ove Kaaven <ovek@arcticnet.no>

	* [include/miscemu.h] [if1632/builtin.c] [loader/task.c]
	  [miscemu/instr.c] [msdos/dpmi.c] [msdos/int21.c]
	  [msdos/interrupts.c] [windows/user.c]
	INT_[S|G]etHandler was renamed to INT_[S|G]etPMHandler.
	Added handlers to deal with real-mode interrupts; DOS
	programs are now able to hook real-mode interrupts.

	* [loader/dos/module.c] [msdos/dosmem.c] [msdos/int21.c]
	Moved real-mode interrupt table initialization to
	msdos/dosmem.c, and made new V86 tasks get a full copy
	of the existing "system memory" instead of almost empty
	space. Misc fixes.

	* [include/dosexe.h] [loader/dos/module.c] [msdos/dpmi.c]
	  [msdos/int2f.c]
	First shot at letting DOS programs start up DPMI (but DPMI
	is still disabled for DOS programs, for pkunzip's sake).

	* [include/debugger.h] [debugger/break.c] [debugger/dbg.y]
	  [debugger/registers.c] [debugger/memory.c] [debugger/info.c]
	  [loader/dos/dosvm.c]
	First shot at making Wine's debugger work for DOS programs.
	The -debug flag works, as do "nexti" and "stepi".

Sat Sep 26 13:13:13 1998  Juergen Schmied <juergen.schmied@metronet.de>

	* [dlls/shell32/dataobject.c]
	New classes IEnumFORMATETC implemented, IDataObject stubs.
	
	* [dlls/shell32/*.*][relay32/shell32.spec]
	Bugfixes.
	New: ICM_InsertItem(), ILCreateFromPath().
	Implemented: ILCloneFirst().
	Stubs: ILIsEqual(), ILFindChild(), SHLogILFromFSIL(),
	  PathMatchSpec(), PathIsExe().
	Changed: ILGetSize(), _ILIsDesktop(), PathCombine().

	* [include/shlobj.h]
	New SHLGUID's
	New structures: DVTARGETDEVICE32, STGMEDIUM32, FORMATETC32,
	CLIPFORMAT32.
	New interfaces: IEnumFORMATETC, IDataObject, ICommDlgBrowser
	IDockingWindowFrame, IServiceProvider.

	* [dlls/shell32/folders.c]
	Stubs for IShellLink.

	* [loader/resource.c]
	Small fixes.

	* [misc/crtdll.c][relay32/crtdll.spec]
	New __dllonexit().

	* [windows/message.c]
	SendNotifyMessageA, SendMessageCallBack32A half implemented.

	* [controls/edit.c]
	EDIT_WM_SetText set EF_UPDATE flag not for ES_MULTILINE.

	* [files/file.c]
	Handling of fileposition fixed.

Fri Sep 25 18:13:30 1998  Patrik Stridvall <ps@leissner.se>

	* [include/windows.h] [include/wintypes.h]
	  [ole/ole2nls.h] [relay32/kernel32.spec]
	Implemented EnumDateFormats and EnumTimeFormats.
	Only adds US English support.

	* [Makefile.in] [configure.in] 
	  [dlls/Makefile.in] [dlls/psapi/Makefile.in] 
	  [dlls/psapi/psapi_main.c] 
	New files to implement stubs for PSAPI.DLL (NT only).

	* [relay32/Makefile.in] [relay32/builtin32.c] 
	  [relay32/psapi.spec]
	New spec file for PSAPI.DLL (NT only).

	* [scheduler/handle.c]
	HANDLE_GetObjPtr should only interpret the pseudo handles as the
	current thread or the current process if a thread or a process is
	requested.

	* [include/winversion.h] [misc/version.c]
	Adds the global function VERSION_GetVersion() so functions can
	have different behavior depending on the -winver flag.

	* [include/oledlg.h] [ole/oledlg.c]
	Minor fixes. 

	* [windows/winproc.c]
	Minor changes.

	* [include/imm.h] [misc/imm.c]
	Now returns correct values under both Windows 95 and NT 4.0.

Thu Sep 24 22:11:44 1998  Kristian Nielsen  <kristian.nielsen@risoe.dk>

	* [configure.in] [include/acconfig.h] [include/thread.h]
	  [scheduler/sysdeps.c]
	Autoconfig test for non-reentrant libc.

Wed Sep 23 19:52:12 1998  Matthew Becker <mbecker@glasscity.net>

	* [*/*.c]
	Miscellaneous documentation updates and debugging output 
	standardizations.

	* [objects/clipping.c]
	Added ExtSelectClipRgn.

Wed Sep 23 00:03:28 EDT 1998  Pete Ratzlaff <pratzlaff@cfa.harvard.edu>

	* [include/windows.h] [if1632/user.spec] [relay32/user32.spec]
	  [windows/keyboard.c]
	Added, marginally implemented, GetKeyboardLayoutName().
	Only returns US English keyboard name.

Tue Sep 22 16:32:41 1998  Marcel Baur <mbaur@iiic.ethz.ch>

	* [programs/control/*]
	New Winelib application.

Mon Sep 21 00:29:18 1998  Peter Hunnisett <hunnise@nortel.ca>

	* [include/dplay.h][multimedia/dplay.c][ole/compobj.c]
	Added all DirectPlayLobby interfaces and enhanced DirectPlay
	and DirectPlayLobby support. Still not all that much. Useful
	enough if you just need to start a program, don't try any
	real dplay/lobby stuff.

	* [documentation/status/directplay]
	Added a very little bit.

	* [graphics/ddraw.c]
	- Call to SetWindowLong32A wasn't working because there was no
	  memory set aside when the window class was registered.
	- Fixed some xlib reference counting and change the behaviour
	  of DirectDrawSurface3_SetPalette to mimic observed behaviour
	  (palette is associated will all backbuffers)
	- Also stored all palette colour fields and spit back our saved
	  colour fields rather than query X for them.
	- Added plenty of AddRef and Release traces.
	- Added Xlib support for using -desktop option.
	- Fixed Xlib message handling. Messages weren't being passed to
	  the application. Fixes mouse movements in some xlib DDraw games.
	- Added a few stubs.

	* [windows/win.c][include/winerror.h]
	Fixed up some error handling in WIN_SetWindowLong. SetLastError
	wasn't being used. Could cause problems with 0 return codes.
	Added new error in winerror (1400).

	* [AUTHORS] [include/authors.h]
	Added myself as a Wine author.

Sun Sep 20 21:22:44 1998  Alexander Larsson  <alla@lysator.liu.se>

	* [loader/module.c]
	Changed GetModuleFileName32A so that is returns the
	long version of the filename. Note that just the name
	is long, not the directories.

Sat Sep 19 20:05:30 1998 Per Ångström <pang@mind.nu> 

	* [controls/menu.c]
	Made a couple of fixes to make life easier for applications that alter
	their menus at runtime.

	* [windows/defdlg.c]
	Removed the cast of the return value from dialog procedures to a 16-bit
	bool. The return value needs to retain all its 32 bits, since it is not 
	always a bool, such as when responding to the WM_NCHITTEST message.

Fri Sep 18 11:30:38 1998  Sergey Turchanov <turchanov@usa.net>

	* [loader/resource.c]
	Fixed very funny bug (though gravely affecting further excecution)
	with FindResource[Ex]32 functions.

	* [include/multimon.h] [windows/multimon.c] [relay32/user32.spec]
	  [include/windows.h] [windows/sysmetrics.c]
	Default implementation for Multimonitor API.

	* [include/windows.h] [windows/winpos.c]
	Fixed incorrect declaration (and behaviour) of GetWindowRect32.

Wed Sep 16 10:21:15 1998  Gerard Patel <G.Patel@Wanadoo.fr>

	* [controls/edit.c]
	Fixed EDIT_EM_GetLine to use correctly length of lines.

Tue Sep 15 20:40:16 1998  Eric Kohl <ekohl@abo.rhein-zeitung.de>

	* [misc/tweak.c][include/tweak.h][controls/menu.c]
	Replaced the tweak graphic routines by calls to DrawEdge32().

	* [misc/tweak.c][include/tweak.h][documentation/win95look]
	  [wine.ini][*/*]
	Changed "look and feel" selection. Allows Win3.1, Win95 and
	Win98 (no GUI code implemented) look and feel.

	* [dlls/comctl32/header.c][include/header.h][include/commctrl.h]
	Started callback item support and did some minor improvements.

	* [dlls/comctl32/imagelist.c]
	Fixed bug in transparent image display.
	ImageList_GetIcon is still buggy :-(

	* [dlls/comctl32/toolbar.c]
	Fixed button drawing (partial hack).

	* [dlls/comctl32/commctrl.c]
	Fixed MenuHelp().

	* [controls/button.c]
	Added 3d effect for groupbox.

	* [windows/msgbox.c]
	Added font support for message boxes.

	* [windows/nonclient.c]
	Fixed window moving bug.

	* [dlls/comctl32/*.c]
	Various improvements.

	* [dlls/comctl32/listview.c][dlls/comctl32/rebar.c]
	  [include/commctrl.h]
	More messages.

	* [windows/syscolor.c][include/windows.h]
	Introduced new Win98 system colors.

Tue Sep 15 18:29:45 1998 Wesley Filardo <eightknots@aol.com>

	* [files/profile.c]
	Added support in PROFILE_LoadWineIni for -config option

	* [misc/main.c] [include/options.h]
	Added -config option.

Tue Sep 15 18:22:26 1998  Petter Reinholdtsen <pere@td.org.uit.no>

	* [documentation/Makefile.in]
	Make sure directory exists before installing into it.

Tue Sep 15 01:47:33 1998  Pablo Saratxaga <pablo.sarachaga@ping.be>

	* [ole/nls/*] [ole/ole2nls.c] [include/winnls.h]
	Fixed a few errors and completed some NLS files.

Mon Sep 14 01:23:45 1998  Joseph Pranevich <knight@baltimore.wwaves.com>

	* [include/miscemu.h] [msdos/interrupts.c]
	Removed a compilation warning, added INT 25 to the list of interrupts
	callable from DOS applications, added a debug message when unsupported
	interrupts are used.

Sun Sep 13 19:55:22 1998  Lawson Whitney <lawson_whitney@juno.com>

	* [if1632/relay.c]
	CallProcEx32W should not reverse arguments.

Sun Aug 17 21:18:12 1998  Eric Pouech  <eric.pouech@lemel.fr>

	* [multimedia/midi.c] [multimedia/init.c] [multimedia/mmsys.c] 
	  [include/multimedia.h] [include/mmsystem.h] 
	  [multimedia/Makefile.in] [multimedia/midipatch.c]
	  [if1632/multimedia.spec]
	Made MIDI input and output functional on OSS capable systems.

	* [multimedia/timer.c]
	Changes to trigger callbacks at the accurate pace even when
	fake timers are used.
diff --git a/include/acconfig.h b/include/acconfig.h
index f0287ea..66ece2f 100644
--- a/include/acconfig.h
+++ b/include/acconfig.h
@@ -24,6 +24,9 @@
 /* Define if X libraries are not reentrant (compiled without -D_REENTRANT).  */
 #undef NO_REENTRANT_X11
 
+/* Define if libc is not reentrant  */
+#undef NO_REENTRANT_LIBC
+
 /* Define if all debug messages are to be compiled out */
 #undef NO_DEBUG_MSGS
 
diff --git a/include/animate.h b/include/animate.h
index 8867a9f..665fc62 100644
--- a/include/animate.h
+++ b/include/animate.h
@@ -10,7 +10,8 @@
 
 typedef struct tagANIMATE_INFO
 {
-    DWORD dwDummy;
+    LPVOID  lpAvi;   /* pointer to avi data */
+    HFILE32 hFile;   /* handle to avi file */
 } ANIMATE_INFO;
 
 
diff --git a/include/aspi.h b/include/aspi.h
index 9ceafd9..e19d390 100644
--- a/include/aspi.h
+++ b/include/aspi.h
@@ -1,173 +1,118 @@
+/* ASPI definitions used for both WNASPI16 and WNASPI32 */
+
 #if !defined(ASPI_H)
 #define ASPI_H
 
 #pragma pack(1)
 
-#define SS_PENDING	0x00
-#define SS_COMP		0x01
-#define SS_ABORTED	0x02
-#define SS_ERR		0x04
-#define SS_OLD_MANAGE	0xe1
-#define SS_ILLEGAL_MODE	0xe2
-#define SS_NO_ASPI	0xe3
-#define SS_FAILED_INIT	0xe4
-#define SS_INVALID_HA	0x81
-#define SS_INVALID_SRB	0xe0
-#define SS_ASPI_IS_BUSY	0xe5
-#define SS_BUFFER_TO_BIG	0xe6
+#define SS_PENDING      0x00
+#define SS_COMP         0x01
+#define SS_ABORTED      0x02
+#define SS_ERR          0x04
+#define SS_OLD_MANAGE   0xe1
+#define SS_ILLEGAL_MODE 0xe2
+#define SS_NO_ASPI      0xe3
+#define SS_FAILED_INIT  0xe4
+#define SS_INVALID_HA   0x81
+#define SS_INVALID_SRB  0xe0
+#define SS_ASPI_IS_BUSY 0xe5
+#define SS_BUFFER_TO_BIG        0xe6
 
-#define SC_HA_INQUIRY		0x00
-#define SC_GET_DEV_TYPE 	0x01
-#define SC_EXEC_SCSI_CMD	0x02
-#define SC_ABORT_SRB		0x03
-#define SC_RESET_DEV		0x04
+#define SC_HA_INQUIRY           0x00
+#define SC_GET_DEV_TYPE         0x01
+#define SC_EXEC_SCSI_CMD        0x02
+#define SC_ABORT_SRB            0x03
+#define SC_RESET_DEV            0x04
+
 
 /* Host adapter status codes */
-#define HASTAT_OK		0x00
-#define HASTAT_SEL_TO		0x11
-#define HASTAT_DO_DU		0x12
-#define HASTAT_BUS_FREE		0x13
-#define HASTAT_PHASE_ERR	0x14
+#define HASTAT_OK               0x00
+#define HASTAT_SEL_TO           0x11
+#define HASTAT_DO_DU            0x12
+#define HASTAT_BUS_FREE         0x13
+#define HASTAT_PHASE_ERR        0x14
 
 /* Target status codes */
-#define STATUS_GOOD		0x00
-#define STATUS_CHKCOND		0x02
-#define STATUS_BUSY		0x08
-#define STATUS_RESCONF		0x18
+#define STATUS_GOOD             0x00
+#define STATUS_CHKCOND          0x02
+#define STATUS_BUSY             0x08
+#define STATUS_RESCONF          0x18
+
+#ifdef linux
+
+/* This is a duplicate of the sg_header from /usr/src/linux/include/scsi/sg.h
+ * kernel 2.0.30
+ * This will probably break at some point, but for those who don't have
+ * kernels installed, I think this should still work.
+ *
+ */
+
+struct sg_header
+ {
+  int pack_len;    /* length of incoming packet <4096 (including header) */
+  int reply_len;   /* maximum length <4096 of expected reply */
+  int pack_id;     /* id number of packet */
+  int result;      /* 0==ok, otherwise refer to errno codes */
+  unsigned int twelve_byte:1; /* Force 12 byte command length for group 6 & 7
+commands  */
+  unsigned int other_flags:31;                  /* for future use */
+  unsigned char sense_buffer[16]; /* used only by reads */
+  /* command follows then data for command */
+ };
+
+#define SCSI_OFF sizeof(struct sg_header)
+#endif
+
+#define ASPI_POSTING(prb) (prb->SRB_Flags & 0x1)
+
+#define HOST_TO_TARGET(prb) (((prb->SRB_Flags>>3) & 0x3) == 0x2)
+#define TARGET_TO_HOST(prb) (((prb->SRB_Flags>>3) & 0x3) == 0x1)
+#define NO_DATA_TRANSFERED(prb) (((prb->SRB_Flags>>3) & 0x3) == 0x3)
+
+#define SRB_ENABLE_RESIDUAL_COUNT 0x4
+#define SRB_EVENT_NOTIFY 0x40 /* Enable ASPI event notification */
+
+#define INQUIRY_VENDOR          8
+
+#define MUSTEK_SCSI_AREA_AND_WINDOWS 0x04
+#define MUSTEK_SCSI_READ_SCANNED_DATA 0x08
+#define MUSTEK_SCSI_GET_IMAGE_STATUS 0x0f
+#define MUSTEK_SCSI_ADF_AND_BACKTRACE 0x10
+#define MUSTEK_SCSI_CCD_DISTANCE 0x11
+#define MUSTEK_SCSI_START_STOP 0x1b
+
+#define CMD_TEST_UNIT_READY 0x00
+#define CMD_REQUEST_SENSE 0x03
+#define CMD_INQUIRY 0x12
+
+/* scanner commands - just for debug */
+#define CMD_SCAN_GET_DATA_BUFFER_STATUS 0x34
+#define CMD_SCAN_GET_WINDOW 0x25
+#define CMD_SCAN_OBJECT_POSITION 0x31
+#define CMD_SCAN_READ 0x28
+#define CMD_SCAN_RELEASE_UNIT 0x17
+#define CMD_SCAN_RESERVE_UNIT 0x16
+#define CMD_SCAN_SCAN 0x1b
+#define CMD_SCAN_SEND 0x2a
+#define CMD_SCAN_CHANGE_DEFINITION 0x40
+
+#define INQURIY_CMDLEN 6
+#define INQURIY_REPLY_LEN 96
+#define INQUIRY_VENDOR 8
+
+#define SENSE_BUFFER(prb) (&prb->CDBByte[prb->SRB_CDBLen])
 
 
-typedef union SRB16 * LPSRB16;
-
-struct SRB_HaInquiry16 {
-  BYTE	SRB_cmd;
-  BYTE	SRB_Status;
-  BYTE	SRB_HaId;
-  BYTE	SRB_Flags;
-  WORD	SRB_55AASignature;
-  WORD	SRB_ExtBufferSize;
-  BYTE	HA_Count;
-  BYTE	HA_SCSI_ID;
-  BYTE	HA_ManagerId[16];
-  BYTE	HA_Identifier[16];
-  BYTE	HA_Unique[16];
-  BYTE	HA_ExtBuffer[4];
-} WINE_PACKED;
-
-typedef struct SRB_HaInquiry16 SRB_HaInquiry16;
-
-struct SRB_ExecSCSICmd16 {
-  BYTE        SRB_Cmd;                /* ASPI command code	      (W)  */
-  BYTE        SRB_Status;             /* ASPI command status byte     (R)  */
-  BYTE        SRB_HaId;               /* ASPI host adapter number     (W)  */
-  BYTE        SRB_Flags;              /* ASPI request flags	      (W)  */
-  DWORD       SRB_Hdr_Rsvd;           /* Reserved, MUST = 0	      (-)  */
-  BYTE        SRB_Target;             /* Target's SCSI ID	      (W)  */
-  BYTE        SRB_Lun;                /* Target's LUN number	      (W)  */
-  DWORD       SRB_BufLen;             /* Data Allocation LengthPG     (W/R)*/
-  BYTE        SRB_SenseLen;           /* Sense Allocation Length      (W)  */
-  SEGPTR      SRB_BufPointer;         /* Data Buffer Pointer	      (W)  */
-  DWORD       SRB_Rsvd1;              /* Reserved, MUST = 0	      (-/W)*/
-  BYTE        SRB_CDBLen;             /* CDB Length = 6		      (W)  */
-  BYTE        SRB_HaStat;             /* Host Adapter Status	      (R)  */
-  BYTE        SRB_TargStat;           /* Target Status		      (R)  */
-  FARPROC16   SRB_PostProc;	      /* Post routine		      (W)  */
-  BYTE        SRB_Rsvd2[34];          /* Reserved, MUST = 0                */
-  BYTE		CDBByte[0];	      /* SCSI CBD - variable length   (W)  */
-  /* variable example for 6 byte cbd
-   * BYTE        CDBByte[6];             * SCSI CDB                    (W) *
-   * BYTE        SenseArea6[SENSE_LEN];  * Request Sense buffer 	(R) *
-   */
-} WINE_PACKED ;
-
-typedef struct SRB_ExecSCSICmd16 SRB_ExecSCSICmd16;
-
-struct SRB_ExecSCSICmd32 {
-  BYTE        SRB_Cmd;            /* ASPI command code = SC_EXEC_SCSI_CMD */
-  BYTE        SRB_Status;         /* ASPI command status byte */
-  BYTE        SRB_HaId;           /* ASPI host adapter number */
-  BYTE        SRB_Flags;          /* ASPI request flags */
-  DWORD       SRB_Hdr_Rsvd;       /* Reserved */
-  BYTE        SRB_Target;         /* Target's SCSI ID */
-  BYTE        SRB_Lun;            /* Target's LUN number */
-  WORD        SRB_Rsvd1;          /* Reserved for Alignment */
-  DWORD       SRB_BufLen;         /* Data Allocation Length */
-  BYTE        *SRB_BufPointer;    /* Data Buffer Point */
-  BYTE        SRB_SenseLen;       /* Sense Allocation Length */
-  BYTE        SRB_CDBLen;         /* CDB Length */
-  BYTE        SRB_HaStat;         /* Host Adapter Status */
-  BYTE        SRB_TargStat;       /* Target Status */
-  void        (*SRB_PostProc)();  /* Post routine */
-  void        *SRB_Rsvd2;         /* Reserved */
-  BYTE        SRB_Rsvd3[16];      /* Reserved for expansion */
-  BYTE        CDBByte[16];        /* SCSI CDB */
-  BYTE        SenseArea[0];       /* Request sense buffer - var length */
+/* Just a container for seeing what devices are open */
+struct ASPI_DEVICE_INFO {
+    struct ASPI_DEVICE_INFO *   next;
+    int                         fd;
+    int                         hostId;
+    int                         target;
+    int                         lun;
 };
 
-typedef struct SRB_ExecSCSICmd32 SRB_ExecSCSICmd32;
-
-struct SRB_Abort16 {
-  BYTE        SRB_Cmd;            /* ASPI command code = SC_ABORT_SRB */
-  BYTE        SRB_Status;         /* ASPI command status byte */
-  BYTE        SRB_HaId;           /* ASPI host adapter number */
-  BYTE        SRB_Flags;          /* ASPI request flags */
-  DWORD       SRB_Hdr_Rsvd;       /* Reserved, MUST = 0 */
-  LPSRB16     SRB_ToAbort;        /* Pointer to SRB to abort */
-} WINE_PACKED;
-
-typedef struct SRB_Abort16 SRB_Abort16;
-
-struct SRB_BusDeviceReset16 {
-  BYTE        SRB_Cmd;            /* ASPI command code = SC_RESET_DEV */
-  BYTE        SRB_Status;         /* ASPI command status byte */
-  BYTE        SRB_HaId;           /* ASPI host adapter number */
-  BYTE        SRB_Flags;          /* ASPI request flags */
-  DWORD       SRB_Hdr_Rsvd;       /* Reserved, MUST = 0 */
-  BYTE        SRB_Target;         /* Target's SCSI ID */
-  BYTE        SRB_Lun;            /* Target's LUN number */
-  BYTE        SRB_ResetRsvd1[14]; /* Reserved, MUST = 0 */
-  BYTE        SRB_HaStat;         /* Host Adapter Status */
-  BYTE        SRB_TargStat;       /* Target Status */
-  SEGPTR      SRB_PostProc;       /* Post routine */
-  BYTE        SRB_ResetRsvd2[34]; /* Reserved, MUST = 0 */
-} WINE_PACKED;
-
-typedef struct SRB_BusDeviceReset16 SRB_BusDeviceReset16;
-
-struct SRB_GDEVBlock16 {
-  BYTE        SRB_Cmd;            /* ASPI command code = SC_GET_DEV_TYPE */
-  BYTE        SRB_Status;         /* ASPI command status byte */
-  BYTE        SRB_HaId;           /* ASPI host adapter number */
-  BYTE        SRB_Flags;          /* ASPI request flags */
-  DWORD       SRB_Hdr_Rsvd;       /* Reserved, MUST = 0 */
-  BYTE        SRB_Target;         /* Target's SCSI ID */
-  BYTE        SRB_Lun;            /* Target's LUN number */
-  BYTE        SRB_DeviceType;     /* Target's peripheral device type */
-} WINE_PACKED;
-
-typedef struct SRB_GDEVBlock16 SRB_GDEVBlock16;
-
-
-
-struct SRB_Common16 {
-  BYTE	SRB_cmd;
-};
-
-
-typedef struct SRB_Common16 SRB_Common16;
-
-
-union SRB16 {
-  SRB_Common16		common;
-  SRB_HaInquiry16	inquiry;
-  SRB_ExecSCSICmd16	cmd;
-  SRB_Abort16		abort;
-  SRB_BusDeviceReset16	reset;
-  SRB_GDEVBlock16	devtype;
-};
-
-typedef union SRB16 SRB16;
-
-
-
+typedef struct ASPI_DEVICE_INFO ASPI_DEVICE_INFO;
+static ASPI_DEVICE_INFO *ASPI_open_devices = NULL;
 
 #endif
diff --git a/include/authors.h b/include/authors.h
index 8481837..e930c97 100644
--- a/include/authors.h
+++ b/include/authors.h
@@ -30,6 +30,7 @@
     "Carsten Fallesen",
     "Paul Falstad",
     "David Faure",
+    "Wesley Filardo",
     "Claus Fischer",
     "Olaf Flebbe",
     "Chad Fraleigh",
@@ -47,6 +48,7 @@
     "Jochen Hoenicke",
     "Onno Hovers",
     "Jeffrey Hsu",
+    "Peter Hunnisett",
     "Miguel de Icaza",
     "Jukka Iivonen",
     "Lee Jaekil",
@@ -89,6 +91,7 @@
     "Dimitrie O. Paun",
     "Jim Peterson",
     "Robert Pouliot",
+    "Petter Reinholdtsen",
     "Keith Reynolds",
     "Slaven Rezic",
     "John Richardson",
diff --git a/include/commctrl.h b/include/commctrl.h
index 4d41405..cf72b0c 100644
--- a/include/commctrl.h
+++ b/include/commctrl.h
@@ -415,26 +415,27 @@
 #define HDM_GETITEMCOUNT        (HDM_FIRST+0)
 #define HDM_INSERTITEM32A       (HDM_FIRST+1)
 #define HDM_INSERTITEM32W       (HDM_FIRST+10)
-#define HDM_INSERTITEM WINELIB_NAME_AW(HDM_INSERTITEM)
+#define HDM_INSERTITEM		WINELIB_NAME_AW(HDM_INSERTITEM)
 #define HDM_DELETEITEM          (HDM_FIRST+2)
 #define HDM_GETITEM32A          (HDM_FIRST+3)
 #define HDM_GETITEM32W          (HDM_FIRST+11)
-#define HDM_GETITEM WINELIB_NAME_AW(HDM_GETITEM)
+#define HDM_GETITEM		WINELIB_NAME_AW(HDM_GETITEM)
 #define HDM_SETITEM32A          (HDM_FIRST+4)
 #define HDM_SETITEM32W          (HDM_FIRST+12)
-#define HDM_SETITEM WINELIB_NAME_AW(HDM_SETITEM)
+#define HDM_SETITEM		WINELIB_NAME_AW(HDM_SETITEM)
 #define HDM_LAYOUT              (HDM_FIRST+5)
 #define HDM_HITTEST             (HDM_FIRST+6)
 #define HDM_GETITEMRECT         (HDM_FIRST+7)
 #define HDM_SETIMAGELIST        (HDM_FIRST+8)
 #define HDM_GETIMAGELIST        (HDM_FIRST+9)
 
-
 #define HDM_ORDERTOINDEX        (HDM_FIRST+15)
 #define HDM_CREATEDRAGIMAGE     (HDM_FIRST+16)
 #define HDM_GETORDERARRAY       (HDM_FIRST+17)
 #define HDM_SETORDERARRAY       (HDM_FIRST+18)
 #define HDM_SETHOTDIVIDER       (HDM_FIRST+19)
+#define HDM_GETUNICODEFORMAT    CCM_GETUNICODEFORMAT
+#define HDM_SETUNICODEFORMAT    CCM_SETUNICODEFORMAT
 
 #define HDN_FIRST               (0U-300U)
 #define HDN_LAST                (0U-399U)
@@ -468,7 +469,6 @@
 #define HDN_BEGINDRACK          (HDN_FIRST-10)
 #define HDN_ENDDRACK            (HDN_FIRST-11)
 
-
 typedef struct _HD_LAYOUT
 {
     RECT32      *prc;
@@ -477,7 +477,7 @@
 
 #define HD_LAYOUT   HDLAYOUT
 
-typedef struct _HD_ITEMA
+typedef struct _HD_ITEM32A
 {
     UINT32    mask;
     INT32     cxy;
@@ -490,7 +490,7 @@
     INT32     iOrder;
 } HDITEM32A, *LPHDITEM32A;
 
-typedef struct _HD_ITEMW
+typedef struct _HD_ITEM32W
 {
     UINT32    mask;
     INT32     cxy;
@@ -519,48 +519,91 @@
 
 #define HD_HITTESTINFO   HDHITTESTINFO
 
-typedef struct tagNMHEADERA
+typedef struct tagNMHEADER32A
 {
     NMHDR     hdr;
     INT32     iItem;
     INT32     iButton;
     HDITEM32A *pitem;
-} NMHEADERA, *LPNMHEADERA;
+} NMHEADER32A, *LPNMHEADER32A;
 
-#ifndef __WINE__
+typedef struct tagNMHEADER32W
+{
+    NMHDR     hdr;
+    INT32     iItem;
+    INT32     iButton;
+    HDITEM32W *pitem;
+} NMHEADER32W, *LPNMHEADER32W;
+
+#define NMHEADER		WINELIB_NAME_AW(NMHEADER)
+#define LPNMHEADER		WINELIB_NAME_AW(LPNMHEADER)
+
+typedef struct tagNMHDDISPINFO32A
+{
+    NMHDR     hdr;
+    INT32     iItem;
+    UINT32    mask;
+    LPSTR     pszText;
+    INT32     cchTextMax;
+    INT32     iImage;
+    LPARAM    lParam;
+} NMHDDISPINFO32A, *LPNMHDDISPINFO32A;
+
+typedef struct tagNMHDDISPINFO32W
+{
+    NMHDR     hdr;
+    INT32     iItem;
+    UINT32    mask;
+    LPWSTR    pszText;
+    INT32     cchTextMax;
+    INT32     iImage;
+    LPARAM    lParam;
+} NMHDDISPINFO32W, *LPNMHDDISPINFO32W;
+
+#define NMHDDISPINFO		WINELIB_NAME_AW(NMHDDISPINFO)
+#define LPNMHDDISPINFO		WINELIB_NAME_AW(LPNMHDDISPINFO)
+
 #define Header_GetItemCount(hwndHD) \
-  (INT32)SNDMSG((hwndHD),HDM_GETITEMCOUNT,0,0L)
-#define Header_InsertItem(hwndHD,i,phdi) \
-  (INT32)SNDMSG((hwndHD),HDM_INSERTITEM,(WPARAM32)(INT32)(i),(LPARAM)(const HDITEM *)(phdi))
+  (INT32)SendMessage32A((hwndHD),HDM_GETITEMCOUNT,0,0L)
+#define Header_InsertItem32A(hwndHD,i,phdi) \
+  (INT32)SendMessage32A((hwndHD),HDM_INSERTITEM32A,(WPARAM32)(INT32)(i),(LPARAM)(const HDITEM32A*)(phdi))
+#define Header_InsertItem32W(hwndHD,i,phdi) \
+  (INT32)SendMessage32W((hwndHD),HDM_INSERTITEM32W,(WPARAM32)(INT32)(i),(LPARAM)(const HDITEM32W*)(phdi))
+#define Header_InsertItem WINELIB_NAME_AW(Header_InsertItem)
 #define Header_DeleteItem(hwndHD,i) \
-  (BOOL32)SNDMSG((hwndHD),HDM_DELETEITEM,(WPARAM32)(INT32)(i),0L)
-#define Header_GetItem(hwndHD,i,phdi) \
-  (BOOL32)SNDMSG((hwndHD),HDM_GETITEM,(WPARAM32)(INT32)(i),(LPARAM)(HDITEM *)(phdi))
-#define Header_SetItem(hwndHD,i,phdi) \
-  (BOOL32)SNDMSG((hwndHD),HDM_SETITEM,(WPARAM32)(INT32)(i),(LPARAM)(const HDITEM *)(phdi))
+  (BOOL32)SendMessage32A((hwndHD),HDM_DELETEITEM,(WPARAM32)(INT32)(i),0L)
+#define Header_GetItem32A(hwndHD,i,phdi) \
+  (BOOL32)SendMessage32A((hwndHD),HDM_GETITEM32A,(WPARAM32)(INT32)(i),(LPARAM)(HDITEM32A*)(phdi))
+#define Header_GetItem32W(hwndHD,i,phdi) \
+  (BOOL32)SendMessage32W((hwndHD),HDM_GETITEM32W,(WPARAM32)(INT32)(i),(LPARAM)(HDITEM32W*)(phdi))
+#define Header_GetItem WINELIB_NAME_AW(Header_GetItem)
+#define Header_SetItem32A(hwndHD,i,phdi) \
+  (BOOL32)SendMessage32A((hwndHD),HDM_SETITEM32A,(WPARAM32)(INT32)(i),(LPARAM)(const HDITEM32A*)(phdi))
+#define Header_SetItem32W(hwndHD,i,phdi) \
+  (BOOL32)SendMessage32W((hwndHD),HDM_SETITEM32W,(WPARAM32)(INT32)(i),(LPARAM)(const HDITEM32W*)(phdi))
+#define Header_SetItem WINELIB_NAME_AW(Header_SetItem)
 #define Header_Layout(hwndHD,playout) \
-  (BOOL32)SNDMSG((hwndHD),HDM_LAYOUT,0,(LPARAM)(LPHDLAYOUT)(playout))
+  (BOOL32)SendMessage32A((hwndHD),HDM_LAYOUT,0,(LPARAM)(LPHDLAYOUT)(playout))
 #define Header_GetItemRect(hwnd,iItem,lprc) \
-  (BOOL32)SNDMSG((hwnd),HDM_GETITEMRECT,(WPARAM32)iItem,(LPARAM)lprc)
+  (BOOL32)SendMessage32A((hwnd),HDM_GETITEMRECT,(WPARAM32)iItem,(LPARAM)lprc)
 #define Header_SetImageList(hwnd,himl) \
-  (HIMAGELIST)SNDMSG((hwnd),HDM_SETIMAGELIST,0,(LPARAM)himl)
+  (HIMAGELIST)SendMessage32A((hwnd),HDM_SETIMAGELIST,0,(LPARAM)himl)
 #define Header_GetImageList(hwnd) \
-  (HIMAGELIST)SNDMSG((hwnd),HDM_GETIMAGELIST,0,0)
+  (HIMAGELIST)SendMessage32A((hwnd),HDM_GETIMAGELIST,0,0)
 #define Header_OrderToIndex(hwnd,i) \
-  (INT32)SNDMSG((hwnd),HDM_ORDERTOINDEX,(WPARAM32)i,0)
+  (INT32)SendMessage32A((hwnd),HDM_ORDERTOINDEX,(WPARAM32)i,0)
 #define Header_CreateDragImage(hwnd,i) \
-  (HIMAGELIST)SNDMSG((hwnd),HDM_CREATEDRAGIMAGE,(WPARAM32)i,0)
+  (HIMAGELIST)SendMessage32A((hwnd),HDM_CREATEDRAGIMAGE,(WPARAM32)i,0)
 #define Header_GetOrderArray(hwnd,iCount,lpi) \
-  (BOOL32)SNDMSG((hwnd),HDM_GETORDERARRAY,(WPARAM32)iCount,(LPARAM)lpi)
+  (BOOL32)SendMessage32A((hwnd),HDM_GETORDERARRAY,(WPARAM32)iCount,(LPARAM)lpi)
 #define Header_SetOrderArray(hwnd,iCount,lpi) \
-  (BOOL32)SNDMSG((hwnd),HDM_SETORDERARRAY,(WPARAM32)iCount,(LPARAM)lpi)
+  (BOOL32)SendMessage32A((hwnd),HDM_SETORDERARRAY,(WPARAM32)iCount,(LPARAM)lpi)
 #define Header_SetHotDivider(hwnd,fPos,dw) \
-  (INT32)SNDMSG((hwnd),HDM_SETHOTDIVIDER,(WPARAM32)fPos,(LPARAM)dw)
+  (INT32)SendMessage32A((hwnd),HDM_SETHOTDIVIDER,(WPARAM32)fPos,(LPARAM)dw)
 #define Header_SetUnicodeFormat(hwnd,fUnicode) \
-  (BOOL32)SNDMSG((hwnd),HDM_SETUNICODEFORMAT,(WPARAM32)(fUnicode),0)
+  (BOOL32)SendMessage32A((hwnd),HDM_SETUNICODEFORMAT,(WPARAM32)(fUnicode),0)
 #define Header_GetUnicodeFormat(hwnd) \
-  (BOOL32)SNDMSG((hwnd),HDM_GETUNICODEFORMAT,0,0)
-#endif /* #ifndef __WINE__ */
+  (BOOL32)SendMessage32A((hwnd),HDM_GETUNICODEFORMAT,0,0)
 
 
 /* Toolbar */
@@ -602,7 +645,8 @@
 #define TBIF_LPARAM             0x00000010
 #define TBIF_COMMAND            0x00000020
 #define TBIF_SIZE               0x00000040
- 
+
+#define TBBF_LARGE		0x0001 
 
 #define TB_ENABLEBUTTON          (WM_USER+1)
 #define TB_CHECKBUTTON           (WM_USER+2)
@@ -1342,6 +1386,330 @@
 #define TVN_FIRST               (0U-400U)
 #define TVN_LAST                (0U-499U)
 
+#define TVN_SELCHANGING         (TVN_FIRST-1)
+#define TVN_SELCHANGED          (TVN_FIRST-2)
+#define TVN_GETDISPINFO         (TVN_FIRST-3)
+#define TVN_SETDISPINFO         (TVN_FIRST-4)
+#define TVN_ITEMEXPANDING       (TVN_FIRST-5)
+#define TVN_ITEMEXPANDED        (TVN_FIRST-6)
+#define TVN_BEGINDRAG           (TVN_FIRST-7)
+#define TVN_BEGINRDRAG          (TVN_FIRST-8)
+#define TVN_DELETEITEM          (TVN_FIRST-9)
+#define TVN_BEGINLABELEDIT      (TVN_FIRST-10)
+#define TVN_ENDLABELEDIT        (TVN_FIRST-11)
+#define TVN_KEYDOWN             (TVN_FIRST-12)
+#define TVN_GETINFOTIPA         (TVN_FIRST-13)
+#define TVN_GETINFOTIPW         (TVN_FIRST-14)
+#define TVN_SINGLEEXPAND        (TVN_FIRST-15)
+
+
+#define TVN_SELCHANGINGW        (TVN_FIRST-50)
+#define TVN_SELCHANGEDW         (TVN_FIRST-51)
+#define TVN_GETDISPINFOW        (TVN_FIRST-52)
+#define TVN_SETDISPINFOW        (TVN_FIRST-53)
+#define TVN_ITEMEXPANDINGW      (TVN_FIRST-54)
+#define TVN_ITEMEXPANDEDW       (TVN_FIRST-55)
+#define TVN_BEGINDRAGW          (TVN_FIRST-56)
+#define TVN_BEGINRDRAGW         (TVN_FIRST-57)
+#define TVN_DELETEITEMW         (TVN_FIRST-58)
+#define TVN_BEGINLABELEDITW     (TVN_FIRST-59)
+#define TVN_ENDLABELEDITW       (TVN_FIRST-60)
+
+
+
+#define TVIF_TEXT             0x0001
+#define TVIF_IMAGE            0x0002
+#define TVIF_PARAM            0x0004
+#define TVIF_STATE            0x0008
+#define TVIF_HANDLE           0x0010
+#define TVIF_SELECTEDIMAGE    0x0020
+#define TVIF_CHILDREN         0x0040
+#define TVIF_INTEGRAL         0x0080
+#define TVIF_DI_SETITEM		  0x1000
+
+#define TVI_ROOT              0xffff0000      /* -65536 */
+#define TVI_FIRST             0xffff0001      /* -65535 */
+#define TVI_LAST              0xffff0002      /* -65534 */
+#define TVI_SORT              0xffff0003      /* -65533 */
+
+#define TVIS_FOCUSED          0x0001
+#define TVIS_SELECTED         0x0002
+#define TVIS_CUT              0x0004
+#define TVIS_DROPHILITED      0x0008
+#define TVIS_BOLD             0x0010
+#define TVIS_EXPANDED         0x0020
+#define TVIS_EXPANDEDONCE     0x0040
+#define TVIS_OVERLAYMASK      0x0f00
+#define TVIS_STATEIMAGEMASK   0xf000
+#define TVIS_USERMASK         0xf000
+
+#define TVHT_NOWHERE          0x0001
+#define TVHT_ONITEMICON       0x0002
+#define TVHT_ONITEMLABEL      0x0004
+#define TVHT_ONITEMINDENT     0x0008
+#define TVHT_ONITEMBUTTON     0x0010
+#define TVHT_ONITEMRIGHT      0x0020
+#define TVHT_ONITEMSTATEICON  0x0040
+#define TVHT_ONITEM           0x0046
+#define TVHT_ABOVE            0x0100
+#define TVHT_BELOW            0x0200
+#define TVHT_TORIGHT          0x0400
+#define TVHT_TOLEFT           0x0800
+
+#define TVS_HASBUTTONS        0x0001
+#define TVS_HASLINES          0x0002
+#define TVS_LINESATROOT       0x0004
+#define TVS_EDITLABELS        0x0008
+#define TVS_DISABLEDRAGDROP   0x0010
+#define TVS_SHOWSELALWAYS     0x0020
+#define TVS_RTLREADING        0x0040
+#define TVS_NOTOOLTIPS        0x0080
+#define TVS_CHECKBOXES        0x0100
+#define TVS_TRACKSELECT       0x0200
+#define TVS_SINGLEEXPAND 	  0x0400
+#define TVS_INFOTIP      	  0x0800
+#define TVS_FULLROWSELECT	  0x1000
+#define TVS_NOSCROLL     	  0x2000
+#define TVS_NONEVENHEIGHT	  0x4000
+
+#define TVS_SHAREDIMAGELISTS  0x0000
+#define TVS_PRIVATEIMAGELISTS 0x0400
+
+
+#define TVE_COLLAPSE          0x0001
+#define TVE_EXPAND            0x0002
+#define TVE_TOGGLE            0x0003
+#define TVE_EXPANDPARTIAL     0x4000
+#define TVE_COLLAPSERESET     0x8000
+
+#define TVGN_ROOT             0
+#define TVGN_NEXT             1
+#define TVGN_PREVIOUS         2
+#define TVGN_PARENT           3
+#define TVGN_CHILD            4
+#define TVGN_FIRSTVISIBLE     5
+#define TVGN_NEXTVISIBLE      6
+#define TVGN_PREVIOUSVISIBLE  7
+#define TVGN_DROPHILITE       8
+#define TVGN_CARET            9
+#define TVGN_LASTVISIBLE      10
+
+#define TVC_UNKNOWN           0x00
+#define TVC_BYMOUSE           0x01
+#define TVC_BYKEYBOARD        0x02
+
+
+typedef HANDLE32 HTREEITEM;
+
+typedef struct {
+      UINT32 mask;
+      HTREEITEM hItem;
+      UINT32 state;
+      UINT32 stateMask;
+      LPSTR pszText;
+      int cchTextMax;
+      int iImage;
+      int iSelectedImage;
+      int cChildren;
+      LPARAM lParam;
+} TV_ITEM, *LPTVITEM;
+
+typedef struct {
+      UINT32 mask;
+      HTREEITEM hItem;
+      UINT32 state;
+      UINT32 stateMask;
+      LPSTR pszText;
+      int cchTextMax;
+      int iImage;
+      int iSelectedImage;
+      int cChildren;
+      LPARAM lParam;
+      int iIntegral;
+} TV_ITEMEX, *LPTVITEMEX;
+
+#define TVITEM TV_ITEM
+
+
+
+typedef struct tagTVINSERTSTRUCT {
+        HTREEITEM hParent;
+        HTREEITEM hInsertAfter;
+        TV_ITEM item;
+} TVINSERTSTRUCT, *LPTVINSERTSTRUCT;
+
+typedef struct tagNMTREEVIEW {
+	NMHDR	hdr;
+	UINT32	action;
+	TVITEM	itemOld;
+	TVITEM	itemNew;
+	POINT32	ptDrag;
+} NMTREEVIEW, *LPNMTREEVIEW;
+
+typedef struct tagTVDISPINFO {
+	NMHDR	hdr;
+	TVITEM	item;
+} NMTVDISPINFO, *LPNMTVDISPINFO;
+
+
+
+typedef struct tagTVHITTESTINFO {
+        POINT32 pt;
+        UINT32 flags;
+        HTREEITEM hItem;
+} TVHITTESTINFO, *LPTVHITTESTINFO;
+
+
+#define TreeView_InsertItem(hwndHD, phdi) \
+  (INT32)SendMessage32A((hwnd), TVM_INSERTITEM, 0, \
+                            (LPARAM)(LPTV_INSERTSTRUCT)(phdi))
+#define TreeView_DeleteItem(hwnd, hItem) \
+  (BOOL32)SendMessage32A((hwnd), TVM_DELETEITEM, 0, (LPARAM)(HTREEITEM)(hItem))
+#define TreeView_DeleteAllItems(hwnd) \
+  (BOOL32)SendMessage32A((hwnd), TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT)
+#define TreeView_Expand(hwnd, hitem, code) \
+ (BOOL32)SendMessage32A((hwnd), TVM_EXPAND, (WPARAM)code, \
+	(LPARAM)(HTREEITEM)(hitem))
+
+#define TreeView_GetItemRect(hwnd, hitem, prc, code) \
+ (*(HTREEITEM *)prc = (hitem), (BOOL)SendMessage32A((hwnd), \
+			TVM_GETITEMRECT, (WPARAM32)(code), (LPARAM)(RECT *)(prc)))
+
+#define TreeView_GetCount(hwnd) \
+    (UINT32)SendMessage32A((hwnd), TVM_GETCOUNT, 0, 0)
+#define TreeView_GetIndent(hwnd) \
+    (UINT32)SendMessage32A((hwnd), TVM_GETINDENT, 0, 0)
+#define TreeView_SetIndent(hwnd, indent) \
+    (BOOL32)SendMessage32A((hwnd), TVM_SETINDENT, (WPARAM)indent, 0)
+
+#define TreeView_GetImageList(hwnd, iImage) \
+    (HIMAGELIST)SendMessage32A((hwnd), TVM_GETIMAGELIST, iImage, 0)
+
+#define TreeView_SetImageList(hwnd, himl, iImage) \
+    (HIMAGELIST)SendMessage32A((hwnd), TVM_SETIMAGELIST, iImage, \
+ (LPARAM)(UINT32)(HIMAGELIST)(himl))
+
+#define TreeView_GetNextItem(hwnd, hitem, code) \
+    (HTREEITEM)SendMessage32A((hwnd), TVM_GETNEXTITEM, (WPARAM)code,\
+(LPARAM)(HTREEITEM) (hitem))
+
+#define TreeView_GetChild(hwnd, hitem) \
+	 	 TreeView_GetNextItem(hwnd, hitem , TVGN_CHILD)
+#define TreeView_GetNextSibling(hwnd, hitem) \
+		TreeView_GetNextItem(hwnd, hitem , TVGN_NEXT)
+#define TreeView_GetPrevSibling(hwnd, hitem) \
+		TreeView_GetNextItem(hwnd, hitem , TVGN_PREVIOUS)
+#define TreeView_GetParent(hwnd, hitem) \
+		TreeView_GetNextItem(hwnd, hitem , TVGN_PARENT)
+#define TreeView_GetFirstVisible(hwnd)  \
+		TreeView_GetNextItem(hwnd, NULL, TVGN_FIRSTVISIBLE)
+#define TreeView_GetLastVisible(hwnd)   \
+		TreeView_GetNextItem(hwnd, NULL, TVGN_LASTVISIBLE)
+#define TreeView_GetNextVisible(hwnd, hitem) \
+		TreeView_GetNextItem(hwnd, hitem , TVGN_NEXTVISIBLE)
+#define TreeView_GetPrevVisible(hwnd, hitem) \
+		TreeView_GetNextItem(hwnd, hitem , TVGN_PREVIOUSVISIBLE)
+#define TreeView_GetSelection(hwnd) \
+		TreeView_GetNextItem(hwnd, NULL, TVGN_CARET)
+#define TreeView_GetDropHilight(hwnd) \
+		TreeView_GetNextItem(hwnd, NULL, TVGN_DROPHILITE)
+#define TreeView_GetRoot(hwnd) \
+		TreeView_GetNextItem(hwnd, NULL, TVGN_ROOT)
+#define TreeView_GetLastVisible(hwnd) \
+		TreeView_GetNextItem(hwnd, NULL, TVGN_LASTVISIBLE)
+
+
+#define TreeView_Select(hwnd, hitem, code) \
+ (UINT32)SendMessage32A((hwnd), TVM_SELECTITEM, (WPARAM)code, \
+(LPARAM)(UINT32)(hitem))
+
+
+#define TreeView_SelectItem(hwnd, hitem) \
+		TreeView_Select(hwnd, hitem, TVGN_CARET)
+#define TreeView_SelectDropTarget(hwnd, hitem) \
+        	TreeView_Select(hwnd, hitem, TVGN_DROPHILITE)
+/* FIXME
+#define TreeView_SelectSetFirstVisible(hwnd, hitem)  \ 
+		TreeView_Select(hwnd, hitem, TVGN_FIRSTVISIBLE)
+*/
+
+#define TreeView_GetItem(hwnd, pitem) \
+ (BOOL32)SendMessage32A((hwnd), TVM_GETITEM, 0, (LPARAM) (TV_ITEM *)(pitem))
+
+#define TreeView_SetItem(hwnd, pitem) \
+ (BOOL32)SendMessage32A((hwnd), TVM_SETITEM, 0, (LPARAM)(const TV_ITEM *)(pitem)) 
+
+#define TreeView_EditLabel(hwnd, hitem) \
+    (HWND)SendMessage32A((hwnd), TVM_EDITLABEL, 0, (LPARAM)(HTREEITEM)(hitem))
+
+
+#define TreeView_GetEditControl(hwnd) \
+    (HWND)SendMessage32A((hwnd), TVM_GETEDITCONTROL, 0, 0)
+
+#define TreeView_GetVisibleCount(hwnd) \
+    (UINT32)SendMessage32A((hwnd), TVM_GETVISIBLECOUNT, 0, 0)
+
+#define TreeView_HitTest(hwnd, lpht) \
+    (HTREEITEM)SendMessage32A((hwnd), TVM_HITTEST, 0,\
+(LPARAM)(LPTV_HITTESTINFO)(lpht))
+
+#define TreeView_CreateDragImage(hwnd, hitem) \
+    (HIMAGELIST)SendMessage32A((hwnd), TVM_CREATEDRAGIMAGE, 0,\
+(LPARAM)(HTREEITEM)(hitem))
+
+#define TreeView_SortChildren(hwnd, hitem, recurse) \
+    (BOOL)SendMessage32A((hwnd), TVM_SORTCHILDREN, (WPARAM)recurse,\
+(LPARAM)(HTREEITEM)(hitem))
+
+#define TreeView_EnsureVisible(hwnd, hitem) \
+    (BOOL)SendMessage32A((hwnd), TVM_ENSUREVISIBLE, 0, (LPARAM)(UINT32)(hitem))
+
+#define TreeView_SortChildrenCB(hwnd, psort, recurse) \
+    (BOOL)SendMessage32A((hwnd), TVM_SORTCHILDRENCB, (WPARAM)recurse, \
+    (LPARAM)(LPTV_SORTCB)(psort))
+
+#define TreeView_EndEditLabelNow(hwnd, fCancel) \
+    (BOOL)SendMessage32A((hwnd), TVM_ENDEDITLABELNOW, (WPARAM)fCancel, 0)
+
+#define TreeView_GetISearchString(hwndTV, lpsz) \
+    (BOOL)SendMessage32A((hwndTV), TVM_GETISEARCHSTRING, 0, \
+							(LPARAM)(LPTSTR)lpsz)
+
+#define TreeView_SetItemHeight(hwnd,  iHeight) \
+    (INT32)SendMessage32A((hwnd), TVM_SETITEMHEIGHT, (WPARAM)iHeight, 0)
+#define TreeView_GetItemHeight(hwnd) \
+    (INT32)SendMessage32A((hwnd), TVM_GETITEMHEIGHT, 0, 0)
+
+#define TreeView_SetBkColor(hwnd, clr) \
+    (COLORREF)SendMessage32A((hwnd), TVM_SETBKCOLOR, 0, (LPARAM)clr)
+
+#define TreeView_SetTextColor(hwnd, clr) \
+    (COLORREF)SendMessage32A((hwnd), TVM_SETTEXTCOLOR, 0, (LPARAM)clr)
+
+#define TreeView_GetBkColor(hwnd) \
+    (COLORREF)SendMessage32A((hwnd), TVM_GETBKCOLOR, 0, 0)
+
+#define TreeView_GetTextColor(hwnd) \
+    (COLORREF)SendMessage32A((hwnd), TVM_GETTEXTCOLOR, 0, 0)
+
+#define TreeView_SetScrollTime(hwnd, uTime) \
+    (UINT32)SendMessage32A((hwnd), TVM_SETSCROLLTIME, uTime, 0)
+
+#define TreeView_GetScrollTime(hwnd) \
+    (UINT32)SendMessage32A((hwnd), TVM_GETSCROLLTIME, 0, 0)
+
+#define TreeView_SetInsertMarkColor(hwnd, clr) \
+    (COLORREF)SendMessage32A((hwnd), TVM_SETINSERTMARKCOLOR, 0, (LPARAM)clr)
+#define TreeView_GetInsertMarkColor(hwnd) \
+    (COLORREF)SendMessage32A((hwnd), TVM_GETINSERTMARKCOLOR, 0, 0)
+
+
+
+
+
+
+
+
 
 /* Listview control */
 
@@ -1456,14 +1824,63 @@
 #define LVM_INSERTCOLUMN        WINELIB_NAME_AW(LVM_INSERTCOLUMN)
 #define LVM_DELETECOLUMN        (LVM_FIRST+28)
 #define LVM_GETCOLUMNWIDTH      (LVM_FIRST+29)
-#define LVM_GETHEADER           (LVM_FIRST+30)
+#define LVM_SETCOLUMNWIDTH      (LVM_FIRST+30)
+#define LVM_GETHEADER           (LVM_FIRST+31)
 
+#define LVM_CREATEDRAGIMAGE     (LVM_FIRST+33)
+#define LVM_GETVIEWRECT         (LVM_FIRST+34)
+#define LVM_GETTEXTCOLOR        (LVM_FIRST+35)
+#define LVM_SETTEXTCOLOR        (LVM_FIRST+36)
+#define LVM_GETTEXTBKCOLOR      (LVM_FIRST+37)
+#define LVM_SETTEXTBKCOLOR      (LVM_FIRST+38)
+#define LVM_GETTOPINDEX         (LVM_FIRST+39)
+#define LVM_GETCOUNTPERPAGE     (LVM_FIRST+40)
+#define LVM_GETORIGIN           (LVM_FIRST+41)
+#define LVM_UPDATE              (LVM_FIRST+42)
+#define LVM_SETITEMSTATE        (LVM_FIRST+43)
+#define LVM_GETITEMSTATE        (LVM_FIRST+44)
+#define LVM_GETITEMTEXT32A      (LVM_FIRST+45)
+#define LVM_GETITEMTEXT32W      (LVM_FIRST+115)
+#define LVM_GETITEMTEXT         WINELIB_NAME_AW(LVM_GETITEMTEXT)
+#define LVM_SETITEMTEXT32A      (LVM_FIRST+46)
+#define LVM_SETITEMTEXT32W      (LVM_FIRST+116)
+#define LVM_SETITEMTEXT         WINELIB_NAME_AW(LVM_SETITEMTEXT)
+#define LVM_SETITEMCOUNT        (LVM_FIRST+47)
 #define LVM_SORTITEMS           (LVM_FIRST+48)
+#define LVM_SETITEMPOSITION32   (LVM_FIRST+49)
 #define LVM_GETSELECTEDCOUNT    (LVM_FIRST+50)
-
+#define LVM_GETITEMSPACING      (LVM_FIRST+51)
+#define LVM_GETISEARCHSTRING32A (LVM_FIRST+52)
+#define LVM_GETISEARCHSTRING32W (LVM_FIRST+117)
+#define LVM_GETISEARCHSTRING    WINELIB_NAME_AW(LVM_GETISEARCHSTRING)
+#define LVM_SETICONSPACING      (LVM_FIRST+53)
 #define LVM_SETEXTENDEDLISTVIEWSTYLE (LVM_FIRST+54)
 #define LVM_GETEXTENDEDLISTVIEWSTYLE (LVM_FIRST+55)
+#define LVM_GETSUBITEMRECT      (LVM_FIRST+56)
+#define LVM_SUBITEMHITTEST      (LVM_FIRST+57)
+#define LVM_SETCOLUMNORDERARRAY (LVM_FIRST+58)
+#define LVM_GETCOLUMNORDERARRAY (LVM_FIRST+59)
+#define LVM_SETHOTITEM          (LVM_FIRST+60)
+#define LVM_GETHOTITEM          (LVM_FIRST+61)
+#define LVM_SETHOTCURSOR        (LVM_FIRST+62)
+#define LVM_GETHOTCURSOR        (LVM_FIRST+63)
+#define LVM_APPROXIMATEVIEWRECT (LVM_FIRST+64)
+#define LVM_SETWORKAREAS        (LVM_FIRST+65)
+#define LVM_GETSELECTIONMARK    (LVM_FIRST+66)
+#define LVM_SETSELECTIONMARK    (LVM_FIRST+67)
+#define LVM_SETBKIMAGE32A       (LVM_FIRST+68)
+#define LVM_SETBKIMAGE32W       (LVM_FIRST+138)
+#define LVM_SETBKIMAGE          WINELIB_NAME_AW(LVM_SETBKIMAGE)
+#define LVM_GETBKIMAGE32A       (LVM_FIRST+69)
+#define LVM_GETBKIMAGE32W       (LVM_FIRST+139)
+#define LVM_GETBKIMAGE          WINELIB_NAME_AW(LVM_GETBKIMAGE)
+#define LVM_GETWORKAREAS        (LVM_FIRST+70)
+#define LVM_SETHOVERTIME        (LVM_FIRST+71)
+#define LVM_GETHOVERTIME        (LVM_FIRST+72)
+#define LVM_GETNUMBEROFWORKAREAS (LVM_FIRST+73)
+#define LVM_SETTOOLTIPS         (LVM_FIRST+74)
 
+#define LVM_GETTOOLTIPS         (LVM_FIRST+78)
 
 #define LVN_FIRST               (0U-100U)
 #define LVN_LAST                (0U-199U)
@@ -1747,22 +2164,29 @@
 #define ACN_START               1
 #define ACN_STOP                2
 
-#ifndef __WINE__
-#define Animate_Create(hwndP,id,dwStyle,hInstance) \
-    CreateWindow(ANIMATE_CLASS,NULL,dwStyle,0,0,0,0,hwndP,(HMENU32)(id),hInstance,NULL)
-#define Animate_Open(hwnd,szName) \
-    (BOOL32)SNDMSG(hwnd,ACM_OPEN,0,(LPARAM)(LPTSTR)(szName))
-#define Animate_OpenEx(hwnd,hInst,szName) \
-    (BOOL32)SNDMSG(hwnd,ACM_OPEN,(WPARAM32)hInst,(LPARAM)(LPTSTR)(szName))
+#define Animate_Create32A(hwndP,id,dwStyle,hInstance) \
+    CreateWindow32A(ANIMATE_CLASS32A,NULL,dwStyle,0,0,0,0,hwndP,(HMENU32)(id),hInstance,NULL)
+#define Animate_Create32W(hwndP,id,dwStyle,hInstance) \
+    CreateWindow32W(ANIMATE_CLASS32W,NULL,dwStyle,0,0,0,0,hwndP,(HMENU32)(id),hInstance,NULL)
+#define Animate_Create WINELIB_NAME_AW(Animate_Create)
+#define Animate_Open32A(hwnd,szName) \
+    (BOOL32)SendMessage32A(hwnd,ACM_OPEN32A,0,(LPARAM)(LPSTR)(szName))
+#define Animate_Open32W(hwnd,szName) \
+    (BOOL32)SendMessage32W(hwnd,ACM_OPEN32W,0,(LPARAM)(LPWSTR)(szName))
+#define Animate_Open WINELIB_NAME_AW(Animate_Open)
+#define Animate_OpenEx32A(hwnd,hInst,szName) \
+    (BOOL32)SendMessage32A(hwnd,ACM_OPEN32A,(WPARAM32)hInst,(LPARAM)(LPSTR)(szName))
+#define Animate_OpenEx32W(hwnd,hInst,szName) \
+    (BOOL32)SendMessage32W(hwnd,ACM_OPEN32W,(WPARAM32)hInst,(LPARAM)(LPWSTR)(szName))
+#define Animate_OpenEx WINELIB_NAME_AW(Animate_OpenEx)
 #define Animate_Play(hwnd,from,to,rep) \
-    (BOOL32)SNDMSG(hwnd,ACM_PLAY,(WPARAM32)(UINT32)(rep),(LPARAM)MAKELONG(from,to))
+    (BOOL32)SendMessage32A(hwnd,ACM_PLAY,(WPARAM32)(UINT32)(rep),(LPARAM)MAKELONG(from,to))
 #define Animate_Stop(hwnd) \
-    (BOOL32)SNDMSG(hwnd,ACM_STOP,0,0)
+    (BOOL32)SendMessage32A(hwnd,ACM_STOP,0,0)
 #define Animate_Close(hwnd) \
-    Animate_Open(hwnd,NULL)
+    (BOOL32)SendMessage32A(hwnd,ACM_OPEN32A,0,0)
 #define Animate_Seek(hwnd,frame) \
-    Animate_Play(hwnd,frame,frame,1)
-#endif  /* __WINE__ */
+    (BOOL32)SendMessage32A(hwnd,ACM_PLAY,1,(LPARAM)MAKELONG(frame,frame))
 
 
 
@@ -1778,6 +2202,14 @@
 DWORD  WINAPI COMCTL32_GetSize (LPVOID lpMem);
 
 
+INT32  WINAPI Str_GetPtr32A (LPCSTR lpSrc, LPSTR lpDest, INT32 nMaxLen);
+BOOL32 WINAPI Str_SetPtr32A (LPSTR *lppDest, LPCSTR lpSrc);
+INT32  WINAPI Str_GetPtr32W (LPCWSTR lpSrc, LPWSTR lpDest, INT32 nMaxLen);
+BOOL32 WINAPI Str_SetPtr32W (LPWSTR *lppDest, LPCWSTR lpSrc);
+#define Str_GetPtr WINELIB_NAME_AW(Str_GetPtr)
+#define Str_SetPtr WINELIB_NAME_AW(Str_SetPtr)
+
+
 /* Dynamic Storage Array */
 
 typedef struct _DSA
diff --git a/include/config.h.in b/include/config.h.in
index 73fc304..0fb133b 100644
--- a/include/config.h.in
+++ b/include/config.h.in
@@ -36,6 +36,9 @@
 /* Define if X libraries are not reentrant (compiled without -D_REENTRANT).  */
 #undef NO_REENTRANT_X11
 
+/* Define if libc is not reentrant  */
+#undef NO_REENTRANT_LIBC
+
 /* Define if all debug messages are to be compiled out */
 #undef NO_DEBUG_MSGS
 
@@ -161,3 +164,6 @@
 
 /* Define if you have the w library (-lw).  */
 #undef HAVE_LIBW
+
+/* Define if you have the xpg4 library (-lxpg4).  */
+#undef HAVE_LIBXPG4
diff --git a/include/ddraw.h b/include/ddraw.h
index db87666..9c20ee6 100644
--- a/include/ddraw.h
+++ b/include/ddraw.h
@@ -431,6 +431,14 @@
 #define DDCAPS2_CANFLIPODDEVEN		0x00002000
 #define DDCAPS2_CANBOBHARDWARE		0x00004000
 
+
+/* Set/Get Colour Key Flags */
+#define DDCKEY_COLORSPACE  0x00000001  /* Struct is ingle colour space */
+#define DDCKEY_DESTBLT     0x00000002  /* To be used as dest for blt */
+#define DDCKEY_DESTOVERLAY 0x00000004  /* To be used as dest for CK overlays */
+#define DDCKEY_SRCBLT      0x00000008  /* To be used as src for blt */
+#define DDCKEY_SRCOVERLAY  0x00000010  /* To be used as src for CK overlays */
+
 typedef struct _DDCOLORKEY
 {
 	DWORD	dwColorSpaceLowValue;/* low boundary of color space that is to
@@ -876,6 +884,7 @@
 struct _common_directdrawdata {
     DWORD			depth;
     DWORD			height,width;	/* SetDisplayMode */
+    HWND32                      mainWindow;     /* SetCooperativeLevel */
 };
 
 struct _dga_directdrawdata {
diff --git a/include/debug.h b/include/debug.h
index 971d472..2d279ac 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -59,32 +59,32 @@
 #define dbch_hotkey 51
 #define dbch_icon 52
 #define dbch_imagelist 53
-#define dbch_int 54
-#define dbch_int10 55
-#define dbch_int21 56
-#define dbch_int31 57
-#define dbch_key 58
-#define dbch_keyboard 59
-#define dbch_ldt 60
-#define dbch_listbox 61
-#define dbch_listview 62
-#define dbch_local 63
-#define dbch_mci 64
-#define dbch_mcianim 65
-#define dbch_mciwave 66
-#define dbch_mdi 67
-#define dbch_menu 68
-#define dbch_message 69
-#define dbch_metafile 70
-#define dbch_midi 71
-#define dbch_mmaux 72
-#define dbch_mmio 73
-#define dbch_mmsys 74
-#define dbch_mmtime 75
-#define dbch_module 76
-#define dbch_mpr 77
-#define dbch_msg 78
-#define dbch_msvideo 79
+#define dbch_imm 54
+#define dbch_int 55
+#define dbch_int10 56
+#define dbch_int21 57
+#define dbch_int31 58
+#define dbch_key 59
+#define dbch_keyboard 60
+#define dbch_ldt 61
+#define dbch_listbox 62
+#define dbch_listview 63
+#define dbch_local 64
+#define dbch_mci 65
+#define dbch_mcianim 66
+#define dbch_mciwave 67
+#define dbch_mdi 68
+#define dbch_menu 69
+#define dbch_message 70
+#define dbch_metafile 71
+#define dbch_midi 72
+#define dbch_mmaux 73
+#define dbch_mmio 74
+#define dbch_mmsys 75
+#define dbch_mmtime 76
+#define dbch_module 77
+#define dbch_mpr 78
+#define dbch_msg 79
 #define dbch_nonclient 80
 #define dbch_ntdll 81
 #define dbch_ole 82
@@ -96,54 +96,55 @@
 #define dbch_profile 88
 #define dbch_progress 89
 #define dbch_prop 90
-#define dbch_psdrv 91
-#define dbch_rebar 92
-#define dbch_reg 93
-#define dbch_region 94
-#define dbch_relay 95
-#define dbch_resource 96
-#define dbch_s 97
-#define dbch_scroll 98
-#define dbch_security 99
-#define dbch_segment 100
-#define dbch_selector 101
-#define dbch_sem 102
-#define dbch_sendmsg 103
-#define dbch_shell 104
-#define dbch_shm 105
-#define dbch_snoop 106
-#define dbch_sound 107
-#define dbch_static 108
-#define dbch_statusbar 109
-#define dbch_stress 110
-#define dbch_string 111
-#define dbch_syscolor 112
-#define dbch_system 113
-#define dbch_tab 114
-#define dbch_task 115
-#define dbch_text 116
-#define dbch_thread 117
-#define dbch_thunk 118
-#define dbch_timer 119
-#define dbch_toolbar 120
-#define dbch_toolhelp 121
-#define dbch_tooltips 122
-#define dbch_trackbar 123
-#define dbch_treeview 124
-#define dbch_tweak 125
-#define dbch_uitools 126
-#define dbch_updown 127
-#define dbch_ver 128
-#define dbch_virtual 129
-#define dbch_vxd 130
-#define dbch_win 131
-#define dbch_win16drv 132
-#define dbch_win32 133
-#define dbch_wing 134
-#define dbch_winsock 135
-#define dbch_wnet 136
-#define dbch_x11 137
-#define dbch_x11drv 138
+#define dbch_psapi 91
+#define dbch_psdrv 92
+#define dbch_rebar 93
+#define dbch_reg 94
+#define dbch_region 95
+#define dbch_relay 96
+#define dbch_resource 97
+#define dbch_s 98
+#define dbch_scroll 99
+#define dbch_security 100
+#define dbch_segment 101
+#define dbch_selector 102
+#define dbch_sem 103
+#define dbch_sendmsg 104
+#define dbch_shell 105
+#define dbch_shm 106
+#define dbch_snoop 107
+#define dbch_sound 108
+#define dbch_static 109
+#define dbch_statusbar 110
+#define dbch_stress 111
+#define dbch_string 112
+#define dbch_syscolor 113
+#define dbch_system 114
+#define dbch_tab 115
+#define dbch_task 116
+#define dbch_text 117
+#define dbch_thread 118
+#define dbch_thunk 119
+#define dbch_timer 120
+#define dbch_toolbar 121
+#define dbch_toolhelp 122
+#define dbch_tooltips 123
+#define dbch_trackbar 124
+#define dbch_treeview 125
+#define dbch_tweak 126
+#define dbch_uitools 127
+#define dbch_updown 128
+#define dbch_ver 129
+#define dbch_virtual 130
+#define dbch_vxd 131
+#define dbch_win 132
+#define dbch_win16drv 133
+#define dbch_win32 134
+#define dbch_wing 135
+#define dbch_winsock 136
+#define dbch_wnet 137
+#define dbch_x11 138
+#define dbch_x11drv 139
 /* Definitions for classes identifiers */
 #define dbcl_fixme 0
 #define dbcl_err 1
diff --git a/include/debugdefs.h b/include/debugdefs.h
index 7ff6fd7..104fbb0 100644
--- a/include/debugdefs.h
+++ b/include/debugdefs.h
@@ -4,7 +4,7 @@
 #include "debugtools.h"
 #endif
 
-#define DEBUG_CHANNEL_COUNT 139
+#define DEBUG_CHANNEL_COUNT 140
 #ifdef DEBUG_RUNTIME
 short debug_msg_enabled[][DEBUG_CLASS_COUNT] = {
 {1, 1, 0, 0},
@@ -146,6 +146,7 @@
 {1, 1, 0, 0},
 {1, 1, 0, 0},
 {1, 1, 0, 0},
+{1, 1, 0, 0},
 };
 const char* debug_ch_name[] = {
 "1",
@@ -202,6 +203,7 @@
 "hotkey",
 "icon",
 "imagelist",
+"imm",
 "int",
 "int10",
 "int21",
@@ -227,7 +229,6 @@
 "module",
 "mpr",
 "msg",
-"msvideo",
 "nonclient",
 "ntdll",
 "ole",
@@ -239,6 +240,7 @@
 "profile",
 "progress",
 "prop",
+"psapi",
 "psdrv",
 "rebar",
 "reg",
diff --git a/include/debugger.h b/include/debugger.h
index 866634d..90d45a8 100644
--- a/include/debugger.h
+++ b/include/debugger.h
@@ -11,6 +11,7 @@
 #include "selectors.h"
 #include "sig_context.h"
 #include "pe_image.h"
+#include "miscemu.h"
 
 #define STEP_FLAG 0x100 /* single step flag */
 
@@ -85,13 +86,20 @@
 typedef struct wine_locals WineLocals;
 
 
+#define DBG_V86_MODULE(seg) ((seg)>>16)
+#define IS_SELECTOR_V86(seg) DBG_V86_MODULE(seg)
+
 #define DBG_FIX_ADDR_SEG(addr,default) { \
       if ((addr)->seg == 0xffffffff) (addr)->seg = (default); \
+      if (!IS_SELECTOR_V86((addr)->seg)) \
       if (IS_SELECTOR_SYSTEM((addr)->seg)) (addr)->seg = 0; }
 
 #define DBG_ADDR_TO_LIN(addr) \
+    (IS_SELECTOR_V86((addr)->seg) \
+      ? (char*)(DOSMEM_MemoryBase(DBG_V86_MODULE((addr)->seg)) + \
+         ((((addr)->seg)&0xFFFF)<<4)+(addr)->off) : \
     (IS_SELECTOR_SYSTEM((addr)->seg) ? (char *)(addr)->off \
-      : (char *)PTR_SEG_OFF_TO_LIN((addr)->seg,(addr)->off))
+      : (char *)PTR_SEG_OFF_TO_LIN((addr)->seg,(addr)->off)))
 
 #define DBG_CHECK_READ_PTR(addr,len) \
     (!DEBUG_IsBadReadPtr((addr),(len)) || \
@@ -310,6 +318,7 @@
 extern void DEBUG_Disassemble( const DBG_ADDR *, const DBG_ADDR*, int offset );
 
   /* debugger/dbg.y */
+extern void ctx_debug( int signal, CONTEXT *regs );
 extern void wine_debug( int signal, SIGCONTEXT *regs );
 
 #endif  /* __WINE_DEBUGGER_H */
diff --git a/include/debugtools.h b/include/debugtools.h
index 40fcb1e..7b6356b 100644
--- a/include/debugtools.h
+++ b/include/debugtools.h
@@ -37,8 +37,8 @@
 #define DPRINTF(format, args...) fprintf(stddeb, format, ## args)
 
 #define DPRINTF_(cl, ch, format, args...) \
-  if(!DEBUGGING(cl, ch)) ; \
-  else DPRINTF(# cl ":" # ch ":%s " format, __FUNCTION__ , ## args)
+  do {if(!DEBUGGING(cl, ch)) ; \
+  else DPRINTF(# cl ":" # ch ":%s " format, __FUNCTION__ , ## args); } while (0)
 
 /* use configure to allow user to compile out debugging messages */
 
diff --git a/include/dosexe.h b/include/dosexe.h
index 3eb82f5..04d9ffb 100644
--- a/include/dosexe.h
+++ b/include/dosexe.h
@@ -16,6 +16,7 @@
  LPVOID img;
  unsigned img_ofs;
  WORD psp_seg,load_seg;
+ WORD dpmi_seg,dpmi_sel,dpmi_flag;
  HMODULE16 hModule;
  struct vm86plus_struct VM86;
  int fn, state;
diff --git a/include/dplay.h b/include/dplay.h
index f9d649e..d9a1147 100644
--- a/include/dplay.h
+++ b/include/dplay.h
@@ -2,9 +2,9 @@
 #ifndef __WINE_DPLAY_H
 #define __WINE_DPLAY_H
 
-#include "mmsystem.h"
+#pragma pack(1)
 
-/* Return Values */
+/* Return Values for Direct Play */
 #define _FACDP  0x877
 #define MAKE_DPHRESULT( code )    MAKE_HRESULT( 1, _FACDP, code )
 
@@ -34,8 +34,8 @@
 #define DPERR_NONAMESERVERFOUND         MAKE_DPHRESULT( 200 )
 #define DPERR_NOPLAYERS                 MAKE_DPHRESULT( 210 )
 #define DPERR_NOSESSIONS                MAKE_DPHRESULT( 220 )
-#define DPERR_PENDING                                   E_PENDING
-#define DPERR_SENDTOOBIG                                MAKE_DPHRESULT( 230 )
+#define DPERR_PENDING                   E_PENDING
+#define DPERR_SENDTOOBIG                MAKE_DPHRESULT( 230 )
 #define DPERR_TIMEOUT                   MAKE_DPHRESULT( 240 )
 #define DPERR_UNAVAILABLE               MAKE_DPHRESULT( 250 )
 #define DPERR_UNSUPPORTED               E_NOTIMPL
@@ -107,11 +107,7 @@
 /* GUID for Modem service provider {44EAA760-CB68-11cf-9C4E-00A0C905425E} */
 DEFINE_GUID(DPSPGUID_MODEM, 0x44eaa760, 0xcb68, 0x11cf, 0x9c, 0x4e, 0x0, 0xa0, 0xc9, 0x5, 0x42, 0x5e);
 
-
-#pragma pack(1)
-
-/* Direct Play */
-typedef struct IDirectPlay        IDirectPlay, *LPDIRECTPLAY;
+typedef struct IDirectPlay IDirectPlay, *LPDIRECTPLAY;
 
 /* Direct Play 2 */
 typedef struct IDirectPlay2       IDirectPlay2, *LPDIRECTPLAY2;
@@ -154,60 +150,110 @@
 {
     DWORD   dwSize;             
     DWORD   dwFlags;            /* Not used must be 0 */
-    union playerShortName       /* Player's Handle? */
+
+    union /*playerShortName */      /* Player's Handle? */
     {                           
         LPWSTR  lpszShortName;  
         LPSTR   lpszShortNameA; 
-    };
-    union playerLongName        /* Player's formal/real name */
+    }psn;
+
+    union /*playerLongName */       /* Player's formal/real name */
     {                         
         LPWSTR  lpszLongName;  
         LPSTR   lpszLongNameA;  
-    };
+    }pln;
 
 } DPNAME, *LPDPNAME;
 
+#define DPLONGNAMELEN     52
+#define DPSHORTNAMELEN    20
+#define DPSESSIONNAMELEN  32
+#define DPPASSWORDLEN     16
+#define DPUSERRESERVED    16
+
+typedef struct tagDPSESSIONDESC
+{
+    DWORD   dwSize;
+    GUID    guidSession;
+    DWORD   dwSession;
+    DWORD   dwMaxPlayers;
+    DWORD   dwCurrentPlayers;
+    DWORD   dwFlags;
+    char    szSessionName[ DPSESSIONNAMELEN ];
+    char    szUserField[ DPUSERRESERVED ];
+    DWORD   dwReserved1;
+    char    szPassword[ DPPASSWORDLEN ];
+    DWORD   dwReserved2;
+    DWORD   dwUser1;
+    DWORD   dwUser2;
+    DWORD   dwUser3;
+    DWORD   dwUser4;
+} DPSESSIONDESC, *LPDPSESSIONDESC;
+
 typedef struct tagDPSESSIONDESC2
 {
     DWORD   dwSize;             
     DWORD   dwFlags;           
     GUID    guidInstance;      
-    GUID    guidApplication;   
+    GUID    guidApplication;   /* GUID of the DP application, GUID_NULL if
+                                * all applications! */
                                
     DWORD   dwMaxPlayers;      
-    DWORD   dwCurrentPlayers;  
+    DWORD   dwCurrentPlayers;   /* (read only value) */
 
-    union sessionName
+    union  /* Session name */
     {                             
         LPWSTR  lpszSessionName;  
         LPSTR   lpszSessionNameA; 
-    };
+    }sess;
 
-    union optnlSessionPasswd
+    union  /* Optional password */
     {                           
         LPWSTR  lpszPassword;   
         LPSTR   lpszPasswordA;  
-    };
+    }pass;
 
     DWORD   dwReserved1;       
     DWORD   dwReserved2;
-    DWORD   dwUser1;          
+
+    DWORD   dwUser1;        /* For use by the application */  
     DWORD   dwUser2;
     DWORD   dwUser3;
     DWORD   dwUser4;
 } DPSESSIONDESC2, *LPDPSESSIONDESC2;
+typedef const DPSESSIONDESC2* LPCDPSESSIONDESC2;
+
+#define DPOPEN_JOIN                     0x00000001
+#define DPOPEN_CREATE                   0x00000002
+#define DPOPEN_RETURNSTATUS             DPENUMSESSIONS_RETURNSTATUS
+
+#define DPSESSION_NEWPLAYERSDISABLED    0x00000001
+#define DPSESSION_MIGRATEHOST           0x00000004
+#define DPSESSION_NOMESSAGEID           0x00000008
+#define DPSESSION_JOINDISABLED          0x00000020
+#define DPSESSION_KEEPALIVE             0x00000040
+#define DPSESSION_NODATAMESSAGES        0x00000080
+#define DPSESSION_SECURESERVER          0x00000100
+#define DPSESSION_PRIVATE               0x00000200
+#define DPSESSION_PASSWORDREQUIRED      0x00000400
+#define DPSESSION_MULTICASTSERVER       0x00000800
+#define DPSESSION_CLIENTSERVER          0x00001000
 
 typedef struct tagDPLCONNECTION
 {
     DWORD               dwSize;          
     DWORD               dwFlags;          
-    LPDPSESSIONDESC2    lpSessionDesc;   
-    LPDPNAME            lpPlayerName;    
-    GUID                guidSP;          
-    LPVOID              lpAddress;       
-    DWORD               dwAddressSize;  
+    LPDPSESSIONDESC2    lpSessionDesc;  /* Ptr to session desc to use for connect */  
+    LPDPNAME            lpPlayerName;   /* Ptr to player name structure */
+    GUID                guidSP;         /* GUID of Service Provider to use */ 
+    LPVOID              lpAddress;      /* Ptr to Address of Service Provider to use */
+    DWORD               dwAddressSize;  /* Size of address data */
 } DPLCONNECTION, *LPDPLCONNECTION;
 
+/* DPLCONNECTION flags (for dwFlags) */
+#define DPLCONNECTION_CREATESESSION DPOPEN_CREATE
+#define DPLCONNECTION_JOINSESSION   DPOPEN_JOIN
+
 typedef struct tagDPLAPPINFO
 {
     DWORD       dwSize;            
@@ -230,6 +276,62 @@
 } DPCOMPOUNDADDRESSELEMENT, *LPDPCOMPOUNDADDRESSELEMENT;
 typedef const DPCOMPOUNDADDRESSELEMENT *LPCDPCOMPOUNDADDRESSELEMENT;
 
+typedef struct tagDPCHAT
+{
+    DWORD               dwSize;
+    DWORD               dwFlags;
+    union
+    {                          // Message string
+        LPWSTR  lpszMessage;   // Unicode
+        LPSTR   lpszMessageA;  // ANSI
+    }msgstr;
+} DPCHAT, *LPDPCHAT;
+
+typedef struct tagDPSECURITYDESC
+{
+    DWORD dwSize;                   // Size of structure
+    DWORD dwFlags;                  // Not used. Must be zero.
+    union
+    {                               // SSPI provider name
+        LPWSTR  lpszSSPIProvider;   // Unicode
+        LPSTR   lpszSSPIProviderA;  // ANSI
+    }sspi;
+    union
+    {                               // CAPI provider name
+        LPWSTR lpszCAPIProvider;    // Unicode
+        LPSTR  lpszCAPIProviderA;   // ANSI
+    }capi;
+    DWORD dwCAPIProviderType;       // Crypto Service Provider type
+    DWORD dwEncryptionAlgorithm;    // Encryption Algorithm type
+} DPSECURITYDESC, *LPDPSECURITYDESC;
+
+typedef const DPSECURITYDESC *LPCDPSECURITYDESC;
+
+typedef struct tagDPCREDENTIALS
+{
+    DWORD dwSize;               // Size of structure
+    DWORD dwFlags;              // Not used. Must be zero.
+    union
+    {                           // User name of the account
+        LPWSTR  lpszUsername;   // Unicode
+        LPSTR   lpszUsernameA;  // ANSI
+    }name;
+    union
+    {                           // Password of the account
+        LPWSTR  lpszPassword;   // Unicode
+        LPSTR   lpszPasswordA;  // ANSI
+    }pass;
+    union
+    {                           // Domain name of the account
+        LPWSTR  lpszDomain;     // Unicode
+        LPSTR   lpszDomainA;    // ANSI
+    }domain;
+} DPCREDENTIALS, *LPDPCREDENTIALS;
+
+typedef const DPCREDENTIALS *LPCDPCREDENTIALS;
+
+
+
 typedef BOOL32 (CALLBACK* LPDPENUMDPCALLBACKW)(
     LPGUID      lpguidSP,
     LPWSTR      lpSPName,
@@ -255,9 +357,16 @@
     DWORD       dwFlags,
     LPVOID      lpContext);
 
+typedef BOOL32 (CALLBACK* LPDPENUMSESSIONSCALLBACK)(
+    LPDPSESSIONDESC lpDPSessionDesc,
+    LPVOID      lpContext,
+    LPDWORD     lpdwTimeOut,
+    DWORD       dwFlags);
+
+
 extern HRESULT WINAPI DirectPlayEnumerateA( LPDPENUMDPCALLBACKA, LPVOID );
 extern HRESULT WINAPI DirectPlayEnumerateW( LPDPENUMDPCALLBACKW, LPVOID );
-extern HRESULT WINAPI DirectPlayCreate( LPGUID lpGUID, LPDIRECTPLAY *lplpDP, IUnknown *pUnk);
+extern HRESULT WINAPI DirectPlayCreate( LPGUID lpGUID, LPDIRECTPLAY2 *lplpDP, IUnknown *pUnk);
 
 
 /* Direct Play Lobby 1 */
@@ -268,8 +377,8 @@
 typedef struct IDirectPlayLobby2    IDirectPlayLobby2, *LPDIRECTPLAYLOBBY2;
 typedef struct IDirectPlayLobby2    IDirectPlayLobby2A, *LPDIRECTPLAYLOBBY2A;
 
-extern HRESULT WINAPI DirectPlayLobbyCreateW(LPGUID, LPDIRECTPLAYLOBBY2 *, IUnknown *, LPVOID, DWORD );
-extern HRESULT WINAPI DirectPlayLobbyCreateA(LPGUID, LPDIRECTPLAYLOBBY2A *, IUnknown *, LPVOID, DWORD );
+extern HRESULT WINAPI DirectPlayLobbyCreateW(LPGUID, LPDIRECTPLAYLOBBY *, IUnknown *, LPVOID, DWORD );
+extern HRESULT WINAPI DirectPlayLobbyCreateA(LPGUID, LPDIRECTPLAYLOBBYA *, IUnknown *, LPVOID, DWORD );
 
 
 
@@ -277,17 +386,31 @@
     REFGUID         guidDataType,
     DWORD           dwDataSize,
     LPCVOID         lpData,
-    LPVOID          lpContext);
+    LPVOID          lpContext );
 
 typedef BOOL32 (CALLBACK* LPDPLENUMADDRESSTYPESCALLBACK)(
     REFGUID         guidDataType,
     LPVOID          lpContext,
-    DWORD           dwFlags);
+    DWORD           dwFlags );
 
 typedef BOOL32 (CALLBACK* LPDPLENUMLOCALAPPLICATIONSCALLBACK)(
     LPCDPLAPPINFO   lpAppInfo,
     LPVOID          lpContext,
-    DWORD           dwFlags);
+    DWORD           dwFlags );
+
+typedef BOOL32 (CALLBACK* LPDPENUMPLAYERSCALLBACK2)(
+    DPID            dpId,
+    DWORD           dwPlayerType,
+    LPCDPNAME       lpName,
+    DWORD           dwFlags,
+    LPVOID          lpContext );
+
+typedef BOOL32 (CALLBACK* LPDPENUMSESSIONSCALLBACK2)(
+    LPCDPSESSIONDESC2   lpThisSD,
+    LPDWORD             lpdwTimeOut,
+    DWORD               dwFlags,
+    LPVOID              lpContext );
+
 
 
 #define STDMETHOD(xfn) HRESULT (CALLBACK *fn##xfn)
@@ -296,36 +419,334 @@
 #define FAR
 #define THIS_ THIS,
 
-#define THIS LPDIRECTPLAYLOBBY2 this
-typedef struct tagLPDIRECTPLAYLOBBY2_VTABLE {
+#define THIS LPDIRECTPLAY2 this
+typedef struct tagLPDIRECTPLAY2_VTABLE
+{
+    /*** IUnknown methods ***/
+    STDMETHOD(QueryInterface)       (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef)        (THIS)  PURE;
+    STDMETHOD_(ULONG,Release)       (THIS) PURE;
+
+    /*** IDirectPlay2 methods ***/
+    STDMETHOD(AddPlayerToGroup)     (THIS_ DPID, DPID) PURE;
+    STDMETHOD(Close)                (THIS) PURE;
+    STDMETHOD(CreateGroup)          (THIS_ LPDPID,LPDPNAME,LPVOID,DWORD,DWORD) PURE;
+    STDMETHOD(CreatePlayer)         (THIS_ LPDPID,LPDPNAME,HANDLE32,LPVOID,DWORD,DWORD) PURE;
+    STDMETHOD(DeletePlayerFromGroup)(THIS_ DPID,DPID) PURE;
+    STDMETHOD(DestroyGroup)         (THIS_ DPID) PURE;
+    STDMETHOD(DestroyPlayer)        (THIS_ DPID) PURE;
+    STDMETHOD(EnumGroupPlayers)     (THIS_ DPID,LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE;
+    STDMETHOD(EnumGroups)           (THIS_ LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE;
+    STDMETHOD(EnumPlayers)          (THIS_ LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE;
+    STDMETHOD(EnumSessions)         (THIS_ LPDPSESSIONDESC2,DWORD,LPDPENUMSESSIONSCALLBACK2,LPVOID,DWORD) PURE;
+    STDMETHOD(GetCaps)              (THIS_ LPDPCAPS,DWORD) PURE;
+    STDMETHOD(GetGroupData)         (THIS_ DPID,LPVOID,LPDWORD,DWORD) PURE;
+    STDMETHOD(GetGroupName)         (THIS_ DPID,LPVOID,LPDWORD) PURE;
+    STDMETHOD(GetMessageCount)      (THIS_ DPID, LPDWORD) PURE;
+    STDMETHOD(GetPlayerAddress)     (THIS_ DPID,LPVOID,LPDWORD) PURE;
+    STDMETHOD(GetPlayerCaps)        (THIS_ DPID,LPDPCAPS,DWORD) PURE;
+    STDMETHOD(GetPlayerData)        (THIS_ DPID,LPVOID,LPDWORD,DWORD) PURE;
+    STDMETHOD(GetPlayerName)        (THIS_ DPID,LPVOID,LPDWORD) PURE;
+    STDMETHOD(GetSessionDesc)       (THIS_ LPVOID,LPDWORD) PURE;
+    STDMETHOD(Initialize)           (THIS_ LPGUID) PURE;
+    STDMETHOD(Open)                 (THIS_ LPDPSESSIONDESC2,DWORD) PURE;
+    STDMETHOD(Receive)              (THIS_ LPDPID,LPDPID,DWORD,LPVOID,LPDWORD) PURE;
+    STDMETHOD(Send)                 (THIS_ DPID, DPID, DWORD, LPVOID, DWORD) PURE;
+    STDMETHOD(SetGroupData)         (THIS_ DPID,LPVOID,DWORD,DWORD) PURE;
+    STDMETHOD(SetGroupName)         (THIS_ DPID,LPDPNAME,DWORD) PURE;
+    STDMETHOD(SetPlayerData)        (THIS_ DPID,LPVOID,DWORD,DWORD) PURE;
+    STDMETHOD(SetPlayerName)        (THIS_ DPID,LPDPNAME,DWORD) PURE;
+    STDMETHOD(SetSessionDesc)       (THIS_ LPDPSESSIONDESC2,DWORD) PURE;
+} DIRECTPLAY2_VTABLE, *LPDIRECTPLAY2_VTABLE;
+#undef THIS
+
+#define THIS LPDIRECTPLAY3 this
+typedef struct tagLPDIRECTPLAY3_VTABLE
+{
+    /*** IUnknown methods ***/
+    STDMETHOD(QueryInterface)       (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef)        (THIS)  PURE;
+    STDMETHOD_(ULONG,Release)       (THIS) PURE;
+
+    /*** IDirectPlay2 methods ***/
+    STDMETHOD(AddPlayerToGroup)     (THIS_ DPID, DPID) PURE;
+    STDMETHOD(Close)                (THIS) PURE;
+    STDMETHOD(CreateGroup)          (THIS_ LPDPID,LPDPNAME,LPVOID,DWORD,DWORD) PURE;
+    STDMETHOD(CreatePlayer)         (THIS_ LPDPID,LPDPNAME,HANDLE32,LPVOID,DWORD,DWORD) PURE;
+    STDMETHOD(DeletePlayerFromGroup)(THIS_ DPID,DPID) PURE;
+    STDMETHOD(DestroyGroup)         (THIS_ DPID) PURE;
+    STDMETHOD(DestroyPlayer)        (THIS_ DPID) PURE;
+    STDMETHOD(EnumGroupPlayers)     (THIS_ DPID,LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE;
+    STDMETHOD(EnumGroups)           (THIS_ LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE;
+    STDMETHOD(EnumPlayers)          (THIS_ LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE;
+    STDMETHOD(EnumSessions)         (THIS_ LPDPSESSIONDESC2,DWORD,LPDPENUMSESSIONSCALLBACK2,LPVOID,DWORD) PURE;
+    STDMETHOD(GetCaps)              (THIS_ LPDPCAPS,DWORD) PURE;
+    STDMETHOD(GetGroupData)         (THIS_ DPID,LPVOID,LPDWORD,DWORD) PURE;
+    STDMETHOD(GetGroupName)         (THIS_ DPID,LPVOID,LPDWORD) PURE;
+    STDMETHOD(GetMessageCount)      (THIS_ DPID, LPDWORD) PURE;
+    STDMETHOD(GetPlayerAddress)     (THIS_ DPID,LPVOID,LPDWORD) PURE;
+    STDMETHOD(GetPlayerCaps)        (THIS_ DPID,LPDPCAPS,DWORD) PURE;
+    STDMETHOD(GetPlayerData)        (THIS_ DPID,LPVOID,LPDWORD,DWORD) PURE;
+    STDMETHOD(GetPlayerName)        (THIS_ DPID,LPVOID,LPDWORD) PURE;
+    STDMETHOD(GetSessionDesc)       (THIS_ LPVOID,LPDWORD) PURE;
+    STDMETHOD(Initialize)           (THIS_ LPGUID) PURE;
+    STDMETHOD(Open)                 (THIS_ LPDPSESSIONDESC2,DWORD) PURE;
+    STDMETHOD(Receive)              (THIS_ LPDPID,LPDPID,DWORD,LPVOID,LPDWORD) PURE;
+    STDMETHOD(Send)                 (THIS_ DPID, DPID, DWORD, LPVOID, DWORD) PURE;
+    STDMETHOD(SetGroupData)         (THIS_ DPID,LPVOID,DWORD,DWORD) PURE;
+    STDMETHOD(SetGroupName)         (THIS_ DPID,LPDPNAME,DWORD) PURE;
+    STDMETHOD(SetPlayerData)        (THIS_ DPID,LPVOID,DWORD,DWORD) PURE;
+    STDMETHOD(SetPlayerName)        (THIS_ DPID,LPDPNAME,DWORD) PURE;
+    STDMETHOD(SetSessionDesc)       (THIS_ LPDPSESSIONDESC2,DWORD) PURE;
+
+    /*** IDirectPlay3 methods ***/
+    STDMETHOD(AddGroupToGroup)            (THIS_ DPID, DPID) PURE;
+    STDMETHOD(CreateGroupInGroup)         (THIS_ DPID,LPDPID,LPDPNAME,LPVOID,DWORD,DWORD) PURE;
+    STDMETHOD(DeleteGroupFromGroup)       (THIS_ DPID,DPID) PURE;
+    STDMETHOD(EnumConnections)            (THIS_ LPCGUID,LPDPENUMCONNECTIONSCALLBACK,LPVOID,DWORD) PURE;
+    STDMETHOD(EnumGroupsInGroup)          (THIS_ DPID,LPGUID,LPDPENUMPLAYERSCALLBACK2,LPVOID,DWORD) PURE;
+    STDMETHOD(GetGroupConnectionSettings) (THIS_ DWORD, DPID, LPVOID, LPDWORD) PURE;
+    STDMETHOD(InitializeConnection)       (THIS_ LPVOID,DWORD) PURE;
+    STDMETHOD(SecureOpen)                 (THIS_ LPCDPSESSIONDESC2,DWORD,LPCDPSECURITYDESC,LPCDPCREDENTIALS) PURE;
+    STDMETHOD(SendChatMessage)            (THIS_ DPID,DPID,DWORD,LPDPCHAT);
+    STDMETHOD(SetGroupConnectionSettings) (THIS_ DWORD,DPID,LPDPLCONNECTION) PURE;
+    STDMETHOD(StartSession)               (THIS_ DWORD,DPID);
+    STDMETHOD(GetGroupFlags)              (THIS_ DPID,LPDWORD);
+    STDMETHOD(GetGroupParent)             (THIS_ DPID,LPDPID);
+    STDMETHOD(GetPlayerAccount)           (THIS_ DPID, DWORD, LPVOID, LPDWORD) PURE;
+    STDMETHOD(GetPlayerFlags)             (THIS_ DPID,LPDWORD);
+} DIRECTPLAY3_VTABLE, *LPDIRECTPLAY3_VTABLE;
+#undef THIS
+
+
+/**********************************************************************************
+ *
+ * Macros for a nicer interface to DirectPlay 
+ *
+ **********************************************************************************/
+
+/* COM Interface */
+#define IDirectPlay_QueryInterface(p,a,b)           (p)->lpVtbl->QueryInterface(p,a,b)
+#define IDirectPlay_AddRef(p)                       (p)->lpVtbl->AddRef(p)
+#define IDirectPlay_Release(p)                      (p)->lpVtbl->Release(p)
+
+#define IDirectPlay2_QueryInterface(p,a,b)          (p)->lpVtbl->QueryInterface(p,a,b)
+#define IDirectPlay2_AddRef(p)                      (p)->lpVtbl->AddRef(p)
+#define IDirectPlay2_Release(p)                     (p)->lpVtbl->Release(p)
+
+#define IDirectPlay3_QueryInterface(p,a,b)          (p)->lpVtbl->QueryInterface(p,a,b)
+#define IDirectPlay3_AddRef(p)                      (p)->lpVtbl->AddRef(p)
+#define IDirectPlay3_Release(p)                     (p)->lpVtbl->Release(p)
+
+/* Direct Play 1&2 Interface */
+#define IDirectPlay_AddPlayerToGroup(p,a,b)         (p)->lpVtbl->AddPlayerToGroup(p,a,b)
+#define IDirectPlay_Close(p)                        (p)->lpVtbl->Close(p)
+#define IDirectPlay_CreateGroup(p,a,b,c)            (p)->lpVtbl->CreateGroup(p,a,b,c)
+#define IDirectPlay_CreatePlayer(p,a,b,c,d)         (p)->lpVtbl->CreatePlayer(p,a,b,c,d)
+#define IDirectPlay_DeletePlayerFromGroup(p,a,b)    (p)->lpVtbl->DeletePlayerFromGroup(p,a,b)
+#define IDirectPlay_DestroyGroup(p,a)               (p)->lpVtbl->DestroyGroup(p,a)
+#define IDirectPlay_DestroyPlayer(p,a)              (p)->lpVtbl->DestroyPlayer(p,a)
+#define IDirectPlay_EnableNewPlayers(p,a)           (p)->lpVtbl->EnableNewPlayers(p,a)
+#define IDirectPlay_EnumGroupPlayers(p,a,b,c,d)     (p)->lpVtbl->EnumGroupPlayers(p,a,b,c,d)
+#define IDirectPlay_EnumGroups(p,a,b,c,d)           (p)->lpVtbl->EnumGroups(p,a,b,c,d)
+#define IDirectPlay_EnumPlayers(p,a,b,c,d)          (p)->lpVtbl->EnumPlayers(p,a,b,c,d)
+#define IDirectPlay_EnumSessions(p,a,b,c,d,e)       (p)->lpVtbl->EnumSessions(p,a,b,c,d,e)
+#define IDirectPlay_GetCaps(p,a)                    (p)->lpVtbl->GetCaps(p,a)
+#define IDirectPlay_GetMessageCount(p,a,b)          (p)->lpVtbl->GetMessageCount(p,a,b)
+#define IDirectPlay_GetPlayerCaps(p,a,b)            (p)->lpVtbl->GetPlayerCaps(p,a,b)
+#define IDirectPlay_GetPlayerName(p,a,b,c,d,e)      (p)->lpVtbl->GetPlayerName(p,a,b,c,d,e)
+#define IDirectPlay_Initialize(p,a)                 (p)->lpVtbl->Initialize(p,a)
+#define IDirectPlay_Open(p,a)                       (p)->lpVtbl->Open(p,a)
+#define IDirectPlay_Receive(p,a,b,c,d,e)            (p)->lpVtbl->Receive(p,a,b,c,d,e)
+#define IDirectPlay_SaveSession(p,a)                (p)->lpVtbl->SaveSession(p,a)
+#define IDirectPlay_Send(p,a,b,c,d,e)               (p)->lpVtbl->Send(p,a,b,c,d,e)
+#define IDirectPlay_SetPlayerName(p,a,b,c)          (p)->lpVtbl->SetPlayerName(p,a,b,c)
+
+#define IDirectPlay2_AddPlayerToGroup(p,a,b)        (p)->lpVtbl->AddPlayerToGroup(p,a,b)
+#define IDirectPlay2_Close(p)                       (p)->lpVtbl->Close(p)
+#define IDirectPlay2_CreateGroup(p,a,b,c,d,e)       (p)->lpVtbl->CreateGroup(p,a,b,c,d,e)
+#define IDirectPlay2_CreatePlayer(p,a,b,c,d,e,f)    (p)->lpVtbl->CreatePlayer(p,a,b,c,d,e,f)
+#define IDirectPlay2_DeletePlayerFromGroup(p,a,b)   (p)->lpVtbl->DeletePlayerFromGroup(p,a,b)
+#define IDirectPlay2_DestroyGroup(p,a)              (p)->lpVtbl->DestroyGroup(p,a)
+#define IDirectPlay2_DestroyPlayer(p,a)             (p)->lpVtbl->DestroyPlayer(p,a)
+#define IDirectPlay2_EnumGroupPlayers(p,a,b,c,d,e)  (p)->lpVtbl->EnumGroupPlayers(p,a,b,c,d,e)
+#define IDirectPlay2_EnumGroups(p,a,b,c,d)          (p)->lpVtbl->EnumGroups(p,a,b,c,d)
+#define IDirectPlay2_EnumPlayers(p,a,b,c,d)         (p)->lpVtbl->EnumPlayers(p,a,b,c,d)
+#define IDirectPlay2_EnumSessions(p,a,b,c,d,e)      (p)->lpVtbl->EnumSessions(p,a,b,c,d,e)
+#define IDirectPlay2_GetCaps(p,a,b)                 (p)->lpVtbl->GetCaps(p,a,b)
+#define IDirectPlay2_GetMessageCount(p,a,b)         (p)->lpVtbl->GetMessageCount(p,a,b)
+#define IDirectPlay2_GetGroupData(p,a,b,c,d)        (p)->lpVtbl->GetGroupData(p,a,b,c,d)
+#define IDirectPlay2_GetGroupName(p,a,b,c)          (p)->lpVtbl->GetGroupName(p,a,b,c)
+#define IDirectPlay2_GetPlayerAddress(p,a,b,c)      (p)->lpVtbl->GetPlayerAddress(p,a,b,c)
+#define IDirectPlay2_GetPlayerCaps(p,a,b,c)         (p)->lpVtbl->GetPlayerCaps(p,a,b,c)
+#define IDirectPlay2_GetPlayerData(p,a,b,c,d)       (p)->lpVtbl->GetPlayerData(p,a,b,c,d)
+#define IDirectPlay2_GetPlayerName(p,a,b,c)         (p)->lpVtbl->GetPlayerName(p,a,b,c)
+#define IDirectPlay2_GetSessionDesc(p,a,b)          (p)->lpVtbl->GetSessionDesc(p,a,b)
+#define IDirectPlay2_Initialize(p,a)                (p)->lpVtbl->Initialize(p,a)
+#define IDirectPlay2_Open(p,a,b)                    (p)->lpVtbl->Open(p,a,b)
+#define IDirectPlay2_Receive(p,a,b,c,d,e)           (p)->lpVtbl->Receive(p,a,b,c,d,e)
+#define IDirectPlay2_Send(p,a,b,c,d,e)              (p)->lpVtbl->Send(p,a,b,c,d,e)
+#define IDirectPlay2_SetGroupData(p,a,b,c,d)        (p)->lpVtbl->SetGroupData(p,a,b,c,d)
+#define IDirectPlay2_SetGroupName(p,a,b,c)          (p)->lpVtbl->SetGroupName(p,a,b,c)
+#define IDirectPlay2_SetPlayerData(p,a,b,c,d)       (p)->lpVtbl->SetPlayerData(p,a,b,c,d)
+#define IDirectPlay2_SetPlayerName(p,a,b,c)         (p)->lpVtbl->SetPlayerName(p,a,b,c)
+#define IDirectPlay2_SetSessionDesc(p,a,b)          (p)->lpVtbl->SetSessionDesc(p,a,b)
+
+#define IDirectPlay3_AddPlayerToGroup(p,a,b)        (p)->lpVtbl->AddPlayerToGroup(p,a,b)
+#define IDirectPlay3_Close(p)                       (p)->lpVtbl->Close(p)
+#define IDirectPlay3_CreateGroup(p,a,b,c,d,e)       (p)->lpVtbl->CreateGroup(p,a,b,c,d,e)
+#define IDirectPlay3_CreatePlayer(p,a,b,c,d,e,f)    (p)->lpVtbl->CreatePlayer(p,a,b,c,d,e,f)
+#define IDirectPlay3_DeletePlayerFromGroup(p,a,b)   (p)->lpVtbl->DeletePlayerFromGroup(p,a,b)
+#define IDirectPlay3_DestroyGroup(p,a)              (p)->lpVtbl->DestroyGroup(p,a)
+#define IDirectPlay3_DestroyPlayer(p,a)             (p)->lpVtbl->DestroyPlayer(p,a)
+#define IDirectPlay3_EnumGroupPlayers(p,a,b,c,d,e)  (p)->lpVtbl->EnumGroupPlayers(p,a,b,c,d,e)
+#define IDirectPlay3_EnumGroups(p,a,b,c,d)          (p)->lpVtbl->EnumGroups(p,a,b,c,d)
+#define IDirectPlay3_EnumPlayers(p,a,b,c,d)         (p)->lpVtbl->EnumPlayers(p,a,b,c,d)
+#define IDirectPlay3_EnumSessions(p,a,b,c,d,e)      (p)->lpVtbl->EnumSessions(p,a,b,c,d,e)
+#define IDirectPlay3_GetCaps(p,a,b)                 (p)->lpVtbl->GetCaps(p,a,b)
+#define IDirectPlay3_GetMessageCount(p,a,b)         (p)->lpVtbl->GetMessageCount(p,a,b)
+#define IDirectPlay3_GetGroupData(p,a,b,c,d)        (p)->lpVtbl->GetGroupData(p,a,b,c,d)
+#define IDirectPlay3_GetGroupName(p,a,b,c)          (p)->lpVtbl->GetGroupName(p,a,b,c)
+#define IDirectPlay3_GetPlayerAddress(p,a,b,c)      (p)->lpVtbl->GetPlayerAddress(p,a,b,c)
+#define IDirectPlay3_GetPlayerCaps(p,a,b,c)         (p)->lpVtbl->GetPlayerCaps(p,a,b,c)
+#define IDirectPlay3_GetPlayerData(p,a,b,c,d)       (p)->lpVtbl->GetPlayerData(p,a,b,c,d)
+#define IDirectPlay3_GetPlayerName(p,a,b,c)         (p)->lpVtbl->GetPlayerName(p,a,b,c)
+#define IDirectPlay3_GetSessionDesc(p,a,b)          (p)->lpVtbl->GetSessionDesc(p,a,b)
+#define IDirectPlay3_Initialize(p,a)                (p)->lpVtbl->Initialize(p,a)
+#define IDirectPlay3_Open(p,a,b)                    (p)->lpVtbl->Open(p,a,b)
+#define IDirectPlay3_Receive(p,a,b,c,d,e)           (p)->lpVtbl->Receive(p,a,b,c,d,e)
+#define IDirectPlay3_Send(p,a,b,c,d,e)              (p)->lpVtbl->Send(p,a,b,c,d,e)
+#define IDirectPlay3_SetGroupData(p,a,b,c,d)        (p)->lpVtbl->SetGroupData(p,a,b,c,d)
+#define IDirectPlay3_SetGroupName(p,a,b,c)          (p)->lpVtbl->SetGroupName(p,a,b,c)
+#define IDirectPlay3_SetPlayerData(p,a,b,c,d)       (p)->lpVtbl->SetPlayerData(p,a,b,c,d)
+#define IDirectPlay3_SetPlayerName(p,a,b,c)         (p)->lpVtbl->SetPlayerName(p,a,b,c)
+#define IDirectPlay3_SetSessionDesc(p,a,b)          (p)->lpVtbl->SetSessionDesc(p,a,b)
+
+
+/* Direct Play 3 Interface. */
+
+#define IDirectPlay3_AddGroupToGroup(p,a,b)             (p)->lpVtbl->AddGroupToGroup(p,a,b)
+#define IDirectPlay3_CreateGroupInGroup(p,a,b,c,d,e,f) (p)->lpVtbl->CreateGroupInGroup(p,a,b,c,d,e,f)
+#define IDirectPlay3_DeleteGroupFromGroup(p,a,b)        (p)->lpVtbl->DeleteGroupFromGroup(p,a,b)
+#define IDirectPlay3_EnumConnections(p,a,b,c,d)         (p)->lpVtbl->EnumConnections(p,a,b,c,d)
+#define IDirectPlay3_EnumGroupsInGroup(p,a,b,c,d,e) (p)->lpVtbl->EnumGroupsInGroup(p,a,b,c,d,e)
+#define IDirectPlay3_GetGroupConnectionSettings(p,a,b,c,d) (p)->lpVtbl->GetGroupConnectionSettings(p,a,b,c,d)
+#define IDirectPlay3_InitializeConnection(p,a,b)        (p)->lpVtbl->InitializeConnection(p,a,b)
+#define IDirectPlay3_SecureOpen(p,a,b,c,d)          (p)->lpVtbl->SecureOpen(p,a,b,c,d)
+#define IDirectPlay3_SendChatMessage(p,a,b,c,d)     (p)->lpVtbl->SendChatMessage(p,a,b,c,d)
+#define IDirectPlay3_SetGroupConnectionSettings(p,a,b,c) (p)->lpVtbl->SetGroupConnectionSettings(p,a,b,c)
+#define IDirectPlay3_StartSession(p,a,b)            (p)->lpVtbl->StartSession(p,a,b)
+#define IDirectPlay3_GetGroupFlags(p,a,b)           (p)->lpVtbl->GetGroupFlags(p,a,b)
+#define IDirectPlay3_GetGroupParent(p,a,b)          (p)->lpVtbl->GetGroupParent(p,a,b)
+#define IDirectPlay3_GetPlayerAccount(p,a,b,c,d)    (p)->lpVtbl->GetPlayerAccount(p,a,b,c,d)
+#define IDirectPlay3_GetPlayerFlags(p,a,b)          (p)->lpVtbl->GetPlayerFlags(p,a,b)
+
+
+/****************************************************************************
+ *
+ * DIRECT PLAY LOBBY VIRTUAL TABLE DEFINITIONS 
+ *
+ ****************************************************************************/
+
+
+#define THIS LPDIRECTPLAYLOBBY this
+typedef struct tagLPDIRECTPLAYLOBBY_VTABLE 
+{
     /*  IUnknown Methods "Inherited Methods" */
     STDMETHOD(QueryInterface)       (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
-    STDMETHOD_(ULONG,AddRef)        (THIS) PURE;
+    STDMETHOD_(ULONG,AddRef)        (THIS)  PURE;
     STDMETHOD_(ULONG,Release)       (THIS) PURE;
 
     /*  IDirectPlayLobby Methods */
-    STDMETHOD(Connect)              (THIS_ DWORD, LPDIRECTPLAY2 *, IUnknown *) PURE;
-    STDMETHOD(CreateAddress)        (THIS_ REFGUID, REFGUID, LPCVOID, DWORD, LPVOID, LPDWORD) PURE;
-    STDMETHOD(EnumAddress)          (THIS_ LPDPENUMADDRESSCALLBACK, LPCVOID, DWORD, LPVOID) PURE;
-    STDMETHOD(EnumAddressTypes)     (THIS_ LPDPLENUMADDRESSTYPESCALLBACK, REFGUID, LPVOID, DWORD) PURE;
-    STDMETHOD(EnumLocalApplications)(THIS_ LPDPLENUMLOCALAPPLICATIONSCALLBACK, LPVOID, DWORD) PURE;
-    STDMETHOD(GetConnectionSettings)(THIS_ DWORD, LPVOID, LPDWORD) PURE;
-    STDMETHOD(ReceiveLobbyMessage)  (THIS_ DWORD, DWORD, LPDWORD, LPVOID, LPDWORD) PURE;
-    STDMETHOD(RunApplication)       (THIS_ DWORD, LPDWORD, LPDPLCONNECTION, HANDLE32) PURE;
-    STDMETHOD(SendLobbyMessage)     (THIS_ DWORD, DWORD, LPVOID, DWORD) PURE;
-    STDMETHOD(SetConnectionSettings)(THIS_ DWORD, DWORD, LPDPLCONNECTION) PURE;
+    STDMETHOD(Connect)              (THIS_ DWORD, LPDIRECTPLAY *, IUnknown *) PURE;                       
+    STDMETHOD(CreateAddress)        (THIS_ REFGUID, REFGUID, LPCVOID, DWORD, LPVOID, LPDWORD) PURE;       
+    STDMETHOD(EnumAddress)          (THIS_ LPDPENUMADDRESSCALLBACK, LPCVOID, DWORD, LPVOID) PURE;         
+    STDMETHOD(EnumAddressTypes)     (THIS_ LPDPLENUMADDRESSTYPESCALLBACK, REFGUID, LPVOID, DWORD) PURE;   
+    STDMETHOD(EnumLocalApplications)(THIS_ LPDPLENUMLOCALAPPLICATIONSCALLBACK, LPVOID, DWORD) PURE;       
+    STDMETHOD(GetConnectionSettings)(THIS_ DWORD, LPVOID, LPDWORD) PURE;                                  
+    STDMETHOD(ReceiveLobbyMessage)  (THIS_ DWORD, DWORD, LPDWORD, LPVOID, LPDWORD) PURE;                  
+    STDMETHOD(RunApplication)       (THIS_ DWORD, LPDWORD, LPDPLCONNECTION, HANDLE32) PURE;               
+    STDMETHOD(SendLobbyMessage)     (THIS_ DWORD, DWORD, LPVOID, DWORD) PURE;                             
+    STDMETHOD(SetConnectionSettings)(THIS_ DWORD, DWORD, LPDPLCONNECTION) PURE;                           
+    STDMETHOD(SetLobbyMessageEvent) (THIS_ DWORD, DWORD, HANDLE32) PURE;
+
+
+} DIRECTPLAYLOBBY_VTABLE, *LPDIRECTPLAYLOBBY_VTABLE;
+#undef THIS
+
+#define THIS LPDIRECTPLAYLOBBY2 this
+typedef struct tagLPDIRECTPLAYLOBBY2_VTABLE 
+{
+    /*  IUnknown Methods "Inherited Methods" */
+    STDMETHOD(QueryInterface)       (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef)        (THIS)  PURE;
+    STDMETHOD_(ULONG,Release)       (THIS) PURE;
+
+    /*  IDirectPlayLobby Methods */
+    STDMETHOD(Connect)              (THIS_ DWORD, LPDIRECTPLAY2 *, IUnknown *) PURE;                       
+    STDMETHOD(CreateAddress)        (THIS_ REFGUID, REFGUID, LPCVOID, DWORD, LPVOID, LPDWORD) PURE;       
+    STDMETHOD(EnumAddress)          (THIS_ LPDPENUMADDRESSCALLBACK, LPCVOID, DWORD, LPVOID) PURE;         
+    STDMETHOD(EnumAddressTypes)     (THIS_ LPDPLENUMADDRESSTYPESCALLBACK, REFGUID, LPVOID, DWORD) PURE;   
+    STDMETHOD(EnumLocalApplications)(THIS_ LPDPLENUMLOCALAPPLICATIONSCALLBACK, LPVOID, DWORD) PURE;       
+    STDMETHOD(GetConnectionSettings)(THIS_ DWORD, LPVOID, LPDWORD) PURE;                                  
+    STDMETHOD(ReceiveLobbyMessage)  (THIS_ DWORD, DWORD, LPDWORD, LPVOID, LPDWORD) PURE;                  
+    STDMETHOD(RunApplication)       (THIS_ DWORD, LPDWORD, LPDPLCONNECTION, HANDLE32) PURE;               
+    STDMETHOD(SendLobbyMessage)     (THIS_ DWORD, DWORD, LPVOID, DWORD) PURE;                             
+    STDMETHOD(SetConnectionSettings)(THIS_ DWORD, DWORD, LPDPLCONNECTION) PURE;                           
     STDMETHOD(SetLobbyMessageEvent) (THIS_ DWORD, DWORD, HANDLE32) PURE;
 
     /*  IDirectPlayLobby2 Methods */
     STDMETHOD(CreateCompoundAddress)(THIS_ LPCDPCOMPOUNDADDRESSELEMENT, DWORD, LPVOID, LPDWORD) PURE;
 
 } DIRECTPLAYLOBBY2_VTABLE, *LPDIRECTPLAYLOBBY2_VTABLE;
+#undef THIS
 
-/* Is this right? How does one know? */
-struct IDirectPlayLobby2 {
-    LPDIRECTPLAYLOBBY2_VTABLE lpvtbl;
-    DWORD                     ref;
-};
+/**********************************************************************************
+ *
+ * Macros for a nicer interface to DirectPlayLobby
+ *
+ **********************************************************************************/
+
+/* COM Interface */
+
+#define IDirectPlayLobby_QueryInterface(p,a,b)              (p)->lpVtbl->QueryInterface(p,a,b)
+#define IDirectPlayLobby_AddRef(p)                          (p)->lpVtbl->AddRef(p)
+#define IDirectPlayLobby_Release(p)                         (p)->lpVtbl->Release(p)
+
+#define IDirectPlayLobby2_QueryInterface(p,a,b)             (p)->lpVtbl->QueryInterface(p,a,b)
+#define IDirectPlayLobby2_AddRef(p)                         (p)->lpVtbl->AddRef(p)
+#define IDirectPlayLobby2_Release(p)                        (p)->lpVtbl->Release(p)
+
+/* Direct Play Lobby 1 */
+
+#define IDirectPlayLobby_Connect(p,a,b,c)                   (p)->lpVtbl->Connect(p,a,b,c)
+#define IDirectPlayLobby_CreateAddress(p,a,b,c,d,e,f)       (p)->lpVtbl->CreateAddress(p,a,b,c,d,e,f)
+#define IDirectPlayLobby_EnumAddress(p,a,b,c,d)             (p)->lpVtbl->EnumAddress(p,a,b,c,d)
+#define IDirectPlayLobby_EnumAddressTypes(p,a,b,c,d)        (p)->lpVtbl->EnumAddressTypes(p,a,b,c,d)
+#define IDirectPlayLobby_EnumLocalApplications(p,a,b,c)     (p)->lpVtbl->EnumLocalApplications(p,a,b,c)
+#define IDirectPlayLobby_GetConnectionSettings(p,a,b,c)     (p)->lpVtbl->GetConnectionSettings(p,a,b,c)
+#define IDirectPlayLobby_ReceiveLobbyMessage(p,a,b,c,d,e)   (p)->lpVtbl->ReceiveLobbyMessage(p,a,b,c,d,e)
+#define IDirectPlayLobby_RunApplication(p,a,b,c,d)          (p)->lpVtbl->RunApplication(p,a,b,c,d)
+#define IDirectPlayLobby_SendLobbyMessage(p,a,b,c,d)        (p)->lpVtbl->SendLobbyMessage(p,a,b,c,d)
+#define IDirectPlayLobby_SetConnectionSettings(p,a,b,c)     (p)->lpVtbl->SetConnectionSettings(p,a,b,c)
+#define IDirectPlayLobby_SetLobbyMessageEvent(p,a,b,c)      (p)->lpVtbl->SetLobbyMessageEvent(p,a,b,c)
+
+#define IDirectPlayLobby2_Connect(p,a,b,c)                  (p)->lpVtbl->Connect(p,a,b,c)
+#define IDirectPlayLobby2_CreateAddress(p,a,b,c,d,e,f)      (p)->lpVtbl->CreateAddress(p,a,b,c,d,e,f)
+#define IDirectPlayLobby2_EnumAddress(p,a,b,c,d)            (p)->lpVtbl->EnumAddress(p,a,b,c,d)
+#define IDirectPlayLobby2_EnumAddressTypes(p,a,b,c,d)       (p)->lpVtbl->EnumAddressTypes(p,a,b,c,d)
+#define IDirectPlayLobby2_EnumLocalApplications(p,a,b,c)    (p)->lpVtbl->EnumLocalApplications(p,a,b,c)
+#define IDirectPlayLobby2_GetConnectionSettings(p,a,b,c)    (p)->lpVtbl->GetConnectionSettings(p,a,b,c)
+#define IDirectPlayLobby2_ReceiveLobbyMessage(p,a,b,c,d,e)  (p)->lpVtbl->ReceiveLobbyMessage(p,a,b,c,d,e)
+#define IDirectPlayLobby2_RunApplication(p,a,b,c,d)         (p)->lpVtbl->RunApplication(p,a,b,c,d)
+#define IDirectPlayLobby2_SendLobbyMessage(p,a,b,c,d)       (p)->lpVtbl->SendLobbyMessage(p,a,b,c,d)
+#define IDirectPlayLobby2_SetConnectionSettings(p,a,b,c)    (p)->lpVtbl->SetConnectionSettings(p,a,b,c)
+#define IDirectPlayLobby2_SetLobbyMessageEvent(p,a,b,c)     (p)->lpVtbl->SetLobbyMessageEvent(p,a,b,c)
+
+
+/* Direct Play Lobby 2 */
+
+#define IDirectPlayLobby2_CreateCompoundAddress(p,a,b,c,d)   (p)->lpVtbl->CreateCompoundAddress(p,a,b,c,d)
 
 #pragma pack(4)
 
diff --git a/include/file.h b/include/file.h
index eb54708..b8fdff4 100644
--- a/include/file.h
+++ b/include/file.h
@@ -47,6 +47,8 @@
 (((handle)==0) ? GetStdHandle(STD_INPUT_HANDLE) : \
  ((handle)==1) ? GetStdHandle(STD_OUTPUT_HANDLE) : \
  ((handle)==2) ? GetStdHandle(STD_ERROR_HANDLE) : \
+ ((handle)==3) ? GetStdHandle(STD_ERROR_HANDLE) : \
+ ((handle)==4) ? GetStdHandle(STD_ERROR_HANDLE) : \
  ((handle)>=0x400) ? handle : \
  (handle)-5)
 
diff --git a/include/global.h b/include/global.h
index 775f31e..06074ee 100644
--- a/include/global.h
+++ b/include/global.h
@@ -22,6 +22,7 @@
                                      BOOL16 is32Bit, BOOL16 isReadOnly,
                                      SHMDATA *shmdata);
 extern BOOL16 GLOBAL_FreeBlock( HGLOBAL16 handle );
+extern BOOL16 GLOBAL_MoveBlock( HGLOBAL16 handle, const void *ptr, DWORD size );
 extern HGLOBAL16 GLOBAL_Alloc( WORD flags, DWORD size, HGLOBAL16 hOwner,
                                BOOL16 isCode, BOOL16 is32Bit,
                                BOOL16 isReadOnly );
diff --git a/include/header.h b/include/header.h
index 298f67b..0ab962a 100644
--- a/include/header.h
+++ b/include/header.h
@@ -10,11 +10,9 @@
 
 typedef struct 
 {
-    UINT32    mask;
     INT32     cxy;
     HBITMAP32 hbm;
     LPSTR     pszText;
-    INT32     cchTextMax;
     INT32     fmt;
     LPARAM    lParam;
     INT32     iImage;
diff --git a/include/imm.h b/include/imm.h
index 5b40a6b..31ee343 100644
--- a/include/imm.h
+++ b/include/imm.h
@@ -5,8 +5,10 @@
 #ifndef __WINE_IMM_H
 #define __WINE_IMM_H
 
-typedef DWORD HIMC32;
-typedef DWORD HIMCC32;
+#include "wintypes.h"
+
+typedef HANDLE32 HIMC32;
+typedef HANDLE32 HIMCC32;
 
 typedef HKL32 *LPHKL32;
 
diff --git a/include/k32obj.h b/include/k32obj.h
index 0e1dad3..b0e8633 100644
--- a/include/k32obj.h
+++ b/include/k32obj.h
@@ -62,8 +62,8 @@
 extern BOOL32 K32OBJ_IsValid( K32OBJ *ptr, K32OBJ_TYPE type );
 extern BOOL32 K32OBJ_AddName( K32OBJ *obj, LPCSTR name );
 extern K32OBJ *K32OBJ_Create( K32OBJ_TYPE type, DWORD size, LPCSTR name,
-                              DWORD access, SECURITY_ATTRIBUTES *sa,
-                              HANDLE32 *handle );
+                              int server_handle, DWORD access,
+                              SECURITY_ATTRIBUTES *sa, HANDLE32 *handle );
 extern K32OBJ *K32OBJ_FindName( LPCSTR name );
 extern K32OBJ *K32OBJ_FindNameType( LPCSTR name, K32OBJ_TYPE type );
 
diff --git a/include/listview.h b/include/listview.h
index 10795e7..869c798 100644
--- a/include/listview.h
+++ b/include/listview.h
@@ -16,23 +16,26 @@
     LPARAM lParam;
     INT32  iIndent;
 
-    HDSA   hdsaItem;
 } LISTVIEW_ITEM;
 
 
 typedef struct tagLISTVIEW_INFO
 {
     COLORREF   clrBk;
+    COLORREF   clrText;
+    COLORREF   clrTextBk;
     HIMAGELIST himlNormal;
     HIMAGELIST himlSmall;
     HIMAGELIST himlState;
     INT32      nItemCount;
+    INT32      nColumnCount;
     HWND32     hwndHeader;
     HFONT32    hDefaultFont;
     HFONT32    hFont;
     RECT32     rcList;       /* "client" area of the list (without header) */
+    BOOL32     bFocus;
 
-    HDSA       hdsaItems;
+    HDPA       hdpaItems;
 
 } LISTVIEW_INFO;
 
diff --git a/include/miscemu.h b/include/miscemu.h
index 9c2b26a..a9cb741 100644
--- a/include/miscemu.h
+++ b/include/miscemu.h
@@ -30,8 +30,12 @@
 extern UINT32 DOSMEM_MapLinearToDos(LPVOID); /* linear Wine to DOS */
 
 /* msdos/interrupts.c */
-extern FARPROC16 INT_GetHandler( BYTE intnum );
-extern void INT_SetHandler( BYTE intnum, FARPROC16 handler );
+extern FARPROC16 INT_GetPMHandler( BYTE intnum );
+extern void INT_SetPMHandler( BYTE intnum, FARPROC16 handler );
+extern FARPROC16 INT_GetRMHandler( BYTE intnum );
+extern void INT_SetRMHandler( BYTE intnum, FARPROC16 handler );
+extern FARPROC16 INT_CtxGetHandler( CONTEXT *context, BYTE intnum );
+extern void INT_CtxSetHandler( CONTEXT *context, BYTE intnum, FARPROC16 handler );
 extern int INT_RealModeInterrupt( BYTE intnum, PCONTEXT context );
 
 /* msdos/ioports.c */
@@ -39,6 +43,9 @@
 extern DWORD IO_inport( int port, int count );
 extern void IO_outport( int port, int count, DWORD value );
 
+/* msdos/int10.c */
+extern void WINAPI INT_Int10Handler(CONTEXT*);
+
 /* msdos/int1a.c */
 extern DWORD INT1A_GetTicksSinceMidnight(void);
 extern void WINAPI INT_Int1aHandler(CONTEXT*);
@@ -46,9 +53,15 @@
 /* msdos/int20.c */
 extern void WINAPI INT_Int20Handler(CONTEXT*);
 
+/* msdos/int25.c */
+extern void WINAPI INT_Int25Handler(CONTEXT*);
+
 /* msdos/int2f.c */
 extern void WINAPI INT_Int2fHandler(CONTEXT*);
 
+/* msdos/int31.c */
+extern void WINAPI INT_Int31Handler(CONTEXT*);
+
 /* loader/signal.c */
 extern BOOL32 SIGNAL_Init(void);
 extern void SIGNAL_SetHandler( int sig, void (*func)(), int flags );
diff --git a/include/mmsystem.h b/include/mmsystem.h
index 1e10215..bf34f17 100644
--- a/include/mmsystem.h
+++ b/include/mmsystem.h
@@ -2759,6 +2759,7 @@
 	HMIDI16		hMidi;
 	DWORD		dwCallback;
 	DWORD		dwInstance;
+	UINT16	wDevID;
 } MIDIOPENDESC, *LPMIDIOPENDESC;
 
 typedef struct {
diff --git a/include/module.h b/include/module.h
index bc0e25f..96ca217 100644
--- a/include/module.h
+++ b/include/module.h
@@ -63,7 +63,8 @@
     WORD      size;      /* Segment size on disk */
     WORD      flags;     /* Segment flags */
     WORD      minsize;   /* Min. size of segment in memory */
-    HANDLE16  selector;  /* Selector of segment in memory */
+    HANDLE16  hSeg;      /* Selector or handle (selector - 1) */
+                         /* of segment in memory */
 } SEGTABLEENTRY;
 
 
@@ -143,6 +144,7 @@
 extern HMODULE32 MODULE_CreateDummyModule( const OFSTRUCT *ofs );
 extern FARPROC16 MODULE_GetWndProcEntry16( const char *name );
 extern FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE32 hmodule, LPCSTR name );
+extern SEGPTR WINAPI HasGPHandler( SEGPTR address );
 
 /* loader/ne/module.c */
 extern NE_MODULE *NE_GetPtr( HMODULE16 hModule );
diff --git a/include/multimedia.h b/include/multimedia.h
index d2dcc9c..843228d 100644
--- a/include/multimedia.h
+++ b/include/multimedia.h
@@ -29,7 +29,11 @@
 
 #include <sys/errno.h>
 
+#ifdef HAVE_OSS
+#define MIDI_SEQ "/dev/sequencer"
+#else
 #define MIDI_DEV "/dev/midi"
+#endif
 
 #ifdef SOUND_VERSION
 #define IOCTL(a,b,c)		ioctl(a,b,&c)
@@ -38,40 +42,53 @@
 #endif
 
 typedef struct {
+#ifndef HAVE_OSS
 	int		unixdev;
+#endif
 	int		state;
 	DWORD		bufsize;
-	MIDIOPENDESC	midiDesc;
+	LPMIDIOPENDESC	midiDesc;
 	WORD		wFlags;
 	LPMIDIHDR 	lpQueueHdr;
 	DWORD		dwTotalPlayed;
+#ifdef HAVE_OSS
+	unsigned char	incoming[3];
+	unsigned char	incPrev;
+	char		incLen;
+	DWORD		startTime;
+#endif
 } LINUX_MIDIIN;
 
 typedef struct {
+#ifndef HAVE_OSS
 	int		unixdev;
+#endif
 	int		state;
 	DWORD		bufsize;
-	MIDIOPENDESC	midiDesc;
+	LPMIDIOPENDESC	midiDesc;
 	WORD		wFlags;
 	LPMIDIHDR 	lpQueueHdr;
 	DWORD		dwTotalPlayed;
+#ifdef HAVE_OSS
+	void*		lpExtra;	 	/* according to port type (MIDI, FM...), extra data when needed */
+#endif
 } LINUX_MIDIOUT;
 
 typedef struct {
-	int	nUseCount;          /* Incremented for each shared open */
-	BOOL16	fShareable;         /* TRUE if first open was shareable */
-	WORD	wNotifyDeviceID;    /* MCI device ID with a pending notification */
-	HANDLE16 hCallback;         /* Callback handle for pending notification */
-	HMMIO16	hFile;	            /* mmio file handle open as Element		*/
-	DWORD	dwBeginData;
-	DWORD	dwTotalLen;
-	WORD	wFormat;
-	WORD	nTracks;
-	WORD	nTempo;
+	int		nUseCount;          	/* Incremented for each shared open */
+	BOOL16		fShareable;         	/* TRUE if first open was shareable */
+	WORD		wNotifyDeviceID;    	/* MCI device ID with a pending notification */
+	HANDLE16 	hCallback;         	/* Callback handle for pending notification */
+	HMMIO16		hFile;	            	/* mmio file handle open as Element		*/
+	DWORD		dwBeginData;
+	DWORD		dwTotalLen;
+	WORD		wFormat;
+	WORD		nTracks;
+	WORD		nTempo;
 	MCI_OPEN_PARMS16 openParms;
 /* 	MIDIHDR	MidiHdr; */
 	HLOCAL16	hMidiHdr;
-	WORD	dwStatus;
+	WORD		dwStatus;
 } LINUX_MCIMIDI;
 
 /* function prototypes */
diff --git a/include/multimon.h b/include/multimon.h
new file mode 100644
index 0000000..82f26e6
--- /dev/null
+++ b/include/multimon.h
@@ -0,0 +1,65 @@
+/*
+ * Multimonitor APIs
+ *
+ * Copyright 1998 Turchanov Sergey
+ */
+
+#ifndef __WINE_MULTIMON_H
+#define __WINE_MULTIMON_H
+
+#define MONITOR_DEFAULTTONULL       0x00000000
+#define MONITOR_DEFAULTTOPRIMARY    0x00000001
+#define MONITOR_DEFAULTTONEAREST    0x00000002
+
+#define HMONITOR HANDLE32 
+
+HMONITOR WINAPI MonitorFromPoint(POINT32 pt, DWORD dwFlags);
+
+HMONITOR WINAPI MonitorFromRect(LPRECT32 lprc, DWORD dwFlags);
+
+HMONITOR WINAPI MonitorFromWindow(HWND32 hwnd, DWORD dwFlags);
+
+#define MONITORINFOF_PRIMARY        0x00000001
+
+#ifndef CCHDEVICENAME
+#define CCHDEVICENAME 32
+#endif
+
+typedef struct tagMONITORINFO
+{
+    DWORD   cbSize;
+    RECT32  rcMonitor;
+    RECT32  rcWork;
+    DWORD   dwFlags;
+} MONITORINFO, *LPMONITORINFO;
+
+typedef struct tagMONITORINFOEX32A
+{
+    MONITORINFO dummy;
+    CHAR        szDevice[CCHDEVICENAME];
+} MONITORINFOEX32A, *LPMONITORINFOEX32A;
+
+typedef struct tagMONITORINFOEX32W
+{
+    MONITORINFO dummy;
+    WCHAR       szDevice[CCHDEVICENAME];
+} MONITORINFOEX32W, *LPMONITORINFOEX32W;
+
+DECL_WINELIB_TYPE_AW (MONITOINFOEX)
+DECL_WINELIB_TYPE_AW (LPMONITORINFOEXW)
+
+BOOL32 WINAPI GetMonitorInfo32A(HMONITOR hMonitor, LPMONITORINFO lpmi);
+BOOL32 WINAPI GetMonitorInfo32W(HMONITOR hMonitor, LPMONITORINFO lpmi);
+
+#define GetMonitorInfo WINELIB_NAME_AW(GetMonitorInfo)
+
+typedef BOOL32 (CALLBACK* MONITORENUMPROC)(HMONITOR, HDC32, LPRECT32, LPARAM);
+
+BOOL32 WINAPI EnumDisplayMonitors(
+    HDC32             hdc,
+    LPRECT32         lprcClip,
+    MONITORENUMPROC lpfnEnum,
+    LPARAM          dwData);
+    
+#endif __WINE_MULTIMON_H
+
diff --git a/include/oledlg.h b/include/oledlg.h
index 1b937fc..1b7ce5b 100644
--- a/include/oledlg.h
+++ b/include/oledlg.h
@@ -10,32 +10,32 @@
 #define OLEUI_OK      1 /* OK button pressed */ 
 #define OLEUI_CANCEL  2 /* Cancel button pressed */
 
-typedef void *LPOLEUIINSERTOBJECTA; /* FIXME: stub */
-typedef void *LPOLEUIINSERTOBJECTW; /* FIXME: stub */
+typedef void *LPOLEUIINSERTOBJECT32A; /* FIXME: stub */
+typedef void *LPOLEUIINSERTOBJECT32W; /* FIXME: stub */
 
-typedef void *LPOLEUIPASTESPECIALA;  /* FIXME: stub */
-typedef void *LPOLEUIPASTESPECIALW;  /* FIXME: stub */
+typedef void *LPOLEUIPASTESPECIAL32A;  /* FIXME: stub */
+typedef void *LPOLEUIPASTESPECIAL32W;  /* FIXME: stub */
 
-typedef void *LPOLEUIEDITLINKSA;  /* FIXME: stub */
-typedef void *LPOLEUIEDITLINKSW;  /* FIXME: stub */
+typedef void *LPOLEUIEDITLINKS32A;  /* FIXME: stub */
+typedef void *LPOLEUIEDITLINKS32W;  /* FIXME: stub */
 
-typedef void *LPOLEUICHANGEICONA; /* FIXME: stub */
-typedef void *LPOLEUICHANGEICONW; /* FIXME: stub */
+typedef void *LPOLEUICHANGEICON32A; /* FIXME: stub */
+typedef void *LPOLEUICHANGEICON32W; /* FIXME: stub */
 
-typedef void *LPOLEUICONVERTA; /* FIXME: stub */
-typedef void *LPOLEUICONVERTW; /* FIXME: stub */
+typedef void *LPOLEUICONVERT32A; /* FIXME: stub */
+typedef void *LPOLEUICONVERT32W; /* FIXME: stub */
 
-typedef void *LPOLEUIBUSYA; /* FIXME: stub */
-typedef void *LPOLEUIBUSYW; /* FIXME: stub */
+typedef void *LPOLEUIBUSY32A; /* FIXME: stub */
+typedef void *LPOLEUIBUSY32W; /* FIXME: stub */
 
-typedef void *LPOLEUILINKCONTAINERA; /* FIXME: stub */
-typedef void *LPOLEUILINKCONTAINERW; /* FIXME: stub */
+typedef void *LPOLEUILINKCONTAINER32A; /* FIXME: stub */
+typedef void *LPOLEUILINKCONTAINER32W; /* FIXME: stub */
 
-typedef void *LPOLEUIOBJECTPROPSA; /* FIXME: stub */
-typedef void *LPOLEUIOBJECTPROPSW; /* FIXME: stub */
+typedef void *LPOLEUIOBJECTPROPS32A; /* FIXME: stub */
+typedef void *LPOLEUIOBJECTPROPS32W; /* FIXME: stub */
 
-typedef void *LPOLEUICHANGESOURCEA; /* FIXME: stub */
-typedef void *LPOLEUICHANGESOURCEW; /* FIXME: stub */
+typedef void *LPOLEUICHANGESOURCE32A; /* FIXME: stub */
+typedef void *LPOLEUICHANGESOURCE32W; /* FIXME: stub */
 
 #endif  /* __WINE_OLEDLG_H */
 
diff --git a/include/options.h b/include/options.h
index 2b9fceb..8f047ab 100644
--- a/include/options.h
+++ b/include/options.h
@@ -10,6 +10,10 @@
 #include "wintypes.h"
 
   /* Supported languages */
+  /* When adding a new language look at ole/ole2nls.c 
+   * for the LANG_Xx name to choose, and uncomment there
+   * the proper case line
+   */
 typedef enum
 {
     LANG_En,  /* English */
@@ -19,14 +23,14 @@
     LANG_Fr,  /* French */
     LANG_Fi,  /* Finnish */
     LANG_Da,  /* Danish */
-    LANG_Cz,  /* Czech */
+    LANG_Cs,  /* Czech */
     LANG_Eo,  /* Esperanto */
     LANG_It,  /* Italian */
     LANG_Ko,  /* Korean */
     LANG_Hu,  /* Hungarian */
     LANG_Pl,  /* Polish */
-    LANG_Po,  /* Portuguese */
-    LANG_Sw,  /* Swedish */
+    LANG_Pt,  /* Portuguese */
+    LANG_Sv,  /* Swedish */
     LANG_Ca   /* Catalan */
 } WINE_LANGUAGE;
 
@@ -64,6 +68,7 @@
     WINE_LANGUAGE language; /* Current language */
     int    managed;	    /* Managed windows */
     int    perfectGraphics; /* Favor correctness over speed for graphics */
+    char * configFileName;  /* Command line config file */
 };
 
 extern struct options Options;
@@ -71,6 +76,7 @@
 /* Profile functions */
 
 extern int PROFILE_LoadWineIni(void);
+extern void PROFILE_UsageWineIni(void);
 extern int PROFILE_GetWineIniString( const char *section, const char *key_name,
                                      const char *def, char *buffer, int len );
 extern int PROFILE_GetWineIniInt( const char *section, const char *key_name,
diff --git a/include/psapi.h b/include/psapi.h
new file mode 100644
index 0000000..fd4ff94
--- /dev/null
+++ b/include/psapi.h
@@ -0,0 +1,33 @@
+/*
+ *      psapi.h        -       Declarations for PSAPI
+ */
+
+#ifndef __WINE_PSAPI_H
+#define __WINE_PSAPI_H
+
+typedef struct _MODULEINFO32 {
+  LPVOID lpBaseOfDll;
+  DWORD SizeOfImage;
+  LPVOID EntryPoint;
+} MODULEINFO32, *LPMODULEINFO32;
+
+typedef struct _PROCESS_MEMORY_COUNTERS32 {  
+  DWORD cb;    
+  DWORD PageFaultCount;
+  DWORD PeakWorkingSetSize;
+  DWORD WorkingSetSize;
+  DWORD QuotaPeakPagedPoolUsage;
+  DWORD QuotaPagedPoolUsage;
+  DWORD QuotaPeakNonPagedPoolUsage;  
+  DWORD QuotaNonPagedPoolUsage;
+  DWORD PagefileUsage;    
+  DWORD PeakPagefileUsage;
+} PROCESS_MEMORY_COUNTERS32;
+typedef PROCESS_MEMORY_COUNTERS32 *PPROCESS_MEMORY_COUNTERS32;
+
+typedef struct _PSAPI_WS_WATCH_INFORMATION32 {
+  LPVOID FaultingPc;
+  LPVOID FaultingVa;
+} PSAPI_WS_WATCH_INFORMATION32, *PPSAPI_WS_WATCH_INFORMATION32;
+
+#endif  /* __WINE_PSAPI_H */
diff --git a/include/server.h b/include/server.h
index 30e09ac..e93cea7 100644
--- a/include/server.h
+++ b/include/server.h
@@ -152,9 +152,105 @@
 #define SELECT_ALERTABLE 4
 #define SELECT_TIMEOUT   8
 
+
+/* Create an event */
+struct create_event_request
+{
+    int          manual_reset;  /* manual reset event */
+    int          initial_state; /* initial state of the event */
+    int          inherit;       /* inherit flag */
+    /* char name[] */
+};
+struct create_event_reply
+{
+    int          handle;        /* handle to the event */
+};
+
+/* Event operation */
+struct event_op_request
+{
+    int           handle;       /* handle to event */
+    int           op;           /* event operation (see below) */
+};
+enum event_op { PULSE_EVENT, SET_EVENT, RESET_EVENT };
+
+
+/* Create a mutex */
+struct create_mutex_request
+{
+    int          owned;         /* initially owned? */
+    int          inherit;       /* inherit flag */
+    /* char name[] */
+};
+struct create_mutex_reply
+{
+    int          handle;        /* handle to the mutex */
+};
+
+
+/* Release a mutex */
+struct release_mutex_request
+{
+    int          handle;        /* handle to the mutex */
+};
+
+
+/* Create a semaphore */
+struct create_semaphore_request
+{
+    unsigned int initial;       /* initial count */
+    unsigned int max;           /* maximum count */
+    int          inherit;       /* inherit flag */
+    /* char name[] */
+};
+struct create_semaphore_reply
+{
+    int          handle;        /* handle to the semaphore */
+};
+
+
+/* Release a semaphore */
+struct release_semaphore_request
+{
+    int          handle;        /* handle to the semaphore */
+    unsigned int count;         /* count to add to semaphore */
+};
+struct release_semaphore_reply
+{
+    unsigned int prev_count;    /* previous semaphore count */
+};
+
+/* Open a named object (event, mutex, semaphore) */
+struct open_named_obj_request
+{
+    int          type;         /* object type (see below) */
+    unsigned int access;       /* wanted access rights */
+    int          inherit;      /* inherit flag */
+    /* char name[] */
+};
+enum open_named_obj { OPEN_EVENT, OPEN_MUTEX, OPEN_SEMAPHORE };
+
+struct open_named_obj_reply
+{
+    int          handle;        /* handle to the object */
+};
+
+
 /* client-side functions */
 
 #ifndef __WINE_SERVER__
+
+/* client communication functions */
+enum request;
+#define CHECK_LEN(len,wanted) \
+  if ((len) == (wanted)) ; \
+  else CLIENT_ProtocolError( __FUNCTION__ ": len %d != %d\n", (len), (wanted) );
+extern void CLIENT_ProtocolError( const char *err, ... );
+extern void CLIENT_SendRequest( enum request req, int pass_fd,
+                                int n, ... /* arg_1, len_1, etc. */ );
+extern unsigned int CLIENT_WaitReply( int *len, int *passed_fd,
+                                      int n, ... /* arg_1, len_1, etc. */ );
+
 struct _THDB;
 extern int CLIENT_NewThread( struct _THDB *thdb, int *thandle, int *phandle );
 extern int CLIENT_InitThread(void);
diff --git a/include/server/object.h b/include/server/object.h
index 5268061..a968dda 100644
--- a/include/server/object.h
+++ b/include/server/object.h
@@ -12,6 +12,7 @@
 #endif
 
 #include <sys/time.h>
+#include "server.h"
 #include "server/request.h"
 
 /* kernel objects */
@@ -37,12 +38,16 @@
     struct object_name       *name;
 };
 
-extern void init_object( struct object *obj, const struct object_ops *ops,
-                         const char *name );
+extern void *mem_alloc( size_t size );  /* malloc wrapper */
+extern struct object *create_named_object( const char *name, const struct object_ops *ops,
+                                           size_t size );
+extern int init_object( struct object *obj, const struct object_ops *ops,
+                        const char *name );
 /* grab/release_object can take any pointer, but you better make sure */
 /* that the thing pointed to starts with a struct object... */
 extern struct object *grab_object( void *obj );
 extern void release_object( void *obj );
+extern struct object *find_object( const char *name );
 
 /* request handlers */
 
@@ -97,6 +102,31 @@
                                       unsigned int access, const struct object_ops *ops );
 extern int duplicate_handle( struct process *src, int src_handle, struct process *dst,
                              int dst_handle, unsigned int access, int inherit, int options );
+extern int open_object( const char *name, const struct object_ops *ops,
+                        unsigned int access, int inherit );
+
+/* event functions */
+
+extern struct object *create_event( const char *name, int manual_reset, int initial_state );
+extern int open_event( unsigned int access, int inherit, const char *name );
+extern int pulse_event( int handle );
+extern int set_event( int handle );
+extern int reset_event( int handle );
+
+
+/* mutex functions */
+
+extern struct object *create_mutex( const char *name, int owned );
+extern int open_mutex( unsigned int access, int inherit, const char *name );
+extern int release_mutex( int handle );
+extern void abandon_mutexes( struct thread *thread );
+
+
+/* semaphore functions */
+
+extern struct object *create_semaphore( const char *name, unsigned int initial, unsigned int max );
+extern int open_semaphore( unsigned int access, int inherit, const char *name );
+extern int release_semaphore( int handle, unsigned int count, unsigned int *prev_count );
 
 extern int debug_level;
 
diff --git a/include/server/request.h b/include/server/request.h
index b882ebc..2dc80a5 100644
--- a/include/server/request.h
+++ b/include/server/request.h
@@ -15,6 +15,13 @@
     REQ_DUP_HANDLE,
     REQ_OPEN_PROCESS,
     REQ_SELECT,
+    REQ_CREATE_EVENT,
+    REQ_EVENT_OP,
+    REQ_CREATE_MUTEX,
+    REQ_RELEASE_MUTEX,
+    REQ_CREATE_SEMAPHORE,
+    REQ_RELEASE_SEMAPHORE,
+    REQ_OPEN_NAMED_OBJ,
     REQ_NB_REQUESTS
 };
 
@@ -33,6 +40,13 @@
 DECL_HANDLER(dup_handle);
 DECL_HANDLER(open_process);
 DECL_HANDLER(select);
+DECL_HANDLER(create_event);
+DECL_HANDLER(event_op);
+DECL_HANDLER(create_mutex);
+DECL_HANDLER(release_mutex);
+DECL_HANDLER(create_semaphore);
+DECL_HANDLER(release_semaphore);
+DECL_HANDLER(open_named_obj);
 
 static const struct handler {
     void       (*handler)();
@@ -48,6 +62,13 @@
     { (void(*)())req_dup_handle, sizeof(struct dup_handle_request) },
     { (void(*)())req_open_process, sizeof(struct open_process_request) },
     { (void(*)())req_select, sizeof(struct select_request) },
+    { (void(*)())req_create_event, sizeof(struct create_event_request) },
+    { (void(*)())req_event_op, sizeof(struct event_op_request) },
+    { (void(*)())req_create_mutex, sizeof(struct create_mutex_request) },
+    { (void(*)())req_release_mutex, sizeof(struct release_mutex_request) },
+    { (void(*)())req_create_semaphore, sizeof(struct create_semaphore_request) },
+    { (void(*)())req_release_semaphore, sizeof(struct release_semaphore_request) },
+    { (void(*)())req_open_named_obj, sizeof(struct open_named_obj_request) },
 };
 #endif  /* WANT_REQUEST_HANDLERS */
 
diff --git a/include/server/thread.h b/include/server/thread.h
index 7f7df8d..c9c373a 100644
--- a/include/server/thread.h
+++ b/include/server/thread.h
@@ -17,6 +17,7 @@
 
 struct process;
 struct thread_wait;
+struct mutex;
 
 enum run_state { STARTING, RUNNING, TERMINATED };
 
@@ -28,6 +29,7 @@
     struct thread      *proc_next; /* per-process thread list */
     struct thread      *proc_prev;
     struct process     *process;
+    struct mutex       *mutex;     /* list of currently owned mutexes */
     struct thread_wait *wait;      /* current wait condition if sleeping */
     int                 error;     /* current error code */
     enum run_state      state;     /* running state */
@@ -57,6 +59,7 @@
                       int flags, int timeout );
 extern void wake_up( struct object *obj, int max );
 
+#define GET_ERROR()     (current->error)
 #define SET_ERROR(err)  (current->error = (err))
 #define CLEAR_ERROR()   (current->error = 0)
 
diff --git a/include/shell.h b/include/shell.h
index 3475ca4..f4fd676 100644
--- a/include/shell.h
+++ b/include/shell.h
@@ -224,7 +224,7 @@
 *  string and path functions
 */
 LPSTR WINAPI PathAddBackslash(LPSTR path);	
-LPSTR WINAPI PathCombine(LPSTR target,LPSTR x1,LPSTR x2);
+LPSTR WINAPI PathCombine(LPSTR szDest, LPCSTR lpszDir, LPCSTR lpszFile);
 LPSTR WINAPI PathRemoveBlanks(LPSTR str);
 LPSTR WINAPI PathFindFilename(LPSTR fn);
 /****************************************************************************
diff --git a/include/shlobj.h b/include/shlobj.h
index fd4599d..050f54a 100644
--- a/include/shlobj.h
+++ b/include/shlobj.h
@@ -30,15 +30,40 @@
 typedef struct tagSHELLEXTINIT	*LPSHELLEXTINIT,IShellExtInit;
 typedef struct tagENUMIDLIST	*LPENUMIDLIST,	IEnumIDList;
 typedef struct tagSHELLFOLDER	*LPSHELLFOLDER,	IShellFolder;
-typedef struct tagSHELLVIEW		*LPSHELLVIEW,	IShellView;
+typedef struct tagSHELLVIEW	*LPSHELLVIEW,	IShellView;
 typedef struct tagSHELLBROWSER	*LPSHELLBROWSER,IShellBrowser;
-
-typedef struct IDataObject		IDataObject,	*LPDATAOBJECT;
-
+typedef struct tagDATAOBJECT	*LPDATAOBJECT,	IDataObject;
+typedef struct tagSHELLICON	*LPSHELLICON,	IShellIcon;
+typedef struct tagDOCKINGWINDOWFRAME	*LPDOCKINGWINDOWFRAME,	IDockingWindowFrame;
+typedef struct tagSERVICEPROVIDER	*LPSERVICEPROVIDER,	IServiceProvider;
+typedef struct tagCOMMDLGBROWSER	*LPCOMMDLGBROWSER,	ICommDlgBrowser;
+typedef struct tagENUMFORMATETC	*LPENUMFORMATETC,	IEnumFORMATETC;
+ 
+typedef struct IAdviseSink		IAdviseSink,	*LPIADVISESINK;
+typedef struct IEnumSTATDATA		IEnumSTATDATA,	*LPENUMSTATDATA;
 /****************************************************************************
 *  SHELL ID
 */
-/* shell32 classids */
+/* strange Objects */
+DEFINE_SHLGUID(IID_IEnumUnknown,	0x00000100L, 0, 0);
+DEFINE_SHLGUID(IID_IEnumString,		0x00000101L, 0, 0);
+DEFINE_SHLGUID(IID_IEnumMoniker,	0x00000102L, 0, 0);
+DEFINE_SHLGUID(IID_IEnumFORMATETC,	0x00000103L, 0, 0);
+DEFINE_SHLGUID(IID_IEnumOLEVERB,	0x00000104L, 0, 0);
+DEFINE_SHLGUID(IID_IEnumSTATDATA,	0x00000105L, 0, 0);
+
+DEFINE_SHLGUID(IID_IPersistStream,	0x00000109L, 0, 0);
+DEFINE_SHLGUID(IID_IPersistStorage,	0x0000010AL, 0, 0);
+DEFINE_SHLGUID(IID_IPersistFile,	0x0000010BL, 0, 0);
+DEFINE_SHLGUID(IID_IPersist,		0x0000010CL, 0, 0);
+DEFINE_SHLGUID(IID_IViewObject,		0x0000010DL, 0, 0);
+DEFINE_SHLGUID(IID_IDataObject,		0x0000010EL, 0, 0);
+
+DEFINE_GUID (IID_IServiceProvider,	0x6D5140C1L, 0x7436, 0x11CE, 0x80, 0x34, 0x00, 0xAA, 0x00, 0x60, 0x09, 0xFA);
+DEFINE_GUID (IID_IDockingWindow,	0x012dd920L, 0x7B26, 0x11D0, 0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8);
+DEFINE_GUID (IID_IDockingWindowSite,	0x2A342FC2L, 0x7B26, 0x11D0, 0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8);
+DEFINE_GUID (IID_IDockingWindowFrame,	0x47D2657AL, 0x7B27, 0x11D0, 0x8C, 0xA9, 0x00, 0xA0, 0xC9, 0x2D, 0xBF, 0xE8);
+
 DEFINE_SHLGUID(CLSID_ShellDesktop,      0x00021400L, 0, 0);
 DEFINE_SHLGUID(CLSID_ShellLink,         0x00021401L, 0, 0);
 /* shell32 formatids */
@@ -51,6 +76,7 @@
  /* shell32interface ids */
 DEFINE_SHLGUID(IID_INewShortcutHookA,   0x000214E1L, 0, 0);
 DEFINE_SHLGUID(IID_IShellBrowser,       0x000214E2L, 0, 0);
+#define SID_SShellBrowser IID_IShellBrowser
 DEFINE_SHLGUID(IID_IShellView,          0x000214E3L, 0, 0);
 DEFINE_SHLGUID(IID_IContextMenu,        0x000214E4L, 0, 0);
 DEFINE_SHLGUID(IID_IShellIcon,          0x000214E5L, 0, 0);
@@ -95,6 +121,12 @@
  */
 #define THIS LPCONTEXTMENU this
 
+/* default menu items*/
+#define IDM_EXPLORE  0
+#define IDM_OPEN     1
+#define IDM_RENAME   2
+#define IDM_LAST     IDM_RENAME
+
 /* QueryContextMenu uFlags */
 #define CMF_NORMAL              0x00000000
 #define CMF_DEFAULTONLY         0x00000001
@@ -205,6 +237,100 @@
 
 #undef THIS
 /*****************************************************************************
+ * IData structures
+ */
+typedef struct
+{	DWORD tdSize;
+	WORD tdDriverNameOffset;
+	WORD tdDeviceNameOffset;
+	WORD tdPortNameOffset;
+	WORD tdExtDevmodeOffset;
+	BYTE tdData[ 1 ];
+}   DVTARGETDEVICE32;
+
+typedef WORD CLIPFORMAT32, *LPCLIPFORMAT32;
+
+typedef struct 
+{	DWORD tymed;
+	union 
+	{ HBITMAP32 hBitmap;
+	  /*HMETAFILEPICT32 hMetaFilePict;*/
+	  /*HENHMETAFILE32 hEnhMetaFile;*/
+	  HGLOBAL32 hGlobal;
+	  LPOLESTR32 lpszFileName;
+	  IStream32 *pstm;
+	  IStorage32 *pstg;
+        } u;
+	IUnknown *pUnkForRelease;
+} STGMEDIUM32;   
+ 
+typedef struct 
+{	CLIPFORMAT32 cfFormat;
+	DVTARGETDEVICE32 *ptd;
+	DWORD dwAspect;
+	LONG lindex;
+	DWORD tymed;
+} FORMATETC32, *LPFORMATETC32;
+
+/*****************************************************************************
+ * IEnumFORMATETC interface
+ */
+#define THIS LPENUMFORMATETC this
+
+typedef struct IEnumFORMATETC_VTable 
+{    /* IUnknown methods */
+	STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+	STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+	STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+	/* IEnumFORMATETC methods */
+	STDMETHOD (Next)(THIS_ ULONG celt, FORMATETC32 *rgelt, ULONG *pceltFethed) PURE;
+	STDMETHOD (Skip)(THIS_ ULONG celt) PURE;
+	STDMETHOD (Reset)(THIS) PURE;
+	STDMETHOD (Clone)(THIS_ IEnumFORMATETC ** ppenum) PURE;
+} IEnumFORMATETC_VTable,*LPENUMFORMATETC_VTABLE;
+
+struct tagENUMFORMATETC
+{	LPENUMFORMATETC_VTABLE	lpvtbl;
+	DWORD			 ref;
+        UINT32	posFmt;
+        UINT32	countFmt;
+        LPFORMATETC32 pFmt;
+};
+
+#undef THIS
+
+/*****************************************************************************
+ * IDataObject interface
+ */
+#define THIS LPDATAOBJECT this
+
+typedef struct IDataObject_VTable 
+{	/*** IUnknown methods ***/
+	STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+	STDMETHOD_(ULONG,AddRef) (THIS) PURE;
+	STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+	STDMETHOD (GetData )(THIS_ LPFORMATETC32 pformatetcIn, STGMEDIUM32 *pmedium) PURE;
+	STDMETHOD (GetDataHere)(THIS_ LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium) PURE;
+        STDMETHOD (QueryGetData)(THIS_ LPFORMATETC32 pformatetc) PURE;
+        STDMETHOD (GetCanonicalFormatEtc)(THIS_ LPFORMATETC32 pformatectIn, LPFORMATETC32 pformatetcOut) PURE;
+        STDMETHOD (SetData)(THIS_ LPFORMATETC32 pformatetc, STGMEDIUM32 *pmedium, BOOL32 fRelease) PURE;
+        STDMETHOD (EnumFormatEtc)(THIS_ DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc) PURE;
+        STDMETHOD (DAdvise )(THIS_ LPFORMATETC32 *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection) PURE;
+        STDMETHOD (DUnadvise)(THIS_ DWORD dwConnection) PURE;
+        STDMETHOD (EnumDAdvise)(THIS_ IEnumSTATDATA **ppenumAdvise) PURE;
+} IDataObject_VTable,*LPDATAOBJECT_VTABLE;
+
+struct tagDATAOBJECT
+{	LPDATAOBJECT_VTABLE	lpvtbl;
+	DWORD			 ref;
+};
+
+#undef THIS
+
+
+/*****************************************************************************
  * IShellExtInit interface
  */
 #define THIS LPSHELLEXTINIT this
@@ -402,19 +528,50 @@
 };
 
 extern LPSHELLFOLDER pdesktopfolder;
+
+/************************
+* Shellfolder API
+*/
+DWORD WINAPI SHGetDesktopFolder(LPSHELLFOLDER *);
 #undef THIS
 
 /************************************************************************
 * IShellBrowser interface
 */
 #define THIS LPSHELLBROWSER this
+/* targets for GetWindow/SendControlMsg */
+#define FCW_STATUS		0x0001
+#define FCW_TOOLBAR		0x0002
+#define FCW_TREE		0x0003
+#define FCW_INTERNETBAR		0x0006
+#define FCW_PROGRESS		0x0008
 
-#define FCW_STATUS      0x0001
-#define FCW_TOOLBAR     0x0002
-#define FCW_TREE        0x0003
-#define FCW_INTERNETBAR 0x0006
-#define FCW_PROGRESS    0x0008
+/* wFlags for BrowseObject*/
+#define SBSP_DEFBROWSER		0x0000
+#define SBSP_SAMEBROWSER	0x0001
+#define SBSP_NEWBROWSER		0x0002
 
+#define SBSP_DEFMODE		0x0000
+#define SBSP_OPENMODE		0x0010
+#define SBSP_EXPLOREMODE	0x0020
+
+#define SBSP_ABSOLUTE		0x0000
+#define SBSP_RELATIVE		0x1000
+#define SBSP_PARENT		0x2000
+#define SBSP_NAVIGATEBACK	0x4000
+#define SBSP_NAVIGATEFORWARD	0x8000
+
+#define SBSP_ALLOW_AUTONAVIGATE		0x10000
+
+#define SBSP_INITIATEDBYHLINKFRAME	0x80000000
+#define SBSP_REDIRECT			0x40000000
+#define SBSP_WRITENOHISTORY		0x08000000
+
+/* uFlage for SetToolbarItems */
+#define FCT_MERGE       0x0001
+#define FCT_CONFIGABLE  0x0002
+#define FCT_ADDTOEND    0x0004
+ 
 typedef struct IShellBrowser_VTable 
 {    // *** IUnknown methods ***
     STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
@@ -536,7 +693,7 @@
     STDMETHOD(SaveViewState)(THIS) PURE;
     STDMETHOD(SelectItem)(THIS_ LPCITEMIDLIST pidlItem, UINT32 uFlags) PURE;
     STDMETHOD(GetItemObject)(THIS_ UINT32 uItem, REFIID riid,LPVOID *ppv) PURE;
-} IShellView_VTable,*LPSHELLVIEW_VTABLE;;
+} IShellView_VTable,*LPSHELLVIEW_VTABLE;
 
 struct tagSHELLVIEW 
 { LPSHELLVIEW_VTABLE lpvtbl;
@@ -544,6 +701,7 @@
   LPITEMIDLIST       mpidl;
   LPSHELLFOLDER      pSFParent;
   LPSHELLBROWSER     pShellBrowser;
+  LPCOMMDLGBROWSER   pCommDlgBrowser;
   HWND32             hWnd;
   HWND32             hWndList;
   FOLDERSETTINGS     FolderSettings;
@@ -553,10 +711,37 @@
 };
 
 typedef GUID SHELLVIEWID;
-#define SV_CLASS_NAME   ("ShellViewClass")
+#define SV_CLASS_NAME   ("SHELLDLL_DefView")
 
 #undef THIS
+/****************************************************************************
+ * ICommDlgBrowser interface
+ */
+#define THIS LPCOMMDLGBROWSER this
 
+/* for OnStateChange*/
+#define CDBOSC_SETFOCUS     0x00000000
+#define CDBOSC_KILLFOCUS    0x00000001
+#define CDBOSC_SELCHANGE    0x00000002
+#define CDBOSC_RENAME       0x00000003
+
+typedef struct ICommDlgBrowser_VTable
+{   /* IUnknown methods */
+    STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+    /* ICommDlgBrowser methods */
+    STDMETHOD(OnDefaultCommand) (THIS_  LPSHELLVIEW ppshv) PURE;
+    STDMETHOD(OnStateChange) (THIS_ LPSHELLVIEW ppshv, ULONG uChange) PURE;
+    STDMETHOD(IncludeObject) (THIS_ LPSHELLVIEW ppshv, LPCITEMIDLIST pidl) PURE;
+} ICommDlgBrowser_VTable,*LPCOMMDLGBROWSER_VTABLE;
+
+struct tagCOMMDLGBROWSER
+{ LPCOMMDLGBROWSER_VTABLE lpvtbl;
+  DWORD			     ref;
+};
+#undef THIS
 /****************************************************************************
  * IShellLink interface
  */
@@ -666,7 +851,7 @@
  */
 
 #define THIS LPSHELLICON this
-typedef struct IShellIcon IShellIcon,*LPSHELLICON;
+
 typedef struct IShellIcon_VTable
 { /*** IUnknown methods ***/
   STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
@@ -677,24 +862,73 @@
   STDMETHOD(GetIconOf)(THIS_ LPCITEMIDLIST pidl, UINT32 flags, LPINT32 lpIconIndex) PURE;
 } IShellIcon_VTable,*LPSHELLICON_VTABLE;
 
-struct IShellIcon
+struct tagSHELLICON
 { LPSHELLICON_VTABLE lpvtbl;
   DWORD ref;
 };
 #undef THIS
+/****************************************************************************
+ * IDockingWindowFrame interface
+ */
+#define THIS LPDOCKINGWINDOWFRAME this
 
+#define DWFRF_NORMAL		0x0000  /* femove toolbar flags*/
+#define DWFRF_DELETECONFIGDATA	0x0001
+#define DWFAF_HIDDEN		0x0001   /* add tolbar*/
 
+typedef struct IDockingWindowFrame_VTable
+{   STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+    STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+    STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+    /*** IOleWindow methods ***/
+    STDMETHOD(GetWindow) (THIS_ HWND32 * lphwnd) PURE;
+    STDMETHOD(ContextSensitiveHelp) (THIS_ BOOL32 fEnterMode) PURE;
+
+    /*** IDockingWindowFrame methods ***/
+    STDMETHOD(AddToolbar) (THIS_ IUnknown* punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags) PURE;
+    STDMETHOD(RemoveToolbar) (THIS_ IUnknown* punkSrc, DWORD dwRemoveFlags) PURE;
+    STDMETHOD(FindToolbar) (THIS_ LPCWSTR pwszItem, REFIID riid, LPVOID* ppvObj) PURE;
+} IDockingWindowFrame_VTable, *LPDOCKINGWINDOWFRAME_VTABLE;
+
+struct tagDOCKINGWINDOWFRAME
+{ LPDOCKINGWINDOWFRAME_VTABLE lpvtbl;
+  DWORD ref;
+};
+
+#undef THIS
+/****************************************************************************
+ * IServiceProvider interface
+ */
+#define THIS LPSERVICEPROVIDER this
+
+typedef struct IServiceProvider_VTable
+{	/*** IUnknown methods ***/
+	STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
+	STDMETHOD_(ULONG,AddRef) (THIS)  PURE;
+	STDMETHOD_(ULONG,Release) (THIS) PURE;
+
+	STDMETHOD(QueryService)(THIS_ REFGUID guidService, REFIID riid, void **ppvObject);
+} IServiceProvider_VTable, *LPSERVICEPROVIDER_VTABLE;
+
+struct tagSERVICEPROVIDER
+{	LPSERVICEPROVIDER_VTABLE lpvtbl;
+	DWORD ref;
+};           
 /****************************************************************************
  * Class constructors
  */
 #ifdef __WINE__
-extern LPCLASSFACTORY IClassFactory_Constructor();
-extern LPCONTEXTMENU IContextMenu_Constructor(LPSHELLFOLDER, LPCITEMIDLIST *, UINT32);
-extern LPSHELLFOLDER IShellFolder_Constructor(LPSHELLFOLDER,LPITEMIDLIST);
-extern LPSHELLVIEW IShellView_Constructor();
-extern LPSHELLLINK IShellLink_Constructor();
-extern LPENUMIDLIST IEnumIDList_Constructor(LPCSTR,DWORD,HRESULT*);
-extern LPEXTRACTICON IExtractIcon_Constructor(LPITEMIDLIST);
+extern LPDATAOBJECT	IDataObject_Constructor();
+extern LPENUMFORMATETC	IEnumFORMATETC_Constructor(UINT32, const FORMATETC32 []);
+
+extern LPCLASSFACTORY	IClassFactory_Constructor();
+extern LPCONTEXTMENU	IContextMenu_Constructor(LPSHELLFOLDER, LPCITEMIDLIST *, UINT32);
+extern LPSHELLFOLDER	IShellFolder_Constructor(LPSHELLFOLDER,LPITEMIDLIST);
+extern LPSHELLVIEW	IShellView_Constructor();
+extern LPSHELLLINK	IShellLink_Constructor();
+extern LPENUMIDLIST	IEnumIDList_Constructor(LPCSTR,DWORD);
+extern LPEXTRACTICON	IExtractIcon_Constructor(LPITEMIDLIST);
 #endif
 /****************************************************************************
  * Shell Execute API
diff --git a/include/sysmetrics.h b/include/sysmetrics.h
index 101f317..bfb6cf3 100644
--- a/include/sysmetrics.h
+++ b/include/sysmetrics.h
@@ -129,6 +129,13 @@
 #define SYSMETRICS_MIDEASTENABLED       sysMetrics[SM_MIDEASTENABLED]       /* 74 */
 #define SYSMETRICS_MOUSEWHEELPRESENT    sysMetrics[SM_MOUSEWHEELPRESENT]    /* 75 */
 
+#define SYSMETRICS_CXVIRTUALSCREEN	sysMetrics[SM_CXVIRTUALSCREEN]	    /* 77 */
+#define SYSMETRICS_CYVIRTUALSCREEN	sysMetrics[SM_CYVIRTUALSCREEN]	    /* 77 */
+#define SYSMETRICS_YVIRTUALSCREEN	sysMetrics[SM_YVIRTUALSCREEN]	    /* 78 */
+#define SYSMETRICS_XVIRTUALSCREEN	sysMetrics[SM_XVIRTUALSCREEN]	    /* 79 */
+#define SYSMETRICS_CMONITORS		sysMetrics[SM_CMONITORS]	    /* 81 */
+#define SYSMETRICS_SAMEDISPLAYFORMAT	sysMetrics[SM_SAMEDISPLAYFORMAT]    /* 82 */
+
 extern void SYSMETRICS_Init(void);  /* sysmetrics.c */
 extern short sysMetrics[SM_CMETRICS+1];
 
diff --git a/include/thread.h b/include/thread.h
index 22e62bf..60c4220 100644
--- a/include/thread.h
+++ b/include/thread.h
@@ -7,12 +7,29 @@
 #ifndef __WINE_THREAD_H
 #define __WINE_THREAD_H
 
+#include "config.h"
 #include "k32obj.h"
 #include "windows.h"
 #include "winbase.h"
 #include "winnt.h"
 #include "selectors.h"  /* for SET_FS */
 
+#ifdef linux
+#define HAVE_CLONE_SYSCALL
+#endif
+
+/* This is what we will use on *BSD, once threads using rfork() get
+ * implemented:
+ *
+ * #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
+ * #define HAVE_RFORK
+ * #endif
+ */
+
+#if (defined(HAVE_CLONE_SYSCALL) || defined(HAVE_RFORK)) && !defined(NO_REENTRANT_LIBC)
+#define USE_THREADS
+#endif
+
 struct _PDB32;
 
 /* Thread exception block */
@@ -133,6 +150,7 @@
                             LPTHREAD_START_ROUTINE start_addr, LPVOID param );
 extern THDB *THREAD_Current(void);
 extern BOOL32 THREAD_IsWin16( THDB *thdb );
+extern THDB *THREAD_IdToTHDB( DWORD id );
 extern void THREAD_Start( THDB *thdb );
 extern THDB *THREAD_GetPtr( HANDLE32 handle, DWORD access, int *server_handle );
 extern void THREAD_AddQueue( THREAD_QUEUE *queue, THDB *thread );
diff --git a/include/toolbar.h b/include/toolbar.h
index 1f4f443..3560067 100644
--- a/include/toolbar.h
+++ b/include/toolbar.h
@@ -53,6 +53,7 @@
     BOOL32     bTransparent;    /* background transparency flag */
     BOOL32     bAutoSize;       /* auto size deadlock indicator */
     DWORD      dwExStyle;       /* extended toolbar style */
+    DWORD      dwDTFlags;       /* DrawText flags */
 
     COLORREF   clrInsertMark;   /* insert mark color */
     RECT32     rcBound;         /* bounding rectangle */
diff --git a/include/tooltips.h b/include/tooltips.h
index d0d0c72..c38e94c 100644
--- a/include/tooltips.h
+++ b/include/tooltips.h
@@ -30,25 +30,26 @@
 
 typedef struct tagTOOLTIPS_INFO
 {
-    CHAR        szTipText[INFOTIPSIZE];
-    BOOL32      bActive;
-    BOOL32      bTrackActive;
-    UINT32      uNumTools;
-    COLORREF    clrBk;
-    COLORREF    clrText;
-    HFONT32     hFont;
-    INT32       xTrackPos;
-    INT32       yTrackPos;
-    INT32       nMaxTipWidth;
-    INT32       nTool;
-    INT32       nOldTool;
-    INT32       nCurrentTool;
-    INT32       nTrackTool;
-    INT32       nAutomaticTime;
-    INT32       nReshowTime;
-    INT32       nAutoPopTime;
-    INT32       nInitialTime;
-    RECT32      rcMargin;
+    CHAR       szTipText[INFOTIPSIZE];
+    BOOL32     bActive;
+    BOOL32     bTrackActive;
+    UINT32     uNumTools;
+    COLORREF   clrBk;
+    COLORREF   clrText;
+    HFONT32    hFont;
+    INT32      xTrackPos;
+    INT32      yTrackPos;
+    INT32      nMaxTipWidth;
+    INT32      nTool;
+    INT32      nOldTool;
+    INT32      nCurrentTool;
+    INT32      nTrackTool;
+    INT32      nAutomaticTime;
+    INT32      nReshowTime;
+    INT32      nAutoPopTime;
+    INT32      nInitialTime;
+    RECT32     rcMargin;
+
     TTTOOL_INFO *tools;
 } TOOLTIPS_INFO;
 
diff --git a/include/trackbar.h b/include/trackbar.h
index f9ee1e8..3da5a65 100644
--- a/include/trackbar.h
+++ b/include/trackbar.h
@@ -18,13 +18,17 @@
     INT32  nPos;
     UINT32 uThumbLen;
     UINT32 uNumTics;
+	UINT32  uTicFreq;
     HWND32 hwndToolTip;
     HWND32 hwndBuddyLA;
     HWND32 hwndBuddyRB;
     INT32  fLocation;
-
+	COLORREF clrBk;
+	
+	INT32  flags;
     BOOL32 bFocus;
     RECT32 rcChannel;
+    RECT32 rcSelection;
     RECT32 rcThumb;
     LPLONG tics;
 } TRACKBAR_INFO;
diff --git a/include/treeview.h b/include/treeview.h
index 0c315d4..2e19fae 100644
--- a/include/treeview.h
+++ b/include/treeview.h
@@ -2,19 +2,79 @@
  * Treeview class extra info
  *
  * Copyright 1998 Eric Kohl
+ * Copyright 1998 Alex Priem
  */
 
 #ifndef __WINE_TREEVIEW_H
 #define __WINE_TREEVIEW_H
 
+#define MINIMUM_INDENT 10
+
+
+#define TVITEM_ALLOC	16
+#define TV_REFRESH_TIMER 1	
+#define TV_EDIT_TIMER    2
+#define TV_REFRESH_TIMER_SET 1  
+#define TV_EDIT_TIMER_SET 2  
+#define TV_REFRESH_DELAY 100     /* 100 ms delay between two refreshes */
+#define TV_DEFAULTITEMHEIGHT 15
+
+/* internal structures */
+
+typedef struct {
+    UINT32 mask;
+    HTREEITEM hItem;
+    UINT32 state;
+    UINT32 stateMask;
+    LPSTR pszText;
+    int cchTextMax;
+    int iImage;
+    int iSelectedImage;
+    int cChildren;
+    LPARAM lParam;
+    int iIntegral;
+	int clrText;
+	
+	int parent;	    /* handle to parent or 0 if at root*/
+	int firstChild;     /* handle to first child or 0 if no child*/
+	int sibling;        /* handle to next item in list, 0 if last */
+	int upsibling;      /* handle to previous item in list, 0 if first */
+	int visible;
+        RECT32 rect;
+	RECT32 text;
+} TREEVIEW_ITEM;
+
+
+#define TV_HSCROLL 	0x01    /* treeview too large to fit in window */
+#define TV_VSCROLL 	0x02	/* (horizontal/vertical) */
+
 typedef struct tagTREEVIEW_INFO
 {
-    COLORREF clrBk;
+    UINT32	uInternalStatus;		
+    UINT32  uNumItems;	/* number of valid TREEVIEW_ITEMs */
+    UINT32	uNumPtrsAlloced; 
+    UINT32	uMaxHandle;	/* needed for delete_item */
+    HTREEITEM 	TopRootItem;	/* handle to first item in treeview */
+
+	UINT32	uItemHeight;		/* item height, -1 for default item height */
+	UINT32 	uRealItemHeight;	/* real item height in pixels */
+	UINT32	uVisibleHeight;	    /* visible height of treeview in pixels */
+    UINT32	uTotalHeight;		/* total height of treeview in pixels */
+    UINT32	uIndent;		/* indentation in pixels */
+    HTREEITEM	selectedItem;   /* handle to selected item or 0 if none */
+    HTREEITEM   firstVisible;	/* handle to first visible item */
+    HTREEITEM   dropItem;	/* handle to item selected by drag cursor */
+    INT32	cx,cy;		/* current x/y place in list */
+    COLORREF clrBk;		
     COLORREF clrText;
+    HFONT32     hFont;
 
-    HIMAGELIST himlNormal;
+    HIMAGELIST himlNormal;	
     HIMAGELIST himlState;
-
+    TREEVIEW_ITEM *items;	/* itemlist */
+    INT32	*freeList;	/* bitmap indicating which elements are valid */
+				/* 1=valid, 0=free; 	*/
+				/* size of list= uNumPtrsAlloced/32 */
 
 } TREEVIEW_INFO;
 
diff --git a/include/tweak.h b/include/tweak.h
index 06bffee..b9c39c7 100644
--- a/include/tweak.h
+++ b/include/tweak.h
@@ -11,13 +11,17 @@
 
 #include "wintypes.h"
 
+typedef enum
+{
+    WIN31_LOOK,
+    WIN95_LOOK,
+    WIN98_LOOK
+} WINE_LOOK;
+
+
 int  TWEAK_Init(void);
 int  TWEAK_CheckConfiguration(void);
-void  TWEAK_DrawReliefRect95(HDC32, RECT32 const *);
-void  TWEAK_DrawRevReliefRect95(HDC32, RECT32 const *);
-void  TWEAK_DrawMenuSeparatorHoriz95(HDC32, UINT32, UINT32, UINT32);
-void  TWEAK_DrawMenuSeparatorVert95(HDC32, UINT32, UINT32, UINT32);
-extern int  TWEAK_Win95Look;
-extern int  TWEAK_WineInitialized;
+
+extern WINE_LOOK TWEAK_WineLook;
 
 #endif /* __WINE_TWEAK_H */
diff --git a/include/version.h b/include/version.h
index 0062e05..49e51e5 100644
--- a/include/version.h
+++ b/include/version.h
@@ -1 +1 @@
-#define WINE_RELEASE_INFO "Wine release 980913"
+#define WINE_RELEASE_INFO "Wine release 980927"
diff --git a/include/vfw.h b/include/vfw.h
new file mode 100644
index 0000000..8500da8
--- /dev/null
+++ b/include/vfw.h
@@ -0,0 +1,272 @@
+#ifndef __WINE_VFW_H
+#define __WINE_VFW_H
+
+#include <wintypes.h>
+#include <driver.h>
+
+#define VFWAPI	WINAPI
+#define VFWAPIV	WINAPIV
+
+DWORD VFWAPI VideoForWindowsVersion(void);
+
+#ifndef aviTWOCC
+#define aviTWOCC(ch0, ch1) ((WORD)(BYTE)(ch0) | ((WORD)(BYTE)(ch1) << 8))
+#endif
+
+#define ICTYPE_VIDEO	mmioFOURCC('v', 'i', 'd', 'c')
+#define ICTYPE_AUDIO	mmioFOURCC('a', 'u', 'd', 'c')
+
+
+/* Installable Compressor M? */
+
+/* HIC32 struct (same layout as Win95 one) */
+typedef struct tagWINE_HIC {
+	DWORD		magic;		/* 00: 'Smag' */
+	HANDLE32	curthread;	/* 04: */
+	DWORD		type;		/* 08: */
+	DWORD		handler;	/* 0C: */
+	HDRVR32		hdrv;		/* 10: */
+	DWORD		private;	/* 14: private data passed to drv */
+	FARPROC32	driverproc;	/* 18: */
+	DWORD		x1;		/* 1c: name? */
+	WORD		x2;		/* 20: */
+	DWORD		x3;		/* 22: */
+					/* 26: */
+} WINE_HIC;
+
+/* error return codes */
+#define	ICERR_OK		0
+#define	ICERR_DONTDRAW		1
+#define	ICERR_NEWPALETTE	2
+#define	ICERR_GOTOKEYFRAME	3
+#define	ICERR_STOPDRAWING	4
+
+#define	ICERR_UNSUPPORTED	-1
+#define	ICERR_BADFORMAT		-2
+#define	ICERR_MEMORY		-3
+#define	ICERR_INTERNAL		-4
+#define	ICERR_BADFLAGS		-5
+#define	ICERR_BADPARAM		-6
+#define	ICERR_BADSIZE		-7
+#define	ICERR_BADHANDLE		-8
+#define	ICERR_CANTUPDATE	-9
+#define	ICERR_ABORT		-10
+#define	ICERR_ERROR		-100
+#define	ICERR_BADBITDEPTH	-200
+#define	ICERR_BADIMAGESIZE	-201
+
+#define	ICERR_CUSTOM		-400
+
+/* ICM Messages */
+#define	ICM_USER		(DRV_USER+0x0000)
+
+/* ICM driver message range */
+#define	ICM_RESERVED_LOW	(DRV_USER+0x1000)
+#define	ICM_RESERVED_HIGH	(DRV_USER+0x2000)
+#define	ICM_RESERVED		ICM_RESERVED_LOW
+
+#define	ICM_GETSTATE		(ICM_RESERVED+0)
+#define	ICM_SETSTATE		(ICM_RESERVED+1)
+#define	ICM_GETINFO		(ICM_RESERVED+2)
+
+#define	ICM_CONFIGURE		(ICM_RESERVED+10)
+#define	ICM_ABOUT		(ICM_RESERVED+11)
+/* */
+
+#define	ICM_GETDEFAULTQUALITY	(ICM_RESERVED+30)
+#define	ICM_GETQUALITY		(ICM_RESERVED+31)
+#define	ICM_SETQUALITY		(ICM_RESERVED+32)
+
+#define	ICM_SET			(ICM_RESERVED+40)
+#define	ICM_GET			(ICM_RESERVED+41)
+
+/* 2 constant FOURCC codes */
+#define ICM_FRAMERATE		mmioFOURCC('F','r','m','R')
+#define ICM_KEYFRAMERATE	mmioFOURCC('K','e','y','R')
+
+#define	ICM_COMPRESS_GET_FORMAT		(ICM_USER+4)
+#define	ICM_COMPRESS_GET_SIZE		(ICM_USER+5)
+#define	ICM_COMPRESS_QUERY		(ICM_USER+6)
+#define	ICM_COMPRESS_BEGIN		(ICM_USER+7)
+#define	ICM_COMPRESS			(ICM_USER+8)
+#define	ICM_COMPRESS_END		(ICM_USER+9)
+
+#define	ICM_DECOMPRESS_GET_FORMAT	(ICM_USER+10)
+#define	ICM_DECOMPRESS_QUERY		(ICM_USER+11)
+#define	ICM_DECOMPRESS_BEGIN		(ICM_USER+12)
+#define	ICM_DECOMPRESS			(ICM_USER+13)
+#define	ICM_DECOMPRESS_END		(ICM_USER+14)
+#define	ICM_DECOMPRESS_SET_PALETTE	(ICM_USER+29)
+#define	ICM_DECOMPRESS_GET_PALETTE	(ICM_USER+30)
+
+#define	ICM_DRAW_QUERY			(ICM_USER+31)
+#define	ICM_DRAW_BEGIN			(ICM_USER+15)
+#define	ICM_DRAW_GET_PALETTE		(ICM_USER+16)
+#define	ICM_DRAW_START			(ICM_USER+18)
+#define	ICM_DRAW_STOP			(ICM_USER+19)
+#define	ICM_DRAW_END			(ICM_USER+21)
+#define	ICM_DRAW_GETTIME		(ICM_USER+32)
+#define	ICM_DRAW			(ICM_USER+33)
+#define	ICM_DRAW_WINDOW			(ICM_USER+34)
+#define	ICM_DRAW_SETTIME		(ICM_USER+35)
+#define	ICM_DRAW_REALIZE		(ICM_USER+36)
+#define	ICM_DRAW_FLUSH			(ICM_USER+37)
+#define	ICM_DRAW_RENDERBUFFER		(ICM_USER+38)
+
+#define	ICM_DRAW_START_PLAY		(ICM_USER+39)
+#define	ICM_DRAW_STOP_PLAY		(ICM_USER+40)
+
+#define	ICM_DRAW_SUGGESTFORMAT		(ICM_USER+50)
+#define	ICM_DRAW_CHANGEPALETTE		(ICM_USER+51)
+
+#define	ICM_GETBUFFERSWANTED		(ICM_USER+41)
+
+#define	ICM_GETDEFAULTKEYFRAMERATE	(ICM_USER+42)
+
+#define	ICM_DECOMPRESSEX_BEGIN		(ICM_USER+60)
+#define	ICM_DECOMPRESSEX_QUERY		(ICM_USER+61)
+#define	ICM_DECOMPRESSEX		(ICM_USER+62)
+#define	ICM_DECOMPRESSEX_END		(ICM_USER+63)
+
+#define	ICM_COMPRESS_FRAMES_INFO	(ICM_USER+70)
+#define	ICM_SET_STATUS_PROC		(ICM_USER+72)
+
+/* structs */
+
+typedef struct {
+	DWORD	dwSize;		/* 00: size */
+	DWORD	fccType;	/* 04: type 'vidc' usually */
+	DWORD	fccHandler;	/* 08: */
+	DWORD	dwVersion;	/* 0c: version of compman opening you */
+	DWORD	dwFlags;	/* 10: LOWORD is type specific */
+	LRESULT	dwError;	/* 14: */
+	LPVOID	pV1Reserved;	/* 18: */
+	LPVOID	pV2Reserved;	/* 1c: */
+	DWORD	dnDevNode;	/* 20: */
+				/* 24: */
+} ICOPEN,*LPICOPEN;
+
+/* Values for dwFlags of ICOpen() */
+#define	ICMODE_COMPRESS		1
+#define	ICMODE_DECOMPRESS	2
+#define	ICMODE_FASTDECOMPRESS	3
+#define	ICMODE_QUERY		4
+#define	ICMODE_FASTCOMPRESS	5
+#define	ICMODE_DRAW		8
+
+/* quality flags */
+#define ICQUALITY_LOW       0
+#define ICQUALITY_HIGH      10000
+#define ICQUALITY_DEFAULT   -1
+
+typedef struct {
+	DWORD	dwSize;		/* 00: */
+	DWORD	fccType;	/* 04:compressor type     'vidc' 'audc' */
+	DWORD	fccHandler;	/* 08:compressor sub-type 'rle ' 'jpeg' 'pcm '*/
+	DWORD	dwFlags;	/* 0c:flags LOWORD is type specific */
+	DWORD	dwVersion;	/* 10:version of the driver */
+	DWORD	dwVersionICM;	/* 14:version of the ICM used */
+	/*
+	 * under Win32, the driver always returns UNICODE strings.
+	 */
+	WCHAR	szName[16];		/* 18:short name */
+	WCHAR	szDescription[128];	/* 38:long name */
+	WCHAR	szDriver[128];		/* 138:driver that contains compressor*/
+					/* 238: */
+} ICINFO32;
+
+
+/* Flags for the <dwFlags> field of the <ICINFO> structure. */
+#define	VIDCF_QUALITY		0x0001  /* supports quality */
+#define	VIDCF_CRUNCH		0x0002  /* supports crunching to a frame size */
+#define	VIDCF_TEMPORAL		0x0004  /* supports inter-frame compress */
+#define	VIDCF_COMPRESSFRAMES	0x0008  /* wants the compress all frames message */
+#define	VIDCF_DRAW		0x0010  /* supports drawing */
+#define	VIDCF_FASTTEMPORALC	0x0020  /* does not need prev frame on compress */
+#define	VIDCF_FASTTEMPORALD	0x0080  /* does not need prev frame on decompress */
+#define	VIDCF_QUALITYTIME	0x0040  /* supports temporal quality */
+
+#define	VIDCF_FASTTEMPORAL	(VIDCF_FASTTEMPORALC|VIDCF_FASTTEMPORALD)
+
+
+/* function shortcuts */
+/* ICM_ABOUT */
+#define ICMF_ABOUT_QUERY         0x00000001
+
+#define ICQueryAbout(hic) \
+	(ICSendMessage(hic,ICM_ABOUT,(DWORD)-1,ICMF_ABOUT_QUERY)==ICERR_OK)
+
+#define ICAbout(hic, hwnd) \
+	ICSendMessage(hic,ICM_ABOUT,(DWORD)(UINT)(hwnd),0)
+
+/* ICM_CONFIGURE */
+#define ICMF_CONFIGURE_QUERY	0x00000001
+#define ICQueryConfigure(hic) \
+	(ICSendMessage(hic,ICM_CONFIGURE,(DWORD)-1,ICMF_CONFIGURE_QUERY)==ICERR_OK)
+
+#define ICConfigure(hic,hwnd) \
+	ICSendMessage(hic,ICM_CONFIGURE,(DWORD)(UINT)(hwnd),0)
+
+/* Decompression stuff */
+#define ICDECOMPRESS_HURRYUP		0x80000000	/* don't draw just buffer (hurry up!) */
+#define ICDECOMPRESS_UPDATE		0x40000000	/* don't draw just update screen */
+#define ICDECOMPRESS_PREROL		0x20000000	/* this frame is before real start */
+#define ICDECOMPRESS_NULLFRAME		0x10000000	/* repeat last frame */
+#define ICDECOMPRESS_NOTKEYFRAME	0x08000000	/* this frame is not a key frame */
+
+typedef struct {
+    DWORD		dwFlags;	/* flags (from AVI index...) */
+    LPBITMAPINFOHEADER	lpbiInput;	/* BITMAPINFO of compressed data */
+    LPVOID		lpInput;	/* compressed data */
+    LPBITMAPINFOHEADER	lpbiOutput;	/* DIB to decompress to */
+    LPVOID		lpOutput;
+    DWORD		ckid;		/* ckid from AVI file */
+} ICDECOMPRESS;
+
+typedef struct {
+    DWORD		dwFlags;
+    LPBITMAPINFOHEADER	lpbiSrc;
+    LPVOID		lpSrc;
+    LPBITMAPINFOHEADER	lpbiDst;
+    LPVOID		lpDst;
+
+    /* changed for ICM_DECOMPRESSEX */
+    INT32		xDst;       /* destination rectangle */
+    INT32		yDst;
+    INT32		dxDst;
+    INT32		dyDst;
+
+    INT32		xSrc;       /* source rectangle */
+    INT32		ySrc;
+    INT32		dxSrc;
+    INT32		dySrc;
+} ICDECOMPRESSEX;
+
+#define ICDRAW_QUERY        0x00000001L   // test for support
+#define ICDRAW_FULLSCREEN   0x00000002L   // draw to full screen
+#define ICDRAW_HDC          0x00000004L   // draw to a HDC/HWND
+
+
+BOOL32	VFWAPI	ICInfo32(DWORD fccType, DWORD fccHandler, ICINFO32 * lpicinfo);
+LRESULT	VFWAPI	ICGetInfo32(HIC32 hic,ICINFO32 *picinfo, DWORD cb);
+HIC32	VFWAPI	ICOpen32(DWORD fccType, DWORD fccHandler, UINT32 wMode);
+LRESULT	VFWAPI	ICSendMessage32(HIC32 hic, UINT32 msg, DWORD dw1, DWORD dw2);
+DWORD	VFWAPIV	ICDrawBegin32(
+        HIC32			hic,
+        DWORD			dwFlags,/* flags */
+        HPALETTE32		hpal,	/* palette to draw with */
+        HWND32			hwnd,	/* window to draw to */
+        HDC32			hdc,	/* HDC to draw to */
+        INT32			xDst,	/* destination rectangle */
+        INT32			yDst,
+        INT32			dxDst,
+        INT32			dyDst,
+        LPBITMAPINFOHEADER	lpbi,	/* format of frame to draw */
+        INT32			xSrc,	/* source rectangle */
+        INT32			ySrc,
+        INT32			dxSrc,
+        INT32			dySrc,
+        DWORD			dwRate,	/* frames/second = (dwRate/dwScale) */
+        DWORD			dwScale);
+
+#endif
diff --git a/include/winaspi.h b/include/winaspi.h
new file mode 100644
index 0000000..081df68
--- /dev/null
+++ b/include/winaspi.h
@@ -0,0 +1,100 @@
+#if !defined(WINASPI_H)
+#define WINASPI_H
+
+#pragma pack(1)
+
+#define ASPI_DOS        1
+#define ASPI_WIN16      2
+
+typedef union SRB16 * LPSRB16;
+
+typedef struct tagSRB_HaInquiry16 {
+  BYTE	SRB_Cmd;
+  BYTE	SRB_Status;
+  BYTE	SRB_HaId;
+  BYTE	SRB_Flags;
+  WORD	SRB_55AASignature;
+  WORD	SRB_ExtBufferSize;
+  BYTE	HA_Count;
+  BYTE	HA_SCSI_ID;
+  BYTE	HA_ManagerId[16];
+  BYTE	HA_Identifier[16];
+  BYTE	HA_Unique[16];
+  BYTE	HA_ExtBuffer[4];
+} SRB_HaInquiry16 WINE_PACKED;
+
+typedef struct tagSRB_ExecSCSICmd16 {
+  BYTE        SRB_Cmd;                /* ASPI command code	      (W)  */
+  BYTE        SRB_Status;             /* ASPI command status byte     (R)  */
+  BYTE        SRB_HaId;               /* ASPI host adapter number     (W)  */
+  BYTE        SRB_Flags;              /* ASPI request flags	      (W)  */
+  DWORD       SRB_Hdr_Rsvd;           /* Reserved, MUST = 0	      (-)  */
+  BYTE        SRB_Target;             /* Target's SCSI ID	      (W)  */
+  BYTE        SRB_Lun;                /* Target's LUN number	      (W)  */
+  DWORD       SRB_BufLen;             /* Data Allocation LengthPG     (W/R)*/
+  BYTE        SRB_SenseLen;           /* Sense Allocation Length      (W)  */
+  SEGPTR      SRB_BufPointer;         /* Data Buffer Pointer	      (W)  */
+  DWORD       SRB_Rsvd1;              /* Reserved, MUST = 0	      (-/W)*/
+  BYTE        SRB_CDBLen;             /* CDB Length = 6		      (W)  */
+  BYTE        SRB_HaStat;             /* Host Adapter Status	      (R)  */
+  BYTE        SRB_TargStat;           /* Target Status		      (R)  */
+  FARPROC16   SRB_PostProc;	      /* Post routine		      (W)  */
+  BYTE        SRB_Rsvd2[34];          /* Reserved, MUST = 0                */
+  BYTE		CDBByte[0];	      /* SCSI CBD - variable length   (W)  */
+  /* variable example for 6 byte cbd
+   * BYTE        CDBByte[6];             * SCSI CDB                    (W) *
+   * BYTE        SenseArea6[SENSE_LEN];  * Request Sense buffer 	(R) *
+   */
+} SRB_ExecSCSICmd16 WINE_PACKED;
+
+typedef struct tagSRB_Abort16 {
+  BYTE        SRB_Cmd;            /* ASPI command code = SC_ABORT_SRB */
+  BYTE        SRB_Status;         /* ASPI command status byte */
+  BYTE        SRB_HaId;           /* ASPI host adapter number */
+  BYTE        SRB_Flags;          /* ASPI request flags */
+  DWORD       SRB_Hdr_Rsvd;       /* Reserved, MUST = 0 */
+  LPSRB16     SRB_ToAbort;        /* Pointer to SRB to abort */
+} SRB_Abort16 WINE_PACKED;
+
+typedef struct tagSRB_BusDeviceReset16 {
+  BYTE        SRB_Cmd;            /* ASPI command code = SC_RESET_DEV */
+  BYTE        SRB_Status;         /* ASPI command status byte */
+  BYTE        SRB_HaId;           /* ASPI host adapter number */
+  BYTE        SRB_Flags;          /* ASPI request flags */
+  DWORD       SRB_Hdr_Rsvd;       /* Reserved, MUST = 0 */
+  BYTE        SRB_Target;         /* Target's SCSI ID */
+  BYTE        SRB_Lun;            /* Target's LUN number */
+  BYTE        SRB_ResetRsvd1[14]; /* Reserved, MUST = 0 */
+  BYTE        SRB_HaStat;         /* Host Adapter Status */
+  BYTE        SRB_TargStat;       /* Target Status */
+  SEGPTR      SRB_PostProc;       /* Post routine */
+  BYTE        SRB_ResetRsvd2[34]; /* Reserved, MUST = 0 */
+} SRB_BusDeviceReset16 WINE_PACKED;
+
+typedef struct tagSRB_GDEVBlock16 {
+  BYTE        SRB_Cmd;            /* ASPI command code = SC_GET_DEV_TYPE */
+  BYTE        SRB_Status;         /* ASPI command status byte */
+  BYTE        SRB_HaId;           /* ASPI host adapter number */
+  BYTE        SRB_Flags;          /* ASPI request flags */
+  DWORD       SRB_Hdr_Rsvd;       /* Reserved, MUST = 0 */
+  BYTE        SRB_Target;         /* Target's SCSI ID */
+  BYTE        SRB_Lun;            /* Target's LUN number */
+  BYTE        SRB_DeviceType;     /* Target's peripheral device type */
+} SRB_GDEVBlock16 WINE_PACKED;
+
+typedef struct tagSRB_Common16 {
+  BYTE	SRB_Cmd;
+} SRB_Common16;
+
+union SRB16 {
+  SRB_Common16		common;
+  SRB_HaInquiry16	inquiry;
+  SRB_ExecSCSICmd16	cmd;
+  SRB_Abort16		abort;
+  SRB_BusDeviceReset16	reset;
+  SRB_GDEVBlock16	devtype;
+};
+
+typedef union SRB16 SRB16;
+
+#endif
diff --git a/include/winbase.h b/include/winbase.h
index 16938f2..47878fe 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -189,6 +189,8 @@
 void      WINAPI InitializeCriticalSection(CRITICAL_SECTION *lpCrit);
 void      WINAPI LeaveCriticalSection(CRITICAL_SECTION *lpCrit);
 HANDLE32  WINAPI OpenProcess(DWORD access, BOOL32 inherit, DWORD id);
+BOOL32    WINAPI GetProcessWorkingSetSize(HANDLE32,LPDWORD,LPDWORD);
+BOOL32    WINAPI SetProcessWorkingSetSize(HANDLE32,DWORD,DWORD);
 void      WINAPI RaiseException(DWORD,DWORD,DWORD,const LPDWORD);
 BOOL32    WINAPI TerminateProcess(HANDLE32,DWORD);
 BOOL32    WINAPI TerminateThread(HANDLE32,DWORD);
diff --git a/include/windows.h b/include/windows.h
index 8765e68..af54d71 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -1053,6 +1053,7 @@
 #define COLOR_BTNTEXT		   18
 #define COLOR_INACTIVECAPTIONTEXT  19
 #define COLOR_BTNHIGHLIGHT         20
+/* win95 colors */
 #define COLOR_3DDKSHADOW           21
 #define COLOR_3DLIGHT              22
 #define COLOR_INFOTEXT             23
@@ -1063,6 +1064,11 @@
 #define COLOR_3DHIGHLIGHT          COLOR_BTNHIGHLIGHT
 #define COLOR_3DHILIGHT            COLOR_BTNHIGHLIGHT
 #define COLOR_BTNHILIGHT           COLOR_BTNHIGHLIGHT
+/* win98 colors */
+#define COLOR_ALTERNATEBTNFACE         25  /* undocumented, constant's name unknown */
+#define COLOR_HOTLIGHT                 26
+#define COLOR_GRADIENTACTIVECAPTION    27
+#define COLOR_GRADIENTINACTIVECAPTION  28
 
   /* WM_CTLCOLOR values */
 #define CTLCOLOR_MSGBOX             0
@@ -1077,6 +1083,15 @@
 #define ICM_ON    2
 #define ICM_QUERY 3
 
+  /* Bounds Accumulation APIs */
+#define DCB_RESET       0x0001
+#define DCB_ACCUMULATE  0x0002
+#define DCB_DIRTY       DCB_ACCUMULATE
+#define DCB_SET         (DCB_RESET | DCB_ACCUMULATE)
+#define DCB_ENABLE      0x0004
+#define DCB_DISABLE     0x0008
+
+
   /* Bitmaps */
 
 typedef struct
@@ -2050,8 +2065,14 @@
 #define SM_SLOWMACHINE	      73
 #define SM_MIDEASTENABLED     74
 #define SM_MOUSEWHEELPRESENT  75
+#define SM_XVIRTUALSCREEN     76
+#define SM_YVIRTUALSCREEN     77
+#define SM_CXVIRTUALSCREEN    78
+#define SM_CYVIRTUALSCREEN    79
+#define SM_CMONITORS          80
+#define SM_SAMEDISPLAYFORMAT  81
+#define SM_CMETRICS           83
 
-#define SM_CMETRICS           76
 
   /* Device-independent bitmaps */
 
@@ -6293,6 +6314,15 @@
     DWORD dwPlatformID;
 } DLLVERSIONINFO;
 
+typedef struct _SEGINFO {
+    UINT16    offSegment;
+    UINT16    cbSegment;
+    UINT16    flags;
+    UINT16    cbAlloc;
+    HGLOBAL16 h;
+    UINT16    alignShift;
+    UINT16    reserved[2];
+} SEGINFO;
 
 
 #pragma pack(4)
@@ -6338,7 +6368,7 @@
 INT16       WINAPI GetCommError(INT16,LPCOMSTAT);
 UINT16      WINAPI GetCommEventMask(INT16,UINT16);
 HBRUSH16    WINAPI GetControlBrush(HWND16,HDC16,UINT16);
-VOID        WINAPI GetCodeInfo(FARPROC16,LPVOID);
+VOID        WINAPI GetCodeInfo(FARPROC16,SEGINFO*);
 HFONT16     WINAPI GetCurLogFont(HDC16);
 HANDLE16    WINAPI GetCurrentPDB(void);
 DWORD       WINAPI GetCurrentPosition(HDC16);
@@ -6515,6 +6545,9 @@
 BOOL32      WINAPI DisableThreadLibraryCalls(HMODULE32);
 BOOL32      WINAPI DosDateTimeToFileTime(WORD,WORD,LPFILETIME);
 BOOL32      WINAPI DuplicateHandle(HANDLE32,HANDLE32,HANDLE32,HANDLE32*,DWORD,BOOL32,DWORD);
+BOOL32      WINAPI EnumDateFormats32A(DATEFMT_ENUMPROC32A lpDateFmtEnumProc, LCID Locale, DWORD dwFlags);
+BOOL32      WINAPI EnumDateFormats32W(DATEFMT_ENUMPROC32W lpDateFmtEnumProc, LCID Locale, DWORD dwFlags);
+#define     EnumDateFormats WINELIB_NAME_AW(EnumDateFormats)
 INT32       WINAPI EnumPropsEx32A(HWND32,PROPENUMPROCEX32A,LPARAM);
 INT32       WINAPI EnumPropsEx32W(HWND32,PROPENUMPROCEX32W,LPARAM);
 #define     EnumPropsEx WINELIB_NAME_AW(EnumPropsEx)
@@ -6538,6 +6571,9 @@
 BOOL32      WINAPI EnumSystemLocales32W(LOCALE_ENUMPROC32W,DWORD);
 #define     EnumSystemLocales WINELIB_NAME_AW(EnumSystemLocales)
 BOOL32      WINAPI EnumThreadWindows(DWORD,WNDENUMPROC32,LPARAM);
+BOOL32      WINAPI EnumTimeFormats32A(TIMEFMT_ENUMPROC32A lpTimeFmtEnumProc, LCID Locale, DWORD dwFlags);
+BOOL32      WINAPI EnumTimeFormats32W(TIMEFMT_ENUMPROC32W lpTimeFmtEnumProc, LCID Locale, DWORD dwFlags);
+#define     EnumTimeFormats WINELIB_NAME_AW(EnumTimeFormats)
 VOID        WINAPI ExitProcess(DWORD);
 VOID        WINAPI ExitThread(DWORD);
 BOOL32      WINAPI ExitWindowsEx(UINT32,DWORD);
@@ -7197,7 +7233,7 @@
 HBRUSH32    WINAPI CreateDIBPatternBrush32(HGLOBAL32,UINT32);
 #define     CreateDIBPatternBrush WINELIB_NAME(CreateDIBPatternBrush)
 HBITMAP16   WINAPI CreateDIBSection16 (HDC16, BITMAPINFO *, UINT16,
-				       LPVOID **, HANDLE16, DWORD offset);
+				       LPVOID **, HANDLE32, DWORD offset);
 HBITMAP32   WINAPI CreateDIBSection32 (HDC32, BITMAPINFO *, UINT32,
 				       LPVOID **, HANDLE32, DWORD offset);
 #define     CreateDIBSection WINELIB_NAME(CreateDIBSection)
@@ -7651,6 +7687,9 @@
 INT16       WINAPI GetBkMode16(HDC16);
 INT32       WINAPI GetBkMode32(HDC32);
 #define     GetBkMode WINELIB_NAME(GetBkMode)
+UINT16      WINAPI GetBoundsRect16(HDC16,LPRECT16,UINT16);
+UINT32      WINAPI GetBoundsRect32(HDC32,LPRECT32,UINT32);
+#define     GetBoundsRect WINELIB_NAME(GetBoundsRect)
 HWND16      WINAPI GetCapture16(void);
 HWND32      WINAPI GetCapture32(void);
 #define     GetCapture WINELIB_NAME(GetCapture)
@@ -7833,6 +7872,10 @@
 INT32       WINAPI GetKeyNameText32A(LONG,LPSTR,INT32);
 INT32       WINAPI GetKeyNameText32W(LONG,LPWSTR,INT32);
 #define     GetKeyNameText WINELIB_NAME_AW(GetKeyNameText)
+INT16       WINAPI GetKeyboardLayoutName16(LPSTR);
+INT32       WINAPI GetKeyboardLayoutName32A(LPSTR);
+INT32       WINAPI GetKeyboardLayoutName32W(LPWSTR);
+#define     GetKeyboardLayoutName WINELIB_NAME_AW(GetKeyboardLayoutName)
 WORD        WINAPI GetKeyState16(INT16);
 WORD        WINAPI GetKeyState32(INT32);
 #define     GetKeyState WINELIB_NAME(GetKeyState)
@@ -8126,7 +8169,7 @@
 BOOL32      WINAPI GetWindowPlacement32(HWND32,LPWINDOWPLACEMENT32);
 #define     GetWindowPlacement WINELIB_NAME(GetWindowPlacement)
 void        WINAPI GetWindowRect16(HWND16,LPRECT16);
-void        WINAPI GetWindowRect32(HWND32,LPRECT32);
+BOOL32      WINAPI GetWindowRect32(HWND32,LPRECT32);
 #define     GetWindowRect WINELIB_NAME(GetWindowRect)
 INT16       WINAPI GetWindowRgn16(HWND16,HRGN16);
 INT32       WINAPI GetWindowRgn32(HWND32,HRGN32);
@@ -8781,6 +8824,9 @@
 INT16       WINAPI SetBkMode16(HDC16,INT16);
 INT32       WINAPI SetBkMode32(HDC32,INT32);
 #define     SetBkMode WINELIB_NAME(SetBkMode)
+UINT16      WINAPI SetBoundsRect16(HDC16,LPRECT16,UINT16);
+UINT32      WINAPI SetBoundsRect32(HDC32,LPRECT32,UINT32);
+#define     SetBoundsRect WINELIB_NAME(SetBoundsRect)
 HWND16      WINAPI SetCapture16(HWND16);
 HWND32      WINAPI SetCapture32(HWND32);
 #define     SetCapture WINELIB_NAME(SetCapture)
diff --git a/include/winerror.h b/include/winerror.h
index 1d368fb..309617c 100644
--- a/include/winerror.h
+++ b/include/winerror.h
@@ -71,6 +71,7 @@
 #define ERROR_NO_NETWORK            1222
 #define ERROR_ALREADY_INITIALIZED   1247
 #define ERROR_PRIVILEGE_NOT_HELD    1314
+#define ERROR_INVALID_WINDOW_HANDLE 1400
 #define ERROR_CANNOT_FIND_WND_CLASS 1407
 #define ERROR_WINDOW_OF_OTHER_THREAD 1408
 #define ERROR_CLASS_ALREADY_EXISTS  1410
diff --git a/include/winnls.h b/include/winnls.h
index 5024998..cecb141 100644
--- a/include/winnls.h
+++ b/include/winnls.h
@@ -194,7 +194,7 @@
 #define SUBLANG_DEFAULT                  0x01    /* user default */
 #define SUBLANG_SYS_DEFAULT              0x02    /* system default */
 
-#define SUBLANG_ARABIC                   0x01
+#define SUBLANG_ARABIC_SAUDI_ARABIA      0x01
 #define SUBLANG_ARABIC_IRAQ              0x02
 #define SUBLANG_ARABIC_EGYPT             0x03
 #define SUBLANG_ARABIC_LIBYA             0x04
@@ -203,18 +203,19 @@
 #define SUBLANG_ARABIC_TUNISIA           0x07
 #define SUBLANG_ARABIC_OMAN              0x08
 #define SUBLANG_ARABIC_YEMEN             0x09
-#define SUBLANG_ARABIC_SYRIA             0x10
-#define SUBLANG_ARABIC_JORDAN            0x11
-#define SUBLANG_ARABIC_LEBANON           0x12
-#define SUBLANG_ARABIC_KUWAIT            0x13
-#define SUBLANG_ARABIC_UAE               0x14
-#define SUBLANG_ARABIC_BAHRAIN           0x15
-#define SUBLANG_ARABIC_QATAR             0x16
+#define SUBLANG_ARABIC_SYRIA             0x0a
+#define SUBLANG_ARABIC_JORDAN            0x0b
+#define SUBLANG_ARABIC_LEBANON           0x0c
+#define SUBLANG_ARABIC_KUWAIT            0x0d
+#define SUBLANG_ARABIC_UAE               0x0e
+#define SUBLANG_ARABIC_BAHRAIN           0x0f
+#define SUBLANG_ARABIC_QATAR             0x10
 #define SUBLANG_CHINESE_TRADITIONAL      0x01
 #define SUBLANG_CHINESE_SIMPLIFIED       0x02
 #define SUBLANG_CHINESE_HONGKONG         0x03
 #define SUBLANG_CHINESE_SINGAPORE        0x04
-#define SUBLANG_DUTCH                    0x01
+#define SUBLANG_CHINESE_MACAU            0x05
+#define SUBLANG_DUTCH_NETHERLANDS        0x01
 #define SUBLANG_DUTCH_BELGIAN            0x02
 #define SUBLANG_ENGLISH_US               0x01
 #define SUBLANG_ENGLISH_UK               0x02
@@ -225,40 +226,49 @@
 #define SUBLANG_ENGLISH_SAFRICA          0x07
 #define SUBLANG_ENGLISH_JAMAICA          0x08
 #define SUBLANG_ENGLISH_CARRIBEAN        0x09
-#define SUBLANG_FRENCH                   0x01
+#define SUBLANG_ENGLISH_BELIZE           0x0a
+#define SUBLANG_ENGLISH_TRINIDAD         0x0b
+#define SUBLANG_ENGLISH_ZIMBABWE         0x0c
+#define SUBLANG_ENGLISH_PHILIPPINES      0x0d
+#define SUBLANG_FRENCH_FRANCE            0x01
 #define SUBLANG_FRENCH_BELGIAN           0x02
 #define SUBLANG_FRENCH_CANADIAN          0x03
 #define SUBLANG_FRENCH_SWISS             0x04
 #define SUBLANG_FRENCH_LUXEMBOURG        0x05
-#define SUBLANG_GERMAN                   0x01
+#define SUBLANG_FRENCH_MONACO            0x06
+#define SUBLANG_GERMAN_GERMANY           0x01
 #define SUBLANG_GERMAN_SWISS             0x02
 #define SUBLANG_GERMAN_AUSTRIAN          0x03
 #define SUBLANG_GERMAN_LUXEMBOURG        0x04
 #define SUBLANG_GERMAN_LIECHTENSTEIN     0x05
-#define SUBLANG_ITALIAN                  0x01
+#define SUBLANG_ITALIAN_ITALIA           0x01
 #define SUBLANG_ITALIAN_SWISS            0x02
-#define SUBLANG_KOREAN                   0x01
+#define SUBLANG_KOREAN_WANSUNG           0x01
 #define SUBLANG_KOREAN_JOHAB             0x02
 #define SUBLANG_NORWEGIAN_BOKMAL         0x01
 #define SUBLANG_NORWEGIAN_NYNORSK        0x02
-#define SUBLANG_PORTUGUESE               0x02
+#define SUBLANG_PORTUGUESE_PORTUGAL      0x02
 #define SUBLANG_PORTUGUESE_BRAZILIAN     0x01
-#define SUBLANG_SPANISH                  0x01
+#define SUBLANG_SPANISH_SPAIN_TRAD       0x01
 #define SUBLANG_SPANISH_MEXICAN          0x02
-#define SUBLANG_SPANISH_MODERN           0x03
+#define SUBLANG_SPANISH_SPAIN_MODERN     0x03
 #define SUBLANG_SPANISH_GUATEMALA        0x04
 #define SUBLANG_SPANISH_COSTARICA        0x05
 #define SUBLANG_SPANISH_PANAMA           0x06
 #define SUBLANG_SPANISH_DOMINICAN        0x07
 #define SUBLANG_SPANISH_VENEZUELA        0x08
 #define SUBLANG_SPANISH_COLOMBIA         0x09
-#define SUBLANG_SPANISH_PERU             0x10
-#define SUBLANG_SPANISH_ARGENTINA        0x11
-#define SUBLANG_SPANISH_ECUADOR          0x12
-#define SUBLANG_SPANISH_CHILE            0x13
-#define SUBLANG_SPANISH_URUGUAY          0x14
-#define SUBLANG_SPANISH_PARAGUAY         0x15
-#define SUBLANG_SPANISH_BOLIVIA          0x16
+#define SUBLANG_SPANISH_PERU             0x0a
+#define SUBLANG_SPANISH_ARGENTINA        0x0b
+#define SUBLANG_SPANISH_ECUADOR          0x0c
+#define SUBLANG_SPANISH_CHILE            0x0d
+#define SUBLANG_SPANISH_URUGUAY          0x0e
+#define SUBLANG_SPANISH_PARAGUAY         0x0f
+#define SUBLANG_SPANISH_BOLIVIA          0x10
+#define SUBLANG_SPANISH_HONDURAS         0x11
+#define SUBLANG_SPANISH_NICARAGUA        0x12
+#define SUBLANG_SPANISH_PUERTO_RICO      0x13
+
 
 /* Sort definitions */
 #define SORT_DEFAULT                     0x0
diff --git a/include/wintypes.h b/include/wintypes.h
index 895676d..e3d4596 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -169,10 +169,14 @@
 DECLARE_HANDLE(HWAVEOUT);
 DECLARE_HANDLE(HWND);
 DECLARE_HANDLE(HKL);
+DECLARE_HANDLE(HIC);
 #undef DECLARE_HANDLE
 
 /* Callback function pointers types */
 
+typedef BOOL32 (CALLBACK* DATEFMT_ENUMPROC32A)(LPSTR);
+typedef BOOL32 (CALLBACK* DATEFMT_ENUMPROC32W)(LPWSTR);
+DECL_WINELIB_TYPE_AW(DATEFMT_ENUMPROC)
 typedef LRESULT (CALLBACK *DLGPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
 typedef LRESULT (CALLBACK *DLGPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
 DECL_WINELIB_TYPE(DLGPROC)
@@ -205,6 +209,9 @@
 typedef BOOL32  (CALLBACK *PROPENUMPROCEX32A)(HWND32,LPCSTR,HANDLE32,LPARAM);
 typedef BOOL32  (CALLBACK *PROPENUMPROCEX32W)(HWND32,LPCWSTR,HANDLE32,LPARAM);
 DECL_WINELIB_TYPE_AW(PROPENUMPROCEX)
+typedef BOOL32 (CALLBACK* TIMEFMT_ENUMPROC32A)(LPSTR);
+typedef BOOL32 (CALLBACK* TIMEFMT_ENUMPROC32W)(LPWSTR);
+DECL_WINELIB_TYPE_AW(TIMEFMT_ENUMPROC)
 typedef VOID    (CALLBACK *TIMERPROC16)(HWND16,UINT16,UINT16,DWORD);
 typedef VOID    (CALLBACK *TIMERPROC32)(HWND32,UINT32,UINT32,DWORD);
 DECL_WINELIB_TYPE(TIMERPROC)
diff --git a/include/winversion.h b/include/winversion.h
new file mode 100644
index 0000000..df6047b
--- /dev/null
+++ b/include/winversion.h
@@ -0,0 +1,16 @@
+#ifndef __WINE_WINVERSION_H
+#define __WINE_WINVERSION_H
+
+typedef enum
+{
+    WIN31, /* Windows 3.1 */
+    WIN95,   /* Windows 95 */
+    NT351,   /* Windows NT 3.51 */
+    NT40,    /* Windows NT 4.0 */  
+    NB_WINDOWS_VERSIONS
+} WINDOWS_VERSION;
+
+extern WINDOWS_VERSION VERSION_GetVersion(); 
+extern char *VERSION_GetVersionName(); 
+
+#endif  /* __WINE_WINVERSION_H */
diff --git a/include/wnaspi32.h b/include/wnaspi32.h
new file mode 100644
index 0000000..b62a633
--- /dev/null
+++ b/include/wnaspi32.h
@@ -0,0 +1,96 @@
+#if !defined(WNASPI32_H)
+#define WNASPI32_H
+
+#pragma pack(1)
+
+typedef union SRB32 * LPSRB32;
+
+typedef struct tagSRB_HaInquiry32 {
+ BYTE  SRB_Cmd;                 /* ASPI command code = SC_HA_INQUIRY */
+ BYTE  SRB_Status;              /* ASPI command status byte */
+ BYTE  SRB_HaId;                /* ASPI host adapter number */
+ BYTE  SRB_Flags;               /* ASPI request flags */
+ DWORD  SRB_Hdr_Rsvd;           /* Reserved, MUST = 0 */
+ BYTE  HA_Count;                /* Number of host adapters present */
+ BYTE  HA_SCSI_ID;              /* SCSI ID of host adapter */
+ BYTE  HA_ManagerId[16];        /* String describing the manager */
+ BYTE  HA_Identifier[16];       /* String describing the host adapter */
+ BYTE  HA_Unique[16];           /* Host Adapter Unique parameters */
+ WORD  HA_Rsvd1;
+} SRB_HaInquiry32 WINE_PACKED;
+
+typedef struct tagSRB_ExecSCSICmd32 {
+  BYTE        SRB_Cmd;            /* ASPI command code = SC_EXEC_SCSI_CMD */
+  BYTE        SRB_Status;         /* ASPI command status byte */
+  BYTE        SRB_HaId;           /* ASPI host adapter number */
+  BYTE        SRB_Flags;          /* ASPI request flags */
+  DWORD       SRB_Hdr_Rsvd;       /* Reserved */
+  BYTE        SRB_Target;         /* Target's SCSI ID */
+  BYTE        SRB_Lun;            /* Target's LUN number */
+  WORD        SRB_Rsvd1;          /* Reserved for Alignment */
+  DWORD       SRB_BufLen;         /* Data Allocation Length */
+  BYTE        *SRB_BufPointer;    /* Data Buffer Point */
+  BYTE        SRB_SenseLen;       /* Sense Allocation Length */
+  BYTE        SRB_CDBLen;         /* CDB Length */
+  BYTE        SRB_HaStat;         /* Host Adapter Status */
+  BYTE        SRB_TargStat;       /* Target Status */
+  void        (*SRB_PostProc)();  /* Post routine */
+  void        *SRB_Rsvd2;         /* Reserved */
+  BYTE        SRB_Rsvd3[16];      /* Reserved for expansion */
+  BYTE        CDBByte[16];        /* SCSI CDB */
+  BYTE        SenseArea[0];       /* Request sense buffer - var length */
+} SRB_ExecSCSICmd32 WINE_PACKED;
+
+typedef struct tagSRB_Abort32 {
+  BYTE        SRB_Cmd;            /* ASPI command code = SC_ABORT_SRB */
+  BYTE        SRB_Status;         /* ASPI command status byte */
+  BYTE        SRB_HaId;           /* ASPI host adapter number */
+  BYTE        SRB_Flags;          /* Reserved */
+  DWORD       SRB_Hdr_Rsvd;       /* Reserved, MUST = 0 */
+  LPSRB32     SRB_ToAbort;        /* Pointer to SRB to abort */
+} SRB_Abort32 WINE_PACKED;
+
+typedef struct tagSRB_BusDeviceReset32 {
+ BYTE         SRB_Cmd;                  /* ASPI command code = SC_RESET_DEV */
+ BYTE         SRB_Status;               /* ASPI command status byte */
+ BYTE         SRB_HaId;                 /* ASPI host adapter number */
+ BYTE         SRB_Flags;                /* Reserved */
+ DWORD        SRB_Hdr_Rsvd;             /* Reserved */
+ BYTE         SRB_Target;               /* Target's SCSI ID */
+ BYTE         SRB_Lun;                  /* Target's LUN number */
+ BYTE         SRB_Rsvd1[12];            /* Reserved for Alignment */
+ BYTE         SRB_HaStat;               /* Host Adapter Status */
+ BYTE         SRB_TargStat;             /* Target Status */
+ void         (*SRB_PostProc)();        /* Post routine */
+ void         *SRB_Rsvd2;               /* Reserved */
+ BYTE         SRB_Rsvd3[32];            /* Reserved */
+} SRB_BusDeviceReset32 WINE_PACKED;
+
+typedef struct tagSRB_GDEVBlock32 {
+ BYTE  SRB_Cmd;                 /* ASPI command code = SC_GET_DEV_TYPE */
+ BYTE  SRB_Status;              /* ASPI command status byte */
+ BYTE  SRB_HaId;                /* ASPI host adapter number */
+ BYTE  SRB_Flags;               /* Reserved */
+ DWORD  SRB_Hdr_Rsvd;           /* Reserved */
+ BYTE  SRB_Target;              /* Target's SCSI ID */
+ BYTE  SRB_Lun;                 /* Target's LUN number */
+ BYTE  SRB_DeviceType;          /* Target's peripheral device type */
+ BYTE  SRB_Rsvd1;
+} SRB_GDEVBlock32 WINE_PACKED;
+
+typedef struct tagSRB_Common32 {
+  BYTE  SRB_Cmd;
+} SRB_Common32;
+
+union SRB32 {
+  SRB_Common32          common;
+  SRB_HaInquiry32       inquiry;
+  SRB_ExecSCSICmd32     cmd;
+  SRB_Abort32           abort;
+  SRB_BusDeviceReset32  reset;
+  SRB_GDEVBlock32       devtype;
+};
+
+typedef union SRB32 SRB32;
+
+#endif