Release 980614

Sun Jun 15 10:30:35 1998  Andreas Mohr <100.30936@germany.net>

	* [files/dos_fs.c] [files/file.c] [if1632/wprocs.spec]
	  [misc/aspi.c]
	Added support for scanners that need Adaptec's ASPI2DOS.

	* [graphics/env.c] [misc/printerdrv.c] [graphics/win16drv/init.c]
	  [if1632/gdi.spec] [include/gdi.h]
	Enhanced printer support (especially Win95):
	Drv[GS]etPrinterData, [GS]etEnvironment; added AbortProc handling.

	* [misc/tapi32.c] [relay32/tapi32.spec]
	Added some stubs.

	* [configure.in] [graphics/fontengine.c] [include/windows.h]
	  [misc/comm.c] [misc/w32skrnl.c] [misc/win32s16.c]
	Made Wine compile on HP-UX (just for fun ;)

	* [controls/menu.c] [include/windows.h]
	Complete rewrite of EnableMenuItem32.
	Free Agent 32 still doesn't work :(

	* [misc/version.c] [if1632/kernel.spec] [include/winbase.h]
	Implemented GetVersionEx16.

	* [misc/network.c] [if1632/user.spec]
	Fixed arguments of WNetGetPropertyText.

	* [misc/version.c] [relay32/comctl32.spec] [relay32/oleaut32.spec]
	Implemented COMCTL32_DllGetVersion, OaBuildVersion.

	* [win32/file.c]
	Fixed UNC handling of CreateFile32.

Sat Jun 13 22:35:12 1998  Douglas Ridgway  <ridgway@winehq.com>

	* [Makefile.in] [Make.rules.in]
	Added pattern for CVS merge files to 'make clean'

	* [ole/olecli.c] [windows/scroll.c] [windows/grahics.c]
	Add some DC handle unlocking. (When hdc's are always unlocked,
	they can be made moveable.)

	* [documentation/wine.texinfo] 
	Started a Wine Design chapter with discussion of 
	graphics driver model.

Sat Jun 13 11:19:25 1998  David Luyer <luyer@ucs.uwa.edu.au>

	* [misc/main.c] [relay32/relay386.c]
	Added new option -debugmsg +relay=.... or -debugmsg -relay=...

Fri Jun 12 22:56:09 1998  Marcus Meissner <marcus@jet.franken.de>

	* [relay32/snoop.c][relay32/builtin.c][loader/pe_image.c]
	Added inter win32 dll snooping. Use -debugmsg +snoop.
	Number of arguments and string references are autodetected.
	Some small bugfixes in the PE loader.

	* [misc/system.c]
	Disabled SystemTimers. They do not work with the current
	%fs handling in the 32->16 relaycode. (helps labview)

	* [msdos/dpmi.c][msdos/int2f.c][files/drive.c]
	Added a monoton linear increasing memory allocator for DPMI (required
	for LabView, HAFAS, ...)
	mscdex handling in emulated realmode interrupts (for mcicda.drv)
	allocate logical drives only once. (helps Myst)

	* [files/profile.c]
	Handle ^Z as space. Found on CDROMS (helps Myst Installer).

	* [multimedia/mmio.c]
	mmio* partially updated to win32. No funny additions.

	* [windows/driver.c]
	Added win32 driver handling (will be used for win32 multimedia/
	msvideo drivers).

	* [win32/device.c]
	Added device handling (K32OBJ_DEVICE_IOCTL). Implemented 
	VTDAPI.5 (used by win95' WINMM.timeGetTime())

Fri Jun 12 18:01:18 1998 Rein Klazes <rklazes@casema.net>

	* [ole/compobj.c relay32/ole32.spec]
	Add a stub for CoLockObjectExternal32.

	* [objects/clipping.c]
	Fix in IntersectClipRect(), when there is no initial clipping
	region.

	* [graphics/x11drv/graphics.c]
	Corrected several "one-off" errors for the Ellipse, Rectangle
	and RoundRectangle (especially small ones) draw routines. 
	Arc and friends still have to be done.

Fri Jun 12 06:23:19 1998  Matthew Becker <mbecker@glasscity.net>

	* [misc/ntdll.c]
	Fixed some of the parameter counts.

	* [misc/registry.c]
	General cleanup, documentation.
	Standard keys are allowed to be 'closed' and succeed.

	* [misc/shell.c]
	Check for correct return values from Reg* functions.

	* [win32/newfns.c]
	Added stubs for OpenDesktopA, SetThreadDesktop, and
	SetUserObjectInformationA.

Wed Jun 10  20:28:08 1998  James Juran  <jrj120@psu.edu>

	* [debugger/break.c]
	Fixed bug introduced in 980503 that broke the -debug command 
	line option for PE executable files.

	* [configure.in] [include/acconfig.h] [include/debugtools.h]
	  [documentation/debug-msgs]
	Added 'configure' options to compile out debugging messages.
	Use --disable-debug to disable all debugging messages, and
	--disable-trace to just disable TRACE messages.  This results
	in a stripped executable that is 15-20% smaller.  This option
	is very much untested--don't expect it to work.

	* [documentation/debug-msgs] [documentation/debugging]
	Minor updates.

	* [*/*.c]
	Fixed some compile warnings.  This also includes the
	compile_warnings_trivial patch from WineHQ.

Tue Jun 10 22:00:18 1998  Eric Kohl <ekohl@abo.rhein-zeitung.de>

	* [windows/sysmetrics.c][include/sysmetrics.h]
	Fixed some Win95 values.

	* [windows/nonclient.c][include/windows.h]
	Fixed some Win95 drawing bugs.
	Added extended window style flags (WS_EX_xxx).

	* [misc/printdrv.c][relay32/winspool.spec]
	Added stubs for DeletePrinterDriver32A, DeleteMonitor32A
	and DeletePort32A.

	* [windows/mdi.c][include/windows.h][relay32/user32.spec]
	Added stubs for CascadeWindows and TileWindows.

	* [controls/toolbar.c][include/toolbar.h]
	Fixed a few bugs and implemented new features.

	* [misc/shellord.c][relay32/shell32.spec]
	Added stubs for SHELL32_60, SHELL32_61 and SHELL32_184.

	* [controls/comctl32undoc.c][relay32/comctl32.spec]
	New file comctl32undoc.c. Contains undocumented functions
	of COMCTL32.DLL. These functions are needed to run EXPLORER.EXE
	IEXPLORE.EXE and TASKMAN.EXE.

	* [controls/status.c]
	Added text alignment.

Tue Jun  8 22:00:00 1998  Bertho Stultiens <bertho@akhphd.au.dk>

	* [programs/*/Makefile.in]
	Changed the rules to use wrc as resource compiler but
	passing the source through gcc first for macro expansion.

	* [programs/*/*.rc]
	Added #include "windows.h" for the resource compiler in the
	appropriate files.

	* [tools/wrc/wrc.[ch]] [tools/wrc/writeres.c]
	Added commandline option -A for autoregister code.
	Corrected the underscore problem by checking the proper define
	from config.h.

Sun Jun  7 22:09:29 1998  Pascal Cuoq <pcuoq@ens-lyon.fr>

	* [ole/ole2nls.c] [memory/string.c]
	Improved LCMapString32A, and changed CompareString32A,
	lstrcmp, lstrcmpi to use it.

Sat Jun  6 19:00:50 1998  Martin Strömberg <ams@ludd.luth.se>

	* [include/winnt.h]
	Added typedefs for security and tokens.

Sat Jun  6 12:26:31 1998  Morten Welinder  <terra@diku.dk>

	* [objects/text.c]
	Use debugstr_an in DrawText16.

	* [loader/resource.c]
	Use debugres_w in FindResourceEx32W.  Avoid crashing during
	debug when wm is NULL.

	* [if1632/relay.c]
	In RELAY_DebugCallTo16, send output to the right place and
	avoid side effects in macro arguments.

Wed Jun  3 20:56:03 1998  Huw D M Davies <daviesh@abacus.physics.ox.ac.uk>

	* [controls/scroll.c] [windows/nonclient.c]
	Fix several off by one errors in scrollbar painting.

Tue Jun  2 23:58:59 1998  Insomnia (Stea Greene) <insomnia@core.binghamton.edu>

	* [graphics/dsound.c]
	Rewrote mixer code to handle panning and volume for 16->16, 16->8,
	8->16, and 8->8 bit mixes.  Conforms to DirectX's "logarithmic
	hearing scale" as specified in M$VC docs.  Still does not handle
	mixing of different frequencies (I am still working on that). 
	Tested 16->16 extensively with StarCraft.  Other mixing combinations
	untested but should work fine.  Still kind of a work in progress,
	so be warned.

Tue Jun  2 03:31:33 1998  Alexander V. Lukyanov <lav@long.yar.ru>

	* [tools/wrc/utils.c]
	dup_basename: fix to strip directory.

Mon Jun  1 20:00:00 1998  Juergen Schmied <juergen.schmied@metronet.de>

	* [include/windows.h] [objects/cursoricon.c] [relay32/user32.spec]
	Added stubs LoadCursorFromFileW and LoadCursorFromFileA.
diff --git a/relay32/Makefile.in b/relay32/Makefile.in
index 95fa16c..a8aa55b 100644
--- a/relay32/Makefile.in
+++ b/relay32/Makefile.in
@@ -39,7 +39,8 @@
 
 C_SRCS = \
 	builtin32.c \
-	relay386.c
+	relay386.c \
+	snoop.c
 
 SPEC_FILES = $(DLLS:.spec=.c)
 
diff --git a/relay32/advapi32.spec b/relay32/advapi32.spec
index b3fcc0d..2c95902 100644
--- a/relay32/advapi32.spec
+++ b/relay32/advapi32.spec
@@ -46,8 +46,8 @@
 0042 stdcall FreeSid(ptr) FreeSid
 0043 stub GetAce
 0044 stub GetAclInformation
-0045 stub GetFileSecurityA
-0046 stub GetFileSecurityW
+0045 stdcall GetFileSecurityA(str long ptr long ptr) GetFileSecurity32A
+0046 stdcall GetFileSecurityW(wstr long ptr long ptr) GetFileSecurity32W
 0047 stub GetKernelObjectSecurity
 0048 stdcall GetLengthSid(ptr) GetLengthSid
 0049 stub GetNumberOfEventLogRecords
diff --git a/relay32/builtin32.c b/relay32/builtin32.c
index 3e238ca..afac993 100644
--- a/relay32/builtin32.c
+++ b/relay32/builtin32.c
@@ -299,8 +299,11 @@
     for (table = BuiltinDLLs; table->descr; table++)
         if (!lstrcmpi32A( table->descr->name, dllname )) break;
     if (!table->descr) return 0;
-    if (!table->used && !force) return 0;
-
+    if (!table->used)
+    {
+        if (!force) return 0;
+        table->used = TRUE;  /* So next time we use it at once */
+    }
     return BUILTIN32_DoLoadModule( table, process );
 }
 
@@ -339,7 +342,8 @@
             }
         }
     
-    assert(dll->descr);
+    if (!dll->descr)
+    	return (ENTRYPOINT32)NULL;
 
     /* Now find the function */
 
diff --git a/relay32/comctl32.spec b/relay32/comctl32.spec
index a493dcf..cd5871c 100644
--- a/relay32/comctl32.spec
+++ b/relay32/comctl32.spec
@@ -8,9 +8,9 @@
 
   2 stdcall MenuHelp(long long long long long long ptr) MenuHelp
   3 stub ShowHideMenuCtl
-  4 stub GetEffectiveClientRect
-  5 stdcall DrawStatusTextA(long ptr ptr long) DrawStatusText32A
-  6 stdcall CreateStatusWindowA(long ptr long long) CreateStatusWindow32A
+  4 stdcall GetEffectiveClientRect(long long long) GetEffectiveClientRect
+  5 stdcall DrawStatusTextA(long ptr str long) DrawStatusText32A
+  6 stdcall CreateStatusWindowA(long str long long) CreateStatusWindow32A
   7 stdcall CreateToolbar(long long long long long long ptr long) CreateToolbar
   8 stdcall CreateMappedBitmap(long long long ptr long) CreateMappedBitmap
   9 stub COMCTL32_9
@@ -25,14 +25,14 @@
  18 stub CreatePropertySheetPage
  19 stub CreatePropertySheetPageA
  20 stub CreatePropertySheetPageW
- 21 stdcall CreateStatusWindow(long ptr long long) CreateStatusWindow32A
- 22 stdcall CreateStatusWindowW(long ptr long long) CreateStatusWindow32W
+ 21 stdcall CreateStatusWindow(long str long long) CreateStatusWindow32A
+ 22 stdcall CreateStatusWindowW(long wstr long long) CreateStatusWindow32W
  23 stdcall CreateToolbarEx(long long long long long long ptr long long long long long long) CreateToolbarEx
  24 stub DestroyPropertySheetPage
- 25 stub DllGetVersion
+ 25 stdcall DllGetVersion(ptr) COMCTL32_DllGetVersion
  26 stub DllInstall
- 27 stdcall DrawStatusText(long ptr ptr long) DrawStatusText32A
- 28 stdcall DrawStatusTextW(long ptr ptr long) DrawStatusText32W
+ 27 stdcall DrawStatusText(long ptr str long) DrawStatusText32A
+ 28 stdcall DrawStatusTextW(long ptr wstr long) DrawStatusText32W
  29 stub FlatSB_EnableScrollBar
  30 stub FlatSB_GetScrollInfo
  31 stub FlatSB_GetScrollPos
@@ -66,18 +66,18 @@
  59 stdcall ImageList_GetImageCount(ptr) ImageList_GetImageCount
  60 stdcall ImageList_GetImageInfo(ptr long ptr) ImageList_GetImageInfo
  61 stdcall ImageList_GetImageRect(ptr long ptr) ImageList_GetImageRect
- 63 stdcall ImageList_LoadImage(long ptr long long long long long) ImageList_LoadImage32A
- 63 stdcall ImageList_LoadImageA(long ptr long long long long long) ImageList_LoadImage32A
- 64 stdcall ImageList_LoadImageW(long ptr long long long long long) ImageList_LoadImage32W
+ 63 stdcall ImageList_LoadImage(long str long long long long long) ImageList_LoadImage32A
+ 63 stdcall ImageList_LoadImageA(long str long long long long long) ImageList_LoadImage32A
+ 64 stdcall ImageList_LoadImageW(long wstr long long long long long) ImageList_LoadImage32W
  65 stdcall ImageList_Merge(ptr long ptr long long long) ImageList_Merge
  66 stdcall ImageList_Read(ptr) ImageList_Read
  67 stdcall ImageList_Remove(ptr long) ImageList_Remove
  68 stdcall ImageList_Replace(ptr long long long) ImageList_Replace
  69 stdcall ImageList_ReplaceIcon(ptr long long) ImageList_ReplaceIcon
  70 stdcall ImageList_SetBkColor(ptr long) ImageList_SetBkColor
- 71 stub Alloc
- 72 stub ReAlloc
- 73 stub Free
+ 71 stdcall Alloc(long) Alloc
+ 72 stdcall ReAlloc(long long) ReAlloc
+ 73 stdcall Free(long) Free
  74 stub GetSize
  75 stdcall ImageList_SetDragCursorImage(ptr long long long) ImageList_SetDragCursorImage
  76 stub ImageList_SetFilter
@@ -112,22 +112,22 @@
 235 stub Str_GetPtrW
 236 stub Str_SetPtrW
 
-320 stub DSA_Create
-321 stub DSA_Destroy
+320 stdcall DSA_Create(long long) DSA_Create
+321 stdcall DSA_Destroy(long) DSA_Destroy
 322 stub DSA_GetItem
-323 stub DSA_GetItemPtr
-324 stub DSA_InsertItem
+323 stdcall DSA_GetItemPtr(long long) DSA_GetItemPtr
+324 stdcall DSA_InsertItem(long long long) DSA_InsertItem
 325 stub DSA_SetItem
-326 stub DSA_DeleteItem
+326 stdcall DSA_DeleteItem(long long) DSA_DeleteItem
 327 stub DSA_DeleteAllItems
 
-328 stub DPA_Create
+328 stdcall DPA_Create(long) DPA_Create
 329 stub DPA_Destroy
 330 stub DPA_Grow
 331 stub DPA_Clone
-332 stub DPA_GetPtr
+332 stdcall DPA_GetPtr(long long) DPA_GetPtr
 333 stub DPA_GetPtrIndex
-334 stub DPA_InsertPtr
+334 stdcall DPA_InsertPtr(long long long) DPA_InsertPtr
 335 stub DPA_SetPtr
 336 stub DPA_DeletePtr
 337 stub DPA_DeleteAllPtrs
@@ -137,7 +137,7 @@
 341 stub SendNotify
 342 stub SendNotifyEx
 
-350 stub StrChrA
+350 stdcall StrChrA(long long) COMCTL32_StrChrA
 351 stub StrRChr
 352 stub StrCmpNA
 353 stub StrCmpNIA
diff --git a/relay32/comdlg32.spec b/relay32/comdlg32.spec
index f3c6223..c9006ce 100644
--- a/relay32/comdlg32.spec
+++ b/relay32/comdlg32.spec
@@ -16,7 +16,7 @@
 12 stdcall GetSaveFileNameA(ptr) GetSaveFileName32A
 13 stdcall GetSaveFileNameW(ptr) GetSaveFileName32A
 14 stub LoadAlterBitmap
-15 stub PageSetupDlgA
+15 stdcall PageSetupDlgA(ptr) PageSetupDlg32A
 16 stub PageSetupDlgW
 17 stdcall PrintDlgA(ptr) PrintDlg32A
 18 stdcall PrintDlgW(ptr) PrintDlg32W
diff --git a/relay32/crtdll.spec b/relay32/crtdll.spec
index 5259e53..95a5555 100644
--- a/relay32/crtdll.spec
+++ b/relay32/crtdll.spec
@@ -234,7 +234,7 @@
 230 stub _mbstrlen
 231 stub _mbsupr
 232 stub _memccpy
-233 stub _memicmp
+233 cdecl _memicmp(str str long) CRTDLL__memicmp
 234 cdecl _mkdir(str) CRTDLL__mkdir
 235 stub _mktemp
 236 stub _msize
@@ -321,7 +321,7 @@
 317 stub _utime
 318 stub _vsnprintf
 319 stub _vsnwprintf
-320 stub _wcsdup
+320 cdecl _wcsdup(wstr) CRTDLL__wcsdup
 321 cdecl _wcsicmp(wstr wstr) CRTDLL__wcsicmp
 322 cdecl _wcsicoll(wstr wstr) CRTDLL__wcsicoll
 323 cdecl _wcslwr(wstr) CRTDLL__wcslwr
diff --git a/relay32/kernel32.spec b/relay32/kernel32.spec
index 42e0af7..e403451 100644
--- a/relay32/kernel32.spec
+++ b/relay32/kernel32.spec
@@ -87,9 +87,9 @@
  73 stub K32RtlEnlargedIntegerMultiply
  74 stub K32RtlEnlargedUnsignedMultiply
  75 stub K32RtlEnlargedUnsignedDivide
- 76 stub K32RtlExtendedLargeIntegerDivide
+ 76 stdcall K32RtlExtendedLargeIntegerDivide(long long long ptr) RtlExtendedLargeIntegerDivide
  77 stub K32RtlExtendedMagicDivide
- 78 stub K32RtlExtendedIntegerMultiply
+ 78 stdcall K32RtlExtendedIntegerMultiply(long long long) RtlExtendedIntegerMultiply
  79 stub K32RtlLargeIntegerShiftLeft
  80 stub K32RtlLargeIntegerShiftRight
  81 stub K32RtlLargeIntegerArithmeticShift
@@ -182,7 +182,7 @@
 167 stdcall CreateMutexW(ptr long wstr) CreateMutex32W
 168 stdcall CreateNamedPipeA(str long long long long long long ptr) CreateNamedPipeA
 169 stdcall CreateNamedPipeW(wstr long long long long long long ptr) CreateNamedPipeW
-170 stub CreatePipe
+170 stdcall CreatePipe(ptr ptr ptr long) CreatePipe
 171 stdcall CreateProcessA(str str ptr ptr long long ptr str ptr ptr) CreateProcess32A
 172 stdcall CreateProcessW(wstr wstr ptr ptr long long ptr wstr ptr ptr) CreateProcess32W
 173 stub CreateRemoteThread
@@ -263,7 +263,7 @@
 247 stdcall FindCloseChangeNotification(long) FindCloseChangeNotification
 246 stdcall FindClose(long) FindClose32
 248 stdcall FindFirstChangeNotificationA(str long long) FindFirstChangeNotification32A
-249 stub FindFirstChangeNotificationW
+249 stdcall FindFirstChangeNotificationW(wstr long long) FindFirstChangeNotification32W
 250 stdcall FindFirstFileA(str ptr) FindFirstFile32A
 251 stdcall FindFirstFileW(wstr ptr) FindFirstFile32W
 252 stdcall FindNextChangeNotification(long) FindNextChangeNotification
@@ -390,7 +390,7 @@
 373 stdcall GetProcessAffinityMask(long ptr ptr) GetProcessAffinityMask
 374 stdcall GetProcessFlags(long) GetProcessFlags
 375 stdcall GetProcessHeap() GetProcessHeap
-376 stub GetProcessHeaps
+376 stdcall GetProcessHeaps(long ptr) GetProcessHeaps
 377 stub GetProcessShutdownParameters
 378 stdcall GetProcessTimes(long ptr ptr ptr ptr) GetProcessTimes
 379 stdcall GetProcessVersion(long) GetProcessVersion
@@ -841,7 +841,7 @@
 824 stub HeapSummary
 825 stub HeapUsage
 826 stub InvalidateConsoleDIBits
-827 stub IsDebuggerPresent
+827 stdcall IsDebuggerPresent() IsDebuggerPresent
 829 stub OpenConsoleW
 830 stub QueryWin31IniFilesMappedToRegistry
 831 stub RegisterConsoleVDM
diff --git a/relay32/mpr.spec b/relay32/mpr.spec
index aa2516a..aa83c39 100644
--- a/relay32/mpr.spec
+++ b/relay32/mpr.spec
@@ -71,8 +71,8 @@
 0068 stub WNetFormatNetworkNameA
 0069 stub WNetFormatNetworkNameW
 0070 stdcall WNetGetCachedPassword(ptr long ptr ptr long) WNetGetCachedPassword
-0071 stdcall WNetGetConnectionA(ptr ptr ptr) WNetGetConnection32A
-0072 stub WNetGetConnectionW
+0071 stdcall WNetGetConnectionA(str ptr ptr) WNetGetConnection32A
+0072 stdcall WNetGetConnectionW(wstr ptr ptr) WNetGetConnection32W
 0073 stub WNetGetHomeDirectoryA
 0074 stub WNetGetHomeDirectoryW
 0075 stub WNetGetLastErrorA
diff --git a/relay32/ntdll.spec b/relay32/ntdll.spec
index d8aba3b..2e4a7ec 100644
--- a/relay32/ntdll.spec
+++ b/relay32/ntdll.spec
@@ -108,7 +108,7 @@
 105 stub NtFlushVirtualMemory
 106 stub NtFlushWriteBuffer
 107 stub NtFreeVirtualMemory
-108 stub NtFsControlFile
+108 stdcall NtFsControlFile() NtFsControlFile
 109 stub NtGetContextThread
 110 stub NtGetPlugPlayEvent
 111 stub NtGetTickCount
@@ -149,7 +149,7 @@
 146 stub NtQueryAttributesFile
 147 stub NtQueryDefaultLocale
 148 stub NtQueryDirectoryFile
-149 stdcall NtQueryDirectoryObject(long long) NtQueryDirectoryObject
+149 stdcall NtQueryDirectoryObject(long long long long long long long) NtQueryDirectoryObject
 150 stub NtQueryEaFile
 151 stub NtQueryEvent
 152 stub NtQueryInformationFile
@@ -161,14 +161,14 @@
 158 stub NtQueryIoCompletion
 159 stub NtQueryKey
 160 stub NtQueryMutant
-161 stdcall NtQueryObject(long long) NtQueryObject
+161 stdcall NtQueryObject(long long long long long) NtQueryObject
 162 stub NtQueryPerformanceCounter
 163 stub NtQuerySection
 164 stub NtQuerySecurityObject
 165 stub NtQuerySemaphore
 166 stub NtQuerySymbolicLinkObject
 167 stub NtQuerySystemEnvironmentValue
-168 stdcall NtQuerySystemInformation(long) NtQuerySystemInformation
+168 stdcall NtQuerySystemInformation(long long long long) NtQuerySystemInformation
 169 stub NtQuerySystemTime
 170 stub NtQueryTimer
 171 stub NtQueryTimerResolution
@@ -207,7 +207,7 @@
 204 stub NtSetInformationFile
 205 stub NtSetInformationKey
 206 stub NtSetInformationObject
-207 stdcall NtSetInformationProcess(long) NtSetInformationProcess
+207 stdcall NtSetInformationProcess(long long long long) NtSetInformationProcess
 208 stub NtSetInformationThread
 209 stub NtSetInformationToken
 210 stub NtSetIntervalProfile
@@ -358,8 +358,8 @@
 355 stub RtlEraseUnicodeString
 356 stub RtlExpandEnvironmentStrings_U
 357 stub RtlExtendHeap
-358 stub RtlExtendedIntegerMultiply
-359 stub RtlExtendedLargeIntegerDivide
+358 stdcall RtlExtendedIntegerMultiply(long long long) RtlExtendedIntegerMultiply
+359 stdcall RtlExtendedLargeIntegerDivide(long long long ptr) RtlExtendedLargeIntegerDivide
 360 stub RtlExtendedMagicDivide
 361 stdcall RtlFillMemory(ptr long long) RtlFillMemory
 362 stub RtlFillMemoryUlong
@@ -502,7 +502,7 @@
 499 stub RtlSubtreeSuccessor
 500 stub RtlSystemTimeToLocalTime
 501 stub RtlTimeFieldsToTime
-502 stdcall RtlTimeToElapsedTimeFields(long) RtlTimeToElapsedTimeFields
+502 stdcall RtlTimeToElapsedTimeFields(long long) RtlTimeToElapsedTimeFields
 503 stub RtlTimeToSecondsSince1970
 504 stub RtlTimeToSecondsSince1980
 505 stub RtlTimeToTimeFields
@@ -868,7 +868,7 @@
 865 stub _itoa
 866 stub _ltoa
 867 stub _memccpy
-868 stub _memicmp
+868 cdecl _memicmp(str str long) CRTDLL__memicmp
 869 stub _snprintf
 870 stub _snwprintf
 871 stub _splitpath
diff --git a/relay32/ole32.spec b/relay32/ole32.spec
index 7350c10..cbbf832 100644
--- a/relay32/ole32.spec
+++ b/relay32/ole32.spec
@@ -31,7 +31,7 @@
  28 stub CoIsHandlerConnected
  29 stub CoIsOle1Class
  30 stub CoLoadLibrary
- 31 stub CoLockObjectExternal
+ 31 stdcall CoLockObjectExternal(ptr long long) CoLockObjectExternal32
  32 stub CoMarshalHresult
  33 stub CoMarshalInterThreadInterfaceInStream
  34 stub CoMarshalInterface
diff --git a/relay32/oleaut32.spec b/relay32/oleaut32.spec
index a315b0a..af80955 100644
--- a/relay32/oleaut32.spec
+++ b/relay32/oleaut32.spec
@@ -137,7 +137,7 @@
 164 stdcall QueryPathOfRegTypeLib(ptr long long long ptr) QueryPathOfRegTypeLib32
 165 stub LHashValOfNameSys
 166 stub LHashValOfNameSysA
-170 stub OaBuildVersion
+170 stdcall OaBuildVersion() OaBuildVersion
 171 stub ClearCustData
 180 stub CreateTypeLib2
 183 stub LoadTypeLibEx
diff --git a/relay32/relay386.c b/relay32/relay386.c
index 612bbc5..e586d40 100644
--- a/relay32/relay386.c
+++ b/relay32/relay386.c
@@ -7,6 +7,7 @@
 #ifdef __i386__
 
 #include <assert.h>
+#include <string.h>
 #include "winnt.h"
 #include "windows.h"
 #include "builtin32.h"
@@ -14,6 +15,8 @@
 #include "debugstr.h"
 #include "debug.h"
 
+char **debug_relay_excludelist = NULL, **debug_relay_includelist = NULL;
+
 /***********************************************************************
  *           RELAY_CallFrom32
  *
@@ -26,7 +29,7 @@
  */
 int RELAY_CallFrom32( int ret_addr, ... )
 {
-    int i, ret;
+    int i, ret, show = 1;
     char buffer[80];
     FARPROC32 func;
     unsigned int mask, typemask;
@@ -38,12 +41,41 @@
     WORD nb_args = *(WORD *)(relay_addr + 1) / sizeof(int);
 
     assert(TRACE_ON(relay));
+    GET_FS( fs );
     func = (FARPROC32)BUILTIN32_GetEntryPoint( buffer, relay_addr - 5,
                                                &typemask );
-    DPRINTF( "Call %s(", buffer );
-    args++;
-    for (i = 0, mask = 3; i < nb_args; i++, mask <<= 2)
-    {
+    if(debug_relay_excludelist || debug_relay_includelist) {
+      char *term = strchr(buffer, ':'), **listitem;
+      int len, len2, itemlen;
+
+      if(debug_relay_excludelist) {
+	show = 1;
+	listitem = debug_relay_excludelist;
+      } else {
+	show = 0;
+	listitem = debug_relay_includelist;
+      }
+      assert(term);
+      assert(strlen(term) > 2);
+      len = term - buffer;
+      len2 = strchr(buffer, '.') - buffer;
+      assert(len2 && len2 > 0 && len2 < 64);
+      term += 2;
+      for(; *listitem; listitem++) {
+        itemlen = strlen(*listitem);
+        if((itemlen == len && !strncmp(*listitem, buffer, len)) ||
+           (itemlen == len2 && !strncmp(*listitem, buffer, len2)) ||
+           !strcmp(*listitem, term)) {
+          show = !show;
+          break;
+        }
+      }
+    }
+    if(show) {
+      DPRINTF( "Call %s(", buffer );
+      args++;
+      for (i = 0, mask = 3; i < nb_args; i++, mask <<= 2)
+      {
         if (i) DPRINTF( "," );
 	if ((typemask & mask) && HIWORD(args[i]))
         {
@@ -53,9 +85,10 @@
 	    	DPRINTF( "%08x %s", args[i], debugstr_a((LPCSTR)args[i]) );
 	}
         else DPRINTF( "%08x", args[i] );
-    }
-    GET_FS( fs );
-    DPRINTF( ") ret=%08x fs=%04x\n", ret_addr, fs );
+      }
+      DPRINTF( ") ret=%08x fs=%04x\n", ret_addr, fs );
+    } else
+      args++;
     if (*relay_addr == 0xc3) /* cdecl */
     {
         LRESULT (*cfunc)() = (LRESULT(*)())func;
@@ -136,8 +169,9 @@
             assert(FALSE);
         }
     }
-    DPRINTF( "Ret  %s() retval=%08x ret=%08x fs=%04x\n",
-             buffer, ret, ret_addr, fs );
+    if(show)
+      DPRINTF( "Ret  %s() retval=%08x ret=%08x fs=%04x\n",
+               buffer, ret, ret_addr, fs );
     return ret;
 }
 
@@ -207,31 +241,39 @@
 	 */
 
         relay_addr = *(BYTE **) ESP_reg(&context); 
-        ESP_reg(&context) += sizeof(BYTE *);
-	EIP_reg(&context) = *(DWORD *)ESP_reg(&context);
+        if (BUILTIN32_GetEntryPoint( buffer, relay_addr - 5, &typemask )) {
+	    /* correct win32 spec generated register function found. 
+	     * remove extra call stuff from stack
+	     */
+            ESP_reg(&context) += sizeof(BYTE *);
+	    EIP_reg(&context) = *(DWORD *)ESP_reg(&context);
+	    DPRINTF("Call %s(regs) ret=%08x\n", buffer, *(int *)ESP_reg(&context) );
+	    DPRINTF(" EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx ESI=%08lx EDI=%08lx\n",
+		    EAX_reg(&context), EBX_reg(&context), ECX_reg(&context),
+		    EDX_reg(&context), ESI_reg(&context), EDI_reg(&context) );
+	    DPRINTF(" EBP=%08lx ESP=%08lx EIP=%08lx DS=%04lx ES=%04lx FS=%04lx GS=%04lx EFL=%08lx\n",
+		    EBP_reg(&context), ESP_reg(&context), EIP_reg(&context),
+		    DS_reg(&context), ES_reg(&context), FS_reg(&context),
+		    GS_reg(&context), EFL_reg(&context) );
 
-        BUILTIN32_GetEntryPoint( buffer, relay_addr - 5, &typemask );
-        DPRINTF("Call %s(regs) ret=%08x\n", buffer, *(int *)ESP_reg(&context) );
-        DPRINTF(" EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx ESI=%08lx EDI=%08lx\n",
-                EAX_reg(&context), EBX_reg(&context), ECX_reg(&context),
-                EDX_reg(&context), ESI_reg(&context), EDI_reg(&context) );
-        DPRINTF(" EBP=%08lx ESP=%08lx EIP=%08lx DS=%04lx ES=%04lx FS=%04lx GS=%04lx EFL=%08lx\n",
-                EBP_reg(&context), ESP_reg(&context), EIP_reg(&context),
-                DS_reg(&context), ES_reg(&context), FS_reg(&context),
-                GS_reg(&context), EFL_reg(&context) );
+	    /* Now call the real function */
+	    entry_point( &context );
 
-        /* Now call the real function */
-        entry_point( &context );
 
-        DPRINTF("Ret  %s() retval=regs ret=%08x\n", buffer, *(int *)ESP_reg(&context) );
-        DPRINTF(" EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx ESI=%08lx EDI=%08lx\n",
-                EAX_reg(&context), EBX_reg(&context), ECX_reg(&context),
-                EDX_reg(&context), ESI_reg(&context), EDI_reg(&context) );
-        DPRINTF(" EBP=%08lx ESP=%08lx EIP=%08lx DS=%04lx ES=%04lx FS=%04lx GS=%04lx EFL=%08lx\n",
-                EBP_reg(&context), ESP_reg(&context), EIP_reg(&context),
-                DS_reg(&context), ES_reg(&context), FS_reg(&context),
-                GS_reg(&context), EFL_reg(&context) );
+	    DPRINTF("Ret  %s() retval=regs ret=%08x\n", buffer, *(int *)ESP_reg(&context) );
+	    DPRINTF(" EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx ESI=%08lx EDI=%08lx\n",
+		    EAX_reg(&context), EBX_reg(&context), ECX_reg(&context),
+		    EDX_reg(&context), ESI_reg(&context), EDI_reg(&context) );
+	    DPRINTF(" EBP=%08lx ESP=%08lx EIP=%08lx DS=%04lx ES=%04lx FS=%04lx GS=%04lx EFL=%08lx\n",
+		    EBP_reg(&context), ESP_reg(&context), EIP_reg(&context),
+		    DS_reg(&context), ES_reg(&context), FS_reg(&context),
+		    GS_reg(&context), EFL_reg(&context) );
+	} else
+	    /* WINE internal register function found. Do not remove anything.
+	     * Do not print any debuginfo (it is not a normal relayed one).
+	     * Currently only used for snooping.
+	     */
+	   entry_point( &context );
     }
 }
-
 #endif  /* __i386__ */
diff --git a/relay32/shell32.spec b/relay32/shell32.spec
index 703f574..5607578 100644
--- a/relay32/shell32.spec
+++ b/relay32/shell32.spec
@@ -59,8 +59,8 @@
   57 stub SHELL32_57
   58 stdcall SHELL32_58(long long long long) SHELL32_58
   59 stub SHELL32_59
-  60 stub SHELL32_60
-  61 stub SHELL32_61
+  60 stdcall SHELL32_60(long) SHELL32_60
+  61 stdcall SHELL32_61(long long long str str long) SHELL32_61
   62 stdcall SHELL32_62(long long long long) SHELL32_62
   63 stdcall SHELL32_63(long long long long str str str) SHELL32_63
   64 stub SHELL32_64
@@ -183,7 +183,7 @@
  181 stdcall SHELL32_181(long long) SHELL32_181
  182 stub ExtractVersionResource16W
  183 cdecl SHELL32_183(long long long long long long) SHELL32_183
- 184 stub SHELL32_184
+ 184 stdcall SHELL32_184(long long long long long) SHELL32_184
  185 stub SHELL32_185
  186 stdcall FindExecutableA(ptr ptr ptr) FindExecutable32A
  187 stub FindExecutableW
@@ -223,7 +223,7 @@
  221 stdcall SHGetPathFromIDList(ptr ptr) SHGetPathFromIDList
  222 stub SHGetPathFromIDListA
  223 stdcall SHGetSpecialFolderLocation(long long ptr) SHGetSpecialFolderLocation
- 224 stub SHHelpShortcuts_RunDLL
+ 224 stdcall SHHelpShortcuts_RunDLL(long long long long) SHHelpShortcuts_RunDLL
  225 stub SHLoadInProc
  226 stub SheChangeDirA
  227 stub SheChangeDirExA
diff --git a/relay32/snoop.c b/relay32/snoop.c
new file mode 100644
index 0000000..061fad2
--- /dev/null
+++ b/relay32/snoop.c
@@ -0,0 +1,338 @@
+/*
+ * 386-specific Win32 dll<->dll snooping functions
+ *
+ * Copyright 1998 Marcus Meissner
+ */
+
+#ifdef __i386__
+
+#include <assert.h>
+#include "windows.h"
+#include "winbase.h"
+#include "winnt.h"
+#include "heap.h"
+#include "builtin32.h"
+#include "snoop.h"
+#include "peexe.h"
+#include "selectors.h"
+#include "stackframe.h"
+#include "debugstr.h"
+#include "debug.h"
+
+#ifdef NEED_UNDERSCORE_PREFIX
+# define PREFIX "_"
+#else
+# define PREFIX
+#endif
+
+/* Well ,not exactly extern since they are in the same file (in the lines
+ * below). But the C Compiler doesn't see them there, so we have to help a bit.
+ */
+extern void SNOOP_Return();
+extern void SNOOP_Entry();
+__asm__(".align 4\n\t"
+        ".globl "PREFIX"SNOOP_Entry\n\t"
+        ".type "PREFIX"SNOOP_Entry,@function\n\t"
+        PREFIX"SNOOP_Entry:\n\t"
+        "pushl $"PREFIX"__regs_SNOOP_Entry\n\t"
+        "pushl $"PREFIX"CALL32_Regs\n\t"
+        "ret\n\t"
+	".align 4\n\t"
+        ".globl "PREFIX"SNOOP_Return\n\t"
+        ".type "PREFIX"SNOOP_Return,@function\n\t"
+        PREFIX"SNOOP_Return:\n\t"
+        "pushl $"PREFIX"__regs_SNOOP_Return\n\t"
+        "pushl $"PREFIX"CALL32_Regs\n\t"
+        "ret"
+);
+
+#pragma pack(1)
+
+typedef	struct tagSNOOP_FUN {
+	/* code part */
+	BYTE		lcall;		/* 0xe8 call snoopentry (relative) */
+	/* NOTE: If you move snoopentry OR nrofargs fix the relative offset
+	 * calculation!
+	 */
+	DWORD		snoopentry;	/* SNOOP_Entry relative */
+	/* unreached */
+	int		nrofargs;
+	FARPROC32	origfun;
+	char		*name;
+} SNOOP_FUN;
+
+typedef struct tagSNOOP_DLL {
+	HMODULE32	hmod;
+	SNOOP_FUN	*funs;
+	LPCSTR		name;
+	int		nrofordinals;
+	struct tagSNOOP_DLL	*next;
+} SNOOP_DLL;
+typedef struct tagSNOOP_RETURNENTRY {
+	/* code part */
+	BYTE		lcall;		/* 0xe8 call snoopret relative*/
+	/* NOTE: If you move snoopret OR origreturn fix the relative offset
+	 * calculation!
+	 */
+	DWORD		snoopret;	/* SNOOP_Ret relative */
+	/* unreached */
+	FARPROC32	origreturn;
+	SNOOP_DLL	*dll;
+	DWORD		ordinal;
+	DWORD		origESP;
+	DWORD		*args;		/* saved args across a stdcall */
+} SNOOP_RETURNENTRY;
+
+typedef struct tagSNOOP_RETURNENTRIES {
+	SNOOP_RETURNENTRY entry[4092/sizeof(SNOOP_RETURNENTRY)];
+	struct tagSNOOP_RETURNENTRIES	*next;
+} SNOOP_RETURNENTRIES;
+
+#pragma pack(4)
+
+static	SNOOP_DLL		*firstdll = NULL;
+static	SNOOP_RETURNENTRIES 	*firstrets = NULL;
+
+void
+SNOOP_RegisterDLL(HMODULE32 hmod,LPCSTR name,DWORD nrofordinals) {
+	SNOOP_DLL	**dll = &(firstdll);
+	char		*s;
+
+	if (!TRACE_ON(snoop)) return;
+	while (*dll) {
+		if ((*dll)->hmod == hmod)
+			return; /* already registered */
+		dll = &((*dll)->next);
+	}
+	*dll = (SNOOP_DLL*)HeapAlloc(SystemHeap,HEAP_ZERO_MEMORY,sizeof(SNOOP_DLL));
+	(*dll)->next	= NULL;
+	(*dll)->hmod	= hmod;
+	(*dll)->nrofordinals = nrofordinals;
+	(*dll)->name	= HEAP_strdupA(SystemHeap,0,name);
+	if ((s=strrchr((*dll)->name,'.')))
+		*s='\0';
+	(*dll)->funs = VirtualAlloc(NULL,nrofordinals*sizeof(SNOOP_FUN),MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
+	memset((*dll)->funs,0,nrofordinals*sizeof(SNOOP_FUN));
+	if (!(*dll)->funs) {
+		HeapFree(SystemHeap,0,*dll);
+		FIXME(snoop,"out of memory\n");
+		return;
+	}
+}
+
+FARPROC32
+SNOOP_GetProcAddress32(HMODULE32 hmod,LPCSTR name,DWORD ordinal,FARPROC32 origfun) {
+	SNOOP_DLL			*dll = firstdll;
+	SNOOP_FUN			*fun;
+	int				j;
+	IMAGE_SECTION_HEADER		*pe_seg = PE_SECTIONS(hmod);
+
+	if (!TRACE_ON(snoop)) return origfun;
+	if (!*(LPBYTE)origfun) /* 0x00 is an imposs. opcode, poss. dataref. */
+		return origfun;
+	for (j=0;j<PE_HEADER(hmod)->FileHeader.NumberOfSections;j++)
+		if (((DWORD)origfun-hmod>=pe_seg[j].VirtualAddress)&&
+		    ((DWORD)origfun-hmod <pe_seg[j].VirtualAddress+
+		    		   pe_seg[j].SizeOfRawData)
+		)
+			break;
+	/* If we looked through all sections (and didn't find one) 
+	 * or if the sectionname contains "data", we return the
+	 * original function since it is most likely a datareference.
+	 */
+	if (	(j==PE_HEADER(hmod)->FileHeader.NumberOfSections)	||
+		(strstr(pe_seg[j].Name,"data"))				||
+		!(pe_seg[j].Characteristics & IMAGE_SCN_CNT_CODE)
+	)
+		return origfun;
+
+	while (dll) {
+		if (hmod == dll->hmod)
+			break;
+		dll=dll->next;
+	}
+	if (!dll)	/* probably internal */
+		return origfun;
+	assert(ordinal<dll->nrofordinals);
+	fun = dll->funs+ordinal;
+	if (!fun->name) fun->name = HEAP_strdupA(SystemHeap,0,name);
+	fun->lcall	= 0xe8;
+	/* NOTE: origreturn struct member MUST come directly after snoopentry */
+	fun->snoopentry	= (char*)SNOOP_Entry-((char*)(&fun->nrofargs));
+	fun->origfun	= origfun;
+	fun->nrofargs	= -1;
+	return (FARPROC32)&(fun->lcall);
+}
+
+static char*
+SNOOP_PrintArg(DWORD x) {
+	static char	buf[200];
+	int		i,nostring;
+	MEMORY_BASIC_INFORMATION	mbi;
+
+	if (	!HIWORD(x)					||
+		!VirtualQuery((LPVOID)x,&mbi,sizeof(mbi))	||
+		!mbi.Type
+	) {
+		sprintf(buf,"%08lx",x);
+		return buf;
+	}
+	i=0;nostring=0;
+	if (!IsBadStringPtr32A((LPSTR)x,80)) {
+		while (i<80) {
+			LPBYTE	s=(LPBYTE)x;
+
+			if (s[i]==0) break;
+			if (s[i]<0x20) {nostring=1;break;}
+			if (s[i]>=0x80) {nostring=1;break;}
+			i++;
+		}
+		if (!nostring) {
+			if (i>5) {
+				sprintf(buf,"%08lx \"",x);
+				strncat(buf,(LPSTR)x,198-strlen(buf)-2);
+				strcat(buf,"\"");
+				return buf;
+			}
+		}
+	}
+	i=0;nostring=0;
+	if (!IsBadStringPtr32W((LPWSTR)x,80)) {
+		while (i<80) {
+			LPWSTR	s=(LPWSTR)x;
+
+			if (s[i]==0) break;
+			if (s[i]<0x20) {nostring=1;break;}
+			if (s[i]>0x100) {nostring=1;break;}
+			i++;
+		}
+		if (!nostring) {
+			if (i>5) {
+				sprintf(buf,"%08lx L",x);
+				strcat(buf,debugstr_wn((LPWSTR)x,198-strlen(buf)-2));
+				return buf;
+			}
+		}
+	}
+	sprintf(buf,"%08lx",x);
+	return buf;
+}
+
+#define CALLER1REF (*(DWORD*)(ESP_reg(context)+4))
+REGS_ENTRYPOINT(SNOOP_Entry) {
+	DWORD		ordinal=0,entry = EIP_reg(context)-5;
+	SNOOP_DLL	*dll = firstdll;
+	SNOOP_FUN	*fun = NULL;
+	SNOOP_RETURNENTRIES	**rets = &firstrets;
+	SNOOP_RETURNENTRY	*ret;
+	int		i,max;
+
+	while (dll) {
+		if (	((char*)entry>=(char*)dll->funs)	&&
+			((char*)entry<=(char*)(dll->funs+dll->nrofordinals))
+		) {
+			fun = (SNOOP_FUN*)entry;
+			ordinal = fun-dll->funs;
+			break;
+		}
+		dll=dll->next;
+	}
+	if (!dll) {
+		FIXME(snoop,"entrypoint 0x%08lx not found\n",entry);
+		return; /* oops */
+	}
+	/* guess cdecl ... */
+	if (fun->nrofargs<0) {
+		/* Typical cdecl return frame is:
+		 * 	add esp, xxxxxxxx 
+		 * which has (for xxxxxxxx up to 255 the opcode "83 C4 xx".
+		 */
+		LPBYTE	reteip = (LPBYTE)CALLER1REF;
+
+		if ((reteip[0]==0x83)&&(reteip[1]==0xc4))
+			fun->nrofargs=reteip[2]/4;
+	}
+
+	while (*rets) {
+		for (i=0;i<sizeof((*rets)->entry)/sizeof((*rets)->entry[0]);i++)
+			if (!(*rets)->entry[i].origreturn)
+				break;
+		if (i!=sizeof((*rets)->entry)/sizeof((*rets)->entry[0]))
+			break;
+		rets = &((*rets)->next);
+	}
+	if (!*rets) {
+		*rets = VirtualAlloc(NULL,4096,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
+		memset(*rets,0,4096);
+		i = 0;	/* entry 0 is free */
+	}
+	ret = &((*rets)->entry[i]);
+	ret->lcall	= 0xe8;
+	/* NOTE: origreturn struct member MUST come directly after snoopret */
+	ret->snoopret	= ((char*)SNOOP_Return)-(char*)(&ret->origreturn);
+	ret->origreturn	= (FARPROC32)CALLER1REF;
+	CALLER1REF	= (DWORD)&ret->lcall;
+	ret->dll	= dll;
+	ret->args	= NULL;
+	ret->ordinal	= ordinal;
+	ret->origESP	= ESP_reg(context);
+
+	EIP_reg(context)= (DWORD)fun->origfun;
+
+	DPRINTF("Call %s.%ld: %s(",dll->name,ordinal,fun->name);
+	if (fun->nrofargs>0) {
+		max = fun->nrofargs; if (max>16) max=16;
+		for (i=0;i<max;i++)
+			DPRINTF("%s%s",SNOOP_PrintArg(*(DWORD*)(ESP_reg(context)+8+sizeof(DWORD)*i)),(i<fun->nrofargs-1)?",":"");
+		if (max!=fun->nrofargs)
+			DPRINTF(" ...");
+	} else if (fun->nrofargs<0) {
+		DPRINTF("<unknown, check return>");
+		ret->args = HeapAlloc(SystemHeap,0,16*sizeof(DWORD));
+		memcpy(ret->args,(LPBYTE)(ESP_reg(context)+8),sizeof(DWORD)*16);
+	}
+	DPRINTF(") ret=%08lx fs=%04lx\n",(DWORD)(*rets)->entry[i].origreturn,FS_reg(context));
+}
+
+REGS_ENTRYPOINT(SNOOP_Return) {
+	SNOOP_RETURNENTRY	*ret = (SNOOP_RETURNENTRY*)(EIP_reg(context)-5);
+
+	/* We haven't found out the nrofargs yet. If we called a cdecl
+	 * function it is too late anyway and we can just set '0' (which 
+	 * will be the difference between orig and current ESP
+	 * If stdcall -> everything ok.
+	 */
+	if (ret->dll->funs[ret->ordinal].nrofargs<0)
+		ret->dll->funs[ret->ordinal].nrofargs=(ESP_reg(context)-ret->origESP-4)/4;
+	EIP_reg(context) = (DWORD)ret->origreturn;
+	if (ret->args) {
+		int	i,max;
+
+		DPRINTF("Ret  %s.%ld: %s(",ret->dll->name,ret->ordinal,ret->dll->funs[ret->ordinal].name);
+		max = ret->dll->funs[ret->ordinal].nrofargs;
+		if (max>16) max=16;
+
+		for (i=0;i<max;i++)
+			DPRINTF("%s%s",SNOOP_PrintArg(ret->args[i]),(i<max-1)?",":"");
+		DPRINTF(") retval = %08lx ret=%08lx fs=%04lx\n",
+			EAX_reg(context),(DWORD)ret->origreturn,FS_reg(context)
+		);
+		HeapFree(SystemHeap,0,ret->args);
+		ret->args = NULL;
+	} else
+		DPRINTF("Ret  %s.%ld: %s() retval = %08lx ret=%08lx fs=%04lx\n",
+			ret->dll->name,ret->ordinal,ret->dll->funs[ret->ordinal].name,
+			EAX_reg(context),(DWORD)ret->origreturn,FS_reg(context)
+		);
+	ret->origreturn = NULL; /* mark as empty */
+}
+#else	/* !__i386__ */
+void SNOOP_RegisterDLL(HMODULE32 hmod,LPCSTR name,DWORD nrofordinals) {
+	FIXME(snoop,"snooping works only on i386 for now.\n");
+	return;
+}
+
+FARPROC32 SNOOP_GetProcAddress32(HMODULE32 hmod,LPCSTR name,DWORD ordinal,FARPROC32 origfun) {
+	return origfun;
+}
+#endif	/* !__i386__ */
diff --git a/relay32/tapi32.spec b/relay32/tapi32.spec
index 011d0ab..449df0c 100644
--- a/relay32/tapi32.spec
+++ b/relay32/tapi32.spec
@@ -42,12 +42,12 @@
  39 stub    lineGetTranslateCaps
  40 stub    lineHandoff
  41 stub    lineHold
- 42 stub    lineInitialize
+ 42 stdcall lineInitialize(ptr long ptr str ptr) lineInitialize
  43 stub    lineMakeCall
  44 stub    lineMonitorDigits
  45 stub    lineMonitorMedia
  46 stub    lineMonitorTones
- 47 stub    lineNegotiateAPIVersion
+ 47 stdcall lineNegotiateAPIVersion(long long long long ptr ptr) lineNegotiateAPIVersion
  48 stub    lineNegotiateExtVersion
  49 stub    lineOpen
  50 stub    linePark
@@ -74,7 +74,7 @@
  71 stub    lineSetTollList
  72 stub    lineSetupConference
  73 stub    lineSetupTransfer
- 74 stub    lineShutdown
+ 74 stdcall lineShutdown(long) lineShutdown
  75 stub    lineSwapHold
  76 stub    lineTranslateAddress
  77 stub    lineTranslateDialog
diff --git a/relay32/user32.spec b/relay32/user32.spec
index 71e816c..fe241af 100644
--- a/relay32/user32.spec
+++ b/relay32/user32.spec
@@ -21,7 +21,7 @@
  18 stdcall CallWindowProcA(ptr long long long long) CallWindowProc32A
  19 stdcall CallWindowProcW(ptr long long long long) CallWindowProc32W
  20 stub CascadeChildWindows
- 21 stub CascadeWindows
+ 21 stdcall CascadeWindows(long long ptr long ptr) CascadeWindows
  22 stdcall ChangeClipboardChain(long long) ChangeClipboardChain32
  23 stdcall ChangeMenuA(long long ptr long long) ChangeMenu32A
  24 stdcall ChangeMenuW(long long ptr long long) ChangeMenu32W
@@ -328,7 +328,7 @@
 323 stdcall InsertMenuItemA(long long long ptr) InsertMenuItem32A
 324 stdcall InsertMenuItemW(long long long ptr) InsertMenuItem32W
 325 stdcall InsertMenuW(long long long long ptr) InsertMenu32W
-326 stub InternalGetWindowText
+326 stdcall InternalGetWindowText(long long long) InternalGetWindowText
 327 stdcall IntersectRect(ptr ptr ptr) IntersectRect32
 328 stdcall InvalidateRect(long ptr long) InvalidateRect32
 329 stdcall InvalidateRgn(long long long) InvalidateRgn32
@@ -362,8 +362,8 @@
 357 stdcall LoadBitmapA(long str) LoadBitmap32A
 358 stdcall LoadBitmapW(long wstr) LoadBitmap32W
 359 stdcall LoadCursorA(long str) LoadCursor32A
-360 stub LoadCursorFromFileA
-361 stub LoadCursorFromFileW
+360 stdcall LoadCursorFromFileA(str) LoadCursorFromFile32A
+361 stdcall LoadCursorFromFileW(wstr) LoadCursorFromFile32W
 362 stdcall LoadCursorW(long wstr) LoadCursor32W
 363 stdcall LoadIconA(long str) LoadIcon32A
 364 stdcall LoadIconW(long wstr) LoadIcon32W
@@ -410,7 +410,7 @@
 405 stdcall OemToCharW(ptr ptr) OemToChar32W
 406 stdcall OffsetRect(ptr long long) OffsetRect32
 407 stdcall OpenClipboard(long) OpenClipboard32
-408 stub OpenDesktopA
+408 stdcall OpenDesktopA(str long long long) OpenDesktop32A
 409 stub OpenDesktopW
 410 stdcall OpenIcon(long) OpenIcon32
 411 stub OpenInputDesktop
@@ -457,7 +457,7 @@
 452 stdcall SendDlgItemMessageA(long long long long long) SendDlgItemMessage32A
 453 stdcall SendDlgItemMessageW(long long long long long) SendDlgItemMessage32W
 454 stdcall SendMessageA(long long long long) SendMessage32A
-455 stub SendMessageCallbackA
+455 stdcall SendMessageCallbackA(long long long long ptr long) SendMessageCallBack32A
 456 stub SendMessageCallbackW
 457 stdcall SendMessageTimeoutA(long long long long ptr ptr) SendMessageTimeout32A
 458 stdcall SendMessageTimeoutW(long long long long ptr ptr) SendMessageTimeout32W
@@ -512,9 +512,9 @@
 507 stub SetSystemCursor
 508 stdcall SetSystemMenu(long long) SetSystemMenu32
 509 stdcall SetSystemTimer(long long long ptr) SetSystemTimer32
-510 stub SetThreadDesktop
+510 stdcall SetThreadDesktop(long) SetThreadDesktop
 511 stdcall SetTimer(long long long ptr) SetTimer32
-512 stub SetUserObjectInformationA
+512 stdcall SetUserObjectInformationA(long long long long) SetUserObjectInformation32A
 513 stub SetUserObjectInformationW
 514 stub SetUserObjectSecurity
 515 stdcall SetWindowContextHelpId(long long) SetWindowContextHelpId
@@ -547,7 +547,7 @@
 542 stdcall TabbedTextOutA(long long long str long long ptr long) TabbedTextOut32A
 543 stdcall TabbedTextOutW(long long long wstr long long ptr long) TabbedTextOut32W
 544 stub TileChildWindows
-545 stub TileWindows
+545 stdcall TileWindows(long long ptr long ptr) TileWindows
 546 stdcall ToAscii(long long ptr ptr long) ToAscii32
 547 stub ToAsciiEx
 548 stub ToUnicode
diff --git a/relay32/winmm.spec b/relay32/winmm.spec
index f3b494d..fc210e6 100644
--- a/relay32/winmm.spec
+++ b/relay32/winmm.spec
@@ -9,14 +9,14 @@
   6 stub DriverCallback
   7 stub DrvClose
   8 stub DrvDefDriverProc
-  9 stub DrvGetModuleHandle
+  9 stdcall DrvGetModuleHandle(long) GetDriverModuleHandle32
  10 stub DrvOpen
  11 stub DrvOpenA
  12 stub DrvSendMessage
  13 stub GetDriverFlags
- 14 stub GetDriverModuleHandle
- 15 stdcall OpenDriver(ptr ptr long) OpenDriver
- 16 stub OpenDriverA
+ 14 stdcall GetDriverModuleHandle(long) GetDriverModuleHandle32
+ 15 stdcall OpenDriver(wstr wstr long) OpenDriver32W
+ 16 stdcall OpenDriverA(str str long) OpenDriver32A
  17 stdcall PlaySound(ptr long long) PlaySound32A
  18 stdcall PlaySoundW(ptr long long) PlaySound32W
  19 stub SendDriverMessage
@@ -112,19 +112,19 @@
 109 stdcall mixerMessage(long long long long) mixerMessage32
 110 stdcall mixerOpen(ptr long long long long) mixerOpen32
 111 stdcall mixerSetControlDetails(long ptr long) mixerSetControlDetails32
-112 stub mmioAdvance
-113 stub mmioAscend
-114 stub mmioClose
+112 stdcall mmioAdvance(long ptr long) mmioAdvance32
+113 stdcall mmioAscend(long ptr long) mmioAscend32
+114 stdcall mmioClose(long long) mmioClose32
 115 stub mmioCreateChunk
-116 stub mmioDescend
-117 stub mmioFlush
-118 stub mmioGetInfo
+116 stdcall mmioDescend(long ptr ptr long) mmioDescend
+117 stdcall mmioFlush(long long) mmioFlush32
+118 stdcall mmioGetInfo(long ptr long) mmioGetInfo32
 119 stub mmioInstallIOProc16
 120 stdcall mmioInstallIOProcA(long ptr long) mmioInstallIOProc32A
 121 stub mmioInstallIOProcW
 122 stdcall mmioOpenA(str ptr long) mmioOpen32A
 123 stdcall mmioOpenW(wstr ptr long) mmioOpen32W
-124 stub mmioRead
+124 stdcall mmioRead(long ptr long) mmioRead32
 125 stub mmioRenameA
 126 stub mmioRenameW
 127 stub mmioSeek
diff --git a/relay32/winspool.spec b/relay32/winspool.spec
index 9e05933..4575d3f 100644
--- a/relay32/winspool.spec
+++ b/relay32/winspool.spec
@@ -35,9 +35,9 @@
 132 stub DEVICEMODE
 133 stub DeleteFormA
 134 stub DeleteFormW
-135 stub DeleteMonitorA
+135 stdcall DeleteMonitorA(str str str) DeleteMonitor32A
 136 stub DeleteMonitorW
-137 stub DeletePortA
+137 stdcall DeletePortA(str long str) DeletePort32A
 138 stub DeletePortW
 139 stub DeletePrintProcessorA
 140 stub DeletePrintProcessorW
@@ -46,7 +46,7 @@
 143 stub DeletePrinter
 144 stub DeletePrinterConnectionA
 145 stub DeletePrinterConnectionW
-146 stub DeletePrinterDriverA
+146 stdcall DeletePrinterDriverA(str str str) DeletePrinterDriver32A
 147 stub DeletePrinterDriverW
 148 stub DeletePrinterIC
 149 stub DevQueryPrint