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