Release 980503
Thu Apr 30 16:28:12 1998 James Juran <jrj120@psu.edu>
* [scheduler/process.c]
Implemented GetExitCodeProcess. The code is a direct translation
of GetExitCodeThread.
Mon Apr 27 22:20:25 1998 Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
* [loader/pe_image.c]
Unload dummy module when PE_LoadLibraryEx32A fails with
PE_LoadImage (makes Encarta 98 installer proceed).
* [files/drive.c]
Make GetDriveType16 return DRIVE_REMOVABLE for TYPE_CDROM.
Make GetCurrentDirectory32 behave like the code does and not
like the help describes.
* [files/profile.c]
Revoke recent change in PROFILE_GetSection and try better
handling of special case.
* [include/windows.h]
Change definition of ACCEL32.
* [misc/commdlg.c]
Replace the GetXXXFilename32 macros by normal code.
Fix two reported bugs in my changes to commdlg.
* [windows/win.c]
Add a hook to catch bogus WM_SIZE messages by emitting a warning
in the appropriate case.
* [objects/bitmap.c]
Reject unreasonbable large size arguments in
CreateCompatibleBitmap32 and add an fixme for that situation.
Sun Apr 26 18:30:07 1998 Alexandre Julliard <julliard@lrc.epfl.ch>
* [include/ldt.h] [debugger/*.c] [miscemu/instr.c]
Added IS_SELECTOR_SYSTEM and IS_SELECTOR_32BIT macros.
Make instruction emulation support system selectors.
* [loader/*.c]
Started moving NE specific functions to the new loader/ne
directory.
* [memory/environ.c]
Enforce the 127 chars limit only when creating the environment of
a Win16 process.
Sun Apr 26 12:22:23 1998 Andreas Mohr <100.30936@germany.net>
* [files/file.c]
Fixed an incredible typo in CopyFile32A that made it unusable
since a rewrite in 970112 (!!).
* [files/directory.c]
Fixed GetTempPath32A/W to include trailing backslash.
* [misc/ver.c]
Make find_pe_resource "work" with corrupt files.
* [misc/wsprintf.c]
Altered WPRINTF_ParseFormatA/W to treat invalid format chars
as normal output, too.
* [msdos/dpmi.c]
Implemented "Allocate/Free real mode callback" (0x0303/0x0304).
Cross your fingers if you need to use it ;) (completely untested)
Implemented "Call real mode proc with far return" (0x0301, tested).
* [msdos/int21.c]
Fixed ioctlGenericBlkDevReq/0x60.
* [relay32/dplayx.spec] [relay32/builtin32.c] [relay32/Makefile.in]
Added built-in DPLAYX.DLL.
* [windows/win.c]
Fixed GetWindowWord()/GWW_HWNDPARENT to return the window's owner
if it has no parent (SDK).
Sat Apr 25 15:09:53 1998 M.T.Fortescue <mark@mtfhpc.demon.co.uk>
* [debugger/db_disasm.c]
Fixed disassemble bug for no-display option and 'lock',
'repne' and 'repe' prefixes.
* [debugger/registers.c]
Added textual flag description output on 'info regs'.
Sat Apr 25 14:18:26 1998 Matthew Becker <mbecker@glasscity.net>
* [*/*.c]
Added stubs and/or documentation for the following functions:
LookupPrivilegeValue, OpenService, ControlService, RegGetKeySecurity,
StartService, SetComputerName, DeleteService, CloseServiceHandle,
OpenProcessToken, OpenSCManager, DeregisterEventSource,
WaitForDebugEvent, WaitForInputIdle, RegisterEventSource,
SetDebugErrorLevel, SetConsoleCursorPosition, ChoosePixelFormat,
SetPixelFormat, GetPixelFormat, DescribePixelFormat, SwapBuffers,
PolyBezier, AbortPath, DestroyAcceleratorTable, HeapWalk,
DdeInitialize, DdeUninitialize, DdeConnectList, DdeDisconnectList,
DdeCreateStringHandle, DdePostAdvise, DdeGetData, DdeNameService,
DdeGetLastError, WNetGetDirectoryType, EnumPrinters, RegFlushKey,
RegGetKeySecurity, DllGetClassObject, DllCanUnloadNow, CreateBitmap,
CreateCompatibleBitmap, CreateBitmapIndirect, GetBitmapBits,
SetBitmapBits, LoadImage, CopyImage, LoadBitmap, DrawIcon,
CreateDiscardableBitmap, SetDIBits, GetCharABCWidths, LoadTypeLib,
SetConsoleCtrlHandler, CreateConsoleScreenBuffer, ReadConsoleInput,
GetConsoleCursorInfo, SetConsoleCursorInfo, SetConsoleWindowInfo,
SetConsoleTextAttribute, SetConsoleScreenBufferSize,
FillConsoleOutputCharacter, FillConsoleOutputAttribute,
CreateMailslot, GetMailslotInfo, GetCompressedFileSize,
GetProcessWindowStation, GetThreadDesktop, SetDebugErrorLevel,
WaitForDebugEvent, SetComputerName, CreateMDIWindow.
Thu Apr 23 23:54:04 1998 Douglas Ridgway <ridgway@winehq.com>
* [include/windows.h] [objects/enhmetafile.c] [relay32/gdi32.spec]
Implement CopyEnhMetaFile, Get/SetEnhMetaFileBits, other fixes.
* [include/windows.h] [objects/metafile.c] [relay32/gdi32.spec]
32-bit metafile fixes, implement EnumMetaFile32, GetMetaFileBitsEx.
* [objects/font.c] [graphics/x11drv/xfont.c] [graphics/x11drv/text.c]
Some rotated text support for X11R6 displays.
* [win32/newfns.c] [ole/ole2nls.c]
Moved GetNumberFormat32A.
Wed Apr 22 17:38:20 1998 David Lee Lambert <lamber45@egr.msu.edu>
* [ole/ole2nls.c] [misc/network.c]
Changed some function documentation to the new style.
* [misc/network.c] [include/windows.h] [if1632/user.spec]
[relay32/mpr.spec] [misc/mpr.c]
Added stubs for some Win32 network functions; renamed some
16-bit ones with 32-bit counterparts, as well as
WNetGetDirectoryType; moved the stubs in misc/mpr.c (three of
them!) to misc/network.c.
* [ole/compobj.c] [ole/storage.c] [ole/ole2disp.c]
[ole/ole2nls.c] [ole/folders.c] [ole/moniker.c] [ole/ole2.c]
[graphics/fontengine.c] [graphics/ddraw.c] [graphics/env.c]
[graphics/driver.c] [graphics/escape.c]
Changed fprintf's to proper debug-macros.
* [include/winnls.h]
Added some flags (for internal use).
* [ole/ole2nls.c]
Added the Unicode core function, and worked out a way to hide
the commonality of the core.
* [relay32/kernel32.spec]
Added support for GetDate/Time32A/W.
Wed Apr 22 09:16:03 1998 Gordon Chaffee <chaffee@cs.berkeley.edu>
* [win32/code_page.c]
Fixed problem with MultiByteToWideChar that was introduced in
last release. Made MultiByteToWideChar more compatible with Win32.
* [graphics/x11drv/graphics.c]
Fixed problem with drawing arcs.
Tue Apr 21 11:24:58 1998 Constantine Sapuntzakis <csapuntz@tma-1.lcs.mit.edu>
* [ole/ole2nls.c]
Move stuff from 0x409 case to Lang_En.
* [relay32/user32.spec] [windows/winpos.c]
Added stubs for GetWindowRgn32 and SetWindowRgn32. Makes Office
Paperclip happy.
Tue Apr 21 11:16:16 1998 Constantine Sapuntzakis <csapuntz@tma-1.lcs.mit.edu>
* [loader/pe_image.c]
If image is relocated, TLS addresses need to be adjusted.
* [debugger/*.c]
Generalized tests for 32-bit segments.
Tue Apr 21 02:04:59 1998 James Juran <jrj120@psu.edu>
* [misc/*.c] [miscemu/*.c] [msdos/*.c] [if1632/*.c]
[include/*.h] [loader/*.c] [memory/*.c] [multimedia/*.c]
[objects/*.c]
Almost all fprintf statements converted to appropriate
debug messages.
* [README]
Updated "GETTING MORE INFORMATION" section to include WineHQ.
* [documentation/debugger]
Fixed typo.
* [windows/defwnd.c]
Added function documentation.
Sun Apr 19 16:30:58 1998 Marcus Meissner <marcus@mud.de>
* [Make.rules.in]
Added lint target (using lclint).
* [relay32/oleaut32.spec][relay32/Makefile.in][ole/typelib.c]
[ole/ole2disp.c]
Added oleaut32 spec, added some SysString functions.
* [if1632/signal.c]
Added printing of faultaddress in Linux (using CR2 debug register).
* [configure.in]
Added <sys/types.h> for statfs checks.
* [loader/*.c][debugger/break.c][debugger/hash.c]
Started to split win32/win16 module handling, preparing support
for other binary formats (like ELF).
Sat Apr 18 10:07:41 1998 Rein Klazes <rklazes@casema.net>
* [misc/registry.c]
Fixed a bug that made RegQueryValuexxx returning
incorrect registry values.
Fri Apr 17 22:59:22 1998 Alexander V. Lukyanov <lav@long.yar.ru>
* [misc/lstr.c]
FormatMessage32*: remove linefeed when nolinefeed set;
check for target underflow.
Fri Apr 17 00:38:14 1998 Alexander V. Lukyanov <lav@long.yar.ru>
* [misc/crtdll.c]
Implement xlat_file_ptr for CRT stdin/stdout/stderr address
translation.
Wed Apr 15 20:43:56 1998 Jim Peterson <jspeter@birch.ee.vt.edu>
* [controls/menu.c]
Added 'odaction' parameter to MENU_DrawMenuItem() and redirected
WM_DRAWITEM messages to GetWindow(hwnd,GW_OWNER).
Tue Apr 14 16:17:55 1998 Berend Reitsma <berend@united-info.com>
* [graphics/metafiledrv/init.c] [graphics/painting.c]
[graphics/win16drv/init.c] [graphics/x11drv/graphics.c]
[graphics/x11drv/init.c] [include/gdi.h] [include/x11drv.h]
[relay32/gdi32.spec]
Added PolyPolyline routine.
* [windows/winproc.c]
Changed WINPROC_GetProc() to return proc instead of &(jmp proc).
diff --git a/ANNOUNCE b/ANNOUNCE
index 78ee48c..1e0549f 100644
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,14 +1,14 @@
-This is release 980413 of Wine, the MS Windows emulator. This is still a
+This is release 980503 of Wine, the MS Windows emulator. This is still a
developer's only release. There are many bugs and many unimplemented API
features. Most applications still do not work correctly.
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
forget to include a ChangeLog entry.
-WHAT'S NEW with Wine-980413: (see ChangeLog for details)
- - Flat thunks support.
- - Many more autoconf checks for better portability.
- - DIALOGEX resource support.
+WHAT'S NEW with Wine-980503: (see ChangeLog for details)
+ - Module loading restructuration.
+ - Some rotated text support.
+ - Documentation for many more functions.
- Lots of bug fixes.
See the README file in the distribution for installation instructions.
@@ -17,10 +17,10 @@
the release is available at the ftp sites. The sources will be available
from the following locations:
- ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-980413.tar.gz
- ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-980413.tar.gz
- ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-980413.tar.gz
- ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-980413.tar.gz
+ ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-980503.tar.gz
+ ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-980503.tar.gz
+ ftp://ftp.infomagic.com/pub/mirrors/linux/sunsite/ALPHA/wine/development/Wine-980503.tar.gz
+ ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-980503.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite.
diff --git a/ChangeLog b/ChangeLog
index 6119f63..7f3f722 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,260 @@
----------------------------------------------------------------------
+Thu Apr 30 16:28:12 1998 James Juran <jrj120@psu.edu>
+
+ * [scheduler/process.c]
+ Implemented GetExitCodeProcess. The code is a direct translation
+ of GetExitCodeThread.
+
+Mon Apr 27 22:20:25 1998 Uwe Bonnes <bon@elektron.ikp.physik.tu-darmstadt.de>
+
+ * [loader/pe_image.c]
+ Unload dummy module when PE_LoadLibraryEx32A fails with
+ PE_LoadImage (makes Encarta 98 installer proceed).
+
+ * [files/drive.c]
+ Make GetDriveType16 return DRIVE_REMOVABLE for TYPE_CDROM.
+ Make GetCurrentDirectory32 behave like the code does and not
+ like the help describes.
+
+ * [files/profile.c]
+ Revoke recent change in PROFILE_GetSection and try better
+ handling of special case.
+
+ * [include/windows.h]
+ Change definition of ACCEL32.
+
+ * [misc/commdlg.c]
+ Replace the GetXXXFilename32 macros by normal code.
+ Fix two reported bugs in my changes to commdlg.
+
+ * [windows/win.c]
+ Add a hook to catch bogus WM_SIZE messages by emitting a warning
+ in the appropriate case.
+
+ * [objects/bitmap.c]
+ Reject unreasonbable large size arguments in
+ CreateCompatibleBitmap32 and add an fixme for that situation.
+
+Sun Apr 26 18:30:07 1998 Alexandre Julliard <julliard@lrc.epfl.ch>
+
+ * [include/ldt.h] [debugger/*.c] [miscemu/instr.c]
+ Added IS_SELECTOR_SYSTEM and IS_SELECTOR_32BIT macros.
+ Make instruction emulation support system selectors.
+
+ * [loader/*.c]
+ Started moving NE specific functions to the new loader/ne
+ directory.
+
+ * [memory/environ.c]
+ Enforce the 127 chars limit only when creating the environment of
+ a Win16 process.
+
+Sun Apr 26 12:22:23 1998 Andreas Mohr <100.30936@germany.net>
+
+ * [files/file.c]
+ Fixed an incredible typo in CopyFile32A that made it unusable
+ since a rewrite in 970112 (!!).
+
+ * [files/directory.c]
+ Fixed GetTempPath32A/W to include trailing backslash.
+
+ * [misc/ver.c]
+ Make find_pe_resource "work" with corrupt files.
+
+ * [misc/wsprintf.c]
+ Altered WPRINTF_ParseFormatA/W to treat invalid format chars
+ as normal output, too.
+
+ * [msdos/dpmi.c]
+ Implemented "Allocate/Free real mode callback" (0x0303/0x0304).
+ Cross your fingers if you need to use it ;) (completely untested)
+ Implemented "Call real mode proc with far return" (0x0301, tested).
+
+ * [msdos/int21.c]
+ Fixed ioctlGenericBlkDevReq/0x60.
+
+ * [relay32/dplayx.spec] [relay32/builtin32.c] [relay32/Makefile.in]
+ Added built-in DPLAYX.DLL.
+
+ * [windows/win.c]
+ Fixed GetWindowWord()/GWW_HWNDPARENT to return the window's owner
+ if it has no parent (SDK).
+
+Sat Apr 25 15:09:53 1998 M.T.Fortescue <mark@mtfhpc.demon.co.uk>
+
+ * [debugger/db_disasm.c]
+ Fixed disassemble bug for no-display option and 'lock',
+ 'repne' and 'repe' prefixes.
+
+ * [debugger/registers.c]
+ Added textual flag description output on 'info regs'.
+
+Sat Apr 25 14:18:26 1998 Matthew Becker <mbecker@glasscity.net>
+
+ * [*/*.c]
+ Added stubs and/or documentation for the following functions:
+ LookupPrivilegeValue, OpenService, ControlService, RegGetKeySecurity,
+ StartService, SetComputerName, DeleteService, CloseServiceHandle,
+ OpenProcessToken, OpenSCManager, DeregisterEventSource,
+ WaitForDebugEvent, WaitForInputIdle, RegisterEventSource,
+ SetDebugErrorLevel, SetConsoleCursorPosition, ChoosePixelFormat,
+ SetPixelFormat, GetPixelFormat, DescribePixelFormat, SwapBuffers,
+ PolyBezier, AbortPath, DestroyAcceleratorTable, HeapWalk,
+ DdeInitialize, DdeUninitialize, DdeConnectList, DdeDisconnectList,
+ DdeCreateStringHandle, DdePostAdvise, DdeGetData, DdeNameService,
+ DdeGetLastError, WNetGetDirectoryType, EnumPrinters, RegFlushKey,
+ RegGetKeySecurity, DllGetClassObject, DllCanUnloadNow, CreateBitmap,
+ CreateCompatibleBitmap, CreateBitmapIndirect, GetBitmapBits,
+ SetBitmapBits, LoadImage, CopyImage, LoadBitmap, DrawIcon,
+ CreateDiscardableBitmap, SetDIBits, GetCharABCWidths, LoadTypeLib,
+ SetConsoleCtrlHandler, CreateConsoleScreenBuffer, ReadConsoleInput,
+ GetConsoleCursorInfo, SetConsoleCursorInfo, SetConsoleWindowInfo,
+ SetConsoleTextAttribute, SetConsoleScreenBufferSize,
+ FillConsoleOutputCharacter, FillConsoleOutputAttribute,
+ CreateMailslot, GetMailslotInfo, GetCompressedFileSize,
+ GetProcessWindowStation, GetThreadDesktop, SetDebugErrorLevel,
+ WaitForDebugEvent, SetComputerName, CreateMDIWindow.
+
+Thu Apr 23 23:54:04 1998 Douglas Ridgway <ridgway@winehq.com>
+
+ * [include/windows.h] [objects/enhmetafile.c] [relay32/gdi32.spec]
+ Implement CopyEnhMetaFile, Get/SetEnhMetaFileBits, other fixes.
+
+ * [include/windows.h] [objects/metafile.c] [relay32/gdi32.spec]
+ 32-bit metafile fixes, implement EnumMetaFile32, GetMetaFileBitsEx.
+
+ * [objects/font.c] [graphics/x11drv/xfont.c] [graphics/x11drv/text.c]
+ Some rotated text support for X11R6 displays.
+
+ * [win32/newfns.c] [ole/ole2nls.c]
+ Moved GetNumberFormat32A.
+
+Wed Apr 22 17:38:20 1998 David Lee Lambert <lamber45@egr.msu.edu>
+
+ * [ole/ole2nls.c] [misc/network.c]
+ Changed some function documentation to the new style.
+
+ * [misc/network.c] [include/windows.h] [if1632/user.spec]
+ [relay32/mpr.spec] [misc/mpr.c]
+ Added stubs for some Win32 network functions; renamed some
+ 16-bit ones with 32-bit counterparts, as well as
+ WNetGetDirectoryType; moved the stubs in misc/mpr.c (three of
+ them!) to misc/network.c.
+
+ * [ole/compobj.c] [ole/storage.c] [ole/ole2disp.c]
+ [ole/ole2nls.c] [ole/folders.c] [ole/moniker.c] [ole/ole2.c]
+ [graphics/fontengine.c] [graphics/ddraw.c] [graphics/env.c]
+ [graphics/driver.c] [graphics/escape.c]
+ Changed fprintf's to proper debug-macros.
+
+ * [include/winnls.h]
+ Added some flags (for internal use).
+
+ * [ole/ole2nls.c]
+ Added the Unicode core function, and worked out a way to hide
+ the commonality of the core.
+
+ * [relay32/kernel32.spec]
+ Added support for GetDate/Time32A/W.
+
+Wed Apr 22 09:16:03 1998 Gordon Chaffee <chaffee@cs.berkeley.edu>
+
+ * [win32/code_page.c]
+ Fixed problem with MultiByteToWideChar that was introduced in
+ last release. Made MultiByteToWideChar more compatible with Win32.
+
+ * [graphics/x11drv/graphics.c]
+ Fixed problem with drawing arcs.
+
+Tue Apr 21 11:24:58 1998 Constantine Sapuntzakis <csapuntz@tma-1.lcs.mit.edu>
+
+ * [ole/ole2nls.c]
+ Move stuff from 0x409 case to Lang_En.
+
+ * [relay32/user32.spec] [windows/winpos.c]
+ Added stubs for GetWindowRgn32 and SetWindowRgn32. Makes Office
+ Paperclip happy.
+
+Tue Apr 21 11:16:16 1998 Constantine Sapuntzakis <csapuntz@tma-1.lcs.mit.edu>
+
+ * [loader/pe_image.c]
+ If image is relocated, TLS addresses need to be adjusted.
+
+ * [debugger/*.c]
+ Generalized tests for 32-bit segments.
+
+Tue Apr 21 02:04:59 1998 James Juran <jrj120@psu.edu>
+
+ * [misc/*.c] [miscemu/*.c] [msdos/*.c] [if1632/*.c]
+ [include/*.h] [loader/*.c] [memory/*.c] [multimedia/*.c]
+ [objects/*.c]
+ Almost all fprintf statements converted to appropriate
+ debug messages.
+
+ * [README]
+ Updated "GETTING MORE INFORMATION" section to include WineHQ.
+
+ * [documentation/debugger]
+ Fixed typo.
+
+ * [windows/defwnd.c]
+ Added function documentation.
+
+Sun Apr 19 16:30:58 1998 Marcus Meissner <marcus@mud.de>
+
+ * [Make.rules.in]
+ Added lint target (using lclint).
+
+ * [relay32/oleaut32.spec][relay32/Makefile.in][ole/typelib.c]
+ [ole/ole2disp.c]
+ Added oleaut32 spec, added some SysString functions.
+
+ * [if1632/signal.c]
+ Added printing of faultaddress in Linux (using CR2 debug register).
+
+ * [configure.in]
+ Added <sys/types.h> for statfs checks.
+
+ * [loader/*.c][debugger/break.c][debugger/hash.c]
+ Started to split win32/win16 module handling, preparing support
+ for other binary formats (like ELF).
+
+Sat Apr 18 10:07:41 1998 Rein Klazes <rklazes@casema.net>
+
+ * [misc/registry.c]
+ Fixed a bug that made RegQueryValuexxx returning
+ incorrect registry values.
+
+Fri Apr 17 22:59:22 1998 Alexander V. Lukyanov <lav@long.yar.ru>
+
+ * [misc/lstr.c]
+ FormatMessage32*: remove linefeed when nolinefeed set;
+ check for target underflow.
+
+Fri Apr 17 00:38:14 1998 Alexander V. Lukyanov <lav@long.yar.ru>
+
+ * [misc/crtdll.c]
+ Implement xlat_file_ptr for CRT stdin/stdout/stderr address
+ translation.
+
+Wed Apr 15 20:43:56 1998 Jim Peterson <jspeter@birch.ee.vt.edu>
+
+ * [controls/menu.c]
+ Added 'odaction' parameter to MENU_DrawMenuItem() and redirected
+ WM_DRAWITEM messages to GetWindow(hwnd,GW_OWNER).
+
+Tue Apr 14 16:17:55 1998 Berend Reitsma <berend@united-info.com>
+
+ * [graphics/metafiledrv/init.c] [graphics/painting.c]
+ [graphics/win16drv/init.c] [graphics/x11drv/graphics.c]
+ [graphics/x11drv/init.c] [include/gdi.h] [include/x11drv.h]
+ [relay32/gdi32.spec]
+ Added PolyPolyline routine.
+
+ * [windows/winproc.c]
+ Changed WINPROC_GetProc() to return proc instead of &(jmp proc).
+
+----------------------------------------------------------------------
Sun Apr 12 12:22:23 1997 Andreas Mohr <100.30936@germany.net>
* [files/drive.c]
diff --git a/Make.rules.in b/Make.rules.in
index d8e6e93..76a2f1c 100644
--- a/Make.rules.in
+++ b/Make.rules.in
@@ -37,6 +37,8 @@
RM = rm -f
MKDIR = mkdir
C2MAN = @C2MAN@
+LINT = lclint
+LINTFLAGS = +posixlib +gnuextensions +trytorecover
BUILD = $(TOPOBJDIR)/tools/build@PROGEXT@
MAKEDEP = $(TOPOBJDIR)/tools/makedep@PROGEXT@
WINERC = $(TOPOBJDIR)/rc/winerc@PROGEXT@
@@ -114,6 +116,16 @@
man: $(C_SRCS)
for i in $(C_SRCS); do $(C2MAN) -L -o$(TOPOBJDIR)/documentation/man3w -S3w $(DIVINCL) $$i; done
+# Rule for linting
+
+lint:
+ for i in $(C_SRCS); do $(LINT) $(LINTFLAGS) -D__WINE__ $(OPTIONS) $(DIVINCL) $(X_CFLAGS) $$i; done
+
+# Rule for html pages
+
+html: $(C_SRCS)
+ for i in $(C_SRCS); do $(C2MAN) -L -o$(TOPOBJDIR)/documentation/html -Th -iwindows.h $(DIVINCL) $$i; done
+
# Misc. rules
depend:: $(MAKEDEP) $(C_SRCS) $(RC_SRCS) $(EXTRA_SRCS)
diff --git a/Makefile.in b/Makefile.in
index 003637c..c9548fa 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -34,6 +34,7 @@
ipc \
library \
loader \
+ loader/ne \
memory \
misc \
msdos \
@@ -78,6 +79,7 @@
graphics/x11drv/x11drv.o \
ipc/ipc.o \
loader/loader.o \
+ loader/ne/ne.o \
memory/memory.o \
misc/misc.o \
msdos/msdos.o \
@@ -149,6 +151,10 @@
-$(MKDIR) $(TOPOBJDIR)/documentation/man3w
for i in $(LIBSUBDIRS); do (cd $$i && $(MAKE) man); done
+htmlpages:
+ -$(MKDIR) $(TOPOBJDIR)/documentation/html
+ for i in $(LIBSUBDIRS); do (cd $$i && $(MAKE) html); done
+
clean::
for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) clean) || exit 1; done
for i in include; do (cd $$i; $(RM) *.o \#*\# *~ *.bak *.orig *.rej *.flc); done
diff --git a/README b/README
index dd56ba1..25be8f4 100644
--- a/README
+++ b/README
@@ -83,10 +83,21 @@
5. GETTING MORE INFORMATION
-The best place to get help or to report bugs is the Usenet newsgroup
-comp.emulators.ms-windows.wine. The Wine FAQ is posted there every
-month. Also, you may want to browse old messages on www.dejanews.com
-to check whether your problem is already fixed.
+Usenet: The best place to get help or to report bugs is the Usenet newsgroup
+ comp.emulators.ms-windows.wine. The Wine FAQ is posted there every
+ month.
+
+WWW: Please browse old messages on http://www.dejanews.com to check whether
+ your problem is already fixed before posting a bug report to the
+ newsgroup.
+
+ A great deal of information about Wine is available from WineHQ at
+ http://www.winehq.com. Untested patches against the current
+ release are available at http://www.winehq.com/patches.
+
+
+FAQ: The Wine FAQ is located at http://home.pacbell.net/dagar/wine.html.
+
If you add something, or fix a bug, please send a patch ('diff -u'
format preferred) to julliard@lrc.epfl.ch for inclusion in the next
diff --git a/configure b/configure
index 1d32b1c..8a11a0c 100755
--- a/configure
+++ b/configure
@@ -2820,6 +2820,7 @@
#line 2821 "configure"
#include "confdefs.h"
+ #include <sys/types.h>
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
@@ -2841,7 +2842,7 @@
; return 0; }
EOF
-if { (eval echo configure:2845: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2846: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
wine_cv_statfs_bavail=yes
else
@@ -2865,7 +2866,7 @@
fi
echo $ac_n "checking "for statfs.f_bfree"""... $ac_c" 1>&6
-echo "configure:2869: checking "for statfs.f_bfree"" >&5
+echo "configure:2870: checking "for statfs.f_bfree"" >&5
if eval "test \"`echo '$''{'wine_cv_statfs_bfree'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@@ -2874,9 +2875,10 @@
wine_cv_statfs_bfree=no
else
cat > conftest.$ac_ext <<EOF
-#line 2878 "configure"
+#line 2879 "configure"
#include "confdefs.h"
+ #include <sys/types.h>
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
@@ -2898,7 +2900,7 @@
; return 0; }
EOF
-if { (eval echo configure:2902: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:2904: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
wine_cv_statfs_bfree=yes
else
@@ -3043,6 +3045,7 @@
library/Makefile
libtest/Makefile
loader/Makefile
+loader/ne/Makefile
memory/Makefile
misc/Makefile
miscemu/Makefile
@@ -3172,6 +3175,7 @@
library/Makefile
libtest/Makefile
loader/Makefile
+loader/ne/Makefile
memory/Makefile
misc/Makefile
miscemu/Makefile
diff --git a/configure.in b/configure.in
index 5dba6fa..d783a00 100644
--- a/configure.in
+++ b/configure.in
@@ -227,6 +227,7 @@
wine_cv_statfs_bavail=no
else
AC_TRY_COMPILE([
+ #include <sys/types.h>
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
@@ -257,6 +258,7 @@
wine_cv_statfs_bfree=no
else
AC_TRY_COMPILE([
+ #include <sys/types.h>
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
@@ -303,6 +305,7 @@
library/Makefile
libtest/Makefile
loader/Makefile
+loader/ne/Makefile
memory/Makefile
misc/Makefile
miscemu/Makefile
diff --git a/controls/menu.c b/controls/menu.c
index f9efbf8..3cfe51f 100644
--- a/controls/menu.c
+++ b/controls/menu.c
@@ -817,7 +817,7 @@
* Draw a single menu item.
*/
static void MENU_DrawMenuItem( HWND32 hwnd, HDC32 hdc, MENUITEM *lpitem,
- UINT32 height, BOOL32 menuBar )
+ UINT32 height, BOOL32 menuBar, UINT32 odaction )
{
RECT32 rect;
@@ -843,7 +843,6 @@
{
DRAWITEMSTRUCT32 dis;
- TRACE(menu, "Ownerdraw!\n" );
dis.CtlType = ODT_MENU;
dis.itemID = lpitem->wID;
dis.itemData = (DWORD)lpitem->text;
@@ -851,11 +850,16 @@
if (lpitem->fState & MF_CHECKED) dis.itemState |= ODS_CHECKED;
if (lpitem->fState & MF_GRAYED) dis.itemState |= ODS_GRAYED;
if (lpitem->fState & MF_HILITE) dis.itemState |= ODS_SELECTED;
- dis.itemAction = ODA_DRAWENTIRE | ODA_SELECT | ODA_FOCUS;
+ dis.itemAction = odaction; /* ODA_DRAWENTIRE | ODA_SELECT | ODA_FOCUS; */
dis.hwndItem = hwnd;
dis.hDC = hdc;
dis.rcItem = lpitem->rect;
- SendMessage32A( hwnd, WM_DRAWITEM, 0, (LPARAM)&dis );
+ TRACE(menu, "Ownerdraw: itemID=%d, itemState=%d, itemAction=%d, "
+ "hwndItem=%04x, hdc=%04x, rcItem={%d,%d,%d,%d}, rcItem=%p\n",dis.itemID,
+ dis.itemState, dis.itemAction, dis.hwndItem, dis.hDC,
+ dis.rcItem.left, dis.rcItem.top, dis.rcItem.right,
+ dis.rcItem.bottom, dis.rcItem );
+ SendMessage32A( GetWindow32(hwnd,GW_OWNER), WM_DRAWITEM, 0, (LPARAM)&dis );
return;
}
@@ -1114,7 +1118,8 @@
UINT32 u;
for (u = menu->nItems, item = menu->items; u > 0; u--, item++)
- MENU_DrawMenuItem( hwnd, hdc, item, menu->Height, FALSE );
+ MENU_DrawMenuItem( hwnd, hdc, item, menu->Height, FALSE,
+ ODA_DRAWENTIRE );
}
} else SelectObject32( hdc, hPrevBrush );
@@ -1156,7 +1161,8 @@
if (lppop->nItems == 0) return SYSMETRICS_CYMENU;
for (i = 0; i < lppop->nItems; i++)
{
- MENU_DrawMenuItem( hwnd, hDC, &lppop->items[i], lppop->Height, TRUE );
+ MENU_DrawMenuItem( hwnd, hDC, &lppop->items[i], lppop->Height, TRUE,
+ ODA_DRAWENTIRE );
}
return lppop->Height;
}
@@ -1339,7 +1345,8 @@
{
lppop->items[lppop->FocusedItem].fState &= ~(MF_HILITE|MF_MOUSESELECT);
MENU_DrawMenuItem(lppop->hWnd,hdc,&lppop->items[lppop->FocusedItem],
- lppop->Height, !(lppop->wFlags & MF_POPUP) );
+ lppop->Height, !(lppop->wFlags & MF_POPUP),
+ ODA_SELECT );
}
/* Highlight new item (if any) */
@@ -1348,7 +1355,8 @@
{
lppop->items[lppop->FocusedItem].fState |= MF_HILITE;
MENU_DrawMenuItem( lppop->hWnd, hdc, &lppop->items[lppop->FocusedItem],
- lppop->Height, !(lppop->wFlags & MF_POPUP) );
+ lppop->Height, !(lppop->wFlags & MF_POPUP),
+ ODA_SELECT );
if (sendMenuSelect)
{
MENUITEM *ip = &lppop->items[lppop->FocusedItem];
@@ -1742,7 +1750,7 @@
if (menu->wFlags & MF_POPUP) hdc = GetDC32( menu->hWnd );
else hdc = GetDCEx32( menu->hWnd, 0, DCX_CACHE | DCX_WINDOW);
item->fState |= MF_HILITE;
- MENU_DrawMenuItem( menu->hWnd, hdc, item, menu->Height, !(menu->wFlags & MF_POPUP) );
+ MENU_DrawMenuItem( menu->hWnd, hdc, item, menu->Height, !(menu->wFlags & MF_POPUP), ODA_DRAWENTIRE );
ReleaseDC32( menu->hWnd, hdc );
}
if (!item->rect.top && !item->rect.left && !item->rect.bottom && !item->rect.right)
diff --git a/debugger/break.c b/debugger/break.c
index f584ba9..17e055e 100644
--- a/debugger/break.c
+++ b/debugger/break.c
@@ -339,37 +339,14 @@
NE_MODULE *pModule;
BOOL32 ok;
DBG_ADDR addr = { NULL, 0, 0 };
+ WINE_MODREF *wm;
for (ok = ModuleFirst(&entry); ok; ok = ModuleNext(&entry))
{
- if (!(pModule = MODULE_GetPtr( entry.hModule ))) continue;
+ if (!(pModule = MODULE_GetPtr16( entry.hModule ))) continue;
if (pModule->flags & NE_FFLAGS_LIBMODULE) continue; /* Library */
- if (pModule->flags & NE_FFLAGS_WIN32) /* PE module */
- {
- PE_MODREF *pem = PROCESS_Current()->modref_list;
- if (!pem)
- {
- addr.seg = 0;
- addr.off = (DWORD)RVA_PTR( pModule->module32,
- OptionalHeader.AddressOfEntryPoint);
- }
- else
- {
- while (pem)
- {
- if (pem->module == pModule->module32) break;
- pem = pem->next;
- }
- if (!pem) continue;
- addr.seg = 0;
- addr.off = (DWORD)RVA_PTR( pem->module,
- OptionalHeader.AddressOfEntryPoint);
- }
- fprintf( stderr, "Win32 task '%s': ", entry.szModule );
- DEBUG_AddBreakpoint( &addr );
- }
- else /* NE module */
+ if (!(pModule->flags & NE_FFLAGS_WIN32)) /* NE module */
{
addr.seg = NE_SEG_TABLE(pModule)[pModule->cs-1].selector;
addr.off = pModule->ip;
@@ -377,6 +354,12 @@
DEBUG_AddBreakpoint( &addr );
}
}
+ for (wm=PROCESS_Current()->modref_list;wm;wm=wm->next) {
+ addr.seg = 0;
+ addr.off =(DWORD)RVA_PTR(wm->module,OptionalHeader.AddressOfEntryPoint);
+ fprintf( stderr, "Win32 module '%s': ", wm->modname );
+ DEBUG_AddBreakpoint( &addr );
+ }
DEBUG_SetBreakpoints( TRUE ); /* Setup breakpoints */
}
@@ -394,15 +377,14 @@
DBG_ADDR cond_addr;
int bpnum;
struct list_id list;
- WORD cs;
/* If not single-stepping, back up over the int3 instruction */
if (!(EFL_reg(&DEBUG_context) & STEP_FLAG)) EIP_reg(&DEBUG_context)--;
- GET_CS(cs);
- addr.seg = (CS_reg(&DEBUG_context) == cs) ? 0 : CS_reg(&DEBUG_context);
+ addr.seg = CS_reg(&DEBUG_context);
addr.off = EIP_reg(&DEBUG_context);
-
+ if (IS_SELECTOR_SYSTEM(addr.seg)) addr.seg = 0;
+
bpnum = DEBUG_FindBreakpoint( &addr );
breakpoints[0].enabled = 0; /* disable the step-over breakpoint */
@@ -519,11 +501,10 @@
unsigned int * value;
enum exec_mode ret_mode;
BYTE *instr;
- WORD cs;
- GET_CS(cs);
- addr.seg = (CS_reg(&DEBUG_context) == cs) ? 0 : CS_reg(&DEBUG_context);
+ addr.seg = CS_reg(&DEBUG_context);
addr.off = EIP_reg(&DEBUG_context);
+ if (IS_SELECTOR_SYSTEM(addr.seg)) addr.seg = 0;
/*
* This is the mode we will be running in after we finish. We would like
diff --git a/debugger/db_disasm.c b/debugger/db_disasm.c
index bd8e11f..05686a7 100644
--- a/debugger/db_disasm.c
+++ b/debugger/db_disasm.c
@@ -1009,8 +1009,6 @@
switch(size)
{
case BYTE:
- fprintf(stderr, "0x%2.2x", addr & 0xff );
- break;
case WORD:
fprintf(stderr, "0x%4.4x", addr & 0xffff );
break;
@@ -1162,9 +1160,7 @@
* Set this so we get can supress the printout if we need to.
*/
db_display = display;
-
- if (!addr->seg) db_disasm_16 = FALSE;
- else db_disasm_16 = !(GET_SEL_FLAGS(addr->seg) & LDT_FLAGS_32BIT);
+ db_disasm_16 = !IS_SELECTOR_32BIT(addr->seg);
get_value_inc( inst, addr, 1, FALSE );
@@ -1212,13 +1208,16 @@
seg = "%gs";
break;
case 0xf0:
- fprintf(stderr,"lock ");
+ if( db_display )
+ fprintf(stderr,"lock ");
break;
case 0xf2:
- fprintf(stderr,"repne ");
+ if( db_display )
+ fprintf(stderr,"repne ");
break;
case 0xf3:
- fprintf(stderr,"repe "); /* XXX repe VS rep */
+ if( db_display )
+ fprintf(stderr,"repe "); /* XXX repe VS rep */
break;
default:
prefix = FALSE;
diff --git a/debugger/dbg.y b/debugger/dbg.y
index 7a54e7d..f7963ef 100644
--- a/debugger/dbg.y
+++ b/debugger/dbg.y
@@ -17,6 +17,7 @@
#include "win.h"
#include "winnt.h"
#include "debugger.h"
+#include "neexe.h"
#include "expr.h"
@@ -253,7 +254,7 @@
| tINFO tCLASS expr_value tEOL { CLASS_DumpClass( (CLASS *)$3 );
DEBUG_FreeExprMem(); }
| tINFO tSHARE tEOL { DEBUG_InfoShare(); }
- | tINFO tMODULE expr_value tEOL { MODULE_DumpModule( $3 );
+ | tINFO tMODULE expr_value tEOL { NE_DumpModule( $3 );
DEBUG_FreeExprMem(); }
| tINFO tQUEUE expr_value tEOL { QUEUE_DumpQueue( $3 );
DEBUG_FreeExprMem(); }
@@ -270,7 +271,7 @@
walk_command:
tWALK tCLASS tEOL { CLASS_WalkClasses(); }
- | tWALK tMODULE tEOL { MODULE_WalkModules(); }
+ | tWALK tMODULE tEOL { NE_WalkModules(); }
| tWALK tQUEUE tEOL { QUEUE_WalkQueues(); }
| tWALK tWND tEOL { WIN_WalkWindows( 0, 0 ); }
| tWALK tWND tNUM tEOL { WIN_WalkWindows( $3, 0 ); }
@@ -476,9 +477,7 @@
XUngrabServer( display );
XFlush( display );
- if (!addr.seg) newmode = 32;
- else newmode = (GET_SEL_FLAGS(addr.seg) & LDT_FLAGS_32BIT) ? 32 : 16;
-
+ newmode = IS_SELECTOR_32BIT(addr.seg) ? 32 : 16;
if (newmode != dbg_mode)
fprintf(stderr,"In %d bit mode.\n", dbg_mode = newmode);
diff --git a/debugger/dbgmain.c b/debugger/dbgmain.c
index 04cf7ac..2f47132 100644
--- a/debugger/dbgmain.c
+++ b/debugger/dbgmain.c
@@ -103,12 +103,12 @@
exit(0);
}
-NE_MODULE *MODULE_GetPtr( HMODULE16 hModule )
+NE_MODULE *MODULE_GetPtr16( HMODULE16 hModule )
{
exit(0);
}
-FARPROC16 MODULE_GetEntryPoint( HMODULE16 hModule, WORD ordinal )
+FARPROC16 NE_GetEntryPoint( HMODULE16 hModule, WORD ordinal )
{
exit(0);
}
diff --git a/debugger/hash.c b/debugger/hash.c
index aba001b..492769c 100644
--- a/debugger/hash.c
+++ b/debugger/hash.c
@@ -754,8 +754,7 @@
{
cpnt += *cpnt + 1 + sizeof(WORD);
sprintf( buffer, "%s.%.*s", name, *cpnt, cpnt + 1 );
- if ((address = MODULE_GetEntryPoint( hModule,
- *(WORD *)(cpnt + *cpnt + 1) )))
+ if ((address = NE_GetEntryPoint(hModule, *(WORD *)(cpnt + *cpnt + 1))))
{
addr.seg = HIWORD(address);
addr.off = LOWORD(address);
@@ -772,8 +771,7 @@
{
cpnt += *cpnt + 1 + sizeof(WORD);
sprintf( buffer, "%s.%.*s", name, *cpnt, cpnt + 1 );
- if ((address = MODULE_GetEntryPoint( hModule,
- *(WORD *)(cpnt + *cpnt + 1) )))
+ if ((address = NE_GetEntryPoint(hModule, *(WORD *)(cpnt + *cpnt + 1))))
{
addr.seg = HIWORD(address);
addr.off = LOWORD(address);
@@ -875,17 +873,20 @@
MODULEENTRY entry;
NE_MODULE *pModule;
BOOL32 ok;
+ WINE_MODREF *wm;
for (ok = ModuleFirst(&entry); ok; ok = ModuleNext(&entry))
{
- if (!(pModule = MODULE_GetPtr( entry.hModule ))) continue;
+ if (!(pModule = MODULE_GetPtr16( entry.hModule ))) continue;
fprintf( stderr, " %s", entry.szModule );
- if (pModule->flags & NE_FFLAGS_WIN32) /* PE module */
- DEBUG_LoadEntryPoints32( pModule->module32, entry.szModule );
- else /* NE module */
+ if (!(pModule->flags & NE_FFLAGS_WIN32)) /* NE module */
DEBUG_LoadEntryPoints16( entry.hModule, pModule, entry.szModule );
}
+ for (wm=PROCESS_Current()->modref_list;wm;wm=wm->next) {
+ fprintf( stderr, " %s", wm->modname );
+ DEBUG_LoadEntryPoints32( wm->module, wm->modname );
+ }
}
diff --git a/debugger/registers.c b/debugger/registers.c
index 6ab0bac..b6a8a23 100644
--- a/debugger/registers.c
+++ b/debugger/registers.c
@@ -192,6 +192,59 @@
#endif
}
+/***********************************************************************
+ * DEBUG_Flags
+ *
+ * Return Flag String.
+ */
+char *DEBUG_Flags( DWORD flag, char *buf )
+{
+ char *pt;
+
+ strcpy( buf, " - 00 - - - " );
+ pt = buf + strlen( buf );
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00000001 ) *pt = 'C'; /* Carry Falg */
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00000002 ) *pt = '1';
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00000004 ) *pt = 'P'; /* Parity Flag */
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00000008 ) *pt = '-';
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00000010 ) *pt = 'A'; /* Auxiliary Carry Flag */
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00000020 ) *pt = '-';
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00000040 ) *pt = 'Z'; /* Zero Flag */
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00000080 ) *pt = 'S'; /* Sign Flag */
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00000100 ) *pt = 'T'; /* Trap/Trace Flag */
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00000200 ) *pt = 'I'; /* Interupt Enable Flag */
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00000400 ) *pt = 'D'; /* Direction Indicator */
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00000800 ) *pt = 'O'; /* Overflow Flag */
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00001000 ) *pt = '1'; /* I/O Privilage Level */
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00002000 ) *pt = '1'; /* I/O Privilage Level */
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00004000 ) *pt = 'N'; /* Nested Task Flag */
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00008000 ) *pt = '-';
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00010000 ) *pt = 'R'; /* Resume Flag */
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00020000 ) *pt = 'V'; /* Vritual Mode Flag */
+ if ( buf >= pt-- ) return( buf );
+ if ( flag & 0x00040000 ) *pt = 'a'; /* Alignment Check Flag */
+ if ( buf >= pt-- ) return( buf );
+ return( buf );
+}
+
/***********************************************************************
* DEBUG_InfoRegisters
@@ -200,6 +253,8 @@
*/
void DEBUG_InfoRegisters(void)
{
+ char flag[33];
+
fprintf(stderr,"Register dump:\n");
/* First get the segment registers out of the way */
@@ -209,9 +264,10 @@
(WORD)FS_reg(&DEBUG_context), (WORD)GS_reg(&DEBUG_context) );
if (dbg_mode == 16)
{
- fprintf( stderr,"\n IP:%04x SP:%04x BP:%04x FLAGS:%04x\n",
+ fprintf( stderr,"\n IP:%04x SP:%04x BP:%04x FLAGS:%04x(%s)\n",
IP_reg(&DEBUG_context), SP_reg(&DEBUG_context),
- BP_reg(&DEBUG_context), FL_reg(&DEBUG_context) );
+ BP_reg(&DEBUG_context), FL_reg(&DEBUG_context),
+ DEBUG_Flags(FL_reg(&DEBUG_context), flag));
fprintf( stderr," AX:%04x BX:%04x CX:%04x DX:%04x SI:%04x DI:%04x\n",
AX_reg(&DEBUG_context), BX_reg(&DEBUG_context),
CX_reg(&DEBUG_context), DX_reg(&DEBUG_context),
@@ -219,9 +275,10 @@
}
else /* 32-bit mode */
{
- fprintf( stderr, "\n EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx\n",
+ fprintf( stderr, "\n EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx(%s)\n",
EIP_reg(&DEBUG_context), ESP_reg(&DEBUG_context),
- EBP_reg(&DEBUG_context), EFL_reg(&DEBUG_context) );
+ EBP_reg(&DEBUG_context), EFL_reg(&DEBUG_context),
+ DEBUG_Flags(EFL_reg(&DEBUG_context), flag));
fprintf( stderr, " EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n",
EAX_reg(&DEBUG_context), EBX_reg(&DEBUG_context),
ECX_reg(&DEBUG_context), EDX_reg(&DEBUG_context) );
diff --git a/debugger/source.c b/debugger/source.c
index 1a37195..4d3715b 100644
--- a/debugger/source.c
+++ b/debugger/source.c
@@ -492,10 +492,9 @@
last = DEBUG_LastDisassemble;
if (!last.seg && !last.off)
{
- WORD cs;
- GET_CS(cs);
- last.seg = (CS_reg(&DEBUG_context) == cs) ? 0 : CS_reg(&DEBUG_context);
+ last.seg = CS_reg(&DEBUG_context);
last.off = EIP_reg(&DEBUG_context);
+ if (IS_SELECTOR_SYSTEM(last.seg)) last.seg = 0;
}
for (i=0;i<offset;i++)
if (!_disassemble(&last)) break;
diff --git a/debugger/stack.c b/debugger/stack.c
index 37f6d5a..2fe17c0 100644
--- a/debugger/stack.c
+++ b/debugger/stack.c
@@ -51,24 +51,16 @@
*/
void DEBUG_InfoStack(void)
{
- DBG_ADDR addr;
- WORD ss;
+ DBG_ADDR addr = { NULL, SS_reg(&DEBUG_context), ESP_reg(&DEBUG_context) };
fprintf(stderr,"Stack dump:\n");
- GET_SS(ss);
- if ((SS_reg(&DEBUG_context) == ss) ||
- (GET_SEL_FLAGS(SS_reg(&DEBUG_context)) & LDT_FLAGS_32BIT))
+ if (IS_SELECTOR_32BIT(addr.seg))
{ /* 32-bit mode */
- addr.seg = 0;
- addr.off = ESP_reg(&DEBUG_context);
- addr.type = NULL;
DEBUG_ExamineMemory( &addr, 24, 'x' );
}
else /* 16-bit mode */
{
- addr.seg = SS_reg(&DEBUG_context);
- addr.off = SP_reg(&DEBUG_context);
- addr.type = NULL;
+ addr.off &= 0xffff;
DEBUG_ExamineMemory( &addr, 24, 'w' );
}
fprintf(stderr,"\n");
@@ -84,11 +76,9 @@
{
DBG_ADDR addr;
int frameno = 0;
- WORD ss;
fprintf(stderr,"Backtrace:\n");
- GET_SS(ss);
- if (SS_reg(&DEBUG_context) == ss) /* 32-bit mode */
+ if (IS_SELECTOR_SYSTEM(SS_reg(&DEBUG_context))) /* system stack */
{
nframe = 1;
if (frames) free( frames );
@@ -163,15 +153,13 @@
*/
void DEBUG_SilentBackTrace(void)
{
- WORD ss;
DBG_ADDR addr;
int frameno = 0;
nframe = 1;
if (frames) free( frames );
frames = (struct bt_info *) xmalloc( sizeof(struct bt_info) );
- GET_SS(ss);
- if (SS_reg(&DEBUG_context) == ss) /* 32-bit mode */
+ if (IS_SELECTOR_SYSTEM(SS_reg(&DEBUG_context))) /* system stack */
{
addr.seg = 0;
addr.off = EIP_reg(&DEBUG_context);
diff --git a/documentation/debugging b/documentation/debugging
index 3e2b5a2..6de0cb5 100644
--- a/documentation/debugging
+++ b/documentation/debugging
@@ -119,8 +119,8 @@
Since the failure happens usually directly before setting up the Messagebox
you can start wine with "-debug" added to the commandline, set a breakpoint
at "MessageBox32A" (called by win16 and win32 programs) and proceed with
- "continue". With "-debugmsg +all" Wine will now stop directly directly
- before setting up the Messagebox. Proceed as explained above.
+ "continue". With "-debugmsg +all" Wine will now stop directly before
+ setting up the Messagebox. Proceed as explained above.
You can also run wine using "wine -debugmsg +relay program.exe 2>&1|less -i"
and in less search for messagebox.
diff --git a/documentation/wine.man b/documentation/wine.man
index 7eeb53c..0be4451 100644
--- a/documentation/wine.man
+++ b/documentation/wine.man
@@ -71,9 +71,8 @@
env, event, exec, file, fixup, font, gdi, global, graphics, heap, hook,
icon, int, key, keyboard, ldt, listbox, local, mci, mcianim, mciwave, mdi,
menu, message, metafile, midi, mmio, mmsys, mmtime, module, msg, nonclient,
-ole, palette, profile, prop, reg, region, relay, resource, scroll, selector,
-sem, sendmsg, shm, stress, string, syscolor, task, text, timer, toolhelp,
-ver, vxd, win, win32, winsock.
+ole, palette, profile, prop, reg, region, relay, resource, scroll, segment,
+selector,sem, sendmsg, shm, stress, string, syscolor, task, text, timer, toolhelp,ver, vxd, win, win32, winsock.
.TP
.I -depth n
Change the depth to use for multiple-depth screens
diff --git a/files/directory.c b/files/directory.c
index a780e36..0f211d7 100644
--- a/files/directory.c
+++ b/files/directory.c
@@ -129,7 +129,13 @@
UINT32 ret;
if (!(ret = GetEnvironmentVariable32A( "TMP", path, count )))
if (!(ret = GetEnvironmentVariable32A( "TEMP", path, count )))
- ret = GetCurrentDirectory32A( count, path );
+ if (!(ret = GetCurrentDirectory32A( count, path )))
+ return 0;
+ if ((ret < count - 1) && (path[ret-1] != '\\'))
+ {
+ path[ret++] = '\\';
+ path[ret] = '\0';
+ }
return ret;
}
@@ -144,7 +150,13 @@
UINT32 ret;
if (!(ret = GetEnvironmentVariable32W( tmp, path, count )))
if (!(ret = GetEnvironmentVariable32W( temp, path, count )))
- ret = GetCurrentDirectory32W( count, path );
+ if (!(ret = GetCurrentDirectory32W( count, path )))
+ return 0;
+ if ((ret < count - 1) && (path[ret-1] != '\\'))
+ {
+ path[ret++] = '\\';
+ path[ret] = '\0';
+ }
return ret;
}
diff --git a/files/drive.c b/files/drive.c
index 47b543d..c07d350 100644
--- a/files/drive.c
+++ b/files/drive.c
@@ -745,7 +745,7 @@
{
case TYPE_FLOPPY: return DRIVE_REMOVABLE;
case TYPE_HD: return DRIVE_FIXED;
- case TYPE_CDROM: return DRIVE_REMOTE;
+ case TYPE_CDROM: return DRIVE_REMOVABLE;
case TYPE_NETWORK: return DRIVE_REMOTE;
case TYPE_INVALID:
default: return DRIVE_CANNOTDETERMINE;
@@ -801,16 +801,22 @@
* GetCurrentDirectory32A (KERNEL32.196)
*
* Returns "X:\\path\\etc\\".
+ *
+ * Despite the API description, return required length including the
+ * terminating null when buffer too small. This is the real behaviour.
*/
UINT32 WINAPI GetCurrentDirectory32A( UINT32 buflen, LPSTR buf )
{
- char *pref = "A:\\";
+ UINT32 ret;
const char *s = DRIVE_GetDosCwd( DRIVE_GetCurrentDrive() );
+
assert(s);
- lstrcpyn32A( buf, pref, MIN( 4, buflen ) );
+ ret = strlen(s) + 3; /* length of WHOLE current directory */
+ if (ret >= buflen) return ret + 1;
+ lstrcpyn32A( buf, "A:\\", MIN( 4, buflen ) );
if (buflen) buf[0] += DRIVE_GetCurrentDrive();
if (buflen > 3) lstrcpyn32A( buf + 3, s, buflen - 3 );
- return strlen(s) + 3; /* length of WHOLE current directory */
+ return ret;
}
diff --git a/files/file.c b/files/file.c
index 721f11a..d94b7ff 100644
--- a/files/file.c
+++ b/files/file.c
@@ -632,10 +632,7 @@
if (drive & TF_FORCEDRIVE)
sprintf(temppath,"%c:", drive & ~TF_FORCEDRIVE );
else
- {
GetTempPath32A( 132, temppath );
- strcat( temppath, "\\" );
- }
return (UINT16)GetTempFileName32A( temppath, prefix, unique, buffer );
}
@@ -1611,7 +1608,7 @@
CloseHandle( h1 );
return FALSE;
}
- while ((count = _lread32( h2, buffer, sizeof(buffer) )) > 0)
+ while ((count = _lread32( h1, buffer, sizeof(buffer) )) > 0)
{
char *p = buffer;
while (count > 0)
diff --git a/files/profile.c b/files/profile.c
index 123ab91..037cfb0 100644
--- a/files/profile.c
+++ b/files/profile.c
@@ -477,15 +477,18 @@
PROFILE_CopyEntry( buffer, key->name, len - 1, handle_env );
len -= strlen(buffer) + 1;
buffer += strlen(buffer) + 1;
- if (key->value)
- {
- buffer[-1] = '=';
- PROFILE_CopyEntry(buffer, key->value, len - 1, handle_env);
- len -= strlen(buffer) + 1;
- buffer += strlen(buffer) + 1;
- }
}
*buffer = '\0';
+ if (len < 1)
+ /*If either lpszSection or lpszKey is NULL and the supplied
+ destination buffer is too small to hold all the strings,
+ the last string is truncated and followed by two null characters.
+ In this case, the return value is equal to cchReturnBuffer
+ minus two. */
+ {
+ buffer[-1] = '\0';
+ return oldlen - 2;
+ }
return oldlen - len + 1;
}
section = section->next;
diff --git a/graphics/ddraw.c b/graphics/ddraw.c
index 33c7d1b..92c118f 100644
--- a/graphics/ddraw.c
+++ b/graphics/ddraw.c
@@ -94,7 +94,7 @@
HRESULT WINAPI
DSoundHelp(DWORD x,DWORD y,DWORD z) {
- fprintf(stderr,"DSoundHelp(0x%08lx,0x%08lx,0x%08lx),stub!\n",x,y,z);
+ FIXME(ddraw,"(0x%08lx,0x%08lx,0x%08lx),stub!\n",x,y,z);
return 0;
}
@@ -122,8 +122,12 @@
FE(DDBLTFX_ZBUFFERBASEDEST)
};
for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
- if (flags[i].mask & flagmask)
- fprintf(stderr,"%s ",flags[i].name);
+ if (flags[i].mask & flagmask) {
+ DUMP("%s ",flags[i].name);
+
+ };
+ DUMP("\n");
+
}
static void _dump_DDBLTFAST(DWORD flagmask) {
@@ -140,7 +144,8 @@
};
for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
if (flags[i].mask & flagmask)
- fprintf(stderr,"%s ",flags[i].name);
+ DUMP("%s ",i,flags[i].name);
+ DUMP("\n");
}
static void _dump_DDBLT(DWORD flagmask) {
@@ -179,7 +184,7 @@
};
for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
if (flags[i].mask & flagmask)
- fprintf(stderr,"%s ",flags[i].name);
+ DUMP("%s ",i,flags[i].name);
}
static void _dump_DDSCAPS(DWORD flagmask) {
@@ -222,7 +227,8 @@
};
for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
if (flags[i].mask & flagmask)
- fprintf(stderr,"%s ",flags[i].name);
+ DUMP("%s ",flags[i].name);
+ DUMP("\n");
}
static void _dump_DDCAPS(DWORD flagmask) {
@@ -267,7 +273,8 @@
};
for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
if (flags[i].mask & flagmask)
- fprintf(stderr,"%s ",flags[i].name);
+ DUMP("%s ",flags[i].name);
+ DUMP("\n");
}
static void _dump_DDSD(DWORD flagmask) {
@@ -295,7 +302,8 @@
};
for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
if (flags[i].mask & flagmask)
- fprintf(stderr,"%s ",flags[i].name);
+ DUMP("%s ",i,flags[i].name);
+ DUMP("\n");
}
static int _getpixelformat(LPDIRECTDRAW ddraw,LPDDPIXELFORMAT pf) {
@@ -325,7 +333,7 @@
pf->xy.dwRGBAlphaBitMask= 0;
return 0;
}
- fprintf(stderr,"_getpixelformat:oops?\n");
+ FIXME(ddraw,"_getpixelformat:oops?\n");
return DDERR_GENERIC;
}
@@ -458,15 +466,15 @@
return 0;
}
if (dwFlags) {
- fprintf(stderr,"IDirectDrawSurface(%p)->Blt(%p,%p,%p,%08lx,%p),stub!\n",
+ FIXME(ddraw,"(%p)->(%p,%p,%p,%08lx,%p),stub!\n",
this,rdst,src,rsrc,dwFlags,lpbltfx
);
- if (rdst) fprintf(stderr," destrect :%dx%d-%dx%d\n",rdst->left,rdst->top,rdst->right,rdst->bottom);
- if (rsrc) fprintf(stderr," srcrect :%dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom);
- fprintf(stderr,"\tflags: ");_dump_DDBLT(dwFlags);fprintf(stderr,"\n");
+ if (rdst) TRACE(ddraw," destrect :%dx%d-%dx%d\n",rdst->left,rdst->top,rdst->right,rdst->bottom);
+ if (rsrc) TRACE(ddraw," srcrect :%dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom);
+ TRACE(ddraw,"\tflags: ");_dump_DDBLT(dwFlags);fprintf(stderr,"\n");
}
if (dwFlags & DDBLT_DDFX) {
- fprintf(stderr," blitfx: ");_dump_DDBLTFX(lpbltfx->dwDDFX);fprintf(stderr,"\n");
+ TRACE(ddraw," blitfx: \n");_dump_DDBLTFX(lpbltfx->dwDDFX);
}
return 0;
}
@@ -476,11 +484,11 @@
) {
int i,bpp;
if (TRACE_ON(ddraw)) {
- fprintf(stderr,"IDirectDrawSurface(%p)->BltFast(%ld,%ld,%p,%p,%08lx),stub!\n",
+ FIXME(ddraw,"(%p)->(%ld,%ld,%p,%p,%08lx),stub!\n",
this,dstx,dsty,src,rsrc,trans
);
- fprintf(stderr," trans:");_dump_DDBLTFAST(trans);fprintf(stderr,"\n");
- fprintf(stderr," srcrect: %dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom);
+ TRACE(ddraw," trans:");_dump_DDBLTFAST(trans);fprintf(stderr,"\n");
+ TRACE(ddraw," srcrect: %dx%d-%dx%d\n",rsrc->left,rsrc->top,rsrc->right,rsrc->bottom);
}
bpp = this->s.ddraw->d.depth/8;
for (i=0;i<rsrc->bottom-rsrc->top;i++) {
@@ -495,7 +503,7 @@
static HRESULT WINAPI IDirectDrawSurface_BltBatch(
LPDIRECTDRAWSURFACE this,LPDDBLTBATCH ddbltbatch,DWORD x,DWORD y
) {
- fprintf(stderr,"IDirectDrawSurface(%p)->BltBatch(%p,%08lx,%08lx),stub!\n",
+ TRACE(ddraw,"(%p)->BltBatch(%p,%08lx,%08lx),stub!\n",
this,ddbltbatch,x,y
);
return 0;
@@ -560,12 +568,11 @@
TRACE(ddraw, "(%p)->GetAttachedSurface(%p,%p)\n",
this, lpddsd, lpdsf);
if (TRACE_ON(ddraw)) {
- fprintf(stderr," caps ");
+ TRACE(ddraw," caps ");
_dump_DDSCAPS(lpddsd->dwCaps);
- fprintf(stderr,"\n");
}
if (!(lpddsd->dwCaps & DDSCAPS_BACKBUFFER)) {
- fprintf(stderr,"IDirectDrawSurface::GetAttachedSurface():whoops, can only handle backbuffers for now\n");
+ FIXME(ddraw,"whoops, can only handle backbuffers for now\n");
return E_FAIL;
}
/* FIXME: should handle more than one backbuffer */
@@ -586,7 +593,7 @@
}
static HRESULT WINAPI IDirectDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE this,DWORD dwFlags) {
- fprintf(stderr,"IDirectDrawSurface(%p)->GetBltStatus(0x%08lx),stub!\n",
+ FIXME(ddraw,"(%p)->(0x%08lx),stub!\n",
this,dwFlags
);
return 0;
@@ -595,7 +602,7 @@
static HRESULT WINAPI IDirectDrawSurface_GetOverlayPosition(
LPDIRECTDRAWSURFACE this,LPLONG x1,LPLONG x2
) {
- fprintf(stderr,"IDirectDrawSurface(%p)->GetOverlayPosition(%p,%p),stub!\n",
+ FIXME(ddraw,"(%p)->(%p,%p),stub!\n",
this,x1,x2
);
return 0;
@@ -604,20 +611,20 @@
static HRESULT WINAPI IDirectDrawSurface_SetClipper(
LPDIRECTDRAWSURFACE this,LPDIRECTDRAWCLIPPER clipper
) {
- fprintf(stderr,"IDirectDrawSurface(%p)->SetClipper(%p),stub!\n",this,clipper);
+ FIXME(ddraw,"(%p)->(%p),stub!\n",this,clipper);
return 0;
}
static HRESULT WINAPI IDirectDrawSurface_AddAttachedSurface(
LPDIRECTDRAWSURFACE this,LPDIRECTDRAWSURFACE surf
) {
- fprintf(stderr,"IDirectDrawSurface(%p)->AddAttachedSurface(%p),stub!\n",this,surf);
+ FIXME(ddraw,"(%p)->(%p),stub!\n",this,surf);
this->s.backbuffer = surf;
return 0;
}
static HRESULT WINAPI IDirectDrawSurface_GetDC(LPDIRECTDRAWSURFACE this,HDC32* lphdc) {
- fprintf(stderr,"IDirectDrawSurface(%p)->GetDC(%p),stub!\n",this,lphdc);
+ FIXME(ddraw,"(%p)->GetDC(%p),stub!\n",this,lphdc);
return 0;
}
@@ -625,7 +632,7 @@
char xrefiid[50];
WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
- TRACE(ddraw,"(%p)->QueryInterface(%s,%p)\n",this,xrefiid,obj);
+ TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
/* thats version 3 (DirectX 5) */
if ( !memcmp(&IID_IDirectDrawSurface3,refiid,sizeof(IID_IDirectDrawSurface3))) {
@@ -647,7 +654,7 @@
*obj = this;
return 0;
}
- fprintf(stderr,"IDirectDrawSurface(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
+ WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
return OLE_E_ENUM_NOMORE;
}
@@ -738,7 +745,7 @@
}
static HRESULT WINAPI IDirectDrawSurface2_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE2 this,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) {
- fprintf(stderr,"IDirectDrawSurface(%p)->EnumAttachedSurfaces(%p,%p),stub!\n",this,context,esfcb);
+ FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,context,esfcb);
return 0;
}
@@ -876,7 +883,7 @@
}
static HRESULT WINAPI IDirectDrawSurface3_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE3 this,LPVOID context,LPDDENUMSURFACESCALLBACK esfcb) {
- fprintf(stderr,"IDirectDrawSurface3(%p)->EnumAttachedSurfaces(%p,%p),stub!\n",this,context,esfcb);
+ FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,context,esfcb);
return 0;
}
@@ -942,7 +949,7 @@
static HRESULT WINAPI IDirectDrawClipper_SetHwnd(
LPDIRECTDRAWCLIPPER this,DWORD x,HWND32 hwnd
) {
- fprintf(stderr,"IDirectDrawClipper(%p)->SetHwnd(0x%08lx,0x%08lx),stub!\n",this,x,(DWORD)hwnd);
+ FIXME(ddraw,"(%p)->SetHwnd(0x%08lx,0x%08lx),stub!\n",this,x,(DWORD)hwnd);
return 0;
}
@@ -974,7 +981,7 @@
) {
int i;
- fprintf(stderr,"IDirectDrawPalette(%p)->GetEntries(%08lx,%ld,%ld,%p),stub!\n",
+ FIXME(ddraw,"(%p)->GetEntries(%08lx,%ld,%ld,%p),stub!\n",
this,x,start,end,palent
);
for (i=start;i<end;i++) {
@@ -995,7 +1002,7 @@
this,x,start,end,palent
);
if (!this->cm) /* should not happen */ {
- fprintf(stderr,"no colormap in SetEntries???\n");
+ ERR(ddraw,"no colormap in SetEntries???\n");
return DDERR_GENERIC;
}
/* FIXME: free colorcells instead of freeing whole map */
@@ -1093,7 +1100,7 @@
) {
D3DDEVICEDESC d1,d2;
- fprintf(stderr,"IDirect3D2(%p)->EnumDevices(%p,%p),stub!\n",this,cb,context);
+ FIXME(ddraw,"(%p)->(%p,%p),stub!\n",this,cb,context);
d1.dwSize = sizeof(d1);
d1.dwFlags = 0;
@@ -1123,10 +1130,10 @@
) {
int i;
- TRACE(ddraw, "(%p)->CreateSurface(%p,%p,%p)\n",
+ TRACE(ddraw, "(%p)->(%p,%p,%p)\n",
this,lpddsd,lpdsf,lpunk);
if (TRACE_ON(ddraw)) {
- fprintf(stderr,"[w=%ld,h=%ld,flags ",lpddsd->dwWidth,lpddsd->dwHeight);
+ DUMP("[w=%ld,h=%ld,flags ",lpddsd->dwWidth,lpddsd->dwHeight);
_dump_DDSD(lpddsd->dwFlags);
fprintf(stderr,"caps ");
_dump_DDSCAPS(lpddsd->ddsCaps.dwCaps);
@@ -1170,7 +1177,7 @@
LPDIRECTDRAWSURFACE back;
if (lpddsd->dwBackBufferCount>1)
- fprintf(stderr,"urks, wants to have more than one backbuffer (%ld)!\n",lpddsd->dwBackBufferCount);
+ FIXME(ddraw,"urks, wants to have more than one backbuffer (%ld)!\n",lpddsd->dwBackBufferCount);
(*lpdsf)->s.backbuffer = back = (LPDIRECTDRAWSURFACE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawSurface));
this->lpvtbl->fnAddRef(this);
@@ -1198,7 +1205,7 @@
static HRESULT WINAPI IDirectDraw_DuplicateSurface(
LPDIRECTDRAW this,LPDIRECTDRAWSURFACE src,LPDIRECTDRAWSURFACE *dst
) {
- fprintf(stderr,"(%p)->DuplicateSurface(%p,%p)\n",this,src,dst);
+ FIXME(ddraw,"(%p)->(%p,%p) simply copies\n",this,src,dst);
*dst = src; /* FIXME */
return 0;
}
@@ -1222,7 +1229,7 @@
FE(DDSCL_CREATEDEVICEWINDOW)
};
- TRACE(ddraw,"(%p)->SetCooperativeLevel(%08lx,%08lx)\n",
+ TRACE(ddraw,"(%p)->(%08lx,%08lx)\n",
this,(DWORD)hwnd,cooplevel
);
if(TRACE_ON(ddraw)){
@@ -1243,7 +1250,7 @@
int i,*depths,depcount;
char buf[200];
- TRACE(ddraw, "(%p)->SetDisplayMode(%ld,%ld,%ld)\n",
+ TRACE(ddraw, "(%p)->(%ld,%ld,%ld)\n",
this, width, height, depth);
depths = TSXListDepths(display,DefaultScreen(display),&depcount);
@@ -1252,13 +1259,11 @@
break;
TSXFree(depths);
if (i==depcount) {/* not found */
- sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), unsupported depth!",width,height,depth);
- MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
+ ERR(ddraw,"(w=%ld,h=%ld,d=%ld), unsupported depth!\n",width,height,depth);
return DDERR_UNSUPPORTEDMODE;
}
if (this->d.fb_width < width) {
- sprintf(buf,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld",width,height,depth,width,this->d.fb_width);
- MessageBox32A(0,buf,"WINE DirectDraw",MB_OK|MB_ICONSTOP);
+ ERR(ddraw,"SetDisplayMode(w=%ld,h=%ld,d=%ld), width %ld exceeds framebuffer width %ld\n",width,height,depth,width,this->d.fb_width);
return DDERR_UNSUPPORTEDMODE;
}
this->d.width = width;
@@ -1286,7 +1291,7 @@
static HRESULT WINAPI IDirectDraw_GetCaps(
LPDIRECTDRAW this,LPDDCAPS caps1,LPDDCAPS caps2
) {
- TRACE(ddraw,"(%p)->GetCaps(%p,%p)\n",this,caps1,caps2);
+ TRACE(ddraw,"(%p)->(%p,%p)\n",this,caps1,caps2);
caps1->dwVidMemTotal = this->d.fb_memsize;
caps1->dwCaps = 0xffffffff&~(DDCAPS_BANKSWITCHED); /* we can do anything */
caps1->ddsCaps.dwCaps = 0xffffffff; /* we can do anything */
@@ -1301,7 +1306,7 @@
static HRESULT WINAPI IDirectDraw_CreateClipper(
LPDIRECTDRAW this,DWORD x,LPDIRECTDRAWCLIPPER *lpddclip,LPUNKNOWN lpunk
) {
- fprintf(stderr,"(%p)->CreateClipper(%08lx,%p,%p),stub!\n",
+ FIXME(ddraw,"(%p)->(%08lx,%p,%p),stub!\n",
this,x,lpddclip,lpunk
);
*lpddclip = (LPDIRECTDRAWCLIPPER)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawClipper));
@@ -1313,7 +1318,7 @@
static HRESULT WINAPI IDirectDraw_CreatePalette(
LPDIRECTDRAW this,DWORD x,LPPALETTEENTRY palent,LPDIRECTDRAWPALETTE *lpddpal,LPUNKNOWN lpunk
) {
- TRACE(ddraw,"(%p)->CreatePalette(%08lx,%p,%p,%p)\n",
+ TRACE(ddraw,"(%p)->(%08lx,%p,%p,%p)\n",
this,x,palent,lpddpal,lpunk
);
*lpddpal = (LPDIRECTDRAWPALETTE)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectDrawPalette));
@@ -1329,7 +1334,7 @@
}
static HRESULT WINAPI IDirectDraw_RestoreDisplayMode(LPDIRECTDRAW this) {
- TRACE(ddraw, "(%p)->RestoreDisplayMode()\n",
+ TRACE(ddraw, "(%p)->()\n",
this);
Sleep(1000);
XF86DGADirectVideo(display,DefaultScreen(display),0);
@@ -1343,7 +1348,7 @@
static HRESULT WINAPI IDirectDraw_WaitForVerticalBlank(
LPDIRECTDRAW this,DWORD x,HANDLE32 h
) {
- TRACE(ddraw,"(%p)->WaitForVerticalBlank(0x%08lx,0x%08x)\n",this,x,h);
+ TRACE(ddraw,"(%p)->(0x%08lx,0x%08x)\n",this,x,h);
return 0;
}
@@ -1369,7 +1374,7 @@
char xrefiid[50];
WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
- TRACE(ddraw,"(%p)->QueryInterface(%s,%p)\n",this,xrefiid,obj);
+ TRACE(ddraw,"(%p)->(%s,%p)\n",this,xrefiid,obj);
if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) {
*obj = this;
this->lpvtbl->fnAddRef(this);
@@ -1408,14 +1413,14 @@
*obj = d3d;
return 0;
}
- fprintf(stderr,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
+ WARN(ddraw,"(%p):interface for IID %s _NOT_ found!\n",this,xrefiid);
return OLE_E_ENUM_NOMORE;
}
static HRESULT WINAPI IDirectDraw_GetVerticalBlankStatus(
LPDIRECTDRAW this,BOOL32 *status
) {
- TRACE(ddraw,"(%p)->GetVerticalBlankSatus(%p)\n",this,status);
+ TRACE(ddraw,"(%p)->(%p)\n",this,status);
*status = TRUE;
return 0;
}
@@ -1425,7 +1430,7 @@
) {
DDSURFACEDESC ddsfd;
- TRACE(ddraw,"(%p)->EnumDisplayModes(0x%08lx,%p,%p,%p)\n",this,dwFlags,lpddsfd,context,modescb);
+ TRACE(ddraw,"(%p)->(0x%08lx,%p,%p,%p)\n",this,dwFlags,lpddsfd,context,modescb);
_getpixelformat(this,&(ddsfd.ddpfPixelFormat));
@@ -1460,7 +1465,7 @@
static HRESULT WINAPI IDirectDraw_GetDisplayMode(
LPDIRECTDRAW this,LPDDSURFACEDESC lpddsfd
) {
- TRACE(ddraw,"(%p)->GetDisplayMode(%p)\n",this,lpddsfd);
+ TRACE(ddraw,"(%p)->(%p)\n",this,lpddsfd);
lpddsfd->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_BACKBUFFERCOUNT|DDSD_PIXELFORMAT|DDSD_CAPS;
lpddsfd->dwHeight = screenHeight;
lpddsfd->dwWidth = screenWidth;
@@ -1473,14 +1478,14 @@
}
static HRESULT WINAPI IDirectDraw_FlipToGDISurface(LPDIRECTDRAW this) {
- fprintf(stderr,"(%p)->FlipToGDISurface()\n",this);
+ TRACE(ddraw,"(%p)->()\n",this);
return DD_OK;
}
static HRESULT WINAPI IDirectDraw_GetMonitorFrequency(
LPDIRECTDRAW this,LPDWORD freq
) {
- fprintf(stderr,"(%p)->GetMonitorFrequency(%p)\n",this,freq);
+ FIXME(ddraw,"(%p)->(%p) returns 60 Hz always\n",this,freq);
*freq = 60*100; /* 60 Hz */
return 0;
}
@@ -1563,7 +1568,7 @@
static HRESULT WINAPI IDirectDraw2_SetDisplayMode(
LPDIRECTDRAW2 this,DWORD width,DWORD height,DWORD depth,DWORD xx,DWORD yy
) {
- TRACE(ddraw,"IDirectDraw2(%p)->SetDisplayMode(%ld,%ld,%ld,%08lx,%08lx)\n",
+ TRACE(ddraw,"(%p)->(%ld,%ld,%ld,%08lx,%08lx)\n",
this, width, height, depth, xx, yy);
return IDirectDraw_SetDisplayMode((LPDIRECTDRAW)this,width,height,depth);
@@ -1576,7 +1581,7 @@
static HRESULT WINAPI IDirectDraw2_EnumSurfaces(
LPDIRECTDRAW2 this,DWORD x,LPDDSURFACEDESC ddsfd,LPVOID context,LPDDENUMSURFACESCALLBACK ddsfcb
) {
- fprintf(stderr,"IDirectDraw2(%p)->EnumSurfaces(0x%08lx,%p,%p,%p),stub!\n",this,x,ddsfd,context,ddsfcb);
+ FIXME(ddraw,"(%p)->(0x%08lx,%p,%p,%p),stub!\n",this,x,ddsfd,context,ddsfcb);
return 0;
}
@@ -1595,7 +1600,7 @@
static HRESULT WINAPI IDirectDraw2_GetAvailableVidMem(
LPDIRECTDRAW2 this,LPDDSCAPS ddscaps,LPDWORD total,LPDWORD free
) {
- fprintf(stderr,"IDirectDraw2(%p)->GetAvailableVidMem(%p,%p,%p)\n",
+ TRACE(ddraw,"(%p)->(%p,%p,%p)\n",
this,ddscaps,total,free
);
if (total) *total = this->d.fb_memsize * 1024;
@@ -1666,6 +1671,7 @@
TRACE(ddraw,"(%s,%p,%p)\n",xclsid,lplpDD,pUnkOuter);
if (getuid()) {
+ MSG("Must be root to use XF86DGA!\n");
MessageBox32A(0,"Using the XF86DGA extension requires the program to be run using UID 0.","WINE DirectDraw",MB_OK|MB_ICONSTOP);
return E_UNEXPECTED;
}
@@ -1673,14 +1679,14 @@
(*lplpDD)->lpvtbl = &ddvt;
(*lplpDD)->ref = 1;
if (!XF86DGAQueryExtension(display,&evbase,&evret)) {
- fprintf(stderr,"No XF86DGA detected.\n");
+ MSG("Wine DirectDraw: No XF86DGA detected.\n");
return 0;
}
XF86DGAQueryVersion(display,&major,&minor);
TRACE(ddraw,"XF86DGA is version %d.%d\n",major,minor);
XF86DGAQueryDirectVideo(display,DefaultScreen(display),&flags);
if (!(flags & XF86DGADirectPresent))
- fprintf(stderr,"direct video is NOT ENABLED.\n");
+ MSG("direct video is NOT ENABLED.\n");
XF86DGAGetVideo(display,DefaultScreen(display),&addr,&width,&banksize,&memsize);
TRACE(ddraw,"video framebuffer: begin %p, width %d,banksize %d,memsize %d\n",
addr,width,banksize,memsize
diff --git a/graphics/driver.c b/graphics/driver.c
index e26b2c3..7c09b2b 100644
--- a/graphics/driver.c
+++ b/graphics/driver.c
@@ -7,6 +7,7 @@
#include <stdio.h>
#include "gdi.h"
#include "heap.h"
+#include "debug.h"
typedef struct tagGRAPHICS_DRIVER
{
@@ -36,7 +37,7 @@
/* No name -> it's the generic driver */
if (genericDriver)
{
- fprintf( stderr, "DRIVER_RegisterDriver: already a generic driver\n" );
+ WARN(driver, " already a generic driver\n" );
HeapFree( SystemHeap, 0, driver );
return FALSE;
}
diff --git a/graphics/env.c b/graphics/env.c
index 13aa37f..a004ee8 100644
--- a/graphics/env.c
+++ b/graphics/env.c
@@ -5,18 +5,18 @@
*
* Copyright 1997 Marcus Meissner
*/
+#include <windows.h>
#include <stdio.h>
-#include "windows.h"
-#include "gdi.h"
-#include "debug.h"
+#include <config.h>
+#include <gdi.h>
+#include <debug.h>
/***********************************************************************
* GetEnvironment (GDI.134)
*/
INT16 WINAPI GetEnvironment(LPCSTR lpPortName, LPDEVMODE16 lpdev, UINT16 nMaxSiz)
{
- fprintf(stddeb, "GetEnvironment('%s','%p',%d),\n",
- lpPortName, lpdev, nMaxSiz);
+ FIXME(gdi, "('%s','%p',%d),stub\n", lpPortName, lpdev, nMaxSiz);
return 0;
}
@@ -25,9 +25,9 @@
*/
INT16 WINAPI SetEnvironment(LPCSTR lpPortName, LPDEVMODE16 lpdev, UINT16 nCount)
{
- fprintf(stddeb, "SetEnvironment('%s', '%p', %d) !\n",
- lpPortName, lpdev, nCount);
- fprintf(stderr,
+
+ FIXME(gdi, "('%s', '%p', %d) stub!\n", lpPortName, lpdev, nCount);
+ if (TRACE_ON(gdi)) DUMP(
"\tdevmode:\n"
"\tname = %s\n"
"\tdmSpecVersion = %d\n"
diff --git a/graphics/escape.c b/graphics/escape.c
index cd3873c..c7bac2c 100644
--- a/graphics/escape.c
+++ b/graphics/escape.c
@@ -10,6 +10,8 @@
#include "heap.h"
#include "ldt.h"
#include "dc.h"
+#include <debug.h>
+
INT16 WINAPI Escape16( HDC16 hdc, INT16 nEscape, INT16 cbInput,
SEGPTR lpszInData, SEGPTR lpvOutData )
@@ -77,7 +79,7 @@
switch(nEscape) {
case QUERYESCSUPPORT:
if (ret)
- fprintf(stderr,"target DC implements Escape %d\n",nEscape);
+ TRACE(driver,"target DC implements Escape %d\n",nEscape);
SEGPTR_FREE(PTR_SEG_TO_LIN(segin));
break;
case GETSCALINGFACTOR:
@@ -115,7 +117,7 @@
}
INT32 WINAPI ExtEscape32(HDC32 hdc,INT32 nEscape,INT32 cbInput,LPCSTR x,INT32 cbOutput,LPSTR out) {
- fprintf(stderr,"ExtEscape32(0x%04x,0x%x,%d,%s,%d,%p),stub!\n",
+ FIXME(driver,"(0x%04x,0x%x,%d,%s,%d,%p),stub!\n",
hdc,nEscape,cbInput,x,cbOutput,out
);
return 1;
diff --git a/graphics/fontengine.c b/graphics/fontengine.c
index f261b13..0a65297 100644
--- a/graphics/fontengine.c
+++ b/graphics/fontengine.c
@@ -2,28 +2,38 @@
* True Type font engine support
*
* Copyright 1996 John Harvey
+ * Copyright 1998 David Lee Lambert
+ *
*/
+#include "windows.h"
#include <stdio.h>
#include <stdlib.h>
-#include "windows.h"
+#include <debug.h>
#include "font.h"
-/* GDI 300 */
-WORD WINAPI EngineEnumerateFont(LPSTR fontname, FARPROC16 proc, DWORD data )
+
+
+/* ****************************************************************
+ * EngineEnumerateFont [GDI.300]
+ */
+WORD WINAPI
+EngineEnumerateFont(LPSTR fontname, FARPROC16 proc, DWORD data )
{
- fprintf(stderr,"EngineEnumerateFont(%s,%p,%lx),stub\n",fontname,proc,data);
+ FIXME(font,"(%s,%p,%lx),stub\n",fontname,proc,data);
return 0;
}
-/* GDI 301 */
+/* ****************************************************************
+ * EngineDeleteFont [GDI.301]
+ */
WORD WINAPI EngineDeleteFont(LPFONTINFO16 lpFontInfo)
{
WORD handle;
/* untested, don't know if it works.
We seem to access some structure that is located after the
- FONTINFO. The FONTINFO docu says that there may follow some char-width
- table or font bitmap or vector info.
+ FONTINFO. The FONTINFO documentation says that there may
+ follow some char-width table or font bitmap or vector info.
I think it is some kind of font bitmap that begins at offset 0x52,
as FONTINFO goes up to 0x51.
If this is correct, everything should be implemented correctly.
@@ -39,46 +49,63 @@
return 1;
}
-/* GDI 302 */
+/* ****************************************************************
+ * EngineRealizeFont [GDI.302]
+ */
WORD WINAPI EngineRealizeFont(LPLOGFONT16 lplogFont, LPTEXTXFORM16 lptextxform, LPFONTINFO16 lpfontInfo)
{
- fprintf(stderr,"EngineRealizeFont(%p,%p,%p),stub\n",lplogFont,lptextxform,lpfontInfo);
+ FIXME(font,"(%p,%p,%p),stub\n",lplogFont,lptextxform,lpfontInfo);
return 0;
}
-/* GDI 303 */
+/* ****************************************************************
+ * EngineGetCharWidth [GDI.303]
+ */
WORD WINAPI EngineGetCharWidth(LPFONTINFO16 lpFontInfo, BYTE firstChar, BYTE lastChar, LPINT16 buffer)
{
int i;
for (i = firstChar; i <= lastChar; i++)
+ FIXME(font, " returns font's average width for range %d to %d\n", firstChar, lastChar);
*buffer++ = lpFontInfo->dfAvgWidth; /* insert some charwidth functionality here; use average width for now */
return 1;
}
-/* GDI 304 */
+/* ****************************************************************
+ * EngineSetFontContext [GDI.304]
+ */
WORD WINAPI EngineSetFontContext(LPFONTINFO16 lpFontInfo, WORD data)
{
+ FIXME(font, "stub?\n");
return 0;
}
-/* GDI 305 */
+/* ****************************************************************
+ * EngineGetGlyphBMP [GDI.305]
+ */
WORD WINAPI EngineGetGlyphBMP(WORD word, LPFONTINFO16 lpFontInfo, WORD w1, WORD w2, LPSTR string, DWORD dword, /*LPBITMAPMETRICS16*/ LPVOID metrics)
{
+ FIXME(font, "stub?\n");
return 0;
}
-/* GDI 306 */
+/* ****************************************************************
+ * EngineMakeFontDir [GDI.306]
+ */
DWORD WINAPI EngineMakeFontDir(HDC16 hdc, LPFONTDIR16 fontdir, LPCSTR string)
{
+ FIXME(font, " stub! (always fails)\n");
return -1; /* error */
}
-/* GDI 314 */
+/* ****************************************************************
+ * EngineExtTextOut [GDI.314]
+ */
WORD WINAPI EngineExtTextOut()
{
+ FIXME(font, "stub!\n");
return 0;
}
diff --git a/graphics/metafiledrv/init.c b/graphics/metafiledrv/init.c
index c26b066..77ecba5 100644
--- a/graphics/metafiledrv/init.c
+++ b/graphics/metafiledrv/init.c
@@ -43,6 +43,7 @@
MFDRV_PatBlt, /* pPatBlt */
MFDRV_Pie, /* pPie */
MFDRV_PolyPolygon, /* pPolyPolygon */
+ NULL, /* pPolyPolyline */
MFDRV_Polygon, /* pPolygon */
MFDRV_Polyline, /* pPolyline */
NULL, /* pRealizePalette */
diff --git a/graphics/painting.c b/graphics/painting.c
index b343023..a142c91 100644
--- a/graphics/painting.c
+++ b/graphics/painting.c
@@ -368,7 +368,7 @@
}
/***********************************************************************
- * SetPixel32 (GDI32.329)
+ * SetPixelV32 (GDI32.329)
*/
BOOL32 WINAPI SetPixelV32( HDC32 hdc, INT32 x, INT32 y, COLORREF color )
{
@@ -407,6 +407,104 @@
}
+/******************************************************************************
+ * ChoosePixelFormat [GDI32.13]
+ * Matches a pixel format to given format
+ *
+ * PARAMS
+ * hdc [I] Device context to search for best pixel match
+ * ppfd [I] Pixel format for which a match is sought
+ *
+ * RETURNS
+ * Success: Pixel format index closest to given format
+ * Failure: 0
+ */
+INT32 WINAPI ChoosePixelFormat( HDC32 hdc, PIXELFORMATDESCRIPTOR *ppfd )
+{
+ FIXME(gdi, "(%d,%p): stub\n",hdc,ppfd);
+ ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
+ ppfd->nVersion = 1;
+ return 1;
+}
+
+
+/******************************************************************************
+ * SetPixelFormat [GDI32.328]
+ * Sets pixel format of device context
+ *
+ * PARAMS
+ * hdc [I] Device context to search for best pixel match
+ * iPixelFormat [I] Pixel format index
+ * ppfd [I] Pixel format for which a match is sought
+ *
+ * RETURNS STD
+ */
+BOOL32 WINAPI SetPixelFormat( HDC32 hdc, int iPixelFormat,
+ PIXELFORMATDESCRIPTOR * ppfd)
+{
+ FIXME(gdi, "(%d,%d,%p): stub\n",hdc,iPixelFormat,ppfd);
+ return TRUE;
+}
+
+
+/******************************************************************************
+ * GetPixelFormat [GDI32.212]
+ * Gets index of pixel format of DC
+ *
+ * PARAMETERS
+ * hdc [I] Device context whose pixel format index is sought
+ *
+ * RETURNS
+ * Success: Currently selected pixel format
+ * Failure: 0
+ */
+int WINAPI GetPixelFormat( HDC32 hdc )
+{
+ FIXME(gdi, "(%d): stub\n",hdc);
+ return 1;
+}
+
+
+/******************************************************************************
+ * DescribePixelFormat [GDI32.71]
+ * Gets info about pixel format from DC
+ *
+ * PARAMS
+ * hdc [I] Device context
+ * iPixelFormat [I] Pixel format selector
+ * nBytes [I] Size of buffer
+ * ppfd [O] Pointer to structure to receive pixel format data
+ *
+ * RETURNS
+ * Success: Maximum pixel format index of the device context
+ * Failure: 0
+ */
+int WINAPI DescribePixelFormat( HDC32 hdc, int iPixelFormat, UINT32 nBytes,
+ LPPIXELFORMATDESCRIPTOR ppfd )
+{
+ FIXME(gdi, "(%d,%d,%d,%p): stub\n",hdc,iPixelFormat,nBytes,ppfd);
+ ppfd->nSize = nBytes;
+ ppfd->nVersion = 1;
+ return 3;
+}
+
+
+/******************************************************************************
+ * SwapBuffers [GDI32.354]
+ * Exchanges front and back buffers of window
+ *
+ * PARAMS
+ * hdc [I] Device context whose buffers get swapped
+ *
+ * RETURNS STD
+ */
+BOOL32 WINAPI SwapBuffers( HDC32 hdc )
+{
+ FIXME(gdi, "(%d): stub\n",hdc);
+ return TRUE;
+}
+
+
/***********************************************************************
* PaintRgn16 (GDI.43)
*/
@@ -648,6 +746,18 @@
}
/**********************************************************************
+ * PolyPolyline32 (GDI32.272)
+ */
+BOOL32 WINAPI PolyPolyline32( HDC32 hdc, LPPOINT32 pt, LPINT32 counts,
+ UINT32 polylines )
+{
+ DC * dc = DC_GetDCPtr( hdc );
+
+ return dc && dc->funcs->pPolyPolyline &&
+ dc->funcs->pPolyPolyline(dc,pt,counts,polylines);
+}
+
+/**********************************************************************
* ExtFloodFill16 (GDI.372)
*/
BOOL16 WINAPI ExtFloodFill16( HDC16 hdc, INT16 x, INT16 y, COLORREF color,
@@ -935,3 +1045,31 @@
{
return PAINTING_DrawState32(hdc, hbr, (DRAWSTATEPROC32)func, ldata, wdata, x, y, cx, cy, flags, FALSE, FALSE);
}
+
+
+/******************************************************************************
+ * PolyBezier16 [GDI.502]
+ */
+BOOL16 WINAPI PolyBezier16( HDC16 hDc, LPPOINT16 lppt, INT16 cPoints )
+{
+ FIXME(gdi, "(%x,%p,%d): stub\n",hDc,lppt,cPoints);
+ return TRUE;
+}
+
+/******************************************************************************
+ * PolyBezier32 [GDI32.268]
+ * Draws one or more Bezier curves
+ *
+ * PARAMS
+ * hDc [I] Handle to device context
+ * lppt [I] Pointer to endpoints and control points
+ * cPoints [I] Count of endpoints and control points
+ *
+ * RETURNS STD
+ */
+BOOL32 WINAPI PolyBezier32( HDC32 hDc, LPPOINT32 lppt, DWORD cPoints )
+{
+ FIXME(gdi, "(%x,%p,%ld): stub\n",hDc,lppt,cPoints);
+ return TRUE;
+}
+
diff --git a/graphics/path.c b/graphics/path.c
index 09dbc5f..a795af8 100644
--- a/graphics/path.c
+++ b/graphics/path.c
@@ -157,11 +157,19 @@
}
-/***********************************************************************
- * AbortPath32 (GDI32.1)
+/******************************************************************************
+ * AbortPath32 [GDI32.1]
+ * Closes and discards paths from device context
+ *
+ * NOTES
+ * Check that SetLastError is being called correctly
+ *
+ * PARAMS
+ * hdc [I] Handle to device context
+ *
+ * RETURNS STD
*/
-BOOL32 WINAPI AbortPath32(HDC32 hdc)
-/* FIXME: Check that SetLastError is being called correctly */
+BOOL32 WINAPI AbortPath32( HDC32 hdc )
{
GdiPath *pPath;
diff --git a/graphics/win16drv/font.c b/graphics/win16drv/font.c
index f735eff..7ed9f71 100644
--- a/graphics/win16drv/font.c
+++ b/graphics/win16drv/font.c
@@ -181,8 +181,7 @@
WEPFC wepfc = {proc, lp};
/* EnumDFontCallback is GDI.158 */
- FARPROC16 pfnCallback = MODULE_GetEntryPoint( GetModuleHandle16("GDI"),
- 158 );
+ FARPROC16 pfnCallback = NE_GetEntryPoint( GetModuleHandle16("GDI"), 158 );
wRet = PRTDRV_EnumDFonts(physDev->segptrPDEVICE, plf->lfFaceName[0] ?
plf->lfFaceName : NULL , pfnCallback , &wepfc );
diff --git a/graphics/win16drv/init.c b/graphics/win16drv/init.c
index 4440d81..2b85707 100644
--- a/graphics/win16drv/init.c
+++ b/graphics/win16drv/init.c
@@ -76,6 +76,7 @@
WIN16DRV_PatBlt, /* pPatBlt */
NULL, /* pPie */
NULL, /* pPolyPolygon */
+ NULL, /* pPolyPolyline */
WIN16DRV_Polygon, /* pPolygon */
WIN16DRV_Polyline, /* pPolyline */
NULL, /* pRealizePalette */
diff --git a/graphics/x11drv/graphics.c b/graphics/x11drv/graphics.c
index ba8ec8a..8442320 100644
--- a/graphics/x11drv/graphics.c
+++ b/graphics/x11drv/graphics.c
@@ -90,6 +90,7 @@
ystart = YLPTODP( dc, ystart );
xend = XLPTODP( dc, xend );
yend = YLPTODP( dc, yend );
+
if ((left == right) || (top == bottom)) return FALSE;
if (left > right) { tmp=left; left=right; right=tmp; }
@@ -113,11 +114,7 @@
end_angle = - PI;
istart_angle = (INT32)(start_angle * 180 * 64 / PI);
idiff_angle = (INT32)((end_angle - start_angle) * 180 * 64 / PI );
- if (idiff_angle < 0)
- {
- istart_angle+= idiff_angle;
- idiff_angle = abs(idiff_angle);
- }
+ if (idiff_angle <= 0) idiff_angle += 360 * 64;
/* Fill arc with brush if Chord() or Pie() */
@@ -583,6 +580,38 @@
/**********************************************************************
+ * X11DRV_PolyPolyline
+ */
+BOOL32
+X11DRV_PolyPolyline( DC *dc, LPPOINT32 pt, LPINT32 counts, UINT32 polylines )
+{
+ if (DC_SetupGCForPen ( dc ))
+ {
+ int i, j, max = 0;
+ XPoint *points;
+
+ for (i = 0; i < polylines; i++) if (counts[i] > max) max = counts[i];
+ points = (XPoint *) xmalloc( sizeof(XPoint) * (max+1) );
+
+ for (i = 0; i < polylines; i++)
+ {
+ for (j = 0; j < counts[i]; j++)
+ {
+ points[j].x = dc->w.DCOrgX + XLPTODP( dc, pt->x );
+ points[j].y = dc->w.DCOrgY + YLPTODP( dc, pt->y );
+ pt++;
+ }
+ points[j] = points[0];
+ TSXDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
+ points, j + 1, CoordModeOrigin );
+ }
+ free( points );
+ }
+ return TRUE;
+}
+
+
+/**********************************************************************
* X11DRV_InternalFloodFill
*
* Internal helper function for flood fill.
diff --git a/graphics/x11drv/init.c b/graphics/x11drv/init.c
index 2193fb9..d5f11aa 100644
--- a/graphics/x11drv/init.c
+++ b/graphics/x11drv/init.c
@@ -47,6 +47,7 @@
X11DRV_PatBlt, /* pPatBlt */
X11DRV_Pie, /* pPie */
X11DRV_PolyPolygon, /* pPolyPolygon */
+ X11DRV_PolyPolyline, /* pPolyPolyline */
X11DRV_Polygon, /* pPolygon */
X11DRV_Polyline, /* pPolyline */
NULL, /* pRealizePalette */
diff --git a/graphics/x11drv/text.c b/graphics/x11drv/text.c
index f4a243c..ea8c361 100644
--- a/graphics/x11drv/text.c
+++ b/graphics/x11drv/text.c
@@ -8,6 +8,7 @@
#include "ts_xlib.h"
#include <X11/Xatom.h>
#include "windows.h"
+#include <math.h>
#include "dc.h"
#include "gdi.h"
/*#include "callback.h"*/
@@ -17,7 +18,7 @@
#include "debug.h"
#define SWAP_INT(a,b) { int t = a; a = b; b = t; }
-
+#define IROUND(x) (int)((x)>0? (x)+0.5 : (x) - 0.5)
/***********************************************************************
* X11DRV_ExtTextOut
@@ -186,8 +187,35 @@
TSXSetForeground( display, dc->u.x.gc, dc->w.textPixel );
if (!dc->w.charExtra && !dc->w.breakExtra && !lpDx)
{
+ if (!pfo->lf.lfOrientation) /* angled baseline? */
+ {
TSXDrawString( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + x, dc->w.DCOrgY + y, str, count );
+ }
+ else
+ {
+ /* have to render character by character. */
+ double offset = 0.0;
+ int i;
+ /* tenths of degrees to radians */
+ double theta = M_PI*pfo->lf.lfOrientation/1800.;
+ /* components of pointsize matrix */
+ double xc = pfo->fi->lfd_decipoints*cos(theta)/10.;
+ double yc = pfo->fi->lfd_decipoints*sin(theta)/10.;
+
+ for(i=0; i<count; i++) {
+ int char_metric_offset = (unsigned char) str[i]
+ - font->min_char_or_byte2;
+ int x_i = IROUND((double) (dc->w.DCOrgX + x) + offset*xc/1000. );
+ int y_i = IROUND((double) (dc->w.DCOrgY + y) - offset*yc/1000. );
+
+ TSXDrawString( display, dc->u.x.drawable, dc->u.x.gc,
+ x_i, y_i, &str[i], 1);
+ offset += (double) (font->per_char ?
+ font->per_char[char_metric_offset].attributes:
+ font->min_bounds.attributes);
+ }
+ }
}
else /* Now the fun begins... */
{
diff --git a/graphics/x11drv/xfont.c b/graphics/x11drv/xfont.c
index 58093b0..505f444 100644
--- a/graphics/x11drv/xfont.c
+++ b/graphics/x11drv/xfont.c
@@ -18,6 +18,7 @@
#include <fcntl.h>
#include "ts_xlib.h"
#include <X11/Xatom.h>
+#include <math.h>
#include "heap.h"
#include "options.h"
#include "x11font.h"
@@ -383,6 +384,7 @@
return TRUE;
}
+
/*************************************************************************
* LFD_ComposeLFD
*/
@@ -392,6 +394,7 @@
int h, w, ch, enc_ch, point = 0;
char* lpch;
const char* lpEncoding = NULL;
+ char h_string[64], point_string[64];
lstrcpy32A( lpLFD, fo->fr->resource );
@@ -448,6 +451,23 @@
if( fo->fi->fi_flags & FI_SCALABLE ) /* adjust h/w ratio */
point = h * 72 * 10 / fo->fi->lfd_resolution;
+ /* handle rotated fonts */
+ if (fo->lf.lfEscapement) {
+ /* escapement is in tenths of degrees, theta is in radians */
+ double theta = M_PI*fo->lf.lfEscapement/1800.;
+ double h_matrix[4] = {h*cos(theta), h*sin(theta), -h*sin(theta), h*cos(theta)};
+ double point_matrix[4] = {point*cos(theta), point*sin(theta), -point*sin(theta), point*cos(theta)};
+ char *s;
+ sprintf(h_string, "[%+f%+f%+f%+f]", h_matrix[0], h_matrix[1], h_matrix[2], h_matrix[3]);
+ sprintf(point_string, "[%+f%+f%+f%+f]", point_matrix[0], point_matrix[1], point_matrix[2], point_matrix[3]);
+ while (s = strchr(h_string, '-')) *s='~';
+ while (s = strchr(point_string, '-')) *s='~';
+ } else {
+ sprintf(h_string, "%d", h);
+ sprintf(point_string, "%d", point);
+ }
+
+
/* spacing and width */
if( fo->fi->fi_flags & FI_FIXEDPITCH )
@@ -496,20 +516,21 @@
case 0:
if( point )
{
- sprintf( lpch, "%i-%i-%i-%c-%c-*-%s%c", h, point,
+ sprintf( lpch, "%s-%s-%i-%c-%c-*-%s%c", h_string,
+ point_string,
fo->fi->lfd_resolution, ch, w, lpEncoding, enc_ch );
break;
}
/* fall through */
case 1:
- sprintf( lpch, "%i-*-%i-%c-%c-*-%s%c", h,
+ sprintf( lpch, "%s-*-%i-%c-%c-*-%s%c", h_string,
fo->fi->lfd_resolution, ch, w, lpEncoding, enc_ch );
break;
case 2:
- sprintf( lpch, "%i-*-%i-%c-*-*-%s%c",
- h, fo->fi->lfd_resolution, ch, lpEncoding, enc_ch );
+ sprintf( lpch, "%s-*-%i-%c-*-*-%s%c",
+ h_string, fo->fi->lfd_resolution, ch, lpEncoding, enc_ch );
break;
case 3:
diff --git a/if1632/builtin.c b/if1632/builtin.c
index a0f2d2f..c06d91c 100644
--- a/if1632/builtin.c
+++ b/if1632/builtin.c
@@ -170,7 +170,7 @@
if (pModule->heap_size)
LocalInit( pSegTable->selector, pSegTable->minsize, minsize );
- MODULE_RegisterModule( pModule );
+ NE_RegisterModule( pModule );
return hModule;
}
@@ -197,27 +197,42 @@
/* Set the USER and GDI heap selectors */
- pModule = MODULE_GetPtr( GetModuleHandle16( "USER" ));
+ pModule = MODULE_GetPtr16( GetModuleHandle16( "USER" ));
USER_HeapSel = (NE_SEG_TABLE( pModule ) + pModule->dgroup - 1)->selector;
- pModule = MODULE_GetPtr( GetModuleHandle16( "GDI" ));
+ pModule = MODULE_GetPtr16( GetModuleHandle16( "GDI" ));
GDI_HeapSel = (NE_SEG_TABLE( pModule ) + pModule->dgroup - 1)->selector;
/* Initialize KERNEL.178 (__WINFLAGS) with the correct flags value */
hModule = GetModuleHandle16( "KERNEL" );
- MODULE_SetEntryPoint( hModule, 178, GetWinFlags() );
+ NE_SetEntryPoint( hModule, 178, GetWinFlags() );
/* Initialize the real-mode selector entry points */
- DOSMEM_InitExports( hModule );
+#define SET_ENTRY_POINT( num, addr ) \
+ NE_SetEntryPoint( hModule, (num), GLOBAL_CreateBlock( GMEM_FIXED, \
+ DOSMEM_MapDosToLinear(addr), 0x10000, hModule, \
+ FALSE, FALSE, FALSE, NULL ))
+
+ SET_ENTRY_POINT( 183, 0x00000 ); /* KERNEL.183: __0000H */
+ SET_ENTRY_POINT( 174, 0xa0000 ); /* KERNEL.174: __A000H */
+ SET_ENTRY_POINT( 181, 0xb0000 ); /* KERNEL.181: __B000H */
+ SET_ENTRY_POINT( 182, 0xb8000 ); /* KERNEL.182: __B800H */
+ SET_ENTRY_POINT( 195, 0xc0000 ); /* KERNEL.195: __C000H */
+ SET_ENTRY_POINT( 179, 0xd0000 ); /* KERNEL.179: __D000H */
+ SET_ENTRY_POINT( 190, 0xe0000 ); /* KERNEL.190: __E000H */
+ SET_ENTRY_POINT( 173, 0xf0000 ); /* KERNEL.173: __ROMBIOS */
+ SET_ENTRY_POINT( 194, 0xf0000 ); /* KERNEL.194: __F000H */
+ NE_SetEntryPoint( hModule, 193, DOSMEM_BiosSeg ); /* KERNEL.193: __0040H */
+#undef SET_ENTRY_POINT
/* Set interrupt vectors from entry points in WPROCS.DLL */
hModule = GetModuleHandle16( "WPROCS" );
for (vector = 0; vector < 256; vector++)
{
- FARPROC16 proc = MODULE_GetEntryPoint( hModule,
- FIRST_INTERRUPT_ORDINAL+vector);
+ FARPROC16 proc = NE_GetEntryPoint( hModule,
+ FIRST_INTERRUPT_ORDINAL + vector );
assert(proc);
INT_SetHandler( vector, proc );
}
@@ -266,7 +281,7 @@
register BYTE *p;
NE_MODULE *pModule;
- if (!(pModule = MODULE_GetPtr( FarGetOwner( GlobalHandle16(cs) ))))
+ if (!(pModule = MODULE_GetPtr16( FarGetOwner( GlobalHandle16(cs) ))))
return NULL;
/* Search for the ordinal */
@@ -299,7 +314,7 @@
}
break;
case 0xff: /* moveable (should not happen in built-in modules) */
- fprintf( stderr, "Built-in module has moveable entry\n" );
+ TRACE( relay, "Built-in module has moveable entry\n" );
ordinal += *p;
p += 2 + *p * 6;
break;
@@ -396,14 +411,14 @@
int i;
BUILTIN16_DLL *dll;
- fprintf(stderr,"Example: -dll -ole2 Do not use emulated OLE2.DLL\n");
- fprintf(stderr,"Available Win16 DLLs:\n");
+ MSG("Example: -dll -ole2 Do not use emulated OLE2.DLL\n");
+ MSG("Available Win16 DLLs:\n");
for (i = 0, dll = BuiltinDLLs; dll->descr; dll++)
{
if (!(dll->flags & DLL_FLAG_ALWAYS_USED))
- fprintf( stderr, "%-9s%c", dll->descr->name,
+ MSG("%-9s%c", dll->descr->name,
((++i) % 8) ? ' ' : '\n' );
}
- fprintf(stderr,"\n");
+ MSG("\n");
BUILTIN32_PrintDLLs();
}
diff --git a/if1632/commdlg.spec b/if1632/commdlg.spec
index aec5ffd..01c97ae 100644
--- a/if1632/commdlg.spec
+++ b/if1632/commdlg.spec
@@ -12,10 +12,10 @@
12 pascal16 ReplaceText(segptr) ReplaceText16
13 pascal FindTextDlgProc(word word word long) FindTextDlgProc16
14 pascal ReplaceTextDlgProc(word word word long) ReplaceTextDlgProc16
-15 pascal16 ChooseFont(ptr) ChooseFont
-16 pascal16 FormatCharDlgProc(word word word long) FormatCharDlgProc
-18 pascal16 FontStyleEnumProc(ptr ptr word long) FontStyleEnumProc
-19 pascal16 FontFamilyEnumProc(ptr ptr word long) FontFamilyEnumProc
+15 pascal16 ChooseFont(ptr) ChooseFont16
+16 pascal16 FormatCharDlgProc(word word word long) FormatCharDlgProc16
+18 pascal16 FontStyleEnumProc(ptr ptr word long) FontStyleEnumProc16
+19 pascal16 FontFamilyEnumProc(ptr ptr word long) FontFamilyEnumProc16
20 pascal16 PrintDlg(segptr) PrintDlg16
21 pascal PrintDlgProc(word word word long) PrintDlgProc
22 pascal PrintSetupDlgProc(word word word long) PrintSetupDlgProc
diff --git a/if1632/ddeml.spec b/if1632/ddeml.spec
index 991d20c..30498d1 100644
--- a/if1632/ddeml.spec
+++ b/if1632/ddeml.spec
@@ -3,9 +3,9 @@
2 pascal16 DdeInitialize(ptr segptr long long) DdeInitialize16
3 pascal16 DdeUninitialize(long) DdeUninitialize16
-4 pascal DdeConnectList(long word word word ptr) DdeConnectList
+4 pascal DdeConnectList(long word word word ptr) DdeConnectList16
5 pascal DdeQueryNextServer(word word) DdeQueryNextServer
-6 pascal DdeDisconnectList(word) DdeDisconnectList
+6 pascal DdeDisconnectList(word) DdeDisconnectList16
7 pascal DdeConnect(long long long ptr) DdeConnect16
8 pascal16 DdeDisconnect(long) DdeDisconnect16
9 stub DdeQueryConvInfo #(word long ptr) DdeQueryConvInfo
@@ -13,10 +13,10 @@
11 pascal DdeClientTransaction(ptr long long long s_word s_word long ptr)
DdeClientTransaction16
12 pascal DdeAbandonTransaction(long word long) DdeAbandonTransaction
-13 pascal DdePostAdvise(long word word) DdePostAdvise
+13 pascal DdePostAdvise(long word word) DdePostAdvise16
14 pascal DdeCreateDataHandle(long ptr long long word word word) DdeCreateDataHandle
15 pascal DdeAddData(word ptr long long) DdeAddData
-16 pascal DdeGetData(word ptr long long) DdeGetData
+16 pascal DdeGetData(word ptr long long) DdeGetData16
17 pascal DdeAccessData(word ptr) DdeAccessData
18 pascal DdeUnaccessData(word) DdeUnaccessData
19 pascal16 DdeFreeDataHandle(long) DdeFreeDataHandle16
diff --git a/if1632/dummy.c b/if1632/dummy.c
index 7babcac..4c67b5d 100644
--- a/if1632/dummy.c
+++ b/if1632/dummy.c
@@ -1,51 +1,57 @@
+/*
+ * Dummy function definitions
+ */
+
#include <stdio.h>
#include "wintypes.h"
-long WINAPI stub_GDI_379(void) { fprintf(stderr, "Warning: GDI_379:STARTPAGE unimplemented stub\n"); return 1; }
-long WINAPI stub_GDI_380(void) { fprintf(stderr, "Warning: GDI_380:ENDPAGE unimplemented stub\n"); return 1; }
-long WINAPI stub_GDI_381(HDC16 hdc, SEGPTR proc) { fprintf(stderr, "Warning: GDI_381:SETABORTPROC unimplemented stub\n"); return 1; }
-long WINAPI stub_GDI_382(void) { fprintf(stderr, "Warning: GDI_382:ABORTPROC unimplemented stub\n"); return 1; }
-long WINAPI stub_GDI_530(void) { fprintf(stderr, "Warning: GDI_530: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_531(void) { fprintf(stderr, "Warning: GDI_531: unimplemented stub\n"); return 0; }
+#include "debug.h"
+
+long WINAPI stub_GDI_379(void) { FIXME(relay, "STARTPAGE: stub\n"); return 1; }
+long WINAPI stub_GDI_380(void) { FIXME(relay, "ENDPAGE: stub\n"); return 1; }
+long WINAPI stub_GDI_381(HDC16 hdc, SEGPTR proc) { FIXME(relay, "SETABORTPROC: stub\n"); return 1; }
+long WINAPI stub_GDI_382(void) { FIXME(relay, "ABORTPROC: stub\n"); return 1; }
+long WINAPI stub_GDI_530(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_531(void) { FIXME(relay, "stub\n"); return 0; }
long WINAPI stub_GDI_532(LPINT16 buffer, INT16 xx) {
- fprintf(stderr, "STUB GDI_532(%p, %hd)\n",buffer,xx);
+ FIXME(relay, "(%p, %hd): stub\n",buffer,xx);
return 0;
}
-long WINAPI stub_GDI_536(void) { fprintf(stderr, "Warning: GDI_536: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_538(void) { fprintf(stderr, "Warning: GDI_538: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_540(void) { fprintf(stderr, "Warning: GDI_540: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_543(void) { fprintf(stderr, "Warning: GDI_543: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_555(void) { fprintf(stderr, "Warning: GDI_555: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_560(void) { fprintf(stderr, "Warning: GDI_560: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_561(void) { fprintf(stderr, "Warning: GDI_561: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_564(void) { fprintf(stderr, "Warning: GDI_564: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_565(void) { fprintf(stderr, "Warning: GDI_565: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_566(void) { fprintf(stderr, "Warning: GDI_566: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_571(void) { fprintf(stderr, "Warning: GDI_571: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_572(void) { fprintf(stderr, "Warning: GDI_572: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_573(void) { fprintf(stderr, "Warning: GDI_573: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_556(void) { fprintf(stderr, "Warning: GDI_556: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_558(void) { fprintf(stderr, "Warning: GDI_558: unimplemented stub\n"); return 0; }
-long WINAPI stub_GDI_569(void) { fprintf(stderr, "Warning: GDI_569: unimplemented stub\n"); return 0; }
-long WINAPI stub_KERNEL_450(void) { fprintf(stderr, "Warning: KERNEL_450: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_489(void) { fprintf(stderr, "Warning: USER_489: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_490(void) { fprintf(stderr, "Warning: USER_490: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_492(void) { fprintf(stderr, "Warning: USER_492: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_496(void) { fprintf(stderr, "Warning: USER_496: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_902(void) { fprintf(stderr, "Warning: USER_902: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_905(void) { fprintf(stderr, "Warning: USER_905: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_906(void) { fprintf(stderr, "Warning: USER_906: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_907(void) { fprintf(stderr, "Warning: USER_907: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_909(void) { fprintf(stderr, "Warning: USER_909: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_910(void) { fprintf(stderr, "Warning: USER_910: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_911(void) { fprintf(stderr, "Warning: USER_911: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_912(void) { fprintf(stderr, "Warning: USER_912: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_913(void) { fprintf(stderr, "Warning: USER_913: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_914(void) { fprintf(stderr, "Warning: USER_914: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_915(void) { fprintf(stderr, "Warning: USER_915: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_916(void) { fprintf(stderr, "Warning: USER_916: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_918(void) { fprintf(stderr, "Warning: USER_918: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_919(void) { fprintf(stderr, "Warning: USER_919: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_920(void) { fprintf(stderr, "Warning: USER_920: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_922(void) { fprintf(stderr, "Warning: USER_922: unimplemented stub\n"); return 0; }
-long WINAPI stub_USER_923(void) { fprintf(stderr, "Warning: USER_923: unimplemented stub\n"); return 0; }
-long WINAPI stub_KERNEL_700(void) { fprintf(stderr, "Warning: KERNEL_700: unimplemented stub\n"); return 1; }
+long WINAPI stub_GDI_536(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_538(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_540(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_543(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_555(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_560(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_561(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_564(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_565(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_566(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_571(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_572(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_573(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_556(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_558(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_GDI_569(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_KERNEL_450(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_489(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_490(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_492(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_496(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_902(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_905(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_906(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_907(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_909(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_910(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_911(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_912(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_913(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_914(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_915(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_916(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_918(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_919(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_920(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_922(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_USER_923(void) { FIXME(relay, "stub\n"); return 0; }
+long WINAPI stub_KERNEL_700(void) { FIXME(relay, "stub\n"); return 1; }
diff --git a/if1632/gdi.spec b/if1632/gdi.spec
index 02bbbef..34cef32 100644
--- a/if1632/gdi.spec
+++ b/if1632/gdi.spec
@@ -326,7 +326,7 @@
498 stub GetEnhMetafileDescription
499 stub GetEnhMetafileHeader
501 stub GetEnhMetafilePaletteEntries
-502 stub PolyBezier
+502 pascal16 PolyBezier(word ptr word) PolyBezier16
503 stub PolyBezierTo
504 stub PlayEnhMetafileRecord
505 stub SetEnhMetafileBits
diff --git a/if1632/kernel.spec b/if1632/kernel.spec
index 3e4ab9d..8a82169 100644
--- a/if1632/kernel.spec
+++ b/if1632/kernel.spec
@@ -63,7 +63,7 @@
63 pascal16 FreeResource(word) FreeResource16
64 pascal16 AccessResource(word word) AccessResource16
65 pascal SizeofResource(word word) SizeofResource16
-66 pascal16 AllocResource(word word long) AllocResource16
+66 pascal16 AllocResource(word word long) AllocResource
67 pascal SetResourceHandler(word segstr segptr) THUNK_SetResourceHandler
68 pascal16 InitAtomTable(word) InitAtomTable16
69 pascal16 FindAtom(segstr) FindAtom16
diff --git a/if1632/ole2disp.spec b/if1632/ole2disp.spec
index 3c36c9e..dce0c29 100644
--- a/if1632/ole2disp.spec
+++ b/if1632/ole2disp.spec
@@ -2,12 +2,12 @@
type win16
1 stub DLLGETCLASSOBJECT
-2 pascal SysAllocString(str) SysAllocString
-3 pascal SysReallocString(ptr str) SysReAllocString
-4 pascal SysAllocStringLen(str word) SysAllocStringLen
-5 pascal SysReAllocStringLen(ptr str word) SysReAllocStringLen
-6 pascal SysFreeString(segstr) SysFreeString
-7 pascal SysStringLen(segstr) SysStringLen
+2 pascal SysAllocString(str) SysAllocString16
+3 pascal SysReallocString(ptr str) SysReAllocString16
+4 pascal SysAllocStringLen(str word) SysAllocStringLen16
+5 pascal SysReAllocStringLen(ptr str word) SysReAllocStringLen16
+6 pascal SysFreeString(segstr) SysFreeString16
+7 pascal SysStringLen(segstr) SysStringLen16
8 stub VARIANTINIT
9 stub VARIANTCLEAR
10 stub VARIANTCOPY
diff --git a/if1632/relay.c b/if1632/relay.c
index 6a40aef..1999d76 100644
--- a/if1632/relay.c
+++ b/if1632/relay.c
@@ -16,11 +16,6 @@
#include "debugstr.h"
#include "debug.h"
-#if 0
-/* Make make_debug think these were really used */
-TRACE(relay, "test - dummy");
-#endif
-
/***********************************************************************
* RELAY_Init
@@ -228,7 +223,7 @@
{
WORD ordinal;
STACK16FRAME *frame = CURRENT_STACK16;
- fprintf(stderr,"No handler for Win16 routine %s (called from %04x:%04x)\n",
+ MSG("No handler for Win16 routine %s (called from %04x:%04x)\n",
BUILTIN_GetEntryPoint16(frame->entry_cs,frame->entry_ip,&ordinal),
frame->cs, frame->ip );
TASK_KillCurrentTask(1);
@@ -366,22 +361,21 @@
IP_reg(context) = lpbuf[0];
CS_reg(context) = lpbuf[1];
- SP_reg(context) = lpbuf[2] + 4 * sizeof(WORD) + sizeof(WORD) /*extra arg*/;
+ SP_reg(context) = lpbuf[2] + 4 * sizeof(WORD) - sizeof(WORD) /*extra arg*/;
BP_reg(context) = lpbuf[3];
SI_reg(context) = lpbuf[4];
DI_reg(context) = lpbuf[5];
DS_reg(context) = lpbuf[6];
if (lpbuf[8] != SS_reg(context))
- fprintf( stderr, "Switching stack segment with Throw() not supported; expect crash now\n" );
+ ERR(relay, "Switching stack segment with Throw() not supported; expect crash now\n" );
if (TRACE_ON(relay)) /* Make sure we have a valid entry point address */
{
static FARPROC16 entryPoint = NULL;
if (!entryPoint) /* Get entry point for Throw() */
- entryPoint = MODULE_GetEntryPoint( GetModuleHandle16("KERNEL"),
- 56 );
+ entryPoint = NE_GetEntryPoint( GetModuleHandle16("KERNEL"), 56 );
pFrame->entry_cs = SELECTOROF(entryPoint);
pFrame->entry_ip = OFFSETOF(entryPoint);
}
@@ -452,7 +446,7 @@
break;
default:
/* FIXME: should go up to 32 arguments */
- fprintf(stderr,"CallProc32W: unsupported number of arguments %ld, please report.\n",nrofargs);
+ ERR(relay,"Unsupported number of arguments %ld, please report.\n",nrofargs);
ret = 0;
break;
}
diff --git a/if1632/signal.c b/if1632/signal.c
index 431565a..e07d41a 100644
--- a/if1632/signal.c
+++ b/if1632/signal.c
@@ -22,6 +22,7 @@
#include "sig_context.h"
#include "miscemu.h"
#include "thread.h"
+#include "debug.h"
extern void SIGNAL_SetHandler( int sig, void (*func)(), int flags );
@@ -61,20 +62,21 @@
*/
static HANDLER_DEF(SIGNAL_fault)
{
- WORD cs;
- GET_CS(cs);
HANDLER_INIT();
- if (CS_sig(HANDLER_CONTEXT) == cs)
+ if (INSTR_EmulateInstruction( HANDLER_CONTEXT )) return;
+ if (IS_SELECTOR_SYSTEM(CS_sig(HANDLER_CONTEXT)))
{
- fprintf( stderr, "Segmentation fault in 32-bit code (0x%08lx).\n",
- EIP_sig(HANDLER_CONTEXT) );
+ MSG("Segmentation fault in 32-bit code (0x%08lx).\n",
+ EIP_sig(HANDLER_CONTEXT) );
}
else
{
- if (INSTR_EmulateInstruction( HANDLER_CONTEXT )) return;
- fprintf( stderr, "Segmentation fault in 16-bit code (%04x:%04lx).\n",
- (WORD)CS_sig(HANDLER_CONTEXT), EIP_sig(HANDLER_CONTEXT) );
+ MSG("Segmentation fault in 16-bit code (%04x:%04lx).\n",
+ (WORD)CS_sig(HANDLER_CONTEXT), EIP_sig(HANDLER_CONTEXT) );
}
+#ifdef CR2_sig
+ fprintf(stderr,"Fault address is 0x%08lx\n",CR2_sig(HANDLER_CONTEXT));
+#endif
wine_debug( signal, HANDLER_CONTEXT );
}
@@ -158,17 +160,17 @@
*/
void SIGNAL_InfoRegisters( CONTEXT *context )
{
- fprintf( stderr," CS:%04x SS:%04x DS:%04x ES:%04x FS:%04x GS:%04x",
+ MSG(" CS:%04x SS:%04x DS:%04x ES:%04x FS:%04x GS:%04x",
(WORD)CS_reg(context), (WORD)SS_reg(context),
(WORD)DS_reg(context), (WORD)ES_reg(context),
(WORD)FS_reg(context), (WORD)GS_reg(context) );
- fprintf( stderr, "\n EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx\n",
+ MSG( "\n EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx\n",
EIP_reg(context), ESP_reg(context),
EBP_reg(context), EFL_reg(context) );
- fprintf( stderr, " EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n",
+ MSG( " EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n",
EAX_reg(context), EBX_reg(context),
ECX_reg(context), EDX_reg(context) );
- fprintf( stderr, " ESI:%08lx EDI:%08lx\n",
+ MSG( " ESI:%08lx EDI:%08lx\n",
ESI_reg(context), EDI_reg(context) );
}
diff --git a/if1632/thunk.c b/if1632/thunk.c
index 68a511b..c4740d4 100644
--- a/if1632/thunk.c
+++ b/if1632/thunk.c
@@ -492,7 +492,7 @@
THUNK *thunk, *oldThunk;
if (!defDCHookProc) /* Get DCHook Win16 entry point */
- defDCHookProc = MODULE_GetEntryPoint( GetModuleHandle16("USER"), 362 );
+ defDCHookProc = NE_GetEntryPoint( GetModuleHandle16("USER"), 362 );
if (proc != defDCHookProc)
{
@@ -521,8 +521,7 @@
if (thunk == (THUNK *)DCHook)
{
if (!defDCHookProc) /* Get DCHook Win16 entry point */
- defDCHookProc = MODULE_GetEntryPoint(GetModuleHandle16("USER"),
- 362 );
+ defDCHookProc = NE_GetEntryPoint(GetModuleHandle16("USER"),362);
*phookProc = defDCHookProc;
}
else *phookProc = thunk->proc;
@@ -541,7 +540,7 @@
THUNK *thunk = NULL;
if( !defSignalProc16 )
- defSignalProc16 = MODULE_GetEntryPoint(GetModuleHandle16("USER"), 314 );
+ defSignalProc16 = NE_GetEntryPoint(GetModuleHandle16("USER"), 314 );
if( proc == defSignalProc16 )
thunk = (THUNK*)SetTaskSignalProc( hTask, (FARPROC16)&USER_SignalProc );
@@ -569,9 +568,6 @@
*/
FARPROC16 WINAPI THUNK_SetResourceHandler( HMODULE16 hModule, SEGPTR typeId, FARPROC16 proc )
{
- /* loader/ne_resource.c */
- extern HGLOBAL16 WINAPI NE_DefResourceHandler(HGLOBAL16,HMODULE16,HRSRC16);
-
static FARPROC16 defDIBIconLoader16 = NULL;
static FARPROC16 defDIBCursorLoader16 = NULL;
static FARPROC16 defResourceLoader16 = NULL;
@@ -581,8 +577,8 @@
if( !defResourceLoader16 )
{
HMODULE16 hUser = GetModuleHandle16("USER");
- defDIBIconLoader16 = MODULE_GetEntryPoint( hUser, 357 );
- defDIBCursorLoader16 = MODULE_GetEntryPoint( hUser, 356 );
+ defDIBIconLoader16 = NE_GetEntryPoint( hUser, 357 );
+ defDIBCursorLoader16 = NE_GetEntryPoint( hUser, 356 );
defResourceLoader16 = MODULE_GetWndProcEntry16( "DefResourceHandler" );
}
@@ -703,7 +699,7 @@
);
break;
default:
- fprintf(stderr,"CALLBACK_CallWOWCallback16Ex(), %ld arguments not supported.!n",cbArgs);
+ ERR(thunk,"%ld arguments not supported.\n",cbArgs);
if (dwFlags == WCB16_CDECL)
HeapFree(GetProcessHeap(),0,args);
return FALSE;
diff --git a/if1632/typelib.spec b/if1632/typelib.spec
index 7d2bccf..5b8b311 100644
--- a/if1632/typelib.spec
+++ b/if1632/typelib.spec
@@ -2,7 +2,7 @@
type win16
2 stub CREATETYPELIB
-3 stub LOADTYPELIB
+3 pascal LoadTypeLib(ptr ptr) LoadTypeLib
4 stub LHASHVALOFNAMESYS
5 stub _IID_ICREATETYPEINFO
6 stub _IID_ICREATETYPELIB
@@ -11,5 +11,5 @@
9 stub _IID_ITYPELIB
10 stub REGISTERTYPELIB
11 stub LOADREGTYPELIB
-14 pascal QueryPathOfRegTypeLib(ptr word word word ptr) QueryPathOfRegTypeLib
+14 pascal QueryPathOfRegTypeLib(ptr word word word ptr) QueryPathOfRegTypeLib16
15 pascal OABuildVersion() OABuildVersion
diff --git a/if1632/user.spec b/if1632/user.spec
index 84b32e5..5eea87b 100644
--- a/if1632/user.spec
+++ b/if1632/user.spec
@@ -462,7 +462,7 @@
514 pascal16 WNetDeviceMode(word) WNetDeviceMode
515 pascal16 WNetBrowseDialog(word word ptr) WNetBrowseDialog
516 pascal16 WNetGetUser(ptr ptr ptr) WNetGetUser
-517 pascal16 WNetAddConnection(ptr ptr ptr) WNetAddConnection
+517 pascal16 WNetAddConnection(ptr ptr ptr) WNetAddConnection16
518 pascal16 WNetCancelConnection(ptr word) WNetCancelConnection
519 pascal16 WNetGetError(ptr) WNetGetError
520 pascal16 WNetGetErrorText(word ptr ptr) WNetGetErrorText
@@ -475,7 +475,7 @@
527 pascal16 WNetConnectionDialog(word word) WNetConnectionDialog
528 pascal16 WNetViewQueueDialog(word ptr) WNetViewQueueDialog
529 pascal16 WNetPropertyDialog(word word ptr word) WNetPropertyDialog
-530 pascal16 WNetGetDirectoryType(ptr ptr) WNetGetDirectoryType
+530 pascal16 WNetGetDirectoryType(ptr ptr) WNetGetDirectoryType16
531 pascal16 WNetDirectoryNotify(word ptr word) WNetDirectoryNotify
532 pascal16 WNetGetPropertyText(word word word ptr word) WNetGetPropertyText
533 stub WNetInitialize
diff --git a/if1632/wprocs.spec b/if1632/wprocs.spec
index 40fa9b5..db7aa66 100644
--- a/if1632/wprocs.spec
+++ b/if1632/wprocs.spec
@@ -9,10 +9,10 @@
19 pascal PrintSetupDlgProc(word word word long) PrintSetupDlgProc
20 pascal PrintDlgProc(word word word long) PrintDlgProc
24 pascal16 TASK_Reschedule() TASK_Reschedule
-27 pascal EntryAddrProc(word word) EntryAddrProc
-28 pascal MyAlloc(word word word) MODULE_AllocateSegment
+27 pascal EntryAddrProc(word word) NE_GetEntryPoint
+28 pascal MyAlloc(word word word) NE_AllocateSegment
29 pascal DefResourceHandler(word word word) NE_DefResourceHandler
-30 pascal FormatCharDlgProc(word word word long) FormatCharDlgProc
+30 pascal FormatCharDlgProc(word word word long) FormatCharDlgProc16
# Interrupt vectors 0-255 are ordinals 100-355
# The 'word' parameter are the flags pushed on the stack by the interrupt
diff --git a/include/commdlg.h b/include/commdlg.h
index 126b940..7edc7ba 100644
--- a/include/commdlg.h
+++ b/include/commdlg.h
@@ -228,7 +228,7 @@
short nSizeMin WINE_PACKED; /* minimum pt size allowed & */
short nSizeMax WINE_PACKED; /* max pt size allowed if */
/* CF_LIMITSIZE is used */
-} CHOOSEFONT, *LPCHOOSEFONT;
+} CHOOSEFONT16, *LPCHOOSEFONT16;
typedef struct
{
@@ -248,7 +248,30 @@
UINT16 ___MISSING_ALIGNMENT__;
INT32 nSizeMin;
INT32 nSizeMax;
-} CHOOSEFONT32A, *PCHOOSEFONT32A;
+} CHOOSEFONT32A, *LPCHOOSEFONT32A;
+
+typedef struct
+{
+ UINT32 lStructSize;
+ HWND32 hwndOwner;
+ HDC32 hDC;
+ LPLOGFONT32W lpLogFont;
+ INT32 iPointSize;
+ UINT32 Flags;
+ COLORREF rgbColors;
+ LPARAM lCustData;
+ WNDPROC32 lpfnHook;
+ LPCWSTR lpTemplateName;
+ HINSTANCE32 hInstance;
+ LPWSTR lpszStyle;
+ UINT16 nFontType;
+ UINT16 ___MISSING_ALIGNMENT__;
+ INT32 nSizeMin;
+ INT32 nSizeMax;
+} CHOOSEFONT32W, *LPCHOOSEFONT32W;
+
+DECL_WINELIB_TYPE_AW(CHOOSEFONT);
+DECL_WINELIB_TYPE_AW(LPCHOOSEFONT);
#pragma pack(4)
@@ -264,6 +287,7 @@
#define CF_EFFECTS 0x00000100L
#define CF_APPLY 0x00000200L
#define CF_ANSIONLY 0x00000400L
+#define CF_SCRIPTSONLY CF_ANSIONLY
#define CF_NOVECTORFONTS 0x00000800L
#define CF_NOOEMFONTS CF_NOVECTORFONTS
#define CF_NOSIMULATIONS 0x00001000L
@@ -276,6 +300,9 @@
#define CF_NOFACESEL 0x00080000L
#define CF_NOSTYLESEL 0x00100000L
#define CF_NOSIZESEL 0x00200000L
+#define CF_SELECTSCRIPT 0x00400000L
+#define CF_NOSCRIPTSEL 0x00800000L
+#define CF_NOVERTFONTS 0x01000000L
#define SIMULATED_FONTTYPE 0x8000
#define PRINTER_FONTTYPE 0x4000
@@ -285,6 +312,8 @@
#define REGULAR_FONTTYPE 0x0400
#define WM_CHOOSEFONT_GETLOGFONT (WM_USER + 1)
+#define WM_CHOOSEFONT_SETLOGFONT (WM_USER + 101)
+#define WM_CHOOSEFONT_SETFLAGS (WM_USER + 102)
#define LBSELCHSTRING "commdlg_LBSelChangedNotify"
#define SHAREVISTRING "commdlg_ShareViolation"
@@ -446,7 +475,10 @@
HWND32 WINAPI ReplaceText32A( LPFINDREPLACE32A lpFind);
HWND32 WINAPI ReplaceText32W( LPFINDREPLACE32W lpFind);
#define ReplaceText WINELIB_NAME_AW(ReplaceText)
-BOOL16 WINAPI ChooseFont(LPCHOOSEFONT lpChFont);
+BOOL16 WINAPI ChooseFont16(LPCHOOSEFONT16);
+BOOL32 WINAPI ChooseFont32A(LPCHOOSEFONT32A);
+BOOL32 WINAPI ChooseFont32W(LPCHOOSEFONT32W);
+#define ChooseFont WINELIB_NAME_AW(ChooseFont)
LRESULT WINAPI FileOpenDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
LRESULT WINAPI FileSaveDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
LRESULT WINAPI ColorDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
@@ -460,8 +492,10 @@
#define ReplaceTextProc WINELIB_NAME_AW(ReplaceTextDlgProc)
LRESULT WINAPI PrintDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
LRESULT WINAPI PrintSetupDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
-LRESULT WINAPI FormatCharDlgProc(HWND16 hWnd, UINT16 wMsg, WPARAM16 wParam, LPARAM lParam);
-
+LRESULT WINAPI FormatCharDlgProc16(HWND16,UINT16,WPARAM16,LPARAM);
+LRESULT WINAPI FormatCharDlgProc32A(HWND32,UINT32,WPARAM32,LPARAM);
+LRESULT WINAPI FormatCharDlgProc32W(HWND32,UINT32,WPARAM32,LPARAM);
+#define FormatCharDlgProc LIBWINE_NAME_AW(FormatCharDlgProc)
#ifdef __cplusplus
}
#endif
diff --git a/include/ddeml.h b/include/ddeml.h
index 845a58b..09c2e20 100644
--- a/include/ddeml.h
+++ b/include/ddeml.h
@@ -51,9 +51,13 @@
BOOL16 WINAPI DdeUninitialize16(DWORD);
BOOL32 WINAPI DdeUninitialize32(DWORD);
#define DdeUninitialize WINELIB_NAME(DdeUninitialize)
-HCONVLIST WINAPI DdeConnectList(DWORD,HSZ,HSZ,HCONVLIST,LPCONVCONTEXT16);
+HCONVLIST WINAPI DdeConnectList16(DWORD,HSZ,HSZ,HCONVLIST,LPCONVCONTEXT16);
+HCONVLIST WINAPI DdeConnectList32(DWORD,HSZ,HSZ,HCONVLIST,LPCONVCONTEXT32);
+#define DdeConnectList WINELIB_NAME(DdeConnectList)
HCONV WINAPI DdeQueryNextServer(HCONVLIST, HCONV);
-BOOL16 WINAPI DdeDisconnectList(HCONVLIST);
+BOOL16 WINAPI DdeDisconnectList16(HCONVLIST);
+BOOL32 WINAPI DdeDisconnectList32(HCONVLIST);
+#define DdeDisConnectList WINELIB_NAME(DdeDisconnectList)
HCONV WINAPI DdeConnect16(DWORD,HSZ,HSZ,LPCONVCONTEXT16);
HCONV WINAPI DdeConnect32(DWORD,HSZ,HSZ,LPCONVCONTEXT32);
#define DdeConnect WINELIB_NAME(DdeConnect)
@@ -82,7 +86,9 @@
UINT32,DWORD,LPDWORD);
#define DdeClientTransaction WINELIB_NAME(DdeClientTransaction)
BOOL16 WINAPI DdeAbandonTransaction(DWORD,HCONV,DWORD);
-BOOL16 WINAPI DdePostAdvise(DWORD,HSZ,HSZ);
+BOOL16 WINAPI DdePostAdvise16(DWORD,HSZ,HSZ);
+BOOL32 WINAPI DdePostAdvise32(DWORD,HSZ,HSZ);
+#define DdePostAdvise WINELIB_NAME(DdePostAdvise)
HDDEDATA WINAPI DdeAddData(HDDEDATA,LPBYTE,DWORD,DWORD);
DWORD WINAPI DdeGetData(HDDEDATA,LPBYTE,DWORD,DWORD);
LPBYTE WINAPI DdeAccessData(HDDEDATA,LPDWORD);
diff --git a/include/debug.h b/include/debug.h
index d601ff4..6c6289c 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -31,87 +31,90 @@
#define dbch_dialog 23
#define dbch_dll 24
#define dbch_dosfs 25
-#define dbch_driver 26
-#define dbch_dsound 27
-#define dbch_edit 28
-#define dbch_event 29
-#define dbch_exec 30
-#define dbch_file 31
-#define dbch_fixup 32
-#define dbch_font 33
-#define dbch_gdi 34
-#define dbch_global 35
-#define dbch_graphics 36
-#define dbch_heap 37
-#define dbch_hook 38
-#define dbch_icon 39
-#define dbch_imagelist 40
-#define dbch_int 41
-#define dbch_int21 42
-#define dbch_int31 43
-#define dbch_key 44
-#define dbch_keyboard 45
-#define dbch_ldt 46
-#define dbch_listbox 47
-#define dbch_local 48
-#define dbch_mci 49
-#define dbch_mcianim 50
-#define dbch_mciwave 51
-#define dbch_mdi 52
-#define dbch_menu 53
-#define dbch_message 54
-#define dbch_metafile 55
-#define dbch_midi 56
-#define dbch_mmaux 57
-#define dbch_mmio 58
-#define dbch_mmsys 59
-#define dbch_mmtime 60
-#define dbch_module 61
-#define dbch_mpr 62
-#define dbch_msg 63
-#define dbch_nonclient 64
-#define dbch_ntdll 65
-#define dbch_ole 66
-#define dbch_palette 67
-#define dbch_print 68
-#define dbch_profile 69
-#define dbch_progress 70
-#define dbch_prop 71
-#define dbch_reg 72
-#define dbch_region 73
-#define dbch_relay 74
-#define dbch_resource 75
-#define dbch_scroll 76
-#define dbch_security 77
-#define dbch_selector 78
-#define dbch_sem 79
-#define dbch_sendmsg 80
-#define dbch_shell 81
-#define dbch_shm 82
-#define dbch_sound 83
-#define dbch_static 84
-#define dbch_stress 85
-#define dbch_string 86
-#define dbch_task 87
-#define dbch_text 88
-#define dbch_thread 89
-#define dbch_thunk 90
-#define dbch_timer 91
-#define dbch_toolhelp 92
-#define dbch_tweak 93
-#define dbch_uitools 94
-#define dbch_updown 95
-#define dbch_ver 96
-#define dbch_virtual 97
-#define dbch_vxd 98
-#define dbch_win 99
-#define dbch_win16drv 100
-#define dbch_win32 101
-#define dbch_wing 102
-#define dbch_winsock 103
-#define dbch_wnet 104
-#define dbch_x11 105
-#define dbch_x11drv 106
+#define dbch_dosmem 26
+#define dbch_driver 27
+#define dbch_dsound 28
+#define dbch_edit 29
+#define dbch_event 30
+#define dbch_exec 31
+#define dbch_file 32
+#define dbch_fixup 33
+#define dbch_font 34
+#define dbch_gdi 35
+#define dbch_global 36
+#define dbch_graphics 37
+#define dbch_heap 38
+#define dbch_hook 39
+#define dbch_icon 40
+#define dbch_imagelist 41
+#define dbch_int 42
+#define dbch_int21 43
+#define dbch_int31 44
+#define dbch_key 45
+#define dbch_keyboard 46
+#define dbch_ldt 47
+#define dbch_listbox 48
+#define dbch_local 49
+#define dbch_mci 50
+#define dbch_mcianim 51
+#define dbch_mciwave 52
+#define dbch_mdi 53
+#define dbch_menu 54
+#define dbch_message 55
+#define dbch_metafile 56
+#define dbch_midi 57
+#define dbch_mmaux 58
+#define dbch_mmio 59
+#define dbch_mmsys 60
+#define dbch_mmtime 61
+#define dbch_module 62
+#define dbch_mpr 63
+#define dbch_msg 64
+#define dbch_nonclient 65
+#define dbch_ntdll 66
+#define dbch_ole 67
+#define dbch_palette 68
+#define dbch_print 69
+#define dbch_profile 70
+#define dbch_progress 71
+#define dbch_prop 72
+#define dbch_reg 73
+#define dbch_region 74
+#define dbch_relay 75
+#define dbch_resource 76
+#define dbch_scroll 77
+#define dbch_security 78
+#define dbch_segment 79
+#define dbch_selector 80
+#define dbch_sem 81
+#define dbch_sendmsg 82
+#define dbch_shell 83
+#define dbch_shm 84
+#define dbch_sound 85
+#define dbch_static 86
+#define dbch_stress 87
+#define dbch_string 88
+#define dbch_system 89
+#define dbch_task 90
+#define dbch_text 91
+#define dbch_thread 92
+#define dbch_thunk 93
+#define dbch_timer 94
+#define dbch_toolhelp 95
+#define dbch_tweak 96
+#define dbch_uitools 97
+#define dbch_updown 98
+#define dbch_ver 99
+#define dbch_virtual 100
+#define dbch_vxd 101
+#define dbch_win 102
+#define dbch_win16drv 103
+#define dbch_win32 104
+#define dbch_wing 105
+#define dbch_winsock 106
+#define dbch_wnet 107
+#define dbch_x11 108
+#define dbch_x11drv 109
/* Definitions for classes identifiers */
#define dbcl_fixme 0
#define dbcl_err 1
diff --git a/include/debugdefs.h b/include/debugdefs.h
index 6189cf5..2b8f5fc 100644
--- a/include/debugdefs.h
+++ b/include/debugdefs.h
@@ -4,7 +4,7 @@
#include "debugtools.h"
#endif
-#define DEBUG_CHANNEL_COUNT 107
+#define DEBUG_CHANNEL_COUNT 110
#ifdef DEBUG_RUNTIME
short debug_msg_enabled[][DEBUG_CLASS_COUNT] = {
{1, 1, 0, 0},
@@ -114,6 +114,9 @@
{1, 1, 0, 0},
{1, 1, 0, 0},
{1, 1, 0, 0},
+{1, 1, 0, 0},
+{1, 1, 0, 0},
+{1, 1, 0, 0},
};
const char* debug_ch_name[] = {
"accel",
@@ -142,6 +145,7 @@
"dialog",
"dll",
"dosfs",
+"dosmem",
"driver",
"dsound",
"edit",
@@ -194,6 +198,7 @@
"resource",
"scroll",
"security",
+"segment",
"selector",
"sem",
"sendmsg",
@@ -203,6 +208,7 @@
"static",
"stress",
"string",
+"system",
"task",
"text",
"thread",
diff --git a/include/debugger.h b/include/debugger.h
index 94d71aa..866634d 100644
--- a/include/debugger.h
+++ b/include/debugger.h
@@ -85,14 +85,13 @@
typedef struct wine_locals WineLocals;
-#define DBG_FIX_ADDR_SEG(addr,default) \
- { WORD cs, ds; GET_CS(cs); GET_DS(ds); \
+#define DBG_FIX_ADDR_SEG(addr,default) { \
if ((addr)->seg == 0xffffffff) (addr)->seg = (default); \
- if (((addr)->seg == cs) || (addr)->seg == ds) (addr)->seg = 0; }
+ if (IS_SELECTOR_SYSTEM((addr)->seg)) (addr)->seg = 0; }
#define DBG_ADDR_TO_LIN(addr) \
- ((addr)->seg ? (char *)PTR_SEG_OFF_TO_LIN((addr)->seg,(addr)->off) \
- : (char *)(addr)->off)
+ (IS_SELECTOR_SYSTEM((addr)->seg) ? (char *)(addr)->off \
+ : (char *)PTR_SEG_OFF_TO_LIN((addr)->seg,(addr)->off))
#define DBG_CHECK_READ_PTR(addr,len) \
(!DEBUG_IsBadReadPtr((addr),(len)) || \
diff --git a/include/gdi.h b/include/gdi.h
index cce4270..4ea7c7b 100644
--- a/include/gdi.h
+++ b/include/gdi.h
@@ -198,6 +198,7 @@
BOOL32 (*pPatBlt)(DC*,INT32,INT32,INT32,INT32,DWORD);
BOOL32 (*pPie)(DC*,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32);
BOOL32 (*pPolyPolygon)(DC*,LPPOINT32,LPINT32,UINT32);
+ BOOL32 (*pPolyPolyline)(DC*,LPPOINT32,LPINT32,UINT32);
BOOL32 (*pPolygon)(DC*,LPPOINT32,INT32);
BOOL32 (*pPolyline)(DC*,LPPOINT32,INT32);
UINT32 (*pRealizePalette)(DC*);
diff --git a/include/ldt.h b/include/ldt.h
index 4d6713f..0f46d9a 100644
--- a/include/ldt.h
+++ b/include/ldt.h
@@ -59,13 +59,13 @@
/* Convert a segmented ptr (16:16) to a linear (32) pointer */
#define PTR_SEG_OFF_TO_LIN(seg,off) \
- ((void*)(GET_SEL_BASE(seg) + (unsigned int)(off)))
+ ((void*)(GET_SEL_BASE(seg) + (unsigned int)(off)))
#define PTR_SEG_TO_LIN(ptr) \
- (__winelib ? (void*)(ptr) : PTR_SEG_OFF_TO_LIN(SELECTOROF(ptr),OFFSETOF(ptr)))
+ PTR_SEG_OFF_TO_LIN(SELECTOROF(ptr),OFFSETOF(ptr))
#define PTR_SEG_OFF_TO_SEGPTR(seg,off) \
- (__winelib ? (SEGPTR)PTR_SEG_OFF_TO_LIN(seg,off) : (SEGPTR)MAKELONG(off,seg))
+ ((SEGPTR)MAKELONG(off,seg))
#define PTR_SEG_OFF_TO_HUGEPTR(seg,off) \
- (PTR_SEG_OFF_TO_SEGPTR( (seg) + (HIWORD(off) << __AHSHIFT), LOWORD(off) ))
+ PTR_SEG_OFF_TO_SEGPTR( (seg) + (HIWORD(off) << __AHSHIFT), LOWORD(off) )
extern unsigned char ldt_flags_copy[LDT_SIZE];
@@ -78,4 +78,12 @@
#define GET_SEL_FLAGS(sel) (ldt_flags_copy[SELECTOR_TO_ENTRY(sel)])
+#define FIRST_LDT_ENTRY_TO_ALLOC 17
+
+/* Determine if sel is a system selector (i.e. not managed by Wine) */
+#define IS_SELECTOR_SYSTEM(sel) \
+ (!((sel) & 4) || (SELECTOR_TO_ENTRY(sel) < FIRST_LDT_ENTRY_TO_ALLOC))
+#define IS_SELECTOR_32BIT(sel) \
+ (IS_SELECTOR_SYSTEM(sel) || (GET_SEL_FLAGS(sel) & LDT_FLAGS_32BIT))
+
#endif /* __WINE_LDT_H */
diff --git a/include/miscemu.h b/include/miscemu.h
index 4b5847b..3d58a6c 100644
--- a/include/miscemu.h
+++ b/include/miscemu.h
@@ -15,7 +15,6 @@
extern DWORD DOSMEM_CollateTable;
extern BOOL32 DOSMEM_Init(void);
-extern void DOSMEM_InitExports(HMODULE16);
extern void DOSMEM_Tick(void);
extern WORD DOSMEM_AllocSelector(WORD);
extern LPVOID DOSMEM_GetBlock(UINT32 size, UINT16* p);
diff --git a/include/module.h b/include/module.h
index 017b3c2..5666695 100644
--- a/include/module.h
+++ b/include/module.h
@@ -101,6 +101,25 @@
#pragma pack(4)
+/* internal representation of 32bit modules. per process. */
+typedef enum { MODULE32_PE=1, MODULE32_ELF, /* ... */ } MODULE32_TYPE;
+typedef struct _wine_modref
+{
+ struct _wine_modref *next;
+ MODULE32_TYPE type;
+ union {
+ PE_MODREF pe;
+ /* ELF_MODREF elf; */
+ } binfmt;
+
+ HMODULE32 module;
+
+ char *modname;
+ char *fullname;
+ char *shortname;
+ char *unixname;
+} WINE_MODREF;
+
/* Resource types */
typedef struct resource_typeinfo_s NE_TYPEINFO;
typedef struct resource_nameinfo_s NE_NAMEINFO;
@@ -114,32 +133,48 @@
#define NE_MODULE_NAME(pModule) \
(((OFSTRUCT *)((char*)(pModule) + (pModule)->fileinfo))->szPathName)
-#define NE_WIN32_MODULE(pModule) \
- ((((pModule)->flags & NE_FFLAGS_WIN32) ? \
- ((NE_WIN32_EXTRAINFO *)((pModule) + 1))->module32 : 0))
-
/* module.c */
-extern NE_MODULE *MODULE_GetPtr( HMODULE32 hModule );
+extern NE_MODULE *MODULE_GetPtr16( HMODULE16 hModule );
+extern NE_MODULE *MODULE_GetPtr32( HMODULE32 hModule );
extern HMODULE16 MODULE_HANDLEtoHMODULE16( HANDLE32 handle );
-extern HMODULE32 MODULE_HANDLEtoHMODULE32( HANDLE32 handle );
-extern void MODULE_DumpModule( HMODULE32 hmodule );
-extern void MODULE_WalkModules(void);
extern int MODULE_OpenFile( HMODULE32 hModule );
extern LPSTR MODULE_GetModuleName( HMODULE32 hModule );
-extern void MODULE_RegisterModule( NE_MODULE *pModule );
-extern HMODULE32 MODULE_FindModule( LPCSTR path );
-extern HINSTANCE16 MODULE_CreateInstance( HMODULE16 hModule, BOOL32 lib_only );
-extern HINSTANCE16 MODULE_GetInstance( HMODULE32 hModule );
+extern FARPROC32 MODULE_GetProcAddress32( struct _PDB32*pdb,HMODULE32 hModule,LPCSTR function );
+extern WINE_MODREF *MODULE32_LookupHMODULE( struct _PDB32 *process, HMODULE32 hModule );
+extern HMODULE32 MODULE_FindModule16( LPCSTR path );
+extern HMODULE32 MODULE_FindModule32( struct _PDB32 *process, LPCSTR path );
+extern HINSTANCE16 MODULE_CreateInstance( HMODULE16 hModule, HINSTANCE16 *prev,
+ BOOL32 lib_only );
extern HMODULE32 MODULE_CreateDummyModule( const OFSTRUCT *ofs );
extern HINSTANCE16 MODULE_Load( LPCSTR name, UINT16 uFlags, LPCSTR cmd_line,
LPCSTR env, UINT32 show_cmd );
-extern WORD MODULE_GetOrdinal( HMODULE32 hModule, const char *name );
-extern FARPROC16 MODULE_GetEntryPoint( HMODULE32 hModule, WORD ordinal );
-extern BOOL16 MODULE_SetEntryPoint( HMODULE32 hModule, WORD ordinal,
- WORD offset );
extern FARPROC16 MODULE_GetWndProcEntry16( const char *name );
extern FARPROC16 WINAPI WIN32_GetProcAddress16( HMODULE32 hmodule, LPSTR name );
+typedef HGLOBAL16 (CALLBACK *RESOURCEHANDLER16)(HGLOBAL16,HMODULE16,HRSRC16);
+
+/* loader/ne/module.c */
+extern void NE_DumpModule( HMODULE16 hModule );
+extern void NE_WalkModules(void);
+extern void NE_RegisterModule( NE_MODULE *pModule );
+extern WORD NE_GetOrdinal( HMODULE16 hModule, const char *name );
+extern FARPROC16 NE_GetEntryPoint( HMODULE16 hModule, WORD ordinal );
+extern BOOL16 NE_SetEntryPoint( HMODULE16 hModule, WORD ordinal, WORD offset );
+extern HINSTANCE16 NE_LoadModule( HFILE32 hFile, OFSTRUCT *ofs, UINT16 flags,
+ LPCSTR cmd_line, LPCSTR env,
+ UINT32 show_cmd );
+
+/* loader/ne/resource.c */
+extern HGLOBAL16 WINAPI NE_DefResourceHandler(HGLOBAL16,HMODULE16,HRSRC16);
+extern BOOL32 NE_InitResourceHandler( HMODULE16 hModule );
+
+/* loader/ne/segment.c */
+extern BOOL32 NE_LoadSegment( NE_MODULE *pModule, WORD segnum );
+extern BOOL32 NE_LoadAllSegments( NE_MODULE *pModule );
+extern void NE_FixupPrologs( NE_MODULE *pModule );
+extern void NE_InitializeDLLs( HMODULE16 hModule );
+extern BOOL32 NE_CreateSegments( HMODULE16 hModule );
+
/* builtin.c */
extern BOOL32 BUILTIN_Init(void);
extern HMODULE32 BUILTIN_LoadModule( LPCSTR name, BOOL32 force );
@@ -149,13 +184,6 @@
extern BOOL32 BUILTIN_ParseDLLOptions( const char *str );
extern void BUILTIN_PrintDLLs(void);
-/* ne_image.c */
-extern BOOL32 NE_LoadSegment( NE_MODULE *pModule, WORD segnum );
-extern BOOL32 NE_LoadAllSegments( NE_MODULE *pModule );
-extern BOOL32 NE_LoadDLLs( NE_MODULE *pModule );
-extern void NE_FixupPrologs( NE_MODULE *pModule );
-extern void NE_InitializeDLLs( HMODULE16 hModule );
-
/* relay32/builtin.c */
extern HMODULE32 BUILTIN32_LoadModule( LPCSTR name, BOOL32 force,
struct _PDB32 *process );
diff --git a/include/neexe.h b/include/neexe.h
index ff83390..7a428fd 100644
--- a/include/neexe.h
+++ b/include/neexe.h
@@ -168,51 +168,6 @@
#define NE_RELFLAG_ADDITIVE 4
/*
- * DOS PSP
- */
-struct dos_psp_s
-{
- unsigned short pspInt20;
- unsigned short pspNextParagraph;
- unsigned char pspReserved1;
- unsigned char pspDispatcher[5];
- unsigned short pspTerminateVector[2];
- unsigned short pspControlCVector[2];
- unsigned short pspCritErrorVector[2];
- unsigned short pspReserved2[11];
- unsigned short pspEnvironment;
- unsigned short pspReserved3[23];
- unsigned char pspFCB_1[16];
- unsigned char pspFCB_2[16];
- unsigned char pspReserved4[4];
- unsigned char pspCommandTailCount;
- unsigned char pspCommandTail[128];
-};
-
-/*
- * Entry table structures.
- */
-struct entry_tab_header_s
-{
- unsigned char n_entries;
- unsigned char seg_number;
-};
-
-struct entry_tab_movable_s
-{
- unsigned char flags;
- unsigned char int3f[2];
- unsigned char seg_number;
- unsigned short offset;
-};
-
-struct entry_tab_fixed_s
-{
- unsigned char flags;
- unsigned char offset[2];
-};
-
-/*
* Resource table structures.
*/
struct resource_nameinfo_s
@@ -229,7 +184,7 @@
{
unsigned short type_id; /* Type identifier */
unsigned short count; /* Number of resources of this type */
- DWORD resloader; /* SetResourceHandler() */
+ FARPROC16 resloader; /* SetResourceHandler() */
/*
* Name info array.
*/
diff --git a/include/ole.h b/include/ole.h
index fd671be..42ba711 100644
--- a/include/ole.h
+++ b/include/ole.h
@@ -7,24 +7,29 @@
#include "windows.h"
-typedef CHAR OLECHAR16;
-typedef LPSTR LPOLESTR16;
-typedef LPCSTR LPCOLESTR16;
-typedef WCHAR OLECHAR32;
-typedef LPWSTR LPOLESTR32;
-typedef LPCWSTR LPCOLESTR32;
+typedef CHAR OLECHAR16;
+typedef OLECHAR16 *BSTR16;
+typedef BSTR16 *LPBSTR16;
+typedef LPSTR LPOLESTR16;
+typedef LPCSTR LPCOLESTR16;
+typedef WCHAR OLECHAR32;
+typedef OLECHAR32 *BSTR32;
+typedef BSTR32 *LPBSTR32;
+typedef LPWSTR LPOLESTR32;
+typedef LPCWSTR LPCOLESTR32;
DECL_WINELIB_TYPE(OLECHAR);
DECL_WINELIB_TYPE(LPOLESTR);
DECL_WINELIB_TYPE(LPCOLESTR);
+DECL_WINELIB_TYPE(BSTR);
+DECL_WINELIB_TYPE(LPBSTR);
#define OLESTR16(x) x
-#define OLESTR32(x) L##x
+#define OLESTR32(x) L##x /* probably wrong */
#define OLESTR WINELIB_NAME(OLESTR)
typedef unsigned short VARTYPE;
typedef LONG DISPID;
-
/* object types */
#define OT_LINK 1
#define OT_EMBEDDED 2
diff --git a/include/oleauto.h b/include/oleauto.h
new file mode 100644
index 0000000..8a0f265
--- /dev/null
+++ b/include/oleauto.h
@@ -0,0 +1,14 @@
+#ifndef __WINE_OLEAUTO_H
+#define __WINE_OLEAUTO_H
+
+BSTR16 SysAllocString16(LPOLESTR16);
+BSTR32 SysAllocString32(LPOLESTR32);
+#define SysAllocString WINELIB_NAME(SysAllocString)
+INT16 SysReAllocString16(LPBSTR16,LPOLESTR16);
+INT32 SysReAllocString32(LPBSTR32,LPOLESTR32);
+#define SysReAllocString WINELIB_NAME(SysReAllocString)
+VOID SysFreeString16(BSTR16);
+VOID SysFreeString32(BSTR32);
+#define SysFreeString WINELIB_NAME(SysFreeString)
+
+#endif
diff --git a/include/pe_image.h b/include/pe_image.h
index 61c5912..bf276f6 100644
--- a/include/pe_image.h
+++ b/include/pe_image.h
@@ -9,9 +9,7 @@
/* modreference used for attached processes
* all section are calculated here, relocations etc.
*/
-struct pe_modref {
- struct pe_modref *next;
- HMODULE32 module;
+typedef struct {
LPIMAGE_IMPORT_DESCRIPTOR pe_import;
LPIMAGE_EXPORT_DIRECTORY pe_export;
LPIMAGE_RESOURCE_DIRECTORY pe_resource;
@@ -21,16 +19,16 @@
#define PE_MODREF_NO_DLL_CALLS 0x00000002
#define PE_MODREF_RELOCS_DONE 0x00000004
#define PE_MODREF_TLS_ALLOCED 0x00000008
+#define PE_MODREF_INTERNAL 0x00000010
int tlsindex;
-};
+} PE_MODREF;
struct _PDB32;
-
-typedef struct pe_modref PE_MODREF;
-
+struct _wine_modref;
extern int PE_unloadImage(HMODULE32 hModule);
-extern FARPROC32 PE_FindExportedFunction( struct _PDB32 *process,
- HMODULE32 hModule, LPCSTR funcName);
+extern FARPROC32 PE_FindExportedFunction(
+ struct _PDB32 *process,struct _wine_modref *wm, LPCSTR funcName
+);
extern void my_wcstombs(char * result, u_short * source, int len);
extern BOOL32 PE_EnumResourceTypes32A(HMODULE32,ENUMRESTYPEPROC32A,LONG);
extern BOOL32 PE_EnumResourceTypes32W(HMODULE32,ENUMRESTYPEPROC32W,LONG);
@@ -38,10 +36,10 @@
extern BOOL32 PE_EnumResourceNames32W(HMODULE32,LPCWSTR,ENUMRESNAMEPROC32W,LONG);
extern BOOL32 PE_EnumResourceLanguages32A(HMODULE32,LPCSTR,LPCSTR,ENUMRESLANGPROC32A,LONG);
extern BOOL32 PE_EnumResourceLanguages32W(HMODULE32,LPCWSTR,LPCWSTR,ENUMRESLANGPROC32W,LONG);
-extern HRSRC32 PE_FindResourceEx32W(HINSTANCE32,LPCWSTR,LPCWSTR,WORD);
-extern DWORD PE_SizeofResource32(HINSTANCE32,HRSRC32);
+extern HRSRC32 PE_FindResourceEx32W(struct _wine_modref*,LPCWSTR,LPCWSTR,WORD);
+extern DWORD PE_SizeofResource32(HMODULE32,HRSRC32);
extern HMODULE32 PE_LoadLibraryEx32A(LPCSTR,struct _PDB32*,HFILE32,DWORD);
-extern HGLOBAL32 PE_LoadResource32(HINSTANCE32,HRSRC32);
+extern HGLOBAL32 PE_LoadResource32(struct _wine_modref *wm,HRSRC32);
extern HINSTANCE16 PE_LoadModule( HFILE32 hFile, OFSTRUCT *ofs,
LPCSTR cmd_line, LPCSTR env, UINT16 showCmd);
diff --git a/include/process.h b/include/process.h
index 54c699f..dbdfbf3 100644
--- a/include/process.h
+++ b/include/process.h
@@ -10,8 +10,8 @@
#include "windows.h"
#include "winbase.h"
#include "winnt.h"
+#include "module.h"
#include "k32obj.h"
-#include "pe_image.h"
struct _NE_MODULE;
@@ -77,7 +77,7 @@
ENVDB *env_db; /* 40 Environment database */
HANDLE_TABLE *handle_table; /* 44 Handle table */
struct _PDB32 *parent; /* 48 Parent process */
- PE_MODREF *modref_list; /* 4c MODREF list */
+ WINE_MODREF *modref_list; /* 4c MODREF list */
void *thread_list; /* 50 List of threads */
void *debuggee_CB; /* 54 Debuggee context block */
void *local_heap_free; /* 58 Head of local heap free list */
@@ -88,7 +88,7 @@
DWORD tls_bits[2]; /* 88 TLS in-use bits */
DWORD process_dword; /* 90 Unknown */
struct _PDB32 *group; /* 94 Process group */
- PE_MODREF *exe_modref; /* 98 MODREF for the process EXE */
+ WINE_MODREF *exe_modref; /* 98 MODREF for the process EXE */
LPTOP_LEVEL_EXCEPTION_FILTER top_filter; /* 9c Top exception filter */
DWORD priority; /* a0 Priority level */
HANDLE32 heap_list; /* a4 Head of process heap list */
@@ -103,6 +103,12 @@
LCID locale; /* c4 Locale to be queried by GetThreadLocale (NT) */
} PDB32;
+/* Process flags */
+#define PDB32_WIN16_PROC 0x0008 /* Win16 process */
+#define PDB32_DOS_PROC 0x0010 /* Dos process */
+#define PDB32_CONSOLE_PROC 0x0020 /* Console process */
+#define PDB32_FILE_APIS_OEM 0x0040 /* File APIs are OEM */
+
/* PDB <-> Process id conversion macros */
#define PROCESS_OBFUSCATOR ((DWORD)0xdeadbeef)
#define PROCESS_ID_TO_PDB(id) ((PDB32 *)((id) ^ PROCESS_OBFUSCATOR))
diff --git a/include/resource.h b/include/resource.h
index 4f1cd26..0c89906 100644
--- a/include/resource.h
+++ b/include/resource.h
@@ -45,22 +45,6 @@
#undef HAVE_WINE_CONSTRUCTOR
#endif
-typedef HGLOBAL16 (CALLBACK *RESOURCEHANDLER16)(HGLOBAL16, HMODULE16, HRSRC16 );
-
-/* FIXME: convert all NE_ functions to accept NE_MODULE pointer instead
- * of redundant hModule (which is always verified prior to calling these).
- */
-
-extern int NE_AccessResource( HMODULE16 hModule, HRSRC16 hRsrc );
-extern BOOL32 NE_FreeResource( HMODULE16 hModule, HGLOBAL16 handle );
-extern HRSRC16 NE_FindResource(HMODULE16 hModule, SEGPTR typeId, SEGPTR resId);
-extern DWORD NE_SizeofResource( HMODULE16 hModule, HRSRC16 hRsrc );
-extern SEGPTR NE_LockResource( HMODULE16 hModule, HGLOBAL16 handle );
-extern HGLOBAL16 NE_AllocResource( HMODULE16 hModule, HRSRC16 hRsrc, DWORD size );
-extern HGLOBAL16 NE_LoadResource( HMODULE16 hModule, HRSRC16 hRsrc );
-extern BOOL32 NE_InitResourceHandler( HMODULE16 hModule );
-extern FARPROC32 NE_SetResourceHandler( HMODULE16 hModule, SEGPTR typeId, FARPROC32 handler);
-
extern HGLOBAL16 SYSRES_LoadResource( SYSTEM_RESOURCE id );
extern void SYSRES_FreeResource( HGLOBAL16 handle );
extern LPCVOID SYSRES_GetResPtr( SYSTEM_RESOURCE id );
diff --git a/include/sig_context.h b/include/sig_context.h
index 3db18ea..b1edc30 100644
--- a/include/sig_context.h
+++ b/include/sig_context.h
@@ -120,9 +120,10 @@
#define SS_sig(context) ((context)->sc_ss)
#ifdef linux
-/* fs and gs are not supported on *BSD. Hopefully we won't need them. */
+/* fs and gs are not supported on *BSD. */
#define FS_sig(context) ((context)->sc_fs)
#define GS_sig(context) ((context)->sc_gs)
+#define CR2_sig(context) ((context)->cr2)
#endif
#ifndef __FreeBSD__
diff --git a/include/version.h b/include/version.h
index c098d61..aed6733 100644
--- a/include/version.h
+++ b/include/version.h
@@ -1 +1 @@
-#define WINE_RELEASE_INFO "Wine release 980413"
+#define WINE_RELEASE_INFO "Wine release 980503"
diff --git a/include/winbase.h b/include/winbase.h
index 0983276..78835f2 100644
--- a/include/winbase.h
+++ b/include/winbase.h
@@ -160,7 +160,7 @@
WCHAR szCSDVersion[128];
} OSVERSIONINFO32W;
-DECL_WINELIB_TYPE_AW(OSVERSIONINFO);
+DECL_WINELIB_TYPE_AW(OSVERSIONINFO)
#define VER_PLATFORM_WIN32s 0
#define VER_PLATFORM_WIN32_WINDOWS 1
diff --git a/include/wincon.h b/include/wincon.h
index da8b20e..bc7c710 100644
--- a/include/wincon.h
+++ b/include/wincon.h
@@ -31,11 +31,13 @@
#define BACKGROUND_RED 0x0040 /* background color contains red. */
#define BACKGROUND_INTENSITY 0x0080 /* background color is intensified. */
+/*
typedef struct tagCOORD
{
INT16 x;
INT16 y;
} COORD,*LPCOORD;
+*/
typedef struct tagSMALL_RECT
{
diff --git a/include/windows.h b/include/windows.h
index e1861ae..6a66752 100644
--- a/include/windows.h
+++ b/include/windows.h
@@ -24,8 +24,8 @@
INT32 cy;
} SIZE32, *LPSIZE32;
-DECL_WINELIB_TYPE(SIZE);
-DECL_WINELIB_TYPE(LPSIZE);
+DECL_WINELIB_TYPE(SIZE)
+DECL_WINELIB_TYPE(LPSIZE)
#define CONV_SIZE16TO32(s16,s32) \
((s32)->cx = (INT32)(s16)->cx, (s32)->cy = (INT32)(s16)->cy)
@@ -46,8 +46,8 @@
INT32 y;
} POINT32, *LPPOINT32;
-DECL_WINELIB_TYPE(POINT);
-DECL_WINELIB_TYPE(LPPOINT);
+DECL_WINELIB_TYPE(POINT)
+DECL_WINELIB_TYPE(LPPOINT)
#define CONV_POINT16TO32(p16,p32) \
((p32)->x = (INT32)(p16)->x, (p32)->y = (INT32)(p16)->y)
@@ -75,8 +75,8 @@
INT32 bottom;
} RECT32, *LPRECT32;
-DECL_WINELIB_TYPE(RECT);
-DECL_WINELIB_TYPE(LPRECT);
+DECL_WINELIB_TYPE(RECT)
+DECL_WINELIB_TYPE(LPRECT)
#define CONV_RECT16TO32(r16,r32) \
((r32)->left = (INT32)(r16)->left, (r32)->top = (INT32)(r16)->top, \
@@ -85,6 +85,13 @@
((r16)->left = (INT16)(r32)->left, (r16)->top = (INT16)(r32)->top, \
(r16)->right = (INT16)(r32)->right, (r16)->bottom = (INT16)(r32)->bottom)
+
+typedef struct tagCOORD {
+ INT16 x;
+ INT16 y;
+} COORD, *LPCOORD;
+
+
typedef struct
{
WORD wFirst;
@@ -99,8 +106,8 @@
INT32 iKernAmount;
} KERNINGPAIR32, *LPKERNINGPAIR32;
-DECL_WINELIB_TYPE(KERNINGPAIR);
-DECL_WINELIB_TYPE(LPKERNINGPAIR);
+DECL_WINELIB_TYPE(KERNINGPAIR)
+DECL_WINELIB_TYPE(LPKERNINGPAIR)
typedef struct
{
@@ -122,10 +129,39 @@
BYTE rgbReserved[32];
} PAINTSTRUCT32, *LPPAINTSTRUCT32;
-DECL_WINELIB_TYPE(PAINTSTRUCT);
-DECL_WINELIB_TYPE(LPPAINTSTRUCT);
+DECL_WINELIB_TYPE(PAINTSTRUCT)
+DECL_WINELIB_TYPE(LPPAINTSTRUCT)
+typedef struct tagPIXELFORMATDESCRIPTOR {
+ WORD nSize;
+ WORD nVersion;
+ DWORD dwFlags;
+ BYTE iPixelType;
+ BYTE cColorBits;
+ BYTE cRedBits;
+ BYTE cRedShift;
+ BYTE cGreenBits;
+ BYTE cGreenShift;
+ BYTE cBlueBits;
+ BYTE cBlueShift;
+ BYTE cAlphaBits;
+ BYTE cAlphaShift;
+ BYTE cAccumBits;
+ BYTE cAccumRedBits;
+ BYTE cAccumGreenBits;
+ BYTE cAccumBlueBits;
+ BYTE cAccumAlphaBits;
+ BYTE cDepthBits;
+ BYTE cStencilBits;
+ BYTE cAuxBuffers;
+ BYTE iLayerType;
+ BYTE bReserved;
+ DWORD dwLayerMask;
+ DWORD dwVisibleMask;
+ DWORD dwDamageMask;
+} PIXELFORMATDESCRIPTOR, *LPPIXELFORMATDESCRIPTOR;
+
/* Windows */
typedef struct
@@ -176,8 +212,8 @@
DWORD dwExStyle;
} CREATESTRUCT32W, *LPCREATESTRUCT32W;
-DECL_WINELIB_TYPE_AW(CREATESTRUCT);
-DECL_WINELIB_TYPE_AW(LPCREATESTRUCT);
+DECL_WINELIB_TYPE_AW(CREATESTRUCT)
+DECL_WINELIB_TYPE_AW(LPCREATESTRUCT)
typedef struct
{
@@ -191,8 +227,8 @@
UINT32 idFirstChild;
} CLIENTCREATESTRUCT32, *LPCLIENTCREATESTRUCT32;
-DECL_WINELIB_TYPE(CLIENTCREATESTRUCT);
-DECL_WINELIB_TYPE(LPCLIENTCREATESTRUCT);
+DECL_WINELIB_TYPE(CLIENTCREATESTRUCT)
+DECL_WINELIB_TYPE(LPCLIENTCREATESTRUCT)
typedef struct
{
@@ -233,8 +269,8 @@
LPARAM lParam;
} MDICREATESTRUCT32W, *LPMDICREATESTRUCT32W;
-DECL_WINELIB_TYPE_AW(MDICREATESTRUCT);
-DECL_WINELIB_TYPE_AW(LPMDICREATESTRUCT);
+DECL_WINELIB_TYPE_AW(MDICREATESTRUCT)
+DECL_WINELIB_TYPE_AW(LPMDICREATESTRUCT)
#define MDITILE_VERTICAL 0x0000
#define MDITILE_HORIZONTAL 0x0001
@@ -289,7 +325,7 @@
POINT32 ptMaxTrackSize;
} MINMAXINFO32;
-DECL_WINELIB_TYPE(MINMAXINFO);
+DECL_WINELIB_TYPE(MINMAXINFO)
/* RedrawWindow() flags */
#define RDW_INVALIDATE 0x0001
@@ -334,7 +370,7 @@
UINT32 flags;
} WINDOWPOS32;
-DECL_WINELIB_TYPE(WINDOWPOS);
+DECL_WINELIB_TYPE(WINDOWPOS)
/* SetWindowPlacement() struct */
typedef struct
@@ -357,8 +393,8 @@
RECT32 rcNormalPosition WINE_PACKED;
} WINDOWPLACEMENT32, *LPWINDOWPLACEMENT32;
-DECL_WINELIB_TYPE(WINDOWPLACEMENT);
-DECL_WINELIB_TYPE(LPWINDOWPLACEMENT);
+DECL_WINELIB_TYPE(WINDOWPLACEMENT)
+DECL_WINELIB_TYPE(LPWINDOWPLACEMENT)
/* WINDOWPLACEMENT flags */
#define WPF_SETMINPOSITION 0x0001
@@ -388,8 +424,8 @@
WINDOWPOS32 *lppos;
} NCCALCSIZE_PARAMS32, *LPNCCALCSIZE_PARAMS32;
-DECL_WINELIB_TYPE(NCCALCSIZE_PARAMS);
-DECL_WINELIB_TYPE(LPNCCALCSIZE_PARAMS);
+DECL_WINELIB_TYPE(NCCALCSIZE_PARAMS)
+DECL_WINELIB_TYPE(LPNCCALCSIZE_PARAMS)
/* WM_NCCALCSIZE return flags */
#define WVR_ALIGNTOP 0x0010
@@ -489,8 +525,8 @@
LPCWSTR lpszClassName;
} WNDCLASS32W, *LPWNDCLASS32W;
-DECL_WINELIB_TYPE_AW(WNDCLASS);
-DECL_WINELIB_TYPE_AW(LPWNDCLASS);
+DECL_WINELIB_TYPE_AW(WNDCLASS)
+DECL_WINELIB_TYPE_AW(LPWNDCLASS)
typedef struct
{
@@ -540,8 +576,8 @@
HICON32 hIconSm;
} WNDCLASSEX32W, *LPWNDCLASSEX32W;
-DECL_WINELIB_TYPE_AW(WNDCLASSEX);
-DECL_WINELIB_TYPE_AW(LPWNDCLASSEX);
+DECL_WINELIB_TYPE_AW(WNDCLASSEX)
+DECL_WINELIB_TYPE_AW(LPWNDCLASSEX)
#define CS_VREDRAW 0x0001
#define CS_HREDRAW 0x0002
@@ -645,8 +681,8 @@
HWND32 hwnd;
} EVENTMSG32, *LPEVENTMSG32;
-DECL_WINELIB_TYPE(EVENTMSG);
-DECL_WINELIB_TYPE(LPEVENTMSG);
+DECL_WINELIB_TYPE(EVENTMSG)
+DECL_WINELIB_TYPE(LPEVENTMSG)
/* Mouse hook structure */
@@ -666,8 +702,8 @@
DWORD dwExtraInfo;
} MOUSEHOOKSTRUCT32, *LPMOUSEHOOKSTRUCT32;
-DECL_WINELIB_TYPE(MOUSEHOOKSTRUCT);
-DECL_WINELIB_TYPE(LPMOUSEHOOKSTRUCT);
+DECL_WINELIB_TYPE(MOUSEHOOKSTRUCT)
+DECL_WINELIB_TYPE(LPMOUSEHOOKSTRUCT)
/* Hardware hook structure */
@@ -687,8 +723,8 @@
LPARAM lParam;
} HARDWAREHOOKSTRUCT32, *LPHARDWAREHOOKSTRUCT32;
-DECL_WINELIB_TYPE(HARDWAREHOOKSTRUCT);
-DECL_WINELIB_TYPE(LPHARDWAREHOOKSTRUCT);
+DECL_WINELIB_TYPE(HARDWAREHOOKSTRUCT)
+DECL_WINELIB_TYPE(LPHARDWAREHOOKSTRUCT)
/* CBT hook values */
#define HCBT_MOVESIZE 0
@@ -722,8 +758,8 @@
HWND32 hwndInsertAfter;
} CBT_CREATEWND32W, *LPCBT_CREATEWND32W;
-DECL_WINELIB_TYPE_AW(CBT_CREATEWND);
-DECL_WINELIB_TYPE_AW(LPCBT_CREATEWND);
+DECL_WINELIB_TYPE_AW(CBT_CREATEWND)
+DECL_WINELIB_TYPE_AW(LPCBT_CREATEWND)
typedef struct
{
@@ -737,8 +773,8 @@
HWND32 hWndActive;
} CBTACTIVATESTRUCT32, *LPCBTACTIVATESTRUCT32;
-DECL_WINELIB_TYPE(CBTACTIVATESTRUCT);
-DECL_WINELIB_TYPE(LPCBTACTIVATESTRUCT);
+DECL_WINELIB_TYPE(CBTACTIVATESTRUCT)
+DECL_WINELIB_TYPE(LPCBTACTIVATESTRUCT)
/* Shell hook values */
#define HSHELL_WINDOWCREATED 1
@@ -765,8 +801,94 @@
INT32 code;
} DEBUGHOOKINFO32, *LPDEBUGHOOKINFO32;
-DECL_WINELIB_TYPE(DEBUGHOOKINFO);
-DECL_WINELIB_TYPE(LPDEBUGHOOKINFO);
+DECL_WINELIB_TYPE(DEBUGHOOKINFO)
+DECL_WINELIB_TYPE(LPDEBUGHOOKINFO)
+
+typedef DWORD (CALLBACK *LPTHREAD_START_ROUTINE)(LPVOID);
+
+/* This is also defined in winnt.h */
+/* typedef struct _EXCEPTION_RECORD {
+ DWORD ExceptionCode;
+ DWORD ExceptionFlags;
+ struct _EXCEPTION_RECORD *ExceptionRecord;
+ LPVOID ExceptionAddress;
+ DWORD NumberParameters;
+ DWORD ExceptionInformation[15];
+} EXCEPTION_RECORD; */
+
+typedef struct _EXCEPTION_DEBUG_INFO {
+/* EXCEPTION_RECORD ExceptionRecord; */
+ DWORD dwFirstChange;
+} EXCEPTION_DEBUG_INFO;
+
+typedef struct _CREATE_THREAD_DEBUG_INFO {
+ HANDLE32 hThread;
+ LPVOID lpThreadLocalBase;
+ LPTHREAD_START_ROUTINE lpStartAddress;
+} CREATE_THREAD_DEBUG_INFO;
+
+typedef struct _CREATE_PROCESS_DEBUG_INFO {
+ HANDLE32 hFile;
+ HANDLE32 hProcess;
+ HANDLE32 hThread;
+ LPVOID lpBaseOfImage;
+ DWORD dwDebugInfoFileOffset;
+ DWORD nDebugInfoSize;
+ LPVOID lpThreadLocalBase;
+ LPTHREAD_START_ROUTINE lpStartAddress;
+ LPVOID lpImageName;
+ WORD fUnicode;
+} CREATE_PROCESS_DEBUG_INFO;
+
+typedef struct _EXIT_THREAD_DEBUG_INFO {
+ DWORD dwExitCode;
+} EXIT_THREAD_DEBUG_INFO;
+
+typedef struct _EXIT_PROCESS_DEBUG_INFO {
+ DWORD dwExitCode;
+} EXIT_PROCESS_DEBUG_INFO;
+
+typedef struct _LOAD_DLL_DEBUG_INFO {
+ HANDLE32 hFile;
+ LPVOID lpBaseOfDll;
+ DWORD dwDebugInfoFileOffset;
+ DWORD nDebugInfoSize;
+ LPVOID lpImageName;
+ WORD fUnicode;
+} LOAD_DLL_DEBUG_INFO;
+
+typedef struct _UNLOAD_DLL_DEBUG_INFO {
+ LPVOID lpBaseOfDll;
+} UNLOAD_DLL_DEBUG_INFO;
+
+typedef struct _OUTPUT_DEBUG_STRING_INFO {
+ LPSTR lpDebugStringData;
+ WORD fUnicode;
+ WORD nDebugStringLength;
+} OUTPUT_DEBUG_STRING_INFO;
+
+typedef struct _RIP_INFO {
+ DWORD dwError;
+ DWORD dwType;
+} RIP_INFO;
+
+typedef struct _DEBUG_EVENT {
+ DWORD dwDebugEventCode;
+ DWORD dwProcessId;
+ DWORD dwThreadId;
+ union {
+ EXCEPTION_DEBUG_INFO Exception;
+ CREATE_THREAD_DEBUG_INFO CreateThread;
+ CREATE_PROCESS_DEBUG_INFO CreateProcessInfo;
+ EXIT_THREAD_DEBUG_INFO ExitThread;
+ EXIT_PROCESS_DEBUG_INFO ExitProcess;
+ LOAD_DLL_DEBUG_INFO LoadDll;
+ UNLOAD_DLL_DEBUG_INFO UnloadDll;
+ OUTPUT_DEBUG_STRING_INFO DebugString;
+ RIP_INFO RipInfo;
+ } u;
+} DEBUG_EVENT, *LPDEBUG_EVENT;
+
/***** Dialogs *****/
@@ -841,8 +963,8 @@
POINT32 pt;
} MSG32, *LPMSG32;
-DECL_WINELIB_TYPE(MSG);
-DECL_WINELIB_TYPE(LPMSG);
+DECL_WINELIB_TYPE(MSG)
+DECL_WINELIB_TYPE(LPMSG)
/* Raster operations */
@@ -966,8 +1088,8 @@
LPVOID bmBits WINE_PACKED;
} BITMAP32, *LPBITMAP32;
-DECL_WINELIB_TYPE(BITMAP);
-DECL_WINELIB_TYPE(LPBITMAP);
+DECL_WINELIB_TYPE(BITMAP)
+DECL_WINELIB_TYPE(LPBITMAP)
/* Brushes */
@@ -985,8 +1107,8 @@
INT32 lbHatch;
} LOGBRUSH32, *LPLOGBRUSH32;
-DECL_WINELIB_TYPE(LOGBRUSH);
-DECL_WINELIB_TYPE(LPLOGBRUSH);
+DECL_WINELIB_TYPE(LOGBRUSH)
+DECL_WINELIB_TYPE(LPLOGBRUSH)
/* Brush styles */
#define BS_SOLID 0
@@ -1072,8 +1194,8 @@
WCHAR lfFaceName[LF_FACESIZE];
} LOGFONT32W, *LPLOGFONT32W;
-DECL_WINELIB_TYPE_AW(LOGFONT);
-DECL_WINELIB_TYPE_AW(LPLOGFONT);
+DECL_WINELIB_TYPE_AW(LOGFONT)
+DECL_WINELIB_TYPE_AW(LPLOGFONT)
typedef struct
{
@@ -1120,9 +1242,9 @@
WCHAR elfScript[LF_FACESIZE] WINE_PACKED;
} ENUMLOGFONTEX32W,*LPENUMLOGFONTEX32W;
-DECL_WINELIB_TYPE_AW(ENUMLOGFONT);
-DECL_WINELIB_TYPE_AW(LPENUMLOGFONT);
-DECL_WINELIB_TYPE_AW(LPENUMLOGFONTEX);
+DECL_WINELIB_TYPE_AW(ENUMLOGFONT)
+DECL_WINELIB_TYPE_AW(LPENUMLOGFONT)
+DECL_WINELIB_TYPE_AW(LPENUMLOGFONTEX)
typedef struct
{
@@ -1341,8 +1463,8 @@
BYTE tmCharSet;
} TEXTMETRIC32W, *LPTEXTMETRIC32W;
-DECL_WINELIB_TYPE_AW(TEXTMETRIC);
-DECL_WINELIB_TYPE_AW(LPTEXTMETRIC);
+DECL_WINELIB_TYPE_AW(TEXTMETRIC)
+DECL_WINELIB_TYPE_AW(LPTEXTMETRIC)
/* ntmFlags field flags */
#define NTM_REGULAR 0x00000040L
@@ -1433,8 +1555,8 @@
UINT32 ntmAvgWidth;
} NEWTEXTMETRIC32W, *LPNEWTEXTMETRIC32W;
-DECL_WINELIB_TYPE_AW(NEWTEXTMETRIC);
-DECL_WINELIB_TYPE_AW(LPNEWTEXTMETRIC);
+DECL_WINELIB_TYPE_AW(NEWTEXTMETRIC)
+DECL_WINELIB_TYPE_AW(LPNEWTEXTMETRIC)
typedef struct
{
@@ -1454,8 +1576,8 @@
FONTSIGNATURE ntmeFontSignature;
} NEWTEXTMETRICEX32W,*LPNEWTEXTMETRICEX32W;
-DECL_WINELIB_TYPE_AW(NEWTEXTMETRICEX);
-DECL_WINELIB_TYPE_AW(LPNEWTEXTMETRICEX);
+DECL_WINELIB_TYPE_AW(NEWTEXTMETRICEX)
+DECL_WINELIB_TYPE_AW(LPNEWTEXTMETRICEX)
typedef INT16 (CALLBACK *FONTENUMPROC16)(SEGPTR,SEGPTR,UINT16,LPARAM);
@@ -1463,12 +1585,12 @@
UINT32,LPARAM);
typedef INT32 (CALLBACK *FONTENUMPROC32W)(LPENUMLOGFONT32W,LPNEWTEXTMETRIC32W,
UINT32,LPARAM);
-DECL_WINELIB_TYPE_AW(FONTENUMPROC);
+DECL_WINELIB_TYPE_AW(FONTENUMPROC)
typedef INT16 (CALLBACK *FONTENUMPROCEX16)(SEGPTR,SEGPTR,UINT16,LPARAM);
typedef INT32 (CALLBACK *FONTENUMPROCEX32A)(LPENUMLOGFONTEX32A,LPNEWTEXTMETRICEX32A,UINT32,LPARAM);
typedef INT32 (CALLBACK *FONTENUMPROCEX32W)(LPENUMLOGFONTEX32W,LPNEWTEXTMETRICEX32W,UINT32,LPARAM);
-DECL_WINELIB_TYPE_AW(FONTENUMPROCEX);
+DECL_WINELIB_TYPE_AW(FONTENUMPROCEX)
/* tmPitchAndFamily bits */
#define TMPF_FIXED_PITCH 1 /* means variable pitch */
@@ -1509,8 +1631,8 @@
INT16 gmCellIncY;
} GLYPHMETRICS32, *LPGLYPHMETRICS32;
-DECL_WINELIB_TYPE(GLYPHMETRICS);
-DECL_WINELIB_TYPE(LPGLYPHMETRICS);
+DECL_WINELIB_TYPE(GLYPHMETRICS)
+DECL_WINELIB_TYPE(LPGLYPHMETRICS)
#define GGO_METRICS 0
#define GGO_BITMAP 1
@@ -1545,8 +1667,8 @@
INT32 abcC;
} ABC32, *LPABC32;
-DECL_WINELIB_TYPE(ABC);
-DECL_WINELIB_TYPE(LPABC);
+DECL_WINELIB_TYPE(ABC)
+DECL_WINELIB_TYPE(LPABC)
/* Rasterizer status */
typedef struct
@@ -1596,8 +1718,8 @@
COLORREF lopnColor WINE_PACKED;
} LOGPEN32, *LPLOGPEN32;
-DECL_WINELIB_TYPE(LOGPEN);
-DECL_WINELIB_TYPE(LPLOGPEN);
+DECL_WINELIB_TYPE(LOGPEN)
+DECL_WINELIB_TYPE(LPLOGPEN)
#define PS_SOLID 0x00000000
#define PS_DASH 0x00000001
@@ -2000,11 +2122,10 @@
BYTE pad0;
WORD key;
WORD cmd;
- WORD pad1;
} ACCEL32, *LPACCEL32;
-DECL_WINELIB_TYPE(ACCEL);
-DECL_WINELIB_TYPE(LPACCEL);
+DECL_WINELIB_TYPE(ACCEL)
+DECL_WINELIB_TYPE(LPACCEL)
/* modifiers for RegisterHotKey */
#define MOD_ALT 0x0001
@@ -2100,6 +2221,9 @@
BOOL32 bInheritHandle;
} SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
+typedef DWORD SECURITY_INFORMATION;
+
+
/* 64 bit number of 100 nanoseconds intervals since January 1, 1601 */
typedef struct
{
@@ -2136,8 +2260,8 @@
WCHAR cAlternateFileName[14];
} WIN32_FIND_DATA32W, *LPWIN32_FIND_DATA32W;
-DECL_WINELIB_TYPE_AW(WIN32_FIND_DATA);
-DECL_WINELIB_TYPE_AW(LPWIN32_FIND_DATA);
+DECL_WINELIB_TYPE_AW(WIN32_FIND_DATA)
+DECL_WINELIB_TYPE_AW(LPWIN32_FIND_DATA)
#define INVALID_HANDLE_VALUE16 ((HANDLE16) -1)
#define INVALID_HANDLE_VALUE32 ((HANDLE32) -1)
@@ -2302,8 +2426,8 @@
char EvtChar;
} DCB32, *LPDCB32;
-DECL_WINELIB_TYPE(DCB);
-DECL_WINELIB_TYPE(LPDCB);
+DECL_WINELIB_TYPE(DCB)
+DECL_WINELIB_TYPE(LPDCB)
#define RTS_CONTROL_DISABLE 0
#define RTS_CONTROL_ENABLE 1
@@ -3164,8 +3288,8 @@
UINT32 cch;
} MENUITEMINFO32W, *LPMENUITEMINFO32W;
-DECL_WINELIB_TYPE_AW(MENUITEMINFO);
-DECL_WINELIB_TYPE_AW(LPMENUITEMINFO);
+DECL_WINELIB_TYPE_AW(MENUITEMINFO)
+DECL_WINELIB_TYPE_AW(LPMENUITEMINFO)
/* Field specifiers for MENUITEMINFO[AW] type. */
#define MIIM_STATE 0x00000001
@@ -3323,7 +3447,7 @@
/* DrawState defines ... */
typedef BOOL16 (CALLBACK *DRAWSTATEPROC16)(HDC16,LPARAM,WPARAM16,INT16,INT16);
typedef BOOL32 (CALLBACK *DRAWSTATEPROC32)(HDC32,LPARAM,WPARAM32,INT32,INT32);
-DECL_WINELIB_TYPE(DRAWSTATEPROC);
+DECL_WINELIB_TYPE(DRAWSTATEPROC)
/* Image type */
#define DST_COMPLEX 0x0000
@@ -4069,9 +4193,9 @@
DWORD itemData WINE_PACKED;
} DRAWITEMSTRUCT32, *PDRAWITEMSTRUCT32, *LPDRAWITEMSTRUCT32;
-DECL_WINELIB_TYPE(DRAWITEMSTRUCT);
-DECL_WINELIB_TYPE(PDRAWITEMSTRUCT);
-DECL_WINELIB_TYPE(LPDRAWITEMSTRUCT);
+DECL_WINELIB_TYPE(DRAWITEMSTRUCT)
+DECL_WINELIB_TYPE(PDRAWITEMSTRUCT)
+DECL_WINELIB_TYPE(LPDRAWITEMSTRUCT)
typedef struct
{
@@ -4093,9 +4217,9 @@
DWORD itemData;
} MEASUREITEMSTRUCT32, *PMEASUREITEMSTRUCT32, *LPMEASUREITEMSTRUCT32;
-DECL_WINELIB_TYPE(MEASUREITEMSTRUCT);
-DECL_WINELIB_TYPE(PMEASUREITEMSTRUCT);
-DECL_WINELIB_TYPE(LPMEASUREITEMSTRUCT);
+DECL_WINELIB_TYPE(MEASUREITEMSTRUCT)
+DECL_WINELIB_TYPE(PMEASUREITEMSTRUCT)
+DECL_WINELIB_TYPE(LPMEASUREITEMSTRUCT)
typedef struct
{
@@ -4115,8 +4239,8 @@
DWORD itemData;
} DELETEITEMSTRUCT32, *LPDELETEITEMSTRUCT32;
-DECL_WINELIB_TYPE(DELETEITEMSTRUCT);
-DECL_WINELIB_TYPE(LPDELETEITEMSTRUCT);
+DECL_WINELIB_TYPE(DELETEITEMSTRUCT)
+DECL_WINELIB_TYPE(LPDELETEITEMSTRUCT)
typedef struct
{
@@ -4141,8 +4265,8 @@
DWORD dwLocaleId;
} COMPAREITEMSTRUCT32, *LPCOMPAREITEMSTRUCT32;
-DECL_WINELIB_TYPE(COMPAREITEMSTRUCT);
-DECL_WINELIB_TYPE(LPCOMPAREITEMSTRUCT);
+DECL_WINELIB_TYPE(COMPAREITEMSTRUCT)
+DECL_WINELIB_TYPE(LPCOMPAREITEMSTRUCT)
/* WM_KEYUP/DOWN/CHAR HIWORD(lParam) flags */
#define KF_EXTENDED 0x0100
@@ -4431,8 +4555,8 @@
HGDIOBJ32 objectHandle[1];
} HANDLETABLE32, *LPHANDLETABLE32;
-DECL_WINELIB_TYPE(HANDLETABLE);
-DECL_WINELIB_TYPE(LPHANDLETABLE);
+DECL_WINELIB_TYPE(HANDLETABLE)
+DECL_WINELIB_TYPE(LPHANDLETABLE)
/* Clipboard metafile picture structure */
typedef struct
@@ -4451,8 +4575,8 @@
HMETAFILE32 hMF;
} METAFILEPICT32, *LPMETAFILEPICT32;
-DECL_WINELIB_TYPE(METAFILEPICT);
-DECL_WINELIB_TYPE(LPMETAFILEPICT);
+DECL_WINELIB_TYPE(METAFILEPICT)
+DECL_WINELIB_TYPE(LPMETAFILEPICT)
/* Metafile functions */
#define META_SETBKCOLOR 0x0201
@@ -4539,7 +4663,7 @@
INT16,LPARAM);
typedef INT32 (CALLBACK *MFENUMPROC32)(HDC32,HANDLETABLE32*,METARECORD*,
INT32,LPARAM);
-DECL_WINELIB_TYPE(MFENUMPROC);
+DECL_WINELIB_TYPE(MFENUMPROC)
/* enhanced metafile structures and functions */
@@ -4916,8 +5040,8 @@
HANDLE32 hStdError;
} STARTUPINFO32W, *LPSTARTUPINFO32W;
-DECL_WINELIB_TYPE_AW(STARTUPINFO);
-DECL_WINELIB_TYPE_AW(LPSTARTUPINFO);
+DECL_WINELIB_TYPE_AW(STARTUPINFO)
+DECL_WINELIB_TYPE_AW(LPSTARTUPINFO)
typedef struct {
HANDLE32 hProcess;
@@ -5172,8 +5296,8 @@
DWORD dmReserved2;
} DEVMODE32W, *LPDEVMODE32W;
-DECL_WINELIB_TYPE_AW(DEVMODE);
-DECL_WINELIB_TYPE_AW(LPDEVMODE);
+DECL_WINELIB_TYPE_AW(DEVMODE)
+DECL_WINELIB_TYPE_AW(LPDEVMODE)
typedef struct _PRINTER_DEFAULTS32A {
LPSTR pDatatype;
@@ -5187,8 +5311,8 @@
ACCESS_MASK DesiredAccess;
} PRINTER_DEFAULTS32W, *LPPRINTER_DEFAULTS32W;
-DECL_WINELIB_TYPE_AW(PRINTER_DEFAULTS);
-DECL_WINELIB_TYPE_AW(LPPRINTER_DEFAULTS);
+DECL_WINELIB_TYPE_AW(PRINTER_DEFAULTS)
+DECL_WINELIB_TYPE_AW(LPPRINTER_DEFAULTS)
typedef struct _SYSTEM_POWER_STATUS
{
@@ -5267,14 +5391,13 @@
DWORD Type;
} MEMORY_BASIC_INFORMATION,*LPMEMORY_BASIC_INFORMATION;
-typedef DWORD (CALLBACK *LPTHREAD_START_ROUTINE)(LPVOID);
typedef BOOL32 (CALLBACK *CODEPAGE_ENUMPROC32A)(LPSTR);
typedef BOOL32 (CALLBACK *CODEPAGE_ENUMPROC32W)(LPWSTR);
-DECL_WINELIB_TYPE_AW(CODEPAGE_ENUMPROC);
+DECL_WINELIB_TYPE_AW(CODEPAGE_ENUMPROC)
typedef BOOL32 (CALLBACK *LOCALE_ENUMPROC32A)(LPSTR);
typedef BOOL32 (CALLBACK *LOCALE_ENUMPROC32W)(LPWSTR);
-DECL_WINELIB_TYPE_AW(LOCALE_ENUMPROC);
+DECL_WINELIB_TYPE_AW(LOCALE_ENUMPROC)
typedef struct tagSYSTEM_INFO
{
@@ -5313,7 +5436,7 @@
/* service main function prototype */
typedef VOID (CALLBACK *LPSERVICE_MAIN_FUNCTION32A)(DWORD,LPSTR);
typedef VOID (CALLBACK *LPSERVICE_MAIN_FUNCTION32W)(DWORD,LPWSTR);
-DECL_WINELIB_TYPE_AW(LPSERVICE_MAIN_FUNCTION);
+DECL_WINELIB_TYPE_AW(LPSERVICE_MAIN_FUNCTION)
/* service start table */
typedef struct
@@ -5328,8 +5451,20 @@
LPSERVICE_MAIN_FUNCTION32W lpServiceProc;
} *LPSERVICE_TABLE_ENTRY32W, SERVICE_TABLE_ENTRY32W;
-DECL_WINELIB_TYPE_AW(SERVICE_TABLE_ENTRY);
-DECL_WINELIB_TYPE_AW(LPSERVICE_TABLE_ENTRY);
+DECL_WINELIB_TYPE_AW(SERVICE_TABLE_ENTRY)
+DECL_WINELIB_TYPE_AW(LPSERVICE_TABLE_ENTRY)
+
+/* Used by: ControlService */
+typedef struct _SERVICE_STATUS {
+ DWORD dwServiceType;
+ DWORD dwCurrentState;
+ DWORD dwControlsAccepted;
+ DWORD dwWin32ExitCode;
+ DWORD dwServiceSpecificExitCode;
+ DWORD dwCheckPoint;
+ DWORD dwWaitHint;
+} SERVICE_STATUS, *LPSERVICE_STATUS;
+
/* {G,S}etPriorityClass */
#define NORMAL_PRIORITY_CLASS 0x00000020
@@ -5440,9 +5575,9 @@
typedef BOOL32 (CALLBACK *ENUMRESLANGPROC32A)(HMODULE32,LPCSTR,LPCSTR,WORD,LONG);
typedef BOOL32 (CALLBACK *ENUMRESLANGPROC32W)(HMODULE32,LPCWSTR,LPCWSTR,WORD,LONG);
-DECL_WINELIB_TYPE_AW(ENUMRESTYPEPROC);
-DECL_WINELIB_TYPE_AW(ENUMRESNAMEPROC);
-DECL_WINELIB_TYPE_AW(ENUMRESLANGPROC);
+DECL_WINELIB_TYPE_AW(ENUMRESTYPEPROC)
+DECL_WINELIB_TYPE_AW(ENUMRESNAMEPROC)
+DECL_WINELIB_TYPE_AW(ENUMRESLANGPROC)
/* Character Type Flags */
#define CT_CTYPE1 0x00000001 /* usual ctype */
@@ -5519,8 +5654,8 @@
DWORD fwType;
} DOCINFO32W, *LPDOCINFO32W;
-DECL_WINELIB_TYPE_AW(DOCINFO);
-DECL_WINELIB_TYPE_AW(LPDOCINFO);
+DECL_WINELIB_TYPE_AW(DOCINFO)
+DECL_WINELIB_TYPE_AW(LPDOCINFO)
typedef struct {
DWORD dwScope;
@@ -5544,8 +5679,8 @@
LPWSTR lpProvider;
} NETRESOURCE32W,*LPNETRESOURCE32W;
-DECL_WINELIB_TYPE_AW(NETRESOURCE);
-DECL_WINELIB_TYPE_AW(LPNETRESOURCE);
+DECL_WINELIB_TYPE_AW(NETRESOURCE)
+DECL_WINELIB_TYPE_AW(LPNETRESOURCE)
typedef struct {
DWORD cbStructure;
@@ -5609,8 +5744,8 @@
LOGFONT32W lfMessageFont;
} NONCLIENTMETRICS32W,*LPNONCLIENTMETRICS32W;
-DECL_WINELIB_TYPE_AW(NONCLIENTMETRICS);
-DECL_WINELIB_TYPE_AW(LPNONCLIENTMETRICS);
+DECL_WINELIB_TYPE_AW(NONCLIENTMETRICS)
+DECL_WINELIB_TYPE_AW(LPNONCLIENTMETRICS)
typedef struct tagANIMATIONINFO
{
@@ -5731,8 +5866,8 @@
DWORD dwLanguageId;
} MSGBOXPARAMS32W,*LPMSGBOXPARAMS32W;
-DECL_WINELIB_TYPE_AW(MSGBOXPARAMS);
-DECL_WINELIB_TYPE_AW(LPMSGBOXPARAMS);
+DECL_WINELIB_TYPE_AW(MSGBOXPARAMS)
+DECL_WINELIB_TYPE_AW(LPMSGBOXPARAMS)
/* for WOWHandle{16,32} */
typedef enum _WOW_HANDLE_TYPE { /* WOW */
@@ -5759,13 +5894,35 @@
#define WCB16_PASCAL 0x0
#define WCB16_CDECL 0x1
+typedef struct _numberfmt32a {
+ UINT32 NumDigits;
+ UINT32 LeadingZero;
+ UINT32 Grouping;
+ LPCSTR lpDecimalSep;
+ LPCSTR lpThousandSep;
+ UINT32 NegativeOrder;
+} NUMBERFMT32A;
+
+typedef struct _numberfmt32w {
+ UINT32 NumDigits;
+ UINT32 LeadingZero;
+ UINT32 Grouping;
+ LPCWSTR lpDecimalSep;
+ LPCWSTR lpThousandSep;
+ UINT32 NegativeOrder;
+} NUMBERFMT32W;
+
+
+
+
#pragma pack(4)
/* Declarations for functions that exist only in Win16 */
-#ifndef WINELIB
+#ifdef __WINE__
WORD WINAPI AllocCStoDSAlias(WORD);
WORD WINAPI AllocDStoCSAlias(WORD);
+HGLOBAL16 WINAPI AllocResource(HINSTANCE16,HRSRC16,DWORD);
WORD WINAPI AllocSelector(WORD);
WORD WINAPI AllocSelectorArray(WORD);
VOID WINAPI CalcChildScroll(HWND16,WORD);
@@ -5916,7 +6073,7 @@
INT16 WINAPI WriteComm(INT16,LPSTR,INT16);
VOID WINAPI WriteOutProfiles(VOID);
VOID WINAPI hmemcpy(LPVOID,LPCVOID,LONG);
-#endif /* WINELIB */
+#endif /* __WINE__ */
/* Declarations for functions that exist only in Win32 */
@@ -5925,15 +6082,18 @@
BOOL32 WINAPI Beep(DWORD,DWORD);
BOOL32 WINAPI ClearCommError(INT32,LPDWORD,LPCOMSTAT);
BOOL32 WINAPI CloseHandle(HANDLE32);
+BOOL32 WINAPI CloseServiceHandle(HANDLE32);
INT32 WINAPI CopyAcceleratorTable32A(HACCEL32,LPACCEL32,INT32);
INT32 WINAPI CopyAcceleratorTable32W(HACCEL32,LPACCEL32,INT32);
#define CopyAcceleratorTable WINELIB_NAME_AW(CopyAcceleratorTable)
HENHMETAFILE32 WINAPI CopyEnhMetaFile32A(HENHMETAFILE32,LPCSTR);
+HENHMETAFILE32 WINAPI CopyEnhMetaFile32W(HENHMETAFILE32,LPCWSTR);
#define CopyEnhMetaFile WINELIB_NAME_AW(CopyEnhMetaFile)
BOOL32 WINAPI CopyFile32A(LPCSTR,LPCSTR,BOOL32);
BOOL32 WINAPI CopyFile32W(LPCWSTR,LPCWSTR,BOOL32);
#define CopyFile WINELIB_NAME_AW(CopyFile)
INT32 WINAPI CompareFileTime(LPFILETIME,LPFILETIME);
+BOOL32 WINAPI ControlService(HANDLE32,DWORD,LPSERVICE_STATUS);
HANDLE32 WINAPI CreateEvent32A(LPSECURITY_ATTRIBUTES,BOOL32,BOOL32,LPCSTR);
HANDLE32 WINAPI CreateEvent32W(LPSECURITY_ATTRIBUTES,BOOL32,BOOL32,LPCWSTR);
#define CreateEvent WINELIB_NAME_AW(CreateEvent)
@@ -5957,6 +6117,8 @@
#define CreateSemaphore WINELIB_NAME_AW(CreateSemaphore)
HANDLE32 WINAPI CreateThread(LPSECURITY_ATTRIBUTES,DWORD,LPTHREAD_START_ROUTINE,LPVOID,DWORD,LPDWORD);
BOOL32 WINAPI DeleteEnhMetaFile(HENHMETAFILE32);
+BOOL32 WINAPI DeleteService(HANDLE32);
+BOOL32 WINAPI DeregisterEventSource(HANDLE32);
BOOL32 WINAPI DestroyAcceleratorTable(HACCEL32);
BOOL32 WINAPI DisableThreadLibraryCalls(HMODULE32);
BOOL32 WINAPI DosDateTimeToFileTime(WORD,WORD,LPFILETIME);
@@ -5994,8 +6156,8 @@
BOOL32 WINAPI FileTimeToDosDateTime(const FILETIME*,LPWORD,LPWORD);
BOOL32 WINAPI FileTimeToLocalFileTime(const FILETIME*,LPFILETIME);
BOOL32 WINAPI FileTimeToSystemTime(const FILETIME*,LPSYSTEMTIME);
-HRSRC32 WINAPI FindResourceEx32A(HINSTANCE32,LPCSTR,LPCSTR,WORD);
-HRSRC32 WINAPI FindResourceEx32W(HINSTANCE32,LPCWSTR,LPCWSTR,WORD);
+HRSRC32 WINAPI FindResourceEx32A(HMODULE32,LPCSTR,LPCSTR,WORD);
+HRSRC32 WINAPI FindResourceEx32W(HMODULE32,LPCWSTR,LPCWSTR,WORD);
#define FindResourceEx WINELIB_NAME_AW(FindResourceEx)
BOOL32 WINAPI FlushConsoleInputBuffer(HANDLE32);
BOOL32 WINAPI FlushFileBuffers(HFILE32);
@@ -6033,6 +6195,7 @@
HENHMETAFILE32 WINAPI GetEnhMetaFile32A(LPCSTR);
HENHMETAFILE32 WINAPI GetEnhMetaFile32W(LPCWSTR);
#define GetEnhMetaFile WINELIB_NAME_AW(GetEnhMetaFile)
+UINT32 WINAPI GetEnhMetaFileBits(HENHMETAFILE32,UINT32,LPBYTE);
UINT32 WINAPI GetEnhMetaFileHeader(HENHMETAFILE32,UINT32,LPENHMETAHEADER);
LPSTR WINAPI GetEnvironmentStrings32A(void);
LPWSTR WINAPI GetEnvironmentStrings32W(void);
@@ -6055,6 +6218,7 @@
BOOL32 WINAPI GetMenuItemInfo32A(HMENU32,UINT32,BOOL32,MENUITEMINFO32A*);
BOOL32 WINAPI GetMenuItemInfo32W(HMENU32,UINT32,BOOL32,MENUITEMINFO32W*);
#define GetMenuItemInfo WINELIB_NAME_AW(GetMenuItemInfo)
+UINT32 WINAPI GetMetaFileBitsEx(HMETAFILE32,UINT32,LPVOID);
BOOL32 WINAPI GetNumberOfConsoleInputEvents(HANDLE32,LPDWORD);
BOOL32 WINAPI GetNumberOfConsoleMouseButtons(LPDWORD);
DWORD WINAPI GetObjectType(HANDLE32);
@@ -6112,6 +6276,9 @@
BOOL32 WINAPI IsValidLocale(DWORD,DWORD);
BOOL32 WINAPI LocalFileTimeToFileTime(const FILETIME*,LPFILETIME);
BOOL32 WINAPI LockFile(HFILE32,DWORD,DWORD,DWORD,DWORD);
+BOOL32 WINAPI LookupPrivilegeValue32A(LPCSTR,LPCSTR,LPVOID);
+BOOL32 WINAPI LookupPrivilegeValue32W(LPCWSTR,LPCWSTR,LPVOID);
+#define LookupPrivilegeValue WINELIB_NAME_AW(LookupPrivilegeValue)
SEGPTR WINAPI MapLS(LPVOID);
LPVOID WINAPI MapSL(SEGPTR);
LPVOID WINAPI MapViewOfFile(HANDLE32,DWORD,DWORD,DWORD,DWORD);
@@ -6138,9 +6305,16 @@
HANDLE32 WINAPI OpenMutex32W(DWORD,BOOL32,LPCWSTR);
#define OpenMutex WINELIB_NAME_AW(OpenMutex)
HANDLE32 WINAPI OpenProcess(DWORD,BOOL32,DWORD);
+BOOL32 WINAPI OpenProcessToken(HANDLE32,DWORD,HANDLE32*);
+HANDLE32 WINAPI OpenSCManager32A(LPCSTR,LPCSTR,DWORD);
+HANDLE32 WINAPI OpenSCManager32W(LPCWSTR,LPCWSTR,DWORD);
+#define OpenSCManager WINELIB_NAME_AW(OpenSCManager)
HANDLE32 WINAPI OpenSemaphore32A(DWORD,BOOL32,LPCSTR);
HANDLE32 WINAPI OpenSemaphore32W(DWORD,BOOL32,LPCWSTR);
#define OpenSemaphore WINELIB_NAME_AW(OpenSemaphore)
+HANDLE32 WINAPI OpenService32A(HANDLE32,LPCSTR,DWORD);
+HANDLE32 WINAPI OpenService32W(HANDLE32,LPCWSTR,DWORD);
+#define OpenService WINELIB_NAME_AW(OpenService)
BOOL32 WINAPI PlayEnhMetaFile(HDC32,HENHMETAFILE32,const RECT32*);
BOOL32 WINAPI PlayEnhMetaFileRecord(HDC32,LPHANDLETABLE32,const ENHMETARECORD*,UINT32);
BOOL32 WINAPI PulseEvent(HANDLE32);
@@ -6162,6 +6336,10 @@
DWORD WINAPI RegEnumKeyEx32W(HKEY,DWORD,LPWSTR,LPDWORD,LPDWORD,LPWSTR,
LPDWORD,LPFILETIME);
#define RegEnumKeyEx WINELIB_NAME_AW(RegEnumKeyEx)
+LONG WINAPI RegGetKeySecurity(HKEY,SECURITY_INFORMATION,LPVOID,LPDWORD);
+HANDLE32 WINAPI RegisterEventSource32A(LPCSTR,LPCSTR);
+HANDLE32 WINAPI RegisterEventSource32W(LPCWSTR,LPCWSTR);
+#define RegisterEventSource WINELIB_NAME_AW(RegisterEventSource)
DWORD WINAPI RegOpenKeyEx32W(HKEY,LPCWSTR,DWORD,REGSAM,LPHKEY);
DWORD WINAPI RegOpenKeyEx32A(HKEY,LPCSTR,DWORD,REGSAM,LPHKEY);
#define RegOpenKeyEx WINELIB_NAME_AW(RegOpenKeyEx)
@@ -6183,11 +6361,17 @@
BOOL32 WINAPI SetBrushOrgEx(HDC32,INT32,INT32,LPPOINT32);
BOOL32 WINAPI SetCommMask(INT32,DWORD);
BOOL32 WINAPI SetCommTimeouts(INT32,LPCOMMTIMEOUTS);
+BOOL32 WINAPI SetComputerName32A(LPCSTR);
+BOOL32 WINAPI SetComputerName32W(LPCWSTR);
+#define SetComputerName WINELIB_NAME_AW(SetComputerName)
+BOOL32 WINAPI SetConsoleCursorPosition(HANDLE32,COORD);
BOOL32 WINAPI SetConsoleMode(HANDLE32,DWORD);
BOOL32 WINAPI SetConsoleTitle32A(LPCSTR);
BOOL32 WINAPI SetConsoleTitle32W(LPCWSTR);
#define SetConsoleTitle WINELIB_NAME_AW(SetConsoleTitle)
+VOID WINAPI SetDebugErrorLevel(DWORD);
BOOL32 WINAPI SetEndOfFile(HFILE32);
+HENHMETAFILE32 WINAPI SetEnhMetaFileBits(UINT32,const BYTE *);
BOOL32 WINAPI SetEnvironmentVariable32A(LPCSTR,LPCSTR);
BOOL32 WINAPI SetEnvironmentVariable32W(LPCWSTR,LPCWSTR);
#define SetEnvironmentVariable WINELIB_NAME_AW(SetEnvironmentVariable)
@@ -6213,6 +6397,9 @@
BOOL32 WINAPI SetWindowContextHelpId(HWND32,DWORD);
BOOL32 WINAPI SetWorldTransform(HDC32,const XFORM*);
VOID WINAPI Sleep(DWORD);
+BOOL32 WINAPI StartService32A(HANDLE32,DWORD,LPCSTR*);
+BOOL32 WINAPI StartService32W(HANDLE32,DWORD,LPCWSTR*);
+#define StartService WINELIB_NAME_AW(StartService)
BOOL32 WINAPI SystemTimeToFileTime(const SYSTEMTIME*,LPFILETIME);
BOOL32 WINAPI TrackPopupMenuEx(HMENU32,UINT32,INT32,INT32,HWND32,
LPTPMPARAMS);
@@ -6231,10 +6418,18 @@
DWORD WINAPI VirtualQuery(LPCVOID,LPMEMORY_BASIC_INFORMATION,DWORD);
DWORD WINAPI VirtualQueryEx(HANDLE32,LPCVOID,LPMEMORY_BASIC_INFORMATION,DWORD);
BOOL32 WINAPI VirtualUnlock(LPVOID,DWORD);
+BOOL32 WINAPI WaitForDebugEvent(LPDEBUG_EVENT,DWORD);
+DWORD WINAPI WaitForInputIdle(HANDLE32,DWORD);
DWORD WINAPI WaitForMultipleObjects(DWORD,const HANDLE32*,BOOL32,DWORD);
DWORD WINAPI WaitForMultipleObjectsEx(DWORD,const HANDLE32*,BOOL32,DWORD,BOOL32);
DWORD WINAPI WaitForSingleObject(HANDLE32,DWORD);
DWORD WINAPI WaitForSingleObjectEx(HANDLE32,DWORD,BOOL32);
+UINT32 WINAPI WNetAddConnection2_32A(LPNETRESOURCE32A,LPCSTR,LPCSTR,DWORD);
+UINT32 WINAPI WNetAddConnection2_32W(LPNETRESOURCE32W,LPCWSTR,LPCWSTR,DWORD);
+#define WNetAddConnection2 WINELIB_NAME_AW(WNetAddConnection2_)
+UINT32 WINAPI WNetAddConnection3_32A(HWND32,LPNETRESOURCE32A,LPCSTR,LPCSTR,DWORD);
+UINT32 WINAPI WNetAddConnection3_32W(HWND32,LPNETRESOURCE32W,LPCWSTR,LPCWSTR,DWORD);
+#define WNetAddConnection3 WINELIB_NAME_AW(WNetAddConnection3_)
SEGPTR WINAPI WOWGlobalAllocLock16(DWORD,DWORD,HGLOBAL16*);
DWORD WINAPI WOWCallback16(FARPROC16,DWORD);
BOOL32 WINAPI WOWCallback16Ex(FARPROC16,DWORD,DWORD,LPVOID,LPDWORD);
@@ -6283,7 +6478,7 @@
LRESULT WINAPI AboutDlgProc32(HWND32,UINT32,WPARAM32,LPARAM);
#define AboutDlgProc WINELIB_NAME(AboutDlgProc)
INT16 WINAPI AccessResource16(HINSTANCE16,HRSRC16);
-INT32 WINAPI AccessResource32(HINSTANCE32,HRSRC32);
+INT32 WINAPI AccessResource32(HMODULE32,HRSRC32);
#define AccessResource WINELIB_NAME(AccessResource)
ATOM WINAPI AddAtom16(SEGPTR);
ATOM WINAPI AddAtom32A(LPCSTR);
@@ -6299,9 +6494,6 @@
BOOL16 WINAPI AdjustWindowRectEx16(LPRECT16,DWORD,BOOL16,DWORD);
BOOL32 WINAPI AdjustWindowRectEx32(LPRECT32,DWORD,BOOL32,DWORD);
#define AdjustWindowRectEx WINELIB_NAME(AdjustWindowRectEx)
-HGLOBAL16 WINAPI AllocResource16(HINSTANCE16,HRSRC16,DWORD);
-HGLOBAL32 WINAPI AllocResource32(HINSTANCE32,HRSRC32,DWORD);
-#define AllocResource WINELIB_NAME(AllocResource)
void WINAPI AnimatePalette16(HPALETTE16,UINT16,UINT16,LPPALETTEENTRY);
BOOL32 WINAPI AnimatePalette32(HPALETTE32,UINT32,UINT32,LPPALETTEENTRY);
#define AnimatePalette WINELIB_NAME(AnimatePalette)
@@ -6435,6 +6627,7 @@
HWND16 WINAPI ChildWindowFromPoint16(HWND16,POINT16);
HWND32 WINAPI ChildWindowFromPoint32(HWND32,POINT32);
#define ChildWindowFromPoint WINELIB_NAME(ChildWindowFromPoint)
+INT32 ChoosePixelFormat(HDC32,PIXELFORMATDESCRIPTOR*);
BOOL16 WINAPI Chord16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16);
BOOL32 WINAPI Chord32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32);
#define Chord WINELIB_NAME(Chord)
@@ -6696,6 +6889,8 @@
BOOL16 WINAPI DeleteObject16(HGDIOBJ16);
BOOL32 WINAPI DeleteObject32(HGDIOBJ32);
#define DeleteObject WINELIB_NAME(DeleteObject)
+INT32 WINAPI DescribePixelFormat(HDC32,int,UINT32,
+ LPPIXELFORMATDESCRIPTOR);
VOID WINAPI DestroyCaret16(void);
BOOL32 WINAPI DestroyCaret32(void);
#define DestroyCaret WINELIB_NAME(DestroyCaret)
@@ -6924,8 +7119,8 @@
BOOL32 WINAPI FindNextFile32W(HANDLE32,LPWIN32_FIND_DATA32W);
#define FindNextFile WINELIB_NAME_AW(FindNextFile)
HRSRC16 WINAPI FindResource16(HINSTANCE16,SEGPTR,SEGPTR);
-HRSRC32 WINAPI FindResource32A(HINSTANCE32,LPCSTR,LPCSTR);
-HRSRC32 WINAPI FindResource32W(HINSTANCE32,LPCWSTR,LPCWSTR);
+HRSRC32 WINAPI FindResource32A(HMODULE32,LPCSTR,LPCSTR);
+HRSRC32 WINAPI FindResource32W(HMODULE32,LPCWSTR,LPCWSTR);
#define FindResource WINELIB_NAME_AW(FindResource)
HWND16 WINAPI FindWindow16(SEGPTR,LPCSTR);
HWND32 WINAPI FindWindow32A(LPCSTR,LPCSTR);
@@ -7246,6 +7441,7 @@
COLORREF WINAPI GetPixel16(HDC16,INT16,INT16);
COLORREF WINAPI GetPixel32(HDC32,INT32,INT32);
#define GetPixel WINELIB_NAME(GetPixel)
+INT32 WINAPI GetPixelFormat(HDC32);
INT16 WINAPI GetPolyFillMode16(HDC16);
INT32 WINAPI GetPolyFillMode32(HDC32);
#define GetPolyFillMode WINELIB_NAME(GetPolyFillMode)
@@ -7682,7 +7878,7 @@
DWORD WINAPI LoadModule32(LPCSTR,LPVOID);
#define LoadModule WINELIB_NAME(LoadModule)
HGLOBAL16 WINAPI LoadResource16(HINSTANCE16,HRSRC16);
-HGLOBAL32 WINAPI LoadResource32(HINSTANCE32,HRSRC32);
+HGLOBAL32 WINAPI LoadResource32(HMODULE32,HRSRC32);
#define LoadResource WINELIB_NAME(LoadResource)
INT16 WINAPI LoadString16(HINSTANCE16,UINT16,LPSTR,INT16);
INT32 WINAPI LoadString32A(HINSTANCE32,UINT32,LPSTR,INT32);
@@ -7852,6 +8048,9 @@
VOID WINAPI PlayMetaFileRecord16(HDC16,LPHANDLETABLE16,LPMETARECORD,UINT16);
BOOL32 WINAPI PlayMetaFileRecord32(HDC32,LPHANDLETABLE32,LPMETARECORD,UINT32);
#define PlayMetaFileRecord WINELIB_NAME(PlayMetaFileRecord)
+BOOL16 WINAPI PolyBezier16(HDC16,LPPOINT16,INT16);
+BOOL32 WINAPI PolyBezier32(HDC32,LPPOINT32,DWORD);
+#define PolyBezier WINELIB_NAME(PolyBezier)
BOOL16 WINAPI PolyPolygon16(HDC16,LPPOINT16,LPINT16,UINT16);
BOOL32 WINAPI PolyPolygon32(HDC32,LPPOINT32,LPINT32,UINT32);
#define PolyPolygon WINELIB_NAME(PolyPolygon)
@@ -8166,6 +8365,7 @@
COLORREF WINAPI SetPixel16(HDC16,INT16,INT16,COLORREF);
COLORREF WINAPI SetPixel32(HDC32,INT32,INT32,COLORREF);
#define SetPixel WINELIB_NAME(SetPixel)
+BOOL32 WINAPI SetPixelFormat(HDC32,int,PIXELFORMATDESCRIPTOR*);
INT16 WINAPI SetPolyFillMode16(HDC16,INT16);
INT32 WINAPI SetPolyFillMode32(HDC32,INT32);
#define SetPolyFillMode WINELIB_NAME(SetPolyFillMode)
@@ -8340,6 +8540,7 @@
BOOL16 WINAPI SubtractRect16(LPRECT16,const RECT16*,const RECT16*);
BOOL32 WINAPI SubtractRect32(LPRECT32,const RECT32*,const RECT32*);
#define SubtractRect WINELIB_NAME(SubtractRect)
+BOOL32 WINAPI SwapBuffers(HDC32);
BOOL16 WINAPI SwapMouseButton16(BOOL16);
BOOL32 WINAPI SwapMouseButton32(BOOL32);
#define SwapMouseButton WINELIB_NAME(SwapMouseButton)
@@ -8485,6 +8686,10 @@
BOOL32 WINAPI WinHelp32A(HWND32,LPCSTR,UINT32,DWORD);
BOOL32 WINAPI WinHelp32W(HWND32,LPCWSTR,UINT32,DWORD);
#define WinHelp WINELIB_NAME_AW(WinHelp)
+UINT16 WNetAddConnection16(LPSTR,LPSTR,LPSTR);
+UINT32 WNetAddConnection32A(LPSTR,LPSTR,LPSTR);
+UINT32 WNetAddConnection32W(LPWSTR,LPWSTR,LPWSTR);
+#define WNetAddConnection WINELIB_NAME_AW(WNetAddConnection)
INT16 WINAPIV wsnprintf16(LPSTR,UINT16,LPCSTR,...);
INT32 WINAPIV wsnprintf32A(LPSTR,UINT32,LPCSTR,...);
INT32 WINAPIV wsnprintf32W(LPWSTR,UINT32,LPCWSTR,...);
@@ -8530,8 +8735,8 @@
HPEN16 WINAPI GetSysColorPen16(INT16);
HPEN32 WINAPI GetSysColorPen32(INT32);
-INT32 WINAPI LoadMessage32A(HINSTANCE32,UINT32,WORD,LPSTR,INT32);
-INT32 WINAPI LoadMessage32W(HINSTANCE32,UINT32,WORD,LPWSTR,INT32);
+INT32 WINAPI LoadMessage32A(HMODULE32,UINT32,WORD,LPSTR,INT32);
+INT32 WINAPI LoadMessage32W(HMODULE32,UINT32,WORD,LPWSTR,INT32);
SEGPTR WINAPI WIN16_GlobalLock16(HGLOBAL16);
SEGPTR WINAPI WIN16_LockResource(HGLOBAL16);
LONG WINAPI WIN16_hread(HFILE16,SEGPTR,LONG);
diff --git a/include/winnls.h b/include/winnls.h
index d09bc96..af6d7de 100644
--- a/include/winnls.h
+++ b/include/winnls.h
@@ -5,6 +5,8 @@
#define LOCALE_NOUSEROVERRIDE 0x80000000
#define LOCALE_USE_CP_ACP 0x40000000
+#define LOCALE_LOCALEINFOFLAGSMASK 0xC0000000
+
/* When adding new defines, don't forget to add an entry to the
* locale2id map in misc/ole2nls.c
*/
@@ -205,6 +207,14 @@
#define DATE_LONGDATE 0x00000002 /* use long date picture */
#define DATE_USE_ALT_CALENDAR 0x00000004 /* use alternate calendar */
/* alt. calendar support is broken anyway */
+#define TIME_NOSECONDS 0x00000002 /* show no seconds */
+#define TIME_NOMINUTESORSECONDS 0x0000001 /* show no minutes either */
+
+/* internal flags for GetDateFormat system */
+#define DATE_DATEVARSONLY 0x00000100 /* only date stuff: yMdg */
+#define TIME_TIMEVARSONLY 0x00000200 /* only time stuff: hHmst */
+/* use this in a WineLib program if you really want all types */
+#define LOCALE_TIMEDATEBOTH 0x00000300 /* full set */
#endif /* __WINE_WINNLS_H */
diff --git a/include/wintypes.h b/include/wintypes.h
index 3586b4a..655f7b2 100644
--- a/include/wintypes.h
+++ b/include/wintypes.h
@@ -9,38 +9,31 @@
#ifdef __WINE__
# include "config.h"
-# undef WINELIB
# undef UNICODE
-#else /* __WINE__ */
-# ifndef WINELIB
-# define WINELIB
-# endif
#endif /* __WINE__ */
/* Macros to map Winelib names to the correct implementation name */
-/* depending on WINELIB and UNICODE macros. */
-/* Note that WINELIB is purely Win32. */
+/* depending on __WINE__ and UNICODE macros. */
+/* Note that Winelib is purely Win32. */
#ifdef __WINE__
# define WINELIB_NAME(func) this is a syntax error
# define WINELIB_NAME_AW(func) this is a syntax error
#else /* __WINE__ */
-# ifdef WINELIB
-# define WINELIB_NAME(func) func##32
-# ifdef UNICODE
-# define WINELIB_NAME_AW(func) func##32W
-# else
-# define WINELIB_NAME_AW(func) func##32A
-# endif /* UNICODE */
-# endif /* WINELIB */
+# define WINELIB_NAME(func) func##32
+# ifdef UNICODE
+# define WINELIB_NAME_AW(func) func##32W
+# else
+# define WINELIB_NAME_AW(func) func##32A
+# endif /* UNICODE */
#endif /* __WINE__ */
#ifdef __WINE__
# define DECL_WINELIB_TYPE(type) /* nothing */
# define DECL_WINELIB_TYPE_AW(type) /* nothing */
#else /* __WINE__ */
-# define DECL_WINELIB_TYPE(type) typedef WINELIB_NAME(type) type
-# define DECL_WINELIB_TYPE_AW(type) typedef WINELIB_NAME_AW(type) type
+# define DECL_WINELIB_TYPE(type) typedef WINELIB_NAME(type) type;
+# define DECL_WINELIB_TYPE_AW(type) typedef WINELIB_NAME_AW(type) type;
#endif /* __WINE__ */
@@ -180,105 +173,105 @@
typedef LRESULT (CALLBACK *DLGPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
typedef LRESULT (CALLBACK *DLGPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
-DECL_WINELIB_TYPE(DLGPROC);
+DECL_WINELIB_TYPE(DLGPROC)
typedef LRESULT (CALLBACK *DRIVERPROC16)(DWORD,HDRVR16,UINT16,LPARAM,LPARAM);
typedef LRESULT (CALLBACK *DRIVERPROC32)(DWORD,HDRVR32,UINT32,LPARAM,LPARAM);
-DECL_WINELIB_TYPE(DRIVERPROC);
+DECL_WINELIB_TYPE(DRIVERPROC)
typedef INT16 (CALLBACK *EDITWORDBREAKPROC16)(LPSTR,INT16,INT16,INT16);
typedef INT32 (CALLBACK *EDITWORDBREAKPROC32A)(LPSTR,INT32,INT32,INT32);
typedef INT32 (CALLBACK *EDITWORDBREAKPROC32W)(LPWSTR,INT32,INT32,INT32);
-DECL_WINELIB_TYPE_AW(EDITWORDBREAKPROC);
+DECL_WINELIB_TYPE_AW(EDITWORDBREAKPROC)
typedef LRESULT (CALLBACK *FARPROC16)();
typedef LRESULT (CALLBACK *FARPROC32)();
-DECL_WINELIB_TYPE(FARPROC);
+DECL_WINELIB_TYPE(FARPROC)
typedef INT16 (CALLBACK *GOBJENUMPROC16)(SEGPTR,LPARAM);
typedef INT32 (CALLBACK *GOBJENUMPROC32)(LPVOID,LPARAM);
-DECL_WINELIB_TYPE(GOBJENUMPROC);
+DECL_WINELIB_TYPE(GOBJENUMPROC)
typedef BOOL16 (CALLBACK *GRAYSTRINGPROC16)(HDC16,LPARAM,INT16);
typedef BOOL32 (CALLBACK *GRAYSTRINGPROC32)(HDC32,LPARAM,INT32);
-DECL_WINELIB_TYPE(GRAYSTRINGPROC);
+DECL_WINELIB_TYPE(GRAYSTRINGPROC)
typedef LRESULT (CALLBACK *HOOKPROC16)(INT16,WPARAM16,LPARAM);
typedef LRESULT (CALLBACK *HOOKPROC32)(INT32,WPARAM32,LPARAM);
-DECL_WINELIB_TYPE(HOOKPROC);
+DECL_WINELIB_TYPE(HOOKPROC)
typedef VOID (CALLBACK *LINEDDAPROC16)(INT16,INT16,LPARAM);
typedef VOID (CALLBACK *LINEDDAPROC32)(INT32,INT32,LPARAM);
-DECL_WINELIB_TYPE(LINEDDAPROC);
+DECL_WINELIB_TYPE(LINEDDAPROC)
typedef BOOL16 (CALLBACK *PROPENUMPROC16)(HWND16,SEGPTR,HANDLE16);
typedef BOOL32 (CALLBACK *PROPENUMPROC32A)(HWND32,LPCSTR,HANDLE32);
typedef BOOL32 (CALLBACK *PROPENUMPROC32W)(HWND32,LPCWSTR,HANDLE32);
-DECL_WINELIB_TYPE_AW(PROPENUMPROC);
+DECL_WINELIB_TYPE_AW(PROPENUMPROC)
typedef BOOL32 (CALLBACK *PROPENUMPROCEX32A)(HWND32,LPCSTR,HANDLE32,LPARAM);
typedef BOOL32 (CALLBACK *PROPENUMPROCEX32W)(HWND32,LPCWSTR,HANDLE32,LPARAM);
-DECL_WINELIB_TYPE_AW(PROPENUMPROCEX);
+DECL_WINELIB_TYPE_AW(PROPENUMPROCEX)
typedef VOID (CALLBACK *TIMERPROC16)(HWND16,UINT16,UINT16,DWORD);
typedef VOID (CALLBACK *TIMERPROC32)(HWND32,UINT32,UINT32,DWORD);
-DECL_WINELIB_TYPE(TIMERPROC);
+DECL_WINELIB_TYPE(TIMERPROC)
typedef LRESULT (CALLBACK *WNDENUMPROC16)(HWND16,LPARAM);
typedef LRESULT (CALLBACK *WNDENUMPROC32)(HWND32,LPARAM);
-DECL_WINELIB_TYPE(WNDENUMPROC);
+DECL_WINELIB_TYPE(WNDENUMPROC)
typedef LRESULT (CALLBACK *WNDPROC16)(HWND16,UINT16,WPARAM16,LPARAM);
typedef LRESULT (CALLBACK *WNDPROC32)(HWND32,UINT32,WPARAM32,LPARAM);
-DECL_WINELIB_TYPE(WNDPROC);
+DECL_WINELIB_TYPE(WNDPROC)
/* TCHAR data types definitions for Winelib. */
/* These types are _not_ defined for the emulator, because they */
/* depend on the UNICODE macro that only exists in user's code. */
#ifndef __WINE__
-# if defined(WINELIB32) && defined(UNICODE)
+# ifdef UNICODE
typedef WCHAR TCHAR;
typedef LPWSTR LPTSTR;
typedef LPCWSTR LPCTSTR;
-# else /* WINELIB32 && UNICODE */
+# else /* UNICODE */
typedef CHAR TCHAR;
typedef LPSTR LPTSTR;
typedef LPCSTR LPCTSTR;
-# endif /* WINELIB32 && UNICODE */
+# endif /* UNICODE */
#endif /* __WINE__ */
/* Data types specific to the library. These do _not_ exist in the emulator. */
-DECL_WINELIB_TYPE(INT);
-DECL_WINELIB_TYPE(LPINT);
-DECL_WINELIB_TYPE(LPUINT);
-DECL_WINELIB_TYPE(UINT);
-DECL_WINELIB_TYPE(BOOL);
-DECL_WINELIB_TYPE(WPARAM);
+DECL_WINELIB_TYPE(INT)
+DECL_WINELIB_TYPE(LPINT)
+DECL_WINELIB_TYPE(LPUINT)
+DECL_WINELIB_TYPE(UINT)
+DECL_WINELIB_TYPE(BOOL)
+DECL_WINELIB_TYPE(WPARAM)
-DECL_WINELIB_TYPE(HACCEL);
-DECL_WINELIB_TYPE(HANDLE);
-DECL_WINELIB_TYPE(HBITMAP);
-DECL_WINELIB_TYPE(HBRUSH);
-DECL_WINELIB_TYPE(HCURSOR);
-DECL_WINELIB_TYPE(HDC);
-DECL_WINELIB_TYPE(HDROP);
-DECL_WINELIB_TYPE(HDRVR);
-DECL_WINELIB_TYPE(HDWP);
-DECL_WINELIB_TYPE(HENHMETAFILE);
-DECL_WINELIB_TYPE(HFILE);
-DECL_WINELIB_TYPE(HFONT);
-DECL_WINELIB_TYPE(HGDIOBJ);
-DECL_WINELIB_TYPE(HGLOBAL);
-DECL_WINELIB_TYPE(HICON);
-DECL_WINELIB_TYPE(HINSTANCE);
-DECL_WINELIB_TYPE(HLOCAL);
-DECL_WINELIB_TYPE(HMENU);
-DECL_WINELIB_TYPE(HMETAFILE);
-DECL_WINELIB_TYPE(HMIDI);
-DECL_WINELIB_TYPE(HMIDIIN);
-DECL_WINELIB_TYPE(HMIDIOUT);
-DECL_WINELIB_TYPE(HMMIO);
-DECL_WINELIB_TYPE(HMODULE);
-DECL_WINELIB_TYPE(HPALETTE);
-DECL_WINELIB_TYPE(HPEN);
-DECL_WINELIB_TYPE(HQUEUE);
-DECL_WINELIB_TYPE(HRGN);
-DECL_WINELIB_TYPE(HRSRC);
-DECL_WINELIB_TYPE(HTASK);
-DECL_WINELIB_TYPE(HWAVE);
-DECL_WINELIB_TYPE(HWAVEIN);
-DECL_WINELIB_TYPE(HWAVEOUT);
-DECL_WINELIB_TYPE(HWND);
+DECL_WINELIB_TYPE(HACCEL)
+DECL_WINELIB_TYPE(HANDLE)
+DECL_WINELIB_TYPE(HBITMAP)
+DECL_WINELIB_TYPE(HBRUSH)
+DECL_WINELIB_TYPE(HCURSOR)
+DECL_WINELIB_TYPE(HDC)
+DECL_WINELIB_TYPE(HDROP)
+DECL_WINELIB_TYPE(HDRVR)
+DECL_WINELIB_TYPE(HDWP)
+DECL_WINELIB_TYPE(HENHMETAFILE)
+DECL_WINELIB_TYPE(HFILE)
+DECL_WINELIB_TYPE(HFONT)
+DECL_WINELIB_TYPE(HGDIOBJ)
+DECL_WINELIB_TYPE(HGLOBAL)
+DECL_WINELIB_TYPE(HICON)
+DECL_WINELIB_TYPE(HINSTANCE)
+DECL_WINELIB_TYPE(HLOCAL)
+DECL_WINELIB_TYPE(HMENU)
+DECL_WINELIB_TYPE(HMETAFILE)
+DECL_WINELIB_TYPE(HMIDI)
+DECL_WINELIB_TYPE(HMIDIIN)
+DECL_WINELIB_TYPE(HMIDIOUT)
+DECL_WINELIB_TYPE(HMMIO)
+DECL_WINELIB_TYPE(HMODULE)
+DECL_WINELIB_TYPE(HPALETTE)
+DECL_WINELIB_TYPE(HPEN)
+DECL_WINELIB_TYPE(HQUEUE)
+DECL_WINELIB_TYPE(HRGN)
+DECL_WINELIB_TYPE(HRSRC)
+DECL_WINELIB_TYPE(HTASK)
+DECL_WINELIB_TYPE(HWAVE)
+DECL_WINELIB_TYPE(HWAVEIN)
+DECL_WINELIB_TYPE(HWAVEOUT)
+DECL_WINELIB_TYPE(HWND)
/* Misc. constants. */
diff --git a/include/x11drv.h b/include/x11drv.h
index cddfaab..78d911d 100644
--- a/include/x11drv.h
+++ b/include/x11drv.h
@@ -94,6 +94,8 @@
extern BOOL32 X11DRV_Polygon( struct tagDC *dc, LPPOINT32 pt, INT32 count );
extern BOOL32 X11DRV_PolyPolygon( struct tagDC *dc, LPPOINT32 pt,
LPINT32 counts, UINT32 polygons);
+extern BOOL32 X11DRV_PolyPolyline( struct tagDC *dc, LPPOINT32 pt,
+ LPINT32 counts, UINT32 polylines);
extern HGDIOBJ32 X11DRV_SelectObject( struct tagDC *dc, HGDIOBJ32 handle );
diff --git a/loader/Makefile.in b/loader/Makefile.in
index 549c3c1..7f0ae30 100644
--- a/loader/Makefile.in
+++ b/loader/Makefile.in
@@ -9,8 +9,6 @@
libres.c \
main.c \
module.c \
- ne_image.c \
- ne_resource.c \
pe_image.c \
pe_resource.c \
resource.c \
diff --git a/loader/libres.c b/loader/libres.c
index cc5bd3a..5dafc8f 100644
--- a/loader/libres.c
+++ b/loader/libres.c
@@ -6,6 +6,7 @@
#include <stdio.h>
#include <stdlib.h>
+#include "debug.h"
#include "libres.h"
#include "heap.h"
#include "windows.h"
@@ -31,57 +32,9 @@
}
/**********************************************************************
- * LIBRES_FindResource16
+ * LIBRES_FindResource
*/
-HRSRC32 LIBRES_FindResource16( HINSTANCE32 hModule, LPCSTR name, LPCSTR type )
-{
- int nameid=0,typeid;
- ResListE* ResBlock;
- const struct resource* const * Res;
-
- if(HIWORD(name))
- {
- if(*name=='#')
- {
- nameid=atoi(name+1);
- name=NULL;
- }
- }
- else
- {
- nameid=LOWORD(name);
- name=NULL;
- }
- if(HIWORD(type))
- {
- if(*type=='#')
- typeid=atoi(type+1);
- else
- {
- fprintf(stderr,"LIBRES_FindResource16(*,*,type=string)");
- return 0;
- }
- }
- else
- typeid=LOWORD(type);
-
- for(ResBlock=ResourceList; ResBlock; ResBlock=ResBlock->next)
- for(Res=ResBlock->Resources; *Res; Res++)
- if(name)
- {
- if((*Res)->type==typeid && !lstrcmpi32A((*Res)->name,name))
- return (HRSRC32)*Res;
- }
- else
- if((*Res)->type==typeid && (*Res)->id==nameid)
- return (HRSRC32)*Res;
- return 0;
-}
-
-/**********************************************************************
- * LIBRES_FindResource32
- */
-HRSRC32 LIBRES_FindResource32( HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type )
+HRSRC32 LIBRES_FindResource( HINSTANCE32 hModule, LPCWSTR name, LPCWSTR type )
{
int nameid=0,typeid;
ResListE* ResBlock;
@@ -112,7 +65,7 @@
}
else
{
- fprintf(stderr,"LIBRES_FindResource32(*,*,type=string)");
+ TRACE(resource, "(*,*,type=string): Returning 0\n");
return 0;
}
}
@@ -143,48 +96,9 @@
/**********************************************************************
- * LIBRES_LockResource
- */
-LPVOID LIBRES_LockResource( HGLOBAL32 handle )
-{
- return (LPVOID)handle;
-}
-
-
-/**********************************************************************
- * LIBRES_FreeResource
- */
-BOOL32 LIBRES_FreeResource( HGLOBAL32 handle )
-{
- return 0; /* Obsolete in Win32 */
-}
-
-
-/**********************************************************************
- * LIBRES_AccessResource
- */
-INT32 LIBRES_AccessResource( HINSTANCE32 hModule, HRSRC32 hRsrc )
-{
- fprintf(stderr,"LIBRES_AccessResource()");
- return -1; /* Obsolete in Win32 */
-}
-
-
-/**********************************************************************
* LIBRES_SizeofResource
*/
DWORD LIBRES_SizeofResource( HINSTANCE32 hModule, HRSRC32 hRsrc )
{
return (DWORD)(((struct resource*)hRsrc)->size);
}
-
-
-/**********************************************************************
- * LIBRES_AllocResource
- */
-HGLOBAL32 LIBRES_AllocResource( HINSTANCE32 hModule, HRSRC32 hRsrc, DWORD size)
-{
- fprintf(stderr,"LIBRES_AllocResource()");
- return 0; /* Obsolete in Win32 */
-}
-
diff --git a/loader/module.c b/loader/module.c
index 1e1db94..63568ee 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -31,23 +31,48 @@
extern BOOL32 THREAD_InitDone;
-static HMODULE16 hFirstModule = 0;
+extern HMODULE16 hFirstModule; /* FIXME */
static HMODULE16 hCachedModule = 0; /* Module cached by MODULE_OpenFile */
static HMODULE32 MODULE_LoadModule(LPCSTR name,BOOL32 force) { return 0; }
HMODULE32 (*fnBUILTIN_LoadModule)(LPCSTR name,BOOL32 force) = MODULE_LoadModule;
-/***********************************************************************
- * MODULE_GetPtr
+/*************************************************************************
+ * MODULE32_LookupHMODULE
+ * looks for the referenced HMODULE in the current process
*/
-NE_MODULE *MODULE_GetPtr( HMODULE32 hModule )
-{
- HMODULE16 hnd =MODULE_HANDLEtoHMODULE16(hModule);
+WINE_MODREF*
+MODULE32_LookupHMODULE(PDB32 *process,HMODULE32 hmod) {
+ WINE_MODREF *wm;
- if (!hnd)
- return NULL;
- return (NE_MODULE*)GlobalLock16(hnd);
+ if (!hmod)
+ return process->exe_modref;
+ if (!HIWORD(hmod)) {
+ ERR(module,"tried to lookup 0x%04x in win32 module handler!\n",hmod);
+ return NULL;
+ }
+ for (wm = process->modref_list;wm;wm=wm->next)
+ if (wm->module == hmod)
+ return wm;
+ return NULL;
+}
+
+/***********************************************************************
+ * MODULE_GetPtr16
+ */
+NE_MODULE *MODULE_GetPtr16( HMODULE16 hModule )
+{
+ return (NE_MODULE*)GlobalLock16( GetExePtr(hModule) );
+}
+
+
+/***********************************************************************
+ * MODULE_GetPtr32
+ */
+NE_MODULE *MODULE_GetPtr32( HMODULE32 hModule )
+{
+ return (NE_MODULE*)GlobalLock16( MODULE_HANDLEtoHMODULE16(hModule) );
}
/***********************************************************************
@@ -59,6 +84,7 @@
if (HIWORD(handle))
{
+ WARN(module,"looking up 0x%08x in win16 function!\n",handle);
/* this is a HMODULE32 */
/* walk the list looking for the correct startaddress */
@@ -74,192 +100,6 @@
}
/***********************************************************************
- * MODULE_HANDLEtoHMODULE32
- * return HMODULE32, if possible, HMODULE16 otherwise
- */
-HMODULE32
-MODULE_HANDLEtoHMODULE32(HANDLE32 handle) {
- NE_MODULE *pModule;
-
- if (HIWORD(handle))
- return (HMODULE32)handle;
- else {
- handle = GetExePtr(handle);
- if (!handle)
- return 0;
- pModule = (NE_MODULE *)GlobalLock16( handle );
- if (!pModule)
- return 0;
-
- if (pModule->module32) return pModule->module32;
- return handle;
- }
-}
-
-/***********************************************************************
- * MODULE_DumpModule
- */
-void MODULE_DumpModule( HMODULE32 hModule )
-{
- int i, ordinal;
- SEGTABLEENTRY *pSeg;
- BYTE *pstr;
- WORD *pword;
- NE_MODULE *pModule;
-
- if (!(pModule = MODULE_GetPtr( hModule )))
- {
- fprintf( stderr, "**** %04x is not a module handle\n", hModule );
- return;
- }
-
- /* Dump the module info */
- DUMP( "---\n" );
- DUMP( "Module %04x:\n", hModule );
- DUMP( "count=%d flags=%04x heap=%d stack=%d\n",
- pModule->count, pModule->flags,
- pModule->heap_size, pModule->stack_size );
- DUMP( "cs:ip=%04x:%04x ss:sp=%04x:%04x ds=%04x nb seg=%d modrefs=%d\n",
- pModule->cs, pModule->ip, pModule->ss, pModule->sp, pModule->dgroup,
- pModule->seg_count, pModule->modref_count );
- DUMP( "os_flags=%d swap_area=%d version=%04x\n",
- pModule->os_flags, pModule->min_swap_area,
- pModule->expected_version );
- if (pModule->flags & NE_FFLAGS_WIN32)
- DUMP( "PE module=%08x\n", pModule->module32 );
-
- /* Dump the file info */
- DUMP( "---\n" );
- DUMP( "Filename: '%s'\n", NE_MODULE_NAME(pModule) );
-
- /* Dump the segment table */
- DUMP( "---\n" );
- DUMP( "Segment table:\n" );
- pSeg = NE_SEG_TABLE( pModule );
- for (i = 0; i < pModule->seg_count; i++, pSeg++)
- DUMP( "%02x: pos=%d size=%d flags=%04x minsize=%d sel=%04x\n",
- i + 1, pSeg->filepos, pSeg->size, pSeg->flags,
- pSeg->minsize, pSeg->selector );
-
- /* Dump the resource table */
- DUMP( "---\n" );
- DUMP( "Resource table:\n" );
- if (pModule->res_table)
- {
- pword = (WORD *)((BYTE *)pModule + pModule->res_table);
- DUMP( "Alignment: %d\n", *pword++ );
- while (*pword)
- {
- struct resource_typeinfo_s *ptr = (struct resource_typeinfo_s *)pword;
- struct resource_nameinfo_s *pname = (struct resource_nameinfo_s *)(ptr + 1);
- DUMP( "id=%04x count=%d\n", ptr->type_id, ptr->count );
- for (i = 0; i < ptr->count; i++, pname++)
- DUMP( "offset=%d len=%d id=%04x\n",
- pname->offset, pname->length, pname->id );
- pword = (WORD *)pname;
- }
- }
- else DUMP( "None\n" );
-
- /* Dump the resident name table */
- DUMP( "---\n" );
- DUMP( "Resident-name table:\n" );
- pstr = (char *)pModule + pModule->name_table;
- while (*pstr)
- {
- DUMP( "%*.*s: %d\n", *pstr, *pstr, pstr + 1,
- *(WORD *)(pstr + *pstr + 1) );
- pstr += *pstr + 1 + sizeof(WORD);
- }
-
- /* Dump the module reference table */
- DUMP( "---\n" );
- DUMP( "Module ref table:\n" );
- if (pModule->modref_table)
- {
- pword = (WORD *)((BYTE *)pModule + pModule->modref_table);
- for (i = 0; i < pModule->modref_count; i++, pword++)
- {
- DUMP( "%d: %04x -> '%s'\n", i, *pword,
- MODULE_GetModuleName(*pword));
- }
- }
- else DUMP( "None\n" );
-
- /* Dump the entry table */
- DUMP( "---\n" );
- DUMP( "Entry table:\n" );
- pstr = (char *)pModule + pModule->entry_table;
- ordinal = 1;
- while (*pstr)
- {
- DUMP( "Bundle %d-%d: %02x\n", ordinal, ordinal + *pstr - 1, pstr[1]);
- if (!pstr[1])
- {
- ordinal += *pstr;
- pstr += 2;
- }
- else if ((BYTE)pstr[1] == 0xff) /* moveable */
- {
- struct entry_tab_movable_s *pe = (struct entry_tab_movable_s*)(pstr+2);
- for (i = 0; i < *pstr; i++, pe++)
- DUMP( "%d: %02x:%04x (moveable)\n",
- ordinal++, pe->seg_number, pe->offset );
- pstr = (char *)pe;
- }
- else /* fixed */
- {
- struct entry_tab_fixed_s *pe = (struct entry_tab_fixed_s*)(pstr+2);
- for (i = 0; i < *pstr; i++, pe++)
- DUMP( "%d: %04x (fixed)\n",
- ordinal++, pe->offset[0] + (pe->offset[1] << 8) );
- pstr = (char *)pe;
- }
- }
-
- /* Dump the non-resident names table */
- DUMP( "---\n" );
- DUMP( "Non-resident names table:\n" );
- if (pModule->nrname_handle)
- {
- pstr = (char *)GlobalLock16( pModule->nrname_handle );
- while (*pstr)
- {
- DUMP( "%*.*s: %d\n", *pstr, *pstr, pstr + 1,
- *(WORD *)(pstr + *pstr + 1) );
- pstr += *pstr + 1 + sizeof(WORD);
- }
- }
- DUMP( "\n" );
-}
-
-
-/***********************************************************************
- * MODULE_WalkModules
- *
- * Walk the module list and print the modules.
- */
-void MODULE_WalkModules(void)
-{
- HMODULE16 hModule = hFirstModule;
- fprintf( stderr, "Module Flags Name\n" );
- while (hModule)
- {
- NE_MODULE *pModule = MODULE_GetPtr( hModule );
- if (!pModule)
- {
- fprintf( stderr, "**** Bad module %04x in list\n", hModule );
- return;
- }
- fprintf( stderr, " %04x %04x %.*s\n", hModule, pModule->flags,
- *((char *)pModule + pModule->name_table),
- (char *)pModule + pModule->name_table + 1 );
- hModule = pModule->next;
- }
-}
-
-
-/***********************************************************************
* MODULE_OpenFile
*/
int MODULE_OpenFile( HMODULE32 hModule )
@@ -273,14 +113,14 @@
hModule = MODULE_HANDLEtoHMODULE16(hModule);
TRACE(module, "(%04x) cache: mod=%04x fd=%d\n",
hModule, hCachedModule, cachedfd );
- if (!(pModule = MODULE_GetPtr( hModule ))) return -1;
+ if (!(pModule = MODULE_GetPtr32( hModule ))) return -1;
if (hCachedModule == hModule) return cachedfd;
close( cachedfd );
hCachedModule = hModule;
name = NE_MODULE_NAME( pModule );
if (!DOSFS_GetFullName( name, TRUE, &full_name ) ||
(cachedfd = open( full_name.long_name, O_RDONLY )) == -1)
- fprintf( stderr, "MODULE_OpenFile: can't open file '%s' for module %04x\n",
+ WARN( module, "Can't open file '%s' for module %04x\n",
name, hModule );
TRACE(module, "opened '%s' -> %d\n",
name, cachedfd );
@@ -289,112 +129,33 @@
/***********************************************************************
- * MODULE_Ne2MemFlags
- *
- * This function translates NE segment flags to GlobalAlloc flags
- */
-static WORD MODULE_Ne2MemFlags(WORD flags)
-{
- WORD memflags = 0;
-#if 0
- if (flags & NE_SEGFLAGS_DISCARDABLE)
- memflags |= GMEM_DISCARDABLE;
- if (flags & NE_SEGFLAGS_MOVEABLE ||
- ( ! (flags & NE_SEGFLAGS_DATA) &&
- ! (flags & NE_SEGFLAGS_LOADED) &&
- ! (flags & NE_SEGFLAGS_ALLOCATED)
- )
- )
- memflags |= GMEM_MOVEABLE;
- memflags |= GMEM_ZEROINIT;
-#else
- memflags = GMEM_ZEROINIT | GMEM_FIXED;
- return memflags;
-#endif
-}
-
-/***********************************************************************
- * MODULE_AllocateSegment (WPROCS.26)
- */
-
-DWORD WINAPI MODULE_AllocateSegment(WORD wFlags, WORD wSize, WORD wElem)
-{
- WORD size = wSize << wElem;
- HANDLE16 hMem = GlobalAlloc16( MODULE_Ne2MemFlags(wFlags), size);
- return MAKELONG( hMem, GlobalHandleToSel(hMem) );
-}
-
-/***********************************************************************
- * MODULE_CreateSegments
- */
-static BOOL32 MODULE_CreateSegments( HMODULE32 hModule )
-{
- SEGTABLEENTRY *pSegment;
- NE_MODULE *pModule;
- int i, minsize;
-
- if (!(pModule = MODULE_GetPtr( hModule ))) return FALSE;
- pSegment = NE_SEG_TABLE( pModule );
- for (i = 1; i <= pModule->seg_count; i++, pSegment++)
- {
- minsize = pSegment->minsize ? pSegment->minsize : 0x10000;
- if (i == pModule->ss) minsize += pModule->stack_size;
- /* The DGROUP is allocated by MODULE_CreateInstance */
- if (i == pModule->dgroup) continue;
- pSegment->selector = GLOBAL_Alloc( MODULE_Ne2MemFlags(pSegment->flags),
- minsize, hModule,
- !(pSegment->flags & NE_SEGFLAGS_DATA),
- FALSE,
- FALSE /*pSegment->flags & NE_SEGFLAGS_READONLY*/ );
- if (!pSegment->selector) return FALSE;
- }
-
- pModule->dgroup_entry = pModule->dgroup ? pModule->seg_table +
- (pModule->dgroup - 1) * sizeof(SEGTABLEENTRY) : 0;
- return TRUE;
-}
-
-
-/***********************************************************************
- * MODULE_GetInstance
- */
-HINSTANCE16 MODULE_GetInstance( HMODULE32 hModule )
-{
- SEGTABLEENTRY *pSegment;
- NE_MODULE *pModule;
-
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
- if (pModule->dgroup == 0) return hModule;
-
- pSegment = NE_SEG_TABLE( pModule ) + pModule->dgroup - 1;
-
- return pSegment->selector;
-}
-
-
-/***********************************************************************
* MODULE_CreateInstance
*
* If lib_only is TRUE, handle the module like a library even if it is a .EXE
*/
-HINSTANCE16 MODULE_CreateInstance( HMODULE16 hModule, BOOL32 lib_only )
+HINSTANCE16 MODULE_CreateInstance( HMODULE16 hModule, HINSTANCE16 *prev,
+ BOOL32 lib_only )
{
SEGTABLEENTRY *pSegment;
NE_MODULE *pModule;
int minsize;
- HINSTANCE16 hNewInstance, hPrevInstance;
+ HINSTANCE16 hNewInstance;
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
- if (pModule->dgroup == 0) return hModule;
+ if (!(pModule = MODULE_GetPtr16( hModule ))) return 0;
+ if (pModule->dgroup == 0)
+ {
+ if (prev) *prev = hModule;
+ return hModule;
+ }
pSegment = NE_SEG_TABLE( pModule ) + pModule->dgroup - 1;
- hPrevInstance = pSegment->selector;
+ if (prev) *prev = pSegment->selector;
/* if it's a library, create a new instance only the first time */
- if (hPrevInstance)
+ if (pSegment->selector)
{
- if (pModule->flags & NE_FFLAGS_LIBMODULE) return hPrevInstance;
- if (lib_only) return hPrevInstance;
+ if (pModule->flags & NE_FFLAGS_LIBMODULE) return pSegment->selector;
+ if (lib_only) return pSegment->selector;
}
minsize = pSegment->minsize ? pSegment->minsize : 0x10000;
@@ -491,432 +252,12 @@
pModule->res_table = pModule->import_table = pModule->entry_table =
(int)pStr - (int)pModule;
- MODULE_RegisterModule( pModule );
+ NE_RegisterModule( pModule );
return hModule;
}
/***********************************************************************
- * MODULE_LoadExeHeader
- */
-static HMODULE32 MODULE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
-{
- IMAGE_DOS_HEADER mz_header;
- IMAGE_OS2_HEADER ne_header;
- int size;
- HMODULE32 hModule;
- NE_MODULE *pModule;
- BYTE *pData;
- char *buffer, *fastload = NULL;
- int fastload_offset = 0, fastload_length = 0;
-
- /* Read a block from either the file or the fast-load area. */
-#define READ(offset,size,buffer) \
- ((fastload && ((offset) >= fastload_offset) && \
- ((offset)+(size) <= fastload_offset+fastload_length)) ? \
- (memcpy( buffer, fastload+(offset)-fastload_offset, (size) ), TRUE) : \
- (_llseek32( hFile, (offset), SEEK_SET), \
- _lread32( hFile, (buffer), (size) ) == (size)))
-
- _llseek32( hFile, 0, SEEK_SET );
- if ((_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
- (mz_header.e_magic != IMAGE_DOS_SIGNATURE))
- return (HMODULE32)11; /* invalid exe */
-
- _llseek32( hFile, mz_header.e_lfanew, SEEK_SET );
- if (_lread32( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header))
- return (HMODULE32)11; /* invalid exe */
-
- if (ne_header.ne_magic == IMAGE_NT_SIGNATURE) return (HMODULE32)21; /* win32 exe */
- if (ne_header.ne_magic != IMAGE_OS2_SIGNATURE) return (HMODULE32)11; /* invalid exe */
-
- if (ne_header.ne_magic == IMAGE_OS2_SIGNATURE_LX) {
- fprintf(stderr, "Sorry, this is an OS/2 linear executable (LX) file !\n");
- return (HMODULE32)12;
- }
-
- /* We now have a valid NE header */
-
- size = sizeof(NE_MODULE) +
- /* loaded file info */
- sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1+
- /* segment table */
- ne_header.n_segment_tab * sizeof(SEGTABLEENTRY) +
- /* resource table */
- ne_header.rname_tab_offset - ne_header.resource_tab_offset +
- /* resident names table */
- ne_header.moduleref_tab_offset - ne_header.rname_tab_offset +
- /* module ref table */
- ne_header.n_mod_ref_tab * sizeof(WORD) +
- /* imported names table */
- ne_header.entry_tab_offset - ne_header.iname_tab_offset +
- /* entry table length */
- ne_header.entry_tab_length;
-
- hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
- if (!hModule) return (HMODULE32)11; /* invalid exe */
- FarSetOwner( hModule, hModule );
- pModule = (NE_MODULE *)GlobalLock16( hModule );
- memcpy( pModule, &ne_header, sizeof(ne_header) );
- pModule->count = 0;
- pModule->module32 = 0;
- pModule->self = hModule;
- pModule->self_loading_sel = 0;
- pData = (BYTE *)(pModule + 1);
-
- /* Clear internal Wine flags in case they are set in the EXE file */
-
- pModule->flags &= ~(NE_FFLAGS_BUILTIN|NE_FFLAGS_WIN32|NE_FFLAGS_IMPLICIT);
-
- /* Read the fast-load area */
-
- if (ne_header.additional_flags & NE_AFLAGS_FASTLOAD)
- {
- fastload_offset=ne_header.fastload_offset<<ne_header.align_shift_count;
- fastload_length=ne_header.fastload_length<<ne_header.align_shift_count;
- TRACE(module, "Using fast-load area offset=%x len=%d\n",
- fastload_offset, fastload_length );
- if ((fastload = HeapAlloc( SystemHeap, 0, fastload_length )) != NULL)
- {
- _llseek32( hFile, fastload_offset, SEEK_SET);
- if (_lread32(hFile, fastload, fastload_length) != fastload_length)
- {
- HeapFree( SystemHeap, 0, fastload );
- fprintf(stderr, "Error reading fast-load area !\n");
- fastload = NULL;
- }
- }
- }
-
- /* Store the filename information */
-
- pModule->fileinfo = (int)pData - (int)pModule;
- size = sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1;
- memcpy( pData, ofs, size );
- ((OFSTRUCT *)pData)->cBytes = size - 1;
- pData += size;
-
- /* Get the segment table */
-
- pModule->seg_table = (int)pData - (int)pModule;
- buffer = HeapAlloc( SystemHeap, 0, ne_header.n_segment_tab *
- sizeof(struct ne_segment_table_entry_s));
- if (buffer)
- {
- int i;
- struct ne_segment_table_entry_s *pSeg;
-
- if (!READ( mz_header.e_lfanew + ne_header.segment_tab_offset,
- ne_header.n_segment_tab * sizeof(struct ne_segment_table_entry_s),
- buffer ))
- {
- HeapFree( SystemHeap, 0, buffer );
- if (fastload) HeapFree( SystemHeap, 0, fastload );
- GlobalFree16( hModule );
- return (HMODULE32)11; /* invalid exe */
- }
- pSeg = (struct ne_segment_table_entry_s *)buffer;
- for (i = ne_header.n_segment_tab; i > 0; i--, pSeg++)
- {
- memcpy( pData, pSeg, sizeof(*pSeg) );
- pData += sizeof(SEGTABLEENTRY);
- }
- HeapFree( SystemHeap, 0, buffer );
- }
- else
- {
- if (fastload) HeapFree( SystemHeap, 0, fastload );
- GlobalFree16( hModule );
- return (HMODULE32)11; /* invalid exe */
- }
-
- /* Get the resource table */
-
- if (ne_header.resource_tab_offset < ne_header.rname_tab_offset)
- {
- pModule->res_table = (int)pData - (int)pModule;
- if (!READ(mz_header.e_lfanew + ne_header.resource_tab_offset,
- ne_header.rname_tab_offset - ne_header.resource_tab_offset,
- pData )) return (HMODULE32)11; /* invalid exe */
- pData += ne_header.rname_tab_offset - ne_header.resource_tab_offset;
- NE_InitResourceHandler( hModule );
- }
- else pModule->res_table = 0; /* No resource table */
-
- /* Get the resident names table */
-
- pModule->name_table = (int)pData - (int)pModule;
- if (!READ( mz_header.e_lfanew + ne_header.rname_tab_offset,
- ne_header.moduleref_tab_offset - ne_header.rname_tab_offset,
- pData ))
- {
- if (fastload) HeapFree( SystemHeap, 0, fastload );
- GlobalFree16( hModule );
- return (HMODULE32)11; /* invalid exe */
- }
- pData += ne_header.moduleref_tab_offset - ne_header.rname_tab_offset;
-
- /* Get the module references table */
-
- if (ne_header.n_mod_ref_tab > 0)
- {
- pModule->modref_table = (int)pData - (int)pModule;
- if (!READ( mz_header.e_lfanew + ne_header.moduleref_tab_offset,
- ne_header.n_mod_ref_tab * sizeof(WORD),
- pData ))
- {
- if (fastload) HeapFree( SystemHeap, 0, fastload );
- GlobalFree16( hModule );
- return (HMODULE32)11; /* invalid exe */
- }
- pData += ne_header.n_mod_ref_tab * sizeof(WORD);
- }
- else pModule->modref_table = 0; /* No module references */
-
- /* Get the imported names table */
-
- pModule->import_table = (int)pData - (int)pModule;
- if (!READ( mz_header.e_lfanew + ne_header.iname_tab_offset,
- ne_header.entry_tab_offset - ne_header.iname_tab_offset,
- pData ))
- {
- if (fastload) HeapFree( SystemHeap, 0, fastload );
- GlobalFree16( hModule );
- return (HMODULE32)11; /* invalid exe */
- }
- pData += ne_header.entry_tab_offset - ne_header.iname_tab_offset;
-
- /* Get the entry table */
-
- pModule->entry_table = (int)pData - (int)pModule;
- if (!READ( mz_header.e_lfanew + ne_header.entry_tab_offset,
- ne_header.entry_tab_length,
- pData ))
- {
- if (fastload) HeapFree( SystemHeap, 0, fastload );
- GlobalFree16( hModule );
- return (HMODULE32)11; /* invalid exe */
- }
- pData += ne_header.entry_tab_length;
-
- /* Free the fast-load area */
-
-#undef READ
- if (fastload) HeapFree( SystemHeap, 0, fastload );
-
- /* Get the non-resident names table */
-
- if (ne_header.nrname_tab_length)
- {
- pModule->nrname_handle = GLOBAL_Alloc( 0, ne_header.nrname_tab_length,
- hModule, FALSE, FALSE, FALSE );
- if (!pModule->nrname_handle)
- {
- GlobalFree16( hModule );
- return (HMODULE32)11; /* invalid exe */
- }
- buffer = GlobalLock16( pModule->nrname_handle );
- _llseek32( hFile, ne_header.nrname_tab_offset, SEEK_SET );
- if (_lread32( hFile, buffer, ne_header.nrname_tab_length )
- != ne_header.nrname_tab_length)
- {
- GlobalFree16( pModule->nrname_handle );
- GlobalFree16( hModule );
- return (HMODULE32)11; /* invalid exe */
- }
- }
- else pModule->nrname_handle = 0;
-
- /* Allocate a segment for the implicitly-loaded DLLs */
-
- if (pModule->modref_count)
- {
- pModule->dlls_to_init = GLOBAL_Alloc(GMEM_ZEROINIT,
- (pModule->modref_count+1)*sizeof(HMODULE32),
- hModule, FALSE, FALSE, FALSE );
- if (!pModule->dlls_to_init)
- {
- if (pModule->nrname_handle) GlobalFree16( pModule->nrname_handle );
- GlobalFree16( hModule );
- return (HMODULE32)11; /* invalid exe */
- }
- }
- else pModule->dlls_to_init = 0;
-
- MODULE_RegisterModule( pModule );
- return hModule;
-}
-
-
-/***********************************************************************
- * MODULE_GetOrdinal
- *
- * Lookup the ordinal for a given name.
- */
-WORD MODULE_GetOrdinal( HMODULE32 hModule, const char *name )
-{
- unsigned char buffer[256], *cpnt;
- BYTE len;
- NE_MODULE *pModule;
-
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
-
- TRACE(module, "(%04x,'%s')\n",
- hModule, name );
-
- /* First handle names of the form '#xxxx' */
-
- if (name[0] == '#') return atoi( name + 1 );
-
- /* Now copy and uppercase the string */
-
- strcpy( buffer, name );
- CharUpper32A( buffer );
- len = strlen( buffer );
-
- /* First search the resident names */
-
- cpnt = (char *)pModule + pModule->name_table;
-
- /* Skip the first entry (module name) */
- cpnt += *cpnt + 1 + sizeof(WORD);
- while (*cpnt)
- {
- if (((BYTE)*cpnt == len) && !memcmp( cpnt+1, buffer, len ))
- {
- TRACE(module, " Found: ordinal=%d\n",
- *(WORD *)(cpnt + *cpnt + 1) );
- return *(WORD *)(cpnt + *cpnt + 1);
- }
- cpnt += *cpnt + 1 + sizeof(WORD);
- }
-
- /* Now search the non-resident names table */
-
- if (!pModule->nrname_handle) return 0; /* No non-resident table */
- cpnt = (char *)GlobalLock16( pModule->nrname_handle );
-
- /* Skip the first entry (module description string) */
- cpnt += *cpnt + 1 + sizeof(WORD);
- while (*cpnt)
- {
- if (((BYTE)*cpnt == len) && !memcmp( cpnt+1, buffer, len ))
- {
- TRACE(module, " Found: ordinal=%d\n",
- *(WORD *)(cpnt + *cpnt + 1) );
- return *(WORD *)(cpnt + *cpnt + 1);
- }
- cpnt += *cpnt + 1 + sizeof(WORD);
- }
- return 0;
-}
-
-
-/***********************************************************************
- * MODULE_GetEntryPoint
- *
- * Return the entry point for a given ordinal.
- */
-FARPROC16 MODULE_GetEntryPoint( HMODULE32 hModule, WORD ordinal )
-{
- NE_MODULE *pModule;
- WORD curOrdinal = 1;
- BYTE *p;
- WORD sel, offset;
-
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
-
- p = (BYTE *)pModule + pModule->entry_table;
- while (*p && (curOrdinal + *p <= ordinal))
- {
- /* Skipping this bundle */
- curOrdinal += *p;
- switch(p[1])
- {
- case 0: p += 2; break; /* unused */
- case 0xff: p += 2 + *p * 6; break; /* moveable */
- default: p += 2 + *p * 3; break; /* fixed */
- }
- }
- if (!*p) return 0;
-
- switch(p[1])
- {
- case 0: /* unused */
- return 0;
- case 0xff: /* moveable */
- p += 2 + 6 * (ordinal - curOrdinal);
- sel = p[3];
- offset = *(WORD *)(p + 4);
- break;
- default: /* fixed */
- sel = p[1];
- p += 2 + 3 * (ordinal - curOrdinal);
- offset = *(WORD *)(p + 1);
- break;
- }
-
- if (sel == 0xfe) sel = 0xffff; /* constant entry */
- else sel = (WORD)(DWORD)NE_SEG_TABLE(pModule)[sel-1].selector;
- return (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset );
-}
-
-
-/***********************************************************************
- * EntryAddrProc (WPROCS.27)
- */
-FARPROC16 WINAPI EntryAddrProc( HMODULE16 hModule, WORD ordinal )
-{
- return MODULE_GetEntryPoint( hModule, ordinal );
-}
-
-
-/***********************************************************************
- * MODULE_SetEntryPoint
- *
- * Change the value of an entry point. Use with caution!
- * It can only change the offset value, not the selector.
- */
-BOOL16 MODULE_SetEntryPoint( HMODULE32 hModule, WORD ordinal, WORD offset )
-{
- NE_MODULE *pModule;
- WORD curOrdinal = 1;
- BYTE *p;
-
- if (!(pModule = MODULE_GetPtr( hModule ))) return FALSE;
-
- p = (BYTE *)pModule + pModule->entry_table;
- while (*p && (curOrdinal + *p <= ordinal))
- {
- /* Skipping this bundle */
- curOrdinal += *p;
- switch(p[1])
- {
- case 0: p += 2; break; /* unused */
- case 0xff: p += 2 + *p * 6; break; /* moveable */
- default: p += 2 + *p * 3; break; /* fixed */
- }
- }
- if (!*p) return FALSE;
-
- switch(p[1])
- {
- case 0: /* unused */
- return FALSE;
- case 0xff: /* moveable */
- p += 2 + 6 * (ordinal - curOrdinal);
- *(WORD *)(p + 4) = offset;
- break;
- default: /* fixed */
- p += 2 + 3 * (ordinal - curOrdinal);
- *(WORD *)(p + 1) = offset;
- break;
- }
- return TRUE;
-}
-
-
-/***********************************************************************
* MODULE_GetWndProcEntry16 (not a Windows API function)
*
* Return an entry point from the WPROCS dll.
@@ -950,7 +291,7 @@
return (FARPROC16)PrintSetupDlgProc;
if (!strcmp(name,"ReplaceTextDlgProc"))
return (FARPROC16)ReplaceTextDlgProc16;
- fprintf(stderr,"warning: No mapping for %s(), add one in library/miscstubs.c\n",name);
+ WARN(module,"No mapping for %s(), add one in library/miscstubs.c\n",name);
assert( FALSE );
return NULL;
}
@@ -960,10 +301,10 @@
static HMODULE32 hModule = 0;
if (!hModule) hModule = GetModuleHandle16( "WPROCS" );
- ordinal = MODULE_GetOrdinal( hModule, name );
- if (!(ret = MODULE_GetEntryPoint( hModule, ordinal )))
+ ordinal = NE_GetOrdinal( hModule, name );
+ if (!(ret = NE_GetEntryPoint( hModule, ordinal )))
{
- fprintf( stderr, "GetWndProc16: %s not found\n", name );
+ WARN( module, "%s not found\n", name );
assert( FALSE );
}
}
@@ -980,7 +321,7 @@
BYTE *p, len;
static char buffer[10];
- if (!(pModule = MODULE_GetPtr( hModule ))) return NULL;
+ if (!(pModule = MODULE_GetPtr32( hModule ))) return NULL;
p = (BYTE *)pModule + pModule->name_table;
len = MIN( *p, 8 );
memcpy( buffer, p + 1, len );
@@ -990,25 +331,19 @@
/**********************************************************************
- * MODULE_RegisterModule
- */
-void MODULE_RegisterModule( NE_MODULE *pModule )
-{
- pModule->next = hFirstModule;
- hFirstModule = pModule->self;
-}
-
-
-/**********************************************************************
* MODULE_FindModule
*
* Find a module from a path name.
+ * RETURNS
+ * the win16 module handle if found
+ * 0 if not
*/
-HMODULE32 MODULE_FindModule( LPCSTR path )
-{
+HMODULE32 MODULE_FindModule16(
+ LPCSTR path /* [in] path of the module to be found */
+) {
HMODULE32 hModule = hFirstModule;
- LPCSTR filename, dotptr, modulepath, modulename;
- BYTE len, *name_table;
+ LPCSTR filename, dotptr, modulepath, modulename;
+ BYTE len, *name_table;
if (!(filename = strrchr( path, '\\' ))) filename = path;
else filename++;
@@ -1018,7 +353,7 @@
while(hModule)
{
- NE_MODULE *pModule = MODULE_GetPtr( hModule );
+ NE_MODULE *pModule = MODULE_GetPtr16( hModule );
if (!pModule) break;
modulepath = NE_MODULE_NAME(pModule);
if (!(modulename = strrchr( modulepath, '\\' )))
@@ -1034,6 +369,62 @@
return 0;
}
+/**********************************************************************
+ * MODULE_FindModule32
+ *
+ * Find a (loaded) win32 module depending on path
+ * The handling of '.' is a bit weird, but we need it that way,
+ * for sometimes the programs use '<name>.exe' and '<name>.dll' and
+ * this is the only way to differentiate. (mainly hypertrm.exe)
+ *
+ * RETURNS
+ * the module handle if found
+ * 0 if not
+ */
+HMODULE32 MODULE_FindModule32(
+ PDB32* process, /* [in] process in which to find the library */
+ LPCSTR path /* [in] pathname of module/library to be found */
+) {
+ LPSTR filename;
+ LPSTR dotptr;
+ WINE_MODREF *wm;
+
+ if (!(filename = strrchr( path, '\\' )))
+ filename = HEAP_strdupA(process->heap,0,path);
+ else
+ filename = HEAP_strdupA(process->heap,0,filename+1);
+ dotptr=strrchr(filename,'.');
+
+ if (!process) {
+ HeapFree(process->heap,0,filename);
+ return 0;
+ }
+ for (wm=process->modref_list;wm;wm=wm->next) {
+ LPSTR xmodname,xdotptr;
+
+ assert (wm->modname);
+ xmodname = HEAP_strdupA(process->heap,0,wm->modname);
+ xdotptr=strrchr(xmodname,'.');
+ if ( (xdotptr && !dotptr) ||
+ (!xdotptr && dotptr)
+ ) {
+ if (dotptr) *dotptr = '\0';
+ if (xdotptr) *xdotptr = '\0';
+ }
+ if (!lstrcmpi32A( filename, xmodname)) {
+ HeapFree(process->heap,0,filename);
+ HeapFree(process->heap,0,xmodname);
+ return wm->module;
+ }
+ if (dotptr) *dotptr='.';
+ /* FIXME: add paths, shortname */
+ HeapFree(process->heap,0,xmodname);
+ }
+ HeapFree(process->heap,0,filename);
+ return 0;
+}
+
+
/**********************************************************************
* MODULE_CallWEP
@@ -1044,9 +435,9 @@
static BOOL16 MODULE_CallWEP( HMODULE16 hModule )
{
FARPROC16 WEP = (FARPROC16)0;
- WORD ordinal = MODULE_GetOrdinal( hModule, "WEP" );
+ WORD ordinal = NE_GetOrdinal( hModule, "WEP" );
- if (ordinal) WEP = MODULE_GetEntryPoint( hModule, ordinal );
+ if (ordinal) WEP = NE_GetEntryPoint( hModule, ordinal );
if (!WEP)
{
WARN(module, "module %04x doesn't have a WEP\n", hModule );
@@ -1069,7 +460,7 @@
HMODULE16 *pModRef;
int i;
- if (!(pModule = MODULE_GetPtr( hModule ))) return FALSE;
+ if (!(pModule = MODULE_GetPtr32( hModule ))) return FALSE;
hModule = pModule->self;
if (((INT16)(--pModule->count)) > 0 ) return TRUE;
@@ -1100,7 +491,7 @@
hPrevModule = &hFirstModule;
while (*hPrevModule && (*hPrevModule != hModule))
{
- hPrevModule = &(MODULE_GetPtr( *hPrevModule ))->next;
+ hPrevModule = &(MODULE_GetPtr16( *hPrevModule ))->next;
}
if (*hPrevModule) *hPrevModule = pModule->next;
@@ -1157,12 +548,12 @@
lstrcpyn32A( ofs.szPathName, name, sizeof(ofs.szPathName) );
if ((hModule = MODULE_CreateDummyModule( &ofs )) < 32) return hModule;
pModule = (NE_MODULE *)GlobalLock16( hModule );
- hPrevInstance = 0;
- hInstance = MODULE_CreateInstance( hModule, (cmd_line == NULL) );
+ hInstance = MODULE_CreateInstance( hModule, &hPrevInstance,
+ (cmd_line == NULL) );
}
else
{
- hModule = MODULE_FindModule( name );
+ hModule = MODULE_FindModule16( name );
if (!hModule) /* We have to load the module */
{
@@ -1175,7 +566,7 @@
/* Now try the built-in even if disabled */
if ((hModule = fnBUILTIN_LoadModule( name, TRUE )))
{
- fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name );
+ WARN(module, "Could not load Windows DLL '%s', using built-in module.\n", name );
return MODULE_HANDLEtoHMODULE16( hModule );
}
return 2; /* File not found */
@@ -1183,59 +574,26 @@
/* Create the module structure */
- hModule = MODULE_LoadExeHeader( hFile, &ofs );
+ hModule = NE_LoadModule( hFile, &ofs, uFlags, cmd_line,
+ env, show_cmd );
if (hModule < 32)
{
if ((hModule == 21) && cmd_line)
hModule = PE_LoadModule( hFile, &ofs, cmd_line,
env, show_cmd );
- _lclose32( hFile );
-
- if (hModule < 32)
- fprintf( stderr, "LoadModule: can't load '%s', error=%d\n",
- name, hModule );
- return hModule;
}
+
+ if (hModule < 32)
+ fprintf( stderr, "LoadModule: can't load '%s', error=%d\n",
+ name, hModule );
_lclose32( hFile );
- pModule = MODULE_GetPtr( hModule );
- pModule->flags |= uFlags; /* stamp implicitly loaded modules */
-
- /* Allocate the segments for this module */
-
- MODULE_CreateSegments( hModule );
- hPrevInstance = 0;
- hInstance = MODULE_CreateInstance( hModule, (cmd_line == NULL) );
-
- /* Load the referenced DLLs */
-
- if (!NE_LoadDLLs( pModule )) return 2; /* File not found */
-
- /* Load the segments */
-
- NE_LoadAllSegments( pModule );
-
- /* Fixup the functions prologs */
-
- NE_FixupPrologs( pModule );
-
- /* Make sure the usage count is 1 on the first loading of */
- /* the module, even if it contains circular DLL references */
-
- pModule->count = 1;
-
- /* Call initialization rountines for all loaded DLLs. Note that
- * when we load implicitly linked DLLs this will be done by InitTask().
- */
-
- if ((pModule->flags & (NE_FFLAGS_LIBMODULE | NE_FFLAGS_IMPLICIT)) ==
- NE_FFLAGS_LIBMODULE )
- NE_InitializeDLLs( hModule );
+ return hModule;
}
else /* module is already loaded, just create a new data segment if it's a task */
{
- pModule = MODULE_GetPtr( hModule );
- hPrevInstance = MODULE_GetInstance( hModule );
- hInstance = MODULE_CreateInstance( hModule, (cmd_line == NULL) );
+ pModule = MODULE_GetPtr32( hModule );
+ hInstance = MODULE_CreateInstance( hModule, &hPrevInstance,
+ (cmd_line == NULL) );
if (hInstance != hPrevInstance) /* not a library */
NE_LoadSegment( pModule, pModule->dgroup );
pModule->count++;
@@ -1337,7 +695,7 @@
{
NE_MODULE *pModule;
- if (!(pModule = MODULE_GetPtr( hModule ))) return FALSE;
+ if (!(pModule = MODULE_GetPtr16( hModule ))) return FALSE;
TRACE(module, "%s count %d\n",
MODULE_GetModuleName(hModule), pModule->count );
@@ -1350,13 +708,13 @@
*/
HMODULE16 WINAPI WIN16_GetModuleHandle( SEGPTR name )
{
- if (HIWORD(name) == 0) return MODULE_HANDLEtoHMODULE16( (HINSTANCE16)name );
- return MODULE_FindModule( PTR_SEG_TO_LIN(name) );
+ if (HIWORD(name) == 0) return GetExePtr( (HINSTANCE16)name );
+ return MODULE_FindModule16( PTR_SEG_TO_LIN(name) );
}
HMODULE16 WINAPI GetModuleHandle16( LPCSTR name )
{
- return MODULE_FindModule( name );
+ return MODULE_FindModule16( name );
}
/***********************************************************************
@@ -1364,17 +722,12 @@
*/
HMODULE32 WINAPI GetModuleHandle32A(LPCSTR module)
{
- HMODULE32 hModule;
TRACE(win32, "%s\n", module ? module : "NULL");
-/* Freecell uses the result of GetModuleHandleA(0) as the hInstance in
-all calls to e.g. CreateWindowEx. */
- if (module == NULL) {
- TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
- hModule = pTask->hInstance;
- } else
- hModule = MODULE_FindModule(module);
- return MODULE_HANDLEtoHMODULE32(hModule);
+ if (module == NULL)
+ return PROCESS_Current()->exe_modref->module;
+ else
+ return MODULE_FindModule32(PROCESS_Current(),module);
}
HMODULE32 WINAPI GetModuleHandle32W(LPCWSTR module)
@@ -1394,7 +747,7 @@
{
NE_MODULE *pModule;
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
+ if (!(pModule = MODULE_GetPtr16( hModule ))) return 0;
TRACE(module, "(%04x): returning %d\n",
hModule, pModule->count );
return pModule->count;
@@ -1410,7 +763,7 @@
NE_MODULE *pModule;
if (!hModule) hModule = GetCurrentTask();
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
+ if (!(pModule = MODULE_GetPtr16( hModule ))) return 0;
lstrcpyn32A( lpFileName, NE_MODULE_NAME(pModule), nSize );
TRACE(module, "%s\n", lpFileName );
return strlen(lpFileName);
@@ -1419,6 +772,7 @@
/***********************************************************************
* GetModuleFileName32A (KERNEL32.235)
+ * FIXME FIXME
*/
DWORD WINAPI GetModuleFileName32A( HMODULE32 hModule, LPSTR lpFileName,
DWORD size )
@@ -1430,7 +784,7 @@
TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
hModule = pTask->hInstance;
}
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
+ if (!(pModule = MODULE_GetPtr32( hModule ))) return 0;
lstrcpyn32A( lpFileName, NE_MODULE_NAME(pModule), size );
TRACE(module, "%s\n", lpFileName );
return strlen(lpFileName);
@@ -1471,7 +825,7 @@
HMODULE32 WINAPI LoadLibraryEx32W16( LPCSTR libname, HANDLE16 hf,
DWORD flags )
{
- fprintf(stderr,"LoadLibraryEx32W(%s,%d,%08lx)\n",libname,hf,flags);
+ TRACE(module,"(%s,%d,%08lx)\n",libname,hf,flags);
return LoadLibraryEx32A(libname, hf,flags);
}
@@ -1528,9 +882,8 @@
*/
BOOL32 WINAPI FreeLibrary32(HINSTANCE32 hLibModule)
{
- TRACE(module,"hLibModule=%08x\n", hLibModule);
- return MODULE_FreeModule(hLibModule,
- GlobalLock16(GetCurrentTask()) );
+ TRACE(module,"hLibModule=%08x\n", hLibModule);
+ return MODULE_FreeModule(hLibModule,GlobalLock16(GetCurrentTask()) );
}
@@ -1541,11 +894,6 @@
{
HINSTANCE16 handle;
- if (__winelib)
- {
- fprintf( stderr, "LoadLibrary not supported in Winelib\n" );
- return 0;
- }
TRACE(module, "(%08x) %s\n", (int)libname, libname);
handle = MODULE_Load( libname, 0, NULL, NULL, 0 );
@@ -1730,7 +1078,7 @@
execvp(argv[0] , (char**)argv);
/* Failed ! */
- fprintf(stderr, "WinExec: can't exec 'wine %s'\n",
+ MSG("WinExec: can't exec 'wine %s'\n",
lpCmdLine);
}
exit(1);
@@ -1752,12 +1100,12 @@
FARPROC16 ret;
if (!hModule) {
- fprintf(stderr,"WIN32_GetProcAddress16: hModule may not be 0!\n");
+ WARN(module,"hModule may not be 0!\n");
return (FARPROC16)0;
}
hModule = MODULE_HANDLEtoHMODULE16(hModule);
if (HIWORD(name)) {
- ordinal = MODULE_GetOrdinal( hModule, name );
+ ordinal = NE_GetOrdinal( hModule, name );
TRACE(module, "%04x '%s'\n",
hModule, name );
} else {
@@ -1766,7 +1114,7 @@
hModule, ordinal );
}
if (!ordinal) return (FARPROC16)0;
- ret = MODULE_GetEntryPoint( hModule, ordinal );
+ ret = NE_GetEntryPoint( hModule, ordinal );
TRACE(module,"returning %08x\n",(UINT32)ret);
return ret;
}
@@ -1780,11 +1128,11 @@
FARPROC16 ret;
if (!hModule) hModule = GetCurrentTask();
- hModule = MODULE_HANDLEtoHMODULE16( hModule );
+ hModule = GetExePtr( hModule );
if (HIWORD(name) != 0)
{
- ordinal = MODULE_GetOrdinal( hModule, (LPSTR)PTR_SEG_TO_LIN(name) );
+ ordinal = NE_GetOrdinal( hModule, (LPSTR)PTR_SEG_TO_LIN(name) );
TRACE(module, "%04x '%s'\n",
hModule, (LPSTR)PTR_SEG_TO_LIN(name) );
}
@@ -1796,7 +1144,7 @@
}
if (!ordinal) return (FARPROC16)0;
- ret = MODULE_GetEntryPoint( hModule, ordinal );
+ ret = NE_GetEntryPoint( hModule, ordinal );
TRACE(module, "returning %08x\n", (UINT32)ret );
return ret;
@@ -1804,29 +1152,41 @@
/***********************************************************************
- * GetProcAddress32 (KERNEL32.257)
+ * GetProcAddress32 (KERNEL32.257)
*/
FARPROC32 WINAPI GetProcAddress32( HMODULE32 hModule, LPCSTR function )
{
- NE_MODULE *pModule;
+ return MODULE_GetProcAddress32( PROCESS_Current(), hModule, function );
+}
+
+
+/***********************************************************************
+ * MODULE_GetProcAddress32 (internal)
+ */
+FARPROC32 MODULE_GetProcAddress32(
+ PDB32 *process, /* [in] process context */
+ HMODULE32 hModule, /* [in] current module handle */
+ LPCSTR function ) /* [in] function to be looked up */
+{
+ WINE_MODREF *wm = MODULE32_LookupHMODULE(process,hModule);
if (HIWORD(function))
TRACE(win32,"(%08lx,%s)\n",(DWORD)hModule,function);
else
TRACE(win32,"(%08lx,%p)\n",(DWORD)hModule,function);
- if (!(pModule = MODULE_GetPtr( hModule )))
+ if (!wm)
return (FARPROC32)0;
- if (!pModule->module32)
+ switch (wm->type)
{
- fprintf(stderr,"Oops, Module 0x%08lx has got no module32?\n",
- (DWORD)MODULE_HANDLEtoHMODULE32(hModule)
- );
- return (FARPROC32)0;
+ case MODULE32_PE:
+ return PE_FindExportedFunction( process, wm, function);
+ default:
+ ERR(module,"wine_modref type %d not handled.\n",wm->type);
+ return (FARPROC32)0;
}
- return PE_FindExportedFunction( PROCESS_Current(), pModule->module32,
- function );
}
+
/***********************************************************************
* RtlImageNtHeaders (NTDLL)
*/
@@ -1837,13 +1197,9 @@
* but we could get HMODULE16 or the like (think builtin modules)
*/
- NE_MODULE *pModule;
-
- if (!(pModule = MODULE_GetPtr( hModule )))
- return (LPIMAGE_NT_HEADERS)0;
- if (!(pModule->flags & NE_FFLAGS_WIN32) || !pModule->module32)
- return (LPIMAGE_NT_HEADERS)0;
- return PE_HEADER(pModule->module32);
+ WINE_MODREF *wm = MODULE32_LookupHMODULE( PROCESS_Current(), hModule );
+ if (!wm || (wm->type != MODULE32_PE)) return (LPIMAGE_NT_HEADERS)0;
+ return PE_HEADER(wm->module);
}
@@ -1852,7 +1208,7 @@
*/
WORD WINAPI GetExpWinVer( HMODULE16 hModule )
{
- NE_MODULE *pModule = MODULE_GetPtr( hModule );
+ NE_MODULE *pModule = MODULE_GetPtr16( hModule );
return pModule ? pModule->expected_version : 0;
}
@@ -1863,7 +1219,7 @@
BOOL16 WINAPI IsSharedSelector( HANDLE16 selector )
{
/* Check whether the selector belongs to a DLL */
- NE_MODULE *pModule = MODULE_GetPtr( selector );
+ NE_MODULE *pModule = MODULE_GetPtr16( selector );
if (!pModule) return FALSE;
return (pModule->flags & NE_FFLAGS_LIBMODULE) != 0;
}
@@ -1888,7 +1244,7 @@
char *name;
if (!lpme->wNext) return FALSE;
- if (!(pModule = MODULE_GetPtr( lpme->wNext ))) return FALSE;
+ if (!(pModule = MODULE_GetPtr16( lpme->wNext ))) return FALSE;
name = (char *)pModule + pModule->name_table;
memcpy( lpme->szModule, name + 1, *name );
lpme->szModule[(BYTE)*name] = '\0';
@@ -1916,7 +1272,7 @@
*/
BOOL16 WINAPI ModuleFindHandle( MODULEENTRY *lpme, HMODULE16 hModule )
{
- hModule = MODULE_HANDLEtoHMODULE16( hModule );
+ hModule = GetExePtr( hModule );
lpme->wNext = hModule;
return ModuleNext( lpme );
}
diff --git a/loader/ne/Makefile.in b/loader/ne/Makefile.in
new file mode 100644
index 0000000..0acbdc1
--- /dev/null
+++ b/loader/ne/Makefile.in
@@ -0,0 +1,17 @@
+DEFS = @DLLFLAGS@ -D__WINE__
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../..
+SRCDIR = @srcdir@
+VPATH = @srcdir@
+MODULE = ne
+
+C_SRCS = \
+ module.c \
+ resource.c \
+ segment.c
+
+all: $(MODULE).o
+
+@MAKE_RULES@
+
+### Dependencies:
diff --git a/loader/ne/module.c b/loader/ne/module.c
new file mode 100644
index 0000000..5cd97f8
--- /dev/null
+++ b/loader/ne/module.c
@@ -0,0 +1,736 @@
+/*
+ * NE modules
+ *
+ * Copyright 1995 Alexandre Julliard
+ */
+
+#include <assert.h>
+#include <stdlib.h>
+#include "module.h"
+#include "ldt.h"
+#include "heap.h"
+#include "global.h"
+#include "process.h"
+#include "debug.h"
+
+HMODULE16 hFirstModule = 0;
+
+/***********************************************************************
+ * NE_DumpModule
+ */
+void NE_DumpModule( HMODULE16 hModule )
+{
+ int i, ordinal;
+ SEGTABLEENTRY *pSeg;
+ BYTE *pstr;
+ WORD *pword;
+ NE_MODULE *pModule;
+
+ if (!(pModule = MODULE_GetPtr16( hModule )))
+ {
+ fprintf( stderr, "**** %04x is not a module handle\n", hModule );
+ return;
+ }
+
+ /* Dump the module info */
+ DUMP( "---\n" );
+ DUMP( "Module %04x:\n", hModule );
+ DUMP( "count=%d flags=%04x heap=%d stack=%d\n",
+ pModule->count, pModule->flags,
+ pModule->heap_size, pModule->stack_size );
+ DUMP( "cs:ip=%04x:%04x ss:sp=%04x:%04x ds=%04x nb seg=%d modrefs=%d\n",
+ pModule->cs, pModule->ip, pModule->ss, pModule->sp, pModule->dgroup,
+ pModule->seg_count, pModule->modref_count );
+ DUMP( "os_flags=%d swap_area=%d version=%04x\n",
+ pModule->os_flags, pModule->min_swap_area,
+ pModule->expected_version );
+ if (pModule->flags & NE_FFLAGS_WIN32)
+ DUMP( "PE module=%08x\n", pModule->module32 );
+
+ /* Dump the file info */
+ DUMP( "---\n" );
+ DUMP( "Filename: '%s'\n", NE_MODULE_NAME(pModule) );
+
+ /* Dump the segment table */
+ DUMP( "---\n" );
+ DUMP( "Segment table:\n" );
+ pSeg = NE_SEG_TABLE( pModule );
+ for (i = 0; i < pModule->seg_count; i++, pSeg++)
+ DUMP( "%02x: pos=%d size=%d flags=%04x minsize=%d sel=%04x\n",
+ i + 1, pSeg->filepos, pSeg->size, pSeg->flags,
+ pSeg->minsize, pSeg->selector );
+
+ /* Dump the resource table */
+ DUMP( "---\n" );
+ DUMP( "Resource table:\n" );
+ if (pModule->res_table)
+ {
+ pword = (WORD *)((BYTE *)pModule + pModule->res_table);
+ DUMP( "Alignment: %d\n", *pword++ );
+ while (*pword)
+ {
+ struct resource_typeinfo_s *ptr = (struct resource_typeinfo_s *)pword;
+ struct resource_nameinfo_s *pname = (struct resource_nameinfo_s *)(ptr + 1);
+ DUMP( "id=%04x count=%d\n", ptr->type_id, ptr->count );
+ for (i = 0; i < ptr->count; i++, pname++)
+ DUMP( "offset=%d len=%d id=%04x\n",
+ pname->offset, pname->length, pname->id );
+ pword = (WORD *)pname;
+ }
+ }
+ else DUMP( "None\n" );
+
+ /* Dump the resident name table */
+ DUMP( "---\n" );
+ DUMP( "Resident-name table:\n" );
+ pstr = (char *)pModule + pModule->name_table;
+ while (*pstr)
+ {
+ DUMP( "%*.*s: %d\n", *pstr, *pstr, pstr + 1,
+ *(WORD *)(pstr + *pstr + 1) );
+ pstr += *pstr + 1 + sizeof(WORD);
+ }
+
+ /* Dump the module reference table */
+ DUMP( "---\n" );
+ DUMP( "Module ref table:\n" );
+ if (pModule->modref_table)
+ {
+ pword = (WORD *)((BYTE *)pModule + pModule->modref_table);
+ for (i = 0; i < pModule->modref_count; i++, pword++)
+ {
+ DUMP( "%d: %04x -> '%s'\n", i, *pword,
+ MODULE_GetModuleName(*pword));
+ }
+ }
+ else DUMP( "None\n" );
+
+ /* Dump the entry table */
+ DUMP( "---\n" );
+ DUMP( "Entry table:\n" );
+ pstr = (char *)pModule + pModule->entry_table;
+ ordinal = 1;
+ while (*pstr)
+ {
+ DUMP( "Bundle %d-%d: %02x\n", ordinal, ordinal + *pstr - 1, pstr[1]);
+ if (!pstr[1])
+ {
+ ordinal += *pstr;
+ pstr += 2;
+ }
+ else if ((BYTE)pstr[1] == 0xff) /* moveable */
+ {
+ i = *pstr;
+ pstr += 2;
+ while (i--)
+ {
+ DUMP( "%d: %02x:%04x (moveable)\n",
+ ordinal++, pstr[3], *(WORD *)(pstr + 4) );
+ pstr += 6;
+ }
+ }
+ else /* fixed */
+ {
+ i = *pstr;
+ pstr += 2;
+ while (i--)
+ {
+ DUMP( "%d: %04x (fixed)\n",
+ ordinal++, *(WORD *)(pstr + 1) );
+ pstr += 3;
+ }
+ }
+ }
+
+ /* Dump the non-resident names table */
+ DUMP( "---\n" );
+ DUMP( "Non-resident names table:\n" );
+ if (pModule->nrname_handle)
+ {
+ pstr = (char *)GlobalLock16( pModule->nrname_handle );
+ while (*pstr)
+ {
+ DUMP( "%*.*s: %d\n", *pstr, *pstr, pstr + 1,
+ *(WORD *)(pstr + *pstr + 1) );
+ pstr += *pstr + 1 + sizeof(WORD);
+ }
+ }
+ DUMP( "\n" );
+}
+
+
+/***********************************************************************
+ * NE_WalkModules
+ *
+ * Walk the module list and print the modules.
+ */
+void NE_WalkModules(void)
+{
+ HMODULE16 hModule = hFirstModule;
+ fprintf( stderr, "Module Flags Name\n" );
+ while (hModule)
+ {
+ NE_MODULE *pModule = MODULE_GetPtr16( hModule );
+ if (!pModule)
+ {
+ fprintf( stderr, "**** Bad module %04x in list\n", hModule );
+ return;
+ }
+ fprintf( stderr, " %04x %04x %.*s\n", hModule, pModule->flags,
+ *((char *)pModule + pModule->name_table),
+ (char *)pModule + pModule->name_table + 1 );
+ hModule = pModule->next;
+ }
+}
+
+
+/**********************************************************************
+ * NE_RegisterModule
+ */
+void NE_RegisterModule( NE_MODULE *pModule )
+{
+ pModule->next = hFirstModule;
+ hFirstModule = pModule->self;
+}
+
+
+/***********************************************************************
+ * NE_GetOrdinal
+ *
+ * Lookup the ordinal for a given name.
+ */
+WORD NE_GetOrdinal( HMODULE16 hModule, const char *name )
+{
+ unsigned char buffer[256], *cpnt;
+ BYTE len;
+ NE_MODULE *pModule;
+
+ if (!(pModule = MODULE_GetPtr16( hModule ))) return 0;
+ assert( !(pModule->flags & NE_FFLAGS_WIN32) );
+
+ TRACE( module, "(%04x,'%s')\n", hModule, name );
+
+ /* First handle names of the form '#xxxx' */
+
+ if (name[0] == '#') return atoi( name + 1 );
+
+ /* Now copy and uppercase the string */
+
+ strcpy( buffer, name );
+ CharUpper32A( buffer );
+ len = strlen( buffer );
+
+ /* First search the resident names */
+
+ cpnt = (char *)pModule + pModule->name_table;
+
+ /* Skip the first entry (module name) */
+ cpnt += *cpnt + 1 + sizeof(WORD);
+ while (*cpnt)
+ {
+ if (((BYTE)*cpnt == len) && !memcmp( cpnt+1, buffer, len ))
+ {
+ TRACE(module, " Found: ordinal=%d\n",
+ *(WORD *)(cpnt + *cpnt + 1) );
+ return *(WORD *)(cpnt + *cpnt + 1);
+ }
+ cpnt += *cpnt + 1 + sizeof(WORD);
+ }
+
+ /* Now search the non-resident names table */
+
+ if (!pModule->nrname_handle) return 0; /* No non-resident table */
+ cpnt = (char *)GlobalLock16( pModule->nrname_handle );
+
+ /* Skip the first entry (module description string) */
+ cpnt += *cpnt + 1 + sizeof(WORD);
+ while (*cpnt)
+ {
+ if (((BYTE)*cpnt == len) && !memcmp( cpnt+1, buffer, len ))
+ {
+ TRACE(module, " Found: ordinal=%d\n",
+ *(WORD *)(cpnt + *cpnt + 1) );
+ return *(WORD *)(cpnt + *cpnt + 1);
+ }
+ cpnt += *cpnt + 1 + sizeof(WORD);
+ }
+ return 0;
+}
+
+
+/***********************************************************************
+ * NE_GetEntryPoint (WPROCS.27)
+ *
+ * Return the entry point for a given ordinal.
+ */
+FARPROC16 NE_GetEntryPoint( HMODULE16 hModule, WORD ordinal )
+{
+ NE_MODULE *pModule;
+ WORD curOrdinal = 1;
+ BYTE *p;
+ WORD sel, offset;
+
+ if (!(pModule = MODULE_GetPtr16( hModule ))) return 0;
+ assert( !(pModule->flags & NE_FFLAGS_WIN32) );
+
+ p = (BYTE *)pModule + pModule->entry_table;
+ while (*p && (curOrdinal + *p <= ordinal))
+ {
+ /* Skipping this bundle */
+ curOrdinal += *p;
+ switch(p[1])
+ {
+ case 0: p += 2; break; /* unused */
+ case 0xff: p += 2 + *p * 6; break; /* moveable */
+ default: p += 2 + *p * 3; break; /* fixed */
+ }
+ }
+ if (!*p) return 0;
+
+ switch(p[1])
+ {
+ case 0: /* unused */
+ return 0;
+ case 0xff: /* moveable */
+ p += 2 + 6 * (ordinal - curOrdinal);
+ sel = p[3];
+ offset = *(WORD *)(p + 4);
+ break;
+ default: /* fixed */
+ sel = p[1];
+ p += 2 + 3 * (ordinal - curOrdinal);
+ offset = *(WORD *)(p + 1);
+ break;
+ }
+
+ if (sel == 0xfe) sel = 0xffff; /* constant entry */
+ else sel = (WORD)(DWORD)NE_SEG_TABLE(pModule)[sel-1].selector;
+ return (FARPROC16)PTR_SEG_OFF_TO_SEGPTR( sel, offset );
+}
+
+
+/***********************************************************************
+ * NE_SetEntryPoint
+ *
+ * Change the value of an entry point. Use with caution!
+ * It can only change the offset value, not the selector.
+ */
+BOOL16 NE_SetEntryPoint( HMODULE16 hModule, WORD ordinal, WORD offset )
+{
+ NE_MODULE *pModule;
+ WORD curOrdinal = 1;
+ BYTE *p;
+
+ if (!(pModule = MODULE_GetPtr16( hModule ))) return FALSE;
+ assert( !(pModule->flags & NE_FFLAGS_WIN32) );
+
+ p = (BYTE *)pModule + pModule->entry_table;
+ while (*p && (curOrdinal + *p <= ordinal))
+ {
+ /* Skipping this bundle */
+ curOrdinal += *p;
+ switch(p[1])
+ {
+ case 0: p += 2; break; /* unused */
+ case 0xff: p += 2 + *p * 6; break; /* moveable */
+ default: p += 2 + *p * 3; break; /* fixed */
+ }
+ }
+ if (!*p) return FALSE;
+
+ switch(p[1])
+ {
+ case 0: /* unused */
+ return FALSE;
+ case 0xff: /* moveable */
+ p += 2 + 6 * (ordinal - curOrdinal);
+ *(WORD *)(p + 4) = offset;
+ break;
+ default: /* fixed */
+ p += 2 + 3 * (ordinal - curOrdinal);
+ *(WORD *)(p + 1) = offset;
+ break;
+ }
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * NE_LoadExeHeader
+ */
+static HMODULE16 NE_LoadExeHeader( HFILE32 hFile, OFSTRUCT *ofs )
+{
+ IMAGE_DOS_HEADER mz_header;
+ IMAGE_OS2_HEADER ne_header;
+ int size;
+ HMODULE16 hModule;
+ NE_MODULE *pModule;
+ BYTE *pData;
+ char *buffer, *fastload = NULL;
+ int fastload_offset = 0, fastload_length = 0;
+
+ /* Read a block from either the file or the fast-load area. */
+#define READ(offset,size,buffer) \
+ ((fastload && ((offset) >= fastload_offset) && \
+ ((offset)+(size) <= fastload_offset+fastload_length)) ? \
+ (memcpy( buffer, fastload+(offset)-fastload_offset, (size) ), TRUE) : \
+ (_llseek32( hFile, (offset), SEEK_SET), \
+ _lread32( hFile, (buffer), (size) ) == (size)))
+
+ _llseek32( hFile, 0, SEEK_SET );
+ if ((_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
+ (mz_header.e_magic != IMAGE_DOS_SIGNATURE))
+ return (HMODULE16)11; /* invalid exe */
+
+ _llseek32( hFile, mz_header.e_lfanew, SEEK_SET );
+ if (_lread32( hFile, &ne_header, sizeof(ne_header) ) != sizeof(ne_header))
+ return (HMODULE16)11; /* invalid exe */
+
+ if (ne_header.ne_magic == IMAGE_NT_SIGNATURE) return (HMODULE16)21; /* win32 exe */
+ if (ne_header.ne_magic != IMAGE_OS2_SIGNATURE) return (HMODULE16)11; /* invalid exe */
+
+ if (ne_header.ne_magic == IMAGE_OS2_SIGNATURE_LX) {
+ fprintf(stderr, "Sorry, this is an OS/2 linear executable (LX) file !\n");
+ return (HMODULE16)12;
+ }
+
+ /* We now have a valid NE header */
+
+ size = sizeof(NE_MODULE) +
+ /* loaded file info */
+ sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1+
+ /* segment table */
+ ne_header.n_segment_tab * sizeof(SEGTABLEENTRY) +
+ /* resource table */
+ ne_header.rname_tab_offset - ne_header.resource_tab_offset +
+ /* resident names table */
+ ne_header.moduleref_tab_offset - ne_header.rname_tab_offset +
+ /* module ref table */
+ ne_header.n_mod_ref_tab * sizeof(WORD) +
+ /* imported names table */
+ ne_header.entry_tab_offset - ne_header.iname_tab_offset +
+ /* entry table length */
+ ne_header.entry_tab_length;
+
+ hModule = GlobalAlloc16( GMEM_MOVEABLE | GMEM_ZEROINIT, size );
+ if (!hModule) return (HMODULE16)11; /* invalid exe */
+ FarSetOwner( hModule, hModule );
+ pModule = (NE_MODULE *)GlobalLock16( hModule );
+ memcpy( pModule, &ne_header, sizeof(ne_header) );
+ pModule->count = 0;
+ pModule->module32 = 0;
+ pModule->self = hModule;
+ pModule->self_loading_sel = 0;
+ pData = (BYTE *)(pModule + 1);
+
+ /* Clear internal Wine flags in case they are set in the EXE file */
+
+ pModule->flags &= ~(NE_FFLAGS_BUILTIN|NE_FFLAGS_WIN32|NE_FFLAGS_IMPLICIT);
+
+ /* Read the fast-load area */
+
+ if (ne_header.additional_flags & NE_AFLAGS_FASTLOAD)
+ {
+ fastload_offset=ne_header.fastload_offset<<ne_header.align_shift_count;
+ fastload_length=ne_header.fastload_length<<ne_header.align_shift_count;
+ TRACE(module, "Using fast-load area offset=%x len=%d\n",
+ fastload_offset, fastload_length );
+ if ((fastload = HeapAlloc( SystemHeap, 0, fastload_length )) != NULL)
+ {
+ _llseek32( hFile, fastload_offset, SEEK_SET);
+ if (_lread32(hFile, fastload, fastload_length) != fastload_length)
+ {
+ HeapFree( SystemHeap, 0, fastload );
+ fprintf(stderr, "Error reading fast-load area !\n");
+ fastload = NULL;
+ }
+ }
+ }
+
+ /* Store the filename information */
+
+ pModule->fileinfo = (int)pData - (int)pModule;
+ size = sizeof(OFSTRUCT)-sizeof(ofs->szPathName)+strlen(ofs->szPathName)+1;
+ memcpy( pData, ofs, size );
+ ((OFSTRUCT *)pData)->cBytes = size - 1;
+ pData += size;
+
+ /* Get the segment table */
+
+ pModule->seg_table = (int)pData - (int)pModule;
+ buffer = HeapAlloc( SystemHeap, 0, ne_header.n_segment_tab *
+ sizeof(struct ne_segment_table_entry_s));
+ if (buffer)
+ {
+ int i;
+ struct ne_segment_table_entry_s *pSeg;
+
+ if (!READ( mz_header.e_lfanew + ne_header.segment_tab_offset,
+ ne_header.n_segment_tab * sizeof(struct ne_segment_table_entry_s),
+ buffer ))
+ {
+ HeapFree( SystemHeap, 0, buffer );
+ if (fastload) HeapFree( SystemHeap, 0, fastload );
+ GlobalFree16( hModule );
+ return (HMODULE16)11; /* invalid exe */
+ }
+ pSeg = (struct ne_segment_table_entry_s *)buffer;
+ for (i = ne_header.n_segment_tab; i > 0; i--, pSeg++)
+ {
+ memcpy( pData, pSeg, sizeof(*pSeg) );
+ pData += sizeof(SEGTABLEENTRY);
+ }
+ HeapFree( SystemHeap, 0, buffer );
+ }
+ else
+ {
+ if (fastload) HeapFree( SystemHeap, 0, fastload );
+ GlobalFree16( hModule );
+ return (HMODULE16)11; /* invalid exe */
+ }
+
+ /* Get the resource table */
+
+ if (ne_header.resource_tab_offset < ne_header.rname_tab_offset)
+ {
+ pModule->res_table = (int)pData - (int)pModule;
+ if (!READ(mz_header.e_lfanew + ne_header.resource_tab_offset,
+ ne_header.rname_tab_offset - ne_header.resource_tab_offset,
+ pData )) return (HMODULE16)11; /* invalid exe */
+ pData += ne_header.rname_tab_offset - ne_header.resource_tab_offset;
+ NE_InitResourceHandler( hModule );
+ }
+ else pModule->res_table = 0; /* No resource table */
+
+ /* Get the resident names table */
+
+ pModule->name_table = (int)pData - (int)pModule;
+ if (!READ( mz_header.e_lfanew + ne_header.rname_tab_offset,
+ ne_header.moduleref_tab_offset - ne_header.rname_tab_offset,
+ pData ))
+ {
+ if (fastload) HeapFree( SystemHeap, 0, fastload );
+ GlobalFree16( hModule );
+ return (HMODULE16)11; /* invalid exe */
+ }
+ pData += ne_header.moduleref_tab_offset - ne_header.rname_tab_offset;
+
+ /* Get the module references table */
+
+ if (ne_header.n_mod_ref_tab > 0)
+ {
+ pModule->modref_table = (int)pData - (int)pModule;
+ if (!READ( mz_header.e_lfanew + ne_header.moduleref_tab_offset,
+ ne_header.n_mod_ref_tab * sizeof(WORD),
+ pData ))
+ {
+ if (fastload) HeapFree( SystemHeap, 0, fastload );
+ GlobalFree16( hModule );
+ return (HMODULE16)11; /* invalid exe */
+ }
+ pData += ne_header.n_mod_ref_tab * sizeof(WORD);
+ }
+ else pModule->modref_table = 0; /* No module references */
+
+ /* Get the imported names table */
+
+ pModule->import_table = (int)pData - (int)pModule;
+ if (!READ( mz_header.e_lfanew + ne_header.iname_tab_offset,
+ ne_header.entry_tab_offset - ne_header.iname_tab_offset,
+ pData ))
+ {
+ if (fastload) HeapFree( SystemHeap, 0, fastload );
+ GlobalFree16( hModule );
+ return (HMODULE16)11; /* invalid exe */
+ }
+ pData += ne_header.entry_tab_offset - ne_header.iname_tab_offset;
+
+ /* Get the entry table */
+
+ pModule->entry_table = (int)pData - (int)pModule;
+ if (!READ( mz_header.e_lfanew + ne_header.entry_tab_offset,
+ ne_header.entry_tab_length,
+ pData ))
+ {
+ if (fastload) HeapFree( SystemHeap, 0, fastload );
+ GlobalFree16( hModule );
+ return (HMODULE16)11; /* invalid exe */
+ }
+ pData += ne_header.entry_tab_length;
+
+ /* Free the fast-load area */
+
+#undef READ
+ if (fastload) HeapFree( SystemHeap, 0, fastload );
+
+ /* Get the non-resident names table */
+
+ if (ne_header.nrname_tab_length)
+ {
+ pModule->nrname_handle = GLOBAL_Alloc( 0, ne_header.nrname_tab_length,
+ hModule, FALSE, FALSE, FALSE );
+ if (!pModule->nrname_handle)
+ {
+ GlobalFree16( hModule );
+ return (HMODULE16)11; /* invalid exe */
+ }
+ buffer = GlobalLock16( pModule->nrname_handle );
+ _llseek32( hFile, ne_header.nrname_tab_offset, SEEK_SET );
+ if (_lread32( hFile, buffer, ne_header.nrname_tab_length )
+ != ne_header.nrname_tab_length)
+ {
+ GlobalFree16( pModule->nrname_handle );
+ GlobalFree16( hModule );
+ return (HMODULE16)11; /* invalid exe */
+ }
+ }
+ else pModule->nrname_handle = 0;
+
+ /* Allocate a segment for the implicitly-loaded DLLs */
+
+ if (pModule->modref_count)
+ {
+ pModule->dlls_to_init = GLOBAL_Alloc(GMEM_ZEROINIT,
+ (pModule->modref_count+1)*sizeof(HMODULE16),
+ hModule, FALSE, FALSE, FALSE );
+ if (!pModule->dlls_to_init)
+ {
+ if (pModule->nrname_handle) GlobalFree16( pModule->nrname_handle );
+ GlobalFree16( hModule );
+ return (HMODULE16)11; /* invalid exe */
+ }
+ }
+ else pModule->dlls_to_init = 0;
+
+ NE_RegisterModule( pModule );
+ return hModule;
+}
+
+
+/***********************************************************************
+ * NE_LoadDLLs
+ *
+ * Load all DLLs implicitly linked to a module.
+ */
+static BOOL32 NE_LoadDLLs( NE_MODULE *pModule )
+{
+ int i;
+ WORD *pModRef = (WORD *)((char *)pModule + pModule->modref_table);
+ WORD *pDLLs = (WORD *)GlobalLock16( pModule->dlls_to_init );
+
+ for (i = 0; i < pModule->modref_count; i++, pModRef++)
+ {
+ char buffer[256];
+ BYTE *pstr = (BYTE *)pModule + pModule->import_table + *pModRef;
+ memcpy( buffer, pstr + 1, *pstr );
+ strcpy( buffer + *pstr, ".dll" );
+ TRACE(module, "Loading '%s'\n", buffer );
+ if (!(*pModRef = MODULE_FindModule16( buffer )))
+ {
+ /* If the DLL is not loaded yet, load it and store */
+ /* its handle in the list of DLLs to initialize. */
+ HMODULE16 hDLL;
+
+ if ((hDLL = MODULE_Load( buffer, NE_FFLAGS_IMPLICIT,
+ NULL, NULL, 0 )) == 2)
+ {
+ /* file not found */
+ char *p;
+
+ /* Try with prepending the path of the current module */
+ GetModuleFileName16( pModule->self, buffer, sizeof(buffer) );
+ if (!(p = strrchr( buffer, '\\' ))) p = buffer;
+ memcpy( p + 1, pstr + 1, *pstr );
+ strcpy( p + 1 + *pstr, ".dll" );
+ hDLL = MODULE_Load( buffer, NE_FFLAGS_IMPLICIT, NULL, NULL, 0);
+ }
+ if (hDLL < 32)
+ {
+ /* FIXME: cleanup what was done */
+
+ fprintf( stderr, "Could not load '%s' required by '%.*s', error = %d\n",
+ buffer, *((BYTE*)pModule + pModule->name_table),
+ (char *)pModule + pModule->name_table + 1, hDLL );
+ return FALSE;
+ }
+ *pModRef = GetExePtr( hDLL );
+ *pDLLs++ = *pModRef;
+ }
+ else /* Increment the reference count of the DLL */
+ {
+ NE_MODULE *pOldDLL = MODULE_GetPtr16( *pModRef );
+ if (pOldDLL) pOldDLL->count++;
+ }
+ }
+ return TRUE;
+}
+
+
+/**********************************************************************
+ * NE_LoadModule
+ *
+ * Implementation of LoadModule().
+ *
+ * cmd_line must contain the whole command-line, including argv[0] (and
+ * without a preceding length byte).
+ * If cmd_line is NULL, the module is loaded as a library even if it is a .exe
+ */
+HINSTANCE16 NE_LoadModule( HFILE32 hFile, OFSTRUCT *ofs, UINT16 flags,
+ LPCSTR cmd_line, LPCSTR env, UINT32 show_cmd )
+{
+ HMODULE16 hModule;
+ HINSTANCE16 hInstance;
+ NE_MODULE *pModule;
+
+ /* Create the module structure */
+
+ if ((hModule = NE_LoadExeHeader( hFile, ofs )) < 32) return hModule;
+
+ pModule = MODULE_GetPtr16( hModule );
+ pModule->flags |= flags; /* stamp implicitly loaded modules */
+
+ /* Allocate the segments for this module */
+
+ NE_CreateSegments( hModule );
+ hInstance = MODULE_CreateInstance( hModule, NULL, (cmd_line == NULL) );
+
+ /* Load the referenced DLLs */
+
+ if (!NE_LoadDLLs( pModule ))
+ return 2; /* File not found (FIXME: free everything) */
+
+ /* Load the segments */
+
+ NE_LoadAllSegments( pModule );
+
+ /* Fixup the functions prologs */
+
+ NE_FixupPrologs( pModule );
+
+ /* Make sure the usage count is 1 on the first loading of */
+ /* the module, even if it contains circular DLL references */
+
+ pModule->count = 1;
+
+ /* Call initialization rountines for all loaded DLLs. Note that
+ * when we load implicitly linked DLLs this will be done by InitTask().
+ */
+
+ if ((pModule->flags & (NE_FFLAGS_LIBMODULE | NE_FFLAGS_IMPLICIT)) ==
+ NE_FFLAGS_LIBMODULE)
+ NE_InitializeDLLs( hModule );
+
+ /* Create a task for this instance */
+
+ if (cmd_line && !(pModule->flags & NE_FFLAGS_LIBMODULE))
+ {
+ PDB32 *pdb;
+
+ pModule->flags |= NE_FFLAGS_GUI;
+
+ pdb = PROCESS_Create( pModule, cmd_line, env, hInstance, 0, show_cmd );
+ if (pdb && (GetNumTasks() > 1)) Yield16();
+ }
+
+ return hInstance;
+}
diff --git a/loader/ne_resource.c b/loader/ne/resource.c
similarity index 66%
rename from loader/ne_resource.c
rename to loader/ne/resource.c
index abf688c..832be3b 100644
--- a/loader/ne_resource.c
+++ b/loader/ne/resource.c
@@ -1,10 +1,12 @@
/*
+ * NE resource functions
*
* Copyright 1993 Robert J. Amstadt
* Copyright 1995 Alexandre Julliard
- * 1997 Alex Korobka
+ * Copyright 1997 Alex Korobka
*/
+#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -20,7 +22,7 @@
#include "resource.h"
#include "debug.h"
-#define NEXT_TYPEINFO(pTypeInfo) ((NE_TYPEINFO *)((char*)((pTypeInfo) + 1) + \
+#define NEXT_TYPEINFO(pTypeInfo) ((NE_TYPEINFO *)((char*)((pTypeInfo) + 1) + \
(pTypeInfo)->count * sizeof(NE_NAMEINFO)))
/***********************************************************************
@@ -181,7 +183,7 @@
HRSRC16 hRsrc )
{
int fd;
- NE_MODULE* pModule = MODULE_GetPtr( hModule );
+ NE_MODULE* pModule = MODULE_GetPtr16( hModule );
if ( pModule && (fd = MODULE_OpenFile( hModule )) >= 0)
{
HGLOBAL16 handle;
@@ -194,7 +196,7 @@
if( hMemObj )
handle = GlobalReAlloc16( hMemObj, pNameInfo->length << sizeShift, 0 );
else
- handle = NE_AllocResource( hModule, hRsrc, 0 );
+ handle = AllocResource( hModule, hRsrc, 0 );
if( handle )
{
@@ -213,95 +215,131 @@
*/
BOOL32 NE_InitResourceHandler( HMODULE16 hModule )
{
- NE_MODULE *pModule = MODULE_GetPtr( hModule );
+ NE_MODULE *pModule = MODULE_GetPtr16( hModule );
NE_TYPEINFO *pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
TRACE(resource,"InitResourceHandler[%04x]\n", hModule );
while(pTypeInfo->type_id)
{
- pTypeInfo->resloader = (DWORD)&NE_DefResourceHandler;
+ pTypeInfo->resloader = (FARPROC16)&NE_DefResourceHandler;
pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
}
return TRUE;
}
-/***********************************************************************
- * NE_SetResourceHandler
- */
-FARPROC32 NE_SetResourceHandler( HMODULE16 hModule, SEGPTR typeId,
- FARPROC32 resourceHandler )
-{
- NE_MODULE *pModule = MODULE_GetPtr( hModule );
- NE_TYPEINFO *pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
- FARPROC32 prevHandler = NULL;
- do
+/**********************************************************************
+ * SetResourceHandler (KERNEL.43)
+ */
+FARPROC16 WINAPI SetResourceHandler( HMODULE16 hModule, SEGPTR typeId,
+ FARPROC16 resourceHandler )
+{
+ FARPROC16 prevHandler = NULL;
+ NE_MODULE *pModule = MODULE_GetPtr16( hModule );
+ NE_TYPEINFO *pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
+
+ if (!pModule || !pModule->res_table) return NULL;
+
+ TRACE( resource, "module=%04x type=%s\n",
+ hModule, debugres_a(PTR_SEG_TO_LIN(typeId)) );
+
+ for (;;)
{
- pTypeInfo = NE_FindTypeSection( pModule, pTypeInfo, typeId );
- if( pTypeInfo )
- {
- prevHandler = (FARPROC32)pTypeInfo->resloader;
- pTypeInfo->resloader = (DWORD)resourceHandler;
- pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
- }
- } while( pTypeInfo );
+ if (!(pTypeInfo = NE_FindTypeSection( pModule, pTypeInfo, typeId )))
+ break;
+ prevHandler = pTypeInfo->resloader;
+ pTypeInfo->resloader = resourceHandler;
+ pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
+ }
return prevHandler;
}
-/***********************************************************************
- * NE_FindResource
+
+/**********************************************************************
+ * FindResource16 (KERNEL.60)
*/
-HRSRC16 NE_FindResource( HMODULE16 hModule, SEGPTR typeId, SEGPTR resId )
+HRSRC16 WINAPI FindResource16( HMODULE16 hModule, SEGPTR name, SEGPTR type )
{
NE_TYPEINFO *pTypeInfo;
HRSRC16 hRsrc;
- NE_MODULE *pModule = MODULE_GetPtr( hModule );
+ NE_MODULE *pModule = MODULE_GetPtr16( hModule );
if (!pModule || !pModule->res_table) return 0;
- pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
- if (HIWORD(typeId) || HIWORD(resId))
+ assert( !__winelib ); /* Can't use Win16 resource functions in Winelib */
+
+ TRACE( resource, "module=%04x name=%s type=%s\n",
+ hModule, debugres_a(PTR_SEG_TO_LIN(name)),
+ debugres_a(PTR_SEG_TO_LIN(type)) );
+
+ if (HIWORD(name)) /* Check for '#xxx' name */
{
- DWORD id = NE_FindNameTableId( pModule, typeId, resId );
+ char *ptr = PTR_SEG_TO_LIN( name );
+ if (ptr[0] == '#')
+ if (!(name = (SEGPTR)atoi( ptr + 1 )))
+ {
+ WARN(resource, "Incorrect resource name: %s\n", ptr);
+ return 0;
+ }
+ }
+
+ if (HIWORD(type)) /* Check for '#xxx' type */
+ {
+ char *ptr = PTR_SEG_TO_LIN( type );
+ if (ptr[0] == '#')
+ if (!(type = (SEGPTR)atoi( ptr + 1 )))
+ {
+ WARN(resource, "Incorrect resource type: %s\n", ptr);
+ return 0;
+ }
+ }
+
+ if (HIWORD(type) || HIWORD(name))
+ {
+ DWORD id = NE_FindNameTableId( pModule, type, name );
if (id) /* found */
{
- typeId = LOWORD(id);
- resId = HIWORD(id);
+ type = LOWORD(id);
+ name = HIWORD(id);
}
}
- do
+ pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
+
+ for (;;)
{
- pTypeInfo = NE_FindTypeSection( pModule, pTypeInfo, typeId );
- if( pTypeInfo )
- {
- hRsrc = NE_FindResourceFromType(pModule, pTypeInfo, resId);
- if( hRsrc )
- {
- TRACE(resource, " Found id %08lx\n", resId );
- return hRsrc;
- }
- TRACE(resource, " Not found, going on\n" );
- pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
- }
- } while( pTypeInfo );
+ if (!(pTypeInfo = NE_FindTypeSection( pModule, pTypeInfo, type )))
+ break;
+ if ((hRsrc = NE_FindResourceFromType(pModule, pTypeInfo, name)))
+ {
+ TRACE(resource, " Found id %08lx\n", name );
+ return hRsrc;
+ }
+ TRACE(resource, " Not found, going on\n" );
+ pTypeInfo = NEXT_TYPEINFO(pTypeInfo);
+ }
WARN(resource, "failed!\n");
return 0;
}
-/***********************************************************************
- * NE_AllocResource
+/**********************************************************************
+ * AllocResource (KERNEL.66)
*/
-HGLOBAL16 NE_AllocResource( HMODULE16 hModule, HRSRC16 hRsrc, DWORD size )
+HGLOBAL16 WINAPI AllocResource( HMODULE16 hModule, HRSRC16 hRsrc, DWORD size)
{
NE_NAMEINFO *pNameInfo=NULL;
WORD sizeShift;
- NE_MODULE *pModule = MODULE_GetPtr( hModule );
- if (!pModule || !pModule->res_table) return 0;
+ NE_MODULE *pModule = MODULE_GetPtr16( hModule );
+ if (!pModule || !pModule->res_table || !hRsrc) return 0;
+
+ TRACE( resource, "module=%04x res=%04x size=%ld\n", hModule, hRsrc, size );
+
+ assert( !__winelib ); /* Can't use Win16 resource functions in Winelib */
+
sizeShift = *(WORD *)((char *)pModule + pModule->res_table);
pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
if (size < (DWORD)pNameInfo->length << sizeShift)
@@ -310,55 +348,84 @@
}
-/***********************************************************************
- * NE_AccessResource
+/**********************************************************************
+ * DirectResAlloc (KERNEL.168)
+ *
+ * Check Schulman, p. 232 for details
*/
-int NE_AccessResource( HMODULE16 hModule, HRSRC16 hRsrc )
+HGLOBAL16 WINAPI DirectResAlloc( HINSTANCE16 hInstance, WORD wType,
+ UINT16 wSize )
{
- NE_NAMEINFO *pNameInfo=NULL;
+ TRACE(resource,"(%04x,%04x,%04x)\n",
+ hInstance, wType, wSize );
+ if (!(hInstance = GetExePtr( hInstance ))) return 0;
+ if(wType != 0x10) /* 0x10 is the only observed value, passed from
+ CreateCursorIndirect. */
+ fprintf(stderr, "DirectResAlloc: wType = %x\n", wType);
+ return GLOBAL_Alloc(GMEM_MOVEABLE, wSize, hInstance, FALSE, FALSE, FALSE);
+}
+
+
+/**********************************************************************
+ * AccessResource16 (KERNEL.64)
+ */
+INT16 WINAPI AccessResource16( HINSTANCE16 hModule, HRSRC16 hRsrc )
+{
HFILE32 fd;
- NE_MODULE *pModule = MODULE_GetPtr( hModule );
- if (!pModule || !pModule->res_table) return -1;
- pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
+ NE_MODULE *pModule = MODULE_GetPtr16( hModule );
+ if (!pModule || !pModule->res_table || !hRsrc) return -1;
+
+ TRACE(resource, "module=%04x res=%04x\n", hModule, hRsrc );
+
+ assert( !__winelib ); /* Can't use Win16 resource functions in Winelib */
if ((fd = _lopen32( NE_MODULE_NAME(pModule), OF_READ )) != -1)
{
WORD sizeShift = *(WORD *)((char *)pModule + pModule->res_table);
+ NE_NAMEINFO *pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
_llseek32( fd, (int)pNameInfo->offset << sizeShift, SEEK_SET );
}
return fd;
}
-/***********************************************************************
- * NE_SizeofResource
+/**********************************************************************
+ * SizeofResource16 (KERNEL.65)
*/
-DWORD NE_SizeofResource( HMODULE16 hModule, HRSRC16 hRsrc )
+DWORD WINAPI SizeofResource16( HMODULE16 hModule, HRSRC16 hRsrc )
{
NE_NAMEINFO *pNameInfo=NULL;
WORD sizeShift;
- NE_MODULE *pModule = MODULE_GetPtr( hModule );
+ NE_MODULE *pModule = MODULE_GetPtr16( hModule );
if (!pModule || !pModule->res_table) return 0;
+
+ TRACE(resource, "module=%04x res=%04x\n", hModule, hRsrc );
+
+ assert( !__winelib ); /* Can't use Win16 resource functions in Winelib */
+
sizeShift = *(WORD *)((char *)pModule + pModule->res_table);
pNameInfo = (NE_NAMEINFO*)((char*)pModule + hRsrc);
return (DWORD)pNameInfo->length << sizeShift;
}
-/***********************************************************************
- * NE_LoadResource
+/**********************************************************************
+ * LoadResource16 (KERNEL.61)
*/
-HGLOBAL16 NE_LoadResource( HMODULE16 hModule, HRSRC16 hRsrc )
+HGLOBAL16 WINAPI LoadResource16( HMODULE16 hModule, HRSRC16 hRsrc )
{
NE_TYPEINFO *pTypeInfo;
NE_NAMEINFO *pNameInfo = NULL;
- NE_MODULE *pModule = MODULE_GetPtr( hModule );
+ NE_MODULE *pModule = MODULE_GetPtr16( hModule );
int d;
+ TRACE( resource, "module=%04x res=%04x\n", hModule, hRsrc );
if (!hRsrc || !pModule || !pModule->res_table) return 0;
+ assert( !__winelib ); /* Can't use Win16 resource functions in Winelib */
+
/* First, verify hRsrc (just an offset from pModule to the needed pNameInfo) */
d = pModule->res_table + 2;
@@ -383,7 +450,7 @@
if (pNameInfo)
{
- RESOURCEHANDLER16 __r16loader;
+ RESOURCEHANDLER16 loader;
if (pNameInfo->handle
&& !(GlobalFlags16(pNameInfo->handle) & GMEM_DISCARDED))
{
@@ -394,16 +461,16 @@
else
{
if (pTypeInfo->resloader)
- __r16loader = (RESOURCEHANDLER16)pTypeInfo->resloader;
+ loader = (RESOURCEHANDLER16)pTypeInfo->resloader;
else /* this is really bad */
{
fprintf( stderr, "[%04x]: Missing resource handler!!!...\n", hModule);
- __r16loader = NE_DefResourceHandler;
+ loader = NE_DefResourceHandler;
}
/* Finally call resource loader */
- if ((pNameInfo->handle = __r16loader(pNameInfo->handle, hModule, hRsrc)))
+ if ((pNameInfo->handle = loader(pNameInfo->handle, hModule, hRsrc)))
{
pNameInfo->usage++;
pNameInfo->flags |= NE_SEGFLAGS_LOADED;
@@ -415,28 +482,46 @@
}
-/***********************************************************************
- * NE_LockResource
+/**********************************************************************
+ * LockResource16 (KERNEL.62)
*/
-SEGPTR NE_LockResource( HMODULE16 hModule, HGLOBAL16 handle )
+/* 16-bit version */
+SEGPTR WINAPI WIN16_LockResource16( HGLOBAL16 handle )
{
+ TRACE( resource, "handle=%04x\n", handle );
+ if (!handle) return (SEGPTR)0;
+
/* May need to reload the resource if discarded */
return (SEGPTR)WIN16_GlobalLock16( handle );
}
+/* Winelib 16-bit version */
+LPVOID WINAPI LockResource16( HGLOBAL16 handle )
+{
+ assert( !__winelib ); /* Can't use Win16 resource functions in Winelib */
-/***********************************************************************
- * NE_FreeResource
+ return (LPVOID)PTR_SEG_TO_LIN( WIN16_LockResource16( handle ) );
+}
+
+
+/**********************************************************************
+ * FreeResource16 (KERNEL.63)
*/
-BOOL32 NE_FreeResource( HMODULE16 hModule, HGLOBAL16 handle )
+BOOL16 WINAPI FreeResource16( HGLOBAL16 handle )
{
NE_TYPEINFO *pTypeInfo;
NE_NAMEINFO *pNameInfo;
WORD count;
+ HMODULE16 hModule = GetExePtr( handle );
+ NE_MODULE *pModule = MODULE_GetPtr16( hModule );
- NE_MODULE *pModule = MODULE_GetPtr( hModule );
if (!handle || !pModule || !pModule->res_table) return handle;
+
+ TRACE(resource, "handle=%04x\n", handle );
+
+ assert( !__winelib ); /* Can't use Win16 resource functions in Winelib */
+
pTypeInfo = (NE_TYPEINFO *)((char *)pModule + pModule->res_table + 2);
while (pTypeInfo->type_id)
{
diff --git a/loader/ne_image.c b/loader/ne/segment.c
similarity index 86%
rename from loader/ne_image.c
rename to loader/ne/segment.c
index 5bb1088..99f78ce 100644
--- a/loader/ne_image.c
+++ b/loader/ne/segment.c
@@ -1,10 +1,11 @@
/*
- * NE modules
+ * NE segment loading
*
* Copyright 1993 Robert J. Amstadt
* Copyright 1995 Alexandre Julliard
*/
+#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
@@ -160,8 +161,11 @@
read( fd, &count, sizeof(count) );
if (!count) return TRUE;
- TRACE(fixup, "Fixups for %*.*s, segment %d, selector %04x\n",
+ TRACE(fixup, "Fixups for %.*s, segment %d, selector %04x\n",
*((BYTE *)pModule + pModule->name_table),
+ (char *)pModule + pModule->name_table + 1,
+ segnum, pSeg->selector );
+ TRACE(segment, "Fixups for %.*s, segment %d, selector %04x\n",
*((BYTE *)pModule + pModule->name_table),
(char *)pModule + pModule->name_table + 1,
segnum, pSeg->selector );
@@ -194,10 +198,10 @@
case NE_RELTYPE_ORDINAL:
module = pModuleTable[rep->target1-1];
ordinal = rep->target2;
- address = MODULE_GetEntryPoint( module, ordinal );
+ address = NE_GetEntryPoint( module, ordinal );
if (!address)
{
- NE_MODULE *pTarget = MODULE_GetPtr( module );
+ NE_MODULE *pTarget = MODULE_GetPtr16( module );
if (!pTarget)
fprintf( stderr, "Module not found: %04x, reference %d of module %*.*s\n",
module, rep->target1,
@@ -212,7 +216,7 @@
}
if (TRACE_ON(fixup))
{
- NE_MODULE *pTarget = MODULE_GetPtr( module );
+ NE_MODULE *pTarget = MODULE_GetPtr16( module );
TRACE( fixup, "%d: %.*s.%d=%04x:%04x %s\n", i + 1,
*((BYTE *)pTarget + pTarget->name_table),
(char *)pTarget + pTarget->name_table + 1,
@@ -227,20 +231,19 @@
memcpy( buffer, func_name+1, *func_name );
buffer[*func_name] = '\0';
func_name = buffer;
- ordinal = MODULE_GetOrdinal( module, func_name );
-
- address = MODULE_GetEntryPoint( module, ordinal );
+ ordinal = NE_GetOrdinal( module, func_name );
+ address = NE_GetEntryPoint( module, ordinal );
if (ERR_ON(fixup) && !address)
{
- NE_MODULE *pTarget = MODULE_GetPtr( module );
+ NE_MODULE *pTarget = MODULE_GetPtr16( module );
ERR(fixup, "Warning: no handler for %.*s.%s, setting to 0:0\n",
*((BYTE *)pTarget + pTarget->name_table),
(char *)pTarget + pTarget->name_table + 1, func_name );
}
if (TRACE_ON(fixup))
{
- NE_MODULE *pTarget = MODULE_GetPtr( module );
+ NE_MODULE *pTarget = MODULE_GetPtr16( module );
TRACE( fixup, "%d: %.*s.%s=%04x:%04x %s\n", i + 1,
*((BYTE *)pTarget + pTarget->name_table),
(char *)pTarget + pTarget->name_table + 1,
@@ -252,7 +255,7 @@
case NE_RELTYPE_INTERNAL:
if ((rep->target1 & 0xff) == 0xff)
{
- address = MODULE_GetEntryPoint( pModule->self, rep->target2 );
+ address = NE_GetEntryPoint( pModule->self, rep->target2 );
}
else
{
@@ -310,6 +313,7 @@
ERR(fixup,"Additive selector to %04x.Please report\n",*sp);
else
*sp = HIWORD(address);
+ break;
default:
goto unknown;
}
@@ -383,9 +387,9 @@
if (!NE_LoadSegment( pModule, 1 )) return FALSE;
selfloadheader = (SELFLOADHEADER *)
PTR_SEG_OFF_TO_LIN(pSegTable->selector, 0);
- selfloadheader->EntryAddrProc = MODULE_GetEntryPoint(hselfload,27);
- selfloadheader->MyAlloc = MODULE_GetEntryPoint(hselfload,28);
- selfloadheader->SetOwner = MODULE_GetEntryPoint(GetModuleHandle16("KERNEL"),403);
+ selfloadheader->EntryAddrProc = NE_GetEntryPoint(hselfload,27);
+ selfloadheader->MyAlloc = NE_GetEntryPoint(hselfload,28);
+ selfloadheader->SetOwner = NE_GetEntryPoint(GetModuleHandle16("KERNEL"),403);
pModule->self_loading_sel = GlobalHandleToSel(GLOBAL_Alloc(GMEM_ZEROINIT, 0xFF00, pModule->self, FALSE, FALSE, FALSE));
oldstack = thdb->cur_stack;
thdb->cur_stack = PTR_SEG_OFF_TO_SEGPTR(pModule->self_loading_sel,
@@ -420,63 +424,6 @@
/***********************************************************************
- * NE_LoadDLLs
- */
-BOOL32 NE_LoadDLLs( NE_MODULE *pModule )
-{
- int i;
- WORD *pModRef = (WORD *)((char *)pModule + pModule->modref_table);
- WORD *pDLLs = (WORD *)GlobalLock16( pModule->dlls_to_init );
-
- for (i = 0; i < pModule->modref_count; i++, pModRef++)
- {
- char buffer[256];
- BYTE *pstr = (BYTE *)pModule + pModule->import_table + *pModRef;
- memcpy( buffer, pstr + 1, *pstr );
- strcpy( buffer + *pstr, ".dll" );
- TRACE(module, "Loading '%s'\n", buffer );
- if (!(*pModRef = MODULE_FindModule( buffer )))
- {
- /* If the DLL is not loaded yet, load it and store */
- /* its handle in the list of DLLs to initialize. */
- HMODULE16 hDLL;
-
- if ((hDLL = MODULE_Load( buffer, NE_FFLAGS_IMPLICIT,
- NULL, NULL, 0 )) == 2)
- {
- /* file not found */
- char *p;
-
- /* Try with prepending the path of the current module */
- GetModuleFileName16( pModule->self, buffer, sizeof(buffer) );
- if (!(p = strrchr( buffer, '\\' ))) p = buffer;
- memcpy( p + 1, pstr + 1, *pstr );
- strcpy( p + 1 + *pstr, ".dll" );
- hDLL = MODULE_Load( buffer, NE_FFLAGS_IMPLICIT, NULL, NULL, 0);
- }
- if (hDLL < 32)
- {
- /* FIXME: cleanup what was done */
-
- fprintf( stderr, "Could not load '%s' required by '%.*s', error = %d\n",
- buffer, *((BYTE*)pModule + pModule->name_table),
- (char *)pModule + pModule->name_table + 1, hDLL );
- return FALSE;
- }
- *pModRef = MODULE_HANDLEtoHMODULE16( hDLL );
- *pDLLs++ = *pModRef;
- }
- else /* Increment the reference count of the DLL */
- {
- NE_MODULE *pOldDLL = MODULE_GetPtr( *pModRef );
- if (pOldDLL) pOldDLL->count++;
- }
- }
- return TRUE;
-}
-
-
-/***********************************************************************
* NE_FixupPrologs
*
* Fixup the exported functions prologs.
@@ -589,7 +536,7 @@
* es:si command line (always 0)
*/
- if (!(pModule = MODULE_GetPtr( hModule ))) return FALSE;
+ if (!(pModule = MODULE_GetPtr16( hModule ))) return FALSE;
pSegTable = NE_SEG_TABLE( pModule );
if (!(pModule->flags & NE_FFLAGS_LIBMODULE) ||
@@ -666,7 +613,7 @@
NE_MODULE *pModule;
HMODULE16 *pDLL;
- if (!(pModule = MODULE_GetPtr( hModule ))) return;
+ if (!(pModule = MODULE_GetPtr16( hModule ))) return;
if (pModule->flags & NE_FFLAGS_WIN32) return;
if (pModule->dlls_to_init)
@@ -694,3 +641,72 @@
{
fprintf(stderr,"PatchCodeHandle(%04x),stub!\n",hSel);
}
+
+
+/***********************************************************************
+ * NE_Ne2MemFlags
+ *
+ * This function translates NE segment flags to GlobalAlloc flags
+ */
+static WORD NE_Ne2MemFlags(WORD flags)
+{
+ WORD memflags = 0;
+#if 0
+ if (flags & NE_SEGFLAGS_DISCARDABLE)
+ memflags |= GMEM_DISCARDABLE;
+ if (flags & NE_SEGFLAGS_MOVEABLE ||
+ ( ! (flags & NE_SEGFLAGS_DATA) &&
+ ! (flags & NE_SEGFLAGS_LOADED) &&
+ ! (flags & NE_SEGFLAGS_ALLOCATED)
+ )
+ )
+ memflags |= GMEM_MOVEABLE;
+ memflags |= GMEM_ZEROINIT;
+#else
+ memflags = GMEM_ZEROINIT | GMEM_FIXED;
+ return memflags;
+#endif
+}
+
+/***********************************************************************
+ * NE_AllocateSegment (WPROCS.26)
+ */
+DWORD WINAPI NE_AllocateSegment( WORD wFlags, WORD wSize, WORD wElem )
+{
+ WORD size = wSize << wElem;
+ HANDLE16 hMem = GlobalAlloc16( NE_Ne2MemFlags(wFlags), size);
+ return MAKELONG( hMem, GlobalHandleToSel(hMem) );
+}
+
+
+/***********************************************************************
+ * NE_CreateSegments
+ */
+BOOL32 NE_CreateSegments( HMODULE16 hModule )
+{
+ SEGTABLEENTRY *pSegment;
+ NE_MODULE *pModule;
+ int i, minsize;
+
+ if (!(pModule = MODULE_GetPtr16( hModule ))) return FALSE;
+ assert( !(pModule->flags & NE_FFLAGS_WIN32) );
+
+ pSegment = NE_SEG_TABLE( pModule );
+ for (i = 1; i <= pModule->seg_count; i++, pSegment++)
+ {
+ minsize = pSegment->minsize ? pSegment->minsize : 0x10000;
+ if (i == pModule->ss) minsize += pModule->stack_size;
+ /* The DGROUP is allocated by MODULE_CreateInstance */
+ if (i == pModule->dgroup) continue;
+ pSegment->selector = GLOBAL_Alloc( NE_Ne2MemFlags(pSegment->flags),
+ minsize, hModule,
+ !(pSegment->flags & NE_SEGFLAGS_DATA),
+ FALSE,
+ FALSE /*pSegment->flags & NE_SEGFLAGS_READONLY*/ );
+ if (!pSegment->selector) return FALSE;
+ }
+
+ pModule->dgroup_entry = pModule->dgroup ? pModule->seg_table +
+ (pModule->dgroup - 1) * sizeof(SEGTABLEENTRY) : 0;
+ return TRUE;
+}
diff --git a/loader/pe_image.c b/loader/pe_image.c
index 43cc74c..12c962e 100644
--- a/loader/pe_image.c
+++ b/loader/pe_image.c
@@ -49,6 +49,7 @@
#include "winbase.h"
#include "callback.h"
#include "file.h"
+#include "heap.h"
#include "neexe.h"
#include "peexe.h"
#include "process.h"
@@ -59,11 +60,13 @@
#include "task.h"
#include "debug.h"
-static void PE_InitDLL(PE_MODREF* modref, DWORD type, LPVOID lpReserved);
+static void PE_InitDLL(WINE_MODREF *wm, DWORD type, LPVOID lpReserved);
/* convert PE image VirtualAddress to Real Address */
#define RVA(x) ((unsigned int)load_addr+(unsigned int)(x))
+#define AdjustPtr(ptr,delta) ((char *)(ptr) + (delta))
+
void dump_exports( HMODULE32 hModule )
{
char *Module;
@@ -116,44 +119,40 @@
* If it is a ordinal:
* - use ordinal-pe_export->Base as offset into the functionlist
*/
-FARPROC32 PE_FindExportedFunction( PDB32 *process, HMODULE32 hModule,
- LPCSTR funcName)
+FARPROC32 PE_FindExportedFunction(
+ PDB32 *process, /* [in] process context */
+ WINE_MODREF *wm, /* [in] WINE modreference */
+ LPCSTR funcName ) /* [in] function name */
{
- IMAGE_EXPORT_DIRECTORY *exports;
- unsigned load_addr;
u_short * ordinal;
u_long * function;
u_char ** name, *ename;
int i;
- PE_MODREF *pem;
+ PE_MODREF *pem = &(wm->binfmt.pe);
+ IMAGE_EXPORT_DIRECTORY *exports = pem->pe_export;
+ unsigned int load_addr = wm->module;
u_long rva_start, rva_end, addr;
char * forward;
- pem = process->modref_list;
- while (pem && (pem->module != hModule))
- pem=pem->next;
- if (!pem) {
- fprintf(stderr,"No MODREF found for PE_MODULE %08x in process %p\n",hModule,process);
- return NULL;
- }
- load_addr = hModule;
- exports = pem->pe_export;
-
if (HIWORD(funcName))
TRACE(win32,"(%s)\n",funcName);
else
TRACE(win32,"(%d)\n",(int)funcName);
if (!exports) {
- fprintf(stderr,"Module %08x/MODREF %p doesn't have a exports table.\n",hModule,pem);
+ /* Not a fatal problem, some apps do
+ * GetProcAddress(0,"RegisterPenApp") which triggers this
+ * case.
+ */
+ WARN(win32,"Module %08x(%s)/MODREF %p doesn't have a exports table.\n",wm->module,wm->modname,pem);
return NULL;
}
ordinal = (u_short*) RVA(exports->AddressOfNameOrdinals);
function= (u_long*) RVA(exports->AddressOfFunctions);
name = (u_char **) RVA(exports->AddressOfNames);
forward = NULL;
- rva_start = PE_HEADER(hModule)->OptionalHeader
+ rva_start = PE_HEADER(wm->module)->OptionalHeader
.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
- rva_end = rva_start + PE_HEADER(hModule)->OptionalHeader
+ rva_end = rva_start + PE_HEADER(wm->module)->OptionalHeader
.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
if (HIWORD(funcName)) {
@@ -188,23 +187,30 @@
HMODULE32 hMod;
char module[256];
char *end = strchr(forward, '.');
+
if (!end) return NULL;
+ assert(end-forward<256);
strncpy(module, forward, (end - forward));
module[end-forward] = 0;
- hMod = MODULE_HANDLEtoHMODULE32( MODULE_FindModule(module) );
- return PE_FindExportedFunction( process, hMod, end + 1);
+ hMod = MODULE_FindModule32(process,module);
+ assert(hMod);
+ return MODULE_GetProcAddress32( process, hMod, end + 1);
}
return NULL;
}
-DWORD fixup_imports (PDB32 *process,PE_MODREF *pem)
+DWORD fixup_imports (PDB32 *process,WINE_MODREF *wm)
{
IMAGE_IMPORT_DESCRIPTOR *pe_imp;
+ WINE_MODREF *xwm;
+ PE_MODREF *pem;
int fixup_failed = 0;
- unsigned int load_addr = pem->module;
+ unsigned int load_addr = wm->module;
int i;
char *modname;
+ assert(wm->type==MODULE32_PE);
+ pem = &(wm->binfmt.pe);
if (pem->pe_export)
modname = (char*) RVA(pem->pe_export->Name);
else
@@ -229,10 +235,8 @@
/* FIXME: should terminate on 0 Characteristics */
for (i = 0, pe_imp = pem->pe_import; pe_imp->Name; pe_imp++) {
HMODULE32 res;
- PE_MODREF *xpem,**ypem;
-
-
- char *name = (char *) RVA(pe_imp->Name);
+ WINE_MODREF **ywm;
+ char *name = (char *) RVA(pe_imp->Name);
/* don't use MODULE_Load, Win32 creates new task differently */
res = PE_LoadLibraryEx32A( name, process, 0, 0 );
@@ -240,7 +244,7 @@
char buffer[1024];
/* Try with prepending the path of the current module */
- if (GetModuleFileName32A( pem->module, buffer, sizeof (buffer))) {
+ if (GetModuleFileName32A( wm->module, buffer, sizeof (buffer))) {
char *p;
if (!(p = strrchr (buffer, '\\')))
@@ -251,36 +255,35 @@
ERR(win32,"cannot find the module just loaded!\n");
}
if (res <= (HMODULE32) 32) {
- fprintf (stderr, "Module %s not found\n", name);
+ WARN (module, "Module %s not found\n", name);
return res;
}
- res = MODULE_HANDLEtoHMODULE32(res);
- xpem = pem->next;
- while (xpem) {
- if (xpem->module == res)
+ xwm = wm->next;
+ while (xwm) {
+ if (xwm->module == res)
break;
- xpem = xpem->next;
+ xwm = xwm->next;
}
- if (xpem) {
+ if (xwm) {
/* It has been loaded *BEFORE* us, so we have to initialize
- * it before us. We cannot just link in the xpem before pem,
- * since xpem might reference more dlls which would be in the
+ * it before us. We cannot just link in the xwm before wm,
+ * since xwm might reference more dlls which would be in the
* wrong order after that.
- * Instead we link in pem right AFTER xpem, which should keep
+ * Instead we link in wm right AFTER xwm, which should keep
* the correct order. (I am not 100% sure about that.)
*/
- /* unlink pem from chain */
- ypem = &(process->modref_list);
- while (*ypem) {
- if ((*ypem)==pem)
+ /* unlink wm from chain */
+ ywm = &(process->modref_list);
+ while (*ywm) {
+ if ((*ywm)==wm)
break;
- ypem = &((*ypem)->next);
+ ywm = &((*ywm)->next);
}
- *ypem = pem->next;
+ *ywm = wm->next;
- /* link pem directly AFTER xpem */
- pem->next = xpem->next;
- xpem->next = pem;
+ /* link wm directly AFTER xwm */
+ wm->next = xwm->next;
+ xwm->next = wm;
}
i++;
@@ -293,7 +296,8 @@
HMODULE32 hImpModule;
Module = (char *) RVA(pe_imp->Name);
- hImpModule = MODULE_HANDLEtoHMODULE32( MODULE_FindModule(Module) );
+ hImpModule = MODULE_FindModule32(process,Module);
+ assert(hImpModule); /* we have imported it, so it MUST be there */
TRACE(win32, "%s\n", Module);
/* FIXME: forwarder entries ... */
@@ -308,20 +312,22 @@
int ordinal = IMAGE_ORDINAL(import_list->u1.Ordinal);
TRACE(win32, "--- Ordinal %s,%d\n", Module, ordinal);
- thunk_list->u1.Function=(LPDWORD)PE_FindExportedFunction(
- process, hImpModule, (LPCSTR)ordinal);
+ thunk_list->u1.Function=(LPDWORD)MODULE_GetProcAddress32(
+ process, hImpModule, (LPCSTR)ordinal
+ );
if (!thunk_list->u1.Function) {
- fprintf(stderr,"No implementation for %s.%d, setting to NULL\n",
+ WARN(win32,"No implementation for %s.%d, setting to NULL\n",
Module, ordinal);
/* fixup_failed=1; */
}
} else { /* import by name */
pe_name = (LPIMAGE_IMPORT_BY_NAME)RVA(import_list->u1.AddressOfData);
TRACE(win32, "--- %s %s.%d\n", pe_name->Name, Module, pe_name->Hint);
- thunk_list->u1.Function=(LPDWORD)PE_FindExportedFunction(
- process, hImpModule, pe_name->Name);
+ thunk_list->u1.Function=(LPDWORD)MODULE_GetProcAddress32(
+ process, hImpModule, pe_name->Name
+ );
if (!thunk_list->u1.Function) {
- fprintf(stderr,"No implementation for %s.%d(%s), setting to NULL\n",
+ WARN(win32,"No implementation for %s.%d(%s), setting to NULL\n",
Module,pe_name->Hint,pe_name->Name);
/* fixup_failed=1; */
}
@@ -338,10 +344,11 @@
int ordinal = IMAGE_ORDINAL(thunk_list->u1.Ordinal);
TRACE(win32,"--- Ordinal %s.%d\n",Module,ordinal);
- thunk_list->u1.Function=(LPDWORD)PE_FindExportedFunction(
- process, hImpModule, (LPCSTR) ordinal);
+ thunk_list->u1.Function=(LPDWORD)MODULE_GetProcAddress32(
+ process, hImpModule, (LPCSTR) ordinal
+ );
if (!thunk_list->u1.Function) {
- fprintf(stderr, "No implementation for %s.%d, setting to NULL\n",
+ WARN(win32, "No implementation for %s.%d, setting to NULL\n",
Module,ordinal);
/* fixup_failed=1; */
}
@@ -349,10 +356,11 @@
pe_name=(LPIMAGE_IMPORT_BY_NAME) RVA(thunk_list->u1.AddressOfData);
TRACE(win32,"--- %s %s.%d\n",
pe_name->Name,Module,pe_name->Hint);
- thunk_list->u1.Function=(LPDWORD)PE_FindExportedFunction(
- process, hImpModule, pe_name->Name );
+ thunk_list->u1.Function=(LPDWORD)MODULE_GetProcAddress32(
+ process, hImpModule, pe_name->Name
+ );
if (!thunk_list->u1.Function) {
- fprintf(stderr, "No implementation for %s.%d, setting to NULL\n",
+ WARN(win32, "No implementation for %s.%d, setting to NULL\n",
Module, pe_name->Hint);
/* fixup_failed=1; */
}
@@ -392,10 +400,12 @@
return vma_size;
}
-static void do_relocations(PE_MODREF *pem)
+static void do_relocations(WINE_MODREF *wm)
{
- int delta = pem->module - PE_HEADER(pem->module)->OptionalHeader.ImageBase;
- unsigned int load_addr= pem->module;
+ PE_MODREF *pem = &(wm->binfmt.pe);
+ int delta = wm->module - PE_HEADER(wm->module)->OptionalHeader.ImageBase;
+ unsigned int load_addr= wm->module;
+
IMAGE_BASE_RELOCATION *r = pem->pe_reloc;
int hdelta = (delta >> 16) & 0xFFFF;
int ldelta = delta & 0xFFFF;
@@ -438,13 +448,13 @@
#endif
break;
case IMAGE_REL_BASED_HIGHADJ:
- fprintf(stderr, "Don't know what to do with IMAGE_REL_BASED_HIGHADJ\n");
+ WARN(win32, "Don't know what to do with IMAGE_REL_BASED_HIGHADJ\n");
break;
case IMAGE_REL_BASED_MIPS_JMPADDR:
- fprintf(stderr, "Is this a MIPS machine ???\n");
+ WARN(win32, "Is this a MIPS machine ???\n");
break;
default:
- fprintf(stderr, "Unknown fixup type\n");
+ WARN(win32, "Unknown fixup type\n");
break;
}
}
@@ -476,7 +486,7 @@
0, 0, NULL );
if (!mapping)
{
- fprintf( stderr, "PE_LoadImage: CreateFileMapping error %ld\n",
+ WARN( win32, "CreateFileMapping error %ld\n",
GetLastError() );
return 0;
}
@@ -484,34 +494,33 @@
CloseHandle( mapping );
if (!hModule)
{
- fprintf( stderr, "PE_LoadImage: MapViewOfFile error %ld\n",
+ WARN( win32, "PE_LoadImage: MapViewOfFile error %ld\n",
GetLastError() );
return 0;
}
if (PE_HEADER(hModule)->Signature != IMAGE_NT_SIGNATURE)
{
- fprintf(stderr,"image doesn't have PE signature, but 0x%08lx\n",
+ WARN(win32,"image doesn't have PE signature, but 0x%08lx\n",
PE_HEADER(hModule)->Signature );
goto error;
}
if (PE_HEADER(hModule)->FileHeader.Machine != IMAGE_FILE_MACHINE_I386)
{
- fprintf(stderr,"trying to load PE image for unsupported architecture (");
+ MSG("Trying to load PE image for unsupported architecture (");
switch (PE_HEADER(hModule)->FileHeader.Machine)
{
- case IMAGE_FILE_MACHINE_UNKNOWN: fprintf(stderr,"Unknown"); break;
- case IMAGE_FILE_MACHINE_I860: fprintf(stderr,"I860"); break;
- case IMAGE_FILE_MACHINE_R3000: fprintf(stderr,"R3000"); break;
- case IMAGE_FILE_MACHINE_R4000: fprintf(stderr,"R4000"); break;
- case IMAGE_FILE_MACHINE_R10000: fprintf(stderr,"R10000"); break;
- case IMAGE_FILE_MACHINE_ALPHA: fprintf(stderr,"Alpha"); break;
- case IMAGE_FILE_MACHINE_POWERPC: fprintf(stderr,"PowerPC"); break;
- default: fprintf(stderr,"Unknown-%04x",
+ case IMAGE_FILE_MACHINE_UNKNOWN: MSG("Unknown\n"); break;
+ case IMAGE_FILE_MACHINE_I860: MSG("I860\n"); break;
+ case IMAGE_FILE_MACHINE_R3000: MSG("R3000\n"); break;
+ case IMAGE_FILE_MACHINE_R4000: MSG("R4000\n"); break;
+ case IMAGE_FILE_MACHINE_R10000: MSG("R10000\n"); break;
+ case IMAGE_FILE_MACHINE_ALPHA: MSG("Alpha\n"); break;
+ case IMAGE_FILE_MACHINE_POWERPC: MSG("PowerPC\n"); break;
+ default: MSG("Unknown-%04x\n",
PE_HEADER(hModule)->FileHeader.Machine); break;
}
- fprintf(stderr,")\n");
goto error;
}
return hModule;
@@ -527,6 +536,7 @@
static BOOL32 PE_MapImage( HMODULE32 *phModule, PDB32 *process,
OFSTRUCT *ofs, DWORD flags )
{
+ WINE_MODREF *wm;
PE_MODREF *pem;
int i, result;
DWORD load_addr;
@@ -539,17 +549,21 @@
IMAGE_DOS_HEADER *dos_header = (IMAGE_DOS_HEADER *)hModule;
IMAGE_NT_HEADERS *nt_header = PE_HEADER(hModule);
- pem = (PE_MODREF*)HeapAlloc(process->heap,HEAP_ZERO_MEMORY,
- sizeof(*pem));
+
+ wm = (WINE_MODREF*)HeapAlloc(process->heap,HEAP_ZERO_MEMORY,
+ sizeof(*wm));
+ wm->type= MODULE32_PE;
+ pem = &(wm->binfmt.pe);
+
/* NOTE: fixup_imports takes care of the correct order */
- pem->next = process->modref_list;
- process->modref_list = pem;
+ wm->next = process->modref_list;
+ process->modref_list = wm;
if (!(nt_header->FileHeader.Characteristics & IMAGE_FILE_DLL))
{
if (process->exe_modref)
- fprintf(stderr,"overwriting old exe_modref... arrgh\n");
- process->exe_modref = pem;
+ WARN(win32,"overwriting old exe_modref... arrgh\n");
+ process->exe_modref = wm;
}
load_addr = nt_header->OptionalHeader.ImageBase;
@@ -566,10 +580,13 @@
/* *phModule is the module32 entry in the NE_MODULE. We need to
* change it here, since it can get referenced by fixup_imports()
*/
- pem->module = *phModule = (HMODULE32)load_addr;
+ wm->module = *phModule = (HMODULE32)load_addr;
TRACE(win32, "Load addr is really %lx, range %x\n",
load_addr, vma_size);
+
+ TRACE(segment, "Loading %s at %lx, range %x\n",
+ ofs->szPathName, load_addr, vma_size );
/* Store the NT header at the load addr
* (FIXME: should really use mmap)
@@ -620,7 +637,7 @@
if(dir.Size)
{
if(pem->pe_export && (int)pem->pe_export!=RVA(dir.VirtualAddress))
- fprintf(stderr,"wrong export directory??\n");
+ WARN(win32,"wrong export directory??\n");
/* always trust the directory */
pem->pe_export = (LPIMAGE_EXPORT_DIRECTORY) RVA(dir.VirtualAddress);
}
@@ -630,7 +647,7 @@
{
/*
if(pem->pe_import && (int)pem->pe_import!=RVA(dir.VirtualAddress))
- fprintf(stderr,"wrong import directory??\n");
+ WARN(win32,"wrong import directory??\n");
*/
pem->pe_import = (LPIMAGE_IMPORT_DESCRIPTOR) RVA(dir.VirtualAddress);
}
@@ -639,7 +656,7 @@
if(dir.Size)
{
if(pem->pe_resource && (int)pem->pe_resource!=RVA(dir.VirtualAddress))
- fprintf(stderr,"wrong resource directory??\n");
+ WARN(win32,"wrong resource directory??\n");
pem->pe_resource = (LPIMAGE_RESOURCE_DIRECTORY) RVA(dir.VirtualAddress);
}
@@ -655,7 +672,7 @@
if(dir.Size)
{
if(pem->pe_reloc && (int)pem->pe_reloc!= RVA(dir.VirtualAddress))
- fprintf(stderr,"wrong relocation list??\n");
+ WARN(win32,"wrong relocation list??\n");
pem->pe_reloc = (void *) RVA(dir.VirtualAddress);
}
@@ -685,20 +702,33 @@
if(nt_header->OptionalHeader.DataDirectory[15].Size)
FIXME(win32,"Unknown directory 15 ignored\n");
- if(pem->pe_reloc) do_relocations(pem);
- if(pem->pe_export) dump_exports(pem->module);
+ if(pem->pe_reloc) do_relocations(wm);
+ if(pem->pe_export) {
+ dump_exports(wm->module);
+
+ wm->modname = HEAP_strdupA(process->heap,0,(char*)RVA(pem->pe_export->Name));
+ } else {
+ /* try to find out the name from the OFSTRUCT */
+ char *s;
+ modname = s = ofs->szPathName;
+ while ((s=strchr(modname,'\\')))
+ modname = s+1;
+ if ((s=strchr(modname,'.')))
+ *s='\0';
+ wm->modname = HEAP_strdupA(process->heap,0,modname);
+ }
if(pem->pe_import) {
- if (fixup_imports(process,pem)) {
- PE_MODREF **xpem;
+ if (fixup_imports(process,wm)) {
+ WINE_MODREF **xwm;
/* remove entry from modref chain */
- xpem = &(process->modref_list);
- while (*xpem) {
- if (*xpem==pem) {
- *xpem = pem->next;
+ xwm = &(process->modref_list);
+ while (*xwm) {
+ if (*xwm==wm) {
+ *xwm = wm->next;
break;
}
- xpem = &((*xpem)->next);
+ xwm = &((*xwm)->next);
}
/* FIXME: there are several more dangling references
* left. Including dlls loaded by this dll before the
@@ -710,17 +740,6 @@
}
}
- if (pem->pe_export)
- modname = (char*)RVA(pem->pe_export->Name);
- else {
- char *s;
- modname = s = ofs->szPathName;
- while ((s=strchr(modname,'\\')))
- modname = s+1;
- if ((s=strchr(modname,'.')))
- *s='\0';
- }
-
/* Now that we got everything at the right address,
* we can unmap the previous module */
UnmapViewOfFile( (LPVOID)hModule );
@@ -738,71 +757,52 @@
OFSTRUCT ofs;
HMODULE32 hModule;
NE_MODULE *pModule;
- PE_MODREF *pem;
+ WINE_MODREF *wm;
- if ((hModule = MODULE_FindModule( name ))) {
- /* the .DLL is either loaded or internal */
- hModule = MODULE_HANDLEtoHMODULE32(hModule);
- if (!HIWORD(hModule)) /* internal (or bad) */
- return hModule;
- /* check if this module is already mapped */
- pem = process->modref_list;
- pModule = MODULE_GetPtr(hModule);
- while (pem) {
- if (pem->module == hModule) {
+ if ((hModule = MODULE_FindModule32( process, name ))) {
+
+ pModule = MODULE_GetPtr32(hModule);
+ for (wm= process->modref_list;wm;wm=wm->next)
+ if (wm->module == hModule) {
pModule->count++;
return hModule;
}
- pem = pem->next;
- }
- if (pModule->flags & NE_FFLAGS_BUILTIN) {
- IMAGE_DOS_HEADER *dh;
- IMAGE_NT_HEADERS *nh;
- IMAGE_SECTION_HEADER *sh;
-
- /* we only come here if we already have 'loaded' the
- * internal dll but in another process. Just create
- * a PE_MODREF and return.
- */
- pem = (PE_MODREF*)HeapAlloc(process->heap,
- HEAP_ZERO_MEMORY,sizeof(*pem));
- pem->module = hModule;
- dh = (IMAGE_DOS_HEADER*)pem->module;
- nh = (IMAGE_NT_HEADERS*)(dh+1);
- sh = (IMAGE_SECTION_HEADER*)(nh+1);
- pem->pe_export = (IMAGE_EXPORT_DIRECTORY*)(sh+2);
- pem->next = process->modref_list;
- process->modref_list = pem;
- return hModule;
- }
- } else {
-
- /* try to load builtin, enabled modules first */
- if ((hModule = BUILTIN32_LoadModule( name, FALSE, process )))
- return MODULE_HANDLEtoHMODULE32( hModule );
-
- /* try to open the specified file */
- if (HFILE_ERROR32==(hFile=OpenFile32(name,&ofs,OF_READ))) {
- /* Now try the built-in even if disabled */
- if ((hModule = BUILTIN32_LoadModule( name, TRUE, process ))) {
- fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name );
- return MODULE_HANDLEtoHMODULE32( hModule );
- }
- return 1;
- }
- if ((hModule = MODULE_CreateDummyModule( &ofs )) < 32) {
- _lclose32(hFile);
- return hModule;
- }
- pModule = (NE_MODULE *)GlobalLock16( hModule );
- pModule->flags = NE_FFLAGS_WIN32;
- pModule->module32 = PE_LoadImage( hFile );
- CloseHandle( hFile );
- if (pModule->module32 < 32) return 21;
+ /* Since MODULE_FindModule32 uses the modref chain too, the
+ * module MUST have been found above. If not, something has gone
+ * terribly wrong.
+ */
+ assert(0);
}
- /* recurse */
+ /* try to load builtin, enabled modules first */
+ if ((hModule = BUILTIN32_LoadModule( name, FALSE, process )))
+ return hModule;
+
+ /* try to load the specified dll/exe */
+ if (HFILE_ERROR32==(hFile=OpenFile32(name,&ofs,OF_READ))) {
+ /* Now try the built-in even if disabled */
+ if ((hModule = BUILTIN32_LoadModule( name, TRUE, process ))) {
+ fprintf( stderr, "Warning: could not load external DLL '%s', using built-in module.\n", name );
+ return hModule;
+ }
+ return 1;
+ }
+ if ((hModule = MODULE_CreateDummyModule( &ofs )) < 32) {
+ _lclose32(hFile);
+ return hModule;
+ }
+ pModule = (NE_MODULE *)GlobalLock16( hModule );
+ pModule->flags = NE_FFLAGS_WIN32;
+ pModule->module32 = PE_LoadImage( hFile );
+ CloseHandle( hFile );
+ if (pModule->module32 < 32)
+ {
+ FreeLibrary32( hModule);
+ return 21; /* FIXME: probably 0 */
+ }
+
+ /* (possible) recursion */
if (!PE_MapImage( &(pModule->module32), process, &ofs,flags)) {
- /* should free this module and the already referenced ones */
+ /* FIXME: should free this module and its referenced ones */
return 0;
}
return pModule->module32;
@@ -829,7 +829,7 @@
pModule->module32 = hModule32 = PE_LoadImage( hFile );
if (hModule32 < 32) return 21;
- hInstance = MODULE_CreateInstance( hModule16, (cmd_line == NULL) );
+ hInstance = MODULE_CreateInstance( hModule16, NULL, (cmd_line == NULL) );
if (cmd_line &&
!(PE_HEADER(hModule32)->FileHeader.Characteristics & IMAGE_FILE_DLL))
{
@@ -848,9 +848,12 @@
return hInstance;
}
+/*********************************************************************
+ * PE_UnloadImage [internal]
+ */
int PE_UnloadImage( HMODULE32 hModule )
{
- fprintf(stderr,"PEunloadImage() called!\n");
+ FIXME(win32,"stub.\n");
/* free resources, image, unmap */
return 1;
}
@@ -860,10 +863,12 @@
* DLL_PROCESS_ATTACH. Only new created threads do DLL_THREAD_ATTACH
* (SDK)
*/
-static void PE_InitDLL(PE_MODREF *pem, DWORD type,LPVOID lpReserved)
+static void PE_InitDLL(WINE_MODREF *wm, DWORD type,LPVOID lpReserved)
{
+ if (wm->type!=MODULE32_PE)
+ return;
if (type==DLL_PROCESS_ATTACH)
- pem->flags |= PE_MODREF_PROCESS_ATTACHED;
+ wm->binfmt.pe.flags |= PE_MODREF_PROCESS_ATTACHED;
/* DLL_ATTACH_PROCESS:
* lpreserved is NULL for dynamic loads, not-NULL for static loads
@@ -873,14 +878,14 @@
*/
/* Is this a library? And has it got an entrypoint? */
- if ((PE_HEADER(pem->module)->FileHeader.Characteristics & IMAGE_FILE_DLL) &&
- (PE_HEADER(pem->module)->OptionalHeader.AddressOfEntryPoint)
+ if ((PE_HEADER(wm->module)->FileHeader.Characteristics & IMAGE_FILE_DLL) &&
+ (PE_HEADER(wm->module)->OptionalHeader.AddressOfEntryPoint)
) {
- FARPROC32 entry = (FARPROC32)RVA_PTR( pem->module,
+ FARPROC32 entry = (FARPROC32)RVA_PTR( wm->module,
OptionalHeader.AddressOfEntryPoint );
TRACE(relay, "CallTo32(entryproc=%p,module=%08x,type=%ld,res=%p)\n",
- entry, pem->module, type, lpReserved );
- entry( pem->module, type, lpReserved );
+ entry, wm->module, type, lpReserved );
+ entry( wm->module, type, lpReserved );
}
}
@@ -889,57 +894,70 @@
* LoadLibrary) ... but it won't matter)
*/
void PE_InitializeDLLs(PDB32 *process,DWORD type,LPVOID lpReserved) {
- PE_MODREF *pem;
+ WINE_MODREF *wm;
- pem = process->modref_list;
- while (pem) {
- if (pem->flags & PE_MODREF_NO_DLL_CALLS) {
- pem = pem->next;
+ for (wm = process->modref_list;wm;wm=wm->next) {
+ PE_MODREF *pem = NULL;
+ if (wm->type!=MODULE32_PE)
continue;
- }
+ pem = &(wm->binfmt.pe);
+ if (pem->flags & PE_MODREF_NO_DLL_CALLS)
+ continue;
if (type==DLL_PROCESS_ATTACH) {
- if (pem->flags & PE_MODREF_PROCESS_ATTACHED) {
- pem = pem->next;
+ if (pem->flags & PE_MODREF_PROCESS_ATTACHED)
continue;
- }
}
- PE_InitDLL( pem, type, lpReserved );
- pem = pem->next;
+ PE_InitDLL( wm, type, lpReserved );
}
}
void PE_InitTls(THDB *thdb)
{
- /* FIXME: tls callbacks ??? */
+ WINE_MODREF *wm;
PE_MODREF *pem;
IMAGE_NT_HEADERS *peh;
DWORD size,datasize;
LPVOID mem;
LPIMAGE_TLS_DIRECTORY pdir;
PDB32 *pdb = thdb->process;
-
- pem = pdb->modref_list;
- while (pem) {
- peh = PE_HEADER(pem->module);
- if (!peh->OptionalHeader.DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress) {
- pem = pem->next;
+ int delta;
+
+ for (wm = pdb->modref_list;wm;wm=wm->next) {
+ if (wm->type!=MODULE32_PE)
continue;
- }
- pdir = (LPVOID)(pem->module + peh->OptionalHeader.
+ pem = &(wm->binfmt.pe);
+ peh = PE_HEADER(wm->module);
+ delta = wm->module - peh->OptionalHeader.ImageBase;
+ if (!peh->OptionalHeader.DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress)
+ continue;
+ pdir = (LPVOID)(wm->module + peh->OptionalHeader.
DataDirectory[IMAGE_FILE_THREAD_LOCAL_STORAGE].VirtualAddress);
+
if (!(pem->flags & PE_MODREF_TLS_ALLOCED)) {
pem->tlsindex = THREAD_TlsAlloc(thdb);
- *(pdir->AddressOfIndex)=pem->tlsindex;
+ *(LPDWORD)AdjustPtr(pdir->AddressOfIndex,delta)
+ =pem->tlsindex;
}
pem->flags |= PE_MODREF_TLS_ALLOCED;
datasize= pdir->EndAddressOfRawData-pdir->StartAddressOfRawData;
size = datasize + pdir->SizeOfZeroFill;
mem=VirtualAlloc(0,size,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
- memcpy(mem,(LPVOID) pdir->StartAddressOfRawData, datasize);
+ memcpy(mem,
+ AdjustPtr(pdir->StartAddressOfRawData,delta),
+ datasize);
+
/* don't use TlsSetValue, we are in the wrong thread */
+ if (pdir->AddressOfCallBacks) {
+ LPIMAGE_TLS_CALLBACK *cbs =
+ (LPIMAGE_TLS_CALLBACK *)
+ AdjustPtr(pdir->AddressOfCallBacks, delta);
+
+ if (*cbs) {
+ FIXME(win32, "TLS Callbacks aren't going to be called\n");
+ }
+ }
thdb->tls_array[pem->tlsindex] = mem;
- pem=pem->next;
}
}
@@ -949,13 +967,10 @@
*/
BOOL32 WINAPI DisableThreadLibraryCalls(HMODULE32 hModule)
{
- PDB32 *process = PROCESS_Current();
- PE_MODREF *pem = process->modref_list;
+ WINE_MODREF *wm;
- while (pem) {
- if (pem->module == hModule)
- pem->flags|=PE_MODREF_NO_DLL_CALLS;
- pem = pem->next;
- }
+ for (wm=PROCESS_Current()->modref_list;wm;wm=wm->next)
+ if ((wm->module == hModule) && (wm->type==MODULE32_PE))
+ wm->binfmt.pe.flags|=PE_MODREF_NO_DLL_CALLS;
return TRUE;
}
diff --git a/loader/pe_resource.c b/loader/pe_resource.c
index da06142..2d058b5 100644
--- a/loader/pe_resource.c
+++ b/loader/pe_resource.c
@@ -31,18 +31,13 @@
*/
static PE_MODREF*
HMODULE32toPE_MODREF(HMODULE32 hmod) {
- NE_MODULE *pModule;
+ WINE_MODREF *wm;
PDB32 *pdb = PROCESS_Current();
- PE_MODREF *pem;
- if (!hmod) hmod = GetTaskDS(); /* FIXME: correct? */
- hmod = MODULE_HANDLEtoHMODULE32( hmod );
- if (!hmod) return NULL;
- if (!(pModule = MODULE_GetPtr( hmod ))) return 0;
- pem = pdb->modref_list;
- while (pem && pem->module != hmod)
- pem=pem->next;
- return pem;
+ wm = MODULE32_LookupHMODULE( pdb, hmod );
+ if (!wm || wm->type!=MODULE32_PE)
+ return NULL;
+ return &(wm->binfmt.pe);
}
/**********************************************************************
@@ -106,12 +101,12 @@
* PE_FindResourceEx32W
*/
HANDLE32 PE_FindResourceEx32W(
- HINSTANCE32 hModule,LPCWSTR name,LPCWSTR type,WORD lang
+ WINE_MODREF *wm,LPCWSTR name,LPCWSTR type,WORD lang
) {
LPIMAGE_RESOURCE_DIRECTORY resdirptr;
DWORD root;
HANDLE32 result;
- PE_MODREF *pem = HMODULE32toPE_MODREF(hModule);
+ PE_MODREF *pem = &(wm->binfmt.pe);
if (!pem || !pem->pe_resource)
return 0;
@@ -133,15 +128,11 @@
/**********************************************************************
* PE_LoadResource32
*/
-HANDLE32 PE_LoadResource32( HINSTANCE32 hModule, HANDLE32 hRsrc )
+HANDLE32 PE_LoadResource32( WINE_MODREF *wm, HANDLE32 hRsrc )
{
- PE_MODREF *pem = HMODULE32toPE_MODREF(hModule);
-
- if (!pem || !pem->pe_resource)
+ if (!hRsrc || !wm || wm->type!=MODULE32_PE)
return 0;
- if (!hRsrc)
- return 0;
- return (HANDLE32) (pem->module + ((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
+ return (HANDLE32) (wm->module + ((LPIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->OffsetToData);
}
diff --git a/loader/resource.c b/loader/resource.c
index e3591b0..32f2a6d 100644
--- a/loader/resource.c
+++ b/loader/resource.c
@@ -5,6 +5,7 @@
* Copyright 1995 Alexandre Julliard
*/
+#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -18,6 +19,7 @@
#include "heap.h"
#include "neexe.h"
#include "task.h"
+#include "process.h"
#include "module.h"
#include "resource.h"
#include "debug.h"
@@ -26,65 +28,11 @@
extern WORD WINE_LanguageId;
-/* error message when 16-bit resource function is called for Win32 module */
-static const char* NEWin32FailureString = "fails with Win32 module\n";
-/* error message when 32-bit resource function is called for Win16 module */
-static const char* PEWin16FailureString = "fails with Win16 module\n";
-
-/**********************************************************************
- * FindResource16 (KERNEL.60)
- */
-HRSRC16 WINAPI FindResource16( HMODULE16 hModule, SEGPTR name, SEGPTR type )
-{
- NE_MODULE *pModule;
-
- hModule = MODULE_HANDLEtoHMODULE16( hModule );
-
- if (HIWORD(name)) /* Check for '#xxx' name */
- {
- char *ptr = PTR_SEG_TO_LIN( name );
- if (ptr[0] == '#')
- if (!(name = (SEGPTR)atoi( ptr + 1 ))) {
- WARN(resource, "Incorrect resource name: %s\n", ptr);
- return 0;
- }
- }
-
- if (HIWORD(type)) /* Check for '#xxx' type */
- {
- char *ptr = PTR_SEG_TO_LIN( type );
- if (ptr[0] == '#')
- if (!(type = (SEGPTR)atoi( ptr + 1 ))){
- WARN(resource, "Incorrect resource type: %s\n", ptr);
- return 0;
- }
- }
-
- TRACE(resource, "module=%04x name=%s type=%s\n",
- hModule, debugres_a(PTR_SEG_TO_LIN(name)),
- debugres_a(PTR_SEG_TO_LIN(type)) );
-
- if ((pModule = MODULE_GetPtr( hModule )))
- {
- if (!__winelib)
- {
- if (pModule->flags & NE_FFLAGS_WIN32)
- fprintf(stderr,"FindResource16: %s", NEWin32FailureString);
- else
- return NE_FindResource( hModule, type, name );
- }
- else return LIBRES_FindResource16( hModule,
- (LPCSTR)PTR_SEG_TO_LIN(name),
- (LPCSTR)PTR_SEG_TO_LIN(type) );
- }
- return 0;
-}
-
/**********************************************************************
* FindResource32A (KERNEL32.128)
*/
-HANDLE32 WINAPI FindResource32A( HINSTANCE32 hModule, LPCSTR name, LPCSTR type)
+HANDLE32 WINAPI FindResource32A( HMODULE32 hModule, LPCSTR name, LPCSTR type)
{
return FindResourceEx32A(hModule,name,type,WINE_LanguageId);
}
@@ -92,9 +40,9 @@
/**********************************************************************
* FindResourceEx32A (KERNEL32.129)
*/
-HANDLE32 WINAPI FindResourceEx32A( HINSTANCE32 hModule, LPCSTR name,
- LPCSTR type, WORD lang )
-{
+HANDLE32 WINAPI FindResourceEx32A( HMODULE32 hModule, LPCSTR name, LPCSTR type,
+ WORD lang
+) {
LPWSTR xname,xtype;
HANDLE32 ret;
@@ -116,27 +64,34 @@
/**********************************************************************
* FindResourceEx32W (KERNEL32.130)
*/
-HRSRC32 WINAPI FindResourceEx32W( HINSTANCE32 hModule, LPCWSTR name,
+HRSRC32 WINAPI FindResourceEx32W( HMODULE32 hModule, LPCWSTR name,
LPCWSTR type, WORD lang )
{
- if (!__winelib)
- {
- NE_MODULE *pModule;
+ WINE_MODREF *wm = MODULE32_LookupHMODULE(PROCESS_Current(),hModule);
+ HRSRC32 hrsrc;
- if (!hModule) hModule = GetTaskDS();
- hModule = MODULE_HANDLEtoHMODULE32( hModule );
- TRACE(resource, "module=%08x "
- "type=%s%p name=%s%p\n", hModule,
- (HIWORD(type))? "" : "#", type,
- (HIWORD(name))? "" : "#", name);
-
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
- if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0;
- return PE_FindResourceEx32W(hModule,name,type,lang);
+ TRACE(resource, "module=%08x "
+ "type=%s%p name=%s%p\n", wm->module,
+ (HIWORD(type))? "" : "#", type,
+ (HIWORD(name))? "" : "#", name);
+ if (__winelib) {
+ hrsrc = LIBRES_FindResource( hModule, name, type );
+ if (hrsrc)
+ return hrsrc;
}
- else return LIBRES_FindResource32( hModule, name, type );
+ if (wm) {
+ switch (wm->type) {
+ case MODULE32_PE:
+ return PE_FindResourceEx32W(wm,name,type,lang);
+ default:
+ ERR(module,"unknown module type %d\n",wm->type);
+ break;
+ }
+ }
+ return (HRSRC32)0;
}
+
/**********************************************************************
* FindResource32W (KERNEL32.131)
*/
@@ -147,98 +102,35 @@
/**********************************************************************
- * LoadResource16 (KERNEL.61)
- */
-HGLOBAL16 WINAPI LoadResource16( HMODULE16 hModule, HRSRC16 hRsrc )
-{
- NE_MODULE *pModule;
-
- hModule = MODULE_HANDLEtoHMODULE16( hModule );
- TRACE(resource, "module=%04x res=%04x\n",
- hModule, hRsrc );
- if (!hRsrc) return 0;
- if ((pModule = MODULE_GetPtr( hModule )))
- {
- if (!__winelib)
- {
- if (pModule->flags & NE_FFLAGS_WIN32)
- fprintf(stderr,"LoadResource16: %s", NEWin32FailureString);
- else
- return NE_LoadResource( hModule, hRsrc );
- }
- else return LIBRES_LoadResource( hModule, hRsrc );
- }
- return 0;
-}
-
-/**********************************************************************
* LoadResource32 (KERNEL32.370)
+ * 'loads' a resource. The current implementation just returns a pointer
+ * into the already mapped image.
+ * RETURNS
+ * pointer into the mapped resource of the passed module
*/
-HGLOBAL32 WINAPI LoadResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
+HGLOBAL32 WINAPI LoadResource32(
+ HINSTANCE32 hModule, /* [in] module handle */
+ HRSRC32 hRsrc ) /* [in] resource handle */
{
- if (!__winelib)
- {
- NE_MODULE *pModule;
+ WINE_MODREF *wm = MODULE32_LookupHMODULE(PROCESS_Current(),hModule);
- if (!hModule) hModule = GetTaskDS(); /* FIXME: see FindResource32W */
- hModule = MODULE_HANDLEtoHMODULE32( hModule );
- TRACE(resource, "module=%04x res=%04x\n",
- hModule, hRsrc );
- if (!hRsrc) return 0;
-
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
- if (!(pModule->flags & NE_FFLAGS_WIN32))
- {
- fprintf(stderr,"LoadResource32: %s", PEWin16FailureString );
- return 0; /* FIXME? */
- }
- return PE_LoadResource32(hModule,hRsrc);
+ TRACE(resource, "module=%04x res=%04x\n",
+ hModule, hRsrc );
+ if (!hRsrc) {
+ ERR(resource,"hRsrc is 0, return 0.\n");
+ return 0;
}
- else return LIBRES_LoadResource( hModule, hRsrc );
-}
-
-
-/**********************************************************************
- * LockResource (KERNEL.62)
- */
-/* 16-bit version */
-SEGPTR WINAPI WIN16_LockResource16(HGLOBAL16 handle)
-{
- HMODULE16 hModule;
- NE_MODULE *pModule;
-
- TRACE(resource, "handle=%04x\n", handle );
- if (!handle) return (SEGPTR)0;
- hModule = MODULE_HANDLEtoHMODULE16( handle );
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
- if (pModule->flags & NE_FFLAGS_WIN32)
- {
- fprintf(stderr,"LockResource16: %s", NEWin32FailureString);
- return 0;
- }
- return NE_LockResource( hModule, handle );
-}
-
-/* Winelib 16-bit version */
-LPVOID WINAPI LockResource16( HGLOBAL16 handle )
-{
- if (!__winelib)
- {
- HMODULE16 hModule;
- NE_MODULE *pModule;
-
- TRACE(resource, "handle=%04x\n", handle );
- if (!handle) return NULL;
- hModule = MODULE_HANDLEtoHMODULE16( handle );
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
- if (pModule->flags & NE_FFLAGS_WIN32)
- {
- fprintf(stderr,"LockResource16: %s", NEWin32FailureString);
- return 0;
- }
- return (LPSTR)PTR_SEG_TO_LIN( NE_LockResource( hModule, handle ) );
- }
- else return LIBRES_LockResource( handle );
+ if (wm)
+ switch (wm->type) {
+ case MODULE32_PE:
+ return PE_LoadResource32(wm,hRsrc);
+ default:
+ ERR(resource,"unknown module type %d\n",wm->type);
+ break;
+ }
+ if (__winelib)
+ return LIBRES_LoadResource( hModule, hRsrc );
+ return 0;
}
@@ -252,30 +144,6 @@
/**********************************************************************
- * FreeResource16 (KERNEL.63)
- */
-BOOL16 WINAPI FreeResource16( HGLOBAL16 handle )
-{
- if (!__winelib)
- {
- HMODULE16 hModule;
- NE_MODULE *pModule;
-
- TRACE(resource, "handle=%04x\n", handle );
- if (!handle) return FALSE;
- hModule = MODULE_HANDLEtoHMODULE16( handle );
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
- if (pModule->flags & NE_FFLAGS_WIN32)
- {
- fprintf(stderr,"FreeResource16: %s", NEWin32FailureString);
- return 0;
- }
- return NE_FreeResource( hModule, handle );
- }
- else return LIBRES_FreeResource( handle );
-}
-
-/**********************************************************************
* FreeResource32 (KERNEL32.145)
*/
BOOL32 WINAPI FreeResource32( HGLOBAL32 handle )
@@ -286,125 +154,41 @@
/**********************************************************************
- * AccessResource16 (KERNEL.64)
- */
-INT16 WINAPI AccessResource16( HINSTANCE16 hModule, HRSRC16 hRsrc )
-{
- NE_MODULE *pModule;
-
- hModule = MODULE_HANDLEtoHMODULE16( hModule );
- TRACE(resource, "module=%04x res=%04x\n",
- hModule, hRsrc );
- if (!hRsrc) return 0;
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
- if (!__winelib)
- {
- if (pModule->flags & NE_FFLAGS_WIN32)
- {
- fprintf(stderr,"AccessResource16: %s", NEWin32FailureString);
- return 0;
- }
- return NE_AccessResource( hModule, hRsrc );
- }
- else return LIBRES_AccessResource( hModule, hRsrc );
-}
-
-
-/**********************************************************************
* AccessResource32 (KERNEL32.64)
*/
-INT32 WINAPI AccessResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
+INT32 WINAPI AccessResource32( HMODULE32 hModule, HRSRC32 hRsrc )
{
- hModule = MODULE_HANDLEtoHMODULE32( hModule );
- TRACE(resource, "module=%04x res=%04x\n",
- hModule, hRsrc );
- if (!hRsrc) return 0;
- fprintf(stderr,"AccessResource32: not implemented\n");
+ FIXME(resource,"(module=%08x res=%08x),not implemented\n", hModule, hRsrc);
return 0;
}
/**********************************************************************
- * SizeofResource16 (KERNEL.65)
- */
-DWORD WINAPI SizeofResource16( HMODULE16 hModule, HRSRC16 hRsrc )
-{
- NE_MODULE *pModule;
-
- hModule = MODULE_HANDLEtoHMODULE16( hModule );
- TRACE(resource, "module=%04x res=%04x\n",
- hModule, hRsrc );
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
- if (!__winelib)
- {
- if (pModule->flags & NE_FFLAGS_WIN32)
- {
- fprintf(stderr,"SizeOfResource16: %s", NEWin32FailureString);
- return 0;
- }
- return NE_SizeofResource( hModule, hRsrc );
- }
- else return LIBRES_SizeofResource( hModule, hRsrc );
-}
-
-
-/**********************************************************************
* SizeofResource32 (KERNEL32.522)
*/
DWORD WINAPI SizeofResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
{
- hModule = MODULE_HANDLEtoHMODULE32( hModule );
- TRACE(resource, "module=%04x res=%04x\n",
- hModule, hRsrc );
- if (!__winelib) return PE_SizeofResource32(hModule,hRsrc);
- else
- {
- fprintf(stderr,"SizeofResource32: not implemented\n");
- return 0;
- }
-}
+ WINE_MODREF *wm = MODULE32_LookupHMODULE(PROCESS_Current(),hModule);
-
-/**********************************************************************
- * AllocResource16 (KERNEL.66)
- */
-HGLOBAL16 WINAPI AllocResource16( HMODULE16 hModule, HRSRC16 hRsrc, DWORD size)
-{
- NE_MODULE *pModule;
-
- hModule = MODULE_HANDLEtoHMODULE16( hModule );
- TRACE(resource, "module=%04x res=%04x size=%ld\n",
- hModule, hRsrc, size );
- if (!hRsrc) return 0;
- if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
- if (!__winelib)
- {
- if (pModule->flags & NE_FFLAGS_WIN32)
+ TRACE(resource, "module=%08x res=%08x\n", hModule, hRsrc );
+ if (wm)
+ switch (wm->type)
{
- fprintf(stderr,"AllocResource16: %s", NEWin32FailureString);
- return 0;
- }
- return NE_AllocResource( hModule, hRsrc, size );
- }
- else return LIBRES_AllocResource( hModule, hRsrc, size );
-}
-
-/**********************************************************************
- * DirectResAlloc (KERNEL.168)
- *
- * Check Schulman, p. 232 for details
- */
-HGLOBAL16 WINAPI DirectResAlloc( HINSTANCE16 hInstance, WORD wType,
- UINT16 wSize )
-{
- TRACE(resource,"(%04x,%04x,%04x)\n",
- hInstance, wType, wSize );
- hInstance = MODULE_HANDLEtoHMODULE16(hInstance);
- if(!hInstance)return 0;
- if(wType != 0x10) /* 0x10 is the only observed value, passed from
- CreateCursorIndirect. */
- fprintf(stderr, "DirectResAlloc: wType = %x\n", wType);
- return GLOBAL_Alloc(GMEM_MOVEABLE, wSize, hInstance, FALSE, FALSE, FALSE);
+ case MODULE32_PE:
+ {
+ DWORD ret;
+ ret = PE_SizeofResource32(hModule,hRsrc);
+ if (ret)
+ return ret;
+ break;
+ }
+ default:
+ ERR(module,"unknown module type %d\n",wm->type);
+ break;
+ }
+ if (__winelib)
+ fprintf(stderr,"SizeofResource32: not implemented for WINELIB\n");
+ return 0;
}
@@ -576,14 +360,22 @@
return hAccel;
}
-/**********************************************************************
- * DestroyAcceleratorTable (USER32.130)
+
+/******************************************************************************
+ * DestroyAcceleratorTable [USER32.130]
+ * Destroys an accelerator table
*
- * By mortene@pvv.org 980321
+ * NOTES
+ * By mortene@pvv.org 980321
+ *
+ * PARAMS
+ * handle [I] Handle to accelerator table
+ *
+ * RETURNS STD
*/
BOOL32 WINAPI DestroyAcceleratorTable( HACCEL32 handle )
{
- FIXME(accel, "stub (handle 0x%x)\n", handle);
+ FIXME(accel, "(0x%x): stub\n", handle);
/* Weird.. I thought this should work. According to the API
@@ -647,8 +439,7 @@
buffer[0] = '\0';
return 0;
}
- fprintf(stderr,"LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen, *p);
- fprintf(stderr,"LoadString // and try to obtain string '%s'\n", p + 1);
+ WARN(resource,"Dont know why caller give buflen=%d *p=%d trying to obtain string '%s'\n", buflen, *p, p + 1);
}
FreeResource16( hmem );
@@ -698,8 +489,7 @@
return 0;
}
#if 0
- fprintf(stderr,"LoadString // I dont know why , but caller give buflen=%d *p=%d !\n", buflen, *p);
- fprintf(stderr,"LoadString // and try to obtain string '%s'\n", p + 1);
+ WARN(resource,"Dont know why caller give buflen=%d *p=%d trying to obtain string '%s'\n", buflen, *p, p + 1);
#endif
}
@@ -757,7 +547,7 @@
/**********************************************************************
* LoadMessage32A (internal)
*/
-INT32 LoadMessage32A( HINSTANCE32 instance, UINT32 id, WORD lang,
+INT32 LoadMessage32A( HMODULE32 instance, UINT32 id, WORD lang,
LPSTR buffer, INT32 buflen )
{
HGLOBAL32 hmem;
@@ -824,7 +614,7 @@
/**********************************************************************
* LoadMessage32W (internal)
*/
-INT32 LoadMessage32W( HINSTANCE32 instance, UINT32 id, WORD lang,
+INT32 LoadMessage32W( HMODULE32 instance, UINT32 id, WORD lang,
LPWSTR buffer, INT32 buflen )
{
INT32 retval;
@@ -845,35 +635,12 @@
/**********************************************************************
- * SetResourceHandler (KERNEL.43)
- */
-FARPROC16 WINAPI SetResourceHandler( HMODULE16 hModule, SEGPTR s,
- FARPROC16 resourceHandler )
-{
- NE_MODULE *pModule;
-
- hModule = GetExePtr( hModule );
-
- TRACE(resource, "module=%04x type=%s\n",
- hModule, debugres_a(PTR_SEG_TO_LIN(s)) );
-
- if ((pModule = MODULE_GetPtr( hModule )))
- {
- if (pModule->flags & NE_FFLAGS_WIN32)
- fprintf(stderr,"SetResourceHandler: %s\n", NEWin32FailureString);
- else if (pModule->res_table)
- return NE_SetResourceHandler( hModule, s, resourceHandler );
- }
- return NULL;
-}
-
-
-/**********************************************************************
* EnumResourceTypesA (KERNEL32.90)
*/
BOOL32 WINAPI EnumResourceTypes32A( HMODULE32 hmodule,ENUMRESTYPEPROC32A lpfun,
LONG lParam)
{
+ /* FIXME: move WINE_MODREF stuff here */
return PE_EnumResourceTypes32A(hmodule,lpfun,lParam);
}
@@ -883,6 +650,7 @@
BOOL32 WINAPI EnumResourceTypes32W( HMODULE32 hmodule,ENUMRESTYPEPROC32W lpfun,
LONG lParam)
{
+ /* FIXME: move WINE_MODREF stuff here */
return PE_EnumResourceTypes32W(hmodule,lpfun,lParam);
}
@@ -892,6 +660,7 @@
BOOL32 WINAPI EnumResourceNames32A( HMODULE32 hmodule, LPCSTR type,
ENUMRESNAMEPROC32A lpfun, LONG lParam )
{
+ /* FIXME: move WINE_MODREF stuff here */
return PE_EnumResourceNames32A(hmodule,type,lpfun,lParam);
}
/**********************************************************************
@@ -900,6 +669,7 @@
BOOL32 WINAPI EnumResourceNames32W( HMODULE32 hmodule, LPCWSTR type,
ENUMRESNAMEPROC32W lpfun, LONG lParam )
{
+ /* FIXME: move WINE_MODREF stuff here */
return PE_EnumResourceNames32W(hmodule,type,lpfun,lParam);
}
@@ -910,6 +680,7 @@
LPCSTR name, ENUMRESLANGPROC32A lpfun,
LONG lParam)
{
+ /* FIXME: move WINE_MODREF stuff here */
return PE_EnumResourceLanguages32A(hmodule,type,name,lpfun,lParam);
}
/**********************************************************************
@@ -919,5 +690,6 @@
LPCWSTR name, ENUMRESLANGPROC32W lpfun,
LONG lParam)
{
+ /* FIXME: move WINE_MODREF stuff here */
return PE_EnumResourceLanguages32W(hmodule,type,name,lpfun,lParam);
}
diff --git a/loader/task.c b/loader/task.c
index f168427..99c7611 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -208,7 +208,7 @@
{
int exit_code = 1;
TDB *pTask = (TDB *)GlobalLock16( hCurrentTask );
- NE_MODULE *pModule = MODULE_GetPtr( pTask->hModule );
+ NE_MODULE *pModule = MODULE_GetPtr16( pTask->hModule );
SEGTABLEENTRY *pSegTable = NE_SEG_TABLE( pModule );
SET_CUR_THREAD( pTask->thdb );
@@ -262,7 +262,7 @@
Callbacks->CallRegisterShortProc( &context, 0 );
/* This should never return */
- fprintf( stderr, "TASK_CallToStart: Main program returned!\n" );
+ ERR( task, "Main program returned! (should never happen)\n" );
TASK_KillCurrentTask( 1 );
}
}
@@ -331,7 +331,7 @@
pTask->pdb.int20 = 0x20cd;
pTask->pdb.dispatcher[0] = 0x9a; /* ljmp */
- PUT_DWORD(&pTask->pdb.dispatcher[1], (DWORD)MODULE_GetEntryPoint(
+ PUT_DWORD(&pTask->pdb.dispatcher[1], (DWORD)NE_GetEntryPoint(
GetModuleHandle16("KERNEL"), 102 )); /* KERNEL.102 is DOS3Call() */
pTask->pdb.savedint22 = INT_GetHandler( 0x22 );
pTask->pdb.savedint23 = INT_GetHandler( 0x23 );
@@ -509,7 +509,7 @@
/* We should never return from this Yield() */
- fprintf(stderr,"Return of the living dead %04x!!!\n", hCurrentTask);
+ ERR(task,"Return of the living dead %04x!!!\n", hCurrentTask);
exit(1);
}
@@ -660,7 +660,7 @@
if (context) EAX_reg(context) = 0;
if (!(pTask = (TDB *)GlobalLock16( hCurrentTask ))) return;
- if (!(pModule = MODULE_GetPtr( pTask->hModule ))) return;
+ if (!(pModule = MODULE_GetPtr16( pTask->hModule ))) return;
/* This is a hack to install task USER signal handler before
* implicitly loaded DLLs are initialized (see windows/user.c) */
@@ -681,7 +681,6 @@
* es:bx pointer to command-line inside PSP
*/
EAX_reg(context) = 1;
- EBX_reg(context) = pTask->pdb.cmdLine[0] ? 0x81 : 0x80;
if (!pTask->pdb.cmdLine[0]) EBX_reg(context) = 0x80;
else
@@ -857,7 +856,6 @@
SEGPTR thunkaddr;
if (!hInstance) return 0;
- if (__winelib) return func; /* func can be called directly in Winelib */
thunkaddr = TASK_AllocThunk( hCurrentTask );
if (!thunkaddr) return (FARPROC16)0;
thunk = PTR_SEG_TO_LIN( thunkaddr );
@@ -868,7 +866,7 @@
if (((lfunc[0]==0x8c) && (lfunc[1]==0xd8)) ||
((lfunc[0]==0x1e) && (lfunc[1]==0x58))
) {
- fprintf(stderr,"FIXME: MakeProcInstance16 thunk would be useless for %p, overwriting with nop;nop;\n", func );
+ FIXME(task,"thunk would be useless for %p, overwriting with nop;nop;\n", func );
lfunc[0]=0x90; /* nop */
lfunc[1]=0x90; /* nop */
}
@@ -888,7 +886,7 @@
void WINAPI FreeProcInstance16( FARPROC16 func )
{
TRACE(task, "(%08lx)\n", (DWORD)func );
- if (!__winelib) TASK_FreeThunk( hCurrentTask, (SEGPTR)func );
+ TASK_FreeThunk( hCurrentTask, (SEGPTR)func );
}
@@ -900,8 +898,6 @@
HANDLE16 handle;
BYTE *thunk = (BYTE *)PTR_SEG_TO_LIN( proc );
- if (__winelib) return 0;
-
/* Return the code segment containing 'proc'. */
/* Not sure if this is really correct (shouldn't matter that much). */
@@ -1015,7 +1011,7 @@
return;
if (!pData->old_ss_sp)
{
- fprintf( stderr, "SwitchStackBack: no previous SwitchStackTo\n" );
+ WARN( task, "No previous SwitchStackTo\n" );
return;
}
TRACE(task, "restoring stack %04x:%04x\n",
diff --git a/memory/environ.c b/memory/environ.c
index 8e4a28a..7fa1024 100644
--- a/memory/environ.c
+++ b/memory/environ.c
@@ -28,8 +28,8 @@
static const char ENV_program_name[] = "C:\\WINDOWS\\SYSTEM\\KRNL386.EXE";
-/* Maximum length of an environment string (including NULL) */
-#define MAX_STR_LEN 128
+/* Maximum length of a Win16 environment string (including NULL) */
+#define MAX_WIN16_LEN 128
/* Extra bytes to reserve at the end of an environment */
#define EXTRA_ENV_SIZE (sizeof(BYTE) + sizeof(WORD) + sizeof(ENV_program_name))
@@ -68,29 +68,23 @@
{
extern char **environ;
LPSTR p, *e;
- int size, len;
+ int size;
/* Compute the total size of the Unix environment */
size = EXTRA_ENV_SIZE;
- for (e = environ; *e; e++)
- {
- len = strlen(*e) + 1;
- size += MIN( len, MAX_STR_LEN );
- }
+ for (e = environ; *e; e++) size += strlen(*e) + 1;
/* Now allocate the environment */
if (!(p = HeapAlloc( SystemHeap, 0, size ))) return FALSE;
pdb->env_db->environ = p;
- pdb->env_db->env_sel = SELECTOR_AllocBlock( p, 0x10000, SEGMENT_DATA,
- FALSE, FALSE );
/* And fill it with the Unix environment */
for (e = environ; *e; e++)
{
- lstrcpyn32A( p, *e, MAX_STR_LEN );
+ strcpy( p, *e );
p += strlen(p) + 1;
}
@@ -110,16 +104,24 @@
BOOL32 ENV_InheritEnvironment( PDB32 *pdb, LPCSTR env )
{
DWORD size;
- LPCSTR p;
+ LPCSTR src;
+ LPSTR dst;
/* FIXME: should lock the parent environment */
if (!env) env = pdb->parent->env_db->environ;
/* Compute the environment size */
- p = env;
- while (*p) p += strlen(p) + 1;
- size = (p - env);
+ src = env;
+ size = EXTRA_ENV_SIZE;
+ while (*src)
+ {
+ int len = strlen(src) + 1;
+ src += len;
+ if ((len > MAX_WIN16_LEN) && (pdb->flags & PDB32_WIN16_PROC))
+ len = MAX_WIN16_LEN;
+ size += len;
+ }
/* Copy the environment */
@@ -129,8 +131,18 @@
pdb->env_db->env_sel = SELECTOR_AllocBlock( pdb->env_db->environ,
0x10000, SEGMENT_DATA,
FALSE, FALSE );
- memcpy( pdb->env_db->environ, env, size );
- FILL_EXTRA_ENV( pdb->env_db->environ + size );
+ src = env;
+ dst = pdb->env_db->environ;
+ while (*src)
+ {
+ if (pdb->flags & PDB32_WIN16_PROC)
+ lstrcpyn32A( dst, src, MAX_WIN16_LEN );
+ else
+ strcpy( dst, src );
+ src += strlen(src) + 1;
+ dst += strlen(dst) + 1;
+ }
+ FILL_EXTRA_ENV( dst );
return TRUE;
}
@@ -314,7 +326,8 @@
}
if (!(new_env = HeapReAlloc( pdb->heap, 0, env, old_size + len )))
goto done;
- SELECTOR_MoveBlock( pdb->env_db->env_sel, new_env );
+ if (pdb->env_db->env_sel)
+ SELECTOR_MoveBlock( pdb->env_db->env_sel, new_env );
p = new_env + (p - env);
if (len > 0) memmove( p + len, p, old_size - (p - new_env) );
diff --git a/memory/global.c b/memory/global.c
index fdb0208..b4b4d05 100644
--- a/memory/global.c
+++ b/memory/global.c
@@ -418,7 +418,7 @@
void *ptr;
if (!VALID_HANDLE(handle)) {
- fprintf(stderr," Invalid handle 0x%04x passed to GlobalFree16!\n",handle);
+ WARN(global,"Invalid handle 0x%04x passed to GlobalFree16!\n",handle);
return 0;
}
ptr = (void *)GET_ARENA_PTR(handle)->base;
@@ -452,7 +452,7 @@
#endif /* CONFIG_IPC */
if (!VALID_HANDLE(handle)) {
- fprintf(stderr,"Invalid handle 0x%04x passed to WIN16_GlobalLock16!\n",handle);
+ WARN(global,"Invalid handle 0x%04x passed to WIN16_GlobalLock16!\n",handle);
return (SEGPTR)0;
}
if (!GET_ARENA_PTR(handle)->base) return (SEGPTR)0;
@@ -501,7 +501,7 @@
) {
GLOBALARENA *pArena = GET_ARENA_PTR(handle);
if (!VALID_HANDLE(handle)) {
- fprintf(stderr,"Invalid handle 0x%04x passed to GlobalUnlock16!\n",handle);
+ WARN(global,"Invalid handle 0x%04x passed to GlobalUnlock16!\n",handle);
return 0;
}
TRACE(global, "%04x\n", handle );
@@ -541,7 +541,7 @@
) {
TRACE(global, "%04x\n", sel );
if (!VALID_HANDLE(sel)) {
- fprintf(stderr,"Invalid handle 0x%04x passed to GlobalHandle16!\n",sel);
+ WARN(global,"Invalid handle 0x%04x passed to GlobalHandle16!\n",sel);
return 0;
}
return MAKELONG( GET_ARENA_PTR(sel)->handle, GlobalHandleToSel(sel) );
@@ -578,7 +578,7 @@
TRACE(global, "%04x\n", handle );
if (!VALID_HANDLE(handle)) {
- fprintf(stderr,"Invalid handle 0x%04x passed to GlobalFlags16!\n",handle);
+ WARN(global,"Invalid handle 0x%04x passed to GlobalFlags16!\n",handle);
return 0;
}
pArena = GET_ARENA_PTR(handle);
@@ -596,7 +596,7 @@
TRACE(global, "%04x\n", handle );
if (handle == (HGLOBAL16)-1) handle = CURRENT_DS;
if (!VALID_HANDLE(handle)) {
- fprintf(stderr,"Invalid handle 0x%04x passed to LockSegment16!\n",handle);
+ WARN(global,"Invalid handle 0x%04x passed to LockSegment16!\n",handle);
return 0;
}
GET_ARENA_PTR(handle)->lockCount++;
@@ -612,7 +612,7 @@
TRACE(global, "%04x\n", handle );
if (handle == (HGLOBAL16)-1) handle = CURRENT_DS;
if (!VALID_HANDLE(handle)) {
- fprintf(stderr,"Invalid handle 0x%04x passed to UnlockSegment16!\n",handle);
+ WARN(global,"Invalid handle 0x%04x passed to UnlockSegment16!\n",handle);
return;
}
GET_ARENA_PTR(handle)->lockCount--;
@@ -759,7 +759,7 @@
{
TRACE(global, "%04x\n", handle );
if (!VALID_HANDLE(handle)) {
- fprintf(stderr,"Invalid handle 0x%04x passed to GlobalPageLock!\n",handle);
+ WARN(global,"Invalid handle 0x%04x passed to GlobalPageLock!\n",handle);
return 0;
}
return ++(GET_ARENA_PTR(handle)->pageLockCount);
@@ -773,7 +773,7 @@
{
TRACE(global, "%04x\n", handle );
if (!VALID_HANDLE(handle)) {
- fprintf(stderr,"Invalid handle 0x%04x passed to GlobalPageUnlock!\n",handle);
+ WARN(global,"Invalid handle 0x%04x passed to GlobalPageUnlock!\n",handle);
return 0;
}
return --(GET_ARENA_PTR(handle)->pageLockCount);
@@ -787,7 +787,7 @@
{
TRACE(global, "%04x\n", handle );
if (!VALID_HANDLE(handle)) {
- fprintf(stderr,"Invalid handle 0x%04x passed to GlobalFix16!\n",handle);
+ WARN(global,"Invalid handle 0x%04x passed to GlobalFix16!\n",handle);
return;
}
GET_ARENA_PTR(handle)->lockCount++;
@@ -801,7 +801,7 @@
{
TRACE(global, "%04x\n", handle );
if (!VALID_HANDLE(handle)) {
- fprintf(stderr,"Invalid handle 0x%04x passed to GlobalUnfix16!\n",handle);
+ WARN(global,"Invalid handle 0x%04x passed to GlobalUnfix16!\n",handle);
return;
}
GET_ARENA_PTR(handle)->lockCount--;
@@ -814,7 +814,7 @@
void WINAPI FarSetOwner( HGLOBAL16 handle, HANDLE16 hOwner )
{
if (!VALID_HANDLE(handle)) {
- fprintf(stderr,"Invalid handle 0x%04x passed to FarSetOwner!\n",handle);
+ WARN(global,"Invalid handle 0x%04x passed to FarSetOwner!\n",handle);
return;
}
GET_ARENA_PTR(handle)->hOwner = hOwner;
@@ -827,7 +827,7 @@
HANDLE16 WINAPI FarGetOwner( HGLOBAL16 handle )
{
if (!VALID_HANDLE(handle)) {
- fprintf(stderr,"Invalid handle 0x%04x passed to FarGetOwner!\n",handle);
+ WARN(global,"Invalid handle 0x%04x passed to FarGetOwner!\n",handle);
return 0;
}
return GET_ARENA_PTR(handle)->hOwner;
@@ -845,12 +845,12 @@
if (is_dde_handle(handle)) return DDE_GlobalHandleToSel(handle);
#endif
if (!VALID_HANDLE(handle)) {
- fprintf(stderr,"Invalid handle 0x%04x passed to GlobalHandleToSel!\n",handle);
+ WARN(global,"Invalid handle 0x%04x passed to GlobalHandleToSel!\n",handle);
return 0;
}
if (!(handle & 7))
{
- fprintf( stderr, "Program attempted invalid selector conversion\n" );
+ WARN(global, "Program attempted invalid selector conversion\n" );
return handle - 1;
}
return handle | 7;
diff --git a/memory/heap.c b/memory/heap.c
index 2c2556d..b604f7c 100644
--- a/memory/heap.c
+++ b/memory/heap.c
@@ -188,7 +188,7 @@
HEAP *heapPtr = (HEAP *)heap;
if (!heapPtr || (heapPtr->magic != HEAP_MAGIC))
{
- fprintf( stderr, "Invalid heap %08x!\n", heap );
+ WARN(heap, "Invalid heap %08x!\n", heap );
SetLastError( ERROR_INVALID_HANDLE );
return NULL;
}
@@ -258,7 +258,7 @@
size - subheap->commitSize, MEM_COMMIT,
PAGE_EXECUTE_READWRITE))
{
- fprintf( stderr, "HEAP_Commit: could not commit %08lx bytes at %08lx for heap %08lx\n",
+ WARN(heap, "Could not commit %08lx bytes at %08lx for heap %08lx\n",
size - subheap->commitSize,
(DWORD)((char *)subheap + subheap->commitSize),
(DWORD)subheap->heap );
@@ -282,7 +282,7 @@
if (!VirtualFree( (char *)subheap + size,
subheap->commitSize - size, MEM_DECOMMIT ))
{
- fprintf( stderr, "HEAP_Decommit: could not decommit %08lx bytes at %08lx for heap %08lx\n",
+ WARN(heap, "Could not decommit %08lx bytes at %08lx for heap %08lx\n",
subheap->commitSize - size,
(DWORD)((char *)subheap + size),
(DWORD)subheap->heap );
@@ -458,13 +458,13 @@
if (!(subheap = VirtualAlloc( NULL, totalSize,
MEM_RESERVE, PAGE_EXECUTE_READWRITE )))
{
- fprintf( stderr, "HEAP_CreateSubHeap: could not VirtualAlloc %08lx bytes\n",
+ WARN(heap, "Could not VirtualAlloc %08lx bytes\n",
totalSize );
return NULL;
}
if (!VirtualAlloc(subheap, commitSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE))
{
- fprintf( stderr, "HEAP_CreateSubHeap: could not commit %08lx bytes for sub-heap %08lx\n",
+ WARN(heap, "Could not commit %08lx bytes for sub-heap %08lx\n",
commitSize, (DWORD)subheap );
VirtualFree( subheap, 0, MEM_RELEASE );
return NULL;
@@ -479,7 +479,7 @@
(flags & HEAP_WINE_CODESEG) != 0, FALSE );
if (!selector)
{
- fprintf( stderr, "HEAP_CreateSubHeap: could not allocate selector\n" );
+ WARN(heap, "Could not allocate selector\n" );
VirtualFree( subheap, 0, MEM_RELEASE );
return NULL;
}
@@ -534,7 +534,7 @@
if (!(heap->flags & HEAP_GROWABLE))
{
- fprintf( stderr, "HEAP_FindFreeBlock: Not enough space in heap %08lx for %08lx bytes\n",
+ WARN(heap, "Not enough space in heap %08lx for %08lx bytes\n",
(DWORD)heap, size );
return NULL;
}
@@ -586,7 +586,7 @@
/* Check magic number */
if (pArena->magic != ARENA_FREE_MAGIC)
{
- fprintf( stderr, "Heap %08lx: invalid free arena magic for %08lx\n",
+ WARN(heap, "Heap %08lx: invalid free arena magic for %08lx\n",
(DWORD)subheap->heap, (DWORD)pArena );
return FALSE;
}
@@ -594,20 +594,20 @@
if (!(pArena->size & ARENA_FLAG_FREE) ||
(pArena->size & ARENA_FLAG_PREV_FREE))
{
- fprintf( stderr, "Heap %08lx: bad flags %lx for free arena %08lx\n",
+ WARN(heap, "Heap %08lx: bad flags %lx for free arena %08lx\n",
(DWORD)subheap->heap, pArena->size & ~ARENA_SIZE_MASK, (DWORD)pArena );
}
/* Check arena size */
if ((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK) > heapEnd)
{
- fprintf( stderr, "Heap %08lx: bad size %08lx for free arena %08lx\n",
+ WARN(heap, "Heap %08lx: bad size %08lx for free arena %08lx\n",
(DWORD)subheap->heap, (DWORD)pArena->size & ARENA_SIZE_MASK, (DWORD)pArena );
return FALSE;
}
/* Check that next pointer is valid */
if (!HEAP_IsValidArenaPtr( subheap->heap, pArena->next ))
{
- fprintf( stderr, "Heap %08lx: bad next ptr %08lx for arena %08lx\n",
+ WARN(heap, "Heap %08lx: bad next ptr %08lx for arena %08lx\n",
(DWORD)subheap->heap, (DWORD)pArena->next, (DWORD)pArena );
return FALSE;
}
@@ -615,14 +615,14 @@
if (!(pArena->next->size & ARENA_FLAG_FREE) ||
(pArena->next->magic != ARENA_FREE_MAGIC))
{
- fprintf( stderr, "Heap %08lx: next arena %08lx invalid for %08lx\n",
+ WARN(heap, "Heap %08lx: next arena %08lx invalid for %08lx\n",
(DWORD)subheap->heap, (DWORD)pArena->next, (DWORD)pArena );
return FALSE;
}
/* Check that prev pointer is valid */
if (!HEAP_IsValidArenaPtr( subheap->heap, pArena->prev ))
{
- fprintf( stderr, "Heap %08lx: bad prev ptr %08lx for arena %08lx\n",
+ WARN(heap, "Heap %08lx: bad prev ptr %08lx for arena %08lx\n",
(DWORD)subheap->heap, (DWORD)pArena->prev, (DWORD)pArena );
return FALSE;
}
@@ -630,7 +630,7 @@
if (!(pArena->prev->size & ARENA_FLAG_FREE) ||
(pArena->prev->magic != ARENA_FREE_MAGIC))
{
- fprintf( stderr, "Heap %08lx: prev arena %08lx invalid for %08lx\n",
+ WARN(heap, "Heap %08lx: prev arena %08lx invalid for %08lx\n",
(DWORD)subheap->heap, (DWORD)pArena->prev, (DWORD)pArena );
return FALSE;
}
@@ -640,7 +640,7 @@
if (!(*(DWORD *)((char *)(pArena + 1) +
(pArena->size & ARENA_SIZE_MASK)) & ARENA_FLAG_PREV_FREE))
{
- fprintf( stderr, "Heap %08lx: free arena %08lx next block has no PREV_FREE flag\n",
+ WARN(heap, "Heap %08lx: free arena %08lx next block has no PREV_FREE flag\n",
(DWORD)subheap->heap, (DWORD)pArena );
return FALSE;
}
@@ -648,7 +648,7 @@
if (*((ARENA_FREE **)((char *)(pArena + 1) +
(pArena->size & ARENA_SIZE_MASK)) - 1) != pArena)
{
- fprintf( stderr, "Heap %08lx: arena %08lx has wrong back ptr %08lx\n",
+ WARN(heap, "Heap %08lx: arena %08lx has wrong back ptr %08lx\n",
(DWORD)subheap->heap, (DWORD)pArena,
*((DWORD *)((char *)(pArena+1)+ (pArena->size & ARENA_SIZE_MASK)) - 1));
return FALSE;
@@ -668,20 +668,20 @@
/* Check magic number */
if (pArena->magic != ARENA_INUSE_MAGIC)
{
- fprintf( stderr, "Heap %08lx: invalid in-use arena magic for %08lx\n",
+ WARN(heap, "Heap %08lx: invalid in-use arena magic for %08lx\n",
(DWORD)subheap->heap, (DWORD)pArena );
return FALSE;
}
/* Check size flags */
if (pArena->size & ARENA_FLAG_FREE)
{
- fprintf( stderr, "Heap %08lx: bad flags %lx for in-use arena %08lx\n",
+ WARN(heap, "Heap %08lx: bad flags %lx for in-use arena %08lx\n",
(DWORD)subheap->heap, pArena->size & ~ARENA_SIZE_MASK, (DWORD)pArena );
}
/* Check arena size */
if ((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK) > heapEnd)
{
- fprintf( stderr, "Heap %08lx: bad size %08lx for in-use arena %08lx\n",
+ WARN(heap, "Heap %08lx: bad size %08lx for in-use arena %08lx\n",
(DWORD)subheap->heap, (DWORD)pArena->size & ARENA_SIZE_MASK, (DWORD)pArena );
return FALSE;
}
@@ -689,7 +689,7 @@
if (((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK) < heapEnd) &&
(*(DWORD *)((char *)(pArena + 1) + (pArena->size & ARENA_SIZE_MASK)) & ARENA_FLAG_PREV_FREE))
{
- fprintf( stderr, "Heap %08lx: in-use arena %08lx next block has PREV_FREE flag\n",
+ WARN(heap, "Heap %08lx: in-use arena %08lx next block has PREV_FREE flag\n",
(DWORD)subheap->heap, (DWORD)pArena );
return FALSE;
}
@@ -700,7 +700,7 @@
/* Check prev pointer */
if (!HEAP_IsValidArenaPtr( subheap->heap, pPrev ))
{
- fprintf(stderr, "Heap %08lx: bad back ptr %08lx for arena %08lx\n",
+ WARN(heap, "Heap %08lx: bad back ptr %08lx for arena %08lx\n",
(DWORD)subheap->heap, (DWORD)pPrev, (DWORD)pArena );
return FALSE;
}
@@ -708,14 +708,14 @@
if (!(pPrev->size & ARENA_FLAG_FREE) ||
(pPrev->magic != ARENA_FREE_MAGIC))
{
- fprintf( stderr, "Heap %08lx: prev arena %08lx invalid for in-use %08lx\n",
+ WARN(heap, "Heap %08lx: prev arena %08lx invalid for in-use %08lx\n",
(DWORD)subheap->heap, (DWORD)pPrev, (DWORD)pArena );
return FALSE;
}
/* Check that prev arena is really the previous block */
if ((char *)(pPrev + 1) + (pPrev->size & ARENA_SIZE_MASK) != (char *)pArena)
{
- fprintf( stderr, "Heap %08lx: prev arena %08lx is not prev for in-use %08lx\n",
+ WARN(heap, "Heap %08lx: prev arena %08lx is not prev for in-use %08lx\n",
(DWORD)subheap->heap, (DWORD)pPrev, (DWORD)pArena );
return FALSE;
}
@@ -775,7 +775,7 @@
flags |= heapPtr->flags;
if (!(flags & HEAP_WINE_SEGPTR))
{
- fprintf( stderr, "HEAP_GetSegptr: heap %08x is not a SEGPTR heap\n",
+ WARN(heap, "Heap %08x is not a SEGPTR heap\n",
heap );
return 0;
}
@@ -785,7 +785,7 @@
if (!(subheap = HEAP_FindSubHeap( heapPtr, ptr )))
{
- fprintf( stderr, "HEAP_GetSegptr: %p is not inside heap %08x\n",
+ WARN(heap, "%p is not inside heap %08x\n",
ptr, heap );
if (!(flags & HEAP_NO_SERIALIZE)) HeapUnlock( heap );
return 0;
@@ -1229,7 +1229,7 @@
if (!heapPtr || (heapPtr->magic != HEAP_MAGIC))
{
- fprintf( stderr, "Invalid heap %08x!\n", heap );
+ WARN(heap, "Invalid heap %08x!\n", heap );
return FALSE;
}
@@ -1240,7 +1240,7 @@
((char *)block < (char *)subheap + subheap->headerSize
+ sizeof(ARENA_INUSE)))
{
- fprintf( stderr, "Heap %08lx: block %08lx is not inside heap\n",
+ WARN(heap, "Heap %08lx: block %08lx is not inside heap\n",
(DWORD)heap, (DWORD)block );
return FALSE;
}
@@ -1284,7 +1284,7 @@
HANDLE32 heap, /* [in] Handle to heap to enumerate */
LPPROCESS_HEAP_ENTRY *entry /* [out] Pointer to structure of enumeration info */
) {
- fprintf( stderr, "HeapWalk(%08x): not implemented\n", heap );
+ FIXME(heap, "(%08x): stub.\n", heap );
return FALSE;
}
@@ -1299,7 +1299,7 @@
LPVOID p = HeapAlloc( heap, flags, size );
if (!p)
{
- fprintf( stderr, "Virtual memory exhausted.\n" );
+ MSG("Virtual memory exhausted.\n" );
exit(1);
}
return p;
diff --git a/memory/ldt.c b/memory/ldt.c
index 64b8dd6..4ebd231 100644
--- a/memory/ldt.c
+++ b/memory/ldt.c
@@ -182,7 +182,7 @@
{
if (ldt_info.base_addr >= 0xc0000000)
{
- fprintf( stderr, "LDT_SetEntry: invalid base addr %08lx\n",
+ WARN(ldt, "Invalid base addr %08lx\n",
ldt_info.base_addr );
return -1;
}
@@ -212,8 +212,7 @@
if (ret < 0)
{
perror("i386_set_ldt");
- fprintf(stderr,
- "Did you reconfigure the kernel with \"options USER_LDT\"?\n");
+ MSG("Did you reconfigure the kernel with \"options USER_LDT\"?\n");
exit(1);
}
}
@@ -287,7 +286,7 @@
flags[1] = (ldt_flags_copy[i] & LDT_FLAGS_READONLY) ? '-' : 'w';
flags[2] = '-';
}
- fprintf(stderr,"%04x: sel=%04x base=%08lx limit=%08lx %d-bit %c%c%c\n",
+ TRACE(ldt,"%04x: sel=%04x base=%08lx limit=%08lx %d-bit %c%c%c\n",
i, ENTRY_TO_SELECTOR(i),
ldt_copy[i].base, ldt_copy[i].limit,
ldt_flags_copy[i] & LDT_FLAGS_32BIT ? 32 : 16,
diff --git a/memory/local.c b/memory/local.c
index 8f5213d..f20cda6 100644
--- a/memory/local.c
+++ b/memory/local.c
@@ -334,7 +334,7 @@
/* cleared before use, so we can test for double initialization. */
if (LOCAL_GetHeap(selector))
{
- fprintf( stderr, "LocalInit: Heap %04x initialized twice.\n", selector);
+ WARN(local, "Heap %04x initialized twice.\n", selector);
LOCAL_PrintHeap(selector);
}
}
@@ -342,7 +342,7 @@
if (start == 0) {
/* Check if the segment is the DGROUP of a module */
- if ((pModule = MODULE_GetPtr( selector )))
+ if ((pModule = MODULE_GetPtr16( selector )))
{
SEGTABLEENTRY *pSeg = NE_SEG_TABLE( pModule ) + pModule->dgroup - 1;
if (pModule->dgroup && (pSeg->selector == selector)) {
@@ -441,7 +441,7 @@
ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
pHeapInfo = LOCAL_GetHeap( ds );
if (pHeapInfo == NULL) {
- fprintf( stderr, "Local_GrowHeap: heap not found\n" );
+ WARN(local, "Heap not found\n" );
return;
}
end = GlobalSize16( hseg );
@@ -496,7 +496,7 @@
if ((pArena->prev & 3) == LOCAL_ARENA_FREE)
{
/* shouldn't happen */
- fprintf( stderr, "LocalFreeArena: Trying to free block %04x twice!\n",
+ WARN(local, "Trying to free block %04x twice!\n",
arena );
LOCAL_PrintHeap( ds );
return arena;
@@ -619,7 +619,7 @@
if (!(pInfo = LOCAL_GetHeap( ds )))
{
- fprintf( stderr, "LOCAL_GetFreeSpace: Local heap not found\n" );
+ WARN(local, "Local heap not found\n" );
LOCAL_PrintHeap(ds);
return 0;
}
@@ -654,7 +654,7 @@
if (!(pInfo = LOCAL_GetHeap( ds )))
{
- fprintf( stderr, "Local_Compact: Local heap not found\n" );
+ WARN(local, "Local heap not found\n" );
LOCAL_PrintHeap(ds);
return 0;
}
@@ -773,7 +773,7 @@
if (!(pInfo = LOCAL_GetHeap( ds )))
{
- fprintf( stderr, "Local_FindFreeBlock: Local heap not found\n" );
+ WARN(local, "Local heap not found\n" );
LOCAL_PrintHeap(ds);
return 0;
}
@@ -805,7 +805,7 @@
if (!(pInfo = LOCAL_GetHeap( ds )))
{
- fprintf( stderr, "Local_GetBlock: Local heap not found\n");
+ WARN(local, "Local heap not found\n");
LOCAL_PrintHeap(ds);
return 0;
}
@@ -868,7 +868,7 @@
TRACE(local, "Local_NewHTable\n" );
if (!(pInfo = LOCAL_GetHeap( ds )))
{
- fprintf( stderr, "Local heap not found\n");
+ WARN(local, "Local heap not found\n");
LOCAL_PrintHeap(ds);
return FALSE;
}
@@ -877,9 +877,9 @@
+ 2 * sizeof(WORD), LMEM_FIXED )))
return FALSE;
if (!(ptr = PTR_SEG_OFF_TO_LIN( ds, 0 )))
- fprintf(stderr, "LOCAL_NewHTable: ptr == NULL after GetBlock.\n");
+ WARN(local, "ptr == NULL after GetBlock.\n");
if (!(pInfo = LOCAL_GetHeap( ds )))
- fprintf(stderr,"LOCAL_NewHTable: pInfo == NULL after GetBlock.\n");
+ WARN(local,"pInfo == NULL after GetBlock.\n");
/* Fill the entry table */
@@ -907,7 +907,7 @@
if (!(pInfo = LOCAL_GetHeap( ds )))
{
- fprintf( stderr, "LOCAL_GetNewHandleEntry: Local heap not found\n");
+ WARN(local, "Local heap not found\n");
LOCAL_PrintHeap(ds);
return 0;
}
@@ -970,7 +970,7 @@
}
if (!*pTable)
{
- fprintf(stderr, "LOCAL_FreeHandleEntry: invalid entry %04x\n", handle);
+ WARN(local, "Invalid entry %04x\n", handle);
LOCAL_PrintHeap( ds );
return;
}
@@ -1007,7 +1007,7 @@
TRACE(local, "%04x ds=%04x\n", handle, ds );
- if (!handle) { fprintf( stderr, "LOCAL_Free: handle is 0.\n" ); return 0; }
+ if (!handle) { WARN(local, "Handle is 0.\n" ); return 0; }
if (HANDLE_FIXED( handle ))
{
if (!LOCAL_FreeArena( ds, ARENA_HEADER( handle ) )) return 0; /* OK */
@@ -1057,7 +1057,7 @@
hmem = 0;
if (!(handle = LOCAL_GetNewHandleEntry( ds )))
{
- fprintf( stderr, "LocalAlloc: couldn't get handle\n");
+ WARN(local, "Couldn't get handle.\n");
if(hmem)
LOCAL_FreeArena( ds, ARENA_HEADER(hmem) );
return 0;
@@ -1120,8 +1120,7 @@
{
HLOCAL16 hl;
if(pEntry->addr)
- fprintf(stderr,
- "LOCAL_ReAlloc: Dicarded block has non-zero addr.\n");
+ WARN(local,"Dicarded block has non-zero addr.\n");
TRACE(local, "ReAllocating discarded block\n");
if(size <= 4) size = 5;
if (!(hl = LOCAL_GetBlock( ds, size + sizeof(HLOCAL16), flags)))
@@ -1136,12 +1135,12 @@
}
if (((blockhandle = pEntry->addr) & 3) != 2)
{
- fprintf( stderr, "Local_ReAlloc(%04x,%04x): invalid handle\n",
+ WARN(local, "(%04x,%04x): invalid handle\n",
ds, handle );
return 0;
}
if(*((HLOCAL16 *)(ptr + blockhandle) - 1) != handle) {
- fprintf(stderr, "Local_ReAlloc: Back ptr to handle is invalid\n");
+ WARN(local, "Back ptr to handle is invalid\n");
return 0;
}
}
@@ -1261,7 +1260,7 @@
{
if (!(hmem = LOCAL_GetBlock( ds, oldsize, flags )))
{
- fprintf( stderr, "LocalRealloc: can't restore saved block\n" );
+ WARN(local, "Can't restore saved block\n" );
HeapFree( GetProcessHeap(), 0, buffer );
return 0;
}
@@ -1283,7 +1282,7 @@
pEntry->addr = hmem + sizeof(HLOCAL16);
/* Back ptr should still be correct */
if(*(HLOCAL16 *)(ptr + hmem) != handle)
- fprintf(stderr, "Local_ReAlloc: back ptr is invalid.\n");
+ WARN(local, "back ptr is invalid.\n");
hmem = handle;
}
if (size == oldsize) hmem = 0; /* Realloc failed */
@@ -1423,7 +1422,7 @@
if (!(pInfo = LOCAL_GetHeap( ds )))
{
- fprintf( stderr, "LOCAL_Handle(%04x): Local heap not found\n", ds );
+ WARN(local, "(%04x): Local heap not found\n", ds );
LOCAL_PrintHeap( ds );
return 0;
}
@@ -1456,7 +1455,7 @@
if (!(pInfo = LOCAL_GetHeap( ds )))
{
- fprintf( stderr, "LOCAL_Handle(%04x): Local heap not found\n", ds );
+ WARN(local, "(%04x): Local heap not found\n", ds );
LOCAL_PrintHeap( ds );
return 0;
}
@@ -1602,7 +1601,7 @@
NE_MODULE *pModule;
WORD ds;
- if (!(pModule = MODULE_GetPtr( module ))) return 0;
+ if (!(pModule = MODULE_GetPtr16( module ))) return 0;
ds = (NE_SEG_TABLE( pModule ) + pModule->dgroup - 1)->selector;
return MAKELONG( LOCAL_CountFree( ds ), LOCAL_HeapSize( ds ) );
}
diff --git a/memory/selector.c b/memory/selector.c
index 0fbb9bb..218ee71 100644
--- a/memory/selector.c
+++ b/memory/selector.c
@@ -13,9 +13,6 @@
#include "debug.h"
-#define FIRST_LDT_ENTRY_TO_ALLOC 17
-
-
/***********************************************************************
* AllocSelectorArray (KERNEL.206)
*/
@@ -179,7 +176,7 @@
GET_FS(fs);
if ((fs >= sel) && (fs < nextsel))
{
- fprintf( stderr, "SELECTOR_FreeBlock: freeing %%fs selector (%04x), not good.\n", fs );
+ WARN(selector, "Freeing %%fs selector (%04x), not good.\n", fs );
SET_FS( 0 );
}
GET_GS(gs);
@@ -788,6 +785,5 @@
*/
SEGPTR WINAPI UTLinearToSelectorOffset(LPVOID lptr)
{
- fprintf( stderr, "UTLinearToSelectorOffset(%p): stub\n", lptr );
return (SEGPTR)lptr;
}
diff --git a/memory/virtual.c b/memory/virtual.c
index fac4ee7..d2759e6 100644
--- a/memory/virtual.c
+++ b/memory/virtual.c
@@ -84,7 +84,7 @@
static FILE_VIEW *VIRTUAL_FirstView;
-#ifdef __i386___
+#ifdef __i386__
/* These are always the same on an i386, and it will be faster this way */
# define page_mask 0xfff
# define page_shift 12
@@ -552,7 +552,7 @@
/* FIXME: MEM_TOP_DOWN allocates the largest possible address.
* Is there _ANY_ way to do it with UNIX mmap()?
*/
- fprintf(stderr,"VirtualAlloc:MEM_TOP_DOWN ignored\n");
+ WARN(virtual,"MEM_TOP_DOWN ignored\n");
type &= ~MEM_TOP_DOWN;
}
/* Compute the protection flags */
@@ -795,7 +795,7 @@
if (pdb == PROCESS_Current())
ret = VirtualProtect( addr, size, new_prot, old_prot );
else
- fprintf(stderr,"Unsupported: VirtualProtectEx on other process\n");
+ ERR(virtual,"Unsupported on other process\n");
K32OBJ_DecCount( &pdb->header );
}
return ret;
@@ -892,7 +892,7 @@
if (pdb == PROCESS_Current())
ret = VirtualQuery( addr, info, len );
else
- fprintf(stderr,"Unsupported: VirtualQueryEx on other process\n");
+ ERR(virtual,"Unsupported on other process\n");
K32OBJ_DecCount( &pdb->header );
}
return ret;
@@ -1288,7 +1288,7 @@
return NULL;
if (mapping->size_high || offset_high)
- fprintf( stderr, "MapViewOfFileEx: offsets larger than 4Gb not supported\n");
+ ERR(virtual, "Offsets larger than 4Gb not supported\n");
if ((offset_low >= mapping->size_low) ||
(count > mapping->size_low - offset_low))
diff --git a/misc/Makefile.in b/misc/Makefile.in
index 319264c..ee7f5c5 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -19,7 +19,6 @@
lstr.c \
lzexpand.c \
main.c \
- mpr.c \
network.c \
ntdll.c \
port.c \
diff --git a/misc/aspi.c b/misc/aspi.c
index 8be4540..bf38b29 100644
--- a/misc/aspi.c
+++ b/misc/aspi.c
@@ -307,7 +307,7 @@
if (status < 0 || status != in_len) {
int myerror = errno;
- fprintf(stderr, "not enough bytes written to scsi device bytes=%d .. %d\n", in_len, status);
+ WARN(aspi, "Not enough bytes written to scsi device bytes=%d .. %d\n", in_len, status);
if (status < 0) {
if (myerror == ENOMEM) {
fprintf(stderr, "ASPI: Linux generic scsi driver\n You probably need to re-compile your kernel with a larger SG_BIG_BUFF value (sg.h)\n Suggest 130560\n");
diff --git a/misc/callback.c b/misc/callback.c
index 84354d5..2dcf883 100644
--- a/misc/callback.c
+++ b/misc/callback.c
@@ -6,6 +6,7 @@
#include <assert.h>
#include <stdio.h>
+#include "debug.h"
#include "windows.h"
#include "callback.h"
#include "task.h"
@@ -27,7 +28,7 @@
*/
static LONG WINAPI CALLBACK_CallRegisterProc( CONTEXT *context, INT32 offset)
{
- fprintf( stderr, "Cannot call a register proc in Winelib\n" );
+ ERR(relay, "Cannot call a register proc in Winelib\n" );
assert( FALSE );
return 0;
}
@@ -208,7 +209,7 @@
);
break;
default:
- fprintf(stderr,"CALLBACK_CallWOWCallback16Ex(), %ld arguments not supported.!n",cbArgs);
+ WARN(relay,"(%ld) arguments not supported.\n",cbArgs);
if (dwFlags == WCB16_CDECL)
HeapFree(GetProcessHeap(),0,args);
return FALSE;
diff --git a/misc/comm.c b/misc/comm.c
index 169d733..333adb9 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -77,10 +77,10 @@
}
stat(temp, &st);
if (!S_ISCHR(st.st_mode))
- fprintf(stderr,"comm: can't use `%s' as %s !\n", temp, option);
+ WARN(comm,"Can't use `%s' as %s !\n", temp, option);
else
if ((COM[x].devicename = malloc(strlen(temp)+1)) == NULL)
- fprintf(stderr,"comm: can't malloc for device info!\n");
+ WARN(comm,"Can't malloc for device info!\n");
else {
COM[x].fd = 0;
strcpy(COM[x].devicename, temp);
@@ -99,10 +99,10 @@
else {
stat(temp, &st);
if (!S_ISCHR(st.st_mode))
- fprintf(stderr,"comm: can't use `%s' as %s !\n", temp, option);
+ WARN(comm,"Can't use `%s' as %s !\n", temp, option);
else
if ((LPT[x].devicename = malloc(strlen(temp)+1)) == NULL)
- fprintf(stderr,"comm: can't malloc for device info!\n");
+ WARN(comm,"Can't malloc for device info!\n");
else {
LPT[x].fd = 0;
strcpy(LPT[x].devicename, temp);
@@ -177,7 +177,7 @@
if (port-- == 0) {
- fprintf(stderr, "comm: BUG ! COM0 can't exists!.\n");
+ ERR(comm, "BUG ! COM0 can't exists!.\n");
commerror = IE_BADID;
}
@@ -229,7 +229,7 @@
lpdcb->Parity = ODDPARITY;
break;
default:
- fprintf(stderr,"comm: unknown parity `%c'!\n", *ptr);
+ WARN(comm,"Unknown parity `%c'!\n", *ptr);
return -1;
}
@@ -247,7 +247,7 @@
lpdcb->StopBits = TWOSTOPBITS;
break;
default:
- fprintf(stderr,"comm: unknown # of stopbits `%c'!\n", *ptr);
+ WARN(comm,"Unknown # of stopbits `%c'!\n", *ptr);
return -1;
}
}
@@ -278,7 +278,7 @@
if (!lstrncmpi32A(device,"COM",3)) {
port=device[3]-'0';
if (port--==0) {
- fprintf(stderr,"comm:BUG! COM0 can't exists!.\n");
+ ERR(comm,"BUG! COM0 can't exists!.\n");
return FALSE;
}
if (!ValidCOMPort(port))
@@ -346,19 +346,19 @@
flag=0;
if (!strncmp("baud=",ptr,5)) {
if (!sscanf(ptr+5,"%ld",&x))
- fprintf(stderr,"BuildCommDCB32A:Couldn't parse %s\n",ptr);
+ WARN(comm,"Couldn't parse %s\n",ptr);
lpdcb->BaudRate = x;
flag=1;
}
if (!strncmp("stop=",ptr,5)) {
if (!sscanf(ptr+5,"%ld",&x))
- fprintf(stderr,"BuildCommDCB32A:Couldn't parse %s\n",ptr);
+ WARN(comm,"Couldn't parse %s\n",ptr);
lpdcb->StopBits = x;
flag=1;
}
if (!strncmp("data=",ptr,5)) {
if (!sscanf(ptr+5,"%ld",&x))
- fprintf(stderr,"BuildCommDCB32A:Couldn't parse %s\n",ptr);
+ WARN(comm,"Couldn't parse %s\n",ptr);
lpdcb->ByteSize = x;
flag=1;
}
@@ -382,7 +382,7 @@
flag=1;
}
if (!flag)
- fprintf(stderr,"BuildCommDCB32A: Unhandled specifier '%s', please report.\n",ptr);
+ ERR(comm,"Unhandled specifier '%s', please report.\n",ptr);
ptr=strtok(NULL," ");
}
if (lpdcb->BaudRate==110)
@@ -428,7 +428,7 @@
port = device[3] - '0';
if (port-- == 0) {
- fprintf(stderr, "comm: BUG ! COM0 doesn't exist !\n");
+ ERR(comm, "BUG ! COM0 doesn't exist !\n");
commerror = IE_BADID;
}
@@ -636,8 +636,7 @@
break;
default:
- fprintf(stderr,
- "EscapeCommFunction fd: %d, unknown function: %d\n",
+ WARN(comm,"(fd=%d,nFunction=%d): Unknown function\n",
fd, nFunction);
break;
}
@@ -709,8 +708,7 @@
ptr->suspended = 0;
break;
default:
- fprintf(stderr,
- "EscapeCommFunction32 fd: %d, unknown function: %d\n",
+ WARN(comm,"(fd=%d,nFunction=%d): Unknown function\n",
fd, nFunction);
break;
}
@@ -737,8 +735,7 @@
break;
case 1: queue = TCIFLUSH;
break;
- default:fprintf(stderr,
- "FlushComm fd: %d, UNKNOWN queue: %d\n",
+ default:WARN(comm,"(fd=%d,fnQueue=%d):Unknown queue\n",
fd, fnQueue);
return -1;
}
@@ -774,11 +771,11 @@
lpStat->status = 0;
rc = ioctl(fd, TIOCOUTQ, &cnt);
- if (rc) fprintf(stderr, "Error !\n");
+ if (rc) WARN(comm, "Error !\n");
lpStat->cbOutQue = cnt;
rc = ioctl(fd, TIOCINQ, &cnt);
- if (rc) fprintf(stderr, "Error !\n");
+ if (rc) WARN(comm, "Error !\n");
lpStat->cbInQue = cnt;
TRACE(comm, "fd %d, error %d, lpStat %d %d %d\n",
@@ -1727,9 +1724,7 @@
*/
BOOL32 WINAPI GetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts)
{
- fprintf(stderr,"GetCommTimeouts(%x,%p), empty stub.\n",
- fd,lptimeouts
- );
+ FIXME(comm,"(%x,%p):stub.\n",fd,lptimeouts);
return TRUE;
}
@@ -1737,9 +1732,7 @@
* SetCommTimeouts (KERNEL32.453)
*/
BOOL32 WINAPI SetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) {
- fprintf(stderr,"SetCommTimeouts(%x,%p), empty stub.\n",
- fd,lptimeouts
- );
+ FIXME(comm,"(%x,%p):stub.\n",fd,lptimeouts);
return TRUE;
}
@@ -1749,7 +1742,7 @@
BOOL16 WINAPI EnableCommNotification( INT16 fd, HWND16 hwnd,
INT16 cbWriteNotify, INT16 cbOutQueue )
{
- fprintf(stderr, "EnableCommNotification(%d, %x, %d, %d), empty stub.\n", fd, hwnd, cbWriteNotify, cbOutQueue);
+ FIXME(comm, "(%d, %x, %d, %d):stub.\n", fd, hwnd, cbWriteNotify, cbOutQueue);
return TRUE;
}
diff --git a/misc/commdlg.c b/misc/commdlg.c
index e7122a6..d8ec825 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -18,6 +18,8 @@
#include "resource.h"
#include "drive.h"
#include "debug.h"
+#include "font.h"
+#include "winproc.h"
static DWORD CommDlgLastError = 0;
@@ -45,7 +47,7 @@
if (hFolder == 0 || hFolder2 == 0 || hFloppy == 0 ||
hHDisk == 0 || hCDRom == 0)
{
- fprintf(stderr, "FileDlg_Init // Error loading bitmaps !");
+ WARN(commdlg, "Error loading bitmaps !\nprin");
return FALSE;
}
initialized = TRUE;
@@ -611,7 +613,7 @@
if (!FILEDLG_ScanDir(hWnd, tmpstr)) {
*tmpstr = 0;
if (!FILEDLG_ScanDir(hWnd, tmpstr))
- fprintf(stderr, "FileDlg: couldn't read initial directory %s!\n",tmpstr);
+ WARN(commdlg, "Couldn't read initial directory %s!\n",tmpstr);
}
/* select current drive in combo 2, omit missing drives */
for(i=0, n=-1; i<=DRIVE_GetCurrentDrive(); i++)
@@ -630,7 +632,6 @@
/***********************************************************************
* FILEDLG_WMCommand [internal]
*/
-BOOL32 in_lst1=FALSE;
BOOL32 in_update=FALSE;
static LRESULT FILEDLG_WMCommand(HWND16 hWnd, WPARAM16 wParam, LPARAM lParam)
@@ -652,10 +653,7 @@
case lst1: /* file list */
FILEDLG_StripEditControl(hWnd);
if (notification == LBN_DBLCLK)
- {
- in_lst1=TRUE;
goto almost_ok;
- }
lRet = SendDlgItemMessage16(hWnd, lst1, LB_GETCURSEL16, 0, 0);
if (lRet == LB_ERR) return TRUE;
if ((pstr = SEGPTR_ALLOC(512)))
@@ -759,12 +757,9 @@
PTR_SEG_TO_LIN(lpofn->lpstrFilter),
lRet), sizeof(tmpstr2));
SetDlgItemText32A( hWnd, edt1, tmpstr2 );
- if (in_lst1)
- {
+ if (!in_update)
/* if ScanDir succeeds, we have changed the directory */
- in_lst1 = FALSE;
if (FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE;
- }
/* if not, this must be a filename */
*pstr2 = 0;
if (pstr != NULL)
@@ -791,10 +786,7 @@
strcat(tmpstr2, "\\");
strncat(tmpstr2, tmpstr, 511-strlen(tmpstr2)); tmpstr2[511]=0;
if (lpofn->lpstrFile)
- {
- strncpy(PTR_SEG_TO_LIN(lpofn->lpstrFile), tmpstr2,lpofn->nMaxFile-1);
- *((LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile)+lpofn->nMaxFile) ='\0';
- }
+ lstrcpyn32A(PTR_SEG_TO_LIN(lpofn->lpstrFile), tmpstr2,lpofn->nMaxFile);
}
lpofn->nFileOffset = strrchr(tmpstr2,'\\') - tmpstr2 +1;
lpofn->nFileExtension = 0;
@@ -949,10 +941,8 @@
* FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
* For now, only the standard dialog works.
*/
- /*
- * FIXME : We should do error checking on the lpFind structure here
- * and make CommDlgExtendedError() return the error condition.
- */
+ if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
+ FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
ptr = SYSRES_GetResPtr( SYSRES_DIALOG_FIND_TEXT );
hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
@@ -972,10 +962,8 @@
* FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
* For now, only the standard dialog works.
*/
- /*
- * FIXME : We should do error checking on the lpFind structure here
- * and make CommDlgExtendedError() return the error condition.
- */
+ if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
+ FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
ptr = SYSRES_GetResPtr( SYSRES_DIALOG_FIND_TEXT );
hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
@@ -994,10 +982,8 @@
* FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
* For now, only the standard dialog works.
*/
- /*
- * FIXME : We should do error checking on the lpFind structure here
- * and make CommDlgExtendedError() return the error condition.
- */
+ if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
+ FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
ptr = SYSRES_GetResPtr( SYSRES_DIALOG_FIND_TEXT );
hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
@@ -1014,13 +1000,11 @@
LPFINDREPLACE16 lpFind = (LPFINDREPLACE16)PTR_SEG_TO_LIN(find);
/*
- * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
- * For now, only the standard dialog works.
- */
- /*
* FIXME : We should do error checking on the lpFind structure here
* and make CommDlgExtendedError() return the error condition.
*/
+ if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
+ FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
ptr = SYSRES_GetResPtr( SYSRES_DIALOG_REPLACE_TEXT );
hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
@@ -1040,10 +1024,8 @@
* FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
* For now, only the standard dialog works.
*/
- /*
- * FIXME : We should do error checking on the lpFind structure here
- * and make CommDlgExtendedError() return the error condition.
- */
+ if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
+ FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
ptr = SYSRES_GetResPtr( SYSRES_DIALOG_REPLACE_TEXT );
hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
@@ -1059,13 +1041,11 @@
LPCVOID ptr;
/*
- * FIXME : Should respond to FR_ENABLETEMPLATE and FR_ENABLEHOOK here
- * For now, only the standard dialog works.
- */
- /*
* FIXME : We should do error checking on the lpFind structure here
* and make CommDlgExtendedError() return the error condition.
*/
+ if (lpFind->Flags & (FR_ENABLETEMPLATE | FR_ENABLETEMPLATEHANDLE |
+ FR_ENABLEHOOK)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
ptr = SYSRES_GetResPtr( SYSRES_DIALOG_REPLACE_TEXT );
hInst = WIN_GetWindowInstance( lpFind->hwndOwner );
return DIALOG_CreateIndirect( hInst, ptr, TRUE, lpFind->hwndOwner,
@@ -2162,7 +2142,7 @@
if (lpp->hdcMem)
BitBlt32(hDC,0,0,rect.right,rect.bottom,lpp->hdcMem,0,0,SRCCOPY);
else
- fprintf(stderr,"choose color: hdcMem is not defined\n");
+ WARN(commdlg,"choose color: hdcMem is not defined\n");
ReleaseDC32(hwnd,hDC);
}
}
@@ -2700,18 +2680,42 @@
return FALSE ;
}
+static void CFn_CHOOSEFONT16to32A(LPCHOOSEFONT16 chf16, LPCHOOSEFONT32A chf32a)
+{
+ chf32a->lStructSize=sizeof(CHOOSEFONT32A);
+ chf32a->hwndOwner=chf16->hwndOwner;
+ chf32a->hDC=chf16->hDC;
+ chf32a->iPointSize=chf16->iPointSize;
+ chf32a->Flags=chf16->Flags;
+ chf32a->rgbColors=chf16->rgbColors;
+ chf32a->lCustData=chf16->lCustData;
+ chf32a->lpfnHook=NULL;
+ chf32a->lpTemplateName=PTR_SEG_TO_LIN(chf16->lpTemplateName);
+ chf32a->hInstance=chf16->hInstance;
+ chf32a->lpszStyle=PTR_SEG_TO_LIN(chf16->lpszStyle);
+ chf32a->nFontType=chf16->nFontType;
+ chf32a->nSizeMax=chf16->nSizeMax;
+ chf32a->nSizeMin=chf16->nSizeMin;
+ FONT_LogFont16To32A(PTR_SEG_TO_LIN(chf16->lpLogFont), chf32a->lpLogFont);
+}
/***********************************************************************
- * ChooseFont (COMMDLG.15)
+ * ChooseFont16 (COMMDLG.15)
*/
-BOOL16 WINAPI ChooseFont(LPCHOOSEFONT lpChFont)
+BOOL16 WINAPI ChooseFont16(LPCHOOSEFONT16 lpChFont)
{
HINSTANCE16 hInst;
HANDLE16 hDlgTmpl = 0;
BOOL16 bRet = FALSE, win32Format = FALSE;
LPCVOID template;
HWND32 hwndDialog;
+ CHOOSEFONT32A cf32a;
+ LOGFONT32A lf32a;
+ SEGPTR lpTemplateName;
+
+ cf32a.lpLogFont=&lf32a;
+ CFn_CHOOSEFONT16to32A(lpChFont, &cf32a);
TRACE(commdlg,"ChooseFont\n");
if (!lpChFont) return FALSE;
@@ -2748,17 +2752,71 @@
}
hInst = WIN_GetWindowInstance( lpChFont->hwndOwner );
-
+
+ /* lpTemplateName is not used in the dialog */
+ lpTemplateName=lpChFont->lpTemplateName;
+ lpChFont->lpTemplateName=(SEGPTR)&cf32a;
+
hwndDialog = DIALOG_CreateIndirect( hInst, template, win32Format,
lpChFont->hwndOwner,
(DLGPROC16)MODULE_GetWndProcEntry16("FormatCharDlgProc"),
(DWORD)lpChFont, WIN_PROC_16 );
if (hwndDialog) bRet = DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner);
if (hDlgTmpl) FreeResource16( hDlgTmpl );
+ lpChFont->lpTemplateName=lpTemplateName;
+ FONT_LogFont32ATo16(cf32a.lpLogFont,
+ (LPLOGFONT16)(PTR_SEG_TO_LIN(lpChFont->lpLogFont)));
return bRet;
}
+/***********************************************************************
+ * ChooseFont32A (COMDLG32.3)
+ */
+BOOL32 WINAPI ChooseFont32A(LPCHOOSEFONT32A lpChFont)
+{
+ BOOL32 bRet=FALSE;
+ HWND32 hwndDialog;
+ HINSTANCE32 hInst=WIN_GetWindowInstance( lpChFont->hwndOwner );
+ LPCVOID template = SYSRES_GetResPtr( SYSRES_DIALOG_CHOOSE_FONT );
+ if (lpChFont->Flags & (CF_SELECTSCRIPT | CF_NOVERTFONTS | CF_ENABLETEMPLATE |
+ CF_ENABLETEMPLATEHANDLE)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
+ hwndDialog = DIALOG_CreateIndirect(hInst, template, TRUE, lpChFont->hwndOwner,
+ (DLGPROC16)FormatCharDlgProc32A, (LPARAM)lpChFont, WIN_PROC_32A );
+ if (hwndDialog) bRet = DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner);
+ return bRet;
+}
+
+/***********************************************************************
+ * ChooseFont32W (COMDLG32.4)
+ */
+BOOL32 WINAPI ChooseFont32W(LPCHOOSEFONT32W lpChFont)
+{
+ BOOL32 bRet=FALSE;
+ HWND32 hwndDialog;
+ HINSTANCE32 hInst=WIN_GetWindowInstance( lpChFont->hwndOwner );
+ CHOOSEFONT32A cf32a;
+ LOGFONT32A lf32a;
+ LPCVOID template = SYSRES_GetResPtr( SYSRES_DIALOG_CHOOSE_FONT );
+ if (lpChFont->Flags & (CF_SELECTSCRIPT | CF_NOVERTFONTS | CF_ENABLETEMPLATE |
+ CF_ENABLETEMPLATEHANDLE)) FIXME(commdlg, ": unimplemented flag (ignored)\n");
+ memcpy(&cf32a, lpChFont, sizeof(cf32a));
+ memcpy(&lf32a, lpChFont->lpLogFont, sizeof(LOGFONT32A));
+ lstrcpynWtoA(lf32a.lfFaceName, lpChFont->lpLogFont->lfFaceName, LF_FACESIZE);
+ cf32a.lpLogFont=&lf32a;
+ cf32a.lpszStyle=HEAP_strdupWtoA(GetProcessHeap(), 0, lpChFont->lpszStyle);
+ lpChFont->lpTemplateName=(LPWSTR)&cf32a;
+ hwndDialog=DIALOG_CreateIndirect(hInst, template, TRUE, lpChFont->hwndOwner,
+ (DLGPROC16)FormatCharDlgProc32W, (LPARAM)lpChFont, WIN_PROC_32W );
+ if (hwndDialog)bRet=DIALOG_DoDialogBox(hwndDialog, lpChFont->hwndOwner);
+ HeapFree(GetProcessHeap(), 0, cf32a.lpszStyle);
+ lpChFont->lpTemplateName=(LPWSTR)cf32a.lpTemplateName;
+ memcpy(lpChFont->lpLogFont, &lf32a, sizeof(CHOOSEFONT32A));
+ lstrcpynAtoW(lpChFont->lpLogFont->lfFaceName, lf32a.lfFaceName, LF_FACESIZE);
+ return bRet;
+}
+
+
#define TEXT_EXTRAS 4
#define TEXT_COLORS 16
@@ -2773,7 +2831,19 @@
/***********************************************************************
* CFn_HookCallChk [internal]
*/
-static BOOL32 CFn_HookCallChk(LPCHOOSEFONT lpcf)
+static BOOL32 CFn_HookCallChk(LPCHOOSEFONT16 lpcf)
+{
+ if (lpcf)
+ if(lpcf->Flags & CF_ENABLEHOOK)
+ if (lpcf->lpfnHook)
+ return TRUE;
+ return FALSE;
+}
+
+/***********************************************************************
+ * CFn_HookCallChk32 [internal]
+ */
+static BOOL32 CFn_HookCallChk32(LPCHOOSEFONT32A lpcf)
{
if (lpcf)
if(lpcf->Flags & CF_ENABLEHOOK)
@@ -2783,18 +2853,14 @@
}
-/***********************************************************************
- * FontFamilyEnumProc (COMMDLG.19)
+/*************************************************************************
+ * AddFontFamily [internal]
*/
-INT16 WINAPI FontFamilyEnumProc( SEGPTR logfont, SEGPTR metrics,
- UINT16 nFontType, LPARAM lParam )
+static INT32 AddFontFamily(LPLOGFONT32A lplf, UINT32 nFontType,
+ LPCHOOSEFONT32A lpcf, HWND32 hwnd)
{
int i;
WORD w;
- HWND16 hwnd=LOWORD(lParam);
- HWND16 hDlg=GetParent16(hwnd);
- LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER);
- LOGFONT16 *lplf = (LOGFONT16 *)PTR_SEG_TO_LIN( logfont );
TRACE(commdlg,"font=%s (nFontType=%d)\n", lplf->lfFaceName,nFontType);
@@ -2805,28 +2871,60 @@
if (lplf->lfCharSet != ANSI_CHARSET)
return 1;
if (lpcf->Flags & CF_TTONLY)
- if (!(nFontType & 0x0004)) /* this means 'TRUETYPE_FONTTYPE' */
+ if (!(nFontType & TRUETYPE_FONTTYPE))
return 1;
- i=SendMessage16(hwnd,CB_ADDSTRING16,0,
- (LPARAM)logfont + ((char *)lplf->lfFaceName - (char *)lplf));
+ i=SendMessage32A(hwnd, CB_ADDSTRING32, 0, (LPARAM)lplf->lfFaceName);
if (i!=CB_ERR)
{
w=(lplf->lfCharSet << 8) | lplf->lfPitchAndFamily;
- SendMessage16(hwnd, CB_SETITEMDATA16,i,MAKELONG(nFontType,w));
+ SendMessage32A(hwnd, CB_SETITEMDATA32, i, MAKELONG(nFontType,w));
return 1 ; /* store some important font information */
}
else
return 0;
}
+typedef struct
+{
+ HWND32 hWnd1;
+ HWND32 hWnd2;
+ LPCHOOSEFONT32A lpcf32a;
+} CFn_ENUMSTRUCT, *LPCFn_ENUMSTRUCT;
+
+/*************************************************************************
+ * FontFamilyEnumProc32 [internal]
+ */
+INT32 WINAPI FontFamilyEnumProc32(LPENUMLOGFONT32A lpEnumLogFont,
+ LPNEWTEXTMETRIC32A metrics, UINT32 nFontType, LPARAM lParam)
+{
+ LPCFn_ENUMSTRUCT e;
+ e=(LPCFn_ENUMSTRUCT)lParam;
+ return AddFontFamily(&lpEnumLogFont->elfLogFont, nFontType, e->lpcf32a, e->hWnd1);
+}
+
+/***********************************************************************
+ * FontFamilyEnumProc16 (COMMDLG.19)
+ */
+INT16 WINAPI FontFamilyEnumProc16( SEGPTR logfont, SEGPTR metrics,
+ UINT16 nFontType, LPARAM lParam )
+{
+ HWND16 hwnd=LOWORD(lParam);
+ HWND16 hDlg=GetParent16(hwnd);
+ LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLong32A(hDlg, DWL_USER);
+ LOGFONT16 *lplf = (LOGFONT16 *)PTR_SEG_TO_LIN( logfont );
+ LOGFONT32A lf32a;
+ FONT_LogFont16To32A(lplf, &lf32a);
+ return AddFontFamily(&lf32a, nFontType, (LPCHOOSEFONT32A)lpcf->lpTemplateName,
+ hwnd);
+}
+
/*************************************************************************
* SetFontStylesToCombo2 [internal]
*
* Fill font style information into combobox (without using font.c directly)
*/
-static int SetFontStylesToCombo2(HWND16 hwnd, HDC16 hdc, LPLOGFONT16 lplf,
- LPTEXTMETRIC16 lptm)
+static int SetFontStylesToCombo2(HWND32 hwnd, HDC32 hdc, LPLOGFONT32A lplf)
{
#define FSTYLES 4
struct FONTSTYLE
@@ -2836,21 +2934,22 @@
static struct FONTSTYLE fontstyles[FSTYLES]={
{ 0,FW_NORMAL,"Regular"},{0,FW_BOLD,"Bold"},
{ 1,FW_NORMAL,"Italic"}, {1,FW_BOLD,"Bold Italic"}};
- HFONT16 hf;
+ HFONT16 hf;
+ TEXTMETRIC16 tm;
int i,j;
for (i=0;i<FSTYLES;i++)
{
lplf->lfItalic=fontstyles[i].italic;
lplf->lfWeight=fontstyles[i].weight;
- hf=CreateFontIndirect16(lplf);
+ hf=CreateFontIndirect32A(lplf);
hf=SelectObject32(hdc,hf);
- GetTextMetrics16(hdc,lptm);
+ GetTextMetrics16(hdc,&tm);
hf=SelectObject32(hdc,hf);
DeleteObject32(hf);
- if (lptm->tmWeight==fontstyles[i].weight &&
- lptm->tmItalic==fontstyles[i].italic) /* font successful created ? */
+ if (tm.tmWeight==fontstyles[i].weight &&
+ tm.tmItalic==fontstyles[i].italic) /* font successful created ? */
{
char *str = SEGPTR_STRDUP(fontstyles[i].stname);
j=SendMessage16(hwnd,CB_ADDSTRING16,0,(LPARAM)SEGPTR_GET(str) );
@@ -2862,56 +2961,50 @@
}
}
return 0;
- }
+}
/*************************************************************************
+ * AddFontSizeToCombo3 [internal]
+ */
+static int AddFontSizeToCombo3(HWND32 hwnd, UINT32 h, LPCHOOSEFONT32A lpcf)
+{
+ int j;
+ char buffer[20];
+
+ if ( (!(lpcf->Flags & CF_LIMITSIZE)) ||
+ ((lpcf->Flags & CF_LIMITSIZE) && (h >= lpcf->nSizeMin) && (h <= lpcf->nSizeMax)))
+ {
+ sprintf(buffer, "%2d", h);
+ j=SendMessage32A(hwnd, CB_FINDSTRINGEXACT32, -1, (LPARAM)buffer);
+ if (j==CB_ERR)
+ {
+ j=SendMessage32A(hwnd, CB_ADDSTRING32, 0, (LPARAM)buffer);
+ if (j!=CB_ERR) j = SendMessage32A(hwnd, CB_SETITEMDATA32, j, h);
+ if (j==CB_ERR) return 1;
+ }
+ }
+ return 0;
+}
+
+/*************************************************************************
* SetFontSizesToCombo3 [internal]
*/
-static int SetFontSizesToCombo3(HWND16 hwnd, LPLOGFONT16 lplf, LPCHOOSEFONT lpcf)
+static int SetFontSizesToCombo3(HWND32 hwnd, LPCHOOSEFONT32A lpcf)
{
static const int sizes[]={8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72,0};
- int h,i,j;
- char *buffer;
-
- if (!(buffer = SEGPTR_ALLOC(20))) return 1;
- for (i=0;sizes[i] && !lplf->lfHeight;i++)
- {
- h=lplf->lfHeight ? lplf->lfHeight : sizes[i];
+ int i;
- if ( (!(lpcf->Flags & CF_LIMITSIZE)) ||
- ((lpcf->Flags & CF_LIMITSIZE) && (h >= lpcf->nSizeMin) && (h <= lpcf->nSizeMax)))
- {
- sprintf(buffer,"%2d",h);
- j=SendMessage16(hwnd,CB_FINDSTRING16,-1,(LPARAM)SEGPTR_GET(buffer));
- if (j==CB_ERR)
- {
- j=SendMessage16(hwnd,CB_ADDSTRING16,0,(LPARAM)SEGPTR_GET(buffer));
- if (j!=CB_ERR) j = SendMessage16(hwnd, CB_SETITEMDATA16, j, h);
- if (j==CB_ERR)
- {
- SEGPTR_FREE(buffer);
- return 1;
- }
- }
- }
- }
- SEGPTR_FREE(buffer);
- return 0;
+ for (i=0; sizes[i]; i++)
+ if (AddFontSizeToCombo3(hwnd, sizes[i], lpcf)) return 1;
+ return 0;
}
-
/***********************************************************************
- * FontStyleEnumProc (COMMDLG.18)
+ * AddFontStyle [internal]
*/
-INT16 WINAPI FontStyleEnumProc( SEGPTR logfont, SEGPTR metrics,
- UINT16 nFontType, LPARAM lParam )
+INT32 AddFontStyle(LPLOGFONT32A lplf, UINT32 nFontType,
+ LPCHOOSEFONT32A lpcf, HWND32 hcmb2, HWND32 hcmb3, HWND32 hDlg)
{
- HWND16 hcmb2=LOWORD(lParam);
- HWND16 hcmb3=HIWORD(lParam);
- HWND16 hDlg=GetParent16(hcmb3);
- LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER);
- LOGFONT16 *lplf = (LOGFONT16 *)PTR_SEG_TO_LIN(logfont);
- TEXTMETRIC16 *lptm = (TEXTMETRIC16 *)PTR_SEG_TO_LIN(metrics);
int i;
TRACE(commdlg,"(nFontType=%d)\n",nFontType);
@@ -2922,48 +3015,83 @@
lplf->lfWeight,lplf->lfItalic,lplf->lfUnderline,
lplf->lfStrikeOut,lplf->lfCharSet, lplf->lfOutPrecision,
lplf->lfClipPrecision,lplf->lfQuality, lplf->lfPitchAndFamily);
+ if (nFontType & RASTER_FONTTYPE)
+ {
+ if (AddFontSizeToCombo3(hcmb3, lplf->lfHeight, lpcf)) return 0;
+ } else if (SetFontSizesToCombo3(hcmb3, lpcf)) return 0;
- if (SetFontSizesToCombo3(hcmb3, lplf ,lpcf))
- return 0;
-
- if (!SendMessage16(hcmb2,CB_GETCOUNT16,0,0))
+ if (!SendMessage32A(hcmb2, CB_GETCOUNT32, 0, 0))
{
HDC32 hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg);
- i=SetFontStylesToCombo2(hcmb2,hdc,lplf,lptm);
+ i=SetFontStylesToCombo2(hcmb2,hdc,lplf);
if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
ReleaseDC32(hDlg,hdc);
if (i)
- return 0;
+ return 0;
}
return 1 ;
+
+}
+
+/***********************************************************************
+ * FontStyleEnumProc16 (COMMDLG.18)
+ */
+INT16 WINAPI FontStyleEnumProc16( SEGPTR logfont, SEGPTR metrics,
+ UINT16 nFontType, LPARAM lParam )
+{
+ HWND16 hcmb2=LOWORD(lParam);
+ HWND16 hcmb3=HIWORD(lParam);
+ HWND16 hDlg=GetParent16(hcmb3);
+ LPCHOOSEFONT16 lpcf=(LPCHOOSEFONT16)GetWindowLong32A(hDlg, DWL_USER);
+ LOGFONT16 *lplf = (LOGFONT16 *)PTR_SEG_TO_LIN(logfont);
+ LOGFONT32A lf32a;
+ FONT_LogFont16To32A(lplf, &lf32a);
+ return AddFontStyle(&lf32a, nFontType, (LPCHOOSEFONT32A)lpcf->lpTemplateName,
+ hcmb2, hcmb3, hDlg);
}
+/***********************************************************************
+ * FontStyleEnumProc32 [internal]
+ */
+INT32 WINAPI FontStyleEnumProc32( LPENUMLOGFONT32A lpFont,
+ LPNEWTEXTMETRIC32A metrics, UINT32 nFontType, LPARAM lParam )
+{
+ LPCFn_ENUMSTRUCT s=(LPCFn_ENUMSTRUCT)lParam;
+ HWND32 hcmb2=s->hWnd1;
+ HWND32 hcmb3=s->hWnd2;
+ HWND32 hDlg=GetParent32(hcmb3);
+ return AddFontStyle(&lpFont->elfLogFont, nFontType, s->lpcf32a, hcmb2,
+ hcmb3, hDlg);
+}
/***********************************************************************
* CFn_WMInitDialog [internal]
*/
-LRESULT CFn_WMInitDialog(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
+LRESULT CFn_WMInitDialog(HWND32 hDlg, WPARAM32 wParam, LPARAM lParam,
+ LPCHOOSEFONT32A lpcf)
{
HDC32 hdc;
int i,j,res,init=0;
long l;
- LPLOGFONT16 lpxx;
- HCURSOR16 hcursor=SetCursor16(LoadCursor16(0,IDC_WAIT16));
- LPCHOOSEFONT lpcf;
+ LPLOGFONT32A lpxx;
+ HCURSOR32 hcursor=SetCursor32(LoadCursor32A(0,IDC_WAIT32A));
SetWindowLong32A(hDlg, DWL_USER, lParam);
- lpcf=(LPCHOOSEFONT)lParam;
- lpxx=PTR_SEG_TO_LIN(lpcf->lpLogFont);
+ lpxx=lpcf->lpLogFont;
TRACE(commdlg,"WM_INITDIALOG lParam=%08lX\n", lParam);
- if (lpcf->lStructSize != sizeof(CHOOSEFONT))
+ if (lpcf->lStructSize != sizeof(CHOOSEFONT32A))
{
ERR(commdlg,"structure size failure !!!\n");
EndDialog32 (hDlg, 0);
return FALSE;
}
if (!hBitmapTT)
- hBitmapTT = LoadBitmap16(0, MAKEINTRESOURCE16(OBM_TRTYPE));
+ hBitmapTT = LoadBitmap32A(0, MAKEINTRESOURCE32A(OBM_TRTYPE));
+
+ /* This font will be deleted by WM_COMMAND */
+ SendDlgItemMessage32A(hDlg,stc6,WM_SETFONT,
+ CreateFont32A(0, 0, 1, 1, 400, 0, 0, 0, 0, 0, 0, 0, 0, NULL),FALSE);
if (!(lpcf->Flags & CF_SHOWHELP) || !IsWindow32(lpcf->hwndOwner))
ShowWindow32(GetDlgItem32(hDlg,pshHelp),SW_HIDE);
@@ -2974,14 +3102,13 @@
for (res=1,i=0;res && i<TEXT_COLORS;i++)
{
/* FIXME: load color name from resource: res=LoadString(...,i+....,buffer,.....); */
- char *name = SEGPTR_ALLOC(20);
+ char name[20];
strcpy( name, "[color name]" );
- j=SendDlgItemMessage16(hDlg,cmb4,CB_ADDSTRING16,0,(LPARAM)SEGPTR_GET(name));
- SEGPTR_FREE(name);
- SendDlgItemMessage16(hDlg,cmb4, CB_SETITEMDATA16,j,textcolors[j]);
+ j=SendDlgItemMessage32A(hDlg, cmb4, CB_ADDSTRING32, 0, (LPARAM)name);
+ SendDlgItemMessage32A(hDlg, cmb4, CB_SETITEMDATA16, j, textcolors[j]);
/* look for a fitting value in color combobox */
if (textcolors[j]==lpcf->rgbColors)
- SendDlgItemMessage16(hDlg,cmb4, CB_SETCURSEL16,j,0);
+ SendDlgItemMessage32A(hDlg,cmb4, CB_SETCURSEL32,j,0);
}
}
else
@@ -2995,50 +3122,52 @@
hdc= (lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg);
if (hdc)
{
- if (!EnumFontFamilies16(hdc, NULL,FontFamilyEnumProc,
- (LPARAM)GetDlgItem32(hDlg,cmb1)))
+ CFn_ENUMSTRUCT s;
+ s.hWnd1=GetDlgItem32(hDlg,cmb1);
+ s.lpcf32a=lpcf;
+ if (!EnumFontFamilies32A(hdc, NULL, FontFamilyEnumProc32, (LPARAM)&s))
TRACE(commdlg,"EnumFontFamilies returns 0\n");
if (lpcf->Flags & CF_INITTOLOGFONTSTRUCT)
{
/* look for fitting font name in combobox1 */
- j=SendDlgItemMessage16(hDlg,cmb1,CB_FINDSTRING16,-1,(LONG)lpxx->lfFaceName);
+ j=SendDlgItemMessage32A(hDlg,cmb1,CB_FINDSTRING32,-1,(LONG)lpxx->lfFaceName);
if (j!=CB_ERR)
{
- SendDlgItemMessage16(hDlg,cmb1,CB_SETCURSEL16,j,0);
- SendMessage16(hDlg,WM_COMMAND,cmb1,
- MAKELONG(GetDlgItem32(hDlg,cmb1),CBN_SELCHANGE));
+ SendDlgItemMessage32A(hDlg, cmb1, CB_SETCURSEL32, j, 0);
+ SendMessage32A(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
+ GetDlgItem32(hDlg,cmb1));
init=1;
/* look for fitting font style in combobox2 */
l=MAKELONG(lpxx->lfWeight > FW_MEDIUM ? FW_BOLD:FW_NORMAL,lpxx->lfItalic !=0);
for (i=0;i<TEXT_EXTRAS;i++)
{
- if (l==SendDlgItemMessage16(hDlg,cmb2, CB_GETITEMDATA16,i,0))
- SendDlgItemMessage16(hDlg,cmb2,CB_SETCURSEL16,i,0);
+ if (l==SendDlgItemMessage32A(hDlg, cmb2, CB_GETITEMDATA32, i, 0))
+ SendDlgItemMessage32A(hDlg, cmb2, CB_SETCURSEL32, i, 0);
}
/* look for fitting font size in combobox3 */
- j=SendDlgItemMessage16(hDlg,cmb3,CB_GETCOUNT16,0,0);
+ j=SendDlgItemMessage32A(hDlg, cmb3, CB_GETCOUNT32, 0, 0);
for (i=0;i<j;i++)
{
- if (lpxx->lfHeight==(int)SendDlgItemMessage16(hDlg,cmb3, CB_GETITEMDATA16,i,0))
- SendDlgItemMessage16(hDlg,cmb3,CB_SETCURSEL16,i,0);
+ if (lpxx->lfHeight==(int)SendDlgItemMessage32A(hDlg,cmb3, CB_GETITEMDATA32,i,0))
+ SendDlgItemMessage32A(hDlg,cmb3,CB_SETCURSEL32,i,0);
}
}
- if (!init)
- {
- SendDlgItemMessage16(hDlg,cmb1,CB_SETCURSEL16,0,0);
- SendMessage16(hDlg,WM_COMMAND,cmb1,
- MAKELONG(GetDlgItem32(hDlg,cmb1),CBN_SELCHANGE));
- }
}
+ if (!init)
+ {
+ SendDlgItemMessage32A(hDlg,cmb1,CB_SETCURSEL32,0,0);
+ SendMessage32A(hDlg, WM_COMMAND, MAKEWPARAM(cmb1, CBN_SELCHANGE),
+ GetDlgItem32(hDlg,cmb1));
+ }
if (lpcf->Flags & CF_USESTYLE && lpcf->lpszStyle)
{
- j=SendDlgItemMessage16(hDlg,cmb2,CB_FINDSTRING16,-1,(LONG)lpcf->lpszStyle);
+ j=SendDlgItemMessage32A(hDlg,cmb2,CB_FINDSTRING32,-1,(LONG)lpcf->lpszStyle);
if (j!=CB_ERR)
{
- j=SendDlgItemMessage16(hDlg,cmb2,CB_SETCURSEL16,j,0);
- SendMessage16(hDlg,WM_COMMAND,cmb2,
- MAKELONG(GetDlgItem32(hDlg,cmb2),CBN_SELCHANGE));
+ j=SendDlgItemMessage32A(hDlg,cmb2,CB_SETCURSEL32,j,0);
+ SendMessage32A(hDlg,WM_COMMAND,cmb2,
+ MAKELONG(GetDlgItem32(hDlg,cmb2),CBN_SELCHANGE));
}
}
}
@@ -3051,24 +3180,21 @@
if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
ReleaseDC32(hDlg,hdc);
- res=TRUE;
- if (CFn_HookCallChk(lpcf))
- res=CallWindowProc16(lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
- SetCursor16(hcursor);
- return res;
+ SetCursor32(hcursor);
+ return TRUE;
}
/***********************************************************************
* CFn_WMMeasureItem [internal]
*/
-LRESULT CFn_WMMeasureItem(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
+LRESULT CFn_WMMeasureItem(HWND32 hDlg, WPARAM32 wParam, LPARAM lParam)
{
- BITMAP16 bm;
- LPMEASUREITEMSTRUCT16 lpmi=PTR_SEG_TO_LIN((LPMEASUREITEMSTRUCT16)lParam);
+ BITMAP32 bm;
+ LPMEASUREITEMSTRUCT32 lpmi=(LPMEASUREITEMSTRUCT32)lParam;
if (!hBitmapTT)
- hBitmapTT = LoadBitmap16(0, MAKEINTRESOURCE16(OBM_TRTYPE));
- GetObject16( hBitmapTT, sizeof(bm), &bm );
+ hBitmapTT = LoadBitmap32A(0, MAKEINTRESOURCE32A(OBM_TRTYPE));
+ GetObject32A( hBitmapTT, sizeof(bm), &bm );
lpmi->itemHeight=bm.bmHeight;
/* FIXME: use MAX of bm.bmHeight and tm.tmHeight .*/
return 0;
@@ -3078,45 +3204,52 @@
/***********************************************************************
* CFn_WMDrawItem [internal]
*/
-LRESULT CFn_WMDrawItem(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
+LRESULT CFn_WMDrawItem(HWND32 hDlg, WPARAM32 wParam, LPARAM lParam)
{
- HBRUSH16 hBrush;
- char *buffer;
- BITMAP16 bm;
- COLORREF cr;
- RECT16 rect;
+ HBRUSH32 hBrush;
+ char buffer[40];
+ BITMAP32 bm;
+ COLORREF cr, oldText=0, oldBk=0;
+ RECT32 rect;
#if 0
- HDC16 hMemDC;
+ HDC32 hMemDC;
int nFontType;
- HBITMAP16 hBitmap; /* for later TT usage */
+ HBITMAP32 hBitmap; /* for later TT usage */
#endif
- LPDRAWITEMSTRUCT16 lpdi = (LPDRAWITEMSTRUCT16)PTR_SEG_TO_LIN(lParam);
+ LPDRAWITEMSTRUCT32 lpdi = (LPDRAWITEMSTRUCT32)lParam;
if (lpdi->itemID == 0xFFFF) /* got no items */
- DrawFocusRect16(lpdi->hDC, &lpdi->rcItem);
+ DrawFocusRect32(lpdi->hDC, &lpdi->rcItem);
else
{
if (lpdi->CtlType == ODT_COMBOBOX)
{
- hBrush = SelectObject32(lpdi->hDC, GetStockObject32(LTGRAY_BRUSH));
- SelectObject32(lpdi->hDC, hBrush);
- FillRect16(lpdi->hDC, &lpdi->rcItem, hBrush);
+ if (lpdi->itemState ==ODS_SELECTED)
+ {
+ hBrush=GetSysColorBrush32(COLOR_HIGHLIGHT);
+ oldText=SetTextColor32(lpdi->hDC, GetSysColor32(COLOR_HIGHLIGHTTEXT));
+ oldBk=SetBkColor32(lpdi->hDC, GetSysColor32(COLOR_HIGHLIGHT));
+ } else
+ {
+ hBrush = SelectObject32(lpdi->hDC, GetStockObject32(LTGRAY_BRUSH));
+ SelectObject32(lpdi->hDC, hBrush);
+ }
+ FillRect32(lpdi->hDC, &lpdi->rcItem, hBrush);
}
else
return TRUE; /* this should never happen */
rect=lpdi->rcItem;
- buffer = SEGPTR_ALLOC(40);
switch (lpdi->CtlID)
{
case cmb1: /* TRACE(commdlg,"WM_Drawitem cmb1\n"); */
- SendMessage16(lpdi->hwndItem, CB_GETLBTEXT16, lpdi->itemID,
- (LPARAM)SEGPTR_GET(buffer));
- GetObject16( hBitmapTT, sizeof(bm), &bm );
- TextOut16(lpdi->hDC, lpdi->rcItem.left + bm.bmWidth + 10,
- lpdi->rcItem.top, buffer, lstrlen16(buffer));
+ SendMessage32A(lpdi->hwndItem, CB_GETLBTEXT32, lpdi->itemID,
+ (LPARAM)buffer);
+ GetObject32A( hBitmapTT, sizeof(bm), &bm );
+ TextOut32A(lpdi->hDC, lpdi->rcItem.left + bm.bmWidth + 10,
+ lpdi->rcItem.top, buffer, lstrlen32A(buffer));
#if 0
- nFontType = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA16, lpdi->itemID,0L);
+ nFontType = SendMessage32A(lpdi->hwndItem, CB_GETITEMDATA32, lpdi->itemID,0L);
/* FIXME: draw bitmap if truetype usage */
if (nFontType&TRUETYPE_FONTTYPE)
{
@@ -3131,18 +3264,18 @@
break;
case cmb2:
case cmb3: /* TRACE(commdlg,"WM_DRAWITEN cmb2,cmb3\n"); */
- SendMessage16(lpdi->hwndItem, CB_GETLBTEXT16, lpdi->itemID,
- (LPARAM)SEGPTR_GET(buffer));
- TextOut16(lpdi->hDC, lpdi->rcItem.left,
- lpdi->rcItem.top, buffer, lstrlen16(buffer));
+ SendMessage32A(lpdi->hwndItem, CB_GETLBTEXT32, lpdi->itemID,
+ (LPARAM)buffer);
+ TextOut32A(lpdi->hDC, lpdi->rcItem.left,
+ lpdi->rcItem.top, buffer, lstrlen32A(buffer));
break;
case cmb4: /* TRACE(commdlg,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
- SendMessage16(lpdi->hwndItem, CB_GETLBTEXT16, lpdi->itemID,
- (LPARAM)SEGPTR_GET(buffer));
- TextOut16(lpdi->hDC, lpdi->rcItem.left + 25+5,
- lpdi->rcItem.top, buffer, lstrlen16(buffer));
- cr = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA16, lpdi->itemID,0L);
+ SendMessage32A(lpdi->hwndItem, CB_GETLBTEXT32, lpdi->itemID,
+ (LPARAM)buffer);
+ TextOut32A(lpdi->hDC, lpdi->rcItem.left + 25+5,
+ lpdi->rcItem.top, buffer, lstrlen32A(buffer));
+ cr = SendMessage32A(lpdi->hwndItem, CB_GETITEMDATA32, lpdi->itemID,0L);
hBrush = CreateSolidBrush32(cr);
if (hBrush)
{
@@ -3161,9 +3294,11 @@
default: return TRUE; /* this should never happen */
}
- SEGPTR_FREE(buffer);
- if (lpdi->itemState ==ODS_SELECTED)
- InvertRect16(lpdi->hDC, &rect);
+ if (lpdi->itemState == ODS_SELECTED)
+ {
+ SetTextColor32(lpdi->hDC, oldText);
+ SetBkColor32(lpdi->hDC, oldBk);
+ }
}
return TRUE;
}
@@ -3171,14 +3306,13 @@
/***********************************************************************
* CFn_WMCtlColor [internal]
*/
-LRESULT CFn_WMCtlColor(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
+LRESULT CFn_WMCtlColorStatic(HWND32 hDlg, WPARAM32 wParam, LPARAM lParam,
+ LPCHOOSEFONT32A lpcf)
{
- LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER);
-
if (lpcf->Flags & CF_EFFECTS)
- if (HIWORD(lParam)==CTLCOLOR_STATIC && GetDlgCtrlID32(LOWORD(lParam))==stc6)
+ if (GetDlgCtrlID32(lParam)==stc6)
{
- SetTextColor32(wParam,lpcf->rgbColors);
+ SetTextColor32((HDC32)wParam, lpcf->rgbColors);
return GetStockObject32(WHITE_BRUSH);
}
return 0;
@@ -3187,37 +3321,39 @@
/***********************************************************************
* CFn_WMCommand [internal]
*/
-LRESULT CFn_WMCommand(HWND16 hDlg, WPARAM16 wParam, LPARAM lParam)
+LRESULT CFn_WMCommand(HWND32 hDlg, WPARAM32 wParam, LPARAM lParam,
+ LPCHOOSEFONT32A lpcf)
{
- HFONT16 hFont;
+ HFONT32 hFont;
int i,j;
long l;
- HDC16 hdc;
- LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER);
- LPLOGFONT16 lpxx=PTR_SEG_TO_LIN(lpcf->lpLogFont);
+ HDC32 hdc;
+ LPLOGFONT32A lpxx=lpcf->lpLogFont;
- TRACE(commdlg,"WM_COMMAND lParam=%08lX\n", lParam);
- switch (wParam)
+ TRACE(commdlg,"WM_COMMAND wParam=%08lX lParam=%08lX\n", (LONG)wParam, lParam);
+ switch (LOWORD(wParam))
{
- case cmb1:if (HIWORD(lParam)==CBN_SELCHANGE)
+ case cmb1:if (HIWORD(wParam)==CBN_SELCHANGE)
{
hdc=(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC) ? lpcf->hDC : GetDC32(hDlg);
if (hdc)
{
- SendDlgItemMessage16(hDlg,cmb2,CB_RESETCONTENT16,0,0);
- SendDlgItemMessage16(hDlg,cmb3,CB_RESETCONTENT16,0,0);
- i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL16,0,0);
+ SendDlgItemMessage32A(hDlg, cmb2, CB_RESETCONTENT16, 0, 0);
+ SendDlgItemMessage32A(hDlg, cmb3, CB_RESETCONTENT16, 0, 0);
+ i=SendDlgItemMessage32A(hDlg, cmb1, CB_GETCURSEL16, 0, 0);
if (i!=CB_ERR)
{
- HCURSOR16 hcursor=SetCursor16(LoadCursor16(0,IDC_WAIT16));
- char *str = SEGPTR_ALLOC(256);
- SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT16,i,
- (LPARAM)SEGPTR_GET(str));
+ HCURSOR32 hcursor=SetCursor32(LoadCursor32A(0,IDC_WAIT32A));
+ CFn_ENUMSTRUCT s;
+ char str[256];
+ SendDlgItemMessage32A(hDlg, cmb1, CB_GETLBTEXT32, i,
+ (LPARAM)str);
TRACE(commdlg,"WM_COMMAND/cmb1 =>%s\n",str);
- EnumFontFamilies16(hdc,str,FontStyleEnumProc,
- MAKELONG(GetDlgItem32(hDlg,cmb2),GetDlgItem32(hDlg,cmb3)));
- SetCursor16(hcursor);
- SEGPTR_FREE(str);
+ s.hWnd1=GetDlgItem32(hDlg, cmb2);
+ s.hWnd2=GetDlgItem32(hDlg, cmb3);
+ s.lpcf32a=lpcf;
+ EnumFontFamilies32A(hdc, str, FontStyleEnumProc32, (LPARAM)&s);
+ SetCursor32(hcursor);
}
if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
ReleaseDC32(hDlg,hdc);
@@ -3232,18 +3368,18 @@
case chx1:
case chx2:
case cmb2:
- case cmb3:if (HIWORD(lParam)==CBN_SELCHANGE || HIWORD(lParam)== BN_CLICKED )
+ case cmb3:if (HIWORD(wParam)==CBN_SELCHANGE || HIWORD(wParam)== BN_CLICKED )
{
- char *str = SEGPTR_ALLOC(256);
+ char str[256];
TRACE(commdlg,"WM_COMMAND/cmb2,3 =%08lX\n", lParam);
- i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL16,0,0);
+ i=SendDlgItemMessage32A(hDlg,cmb1,CB_GETCURSEL32,0,0);
if (i==CB_ERR)
i=GetDlgItemText32A( hDlg, cmb1, str, 256 );
else
{
- SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT16,i,
- (LPARAM)SEGPTR_GET(str));
- l=SendDlgItemMessage16(hDlg,cmb1,CB_GETITEMDATA16,i,0);
+ SendDlgItemMessage32A(hDlg,cmb1,CB_GETLBTEXT32,i,
+ (LPARAM)str);
+ l=SendDlgItemMessage32A(hDlg,cmb1,CB_GETITEMDATA32,i,0);
j=HIWORD(l);
lpcf->nFontType = LOWORD(l);
/* FIXME: lpcf->nFontType |= .... SIMULATED_FONTTYPE and so */
@@ -3253,19 +3389,18 @@
lpxx->lfCharSet=j>>8;
}
strcpy(lpxx->lfFaceName,str);
- SEGPTR_FREE(str);
- i=SendDlgItemMessage16(hDlg,cmb2,CB_GETCURSEL16,0,0);
+ i=SendDlgItemMessage32A(hDlg, cmb2, CB_GETCURSEL32, 0, 0);
if (i!=CB_ERR)
{
- l=SendDlgItemMessage16(hDlg,cmb2,CB_GETITEMDATA16,i,0);
+ l=SendDlgItemMessage32A(hDlg, cmb2, CB_GETITEMDATA32, i, 0);
if (0!=(lpxx->lfItalic=HIWORD(l)))
lpcf->nFontType |= ITALIC_FONTTYPE;
if ((lpxx->lfWeight=LOWORD(l)) > FW_MEDIUM)
lpcf->nFontType |= BOLD_FONTTYPE;
}
- i=SendDlgItemMessage16(hDlg,cmb3,CB_GETCURSEL16,0,0);
+ i=SendDlgItemMessage32A(hDlg, cmb3, CB_GETCURSEL32, 0, 0);
if (i!=CB_ERR)
- lpxx->lfHeight=-LOWORD(SendDlgItemMessage16(hDlg,cmb3,CB_GETITEMDATA16,i,0));
+ lpxx->lfHeight=-LOWORD(SendDlgItemMessage32A(hDlg, cmb3, CB_GETITEMDATA32, i, 0));
else
lpxx->lfHeight=0;
lpxx->lfStrikeOut=IsDlgButtonChecked32(hDlg,chx1);
@@ -3276,14 +3411,18 @@
lpxx->lfQuality=DEFAULT_QUALITY;
lpcf->iPointSize= -10*lpxx->lfHeight;
- hFont=CreateFontIndirect16(lpxx);
+ hFont=CreateFontIndirect32A(lpxx);
if (hFont)
- SendDlgItemMessage16(hDlg,stc6,WM_SETFONT,hFont,TRUE);
- /* FIXME: Delete old font ...? */
+ {
+ HFONT32 oldFont=SendDlgItemMessage32A(hDlg, stc6,
+ WM_GETFONT, 0, 0);
+ SendDlgItemMessage32A(hDlg,stc6,WM_SETFONT,hFont,TRUE);
+ DeleteObject32(oldFont);
+ }
}
break;
- case cmb4:i=SendDlgItemMessage16(hDlg,cmb4,CB_GETCURSEL16,0,0);
+ case cmb4:i=SendDlgItemMessage32A(hDlg, cmb4, CB_GETCURSEL32, 0, 0);
if (i!=CB_ERR)
{
lpcf->rgbColors=textcolors[i];
@@ -3293,9 +3432,9 @@
case psh15:i=RegisterWindowMessage32A( HELPMSGSTRING );
if (lpcf->hwndOwner)
- SendMessage16(lpcf->hwndOwner,i,0,(LPARAM)lpcf);
- if (CFn_HookCallChk(lpcf))
- CallWindowProc16(lpcf->lpfnHook,hDlg,WM_COMMAND,psh15,(LPARAM)lpcf);
+ SendMessage32A(lpcf->hwndOwner, i, 0, (LPARAM)GetWindowLong32A(hDlg, DWL_USER));
+/* if (CFn_HookCallChk(lpcf))
+ CallWindowProc16(lpcf->lpfnHook,hDlg,WM_COMMAND,psh15,(LPARAM)lpcf);*/
break;
case IDOK:if ( (!(lpcf->Flags & CF_LIMITSIZE)) ||
@@ -3308,7 +3447,7 @@
char buffer[80];
sprintf(buffer,"Select a font size between %d and %d points.",
lpcf->nSizeMin,lpcf->nSizeMax);
- MessageBox16(hDlg,buffer,NULL,MB_OK);
+ MessageBox32A(hDlg, buffer, NULL, MB_OK);
}
return(TRUE);
case IDCANCEL:EndDialog32(hDlg, FALSE);
@@ -3317,20 +3456,30 @@
return(FALSE);
}
+static LRESULT CFn_WMDestroy(HWND32 hwnd, WPARAM32 wParam, LPARAM lParam)
+{
+ DeleteObject32(SendDlgItemMessage32A(hwnd, stc6, WM_GETFONT, 0, 0));
+ return TRUE;
+}
+
/***********************************************************************
- * FormatCharDlgProc (COMMDLG.16)
+ * FormatCharDlgProc16 (COMMDLG.16)
FIXME: 1. some strings are "hardcoded", but it's better load from sysres
2. some CF_.. flags are not supported
3. some TType extensions
*/
-LRESULT WINAPI FormatCharDlgProc(HWND16 hDlg, UINT16 message, WPARAM16 wParam,
- LPARAM lParam)
+LRESULT WINAPI FormatCharDlgProc16(HWND16 hDlg, UINT16 message, WPARAM16 wParam,
+ LPARAM lParam)
{
- LPCHOOSEFONT lpcf=(LPCHOOSEFONT)GetWindowLong32A(hDlg, DWL_USER);
+ LPCHOOSEFONT16 lpcf;
+ LPCHOOSEFONT32A lpcf32a;
+ UINT32 uMsg32;
+ WPARAM32 wParam32;
+ LRESULT res=0;
if (message!=WM_INITDIALOG)
{
- int res=0;
+ lpcf=(LPCHOOSEFONT16)GetWindowLong32A(hDlg, DWL_USER);
if (!lpcf)
return FALSE;
if (CFn_HookCallChk(lpcf))
@@ -3339,233 +3488,376 @@
return res;
}
else
- return CFn_WMInitDialog(hDlg,wParam,lParam);
- switch (message)
+ {
+ lpcf=(LPCHOOSEFONT16)lParam;
+ lpcf32a=(LPCHOOSEFONT32A)lpcf->lpTemplateName;
+ if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf32a))
+ {
+ TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n");
+ return FALSE;
+ }
+ if (CFn_HookCallChk(lpcf))
+ return CallWindowProc16(lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
+ }
+ WINPROC_MapMsg16To32A(message, wParam, &uMsg32, &wParam32, &lParam);
+ lpcf32a=(LPCHOOSEFONT32A)lpcf->lpTemplateName;
+ switch (uMsg32)
{
case WM_MEASUREITEM:
- return CFn_WMMeasureItem(hDlg,wParam,lParam);
+ res=CFn_WMMeasureItem(hDlg, wParam32, lParam);
+ break;
case WM_DRAWITEM:
- return CFn_WMDrawItem(hDlg,wParam,lParam);
- case WM_CTLCOLOR:
- return CFn_WMCtlColor(hDlg,wParam,lParam);
+ res=CFn_WMDrawItem(hDlg, wParam32, lParam);
+ break;
+ case WM_CTLCOLORSTATIC:
+ res=CFn_WMCtlColorStatic(hDlg, wParam32, lParam, lpcf32a);
+ break;
case WM_COMMAND:
- return CFn_WMCommand(hDlg,wParam,lParam);
+ res=CFn_WMCommand(hDlg, wParam32, lParam, lpcf32a);
+ break;
+ case WM_DESTROY:
+ res=CFn_WMDestroy(hDlg, wParam32, lParam);
+ break;
case WM_CHOOSEFONT_GETLOGFONT:
TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
lParam);
FIXME(commdlg, "current logfont back to caller\n");
break;
}
- return FALSE;
+ WINPROC_UnmapMsg16To32A(uMsg32, wParam32, lParam, res);
+ return res;
}
-
-#define GET_XXX_FILENAME(xxx) \
-BOOL32 WINAPI xxx##32A( LPOPENFILENAME32A ofn ) \
-{ \
- BOOL16 ret; \
- LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16)); \
- \
- memset(ofn16,'\0',sizeof(*ofn16)); \
- ofn16->lStructSize = sizeof(*ofn16); \
- ofn16->hwndOwner = ofn->hwndOwner; \
- /* FIXME: OPENFILENAME16 got only 16 bit for HINSTANCE... */ \
- ofn16->hInstance = MODULE_HANDLEtoHMODULE16(ofn->hInstance); \
- if (ofn->lpstrFilter) { \
- LPSTR s,x; \
- \
- /* filter is a list... title\0ext\0......\0\0 */ \
- s = (LPSTR)ofn->lpstrFilter; \
- while (*s) \
- s = s+strlen(s)+1; \
- s++; \
- x = (LPSTR)SEGPTR_ALLOC(s-ofn->lpstrFilter); \
- memcpy(x,ofn->lpstrFilter,s-ofn->lpstrFilter); \
- ofn16->lpstrFilter = SEGPTR_GET(x); \
- } \
- if (ofn->lpstrCustomFilter) { \
- LPSTR s,x; \
- \
- /* filter is a list... title\0ext\0......\0\0 */ \
- s = (LPSTR)ofn->lpstrCustomFilter; \
- while (*s) \
- s = s+strlen(s)+1; \
- x = SEGPTR_ALLOC(s-ofn->lpstrCustomFilter); \
- s++; \
- memcpy(x,ofn->lpstrCustomFilter,s-ofn->lpstrCustomFilter);\
- ofn16->lpstrCustomFilter = SEGPTR_GET(x); \
- } \
- ofn16->nMaxCustFilter = ofn->nMaxCustFilter; \
- ofn16->nFilterIndex = ofn->nFilterIndex; \
- if (ofn->nMaxFile) \
- ofn16->lpstrFile = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFile)); \
- ofn16->nMaxFile = ofn->nMaxFile; \
- if (ofn16->lpstrFileTitle) \
- ofn16->lpstrFileTitle= SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrFileTitle));\
- ofn16->nMaxFileTitle = ofn->nMaxFileTitle; \
- if (ofn16->nMaxFileTitle) \
- ofn16->lpstrFileTitle = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFileTitle));\
- if (ofn->lpstrInitialDir) \
- ofn16->lpstrInitialDir = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrInitialDir));\
- if (ofn->lpstrTitle) \
- ofn16->lpstrTitle = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrTitle));\
- ofn16->Flags = ofn->Flags|OFN_WINE32; \
- ofn16->nFileOffset = ofn->nFileOffset; \
- ofn16->nFileExtension = ofn->nFileExtension; \
- if (ofn->lpstrDefExt) \
- ofn16->lpstrDefExt = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrDefExt));\
- ofn16->lCustData = ofn->lCustData; \
- ofn16->lpfnHook = (WNDPROC16)ofn->lpfnHook; \
- \
- if (ofn->lpTemplateName) \
- ofn16->lpTemplateName = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpTemplateName));\
- \
- ret = xxx##16(SEGPTR_GET(ofn16)); \
- \
- ofn->nFileOffset = ofn16->nFileOffset; \
- ofn->nFileExtension = ofn16->nFileExtension; \
- if (ofn16->lpstrFilter) \
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFilter)); \
- if (ofn16->lpTemplateName) \
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpTemplateName)); \
- if (ofn16->lpstrDefExt) \
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrDefExt)); \
- if (ofn16->lpstrTitle) \
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrTitle)); \
- if (ofn16->lpstrInitialDir) \
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrInitialDir)); \
- if (ofn16->lpstrCustomFilter) \
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrCustomFilter)); \
- \
- if (ofn16->lpstrFile) { \
- strcpy(ofn->lpstrFile,PTR_SEG_TO_LIN(ofn16->lpstrFile)); \
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFile)); \
- } \
- \
- if (ofn16->lpstrFileTitle) { \
- strcpy(ofn->lpstrFileTitle,PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));\
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFileTitle)); \
- } \
- SEGPTR_FREE(ofn16); \
- return ret; \
-} \
- \
-BOOL32 WINAPI xxx##32W( LPOPENFILENAME32W ofn ) \
-{ \
- BOOL16 ret; \
- LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16)); \
- \
- memset(ofn16,'\0',sizeof(*ofn16)); \
- ofn16->lStructSize = sizeof(*ofn16); \
- ofn16->hwndOwner = ofn->hwndOwner; \
- /* FIXME: OPENFILENAME16 got only 16 bit for HINSTANCE... */ \
- ofn16->hInstance = MODULE_HANDLEtoHMODULE16(ofn->hInstance); \
- if (ofn->lpstrFilter) { \
- LPWSTR s; \
- LPSTR x,y; \
- int n; \
- \
- /* filter is a list... title\0ext\0......\0\0 */ \
- s = (LPWSTR)ofn->lpstrFilter; \
- while (*s) \
- s = s+lstrlen32W(s)+1; \
- s++; \
- n = s - ofn->lpstrFilter; /* already divides by 2. ptr magic */\
- x = y = (LPSTR)SEGPTR_ALLOC(n); \
- s = (LPWSTR)ofn->lpstrFilter; \
- while (*s) { \
- lstrcpyWtoA(x,s); \
- x+=lstrlen32A(x)+1; \
- s+=lstrlen32W(s)+1; \
- } \
- *x=0; \
- ofn16->lpstrFilter = SEGPTR_GET(y); \
- } \
- if (ofn->lpstrCustomFilter) { \
- LPWSTR s; \
- LPSTR x,y; \
- int n; \
- \
- /* filter is a list... title\0ext\0......\0\0 */ \
- s = (LPWSTR)ofn->lpstrCustomFilter; \
- while (*s) \
- s = s+lstrlen32W(s)+1; \
- s++; \
- n = s - ofn->lpstrCustomFilter; \
- x = y = (LPSTR)SEGPTR_ALLOC(n); \
- s = (LPWSTR)ofn->lpstrCustomFilter; \
- while (*s) { \
- lstrcpyWtoA(x,s); \
- x+=lstrlen32A(x)+1; \
- s+=lstrlen32W(s)+1; \
- } \
- *x=0; \
- ofn16->lpstrCustomFilter = SEGPTR_GET(y); \
- } \
- ofn16->nMaxCustFilter = ofn->nMaxCustFilter; \
- ofn16->nFilterIndex = ofn->nFilterIndex; \
- if (ofn->nMaxFile) \
- ofn16->lpstrFile = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFile)); \
- ofn16->nMaxFile = ofn->nMaxFile; \
- if (ofn16->lpstrFileTitle) \
- ofn16->lpstrFileTitle= SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrFileTitle));\
- ofn16->nMaxFileTitle = ofn->nMaxFileTitle; \
- if (ofn->nMaxFileTitle) \
- ofn16->lpstrFileTitle = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFileTitle));\
- if (ofn->lpstrInitialDir) \
- ofn16->lpstrInitialDir = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrInitialDir));\
- if (ofn->lpstrTitle) \
- ofn16->lpstrTitle = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrTitle));\
- ofn16->Flags = ofn->Flags|OFN_WINE32|OFN_UNICODE; \
- ofn16->nFileOffset = ofn->nFileOffset; \
- ofn16->nFileExtension = ofn->nFileExtension; \
- if (ofn->lpstrDefExt) \
- ofn16->lpstrDefExt = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrDefExt));\
- ofn16->lCustData = ofn->lCustData; \
- ofn16->lpfnHook = (WNDPROC16)ofn->lpfnHook; \
- if (ofn->lpTemplateName) { \
- ofn16->lpTemplateName = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpTemplateName));\
- } \
- ret = xxx##16(SEGPTR_GET(ofn16)); \
- \
- ofn->nFileOffset = ofn16->nFileOffset; \
- ofn->nFileExtension = ofn16->nFileExtension; \
- if (ofn16->lpstrFilter) \
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFilter)); \
- if (ofn16->lpTemplateName) \
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpTemplateName)); \
- if (ofn16->lpstrDefExt) \
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrDefExt)); \
- if (ofn16->lpstrTitle) \
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrTitle)); \
- if (ofn16->lpstrInitialDir) \
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrInitialDir)); \
- if (ofn16->lpstrCustomFilter) \
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrCustomFilter)); \
- \
- if (ofn16->lpstrFile) { \
- lstrcpyAtoW(ofn->lpstrFile,PTR_SEG_TO_LIN(ofn16->lpstrFile)); \
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFile)); \
- } \
- \
- if (ofn16->lpstrFileTitle) { \
- lstrcpyAtoW(ofn->lpstrFileTitle,PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));\
- SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFileTitle)); \
- } \
- SEGPTR_FREE(ofn16); \
- return ret; \
-}
-
-GET_XXX_FILENAME(GetOpenFileName)
-GET_XXX_FILENAME(GetSaveFileName)
-
/***********************************************************************
- * ChooseFontA (COMDLG32.3)
+ * FormatCharDlgProc32A [internal]
*/
-DWORD WINAPI ChooseFont32A(PCHOOSEFONT32A pChoosefont)
+LRESULT WINAPI FormatCharDlgProc32A(HWND32 hDlg, UINT32 uMsg, WPARAM32 wParam,
+ LPARAM lParam)
{
- FIXME(commdlg,"empty stub!\n");
+ LPCHOOSEFONT32A lpcf;
+ LRESULT res=FALSE;
+ if (uMsg!=WM_INITDIALOG)
+ {
+ lpcf=(LPCHOOSEFONT32A)GetWindowLong32A(hDlg, DWL_USER);
+ if (!lpcf)
+ return FALSE;
+ if (CFn_HookCallChk32(lpcf))
+ res=CallWindowProc32A(lpcf->lpfnHook, hDlg, uMsg, wParam, lParam);
+ if (res)
+ return res;
+ }
+ else
+ {
+ lpcf=(LPCHOOSEFONT32A)lParam;
+ if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf))
+ {
+ TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n");
+ return FALSE;
+ }
+ if (CFn_HookCallChk32(lpcf))
+ return CallWindowProc32A(lpcf->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
+ }
+ switch (uMsg)
+ {
+ case WM_MEASUREITEM:
+ return CFn_WMMeasureItem(hDlg, wParam, lParam);
+ case WM_DRAWITEM:
+ return CFn_WMDrawItem(hDlg, wParam, lParam);
+ case WM_CTLCOLORSTATIC:
+ return CFn_WMCtlColorStatic(hDlg, wParam, lParam, lpcf);
+ case WM_COMMAND:
+ return CFn_WMCommand(hDlg, wParam, lParam, lpcf);
+ case WM_DESTROY:
+ return CFn_WMDestroy(hDlg, wParam, lParam);
+ case WM_CHOOSEFONT_GETLOGFONT:
+ TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
+ lParam);
+ FIXME(commdlg, "current logfont back to caller\n");
+ break;
+ }
+ return res;
+}
- CommDlgLastError = CDERR_DIALOGFAILURE;
- return NULL;
+/***********************************************************************
+ * FormatCharDlgProc32W [internal]
+ */
+LRESULT WINAPI FormatCharDlgProc32W(HWND32 hDlg, UINT32 uMsg, WPARAM32 wParam,
+ LPARAM lParam)
+{
+ LPCHOOSEFONT32W lpcf32w;
+ LPCHOOSEFONT32A lpcf32a;
+ LRESULT res=FALSE;
+ if (uMsg!=WM_INITDIALOG)
+ {
+ lpcf32w=(LPCHOOSEFONT32W)GetWindowLong32A(hDlg, DWL_USER);
+ if (!lpcf32w)
+ return FALSE;
+ if (CFn_HookCallChk32((LPCHOOSEFONT32A)lpcf32w))
+ res=CallWindowProc32W(lpcf32w->lpfnHook, hDlg, uMsg, wParam, lParam);
+ if (res)
+ return res;
+ }
+ else
+ {
+ lpcf32w=(LPCHOOSEFONT32W)lParam;
+ lpcf32a=(LPCHOOSEFONT32A)lpcf32w->lpTemplateName;
+ if (!CFn_WMInitDialog(hDlg, wParam, lParam, lpcf32a))
+ {
+ TRACE(commdlg, "CFn_WMInitDialog returned FALSE\n");
+ return FALSE;
+ }
+ if (CFn_HookCallChk32((LPCHOOSEFONT32A)lpcf32w))
+ return CallWindowProc32W(lpcf32w->lpfnHook,hDlg,WM_INITDIALOG,wParam,lParam);
+ }
+ lpcf32a=(LPCHOOSEFONT32A)lpcf32w->lpTemplateName;
+ switch (uMsg)
+ {
+ case WM_MEASUREITEM:
+ return CFn_WMMeasureItem(hDlg, wParam, lParam);
+ case WM_DRAWITEM:
+ return CFn_WMDrawItem(hDlg, wParam, lParam);
+ case WM_CTLCOLORSTATIC:
+ return CFn_WMCtlColorStatic(hDlg, wParam, lParam, lpcf32a);
+ case WM_COMMAND:
+ return CFn_WMCommand(hDlg, wParam, lParam, lpcf32a);
+ case WM_DESTROY:
+ return CFn_WMDestroy(hDlg, wParam, lParam);
+ case WM_CHOOSEFONT_GETLOGFONT:
+ TRACE(commdlg,"WM_CHOOSEFONT_GETLOGFONT lParam=%08lX\n",
+ lParam);
+ FIXME(commdlg, "current logfont back to caller\n");
+ break;
+ }
+ return res;
+}
+
+
+static BOOL32 Commdlg_GetFileName32A( BOOL16 (*dofunction)(),
+ LPOPENFILENAME32A ofn )
+{
+ BOOL16 ret;
+ LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16));
+
+ memset(ofn16,'\0',sizeof(*ofn16));
+ ofn16->lStructSize = sizeof(*ofn16);
+ ofn16->hwndOwner = ofn->hwndOwner;
+ /* FIXME: OPENFILENAME16 got only 16 bit for HINSTANCE... */
+ ofn16->hInstance = MODULE_HANDLEtoHMODULE16(ofn->hInstance);
+ if (ofn->lpstrFilter) {
+ LPSTR s,x;
+
+ /* filter is a list... title\0ext\0......\0\0 */
+ s = (LPSTR)ofn->lpstrFilter;
+ while (*s)
+ s = s+strlen(s)+1;
+ s++;
+ x = (LPSTR)SEGPTR_ALLOC(s-ofn->lpstrFilter);
+ memcpy(x,ofn->lpstrFilter,s-ofn->lpstrFilter);
+ ofn16->lpstrFilter = SEGPTR_GET(x);
+ }
+ if (ofn->lpstrCustomFilter) {
+ LPSTR s,x;
+
+ /* filter is a list... title\0ext\0......\0\0 */
+ s = (LPSTR)ofn->lpstrCustomFilter;
+ while (*s)
+ s = s+strlen(s)+1;
+ x = SEGPTR_ALLOC(s-ofn->lpstrCustomFilter);
+ s++;
+ memcpy(x,ofn->lpstrCustomFilter,s-ofn->lpstrCustomFilter);
+ ofn16->lpstrCustomFilter = SEGPTR_GET(x);
+ }
+ ofn16->nMaxCustFilter = ofn->nMaxCustFilter;
+ ofn16->nFilterIndex = ofn->nFilterIndex;
+ if (ofn->nMaxFile)
+ ofn16->lpstrFile = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFile));
+ ofn16->nMaxFile = ofn->nMaxFile;
+ ofn16->nMaxFileTitle = ofn->nMaxFileTitle;
+ if (ofn16->nMaxFileTitle)
+ ofn16->lpstrFileTitle = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFileTitle));
+ if (ofn->lpstrInitialDir)
+ ofn16->lpstrInitialDir = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrInitialDir));
+ if (ofn->lpstrTitle)
+ ofn16->lpstrTitle = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrTitle));
+ ofn16->Flags = ofn->Flags|OFN_WINE32;
+ ofn16->nFileOffset = ofn->nFileOffset;
+ ofn16->nFileExtension = ofn->nFileExtension;
+ if (ofn->lpstrDefExt)
+ ofn16->lpstrDefExt = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpstrDefExt));
+ ofn16->lCustData = ofn->lCustData;
+ ofn16->lpfnHook = (WNDPROC16)ofn->lpfnHook;
+
+ if (ofn->lpTemplateName)
+ ofn16->lpTemplateName = SEGPTR_GET(SEGPTR_STRDUP(ofn->lpTemplateName));
+
+ ret = dofunction(SEGPTR_GET(ofn16));
+
+ ofn->nFileOffset = ofn16->nFileOffset;
+ ofn->nFileExtension = ofn16->nFileExtension;
+ if (ofn16->lpstrFilter)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFilter));
+ if (ofn16->lpTemplateName)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpTemplateName));
+ if (ofn16->lpstrDefExt)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrDefExt));
+ if (ofn16->lpstrTitle)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrTitle));
+ if (ofn16->lpstrInitialDir)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrInitialDir));
+ if (ofn16->lpstrCustomFilter)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrCustomFilter));
+
+ if (ofn16->lpstrFile)
+ {
+ strcpy(ofn->lpstrFile,PTR_SEG_TO_LIN(ofn16->lpstrFile));
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFile));
+ }
+
+ if (ofn16->lpstrFileTitle)
+ {
+ strcpy(ofn->lpstrFileTitle,PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));
+ }
+ SEGPTR_FREE(ofn16);
+ return ret;
+}
+
+static BOOL32 Commdlg_GetFileName32W( BOOL16 (*dofunction)(),
+ LPOPENFILENAME32W ofn )
+{
+ BOOL16 ret;
+ LPOPENFILENAME16 ofn16 = SEGPTR_ALLOC(sizeof(OPENFILENAME16));
+
+ memset(ofn16,'\0',sizeof(*ofn16));
+ ofn16->lStructSize = sizeof(*ofn16);
+ ofn16->hwndOwner = ofn->hwndOwner;
+ /* FIXME: OPENFILENAME16 got only 16 bit for HINSTANCE... */
+ ofn16->hInstance = MODULE_HANDLEtoHMODULE16(ofn->hInstance);
+ if (ofn->lpstrFilter) {
+ LPWSTR s;
+ LPSTR x,y;
+ int n;
+
+ /* filter is a list... title\0ext\0......\0\0 */
+ s = (LPWSTR)ofn->lpstrFilter;
+ while (*s)
+ s = s+lstrlen32W(s)+1;
+ s++;
+ n = s - ofn->lpstrFilter; /* already divides by 2. ptr magic */
+ x = y = (LPSTR)SEGPTR_ALLOC(n);
+ s = (LPWSTR)ofn->lpstrFilter;
+ while (*s) {
+ lstrcpyWtoA(x,s);
+ x+=lstrlen32A(x)+1;
+ s+=lstrlen32W(s)+1;
+ }
+ *x=0;
+ ofn16->lpstrFilter = SEGPTR_GET(y);
+}
+ if (ofn->lpstrCustomFilter) {
+ LPWSTR s;
+ LPSTR x,y;
+ int n;
+
+ /* filter is a list... title\0ext\0......\0\0 */
+ s = (LPWSTR)ofn->lpstrCustomFilter;
+ while (*s)
+ s = s+lstrlen32W(s)+1;
+ s++;
+ n = s - ofn->lpstrCustomFilter;
+ x = y = (LPSTR)SEGPTR_ALLOC(n);
+ s = (LPWSTR)ofn->lpstrCustomFilter;
+ while (*s) {
+ lstrcpyWtoA(x,s);
+ x+=lstrlen32A(x)+1;
+ s+=lstrlen32W(s)+1;
+ }
+ *x=0;
+ ofn16->lpstrCustomFilter = SEGPTR_GET(y);
+ }
+ ofn16->nMaxCustFilter = ofn->nMaxCustFilter;
+ ofn16->nFilterIndex = ofn->nFilterIndex;
+ if (ofn->nMaxFile)
+ ofn16->lpstrFile = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFile));
+ ofn16->nMaxFile = ofn->nMaxFile;
+ ofn16->nMaxFileTitle = ofn->nMaxFileTitle;
+ if (ofn->nMaxFileTitle)
+ ofn16->lpstrFileTitle = SEGPTR_GET(SEGPTR_ALLOC(ofn->nMaxFileTitle));
+ if (ofn->lpstrInitialDir)
+ ofn16->lpstrInitialDir = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrInitialDir));
+ if (ofn->lpstrTitle)
+ ofn16->lpstrTitle = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrTitle));
+ ofn16->Flags = ofn->Flags|OFN_WINE32|OFN_UNICODE;
+ ofn16->nFileOffset = ofn->nFileOffset;
+ ofn16->nFileExtension = ofn->nFileExtension;
+ if (ofn->lpstrDefExt)
+ ofn16->lpstrDefExt = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpstrDefExt));
+ ofn16->lCustData = ofn->lCustData;
+ ofn16->lpfnHook = (WNDPROC16)ofn->lpfnHook;
+ if (ofn->lpTemplateName)
+ ofn16->lpTemplateName = SEGPTR_GET(SEGPTR_STRDUP_WtoA(ofn->lpTemplateName));
+ ret = dofunction(SEGPTR_GET(ofn16));
+
+ ofn->nFileOffset = ofn16->nFileOffset;
+ ofn->nFileExtension = ofn16->nFileExtension;
+ if (ofn16->lpstrFilter)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFilter));
+ if (ofn16->lpTemplateName)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpTemplateName));
+ if (ofn16->lpstrDefExt)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrDefExt));
+ if (ofn16->lpstrTitle)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrTitle));
+ if (ofn16->lpstrInitialDir)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrInitialDir));
+ if (ofn16->lpstrCustomFilter)
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrCustomFilter));
+
+ if (ofn16->lpstrFile) {
+ lstrcpyAtoW(ofn->lpstrFile,PTR_SEG_TO_LIN(ofn16->lpstrFile));
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFile));
+ }
+
+ if (ofn16->lpstrFileTitle) {
+ lstrcpyAtoW(ofn->lpstrFileTitle,PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));
+ SEGPTR_FREE(PTR_SEG_TO_LIN(ofn16->lpstrFileTitle));
+ }
+ SEGPTR_FREE(ofn16);
+ return ret;
+}
+
+/***********************************************************************
+ * GetOpenFileName32A (COMDLG32.10)
+ */
+BOOL32 WINAPI GetOpenFileName32A( LPOPENFILENAME32A ofn )
+{
+ BOOL16 (WINAPI * dofunction)(SEGPTR ofn16) = GetOpenFileName16;
+ return Commdlg_GetFileName32A(dofunction,ofn);
+}
+
+/***********************************************************************
+ * GetOpenFileName32W (COMDLG32.11)
+ */
+BOOL32 WINAPI GetOpenFileName32W( LPOPENFILENAME32W ofn )
+{
+ BOOL16 (WINAPI * dofunction)(SEGPTR ofn16) = GetOpenFileName16;
+ return Commdlg_GetFileName32W(dofunction,ofn);
+}
+
+/***********************************************************************
+ * GetSaveFileName32A (COMDLG32.12)
+ */
+BOOL32 WINAPI GetSaveFileName32A( LPOPENFILENAME32A ofn )
+{
+ BOOL16 (WINAPI * dofunction)(SEGPTR ofn16) = GetSaveFileName16;
+ return Commdlg_GetFileName32A(dofunction,ofn);
+}
+
+/***********************************************************************
+ * GetSaveFileName32W (COMDLG32.13)
+ */
+BOOL32 WINAPI GetSaveFileName32W( LPOPENFILENAME32W ofn )
+{
+ BOOL16 (WINAPI * dofunction)(SEGPTR ofn16) = GetSaveFileName16;
+ return Commdlg_GetFileName32W(dofunction,ofn);
}
diff --git a/misc/crtdll.c b/misc/crtdll.c
index 2c00a32..e9f1dd3 100644
--- a/misc/crtdll.c
+++ b/misc/crtdll.c
@@ -67,6 +67,8 @@
UINT32 CRTDLL_winminor_dll; /* CRTDLL.330 */
UINT32 CRTDLL_winver_dll; /* CRTDLL.331 */
+BYTE CRTDLL_iob[32*3]; /* FIXME */
+
typedef VOID (*new_handler_type)(VOID);
static new_handler_type new_handler;
@@ -177,6 +179,21 @@
return (DWORD)file;
}
+static FILE *xlat_file_ptr(void *ptr)
+{
+ unsigned long dif;
+
+ /* CRT sizeof(FILE) == 32 */
+ dif = ((char *)ptr - (char *)CRTDLL_iob) / 32;
+ switch(dif)
+ {
+ case 0: return stdin;
+ case 1: return stdout;
+ case 2: return stderr;
+ }
+ return (FILE*)ptr;
+}
+
/*******************************************************************
* _global_unwind2 (CRTDLL.129)
*/
@@ -246,9 +263,10 @@
/*********************************************************************
* fread (CRTDLL.377)
*/
-DWORD __cdecl CRTDLL_fread(LPVOID ptr, INT32 size, INT32 nmemb, LPVOID file)
+DWORD __cdecl CRTDLL_fread(LPVOID ptr, INT32 size, INT32 nmemb, LPVOID vfile)
{
size_t ret=1;
+ FILE *file=xlat_file_ptr(vfile);
#if 0
int i=0;
void *temp=ptr;
@@ -293,7 +311,7 @@
{
long ret;
- ret=fseek(stream,offset,whence);
+ ret=fseek(xlat_file_ptr(stream),offset,whence);
TRACE(crtdll, "file %p to 0x%08lx pos %s\n",
stream,offset,(whence==SEEK_SET)?"SEEK_SET":
(whence==SEEK_CUR)?"SEEK_CUR":
@@ -311,7 +329,7 @@
{
long ret;
- ret=ftell(stream);
+ ret=ftell(xlat_file_ptr(stream));
TRACE(crtdll, "file %p at 0x%08lx\n",
stream,ret);
return ret;
@@ -320,9 +338,10 @@
/*********************************************************************
* fwrite (CRTDLL.386)
*/
-DWORD __cdecl CRTDLL_fwrite(LPVOID ptr, INT32 size, INT32 nmemb, LPVOID file)
+DWORD __cdecl CRTDLL_fwrite(LPVOID ptr, INT32 size, INT32 nmemb, LPVOID vfile)
{
size_t ret;
+ FILE *file=xlat_file_ptr(vfile);
ret=fwrite(ptr,size,nmemb,file);
TRACE(crtdll, "0x%08x items of size %d from %p to file %p\n",
@@ -342,7 +361,7 @@
/* this doesn't work:"void value not ignored as it ought to be"
return setbuf(file,buf);
*/
- setbuf(file,buf);
+ setbuf(xlat_file_ptr(file),buf);
return 0;
}
@@ -393,7 +412,7 @@
INT32 res;
va_start( valist, format );
- res = vfprintf( file, format, valist );
+ res = vfprintf( xlat_file_ptr(file), format, valist );
va_end( valist );
return res;
}
@@ -403,7 +422,7 @@
*/
INT32 __cdecl CRTDLL_vfprintf( FILE *file, LPSTR format, va_list args )
{
- return vfprintf( file, format, args );
+ return vfprintf( xlat_file_ptr(file), format, args );
}
/*********************************************************************
@@ -511,7 +530,7 @@
{
int ret;
- ret = fflush(stream);
+ ret = fflush(xlat_file_ptr(stream));
TRACE(crtdll,"%p returnd %d\n",stream,ret);
if(ret)
WARN(crtdll, " Failed!\n");
@@ -559,7 +578,7 @@
INT32 __cdecl CRTDLL_fputc( INT32 c, FILE *stream )
{
TRACE(crtdll, "%c to file %p\n",c,stream);
- return fputc(c,stream);
+ return fputc(c,xlat_file_ptr(stream));
}
@@ -569,7 +588,7 @@
INT32 __cdecl CRTDLL_fputs( LPCSTR s, FILE *stream )
{
TRACE(crtdll, "%s to file %p\n",s,stream);
- return fputs(s,stream);
+ return fputs(s,xlat_file_ptr(stream));
}
@@ -589,14 +608,14 @@
INT32 __cdecl CRTDLL_putc(INT32 c, FILE *stream)
{
TRACE(crtdll, " %c to file %p\n",c,stream);
- return fputc(c,stream);
+ return fputc(c,xlat_file_ptr(stream));
}
/*********************************************************************
* fgetc (CRTDLL.366)
*/
INT32 __cdecl CRTDLL_fgetc( FILE *stream )
{
- int ret= fgetc(stream);
+ int ret= fgetc(xlat_file_ptr(stream));
TRACE(crtdll, "got %d\n",ret);
return ret;
}
@@ -607,7 +626,7 @@
*/
INT32 __cdecl CRTDLL_getc( FILE *stream )
{
- int ret= fgetc(stream);
+ int ret= fgetc(xlat_file_ptr(stream));
TRACE(crtdll, "got %d\n",ret);
return ret;
}
@@ -646,7 +665,7 @@
char * ret;
char * control_M;
- ret=fgets(s, size,stream);
+ ret=fgets(s, size,xlat_file_ptr(stream));
/*FIXME: Control with CRTDLL_setmode */
control_M= strrchr(s,'\r');
/*delete CR if we read a DOS File */
@@ -937,10 +956,13 @@
*/
INT32 __cdecl CRTDLL_fclose( FILE *stream )
{
- int unix_handle=fileno(stream);
+ int unix_handle;
HFILE32 dos_handle=1;
HFILE32 ret=EOF;
+ stream=xlat_file_ptr(stream);
+ unix_handle=fileno(stream);
+
if (unix_handle<4) ret= fclose(stream);
else {
while(FILE_GetUnixHandle(dos_handle) != unix_handle) dos_handle++;
@@ -1090,7 +1112,7 @@
{
int ret;
- ret=feof(stream);
+ ret=feof(xlat_file_ptr(stream));
TRACE(crtdll,"(%p) %s\n",stream,(ret)?"true":"false");
return ret;
}
@@ -1686,7 +1708,7 @@
*/
VOID __cdecl CRTDLL_signal(int sig, sig_handler_type ptr)
{
- FIXME(crtdll, "(%d %p): STUB!\n", sig, ptr);
+ FIXME(crtdll, "(%d %p):stub.\n", sig, ptr);
}
/*********************************************************************
diff --git a/misc/ddeml.c b/misc/ddeml.c
index 87b1f84..5d59940 100644
--- a/misc/ddeml.c
+++ b/misc/ddeml.c
@@ -11,40 +11,52 @@
#include "ddeml.h"
#include "debug.h"
+/* FIXME: What are these values? */
+#define DMLERR_NO_ERROR 0
static LONG DDE_current_handle;
-/*****************************************************************
+/******************************************************************************
* DdeInitialize16 (DDEML.2)
*/
UINT16 WINAPI DdeInitialize16( LPDWORD pidInst, PFNCALLBACK16 pfnCallback,
DWORD afCmd, DWORD ulRes)
{
- FIXME( ddeml, "empty stub\n" );
- return 0;
+ return (UINT16)DdeInitialize32A(pidInst,(PFNCALLBACK32)pfnCallback,
+ afCmd, ulRes);
}
-/*****************************************************************
+/******************************************************************************
* DdeInitialize32A (USER32.106)
*/
UINT32 WINAPI DdeInitialize32A( LPDWORD pidInst, PFNCALLBACK32 pfnCallback,
DWORD afCmd, DWORD ulRes )
{
- FIXME( ddeml, "empty stub\n" );
- return 0;
+ return DdeInitialize32W(pidInst,pfnCallback,afCmd,ulRes);
}
-/*****************************************************************
- * DdeInitialize32W (USER32.107)
+/******************************************************************************
+ * DdeInitialize32W [USER32.107]
+ * Registers an application with the DDEML
+ *
+ * PARAMS
+ * pidInst [I] Pointer to instance identifier
+ * pfnCallback [I] Pointer to callback function
+ * afCmd [I] Set of command and filter flags
+ * ulRes [I] Reserved
+ *
+ * RETURNS
+ * Success: DMLERR_NO_ERROR
+ * Failure: DMLERR_DLL_USAGE, DMLERR_INVALIDPARAMETER, DMLERR_SYS_ERROR
*/
UINT32 WINAPI DdeInitialize32W( LPDWORD pidInst, PFNCALLBACK32 pfnCallback,
DWORD afCmd, DWORD ulRes )
{
- FIXME( ddeml, "empty stub\n" );
- return 0;
+ FIXME(ddeml, "(%p,%p,%ld,%ld): stub\n",pidInst,pfnCallback,afCmd,ulRes);
+ return DMLERR_NO_ERROR;
}
@@ -58,24 +70,56 @@
/*****************************************************************
- * DdeUninitialize32 (USER32.119)
+ * DdeUninitialize32 [USER32.119] Frees DDEML resources
+ *
+ * PARAMS
+ * idInst [I] Instance identifier
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
*/
BOOL32 WINAPI DdeUninitialize32( DWORD idInst )
{
- FIXME( ddeml, "empty stub\n" );
+ FIXME(ddeml, "(%ld): stub\n", idInst);
return TRUE;
}
+
/*****************************************************************
- * DdeConnectList (DDEML.4)
+ * DdeConnectList16 [DDEML.4]
*/
-HCONVLIST WINAPI DdeConnectList( DWORD idInst, HSZ hszService, HSZ hszTopic,
- HCONVLIST hConvList, LPCONVCONTEXT16 pCC )
+HCONVLIST WINAPI DdeConnectList16( DWORD idInst, HSZ hszService, HSZ hszTopic,
+ HCONVLIST hConvList, LPCONVCONTEXT16 pCC )
{
- FIXME( ddeml, "empty stub\n" );
- return 0;
+ return DdeConnectList32(idInst, hszService, hszTopic, hConvList,
+ (LPCONVCONTEXT32)pCC);
}
+
+/******************************************************************************
+ * DdeConnectList32 [USER32.93] Establishes conversation with DDE servers
+ *
+ * PARAMS
+ * idInst [I] Instance identifier
+ * hszService [I] Handle to service name string
+ * hszTopic [I] Handle to topic name string
+ * hConvList [I] Handle to conversation list
+ * pCC [I] Pointer to structure with context data
+ *
+ * RETURNS
+ * Success: Handle to new conversation list
+ * Failure: 0
+ */
+HCONVLIST WINAPI DdeConnectList32( DWORD idInst, HSZ hszService, HSZ hszTopic,
+ HCONVLIST hConvList, LPCONVCONTEXT32 pCC )
+{
+ FIXME(ddeml, "(%ld,%ld,%ld,%ld,%p): stub\n", idInst, hszService, hszTopic,
+ hConvList,pCC);
+ return 1;
+}
+
+
/*****************************************************************
* DdeQueryNextServer (DDEML.5)
*/
@@ -88,12 +132,27 @@
/*****************************************************************
* DdeDisconnectList (DDEML.6)
*/
-BOOL16 WINAPI DdeDisconnectList( HCONVLIST hConvList )
+BOOL16 WINAPI DdeDisconnectList16( HCONVLIST hConvList )
{
- FIXME( ddeml, "empty stub\n" );
- return 0;
+ return (BOOL16)DdeDisconnectList32(hConvList);
}
+
+/******************************************************************************
+ * DdeDisconnectList32 [USER32.98] Destroys list and terminates conversations
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
+BOOL32 WINAPI DdeDisconnectList32(
+ HCONVLIST hConvList) /* [in] Handle to conversation list */
+{
+ FIXME(ddeml, "(%ld): stub\n", hConvList);
+ return TRUE;
+}
+
+
/*****************************************************************
* DdeConnect16 (DDEML.7)
*/
@@ -111,7 +170,7 @@
HCONV WINAPI DdeConnect32( DWORD idInst, HSZ hszService, HSZ hszTopic,
LPCONVCONTEXT32 pCC )
{
- FIXME( ddeml, "empty stub\n" );
+ FIXME( ddeml, "(...): stub\n");
return 0;
}
@@ -172,22 +231,29 @@
/*****************************************************************
- * DdeCreateStringHandle32A (USER32.95)
+ * DdeCreateStringHandle32A [USER32.95]
*/
HSZ WINAPI DdeCreateStringHandle32A( DWORD idInst, LPCSTR psz, INT32 codepage )
{
- FIXME( ddeml, "empty stub\n" );
+ FIXME(ddeml, "(...): stub\n" );
DDE_current_handle++;
return DDE_current_handle;
}
-/*****************************************************************
- * DdeCreateStringHandle32W (USER32.96)
+/******************************************************************************
+ * DdeCreateStringHandle32W [USER32.96] Creates handle to identify string
+ *
+ * RETURNS
+ * Success: String handle
+ * Failure: 0
*/
-HSZ WINAPI DdeCreateStringHandle32W( DWORD idInst, LPCWSTR psz, INT32 codepage)
+HSZ WINAPI DdeCreateStringHandle32W(
+ DWORD idInst, /* [in] Instance identifier */
+ LPCWSTR psz, /* [in] Pointer to string */
+ INT32 codepage) /* [in] Code page identifier */
{
- FIXME( ddeml, "empty stub\n" );
+ FIXME(ddeml, "(%ld,%s,%d): stub\n",idInst,debugstr_w(psz),codepage);
DDE_current_handle++;
return DDE_current_handle;
}
@@ -285,15 +351,33 @@
return 0;
}
+
/*****************************************************************
- * DdePostAdvise (DDEML.13)
+ * DdePostAdvise16 [DDEML.13]
*/
-BOOL16 WINAPI DdePostAdvise( DWORD idInst, HSZ hszTopic, HSZ hszItem )
+BOOL16 WINAPI DdePostAdvise16( DWORD idInst, HSZ hszTopic, HSZ hszItem )
{
- FIXME( ddeml, "empty stub\n" );
- return 0;
+ return (BOOL16)DdePostAdvise32(idInst, hszTopic, hszItem);
}
+
+/******************************************************************************
+ * DdePostAdvise32 [USER32.110] Send transaction to DDE callback function.
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
+BOOL32 WINAPI DdePostAdvise32(
+ DWORD idInst, /* [in] Instance identifier */
+ HSZ hszTopic, /* [in] Handle to topic name string */
+ HSZ hszItem) /* [in] Handle to item name string */
+{
+ FIXME(ddeml, "(%ld,%ld,%ld): stub\n",idInst,hszTopic,hszItem);
+ return TRUE;
+}
+
+
/*****************************************************************
* DdeAddData (DDEML.15)
*/
@@ -304,16 +388,37 @@
return 0;
}
-/*****************************************************************
- * DdeGetData (DDEML.16)
+
+/******************************************************************************
+ * DdeGetData32 [USER32.102] Copies data from DDE object ot local buffer
+ *
+ * RETURNS
+ * Size of memory object associated with handle
*/
-DWORD WINAPI DdeGetData( HDDEDATA hData, LPBYTE pDst, DWORD cbMax,
- DWORD cbOff )
+DWORD WINAPI DdeGetData32(
+ HDDEDATA hData, /* [in] Handle to DDE object */
+ LPBYTE pDst, /* [in] Pointer to destination buffer */
+ DWORD cbMax, /* [in] Amount of data to copy */
+ DWORD cbOff) /* [in] Offset to beginning of data */
{
- FIXME( ddeml, "empty stub\n" );
- return 0;
+ FIXME(ddeml, "(%ld,%p,%ld,%ld): stub\n",hData,pDst,cbMax,cbOff);
+ return cbMax;
}
+
+/*****************************************************************
+ * DdeGetData16 [DDEML.16]
+ */
+DWORD WINAPI DdeGetData16(
+ HDDEDATA hData,
+ LPBYTE pDst,
+ DWORD cbMax,
+ DWORD cbOff)
+{
+ return DdeGetData32(hData, pDst, cbMax, cbOff);
+}
+
+
/*****************************************************************
* DdeAccessData (DDEML.17)
*/
@@ -351,14 +456,24 @@
}
-/*****************************************************************
- * DdeNameService32 (USER32.109)
+/******************************************************************************
+ * DdeNameService32 [USER32.109] {Un}registers service name of DDE server
+ *
+ * PARAMS
+ * idInst [I] Instance identifier
+ * hsz1 [I] Handle to service name string
+ * hsz2 [I] Reserved
+ * afCmd [I] Service name flags
+ *
+ * RETURNS
+ * Success: Non-zero
+ * Failure: 0
*/
HDDEDATA WINAPI DdeNameService32( DWORD idInst, HSZ hsz1, HSZ hsz2,
- UINT32 afCmd )
+ UINT32 afCmd )
{
- FIXME( ddeml, "empty stub\n" );
- return 0;
+ FIXME(ddeml, "(%ld,%ld,%ld,%d): stub\n",idInst,hsz1,hsz2,afCmd);
+ return 1;
}
@@ -371,15 +486,22 @@
}
-/*****************************************************************
- * DdeGetLastError32 (USER32.103)
+/******************************************************************************
+ * DdeGetLastError32 [USER32.103] Gets most recent error code
+ *
+ * PARAMS
+ * idInst [I] Instance identifier
+ *
+ * RETURNS
+ * Last error code
*/
UINT32 WINAPI DdeGetLastError32( DWORD idInst )
{
- FIXME( ddeml, "empty stub\n" );
+ FIXME(ddeml, "(%ld): stub\n",idInst);
return 0;
}
+
/*****************************************************************
* DdeCmpStringHandles (DDEML.36)
*/
diff --git a/misc/error.c b/misc/error.c
index 3a36237..4ae65a7 100644
--- a/misc/error.c
+++ b/misc/error.c
@@ -140,8 +140,7 @@
*/
VOID WINAPI LogError(UINT16 uErr, LPVOID lpvInfo)
{
- fprintf(stddeb, "LogError(%s, %p)\n",
- GetErrorString(uErr), lpvInfo);
+ MSG("(%s, %p)\n", GetErrorString(uErr), lpvInfo);
}
@@ -153,6 +152,5 @@
/* FIXME: is it possible to get the module name/function
* from the lpfn param?
*/
- fprintf(stddeb, "LogParamError(%s, %p, %p)\n",
- GetParamErrorString(uErr), lpfn, lpvParam);
+ MSG("(%s, %p, %p)\n", GetParamErrorString(uErr), lpfn, lpvParam);
}
diff --git a/misc/imagelist.c b/misc/imagelist.c
index 474de9e..17f6d2c 100644
--- a/misc/imagelist.c
+++ b/misc/imagelist.c
@@ -1452,9 +1452,9 @@
/* create new bitmap(s) */
cxNew = (himl->cCurImage + himl->cGrow - 1) * himl->cx;
- fprintf (stderr, " - Number of images: %d / %d (Old/New)\n",
+ TRACE(imagelist, " - Number of images: %d / %d (Old/New)\n",
himl->cCurImage, himl->cCurImage - 1);
- fprintf (stderr, " - Max. number of images: %d / %d (Old/New)\n",
+ TRACE(imagelist, " - Max. number of images: %d / %d (Old/New)\n",
himl->cMaxImage, himl->cCurImage + himl->cGrow - 1);
hbmNewImage =
diff --git a/misc/lstr.c b/misc/lstr.c
index 05b7fb3..98d8748 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -159,7 +159,7 @@
*p = '\0';
if ((p > buffer) && (p[-1] == '\n')) p[1] = '\0'; /* Remove trailing \n */
module = MODULE_GetModuleName( GetCurrentTask() );
- fprintf( stderr, "OutputDebugString: %s says '%s'\n",
+ TRACE(resource, "%s says '%s'\n",
module ? module : "???", buffer );
HeapFree( GetProcessHeap(), 0, buffer );
}
@@ -646,8 +646,18 @@
}
*t='\0';
}
- if (!nolinefeed && t[-1]!='\n')
- ADD_TO_T('\n');
+ if (nolinefeed) {
+ /* remove linefeed */
+ if(t>target && t[-1]=='\n') {
+ *--t=0;
+ if(t>target && t[-1]=='\r')
+ *--t=0;
+ }
+ } else {
+ /* add linefeed */
+ if(t==target || t[-1]!='\n')
+ ADD_TO_T('\n'); /* FIXME: perhaps add \r too? */
+ }
talloced = strlen(target)+1;
if (nSize && talloced<nSize) {
target = (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,nSize);
@@ -816,8 +826,18 @@
}
*t='\0';
}
- if (!nolinefeed && t[-1]!='\n')
- ADD_TO_T('\n');
+ if (nolinefeed) {
+ /* remove linefeed */
+ if(t>target && t[-1]=='\n') {
+ *--t=0;
+ if(t>target && t[-1]=='\r')
+ *--t=0;
+ }
+ } else {
+ /* add linefeed */
+ if(t==target || t[-1]!='\n')
+ ADD_TO_T('\n'); /* FIXME: perhaps add \r too? */
+ }
talloced = strlen(target)+1;
if (nSize && talloced<nSize)
target = (char*)HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,target,nSize);
diff --git a/misc/lzexpand.c b/misc/lzexpand.c
index 7440e9d..dcf6675 100644
--- a/misc/lzexpand.c
+++ b/misc/lzexpand.c
@@ -248,7 +248,7 @@
/* now mangle the basename */
if (!*s) {
/* FIXME: hmm. shouldn't happen? */
- fprintf(stddeb,__FILE__":GetExpandedFileName(), specified a directory or what? (%s)\n",in);
+ WARN(file,"Specified a directory or what? (%s)\n",in);
_lclose32(fd);
return 1;
}
diff --git a/misc/main.c b/misc/main.c
index 1d843ec..eea58b9 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -146,7 +146,7 @@
*/
void MAIN_Usage( char *name )
{
- fprintf( stderr, USAGE, name );
+ MSG( USAGE, name );
exit(1);
}
@@ -281,9 +281,9 @@
}
Options.language++;
}
- fprintf( stderr, "Invalid language specified '%s'. Supported languages are: ", arg );
- for (p = Languages; p->name; p++) fprintf( stderr, "%s ", p->name );
- fprintf( stderr, "\n" );
+ MSG( "Invalid language specified '%s'. Supported languages are: ", arg );
+ for (p = Languages; p->name; p++) MSG( "%s ", p->name );
+ MSG( "\n" );
exit(1);
}
@@ -299,8 +299,8 @@
else if (!lstrcmpi32A("standard", arg)) Options.mode = MODE_STANDARD;
else
{
- fprintf(stderr, "Invalid mode '%s' specified.\n", arg);
- fprintf(stderr, "Valid modes are: 'standard', 'enhanced' (default).\n");
+ MSG( "Invalid mode '%s' specified.\n", arg);
+ MSG( "Valid modes are: 'standard', 'enhanced' (default).\n");
exit(1);
}
}
@@ -339,7 +339,7 @@
if (!(display = TSXOpenDisplay( display_name )))
{
- fprintf( stderr, "%s: Can't open display: %s\n",
+ MSG( "%s: Can't open display: %s\n",
argv[0], display_name ? display_name : "(none specified)" );
exit(1);
}
@@ -387,7 +387,7 @@
if (MAIN_GetResource( db, ".debugmsg", &value))
{
#ifndef DEBUG_RUNTIME
- fprintf(stderr,"%s: Option \"-debugmsg\" not implemented.\n" \
+ MSG("%s: Option \"-debugmsg\" not implemented.\n" \
" Recompile with DEBUG_RUNTIME in include/debugtools.h defined.\n",
argv[0]);
exit(1);
@@ -395,23 +395,23 @@
if (ParseDebugOptions((char*)value.addr)==FALSE)
{
int i;
- fprintf(stderr,"%s: Syntax: -debugmsg [class]+xxx,... or "
+ MSG("%s: Syntax: -debugmsg [class]+xxx,... or "
"-debugmsg [class]-xxx,...\n",argv[0]);
- fprintf(stderr,"Example: -debugmsg +all,warn-heap"
+ MSG("Example: -debugmsg +all,warn-heap"
"turn on all messages except warning heap messages\n");
- fprintf(stderr,"Available message classes:\n");
+ MSG("Available message classes:\n");
for(i=0;i<DEBUG_CLASS_COUNT;i++)
- fprintf(stderr, "%-9s", debug_cl_name[i]);
- fprintf(stderr,"\n\n");
+ MSG( "%-9s", debug_cl_name[i]);
+ MSG("\n\n");
- fprintf(stderr,"Available message types:\n");
- fprintf(stderr,"%-9s ","all");
+ MSG("Available message types:\n");
+ MSG("%-9s ","all");
for(i=0;i<DEBUG_CHANNEL_COUNT;i++)
if(debug_ch_name[i])
- fprintf(stderr,"%-9s%c",debug_ch_name[i],
+ MSG("%-9s%c",debug_ch_name[i],
(((i+2)%8==0)?'\n':' '));
- fprintf(stderr,"\n\n");
+ MSG("\n\n");
exit(1);
}
#endif
@@ -424,7 +424,7 @@
if (!__winelib) Options.dllFlags = xstrdup((char *)value.addr);
else
{
- fprintf( stderr, "-dll not supported in Winelib\n" );
+ MSG("-dll not supported in Winelib\n" );
exit(1);
}
}
@@ -472,7 +472,7 @@
class_hints = TSXAllocClassHint();
if (!size_hints || !wm_hints || !class_hints)
{
- fprintf( stderr, "Not enough memory for window manager hints.\n" );
+ MSG("Not enough memory for window manager hints.\n" );
exit(1);
}
size_hints->min_width = size_hints->max_width = width;
@@ -557,11 +557,11 @@
mcheck(NULL);
if (!(trace = getenv("MALLOC_TRACE")))
{
- fprintf( stderr, "MALLOC_TRACE not set. No trace generated\n" );
+ MSG( "MALLOC_TRACE not set. No trace generated\n" );
}
else
{
- fprintf( stderr, "malloc trace goes to %s\n", trace );
+ MSG( "malloc trace goes to %s\n", trace );
mtrace();
}
#endif
@@ -584,7 +584,7 @@
if (Options.desktopGeometry && Options.managed)
{
- fprintf( stderr, "%s: -managed and -desktop options cannot be used together\n",
+ MSG( "%s: -managed and -desktop options cannot be used together\n",
Options.programName );
exit(1);
}
@@ -600,7 +600,7 @@
TSXFree( depth_list );
if (i >= depth_count)
{
- fprintf( stderr, "%s: Depth %d not supported on this screen.\n",
+ MSG( "%s: Depth %d not supported on this screen.\n",
Options.programName, screenDepth );
exit(1);
}
@@ -796,7 +796,7 @@
LPANIMATIONINFO lpAnimInfo = (LPANIMATIONINFO)lpvParam;
/* Do nothing */
- fprintf(stderr, "SystemParametersInfo: SPI_SETANIMATION ignored.\n");
+ WARN(system, "SPI_SETANIMATION ignored.\n");
lpAnimInfo->cbSize = sizeof(ANIMATIONINFO);
uParam = sizeof(ANIMATIONINFO);
break;
@@ -982,7 +982,7 @@
case SPI_SETKEYBOARDDELAY:
case SPI_SETKEYBOARDSPEED:
case SPI_GETHIGHCONTRAST:
- fprintf(stderr, "SystemParametersInfo: option %d ignored.\n", uAction);
+ WARN(system, "Option %d ignored.\n", uAction);
break;
case SPI_GETWORKAREA:
@@ -992,7 +992,7 @@
break;
default:
- fprintf(stderr, "SystemParametersInfo: unknown option %d.\n", uAction);
+ WARN(system, "Unknown option %d.\n", uAction);
break;
}
return 1;
diff --git a/misc/mpr.c b/misc/mpr.c
deleted file mode 100644
index dce6dc1..0000000
--- a/misc/mpr.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* MPR.dll
- *
- * Copyright 1996 Marcus Meissner
- */
-
-#include <stdio.h>
-#include "win.h"
-#include "debug.h"
-#include "wnet.h"
-
-
-/**************************************************************************
- * WNetCachePassword [MPR.52] Saves password in cache
- *
- * RETURNS
- * Success: WN_SUCCESS
- * Failure: WNACCESS_DENIED, WN_BAD_PASSWORD, WN_BADVALUE, WN_NET_ERROR,
- * WN_NOT_SUPPORTED, WN_OUT_OF_MEMORY
- */
-DWORD WINAPI WNetCachePassword(
- LPSTR pbResource, /* [in] Name of workgroup, computer, or resource */
- WORD cbResource, /* [in] Size of name */
- LPSTR pbPassword, /* [in] Buffer containing password */
- WORD cbPassword, /* [in] Size of password */
- BYTE nType) /* [in] Type of password to cache */
-{
- FIXME(mpr,"(%s,%d,%s,%d,%d): stub\n", pbResource,cbResource,
- pbPassword,cbPassword,nType);
- return WN_SUCCESS;
-}
-
-
-/**************************************************************************
- * WNetGetCachedPassword [MPR.???] Retrieves password from cache
- *
- * RETURNS
- * Success: WN_SUCCESS
- * Failure: WNACCESS_DENIED, WN_BAD_PASSWORD, WN_BAD_VALUE, WN_NET_ERROR,
- * WN_NOT_SUPPORTED, WN_OUT_OF_MEMORY
- */
-DWORD WINAPI WNetGetCachedPassword(
- LPSTR pbResource, /* [in] Name of workgroup, computer, or resource */
- WORD cbResource, /* [in] Size of name */
- LPSTR pbPassword, /* [out] Buffer to receive password */
- LPWORD pcbPassword, /* [out] Receives size of password */
- BYTE nType) /* [in] Type of password to retrieve */
-{
- FIXME(mpr,"(%s,%d,%p,%d,%d): stub\n",
- pbResource,cbResource,pbPassword,*pcbPassword,nType);
- return WN_ACCESS_DENIED;
-}
-
-
-/**************************************************************************
- * MultinetGetConnectionPerformance32A [MPR.???]
- *
- * RETURNS
- * Success: NO_ERROR
- * Failure: ERROR_NOT_SUPPORTED, ERROR_NOT_CONNECTED,
- * ERROR_NO_NET_OR_BAD_PATH, ERROR_BAD_DEVICE,
- * ERROR_BAD_NET_NAME, ERROR_INVALID_PARAMETER,
- * ERROR_NO_NETWORK, ERROR_EXTENDED_ERROR
- */
-DWORD WINAPI MultinetGetConnectionPerformance32A(
- LPNETRESOURCE32A lpNetResource, /* [in] Specifies resource */
- LPNETCONNECTINFOSTRUCT lpNetConnectInfoStruct) /* [in] Pointer to struct */
-{
- FIXME(mpr,"(%p,%p): stub\n",lpNetResource,lpNetConnectInfoStruct);
- return WN_NOT_SUPPORTED;
-}
-
diff --git a/misc/network.c b/misc/network.c
index 7af8b4c..1df5a1c 100644
--- a/misc/network.c
+++ b/misc/network.c
@@ -1,5 +1,9 @@
/*
* Network functions
+ *
+ * This is the MPR.DLL stuff from Win32, as well as the USER
+ * stuff by the same names in Win 3.x.
+ *
*/
#include <ctype.h>
@@ -10,9 +14,114 @@
#include "drive.h"
#include "wnet.h"
#include "debug.h"
+#include "win.h"
+
+/********************************************************************
+ * WNetAddConnection16 [USER.517] Directs a local device to net
+ *
+ * Redirects a local device (either a disk drive or printer port)
+ * to a shared device on a remote server.
+ */
+UINT16 WINAPI WNetAddConnection16(LPSTR lpNetPath, LPSTR lpPassWord,
+ LPSTR lpLocalName)
+{
+ return WNetAddConnection32A(lpNetPath, lpPassWord, lpLocalName);
+}
+
+/* [MPR.50] */
+
+UINT32 WNetAddConnection32A(LPSTR NetPath, LPSTR PassWord,
+ LPSTR LocalName)
+{
+ FIXME(wnet, "('%s', %p, '%s'): stub\n",
+ NetPath, PassWord, LocalName);
+ return WN_NO_NETWORK;
+}
+
+/* [MPR.51] */
+
+UINT32 WNetAddConnection32W(LPWSTR NetPath,
+ LPWSTR PassWord,
+ LPWSTR LocalName)
+{
+ FIXME(wnet, " stub!\n");
+ return WN_NO_NETWORK;
+}
+
+/* ****************************************************************
+ * WNetAddConnection2_32A [MPR.46]
+ */
+
+UINT32
+WNetAddConnection2_32A(LPNETRESOURCE32A netresource, /* [in] */
+ LPCSTR password, /* [in] */
+ LPCSTR username, /* [in] */
+ DWORD flags /* [in] */ )
+{
+ FIXME(wnet, "(%p,%s,%s,0x%08lx), stub!\n", netresource,
+ password, username, (unsigned long) flags);
+ SetLastError(WN_NO_NETWORK);
+ return WN_NO_NETWORK;
+}
+
+/* ****************************************************************
+ * WNetAddConnection2W [MPR.47]
+ */
+
+UINT32
+WNetAddConnection2_32W(LPNETRESOURCE32W netresource, /* [in] */
+ LPCWSTR password, /* [in] */
+ LPCWSTR username, /* [in] */
+ DWORD flags /* [in] */ )
+{
+ FIXME(wnet, ", stub!\n");
+ SetLastError(WN_NO_NETWORK);
+ return WN_NO_NETWORK;
+}
+
+/* ****************************************************************
+ * WNetAddConnection3_32A [MPR.48]
+ */
+
+UINT32 WNetAddConnection3_32A(HWND32 owner,
+ LPNETRESOURCE32A netresource,
+ LPCSTR password,
+ LPCSTR username,
+ DWORD flags)
+{
+ TRACE(wnet, "owner = 0x%x\n", owner);
+ return WNetAddConnection2_32A(netresource,
+ password, username, flags);
+}
+
+/* ****************************************************************
+ * WNetAddConnection3W [MPR.49]
+ */
+
+UINT32 WNetAddConnection3_32W(HWND32 owner,
+ LPNETRESOURCE32W netresource,
+ LPCWSTR username,
+ LPCWSTR password,
+ DWORD flags)
+{
+ TRACE(wnet,"owner = 0x%x\n", owner);
+ return WNetAddConnection2_32W(netresource, username, password,
+ flags);
+}
+
+
+/********************************************************************
+ * WNetCancelConnection [USER.518] undirects a local device
+ */
+UINT16 WINAPI WNetCancelConnection(LPSTR lpName, BOOL16 bForce)
+{
+ FIXME(wnet, "('%s', %04X): stub\n", lpName, bForce);
+ return WN_NO_NETWORK;
+}
+
/**************************************************************************
- * WNetErrorText [USER.499]
+ * WNetErrorText16 [USER.499]
*/
int WINAPI WNetErrorText(WORD nError,LPSTR lpszText,WORD cbText)
{
@@ -21,7 +130,7 @@
}
/**************************************************************************
- * WNetOpenJob [USER.501]
+ * WNetOpenJob16 [USER.501]
*/
int WINAPI WNetOpenJob(LPSTR szQueue,LPSTR szJobTitle,WORD nCopies,LPWORD pfh)
{
@@ -120,8 +229,15 @@
return WN_NET_ERROR;
}
-/**************************************************************************
- * WNetGetConnection [USER.512]
+
+/********************************************************************
+ * WNetGetConnection16 [USER.512] reverse-resolves a local device
+ *
+ * RETURNS
+ * - WN_BAD_LOCALNAME lpLocalName makes no sense
+ * - WN_NOT_CONNECTED drive is a local drive
+ * - WN_MORE_DATA buffer isn't big enough
+ * - WN_SUCCESS success (net path in buffer)
*/
int WINAPI WNetGetConnection16(LPCSTR lpLocalName,
LPSTR lpRemoteName, UINT16 *cbRemoteName)
@@ -155,6 +271,19 @@
}
/**************************************************************************
+ * WNetGetConnectionA [MPR.70]
+ */
+DWORD WINAPI
+WNetGetConnection32A(LPCSTR localname,LPSTR remotename,LPDWORD buflen)
+{
+ UINT16 x;
+ DWORD ret = WNetGetConnection16(localname,remotename,&x);
+ *buflen = x;
+ return ret;
+}
+
+
+/**************************************************************************
* WNetGetCaps [USER.513]
*/
int WINAPI WNetGetCaps(WORD capability)
@@ -255,27 +384,6 @@
}
/**************************************************************************
- * WNetAddConnection [USER.517]
- */
-UINT16 WINAPI WNetAddConnection(LPSTR lpNetPath, LPSTR lpPassWord,
- LPSTR lpLocalName)
-{
- FIXME(wnet, "('%s', %p, '%s'): stub\n",
- lpNetPath,lpPassWord,lpLocalName);
- return WN_NO_NETWORK;
-}
-
-
-/**************************************************************************
- * WNetCancelConnection [USER.518]
- */
-UINT16 WINAPI WNetCancelConnection(LPSTR lpName, BOOL16 bForce)
-{
- FIXME(wnet, "('%s', %04X): stub\n", lpName, bForce);
- return WN_NO_NETWORK;
-}
-
-/**************************************************************************
* WNetGetError [USER.519]
*/
int WINAPI WNetGetError(LPWORD nError)
@@ -311,8 +419,8 @@
return WN_NO_NETWORK;
}
-/**************************************************************************
- * WnetConnectDialog [USER.525]
+/********************************************************************
+ * WNetConnectDialog [USER.525]
*/
UINT16 WINAPI WNetConnectDialog(HWND16 hWndParent, WORD iType)
{
@@ -338,6 +446,8 @@
return WN_SUCCESS;
}
+
+
/**************************************************************************
* WNetViewQueueDialog [USER.528]
*/
@@ -358,15 +468,30 @@
return WN_NO_NETWORK;
}
-/**************************************************************************
- * WNetGetDirectoryType [USER.530]
+/*********************************************************************
+ * WNetGetDirectoryType [USER.530] Decides whether resource is local
+ *
+ * RETURNS
+ * on success, puts one of the following in *lpType:
+ * - WNDT_NETWORK on a network
+ * - WNDT_LOCAL local
*/
-int WINAPI WNetGetDirectoryType(LPSTR lpName,void *lpType)
+int WINAPI WNetGetDirectoryType16(LPSTR lpName, LPINT16 lpType)
{
FIXME(wnet, "('%s',%p): stub\n",lpName,lpType);
+ *lpType = 0;
return WN_NO_NETWORK;
}
+/*****************************************************************
+ * WNetGetDirectoryTypeA [MPR.109]
+ */
+
+UINT32 WINAPI WNetGetDirectoryType32A(LPSTR lpName,void *lpType)
+{
+ return WNetGetDirectoryType16(lpName, lpType);
+}
+
/**************************************************************************
* WNetDirectoryNotify [USER.531]
*/
@@ -387,16 +512,6 @@
return WN_NO_NETWORK;
}
-/**************************************************************************
- * WNetAddConnection2 [USER.???]
- */
-UINT16 WINAPI WNetAddConnection2(LPSTR lpNetPath, LPSTR lpPassWord,
- LPSTR lpLocalName, LPSTR lpUserName)
-{
- FIXME(wnet, "('%s', %p, '%s', '%s'): stub\n",
- lpNetPath, lpPassWord, lpLocalName, lpUserName);
- return WN_NO_NETWORK;
-}
/**************************************************************************
* WNetCloseEnum [USER.???]
@@ -440,17 +555,9 @@
return WN_NO_NETWORK;
}
-/**************************************************************************
- * WNetGetConnectionA [MPR.92]
- */
-DWORD WINAPI
-WNetGetConnection32A(LPCSTR localname,LPSTR remotename,LPDWORD buflen)
-{
- UINT16 x;
- DWORD ret = WNetGetConnection16(localname,remotename,&x);
- *buflen = x;
- return ret;
-}
+/* ****************************************************************
+ * WNetGetResourceInformationA [MPR.80]
+ * */
DWORD WINAPI
WNetGetResourceInformation32A(
@@ -459,3 +566,63 @@
FIXME(wnet,"(%p,%p,%p,%p): stub!\n",netres,buf,buflen,systemstr);
return WN_NO_NETWORK;
}
+
+/**************************************************************************
+ * WNetCachePassword [MPR.52] Saves password in cache
+ *
+ * RETURNS
+ * Success: WN_SUCCESS
+ * Failure: WNACCESS_DENIED, WN_BAD_PASSWORD, WN_BADVALUE, WN_NET_ERROR,
+ * WN_NOT_SUPPORTED, WN_OUT_OF_MEMORY
+ */
+DWORD WINAPI WNetCachePassword(
+ LPSTR pbResource, /* [in] Name of workgroup, computer, or resource */
+ WORD cbResource, /* [in] Size of name */
+ LPSTR pbPassword, /* [in] Buffer containing password */
+ WORD cbPassword, /* [in] Size of password */
+ BYTE nType) /* [in] Type of password to cache */
+{
+ FIXME(mpr,"(%s,%d,%s,%d,%d): stub\n", pbResource,cbResource,
+ pbPassword,cbPassword,nType);
+ return WN_SUCCESS;
+}
+
+
+
+/*****************************************************************
+ * WNetGetCachedPassword [MPR.69] Retrieves password from cache
+ *
+ * RETURNS
+ * Success: WN_SUCCESS
+ * Failure: WNACCESS_DENIED, WN_BAD_PASSWORD, WN_BAD_VALUE,
+ * WN_NET_ERROR, WN_NOT_SUPPORTED, WN_OUT_OF_MEMORY
+ */
+DWORD WINAPI WNetGetCachedPassword(
+ LPSTR pbResource, /* [in] Name of workgroup, computer, or resource */
+ WORD cbResource, /* [in] Size of name */
+ LPSTR pbPassword, /* [out] Buffer to receive password */
+ LPWORD pcbPassword, /* [out] Receives size of password */
+ BYTE nType) /* [in] Type of password to retrieve */
+{
+ FIXME(mpr,"(%s,%d,%p,%d,%d): stub\n",
+ pbResource,cbResource,pbPassword,*pcbPassword,nType);
+ return WN_ACCESS_DENIED;
+}
+
+/* ****************************************************************
+ * MultinetGetConnectionPerformanceA [MPR.25]
+ *
+ * RETURNS
+ * Success: NO_ERROR
+ * Failure: ERROR_NOT_SUPPORTED, ERROR_NOT_CONNECTED,
+ * ERROR_NO_NET_OR_BAD_PATH, ERROR_BAD_DEVICE,
+ * ERROR_BAD_NET_NAME, ERROR_INVALID_PARAMETER,
+ * ERROR_NO_NETWORK, ERROR_EXTENDED_ERROR
+ */
+DWORD WINAPI MultinetGetConnectionPerformance32A(
+ LPNETRESOURCE32A lpNetResource,
+ LPNETCONNECTINFOSTRUCT lpNetConnectInfoStruct
+) {
+ FIXME(mpr,"(%p,%p): stub\n",lpNetResource,lpNetConnectInfoStruct);
+ return 1;
+}
diff --git a/misc/ntdll.c b/misc/ntdll.c
index e52e201..7744f95 100644
--- a/misc/ntdll.c
+++ b/misc/ntdll.c
@@ -36,8 +36,11 @@
/**************************************************************************
* RtlCreateAcl [NTDLL]
+ *
+ * NOTES
+ * This should return NTSTATUS
*/
-DWORD /* NTSTATUS */ WINAPI RtlCreateAcl(LPACL acl,DWORD size,DWORD rev)
+DWORD WINAPI RtlCreateAcl(LPACL acl,DWORD size,DWORD rev)
{
if (rev!=ACL_REVISION)
return STATUS_INVALID_PARAMETER;
diff --git a/misc/printdrv.c b/misc/printdrv.c
index 2466010..7389ed3 100644
--- a/misc/printdrv.c
+++ b/misc/printdrv.c
@@ -39,16 +39,16 @@
LPDWORD lpType, LPBYTE lpPrinterData,
int cbData, LPDWORD lpNeeded)
{
- fprintf(stderr,"In DrvGetPrinterData ");
+ FIXME(print, "stub.\n");
if (HIWORD(lpPrinter))
- fprintf(stderr,"printer %s ",lpPrinter);
+ TRACE(print,"printer %s\n",lpPrinter);
else
- fprintf(stderr,"printer %p ",lpPrinter);
+ TRACE(print,"printer %p\n",lpPrinter);
if (HIWORD(lpProfile))
- fprintf(stderr,"profile %s ",lpProfile);
+ TRACE(print,"profile %s\n",lpProfile);
else
- fprintf(stderr,"profile %p ",lpProfile);
- fprintf(stderr,"lpType %p\n",lpType);
+ TRACE(print,"profile %p\n",lpProfile);
+ TRACE(print,"lpType %p\n",lpType);
return 0;
}
@@ -58,16 +58,16 @@
LPDWORD lpType, LPBYTE lpPrinterData,
DWORD dwSize)
{
- fprintf(stderr,"In DrvSetPrinterData ");
+ FIXME(print, "stub.\n");
if (HIWORD(lpPrinter))
- fprintf(stderr,"printer %s ",lpPrinter);
+ TRACE(print,"printer %s\n",lpPrinter);
else
- fprintf(stderr,"printer %p ",lpPrinter);
+ TRACE(print,"printer %p\n",lpPrinter);
if (HIWORD(lpProfile))
- fprintf(stderr,"profile %s ",lpProfile);
+ TRACE(print,"profile %s\n",lpProfile);
else
- fprintf(stderr,"profile %p ",lpProfile);
- fprintf(stderr,"lpType %p\n",lpType);
+ TRACE(print,"profile %p\n",lpProfile);
+ TRACE(print,"lpType %p\n",lpType);
return 0;
}
@@ -75,7 +75,7 @@
INT32 WINAPI DeviceCapabilities32A(LPCSTR printer,LPCSTR target,WORD z,
LPSTR a,LPDEVMODE32A b)
{
- fprintf(stderr,"DeviceCapabilitiesA(%s,%s,%d,%p,%p)\n",printer,target,z,a,b);
+ FIXME(print,"(%s,%s,%d,%p,%p):stub.\n",printer,target,z,a,b);
return 1;
}
@@ -83,7 +83,7 @@
LPSTR pDeviceName, LPDEVMODE32A pDevModeOutput,
LPDEVMODE32A pDevModeInput,DWORD fMode )
{
- fprintf(stderr,"DocumentPropertiesA(%d,%d,%s,%p,%p,%ld)\n",
+ FIXME(print,"(%d,%d,%s,%p,%p,%ld):stub.\n",
hWnd,hPrinter,pDeviceName,pDevModeOutput,pDevModeInput,fMode
);
return 1;
@@ -92,7 +92,7 @@
BOOL32 WINAPI OpenPrinter32A(LPSTR lpPrinterName,HANDLE32 *phPrinter,
LPPRINTER_DEFAULTS32A pDefault)
{
- fprintf(stderr,"OpenPrinter32A(%s,%p,%p), stub\n",
+ FIXME(print,"(%s,%p,%p):stub.\n",
lpPrinterName, phPrinter, pDefault);
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return FALSE;
@@ -102,7 +102,7 @@
DWORD cbBuf, LPDWORD lpdwNeeded,
LPDWORD lpdwReturned)
{
- fprintf(stderr,"EnumPrinters32A nearly empty stub\n");
+ FIXME(print,"Nearly empty stub\n");
*lpdwReturned=0;
return TRUE;
}
diff --git a/misc/registry.c b/misc/registry.c
index b73c7f5..537c4ed 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -250,7 +250,7 @@
ADD_ROOT_KEY(key_local_machine);
if (RegCreateKey16(HKEY_LOCAL_MACHINE,"\\SOFTWARE\\Classes",&cl_r_hkey)!=ERROR_SUCCESS) {
- fprintf(stderr,"couldn't create HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes. This is impossible.\n");
+ ERR(reg,"couldn't create HKEY_LOCAL_MACHINE\\SOFTWARE\\Classes. This is impossible.\n");
exit(1);
}
key_classes_root = lookup_hkey(cl_r_hkey);
@@ -439,7 +439,7 @@
F=fopen(fn,"w");
if (F==NULL) {
- fprintf(stddeb,__FILE__":_savereg:Couldn't open %s for writing: %s\n",
+ WARN(reg,"Couldn't open %s for writing: %s\n",
fn,strerror(errno)
);
return FALSE;
@@ -447,7 +447,7 @@
if (!_savesubreg(F,lpkey,all)) {
fclose(F);
unlink(fn);
- fprintf(stddeb,__FILE__":_savereg:Failed to save keys, perhaps no more diskspace for %s?\n",fn);
+ WARN(reg,"Failed to save keys, perhaps no more diskspace for %s?\n",fn);
return FALSE;
}
fclose(F);
@@ -519,7 +519,7 @@
free(tmp);
free(fn);
} else
- fprintf(stderr,"SHELL_SaveRegistry:failed to get homedirectory of UID %d.\n",getuid());
+ WARN(reg,"Failed to get homedirectory of UID %d.\n",getuid());
}
/************************ LOAD Registry Function ****************************/
@@ -669,7 +669,7 @@
continue;
}
if (*s!='u') {
- fprintf(stderr,"_wine_read_USTRING:Non unicode escape sequence \\%c found in |%s|\n",*s,buf);
+ WARN(reg,"Non unicode escape sequence \\%c found in |%s|\n",*s,buf);
*ws++='\\';
*ws++=*s++;
} else {
@@ -679,7 +679,7 @@
s++;
memcpy(xbuf,s,4);xbuf[4]='\0';
if (!sscanf(xbuf,"%x",&wc))
- fprintf(stderr,"_wine_read_USTRING:strange escape sequence %s found in |%s|\n",xbuf,buf);
+ WARN(reg,"Strange escape sequence %s found in |%s|\n",xbuf,buf);
s+=4;
*ws++ =(unsigned short)wc;
}
@@ -716,7 +716,7 @@
}
if (i>level) {
if (lpxkey==NULL) {
- fprintf(stderr,"_load_subkey:Got a subhierarchy without resp. key?\n");
+ WARN(reg,"Got a subhierarchy without resp. key?\n");
return 0;
}
_wine_loadsubkey(F,lpxkey,level+1,buf,buflen,optflag);
@@ -739,12 +739,12 @@
int len,lastmodified,type;
if (*s!='=') {
- fprintf(stderr,"_wine_load_subkey:unexpected character: %c\n",*s);
+ WARN(reg,"Unexpected character: %c\n",*s);
break;
}
s++;
if (2!=sscanf(s,"%d,%d,",&type,&lastmodified)) {
- fprintf(stderr,"_wine_load_subkey: haven't understood possible value in |%s|, skipping.\n",*buf);
+ WARN(reg,"Haven't understood possible value in |%s|, skipping.\n",*buf);
break;
}
/* skip the 2 , */
@@ -764,16 +764,16 @@
if (*s>='0' && *s<='9')
data[i]=(*s-'0')<<4;
if (*s>='a' && *s<='f')
- data[i]=(*s-'a')<<4;
+ data[i]=(*s-'a'+'\xa')<<4;
if (*s>='A' && *s<='F')
- data[i]=(*s-'A')<<4;
+ data[i]=(*s-'A'+'\xa')<<4;
s++;
if (*s>='0' && *s<='9')
data[i]|=*s-'0';
if (*s>='a' && *s<='f')
- data[i]|=*s-'a';
+ data[i]|=*s-'a'+'\xa';
if (*s>='A' && *s<='F')
- data[i]|=*s-'A';
+ data[i]|=*s-'A'+'\xa';
s++;
}
}
@@ -1173,7 +1173,7 @@
if (4!=_lread32(hfd,magic,4))
return;
if (strcmp(magic,"CREG")) {
- fprintf(stddeb,"%s is not a w95 registry.\n",fn);
+ WARN(reg,"%s is not a w95 registry.\n",fn);
return;
}
if (4!=_lread32(hfd,&version,4))
@@ -1479,7 +1479,7 @@
_wine_loadreg(key_local_machine,fn,REG_OPTION_TAINTED);
free(fn);
} else
- fprintf(stderr,"SHELL_LoadRegistry:failed to get homedirectory of UID %d.\n",getuid());
+ WARN(reg,"Failed to get homedirectory of UID %d.\n",getuid());
if (ERROR_SUCCESS==RegCreateKey16(HKEY_CURRENT_USER,KEY_REGISTRY,&hkey)) {
DWORD junk,type,len;
char data[5];
@@ -2266,7 +2266,7 @@
} else
xhkey=hkey;
if (dwType!=REG_SZ) {
- fprintf(stddeb,"RegSetValueX called with dwType=%ld!\n",dwType);
+ TRACE(reg,"RegSetValueX called with dwType=%ld!\n",dwType);
dwType=REG_SZ;
}
if (cbData!=2*lstrlen32W(lpszData)+2) {
@@ -2799,13 +2799,25 @@
return RegDeleteValue32A(hkey,lpszValue);
}
-/* RegFlushKey [ADVAPI32.143] [KERNEL.227] */
-DWORD WINAPI RegFlushKey(HKEY hkey)
+
+/******************************************************************************
+ * RegFlushKey [KERNEL.227] [ADVAPI32.143]
+ * Writes key to registry
+ *
+ * PARAMS
+ * hkey [I] Handle of key to write
+ *
+ * RETURNS
+ * Success: ERROR_SUCCESS
+ * Failure: Error code
+ */
+DWORD WINAPI RegFlushKey( HKEY hkey )
{
- FIXME(reg, "(%x), STUB.\n", hkey);
- return SHELL_ERROR_SUCCESS;
+ FIXME(reg, "(%x): stub\n", hkey);
+ return ERROR_SUCCESS;
}
+
/* FIXME: lpcchXXXX ... is this counting in WCHARS or in BYTEs ?? */
/* RegQueryInfoKeyW [ADVAPI32.153] */
@@ -2940,8 +2952,29 @@
/* RegConnectRegistryA [ADVAPI32.127] */
DWORD WINAPI RegConnectRegistry32A(LPCSTR machine,HKEY hkey,LPHKEY reskey)
{
- fprintf(stderr,"RegConnectRegistry32A(%s,%08x,%p), STUB.\n",
- machine,hkey,reskey
- );
+ FIXME(reg,"(%s,%08x,%p):stub.\n",machine,hkey,reskey);
return ERROR_FILE_NOT_FOUND; /* FIXME */
}
+
+
+/******************************************************************************
+ * RegGetKeySecurity [ADVAPI32.144]
+ * Retrieves a copy of security descriptor protecting the registry key
+ *
+ * NOTES
+ * pSecurityDescriptor should be PSECURITY_DESCRIPTOR
+ *
+ * RETURNS
+ * Success: ERROR_SUCCESS
+ * Failure: Error code
+ */
+LONG WINAPI RegGetKeySecurity( HKEY hKey,
+ SECURITY_INFORMATION SecurityInformation,
+ LPVOID pSecurityDescriptor,
+ LPDWORD lpcbSecurityDescriptor )
+{
+ FIXME(reg, "(%d,%ld,%p,%p): stub\n", hKey, SecurityInformation,
+ pSecurityDescriptor, lpcbSecurityDescriptor);
+ return ERROR_SUCCESS;
+}
+
diff --git a/misc/shellord.c b/misc/shellord.c
index 8cbfa40..a21ab8a 100644
--- a/misc/shellord.c
+++ b/misc/shellord.c
@@ -34,7 +34,7 @@
* SHELL32_2 [SHELL32.2]
*/
DWORD WINAPI SHELL32_2(HWND32 hwnd,DWORD x2,DWORD x3,DWORD x4,DWORD x5,DWORD x6) {
- fprintf(stderr,"SHELL32_2(0x%04x,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx),stub!\n",
+ FIXME(shell,"(0x%04x,0x%08lx,0x%08lx,0x%08lx,0x%08lx,0x%08lx):stub.\n",
hwnd,x2,x3,x4,x5,x6
);
return 0;
@@ -286,7 +286,7 @@
* SHELL32_58 [SHELL32.58]
*/
DWORD WINAPI SHELL32_58(LPCSTR src,DWORD x2,LPSTR target,DWORD pathlen) {
- fprintf(stderr,"SHELL32_58(%s,0x%08lx,%p,%ld),STUB!\n",
+ FIXME(shell,"(%s,0x%08lx,%p,%ld):stub.\n",
src,x2,target,pathlen
);
if (!src)
@@ -298,7 +298,7 @@
* SHELL32_62 [SHELL32.62]
*/
DWORD WINAPI SHELL32_62(DWORD x,DWORD y,DWORD z,DWORD a) {
- fprintf(stderr,"SHELL32_62(%08lx,%08lx,%08lx,%08lx),stub!\n",x,y,z,a);
+ FIXME(shell,"(%08lx,%08lx,%08lx,%08lx):stub.\n",x,y,z,a);
return 0xffffffff;
}
@@ -306,7 +306,7 @@
* SHELL32_63 [SHELL32.63]
*/
DWORD WINAPI SHELL32_63(HWND32 howner, LPSTR targetbuf, DWORD len, DWORD x, LPCSTR suffix, LPCSTR y, LPCSTR cmd) {
- fprintf(stderr,"SHELL32_63(%04x,%p,%ld,%08lx,%s,%s,%s),stub!\n",
+ FIXME(shell,"(%04x,%p,%ld,%08lx,%s,%s,%s):stub.\n",
howner,targetbuf,len,x,suffix,y,cmd
);
/* puts up a Open Dialog and requests input into targetbuf */
@@ -319,7 +319,7 @@
* SHELL32_68 [SHELL32.68]
*/
DWORD WINAPI SHELL32_68(DWORD x,DWORD y,DWORD z) {
- fprintf(stderr,"SHELL32_68(0x%08lx,0x%08lx,0x%08lx),stub!\n",
+ FIXME(shell,"(0x%08lx,0x%08lx,0x%08lx):stub.\n",
x,y,z
);
return 0;
@@ -330,7 +330,7 @@
*/
BOOL32 WINAPI SHELL32_71(LPDWORD x,LPDWORD y) {
- fprintf(stderr,"SHELL32_71(%p,%p),stub!\n",x,y);
+ FIXME(shell,"(%p,%p):stub.\n",x,y);
return TRUE;
}
@@ -339,14 +339,14 @@
* dunno. something with icons
*/
void WINAPI SHELL32_72(LPSTR x,DWORD y,DWORD z) {
- fprintf(stderr,"SHELL32_72(%s,%08lx,%08lx),stub!\n",x,y,z);
+ FIXME(shell,"(%s,%08lx,%08lx):stub.\n",x,y,z);
}
/*************************************************************************
* SHELL32_89 [SHELL32.89]
*/
DWORD WINAPI SHELL32_89(DWORD x1,DWORD x2,DWORD x3) {
- fprintf(stderr,"SHELL32_89(0x%08lx,0x%08lx,0x%08lx),stub!\n",
+ FIXME(shell,"(0x%08lx,0x%08lx,0x%08lx):stub.\n",
x1,x2,x3
);
return 0;
@@ -357,7 +357,7 @@
* unknown
*/
void WINAPI SHELL32_119(LPVOID x) {
- fprintf(stderr,"SHELL32_119(%p(%s)),stub\n",x,(char *)x);
+ FIXME(shell,"(%p(%s)):stub.\n",x,(char *)x);
}
/*************************************************************************
@@ -365,7 +365,7 @@
* unknown
*/
void WINAPI SHELL32_175(DWORD x1,DWORD x2,DWORD x3,DWORD x4) {
- fprintf(stderr,"SHELL32_175(0x%08lx,0x%08lx,0x%08lx,0x%08lx),stub\n",
+ FIXME(shell,"(0x%08lx,0x%08lx,0x%08lx,0x%08lx):stub.\n",
x1,x2,x3,x4
);
}
@@ -375,7 +375,7 @@
* unknown
*/
void WINAPI SHELL32_181(DWORD x,DWORD y) {
- fprintf(stderr,"SHELL32_181(0x%08lx,0x%08lx)\n",x,y);
+ FIXME(shell,"(0x%08lx,0x%08lx):stub.\n",x,y);
}
/*************************************************************************
@@ -383,7 +383,7 @@
* unknown
*/
BOOL32 WINAPI SHELL32_75(LPDWORD x,LPDWORD y) {
- fprintf(stderr,"SHELL32_75(%p,%p),stub\n",x,y);
+ FIXME(shell,"(%p,%p):stub.\n",x,y);
return TRUE;
}
@@ -391,7 +391,7 @@
* SHELL32_77 [SHELL32.77]
*/
DWORD WINAPI SHELL32_77(DWORD x,DWORD y,DWORD z) {
- fprintf(stderr,"SHELL32_77(%08lx,%08lx,%08lx),stub!\n",x,y,z);
+ FIXME(shell,"(%08lx,%08lx,%08lx):stub.\n",x,y,z);
return 0;
}
@@ -400,20 +400,24 @@
* create_directory_and_notify(...)
*/
DWORD WINAPI SHELL32_79(LPCSTR dir,LPVOID xvoid) {
- fprintf(stderr,"mkdir %s,%p\n",dir,xvoid);
+ TRACE(shell,"mkdir %s,%p\n",dir,xvoid);
if (!CreateDirectory32A(dir,xvoid))
return FALSE;
/* SHChangeNotify(8,1,dir,0); */
return TRUE;
}
-static FARPROC32 _find_moduleproc(LPSTR dllname,HMODULE32 *xhmod,LPSTR name) {
+typedef DWORD (* WINAPI GetClassPtr)(REFCLSID,REFIID,LPVOID);
+
+static GetClassPtr SH_find_moduleproc(LPSTR dllname,HMODULE32 *xhmod,
+ LPSTR name)
+{
HMODULE32 hmod;
FARPROC32 dllunload,nameproc;
if (xhmod) *xhmod = 0;
if (!lstrcmpi32A(SHELL32_34(dllname),"shell32.dll"))
- return (FARPROC32)SHELL32_DllGetClassObject;
+ return (GetClassPtr)SHELL32_DllGetClassObject;
hmod = LoadLibraryEx32A(dllname,0,LOAD_WITH_ALTERED_SEARCH_PATH);
if (!hmod)
@@ -427,17 +431,17 @@
return NULL;
}
/* register unloadable dll with unloadproc ... */
- return nameproc;
+ return (GetClassPtr)nameproc;
}
-static DWORD _get_instance(REFCLSID clsid,LPSTR dllname,
+static DWORD SH_get_instance(REFCLSID clsid,LPSTR dllname,
LPVOID unknownouter,REFIID refiid,LPVOID inst
) {
- DWORD WINAPI (*dllgetclassob)(REFCLSID,REFIID,LPVOID);
+ GetClassPtr dllgetclassob;
DWORD hres;
LPCLASSFACTORY classfac;
- dllgetclassob = (DWORD(*)(REFCLSID,REFIID,LPVOID))_find_moduleproc(dllname,NULL,"DllGetClassObject");
+ dllgetclassob = SH_find_moduleproc(dllname,NULL,"DllGetClassObject");
if (!dllgetclassob)
return 0x80070000|GetLastError();
@@ -455,6 +459,7 @@
classfac->lpvtbl->fnRelease(classfac);
return 0;
}
+
/*************************************************************************
* SHELL32_102 [SHELL32.102]
* unknown
@@ -476,29 +481,29 @@
return 0x80040154;
strcpy(xclsid,aclsid);
}
- fprintf(stderr,"SHELL32_102(%p,%s,%p,%s,%p)\n",
+ TRACE(shell,"(%p,%s,%p,%s,%p)\n",
aclsid,xclsid,unknownouter,xiid,inst
);
sprintf(buffer,"CLSID\\%s\\InProcServer32",xclsid);
if (RegOpenKeyEx32A(HKEY_CLASSES_ROOT,buffer,0,0x02000000,&inprockey))
- return _get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
+ return SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
pathlen=sizeof(path);
if (RegQueryValue32A(inprockey,NULL,path,&pathlen)) {
RegCloseKey(inprockey);
- return _get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
+ return SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
}
- fprintf(stderr," -> server dll is %s\n",path);
+ TRACE(shell, "Server dll is %s\n",path);
tmodellen=sizeof(tmodel);
type=REG_SZ;
if (RegQueryValueEx32A(inprockey,"ThreadingModel",NULL,&type,tmodel,&tmodellen)) {
RegCloseKey(inprockey);
- return _get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
+ return SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
}
- fprintf(stderr," -> threading model is %s\n",tmodel);
- hres=_get_instance(clsid,path,unknownouter,refiid,inst);
+ TRACE(shell, "Threading model is %s\n",tmodel);
+ hres=SH_get_instance(clsid,path,unknownouter,refiid,inst);
if (hres<0)
- hres=_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
+ hres=SH_get_instance(clsid,"shell32.dll",unknownouter,refiid,inst);
RegCloseKey(inprockey);
return hres;
}
@@ -518,7 +523,7 @@
/* FIXME: the varargs handling doesn't. */
FormatMessage32A(0x500,buf2,0,0,&buf3,256,&args);
- fprintf(stderr,"SHELL32_183(%08lx,%08lx,%08lx(%s),%08lx(%s),%08lx,%p),stub!\n",
+ FIXME(shell,"(%08lx,%08lx,%08lx(%s),%08lx(%s),%08lx,%p):stub.\n",
(DWORD)hmod,(DWORD)hwnd,id,buf2,x,buf,type,arglist
);
/*MessageBox32A(hwnd,buf3,buf,id|0x10000);*/
@@ -553,7 +558,7 @@
DWORD WINAPI SHELL32_100(DWORD pol) {
HKEY xhkey;
- fprintf(stderr,"SHELL32_100(%08lx),stub!\n",pol);
+ FIXME(shell,"(%08lx):stub.\n",pol);
if (RegOpenKey32A(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies",&xhkey))
return 0;
/* FIXME: do nothing for now, just return 0 (== "allowed") */
@@ -583,7 +588,7 @@
* SHELL32_158 [SHELL32.158]
*/
LPSTR WINAPI SHELL32_158(LPSTR path,DWORD y,DWORD z) {
- fprintf(stderr,"SHELL32_158(%s,%08lx,%08lx)\n",path,y,z);
+ TRACE(shell,"(%s,%08lx,%08lx)\n",path,y,z);
path = SHELL32_31(path);
return *path?(path+1):path;
}
@@ -595,7 +600,7 @@
DWORD WINAPI SHELL32_165(DWORD x,LPCSTR path) {
if (SHELL32_79(path,(LPVOID)x))
return 0;
- fprintf(stderr,"SHELL32_165(%08lx,%s),stub!\n",x,path);
+ FIXME(shell,"(%08lx,%s):stub.\n",x,path);
return 0;
}
@@ -654,3 +659,4 @@
return 0;
return SHELL32_195(x);
}
+
diff --git a/misc/system.c b/misc/system.c
index 65646bc..99fbcfb 100644
--- a/misc/system.c
+++ b/misc/system.c
@@ -16,6 +16,7 @@
#include "callback.h"
#include "windows.h"
#include "miscemu.h"
+#include "debug.h"
typedef struct
{
@@ -115,10 +116,10 @@
return MAKELONG( drivetype, drivetype );
case 2: /* Enable one-drive logic */
- fprintf( stderr, "InquireSystem(2): set single-drive %d not supported\n", arg );
+ FIXME(system, "Case %d: set single-drive %d not supported\n", code, arg );
return 0;
}
- fprintf( stderr, "InquireSystem: unknown code %d\n", code );
+ WARN(system, "Unknown code %d\n", code );
return 0;
}
diff --git a/misc/ver.c b/misc/ver.c
index da9f8e5..851b37b 100644
--- a/misc/ver.c
+++ b/misc/ver.c
@@ -297,7 +297,7 @@
if (magic[0] == 'P' && magic[1] == 'E')
return IMAGE_NT_SIGNATURE;
magic[2]='\0';
- fprintf(stderr,"misc/ver.c:read_ne_header:can't handle %s files.\n",magic);
+ WARN(ver,"Can't handle %s files.\n",magic);
return 0;
}
@@ -447,7 +447,7 @@
resdir = pehd.OptionalHeader.DataDirectory[IMAGE_FILE_RESOURCE_DIRECTORY];
TRACE(ver,"(.,%p,%p,....)\n",typeid,resid);
if (!resdir.Size) {
- fprintf(stderr,"misc/ver.c:find_pe_resource() no resource directory found in PE file.\n");
+ WARN(ver,"No resource directory found in PE file.\n");
return 0;
}
imagesize = pehd.OptionalHeader.SizeOfImage;
@@ -474,8 +474,10 @@
LZSeek32(lzfd,sections[i].PointerToRawData,SEEK_SET);
if ( sections[i].SizeOfRawData!=
LZRead32(lzfd,image+sections[i].VirtualAddress,sections[i].SizeOfRawData)
- )
- continue;
+ ) {
+ HeapFree(GetProcessHeap(),0,image);
+ return 0;
+ }
}
resourcedir = (LPIMAGE_RESOURCE_DIRECTORY)(image+resdir.VirtualAddress);
xresdir = GetResDirEntryW(resourcedir,typeid,(DWORD)resourcedir,FALSE);
@@ -620,7 +622,7 @@
isuni = 1;
vffi = (VS_FIXEDFILEINFO*)(buf+0x28);
} else {
- fprintf(stderr,"vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n",
+ WARN(ver,"vffi->dwSignature is 0x%08lx, but not 0x%08lx!\n",
vffi->dwSignature,VS_FFI_SIGNATURE
);
return 0;
@@ -898,7 +900,6 @@
return ret;
}
-/* VerInstallFileA [VERSION.7] */
static LPBYTE
_fetch_versioninfo(LPSTR fn,VS_FIXEDFILEINFO **vffi) {
DWORD alloclen;
@@ -922,7 +923,7 @@
if ((*vffi)->dwSignature == 0x004f0049) /* hack to detect unicode */
*vffi = (VS_FIXEDFILEINFO*)(buf+0x28);
if ((*vffi)->dwSignature != VS_FFI_SIGNATURE)
- fprintf(stderr,"_fetch_versioninfo:bad VS_FIXEDFILEINFO signature 0x%08lx\n",(*vffi)->dwSignature);
+ WARN(ver,"Bad VS_FIXEDFILEINFO signature 0x%08lx\n",(*vffi)->dwSignature);
return buf;
}
}
@@ -940,9 +941,10 @@
}
}
-/* VerInstallFile32A
- */
+/******************************************************************************
+ * VerInstallFile32A [VERSION.7]
+ */
DWORD WINAPI VerInstallFile32A(
UINT32 flags,LPCSTR srcfilename,LPCSTR destfilename,LPCSTR srcdir,
LPCSTR destdir,LPCSTR curdir,LPSTR tmpfile,UINT32 *tmpfilelen )
@@ -954,7 +956,7 @@
LPBYTE buf1,buf2;
OFSTRUCT ofs;
- fprintf(stddeb,"VerInstallFile(%x,%s,%s,%s,%s,%s,%p,%d)\n",
+ TRACE(ver,"(%x,%s,%s,%s,%s,%s,%p,%d)\n",
flags,srcfilename,destfilename,srcdir,destdir,curdir,tmpfile,*tmpfilelen
);
xret = 0;
@@ -1106,6 +1108,7 @@
return xret;
}
+
/* VerInstallFileW [VERSION.8] */
DWORD WINAPI VerInstallFile32W(
UINT32 flags,LPCWSTR srcfilename,LPCWSTR destfilename,LPCWSTR srcdir,
@@ -1302,7 +1305,7 @@
b=_find_dataW(block,wstr,*(WORD*)block);
HeapFree(GetProcessHeap(),0,wstr);
if (!b) {
- fprintf(stderr,"key %s not found in versionresource.\n",s);
+ WARN(ver,"key %s not found in versionresource.\n",s);
*buflen=0;
free (s);
return 0;
@@ -1320,7 +1323,7 @@
struct dbA *db;
b=_find_dataA(block,s,*(WORD*)block);
if (!b) {
- fprintf(stderr,"key %s not found in versionresource.\n",s);
+ WARN(ver,"key %s not found in versionresource.\n",s);
*buflen=0;
free (s);
return 0;
@@ -1364,7 +1367,7 @@
b=_find_dataW(block,wstr,*(WORD*)block);
HeapFree(GetProcessHeap(),0,wstr);
if (!b) {
- fprintf(stderr,"key %s not found in versionresource.\n",s);
+ WARN(ver,"key %s not found in versionresource.\n",s);
*buflen=0;
free (s);
return 0;
@@ -1384,7 +1387,7 @@
struct dbA *db;
b=_find_dataA(block,s,*(WORD*)block);
if (!b) {
- fprintf(stderr,"key %s not found in versionresource.\n",subblock);
+ WARN(ver,"key %s not found in versionresource.\n",subblock);
*buflen=0;
free (s);
return 0;
diff --git a/misc/w32skrnl.c b/misc/w32skrnl.c
index f05cc99..df9d65a 100644
--- a/misc/w32skrnl.c
+++ b/misc/w32skrnl.c
@@ -12,10 +12,10 @@
LPSTR WINAPI GetWin32sDirectory(void)
{
- static char *sysdir;
+ static char sysdir[0x80];
LPSTR text;
- sysdir = getenv("winsysdir");
+ GetEnvironmentVariable32A("winsysdir", sysdir, 0x80);
if (!sysdir) return NULL;
strcat(sysdir, "\\WIN32S");
text = HeapAlloc(GetProcessHeap(), 0, strlen(sysdir)+1);
diff --git a/misc/win32s16.c b/misc/win32s16.c
index d602aef..fde1b28 100644
--- a/misc/win32s16.c
+++ b/misc/win32s16.c
@@ -6,13 +6,14 @@
*/
#include "windows.h"
+#include "debug.h"
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
void BootTask()
{
- fprintf(stderr, "BootTask(): should only be used by WIN32S.EXE.\n");
+ MSG("BootTask(): should only be used by WIN32S.EXE.\n");
}
/***********************************************************************
@@ -22,6 +23,6 @@
*/
SEGPTR WINAPI StackLinearToSegmented(WORD w1, WORD w2)
{
- fprintf(stderr, "StackLinearToSegmented(), stub !\n");
+ FIXME(dll,"(%d,%d):stub.\n",w1,w2);
return (SEGPTR)NULL;
}
diff --git a/misc/windebug.c b/misc/windebug.c
index 9e54dfc..5e74cf4 100644
--- a/misc/windebug.c
+++ b/misc/windebug.c
@@ -9,6 +9,7 @@
#include <stdlib.h>
#include "windows.h"
#include "module.h"
+#include "debug.h"
/***********************************************************************
* WinNotify (WINDEBUG.3)
@@ -16,7 +17,7 @@
*/
void WinNotify(CONTEXT *context)
{
- fprintf(stderr, "WinNotify(AX=%04x): stub !\n", AX_reg(context));
+ FIXME(dll, "(AX=%04x):stub.\n", AX_reg(context));
switch (AX_reg(context))
{
case 0x000D:
diff --git a/misc/winsock.c b/misc/winsock.c
index 79a7a10..505adfd 100644
--- a/misc/winsock.c
+++ b/misc/winsock.c
@@ -57,7 +57,7 @@
#define DEBUG_SOCKADDR 0
#define dump_sockaddr(a) \
- fprintf(stderr, "sockaddr_in: family %d, address %s, port %d\n", \
+ DUMP("sockaddr_in: family %d, address %s, port %d\n", \
((struct sockaddr_in *)a)->sin_family, \
inet_ntoa(((struct sockaddr_in *)a)->sin_addr), \
ntohs(((struct sockaddr_in *)a)->sin_port))
@@ -116,7 +116,7 @@
for(i=0; _ws_sock_ops[i]; i++)
if( _ws_sock_ops[i] == *optname ) break;
if( _ws_sock_ops[i] ) *optname = _px_sock_ops[i];
- else fprintf(stderr, "convert_sockopt() unknown optname %d\n", *optname);
+ else WARN(winsock, "Unknown optname %d\n", *optname);
break;
case WS_IPPROTO_TCP:
*optname = IPPROTO_TCP;
@@ -136,7 +136,7 @@
LPWSINFO pwsi = _wsi_list;
while( pwsi && pwsi->tid != hTask ) pwsi = pwsi->next;
if( pwsi )
- fprintf(stderr,"loose wsi struct! pwsi=0x%08x, task=0x%04x\n",
+ WARN(winsock,"(pwsi=0x%08x,task=0x%04x):Loose wsi struct! \n",
(unsigned)pwsi, hTask );
return pwsi;
}
@@ -326,7 +326,7 @@
_WSHeap = HeapCreate(HEAP_ZERO_MEMORY, 8120, 32768);
if( !(_ws_stub = WS_ALLOC(0x10)) )
{
- fprintf(stderr,"Fatal: failed to create WinSock heap\n");
+ ERR(winsock,"Fatal: failed to create WinSock heap\n");
return 0;
}
}
@@ -919,7 +919,7 @@
break;
case WS_IOW('f',125,u_long):
- fprintf(stderr,"Warning: WS1.1 shouldn't be using async I/O\n");
+ WARN(winsock,"Warning: WS1.1 shouldn't be using async I/O\n");
pwsi->err = WSAEINVAL;
return SOCKET_ERROR;
@@ -1033,7 +1033,7 @@
len, flags);
#if DEBUG_SOCKADDR
if( from ) dump_sockaddr(from);
- else fprintf(stderr, "\tfrom = NULL\n");
+ else DUMP("from = NULL\n");
#endif
if( _check_ws(pwsi, pws) )
@@ -1396,7 +1396,7 @@
if (errno == EPERM) /* raw socket denied */
{
- fprintf(stderr, "WS_SOCKET: not enough privileges\n");
+ WARN(winsock, "WS_SOCKET: not enough privileges\n");
pwsi->err = WSAESOCKTNOSUPPORT;
} else pwsi->err = wsaErrno();
}
@@ -2648,7 +2648,7 @@
/* just in case we ever get here and there are no problems */
case 0: return 0;
default:
- fprintf(stderr, "winsock: unknown errno %d!\n", errno);
+ WARN(winsock, "Unknown errno %d!\n", errno);
return WSAEOPNOTSUPP;
}
}
@@ -2673,7 +2673,7 @@
case 0: return 0;
default:
- fprintf(stderr, "winsock: unknown h_errno %d!\n", h_errno);
+ WARN(winsock,"Unknown h_errno %d!\n", h_errno);
return WSAEOPNOTSUPP;
}
}
diff --git a/misc/winsock_dns.c b/misc/winsock_dns.c
index d01b8f7..dc9b298 100644
--- a/misc/winsock_dns.c
+++ b/misc/winsock_dns.c
@@ -301,7 +301,7 @@
case WSMSG_ASYNC_SERVBYPORT:
fixup_wsse((struct ws_servent*)buffer, p_aop->b.ptr_base); break;
default:
- if( p_aop->flags ) fprintf(stderr,"Received unknown async request!\n");
+ if( p_aop->flags ) WARN(winsock,"Received unknown async request!\n");
return AOP_CONTROL_REMOVE;
}
}
diff --git a/misc/wsprintf.c b/misc/wsprintf.c
index 540dc4a..fcfd589 100644
--- a/misc/wsprintf.c
+++ b/misc/wsprintf.c
@@ -23,6 +23,7 @@
typedef enum
{
+ WPR_UNKNOWN,
WPR_CHAR,
WPR_WCHAR,
WPR_STRING,
@@ -108,8 +109,9 @@
case 'x':
res->type = WPR_HEXA;
break;
- default:
- fprintf( stderr, "wvsprintf32A: unknown format '%c'\n", *p );
+ default: /* unknown format char */
+ res->type = WPR_UNKNOWN;
+ p--; /* print format as normal char */
break;
}
return (INT32)(p - format) + 1;
@@ -180,7 +182,8 @@
res->type = WPR_HEXA;
break;
default:
- fprintf( stderr, "wvsprintf32W: unknown format '%c'\n", (CHAR)*p );
+ res->type = WPR_UNKNOWN;
+ p--; /* print format as normal char */
break;
}
return (INT32)(p - format) + 1;
@@ -282,6 +285,8 @@
else
cur_arg = (DWORD)VA_ARG16( args, UINT16 );
break;
+ case WPR_UNKNOWN:
+ continue;
}
len = WPRINTF_GetLen( &format, &cur_arg, number, maxlen - 1 );
if (!(format.flags & WPRINTF_LEFTALIGN))
@@ -317,6 +322,8 @@
if (len) memcpy( p, number, len );
p += len;
break;
+ case WPR_UNKNOWN:
+ continue;
}
if (format.flags & WPRINTF_LEFTALIGN)
for (i = format.precision; i < format.width; i++, maxlen--)
@@ -389,6 +396,8 @@
p += len;
(void)va_arg( args, INT32 ); /* Go to the next arg */
break;
+ case WPR_UNKNOWN:
+ continue;
}
if (format.flags & WPRINTF_LEFTALIGN)
for (i = format.precision; i < format.width; i++, maxlen--)
@@ -461,6 +470,8 @@
for (i = 0; i < len; i++) *p++ = (WCHAR)number[i];
(void)va_arg( args, INT32 ); /* Go to the next arg */
break;
+ case WPR_UNKNOWN:
+ continue;
}
if (format.flags & WPRINTF_LEFTALIGN)
for (i = format.precision; i < format.width; i++, maxlen--)
diff --git a/misc/xmalloc.c b/misc/xmalloc.c
index a228f71..8ff7b38 100644
--- a/misc/xmalloc.c
+++ b/misc/xmalloc.c
@@ -17,6 +17,7 @@
#include <stdlib.h>
#include <string.h>
#include "xmalloc.h"
+#include "debug.h"
void *xmalloc( int size )
{
@@ -25,7 +26,7 @@
res = malloc (size ? size : 1);
if (res == NULL)
{
- fprintf (stderr, "Virtual memory exhausted.\n");
+ MSG("Virtual memory exhausted.\n");
exit (1);
}
return res;
@@ -37,7 +38,7 @@
void *res = realloc (ptr, size);
if ((res == NULL) && size)
{
- fprintf (stderr, "Virtual memory exhausted.\n");
+ MSG("Virtual memory exhausted.\n");
exit (1);
}
return res;
@@ -49,7 +50,7 @@
char *res = strdup( str );
if (!res)
{
- fprintf (stderr, "Virtual memory exhausted.\n");
+ MSG("Virtual memory exhausted.\n");
exit (1);
}
return res;
diff --git a/miscemu/instr.c b/miscemu/instr.c
index 46cd421..1b6570d 100644
--- a/miscemu/instr.c
+++ b/miscemu/instr.c
@@ -9,14 +9,19 @@
#include "ldt.h"
#include "miscemu.h"
#include "sig_context.h"
+#include "debug.h"
#define STACK_sig(context) \
- ((GET_SEL_FLAGS(SS_sig(context)) & LDT_FLAGS_32BIT) ? \
- ESP_sig(context) : SP_sig(context))
+ (IS_SELECTOR_32BIT(SS_sig(context)) ? ESP_sig(context) : SP_sig(context))
+
+#define MAKE_PTR(seg,off) \
+ (IS_SELECTOR_SYSTEM(seg) ? (void *)(off) : PTR_SEG_OFF_TO_LIN(seg,off))
#define STACK_PTR(context) \
- (PTR_SEG_OFF_TO_LIN(SS_sig(context),STACK_sig(context)))
+ (IS_SELECTOR_SYSTEM(SS_sig(context)) ? (void *)ESP_sig(context) : \
+ (PTR_SEG_OFF_TO_LIN(SS_sig(context),STACK_sig(context))))
+
/***********************************************************************
* INSTR_ReplaceSelector
@@ -191,6 +196,7 @@
if (segprefix != -1) seg = segprefix;
/* Make sure the segment and offset are valid */
+ if (IS_SELECTOR_SYSTEM(seg)) return (BYTE *)(base + (index << ss));
if (((seg & 7) != 7) || IS_SELECTOR_FREE(seg)) return NULL;
if (GET_SEL_LIMIT(seg) < (base + (index << ss))) return NULL;
return (BYTE *)PTR_SEG_OFF_TO_LIN( seg, (base + (index << ss)) );
@@ -291,8 +297,8 @@
int prefix, segprefix, prefixlen, len, repX, long_op, long_addr;
BYTE *instr;
- long_op = long_addr = (GET_SEL_FLAGS(CS_sig(context)) & LDT_FLAGS_32BIT) != 0;
- instr = (BYTE *) PTR_SEG_OFF_TO_LIN( CS_sig(context), EIP_sig(context) );
+ long_op = long_addr = IS_SELECTOR_32BIT(CS_sig(context));
+ instr = (BYTE *)MAKE_PTR(CS_sig(context),EIP_sig(context));
/* First handle any possible prefix */
@@ -456,14 +462,14 @@
void *data;
if (outp)
{
- data = PTR_SEG_OFF_TO_LIN (seg,
+ data = MAKE_PTR(seg,
long_addr ? ESI_sig(context) : SI_sig(context));
if (long_addr) ESI_sig(context) += step;
else SI_sig(context) += step;
}
else
{
- data = PTR_SEG_OFF_TO_LIN (seg,
+ data = MAKE_PTR(seg,
long_addr ? EDI_sig(context) : DI_sig(context));
if (long_addr) EDI_sig(context) += step;
else DI_sig(context) += step;
@@ -554,7 +560,7 @@
case 0xcd: /* int <XX> */
if (long_op)
{
- fprintf(stderr, "int xx from 32-bit code is not supported.\n");
+ ERR(int, "int xx from 32-bit code is not supported.\n");
break; /* Unable to emulate it */
}
else
@@ -643,7 +649,7 @@
EIP_sig(context) += prefixlen + 1;
return TRUE;
}
- fprintf(stderr, "Unexpected Windows program segfault"
+ MSG("Unexpected Windows program segfault"
" - opcode = %x\n", *instr);
return FALSE; /* Unable to emulate it */
}
diff --git a/miscemu/main.c b/miscemu/main.c
index 6110790..e7c6e9f 100644
--- a/miscemu/main.c
+++ b/miscemu/main.c
@@ -10,6 +10,7 @@
#include "miscemu.h"
#include "module.h"
#include "options.h"
+#include "debug.h"
/***********************************************************************
@@ -72,7 +73,7 @@
{
if (!BUILTIN_ParseDLLOptions( Options.dllFlags ))
{
- fprintf( stderr, "%s: Syntax: -dll +xxx,... or -dll -xxx,...\n",
+ MSG("%s: Syntax: -dll +xxx,... or -dll -xxx,...\n",
argv[0] );
BUILTIN_PrintDLLs();
exit(1);
@@ -92,13 +93,13 @@
{
if ((handle = WinExec32( argv[i], SW_SHOWNORMAL )) < 32)
{
- fprintf(stderr, "wine: can't exec '%s': ", argv[i]);
+ MSG("wine: can't exec '%s': ", argv[i]);
switch (handle)
{
- case 2: fprintf( stderr, "file not found\n" ); break;
- case 11: fprintf( stderr, "invalid exe file\n" ); break;
- case 21: fprintf( stderr, "win32 executable\n" ); break;
- default: fprintf( stderr, "error=%d\n", handle ); break;
+ case 2: MSG("file not found\n" ); break;
+ case 11: MSG("invalid exe file\n" ); break;
+ case 21: MSG("win32 executable\n" ); break; /* FIXME: Obsolete? */
+ default: MSG("error=%d\n", handle ); break;
}
return 1;
}
@@ -113,13 +114,13 @@
if (!GetNumTasks())
{
- fprintf( stderr, "wine: no executable file found.\n" );
+ MSG("wine: no executable file found.\n" );
return 0;
}
if (Options.debug) DEBUG_AddModuleBreakpoints();
Yield16(); /* Start the first task */
- fprintf( stderr, "WinMain: Should never happen: returned from Yield()\n" );
+ MSG("WinMain: Should never happen: returned from Yield16()\n" );
return 0;
}
diff --git a/msdos/dosmem.c b/msdos/dosmem.c
index 4482cf9..6048ec5 100644
--- a/msdos/dosmem.c
+++ b/msdos/dosmem.c
@@ -208,7 +208,7 @@
PAGE_EXECUTE_READWRITE );
if (!DOSMEM_dosmem)
{
- fprintf( stderr, "Could not allocate DOS memory.\n" );
+ WARN(dosmem, "Could not allocate DOS memory.\n" );
return FALSE;
}
DOSMEM_BiosSeg = GLOBAL_CreateBlock(GMEM_FIXED,DOSMEM_dosmem+0x400,0x100,
@@ -219,26 +219,6 @@
return TRUE;
}
-void DOSMEM_InitExports(HMODULE16 hKernel)
-{
-#define SET_ENTRY_POINT(num,addr) \
- MODULE_SetEntryPoint( hKernel, (num), GLOBAL_CreateBlock( GMEM_FIXED, \
- DOSMEM_dosmem+(addr), 0x10000, hKernel, \
- FALSE, FALSE, FALSE, NULL ))
-
- SET_ENTRY_POINT( 183, 0x00000 ); /* KERNEL.183: __0000H */
- SET_ENTRY_POINT( 174, 0xa0000 ); /* KERNEL.174: __A000H */
- SET_ENTRY_POINT( 181, 0xb0000 ); /* KERNEL.181: __B000H */
- SET_ENTRY_POINT( 182, 0xb8000 ); /* KERNEL.182: __B800H */
- SET_ENTRY_POINT( 195, 0xc0000 ); /* KERNEL.195: __C000H */
- SET_ENTRY_POINT( 179, 0xd0000 ); /* KERNEL.179: __D000H */
- SET_ENTRY_POINT( 190, 0xe0000 ); /* KERNEL.190: __E000H */
- SET_ENTRY_POINT( 173, 0xf0000 ); /* KERNEL.173: __ROMBIOS */
- SET_ENTRY_POINT( 194, 0xf0000 ); /* KERNEL.194: __F000H */
- MODULE_SetEntryPoint(hKernel, 193,DOSMEM_BiosSeg); /* KERNEL.193: __0040H */
-
-#undef SET_ENTRY_POINT
-}
/***********************************************************************
* DOSMEM_Tick
@@ -272,7 +252,7 @@
#ifdef __DOSMEM_DEBUG__
if( (dm->size & DM_BLOCK_DEBUG) != DM_BLOCK_DEBUG )
{
- fprintf(stderr,"DOSMEM_GetBlock: MCB overrun! [prev = 0x%08x]\n", 4 + (UINT32)prev);
+ WARN(dosmem,"MCB overrun! [prev = 0x%08x]\n", 4 + (UINT32)prev);
return NULL;
}
prev = dm;
diff --git a/msdos/dpmi.c b/msdos/dpmi.c
index 5aea153..a452592 100644
--- a/msdos/dpmi.c
+++ b/msdos/dpmi.c
@@ -16,10 +16,14 @@
#include "msdos.h"
#include "toolhelp.h"
#include "debug.h"
+#include "selectors.h"
+#include "thread.h"
+#include "stackframe.h"
+#include "callback.h"
#define DOS_GET_DRIVE(reg) ((reg) ? (reg) - 1 : DRIVE_GetCurrentDrive())
-void CreateBPB(int drive, BYTE *data); /* defined in int21.c */
+void CreateBPB(int drive, BYTE *data, BOOL16 limited); /* defined in int21.c */
/* Structure for real-mode callbacks */
@@ -46,6 +50,14 @@
+typedef struct tagRMCB {
+ DWORD address;
+ struct tagRMCB *next;
+
+} RMCB;
+
+static RMCB *FirstRMCB = NULL;
+
/**********************************************************************
* INT_GetRealModeContext
*/
@@ -189,7 +201,7 @@
setword(&dataptr[2], 0x02); /* removable */
setword(&dataptr[4], 80); /* # of cylinders */
}
- CreateBPB(drive, &dataptr[7]);
+ CreateBPB(drive, &dataptr[7], FALSE);
break;
default:
SET_CFLAG(context);
@@ -223,6 +235,130 @@
}
+static void CallRMProcFar( CONTEXT *context )
+{
+ REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) );
+ CONTEXT context16;
+ THDB *thdb = THREAD_Current();
+ WORD argsize, sel;
+ LPVOID addr;
+ SEGPTR seg_addr;
+
+ TRACE(int31, "RealModeCall: EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n",
+ p->eax, p->ebx, p->ecx, p->edx);
+ TRACE(int31, " ESI=%08lx EDI=%08lx ES=%04x DS=%04x CS:IP=%04x:%04x, %d WORD arguments\n",
+ p->esi, p->edi, p->es, p->ds, p->cs, p->ip, CX_reg(context) );
+
+ if (!(p->cs) && !(p->ip)) { /* remove this check
+ if Int21/6501 case map function
+ has been implemented */
+ SET_CFLAG(context);
+ return;
+ }
+ INT_GetRealModeContext(p, &context16);
+
+ addr = DOSMEM_MapRealToLinear(MAKELONG(p->ip, p->cs));
+ sel = SELECTOR_AllocBlock( addr, 0x10000, SEGMENT_CODE, FALSE, FALSE );
+ seg_addr = PTR_SEG_OFF_TO_SEGPTR( sel, 0 );
+
+ CS_reg(&context16) = HIWORD(seg_addr);
+ IP_reg(&context16) = LOWORD(seg_addr);
+ EBP_reg(&context16) = OFFSETOF( thdb->cur_stack )
+ + (WORD)&((STACK16FRAME*)0)->bp;
+
+ argsize = CX_reg(context)*sizeof(WORD);
+ memcpy( ((LPBYTE)THREAD_STACK16(thdb))-argsize,
+ (LPBYTE)PTR_SEG_OFF_TO_LIN(SS_reg(context), SP_reg(context))+6, argsize );
+
+ Callbacks->CallRegisterShortProc(&context16, argsize);
+
+ UnMapLS(seg_addr);
+ INT_SetRealModeContext(p, &context16);
+}
+
+
+void WINAPI RMCallbackProc( FARPROC16 pmProc, REALMODECALL *rmc )
+{
+ CONTEXT ctx;
+ INT_GetRealModeContext(rmc, &ctx);
+ Callbacks->CallRegisterShortProc(&ctx, 0);
+}
+
+
+static void AllocRMCB( CONTEXT *context )
+{
+ RMCB *NewRMCB = HeapAlloc(GetProcessHeap(), 0, sizeof(RMCB));
+ REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) );
+ UINT16 uParagraph;
+
+ FIXME(int31, "EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n", p->eax, p->ebx, p->ecx, p->edx);
+ FIXME(int31, " ESI=%08lx EDI=%08lx ES=%04x DS=%04x CS:IP=%04x:%04x\n", p->esi, p->edi, p->es, p->ds, p->cs, p->ip);
+ FIXME(int31, " Function to call: %04x:%04x\n",
+ (WORD)DS_reg(context), SI_reg(context) );
+
+ if (NewRMCB)
+ {
+ LPVOID RMCBmem = DOSMEM_GetBlock(20, &uParagraph);
+ LPBYTE p = RMCBmem;
+
+ *p++ = 0x68; /* pushl */
+ *(FARPROC16 *)p =
+ PTR_SEG_OFF_TO_LIN(ES_reg(context), SI_reg(context)); /* pmode proc to call */
+ p+=4;
+ *p++ = 0x68; /* pushl */
+ *(LPVOID *)p =
+ PTR_SEG_OFF_TO_LIN(ES_reg(context), DI_reg(context));
+ p+=4;
+ *p++ = 0x9a; /* lcall */
+ *(FARPROC16 *)p = (FARPROC16)RMCallbackProc; /* FIXME ? */
+ p+=4;
+ GET_CS(*(WORD *)p);
+ p+=2;
+ *p++=0xc3; /* retf */
+ NewRMCB->address = MAKELONG(0, uParagraph);
+ NewRMCB->next = FirstRMCB;
+ FirstRMCB = NewRMCB;
+ CX_reg(context) = uParagraph;
+ DX_reg(context) = 0;
+ }
+ else
+ {
+ AX_reg(context) = 0x8015; /* callback unavailable */
+ SET_CFLAG(context);
+ }
+}
+
+
+static void FreeRMCB( CONTEXT *context )
+{
+ RMCB *CurrRMCB = FirstRMCB;
+ RMCB *PrevRMCB = NULL;
+
+ FIXME(int31, "callback address: %04x:%04x\n",
+ CX_reg(context), DX_reg(context));
+
+ while (CurrRMCB && (CurrRMCB->address != MAKELONG(DX_reg(context), CX_reg(context))))
+ {
+ PrevRMCB = CurrRMCB;
+ CurrRMCB = CurrRMCB->next;
+ }
+ if (CurrRMCB)
+ {
+ if (PrevRMCB)
+ PrevRMCB->next = CurrRMCB->next;
+ else
+ FirstRMCB = CurrRMCB->next;
+ DOSMEM_FreeBlock(DOSMEM_MapRealToLinear(CurrRMCB->address));
+ HeapFree(GetProcessHeap(), 0, CurrRMCB);
+ }
+ else
+ {
+ AX_reg(context) = 0x8024; /* invalid callback address */
+ SET_CFLAG(context);
+ }
+}
+
+
/**********************************************************************
* INT_Int31Handler
*
@@ -280,7 +416,7 @@
break;
}
if (entryPoint)
- AX_reg(context) = LOWORD(MODULE_GetEntryPoint(
+ AX_reg(context) = LOWORD(NE_GetEntryPoint(
GetModuleHandle16( "KERNEL" ),
entryPoint ));
}
@@ -382,15 +518,8 @@
break;
case 0x0301: /* Call real mode procedure with far return */
- {
- REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) );
- FIXME(int31, "RealModeCall: EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n",
- p->eax, p->ebx, p->ecx, p->edx);
- FIXME(int31, " ESI=%08lx EDI=%08lx ES=%04x DS=%04x CS:IP=%04x:%04x\n",
- p->esi, p->edi, p->es, p->ds, p->cs, p->ip );
- SET_CFLAG(context);
- }
- break;
+ CallRMProcFar( context );
+ break;
case 0x0302: /* Call real mode procedure with interrupt return */
{
@@ -402,22 +531,11 @@
break;
case 0x0303: /* Allocate Real Mode Callback Address */
- {
- REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) );
- FIXME(int31, "AllocRMCB: EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n", p->eax, p->ebx, p->ecx, p->edx);
- FIXME(int31, " ESI=%08lx EDI=%08lx ES=%04x DS=%04x CS:IP=%04x:%04x\n", p->esi, p->edi, p->es, p->ds, p->cs, p->ip);
- FIXME(int31, " Function to call: %04x:%04x\n",
- (WORD)DS_reg(context), SI_reg(context) );
- SET_CFLAG(context);
- }
- break;
+ AllocRMCB( context );
+ break;
case 0x0304: /* Free Real Mode Callback Address */
- {
- FIXME(int31, "FreeRMCB: callback address: %04x:%04x\n",
- CX_reg(context), DX_reg(context));
- SET_CFLAG(context);
- }
+ FreeRMCB( context );
break;
case 0x0400: /* Get DPMI version */
diff --git a/msdos/int13.c b/msdos/int13.c
index 761b2ad..68719d2 100644
--- a/msdos/int13.c
+++ b/msdos/int13.c
@@ -67,7 +67,7 @@
if ( (floppy_fd = DRIVE_OpenDevice( drive_nr, O_NONBLOCK)) == -1)
{
- fprintf(stderr, "INT 0x13 (GET DRIVE PARAMETERS): can't determine floppy geometry !\n");
+ WARN(int, "(GET DRIVE PARAMETERS): Can't determine floppy geometry !\n");
BX_reg(context) = 0;
CX_reg(context) = 0;
DH_reg(context) = 0;
diff --git a/msdos/int21.c b/msdos/int21.c
index 8a7c0a2..5ccf18f 100644
--- a/msdos/int21.c
+++ b/msdos/int21.c
@@ -83,7 +83,7 @@
{
if (!(DosHeapHandle = GlobalAlloc16(GMEM_FIXED,sizeof(struct DosHeap))))
{
- fprintf( stderr, "INT21_Init: Out of memory\n");
+ WARN(int21, "Out of memory\n");
return FALSE;
}
heap = (struct DosHeap *) GlobalLock16(DosHeapHandle);
@@ -100,7 +100,8 @@
}
-void CreateBPB(int drive, BYTE *data)
+void CreateBPB(int drive, BYTE *data, BOOL16 limited)
+/* limited == TRUE is used with INT 0x21/0x440d */
{
if (drive > 1) {
setword(data, 512);
@@ -114,9 +115,11 @@
setword(&data[0x0d], 56);
setword(&data[0x0f], 2);
setword(&data[0x11], 0);
- setword(&data[0x1f], 800);
- data[0x21] = 5;
- setword(&data[0x22], 1);
+ if (!limited) {
+ setword(&data[0x1f], 800);
+ data[0x21] = 5;
+ setword(&data[0x22], 1);
+ }
} else { /* 1.44mb */
setword(data, 512);
data[2] = 2;
@@ -129,9 +132,11 @@
setword(&data[0x0d], 18);
setword(&data[0x0f], 2);
setword(&data[0x11], 0);
- setword(&data[0x1f], 80);
- data[0x21] = 7;
- setword(&data[0x22], 2);
+ if (!limited) {
+ setword(&data[0x1f], 80);
+ data[0x21] = 7;
+ setword(&data[0x22], 2);
+ }
}
}
@@ -215,6 +220,8 @@
* bit 6 - file has NOT been written..FIXME: correct?
* bit 8 - generate int24 if no diskspace on write/ read past end of file
* bit 11 - media not removable
+ * bit 14 - don't set file date/time on closing
+ * bit 15 - file is remote
*/
RESET_CFLAG(context);
}
@@ -244,7 +251,7 @@
case 0x60: /* get device parameters */
/* used by w4wgrp's winfile */
- memset(dataptr, 0, 0x26);
+ memset(dataptr, 0, 0x20); /* DOS 6.22 uses 0x20 bytes */
dataptr[0] = 0x04;
dataptr[6] = 0; /* media type */
if (drive > 1)
@@ -259,7 +266,7 @@
setword(&dataptr[2], 0x02); /* removable */
setword(&dataptr[4], 80); /* # of cylinders */
}
- CreateBPB(drive, &dataptr[7]);
+ CreateBPB(drive, &dataptr[7], TRUE);
RESET_CFLAG(context);
break;
@@ -589,7 +596,7 @@
}
if ((int)dta->count + count > 0xffff)
{
- fprintf( stderr, "Too many directory entries in %s\n", dta->unixPath );
+ WARN(int21, "Too many directory entries in %s\n", dta->unixPath );
HeapFree( GetProcessHeap(), 0, dta->unixPath );
dta->unixPath = NULL;
return 0;
@@ -1632,6 +1639,7 @@
*(WORD*)(dataptr+1) = 41;
*(WORD*)(dataptr+3) = WINE_LanguageId;
*(WORD*)(dataptr+5) = CodePage;
+ *(DWORD*)(dataptr+0x19) = NULL; /* FIXME: ptr to case map routine */
break;
case 0x06:
TRACE(int21,"\tget pointer to collating sequence table\n");
diff --git a/msdos/int2f.c b/msdos/int2f.c
index c2d2564..fb8cf67 100644
--- a/msdos/int2f.c
+++ b/msdos/int2f.c
@@ -133,14 +133,14 @@
break;
case 0x84: /* Get device API entry point */
- addr = (DWORD)MODULE_GetEntryPoint( GetModuleHandle16("WPROCS"),
- VXD_BASE + BX_reg(context) );
+ addr = (DWORD)NE_GetEntryPoint( GetModuleHandle16("WPROCS"),
+ VXD_BASE + BX_reg(context) );
if (!addr) /* not supported */
{
- fprintf( stderr,"Application attempted to access VxD %04x\n",
+ WARN(int,"Application attempted to access VxD %04x\n",
BX_reg(context) );
- fprintf( stderr,"This device is not known to Wine.");
- fprintf( stderr,"Expect a failure now\n");
+ WARN(int,"This device is not known to Wine.");
+ WARN(int,"Expect a failure now\n");
}
ES_reg(context) = SELECTOROF(addr);
DI_reg(context) = OFFSETOF(addr);
@@ -217,7 +217,7 @@
break;
default:
- fprintf(stderr, "Unimplemented MSCDEX function 0x%02.2X.\n", AL_reg(context));
+ FIXME(int, "Unimplemented MSCDEX function 0x%02.2X.\n", AL_reg(context));
break;
}
}
diff --git a/msdos/ioports.c b/msdos/ioports.c
index b4924bd..4233fff 100644
--- a/msdos/ioports.c
+++ b/msdos/ioports.c
@@ -236,7 +236,7 @@
b = cmosimage[cmosaddress & 0x3f];
break;
default:
- fprintf( stderr, "Direct I/O read attempted from port %x\n", port);
+ WARN( int, "Direct I/O read attempted from port %x\n", port);
b = 0xff;
break;
}
@@ -274,7 +274,7 @@
case 2: outw( LOWORD(value), port ); break;
case 4: outl( value, port ); break;
default:
- fprintf( stderr, "IO_outport: invalid count %d\n", count);
+ WARN(int, "Invalid count %d\n", count);
}
iopl(0);
return;
@@ -295,8 +295,7 @@
cmosimage[cmosaddress & 0x3f] = b;
break;
default:
- fprintf( stderr, "Direct I/O write attempted "
- "to port %x\n", port );
+ WARN(int, "Direct I/O write attempted to port %x\n", port );
break;
}
port++;
diff --git a/msdos/vxd.c b/msdos/vxd.c
index bc922e3..60a120d 100644
--- a/msdos/vxd.c
+++ b/msdos/vxd.c
@@ -12,7 +12,7 @@
#define VXD_BARF(context,name) \
- fprintf( stderr, "vxd %s: unknown/not implemented parameters:\n" \
+ DUMP( "vxd %s: unknown/not implemented parameters:\n" \
"vxd %s: AX %04x, BX %04x, CX %04x, DX %04x, " \
"SI %04x, DI %04x, DS %04x, ES %04x\n", \
(name), (name), AX_reg(context), BX_reg(context), \
diff --git a/multimedia/audio.c b/multimedia/audio.c
index 780e035..c192a5c 100644
--- a/multimedia/audio.c
+++ b/multimedia/audio.c
@@ -1541,7 +1541,8 @@
lpWIHdr->dwBufferLength);
if (bytesRead==-1)
perror("read from audio device");
- fprintf(stderr,"bytesread = %d (%ld)\n",bytesRead,lpWIHdr->dwBufferLength);
+ TRACE(mciwave,"bytesread=%d (%ld)\n",
+ bytesRead,lpWIHdr->dwBufferLength);
lpWIHdr->dwBytesRecorded = bytesRead;
WInDev[wDevID].dwTotalRecorded += lpWIHdr->dwBytesRecorded;
lpWIHdr->dwFlags &= ~WHDR_INQUEUE;
@@ -1804,7 +1805,7 @@
DWORD wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
DWORD dwParam1, DWORD dwParam2)
{
- fprintf(stderr,"wodMessage(%u, %04X, %08lX, %08lX, %08lX);\n",
+ FIXME(mciwave,"(%u, %04X, %08lX, %08lX, %08lX):stub\n",
wDevID, wMsg, dwUser, dwParam1, dwParam2);
return MMSYSERR_NOTENABLED;
}
@@ -1815,7 +1816,7 @@
DWORD widMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
DWORD dwParam1, DWORD dwParam2)
{
- fprintf(stderr,"widMessage(%u, %04X, %08lX, %08lX, %08lX);\n",
+ FIXME(mciwave,"(%u, %04X, %08lX, %08lX, %08lX):stub\n",
wDevID, wMsg, dwUser, dwParam1, dwParam2);
return MMSYSERR_NOTENABLED;
}
diff --git a/multimedia/dsound.c b/multimedia/dsound.c
index c541d27..4d4ac1c 100644
--- a/multimedia/dsound.c
+++ b/multimedia/dsound.c
@@ -103,7 +103,7 @@
char xbuf[50];
WINE_StringFromCLSID(riid,xbuf);
- fprintf(stderr,"IDirectSound(%p)->QueryInterface(%s,%p)\n",this,xbuf,ppobj);
+ TRACE(dsound,"(%p,%s,%p)\n",this,xbuf,ppobj);
return E_FAIL;
}
@@ -134,9 +134,10 @@
int i;
if (TRACE_ON(dsound)) {
- fprintf(stderr,"IDirectSoundNotify(%p)->SetNotificationPositions(0x%08lx,%p)\n",this,howmuch,notify);
+ TRACE(dsound,"(%p,0x%08lx,%p)\n",this,howmuch,notify);
for (i=0;i<howmuch;i++)
- fprintf(stderr," notify at %ld to 0x%08lx\n",notify[i].dwOffset,(DWORD)notify[i].hEventNotify);
+ TRACE(dsound,"notify at %ld to 0x%08lx\n",
+ notify[i].dwOffset,(DWORD)notify[i].hEventNotify);
}
this->dsb->notifies = HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,this->dsb->notifies,(this->dsb->nrofnotifies+howmuch)*sizeof(DSBPOSITIONNOTIFY));
memcpy( this->dsb->notifies+this->dsb->nrofnotifies,
@@ -163,10 +164,9 @@
) {
memcpy(&(this->wfx),wfex,sizeof(this->wfx));
- TRACE(dsound,"(%p)->SetFormat(%p)\n",
- this,wfex);
- TRACE(dsound," [formattag=0x%04x,chans=%d,samplerate=%ld"
- "bytespersec=%ld,blockalign=%d,bitspersamp=%d,cbSize=%d]\n",
+ TRACE(dsound,"(%p,%p)\n", this,wfex);
+ TRACE(dsound,"(formattag=0x%04x,chans=%d,samplerate=%ld"
+ "bytespersec=%ld,blockalign=%d,bitspersamp=%d,cbSize=%d)\n",
wfex->wFormatTag, wfex->nChannels, wfex->nSamplesPerSec,
wfex->nAvgBytesPerSec, wfex->nBlockAlign,
wfex->wBitsPerSample, wfex->cbSize);
@@ -177,7 +177,7 @@
static HRESULT WINAPI IDirectSoundBuffer_SetVolume(
LPDIRECTSOUNDBUFFER this,LONG vol
) {
- fprintf(stderr,"(%p)->SetVolume(%ld)\n",this,vol);
+ TRACE(dsound,"(%p,%ld)\n",this,vol);
this->volume = vol;
this->volfac = ((double)vol+10000.0)/10000.0;
return 0;
@@ -186,7 +186,7 @@
static HRESULT WINAPI IDirectSoundBuffer_GetVolume(
LPDIRECTSOUNDBUFFER this,LPLONG vol
) {
- TRACE(dsound,"(%p)->GetVolume(%p)\n",this,vol);
+ TRACE(dsound,"(%p,%p)\n",this,vol);
*vol = this->volume;
return 0;
}
@@ -194,7 +194,7 @@
static HRESULT WINAPI IDirectSoundBuffer_SetFrequency(
LPDIRECTSOUNDBUFFER this,DWORD freq
) {
- TRACE(dsound,"(%p)->SetFrequency(%ld)\n",this,freq);
+ TRACE(dsound,"(%p,%ld)\n",this,freq);
this->wfx.nSamplesPerSec = freq;
this->wfx.nAvgBytesPerSec = freq*this->wfx.nChannels*(this->wfx.wBitsPerSample/8);
return 0;
@@ -203,7 +203,7 @@
static HRESULT WINAPI IDirectSoundBuffer_Play(
LPDIRECTSOUNDBUFFER this,DWORD reserved1,DWORD reserved2,DWORD flags
) {
- TRACE(dsound,"(%p)->Play(%08lx,%08lx,%08lx)\n",
+ TRACE(dsound,"(%p,%08lx,%08lx,%08lx)\n",
this,reserved1,reserved2,flags
);
this->playpos = 0;
@@ -213,7 +213,7 @@
}
static HRESULT WINAPI IDirectSoundBuffer_Stop(LPDIRECTSOUNDBUFFER this) {
- TRACE(dsound,"(%p)->Stop()\n",this);
+ TRACE(dsound,"(%p)\n",this);
this->playing = 0;
this->writepos = 0; /* hmm */
return 0;
@@ -247,7 +247,7 @@
static HRESULT WINAPI IDirectSoundBuffer_GetCurrentPosition(
LPDIRECTSOUNDBUFFER this,LPDWORD playpos,LPDWORD writepos
) {
- TRACE(dsound,"(%p)->GetCurrentPosition(%p,%p)\n",this,playpos,writepos);
+ TRACE(dsound,"(%p,%p,%p)\n",this,playpos,writepos);
if (playpos) *playpos = this->playpos;
if (writepos) *writepos = this->writepos;
return 0;
@@ -256,7 +256,7 @@
static HRESULT WINAPI IDirectSoundBuffer_GetStatus(
LPDIRECTSOUNDBUFFER this,LPDWORD status
) {
- TRACE(dsound,"(%p)->GetStatus(%p)\n",this,status);
+ TRACE(dsound,"(%p,%p)\n",this,status);
*status = 0;
if (this->playing)
*status |= DSBSTATUS_PLAYING;
@@ -268,7 +268,7 @@
static HRESULT WINAPI IDirectSoundBuffer_GetFormat(
LPDIRECTSOUNDBUFFER this,LPWAVEFORMATEX lpwf,DWORD wfsize,LPDWORD wfwritten
) {
- TRACE(dsound,"(%p)->GetFormat(%p,%ld,%p)\n",this,lpwf,wfsize,wfwritten);
+ TRACE(dsound,"(%p,%p,%ld,%p)\n",this,lpwf,wfsize,wfwritten);
if (wfsize>sizeof(this->wfx)) wfsize = sizeof(this->wfx);
memcpy(lpwf,&(this->wfx),wfsize);
if (wfwritten) *wfwritten = wfsize;
@@ -279,7 +279,7 @@
LPDIRECTSOUNDBUFFER this,DWORD writecursor,DWORD writebytes,LPVOID lplpaudioptr1,LPDWORD audiobytes1,LPVOID lplpaudioptr2,LPDWORD audiobytes2,DWORD flags
) {
- TRACE(dsound,"(%p)->Lock(%ld,%ld,%p,%p,%p,%p,0x%08lx)\n",
+ TRACE(dsound,"(%p,%ld,%ld,%p,%p,%p,%p,0x%08lx)\n",
this,
writecursor,
writebytes,
@@ -317,7 +317,7 @@
static HRESULT WINAPI IDirectSoundBuffer_SetCurrentPosition(
LPDIRECTSOUNDBUFFER this,DWORD newpos
) {
- TRACE(dsound,"(%p)->SetCurrentPosition(%ld)\n",this,newpos);
+ TRACE(dsound,"(%p,%ld)\n",this,newpos);
this->playpos = newpos;
return 0;
}
@@ -325,7 +325,7 @@
static HRESULT WINAPI IDirectSoundBuffer_SetPan(
LPDIRECTSOUNDBUFFER this,LONG newpan
) {
- TRACE(dsound,"(%p)->SetPan(%ld)\n",this,newpan);
+ TRACE(dsound,"(%p,%ld)\n",this,newpan);
this->pan = newpan;
return 0;
}
@@ -333,7 +333,7 @@
static HRESULT WINAPI IDirectSoundBuffer_GetPan(
LPDIRECTSOUNDBUFFER this,LPLONG pan
) {
- TRACE(dsound,"(%p)->GetPan(%p)\n",this,pan);
+ TRACE(dsound,"(%p,%p)\n",this,pan);
*pan = this->pan;
return 0;
}
@@ -341,18 +341,14 @@
static HRESULT WINAPI IDirectSoundBuffer_Unlock(
LPDIRECTSOUNDBUFFER this,LPVOID p1,DWORD x1,LPVOID p2,DWORD x2
) {
- TRACE(dsound,"(%p)->Unlock(%p,%ld,%p,%ld)\n",
- this,p1,x1,p2,x2
- );
+ FIXME(dsound,"(%p,%p,%ld,%p,%ld):stub\n", this,p1,x1,p2,x2);
return 0;
}
static HRESULT WINAPI IDirectSoundBuffer_GetFrequency(
LPDIRECTSOUNDBUFFER this,LPDWORD freq
) {
- TRACE(dsound,"(%p)->GetFrequency(%p)\n",
- this,freq
- );
+ TRACE(dsound,"(%p,%p)\n",this,freq);
*freq = this->wfx.nSamplesPerSec;
return 0;
}
@@ -360,7 +356,7 @@
static HRESULT WINAPI IDirectSoundBuffer_Initialize(
LPDIRECTSOUNDBUFFER this,LPDIRECTSOUND dsound,LPDSBUFFERDESC dbsd
) {
- fprintf(stderr,"(%p)->Initialize(%p,%p)\n",this,dsound,dbsd);
+ FIXME(dsound,"(%p,%p,%p):stub\n",this,dsound,dbsd);
return DSERR_ALREADYINITIALIZED;
}
@@ -392,7 +388,7 @@
return 0;
}
WINE_StringFromCLSID(riid,xbuf);
- fprintf(stderr,"(%p)->QueryInterface(%s,%p)\n",this,xbuf,ppobj);
+ TRACE(dsound,"(%p,%s,%p)\n",this,xbuf,ppobj);
return E_FAIL;
}
@@ -426,9 +422,7 @@
static HRESULT WINAPI IDirectSound_SetCooperativeLevel(
LPDIRECTSOUND this,HWND32 hwnd,DWORD level
) {
- TRACE(dsound,"(%p)->SetCooperativeLevel(%08lx,%ld)\n",
- this,(DWORD)hwnd,level
- );
+ FIXME(dsound,"(%p,%08lx,%ld):stub\n",this,(DWORD)hwnd,level);
return 0;
}
@@ -437,12 +431,12 @@
LPDIRECTSOUND this,LPDSBUFFERDESC dsbd,LPLPDIRECTSOUNDBUFFER ppdsb,LPUNKNOWN lpunk
) {
if (TRACE_ON(dsound)) {
- fprintf(stderr,"IDirectSound(%p)->CreateSoundBuffer(%p,%p,%p)\n",this,dsbd,ppdsb,lpunk);
- fprintf(stderr,"[size=%ld,",dsbd->dwSize);
- fprintf(stderr,"flags = 0x%08lx,",dsbd->dwFlags);
+ TRACE(dsound,"(%p,%p,%p,%p)\n",this,dsbd,ppdsb,lpunk);
+ TRACE(dsound,"(size=%ld)\n",dsbd->dwSize);
+ TRACE(dsound,"(flags=0x%08lx\n",dsbd->dwFlags);
_dump_DSBCAPS(dsbd->dwFlags);
- fprintf(stderr,"bufferbytes = %ld,",dsbd->dwBufferBytes);
- fprintf(stderr,"lpwfxFormat = %p]\n",dsbd->lpwfxFormat);
+ TRACE(dsound,"(bufferbytes=%ld)\n",dsbd->dwBufferBytes);
+ TRACE(dsound,"(lpwfxFormat=%p)\n",dsbd->lpwfxFormat);
}
*ppdsb = (LPDIRECTSOUNDBUFFER)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectSoundBuffer));
(*ppdsb)->ref =1;
@@ -469,7 +463,7 @@
static HRESULT WINAPI IDirectSound_DuplicateSoundBuffer(
LPDIRECTSOUND this,LPDIRECTSOUNDBUFFER pdsb,LPLPDIRECTSOUNDBUFFER ppdsb
) {
- TRACE(dsound,"IDirectSound(%p)->DuplicateSoundBuffer(%p,%p)\n",this,pdsb,ppdsb);
+ TRACE(dsound,"(%p,%p,%p)\n",this,pdsb,ppdsb);
*ppdsb = (LPDIRECTSOUNDBUFFER)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(IDirectSoundBuffer));
(*ppdsb)->ref =1;
@@ -491,8 +485,8 @@
static HRESULT WINAPI IDirectSound_GetCaps(LPDIRECTSOUND this,LPDSCAPS caps) {
- TRACE(dsound,"IDirectSound(%p)->GetCaps(%p)\n",this,caps);
- TRACE(dsound," flags = 0x%08lx\n",caps->dwFlags);
+ TRACE(dsound,"(%p,%p)\n",this,caps);
+ TRACE(dsound,"(flags=0x%08lx)\n",caps->dwFlags);
caps->dwSize = sizeof(*caps);
caps->dwFlags = DSCAPS_PRIMARYSTEREO|DSCAPS_PRIMARY16BIT|DSCAPS_EMULDRIVER|DSCAPS_SECONDARYSTEREO|DSCAPS_SECONDARY16BIT;
@@ -521,7 +515,7 @@
static HRESULT WINAPI IDirectSound_SetSpeakerConfig(
LPDIRECTSOUND this,DWORD config
) {
- fprintf(stderr,"IDirectSound(%p)->SetSpeakerConfig(0x%08lx)\n",this,config);
+ FIXME(dsound,"(%p,0x%08lx):stub\n",this,config);
return 0;
}
@@ -531,7 +525,7 @@
char xbuf[50];
WINE_StringFromCLSID(riid,xbuf);
- fprintf(stderr,"IDirectSound(%p)->QueryInterface(%s,%p)\n",this,xbuf,ppobj);
+ TRACE(dsound,"(%p,%s,%p)\n",this,xbuf,ppobj);
return E_FAIL;
}
@@ -556,7 +550,7 @@
switch (wfex->wFormatTag) {
default:
- fprintf(stderr,"unknown WAVE_FORMAT tag %d\n",wfex->wFormatTag);
+ WARN(dsound,"unknown WAVE_FORMAT tag %d\n",wfex->wFormatTag);
return DSERR_BADFORMAT;
case WAVE_FORMAT_PCM:
break;
@@ -571,7 +565,7 @@
return -1;
}
if ((xx&format)!=format) {/* format unsupported */
- fprintf(stderr,"SNDCTL_DSP_GETFMTS: format not supported\n");
+ WARN(dsound,"SNDCTL_DSP_GETFMTS: format not supported\n");
return -1;
}
nformat = format;
@@ -580,7 +574,7 @@
return -1;
}
if (nformat!=format) {/* didn't work */
- fprintf(stderr,"SNDCTL_DSP_GETFMTS: format not set\n");
+ WARN(dsound,"SNDCTL_DSP_GETFMTS: format not set\n");
return -1;
}
@@ -594,7 +588,7 @@
perror("ioctl SNDCTL_DSP_SPEED");
return -1;
}
- fprintf(stderr,"freq %ld channels %d bits %d\n",
+ TRACE(dsound,"(freq=%ld,channels=%d,bits=%d)\n",
wfex->nSamplesPerSec,wfex->nChannels,wfex->wBitsPerSample
);
return 0;
@@ -619,7 +613,7 @@
#define CHECK_EVENT \
if (nextevent && (dsb->playpos == nextevent->dwOffset)) { \
SetEvent(nextevent->hEventNotify); \
- fprintf(stderr,"signalled event %d\n",nextevent->hEventNotify);\
+ TRACE(dsound,"signalled event %d\n",nextevent->hEventNotify);\
nextevent = DSOUND_nextevent(dsb); \
}
@@ -633,10 +627,11 @@
if (xdiff<0) xdiff=-xdiff;
if (xdiff>1500) {
- fprintf(stderr,"mixing in buffer of different frequency (%ld vs %ld), argh!\n",dsb->wfx.nSamplesPerSec,dsound->wfx.nSamplesPerSec);
+ WARN(dsound,"mixing in buffer of different frequency (%ld vs %ld), argh!\n",
+ dsb->wfx.nSamplesPerSec,dsound->wfx.nSamplesPerSec);
}
nextevent = DSOUND_nextevent(dsb);
-/* fprintf(stderr,"%d.%d.%d.%d\n",dsound->wfx.wBitsPerSample,dsb->wfx.wBitsPerSample,dsound->wfx.nChannels,dsb->wfx.nChannels);*/
+/* TRACE(dsound,"(%d.%d.%d.%d)\n",dsound->wfx.wBitsPerSample,dsb->wfx.wBitsPerSample,dsound->wfx.nChannels,dsb->wfx.nChannels);*/
if (dsound->wfx.wBitsPerSample == 8) {
char *playbuf8 = (char*)playbuf;
@@ -766,14 +761,14 @@
DSOUND_thread(LPVOID arg) {
int res,i,curleft,playing,haveprimary = 0;
- fprintf(stderr,"dsound is at pid %d\n",getpid());
+ TRACE(dsound,"dsound is at pid %d\n",getpid());
while (1) {
if (!dsound) {
- fprintf(stderr,"DSOUND thread giving up.\n");
+ WARN(dsound,"DSOUND thread giving up.\n");
ExitThread(0);
}
if (getppid()==1) {
- fprintf(stderr,"DSOUND father died? Giving up.\n");
+ WARN(dsound,"DSOUND father died? Giving up.\n");
ExitThread(0);
}
/* RACE: dsound could be deleted */
@@ -849,7 +844,7 @@
HRESULT WINAPI DirectSoundCreate(LPGUID lpGUID,LPDIRECTSOUND *ppDS,IUnknown *pUnkOuter ) {
int xx;
if (lpGUID)
- fprintf(stderr,"DirectSoundCreate(%p,%p,%p)\n",lpGUID,ppDS,pUnkOuter);
+ TRACE(dsound,"(%p,%p,%p)\n",lpGUID,ppDS,pUnkOuter);
#ifdef HAVE_OSS
if (audiofd>=0)
return DSERR_ALLOCATED;
@@ -863,7 +858,7 @@
if (-1==ioctl(audiofd,SNDCTL_DSP_SETFRAGMENT,&xx))
perror("ioctl SETFRAGMENT");
/*
- fprintf(stderr,"SETFRAGMENT. count is now %d, fragsize is %d\n",
+ TRACE(dsound,"SETFRAGMENT. count is now %d, fragsize is %d\n",
(xx>>16)+1,xx&0xffff
);
*/
@@ -896,3 +891,42 @@
return DSERR_NODRIVER;
#endif
}
+
+
+/*******************************************************************************
+ * DllGetClassObject [DSOUND.4]
+ * Retrieves class object from a DLL object
+ *
+ * NOTES
+ * Docs say returns STDAPI
+ *
+ * PARAMS
+ * rclsid [I] CLSID for the class object
+ * riid [I] Reference to identifier of interface for class object
+ * ppv [O] Address of variable to receive interface pointer for riid
+ *
+ * RETURNS
+ * Success: S_OK
+ * Failure: CLASS_E_CLASSNOTAVAILABLE, E_OUTOFMEMORY, E_INVALIDARG,
+ * E_UNEXPECTED
+ */
+DWORD WINAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, LPVOID *ppv )
+{
+ FIXME(dsound, "(%p,%p,%p): stub\n", rclsid, riid, ppv);
+ return S_OK;
+}
+
+
+/*******************************************************************************
+ * DllCanUnloadNow [DSOUND.3] Determines whether the DLL is in use.
+ *
+ * RETURNS
+ * Success: S_OK
+ * Failure: S_FALSE
+ */
+DWORD WINAPI DllCanUnloadNow(void)
+{
+ FIXME(dsound, "(void): stub\n");
+ return S_FALSE;
+}
+
diff --git a/multimedia/joystick.c b/multimedia/joystick.c
index 6a8d2e6..7873daa 100644
--- a/multimedia/joystick.c
+++ b/multimedia/joystick.c
@@ -145,7 +145,7 @@
joy_cnt++;
}
TRACE(mmsys, "returning %d\n", joy_cnt);
- if (!joy_cnt) fprintf(stderr, "No joystick found - "
+ if (!joy_cnt) ERR(mmsys, "No joystick found - "
"perhaps get joystick-0.8.0.tar.gz and load"
"it as module or use Linux >= 2.1.45 to be "
"able to use joysticks.\n");
@@ -409,6 +409,6 @@
*/
MMRESULT16 WINAPI joySetCalibration16(UINT16 wID)
{
- fprintf(stderr, "EMPTY STUB !!! joySetCalibration(%04X);\n", wID);
+ FIXME(mmsys, "(%04X): stub.\n", wID);
return JOYERR_NOCANDO;
}
diff --git a/multimedia/mcianim.c b/multimedia/mcianim.c
index dc915a3..e56f503 100644
--- a/multimedia/mcianim.c
+++ b/multimedia/mcianim.c
@@ -196,7 +196,7 @@
case MCI_FORMAT_TMSF:
for (wTrack = 0; wTrack < AnimDev[wDevID].nTracks; wTrack++) {
/* dwTime += AnimDev[wDevID].lpdwTrackLen[wTrack - 1];
- printf("Adding trk#%u curpos=%u \n", dwTime);
+ TRACE(mcianim, "Adding trk#%u curpos=%u \n", dwTime);
if (dwTime >= dwFrame) break; */
if (AnimDev[wDevID].lpdwTrackPos[wTrack - 1] >= dwFrame) break;
}
@@ -361,11 +361,11 @@
lpParms->dwReturn = MCI_FORMAT_MILLISECONDS;
return 0;
default:
- fprintf(stderr,"ANIM_mciStatus // unknown command %08lX !\n", lpParms->dwItem);
+ WARN(mcianim,"Unknown command %08lX !\n", lpParms->dwItem);
return MCIERR_UNRECOGNIZED_COMMAND;
}
}
- fprintf(stderr,"ANIM_mciStatus // not MCI_STATUS_ITEM !\n");
+ WARN(mcianim,"Not MCI_STATUS_ITEM !\n");
return 0;
}
@@ -500,8 +500,8 @@
TRACE(mcianim,"(%u, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
/*
- printf("ANIM_mciSet // dwTimeFormat=%08lX\n", lpParms->dwTimeFormat);
- printf("ANIM_mciSet // dwAudio=%08lX\n", lpParms->dwAudio);
+ TRACE(mcianim,"(dwTimeFormat=%08lX)\n", lpParms->dwTimeFormat);
+ TRACE(mcianim,"(dwAudio=%08lX)\n", lpParms->dwAudio);
*/
if (dwFlags & MCI_SET_TIME_FORMAT) {
switch (lpParms->dwTimeFormat) {
@@ -515,7 +515,7 @@
TRACE(mcianim,"MCI_FORMAT_TMSF !\n");
break;
default:
- fprintf(stderr,"ANIM_mciSet // bad time format !\n");
+ WARN(mcianim,"Bad time format !\n");
return MCIERR_BAD_TIME_FORMAT;
}
AnimDev[wDevID].dwTimeFormat = lpParms->dwTimeFormat;
diff --git a/multimedia/mcicda.c b/multimedia/mcicda.c
index 48e6ea1..77ce44b 100644
--- a/multimedia/mcicda.c
+++ b/multimedia/mcicda.c
@@ -582,7 +582,7 @@
case MCI_FORMAT_TMSF:
for (wTrack = 0; wTrack < CDADev[wDevID].nTracks; wTrack++) {
/* dwTime += CDADev[wDevID].lpdwTrackLen[wTrack - 1];
- printf("Adding trk#%u curpos=%u \n", dwTime);
+ TRACE(cdaudio, "Adding trk#%u curpos=%u \n", dwTime);
if (dwTime >= dwFrame) break; */
if (CDADev[wDevID].lpdwTrackPos[wTrack - 1] >= dwFrame) break;
}
@@ -938,8 +938,8 @@
TRACE(cdaudio,"(%04X, %08lX, %p);\n", wDevID, dwFlags, lpParms);
if (lpParms == NULL) return MCIERR_INTERNAL;
/*
- printf("CDAUDIO_mciSet // dwTimeFormat=%08lX\n", lpParms->dwTimeFormat);
- printf("CDAUDIO_mciSet // dwAudio=%08lX\n", lpParms->dwAudio);
+ TRACE(cdaudio,"dwTimeFormat=%08lX\n", lpParms->dwTimeFormat);
+ TRACE(cdaudio,"dwAudio=%08lX\n", lpParms->dwAudio);
*/
if (dwFlags & MCI_SET_TIME_FORMAT) {
switch (lpParms->dwTimeFormat) {
diff --git a/multimedia/mixer.c b/multimedia/mixer.c
index 1233531..4b554e6 100644
--- a/multimedia/mixer.c
+++ b/multimedia/mixer.c
@@ -150,18 +150,18 @@
lpml->fdwLine |= MIXERLINE_LINEF_SOURCE;
break;
default:
- fprintf(stderr,"MIX_GetLineInfo:mixertype %d not handle.\n",i);
+ ERR(mmaux,"Mixertype %d not handle.\n",i);
break;
}
break;
case MIXER_GETLINEINFOF_LINEID:
- fprintf(stderr,"MIX_GetLineInfo: _LINEID (%ld) not implemented yet.\n",lpml->dwLineID);
+ FIXME(mmaux,"_LINEID (%ld) not implemented yet.\n",lpml->dwLineID);
break;
case MIXER_GETLINEINFOF_COMPONENTTYPE:
- fprintf(stderr,"MIX_GetLineInfo: _COMPONENTTYPE not implemented yet.\n");
+ FIXME(mmaux," _COMPONENTTYPE not implemented yet.\n");
break;
case MIXER_GETLINEINFOF_TARGETTYPE:
- fprintf(stderr,"MIX_GetLineInfo: _TARGETTYPE not implemented yet.\n");
+ FIXME(mmaux,"_TARGETTYPE not implemented yet.\n");
break;
}
lpml->Target.dwType = MIXERLINE_TARGETTYPE_AUX;
diff --git a/multimedia/mmio.c b/multimedia/mmio.c
index c7117a0..b1f6941 100644
--- a/multimedia/mmio.c
+++ b/multimedia/mmio.c
@@ -375,8 +375,9 @@
UINT16 WINAPI mmioSetBuffer(HMMIO16 hmmio, LPSTR pchBuffer,
LONG cchBuffer, UINT16 uFlags)
{
- FIXME(mmio, "empty stub \n");
- return 0;
+ FIXME(mmio, "(hmmio=%d, pchBuf=%p, cchBuf=%d, uFlags=%#08x): stub\n",
+ hmmio, pchBuffer, cchBuffer, uFlags);
+ return MMIOERR_OUTOFMEMORY;
}
/**************************************************************************
diff --git a/multimedia/time.c b/multimedia/time.c
index 1afcce4..a1ae385 100644
--- a/multimedia/time.c
+++ b/multimedia/time.c
@@ -380,7 +380,7 @@
/* FIXME all this function should have to be is
long result;
struct timeval time;
- dprintf_mmtime(stddeb, "timeGetTime(); !\n");
+ TRACE(mmtime,"timeGetTime(); !\n");
gettimeofday(&time, 0);
result = (((long)time.tv_sec * (long)1000) + ((long)time.tv_usec / (long)1000));
diff --git a/objects/bitmap.c b/objects/bitmap.c
index 71fc644..241eaf3 100644
--- a/objects/bitmap.c
+++ b/objects/bitmap.c
@@ -81,7 +81,7 @@
break;
default:
- fprintf(stderr,"GetBitsPadding: unknown depth %d, please report.\n", bpp );
+ WARN(bitmap,"Unknown depth %d, please report.\n", bpp );
return -1;
}
return pad;
@@ -115,7 +115,7 @@
return 2 * ((bmWidth+3) >> 2);
default:
- fprintf(stderr,"GetBitsPadding: unknown depth %d, please report.\n", bpp );
+ WARN(bitmap,"Unknown depth %d, please report.\n", bpp );
}
return -1;
}
@@ -130,8 +130,19 @@
}
-/***********************************************************************
- * CreateBitmap32 (GDI32.25)
+/******************************************************************************
+ * CreateBitmap32 [GDI32.25] Creates a bitmap with the specified info
+ *
+ * PARAMS
+ * width [I] bitmap width
+ * height [I] bitmap height
+ * planes [I] Number of color planes
+ * bpp [I] Number of bits to identify a color
+ * bits [I] Pointer to array containing color data
+ *
+ * RETURNS
+ * Success: Handle to bitmap
+ * Failure: NULL
*/
HBITMAP32 WINAPI CreateBitmap32( INT32 width, INT32 height, UINT32 planes,
UINT32 bpp, LPCVOID bits )
@@ -142,8 +153,7 @@
planes = (BYTE)planes;
bpp = (BYTE)bpp;
- TRACE(gdi, "%dx%d, %d colors\n",
- width, height, 1 << (planes*bpp) );
+ TRACE(gdi, "%dx%d, %d colors\n", width, height, 1 << (planes*bpp) );
/* Check parameters */
if (!height || !width || planes != 1) return 0;
@@ -190,17 +200,31 @@
}
-/***********************************************************************
- * CreateCompatibleBitmap32 (GDI32.30)
+/******************************************************************************
+ * CreateCompatibleBitmap32 [GDI32.30] Creates a bitmap compatible with the DC
+ *
+ * PARAMS
+ * hdc [I] Handle to device context
+ * width [I] Width of bitmap
+ * height [I] Height of bitmap
+ *
+ * RETURNS
+ * Success: Handle to bitmap
+ * Failure: NULL
*/
-HBITMAP32 WINAPI CreateCompatibleBitmap32(HDC32 hdc, INT32 width, INT32 height)
+HBITMAP32 WINAPI CreateCompatibleBitmap32( HDC32 hdc, INT32 width, INT32 height)
{
HBITMAP32 hbmpRet = 0;
DC *dc;
- TRACE(gdi, "(%04x,%d,%d) = \n",
- hdc, width, height );
+ TRACE(gdi, "(%04x,%d,%d) = \n", hdc, width, height );
if (!(dc = DC_GetDCPtr( hdc ))) return 0;
+ if ((width >0x1000) || (height > 0x1000))
+ {
+ FIXME(gdi,"got bad width %d or height %d, please look for reason\n",
+ width, height );
+ return 0;
+ }
hbmpRet = CreateBitmap32( width, height, 1, dc->w.bitsPerPixel, NULL );
TRACE(gdi,"\t\t%04x\n", hbmpRet);
return hbmpRet;
@@ -217,10 +241,15 @@
}
-/***********************************************************************
- * CreateBitmapIndirect32 (GDI32.26)
+/******************************************************************************
+ * CreateBitmapIndirect32 [GDI32.26] Creates a bitmap with the specifies info
+ *
+ * RETURNS
+ * Success: Handle to bitmap
+ * Failure: NULL
*/
-HBITMAP32 WINAPI CreateBitmapIndirect32( const BITMAP32 * bmp )
+HBITMAP32 WINAPI CreateBitmapIndirect32(
+ const BITMAP32 * bmp) /* [in] Pointer to the bitmap data */
{
return CreateBitmap32( bmp->bmWidth, bmp->bmHeight, bmp->bmPlanes,
bmp->bmBitsPixel, bmp->bmBits );
@@ -249,9 +278,16 @@
/***********************************************************************
- * GetBitmapBits32 (GDI32.143)
+ * GetBitmapBits32 [GDI32.143] Copies bitmap bits of bitmap to buffer
+ *
+ * RETURNS
+ * Success: Number of bytes copied
+ * Failure: 0
*/
-LONG WINAPI GetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPVOID buffer )
+LONG WINAPI GetBitmapBits32(
+ HBITMAP32 hbitmap, /* [in] Handle to bitmap */
+ LONG count, /* [in] Number of bytes to copy */
+ LPVOID buffer) /* [out] Pointer to buffer to receive bits */
{
BITMAPOBJ * bmp;
LONG height, old_height;
@@ -261,7 +297,7 @@
/* KLUDGE! */
if (count < 0) {
- fprintf(stderr, "Negative number of bytes (%ld) passed to GetBitmapBits???\n", count );
+ WARN(bitmap, "(%ld): Negative number of bytes passed???\n", count );
count = -count;
}
bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
@@ -356,6 +392,9 @@
}
tbuf += pad;
}
+ break;
+ default:
+ FIXME(bitmap, "Unhandled bits:%d\n", bmp->bitmap.bmBitsPixel);
}
XDestroyImage( image );
LeaveCriticalSection( &X11DRV_CritSection );
@@ -374,10 +413,17 @@
}
-/***********************************************************************
- * SetBitmapBits32 (GDI32.303)
+/******************************************************************************
+ * SetBitmapBits32 [GDI32.303] Sets bits of color data for a bitmap
+ *
+ * RETURNS
+ * Success: Number of bytes used in setting the bitmap bits
+ * Failure: 0
*/
-LONG WINAPI SetBitmapBits32( HBITMAP32 hbitmap, LONG count, LPCVOID buffer )
+LONG WINAPI SetBitmapBits32(
+ HBITMAP32 hbitmap, /* [in] Handle to bitmap */
+ LONG count, /* [in] Number of bytes in bitmap array */
+ LPCVOID buffer) /* [in] Address of array with bitmap bits */
{
struct XPutImage_descr descr;
BITMAPOBJ * bmp;
@@ -388,7 +434,7 @@
/* KLUDGE! */
if (count < 0) {
- fprintf(stderr, "Negative number of bytes (%ld) passed to SetBitmapBits???\n", count );
+ WARN(bitmap, "(%ld): Negative number of bytes passed???\n", count );
count = -count;
}
bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
@@ -491,17 +537,19 @@
return height * bmp->bitmap.bmWidthBytes;
}
+/***********************************************************************
+ * LoadImage16 [USER.389]
+ *
+ */
HANDLE16 WINAPI LoadImage16( HINSTANCE16 hinst, LPCSTR name, UINT16 type,
INT16 desiredx, INT16 desiredy, UINT16 loadflags)
{
if (HIWORD(name)) {
- fprintf(stddeb,"LoadImage16(0x%04x,%s,%d,%d,%d,0x%08x)\n",
- hinst,(char *)PTR_SEG_TO_LIN(name),type,desiredx,desiredy,loadflags
- );
+ TRACE(resource,"(0x%04x,%s,%d,%d,%d,0x%08x)\n",
+ hinst,(char *)PTR_SEG_TO_LIN(name),type,desiredx,desiredy,loadflags);
} else {
- fprintf(stddeb,"LoadImage16(0x%04x,%p,%d,%d,%d,0x%08x)\n",
- hinst,name,type,desiredx,desiredy,loadflags
- );
+ TRACE(resource,"LoadImage16(0x%04x,%p,%d,%d,%d,0x%08x)\n",
+ hinst,name,type,desiredx,desiredy,loadflags);
}
switch (type) {
case IMAGE_BITMAP:
@@ -514,8 +562,10 @@
return 0;
}
+
/**********************************************************************
* LoadImage32A (USER32.365)
+ *
* FIXME: implementation still lacks nearly all features, see LR_*
* defines in windows.h
*/
@@ -543,8 +593,35 @@
return 0;
}
+/**********************************************************************
+ * LoadImage32W (USER32.366)
+ *
+ * FIXME: implementation still lacks nearly all features, see LR_*
+ * defines in windows.h
+ */
+
+
+/******************************************************************************
+ * LoadImage32W [USER32.366] Loads an icon, cursor, or bitmap
+ *
+ * PARAMS
+ * hinst [I] Handle of instance that contains image
+ * name [I] Name of image
+ * type [I] Type of image
+ * desiredx [I] Desired width
+ * desiredy [I] Desired height
+ * loadflags [I] Load flags
+ *
+ * RETURNS
+ * Success: Handle to newly loaded image
+ * Failure: NULL
+ *
+ * BUGS
+ * Implementation still lacks nearly all features, see LR_*
+ * defines in windows.h
+ */
HANDLE32 WINAPI LoadImage32W( HINSTANCE32 hinst, LPCWSTR name, UINT32 type,
- INT32 desiredx, INT32 desiredy, UINT32 loadflags)
+ INT32 desiredx, INT32 desiredy, UINT32 loadflags )
{
if (HIWORD(name)) {
TRACE(resource,"(0x%04x,%p,%d,%d,%d,0x%08x)\n",
@@ -555,20 +632,25 @@
hinst,name,type,desiredx,desiredy,loadflags
);
}
- switch (type) {
- case IMAGE_BITMAP:
- return LoadBitmap32W(hinst,name);
- case IMAGE_ICON:
- return LoadIcon32W(hinst,name);
- case IMAGE_CURSOR:
- return LoadCursor32W(hinst,name);
- }
- return 0;
+
+ switch (type) {
+ case IMAGE_BITMAP:
+ return LoadBitmap32W(hinst,name);
+ case IMAGE_ICON:
+ return LoadIcon32W(hinst,name);
+ case IMAGE_CURSOR:
+ return LoadCursor32W(hinst,name);
+ }
+ return NULL;
}
+
/**********************************************************************
* CopyBitmap32 (not an API)
*
+ * NOTES
+ * If it is not an API, why is it declared with WINAPI?
+ *
*/
HBITMAP32 WINAPI CopyBitmap32 (HBITMAP32 hnd)
{
@@ -583,8 +665,20 @@
return res;
}
-/**********************************************************************
- * CopyImage32 (USER32.61)
+
+/******************************************************************************
+ * CopyImage32 [USER32.61] Creates new image and copies attributes to it
+ *
+ * PARAMS
+ * hnd [I] Handle to image to copy
+ * type [I] Type of image to copy
+ * desiredx [I] Desired width of new image
+ * desiredy [I] Desired height of new image
+ * flags [I] Copy flags
+ *
+ * RETURNS
+ * Success: Handle to newly created image
+ * Failure: NULL
*
* FIXME: implementation still lacks nearly all features, see LR_*
* defines in windows.h
@@ -607,6 +701,9 @@
/**********************************************************************
* LoadBitmap16 (USER.175)
+ *
+ * NOTES
+ * Can this call LoadBitmap32?
*/
HBITMAP16 WINAPI LoadBitmap16( HINSTANCE16 instance, SEGPTR name )
{
@@ -647,10 +744,17 @@
return hbitmap;
}
-/**********************************************************************
- * LoadBitmap32W (USER32.358)
+
+/******************************************************************************
+ * LoadBitmap32W [USER32.358] Loads bitmap from the executable file
+ *
+ * RETURNS
+ * Success: Handle to specified bitmap
+ * Failure: NULL
*/
-HBITMAP32 WINAPI LoadBitmap32W( HINSTANCE32 instance, LPCWSTR name )
+HBITMAP32 WINAPI LoadBitmap32W(
+ HINSTANCE32 instance, /* [in] Handle to application instance */
+ LPCWSTR name) /* [in] Address of bitmap resource name */
{
HBITMAP32 hbitmap = 0;
HDC32 hdc;
@@ -754,7 +858,6 @@
}
-
/***********************************************************************
* CreateDiscardableBitmap16 (GDI.156)
*/
@@ -765,11 +868,17 @@
}
-/***********************************************************************
- * CreateDiscardableBitmap32 (GDI32.38)
+/******************************************************************************
+ * CreateDiscardableBitmap32 [GDI32.38] Creates a discardable bitmap
+ *
+ * RETURNS
+ * Success: Handle to bitmap
+ * Failure: NULL
*/
-HBITMAP32 WINAPI CreateDiscardableBitmap32( HDC32 hdc, INT32 width,
- INT32 height )
+HBITMAP32 WINAPI CreateDiscardableBitmap32(
+ HDC32 hdc, /* [in] Handle to device context */
+ INT32 width, /* [in] Bitmap width */
+ INT32 height) /* [in] Bitmap height */
{
return CreateCompatibleBitmap32( hdc, width, height );
}
@@ -777,6 +886,9 @@
/***********************************************************************
* GetBitmapDimensionEx16 (GDI.468)
+ *
+ * NOTES
+ * Can this call GetBitmapDimensionEx32?
*/
BOOL16 WINAPI GetBitmapDimensionEx16( HBITMAP16 hbitmap, LPSIZE16 size )
{
@@ -788,10 +900,16 @@
}
-/***********************************************************************
- * GetBitmapDimensionEx32 (GDI32.144)
+/******************************************************************************
+ * GetBitmapDimensionEx32 [GDI32.144] Retrieves dimensions of a bitmap
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
*/
-BOOL32 WINAPI GetBitmapDimensionEx32( HBITMAP32 hbitmap, LPSIZE32 size )
+BOOL32 WINAPI GetBitmapDimensionEx32(
+ HBITMAP32 hbitmap, /* [in] Handle to bitmap */
+ LPSIZE32 size) /* [out] Address of struct receiving dimensions */
{
BITMAPOBJ * bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
if (!bmp) return FALSE;
@@ -829,11 +947,18 @@
}
-/***********************************************************************
- * SetBitmapDimensionEx32 (GDI32.304)
+/******************************************************************************
+ * SetBitmapDimensionEx32 [GDI32.304] Assignes dimensions to a bitmap
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
*/
-BOOL32 WINAPI SetBitmapDimensionEx32( HBITMAP32 hbitmap, INT32 x, INT32 y,
- LPSIZE32 prevSize )
+BOOL32 WINAPI SetBitmapDimensionEx32(
+ HBITMAP32 hbitmap, /* [in] Handle to bitmap */
+ INT32 x, /* [in] Bitmap width */
+ INT32 y, /* [in] Bitmap height */
+ LPSIZE32 prevSize) /* [out] Address of structure for orig dims */
{
BITMAPOBJ * bmp = (BITMAPOBJ *) GDI_GetObjPtr( hbitmap, BITMAP_MAGIC );
if (!bmp) return FALSE;
diff --git a/objects/clipping.c b/objects/clipping.c
index 1736092..7025d74 100644
--- a/objects/clipping.c
+++ b/objects/clipping.c
@@ -29,7 +29,7 @@
if (!dc->w.hVisRgn)
{
- fprintf( stderr, "UpdateGCRegion: hVisRgn is zero. Please report this.\n" );
+ ERR(region, "hVisRgn is zero. Please report this.\n" );
exit(1);
}
@@ -463,7 +463,7 @@
TRACE(clipping, "%04x\n", hdc );
if (!dc->w.hVisRgn)
{
- fprintf( stderr, "SaveVisRgn: hVisRgn is zero. Please report this.\n" );
+ ERR(region, "hVisRgn is zero. Please report this.\n" );
exit(1);
}
if( dc->w.flags & DC_DIRTY ) UPDATE_DIRTY_DC(dc);
diff --git a/objects/color.c b/objects/color.c
index 9f37ebc..50779dc 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -288,7 +288,7 @@
COLOR_sysPal = (PALETTEENTRY*)xmalloc(sizeof(PALETTEENTRY)*cs->size);
- TRACE(palette,"\tbuilding private map - %i palette entries\n", cs->size);
+ TRACE(palette,"Building private map - %i palette entries\n", cs->size);
/* Allocate system palette colors */
@@ -347,7 +347,7 @@
else if (COLOR_max < 20) COLOR_max = 20;
TRACE(palette,"%d colors configured.\n", COLOR_max);
- TRACE(palette,"\tbuilding shared map - %i palette entries\n", cs->size);
+ TRACE(palette,"Building shared map - %i palette entries\n", cs->size);
/* Be nice and allocate system colors as read-only */
@@ -402,7 +402,7 @@
sysPixel[i] = color.pixel;
- TRACE(palette,"\tsyscolor(%lx) -> pixel %i\n",
+ TRACE(palette,"syscolor(%lx) -> pixel %i\n",
*(COLORREF*)(__sysPalTemplate+i), (int)color.pixel);
/* Set EGA mapping if color in the first or last eight */
@@ -419,7 +419,7 @@
{
int c_min = 0, c_max = cs->size, c_val;
- TRACE(palette,"\tdynamic colormap... \n");
+ TRACE(palette,"Dynamic colormap... \n");
/* comment this out if you want to debug palette init */
@@ -453,7 +453,7 @@
if( !TSXAllocColorCells(display, cs->colorMap, False,
plane_masks, 0, pixDynMapping, c_min) )
{
- fprintf(stderr,"Inexplicable failure during colorcell allocation.\n");
+ WARN(palette,"Inexplicable failure during colorcell allocation.\n");
c_min = 0;
}
@@ -470,7 +470,7 @@
* to maintain compatibility
*/
cs->size = 256;
- TRACE(palette,"\tvirtual colorspace - screendepth %i\n", screenDepth);
+ TRACE(palette,"Virtual colorspace - screendepth %i\n", screenDepth);
}
else cs->size = NB_RESERVED_COLORS; /* system palette only - however we can alloc a bunch
* of colors and map to them */
@@ -529,7 +529,7 @@
else
COLOR_PaletteToPixel[i] = i;
- TRACE(palette,"\tindex %i -> pixel %i\n", i, COLOR_PaletteToPixel[i]);
+ TRACE(palette,"index %i -> pixel %i\n", i, COLOR_PaletteToPixel[i]);
if( COLOR_PixelToPalette )
COLOR_PixelToPalette[COLOR_PaletteToPixel[i]] = i;
@@ -798,7 +798,7 @@
else if( spec_type == 1 ) /* PALETTEINDEX */
if( (i = color & 0x0000ffff) >= size )
{
- fprintf(stderr, "\tRGB(%lx) : idx %d is out of bounds, assuming NULL\n", color, i);
+ WARN(palette, "RGB(%lx) : idx %d is out of bounds, assuming NULL\n", color, i);
color = *(COLORREF*)palPalEntry;
}
else color = *(COLORREF*)(palPalEntry + i);
@@ -888,7 +888,7 @@
if( (idx = color & 0xffff) >= palPtr->logpalette.palNumEntries)
{
- fprintf(stderr, "\tRGB(%lx) : idx %d is out of bounds, assuming black\n", color, idx);
+ WARN(palette, "RGB(%lx) : idx %d is out of bounds, assuming black\n", color, idx);
GDI_HEAP_UNLOCK( hPal );
return 0;
}
@@ -941,7 +941,7 @@
if( !palPtr ) return 0;
else if( !palPtr->mapping )
- WARN(palette, "\tpalette %04x is not realized\n", dc->w.hPalette);
+ WARN(palette, "Palette %04x is not realized\n", dc->w.hPalette);
switch(spec_type) /* we have to peruse DC and system palette */
{
@@ -960,24 +960,24 @@
index = COLOR_PaletteLookupPixel( COLOR_sysPal, 256,
COLOR_PaletteToPixel, color, FALSE);
- /* TRACE(palette,"\tRGB(%lx) -> pixel %i\n", color, index);
+ /* TRACE(palette,"RGB(%lx) -> pixel %i\n", color, index);
*/
break;
case 1: /* PALETTEINDEX */
index = color & 0xffff;
if( index >= palPtr->logpalette.palNumEntries )
- fprintf(stderr, "\tRGB(%lx) : index %i is out of bounds\n", color, index);
+ WARN(palette, "RGB(%lx) : index %i is out of bounds\n", color, index);
else if( palPtr->mapping ) index = palPtr->mapping[index];
- /* TRACE(palette,"\tPALETTEINDEX(%04x) -> pixel %i\n", (WORD)color, index);
+ /* TRACE(palette,"PALETTEINDEX(%04x) -> pixel %i\n", (WORD)color, index);
*/
break;
case 2: /* PALETTERGB */
index = COLOR_PaletteLookupPixel( palPtr->logpalette.palPalEntry,
palPtr->logpalette.palNumEntries,
palPtr->mapping, color, FALSE);
- /* TRACE(palette,"\tPALETTERGB(%lx) -> pixel %i\n", color, index);
+ /* TRACE(palette,"PALETTERGB(%lx) -> pixel %i\n", color, index);
*/
break;
}
@@ -1020,7 +1020,7 @@
index = *(WORD*)(palPtr->logpalette.palPalEntry + uStart);
if( index > 255 || (index >= COLOR_gapStart && index <= COLOR_gapEnd) )
{
- fprintf(stderr,"PC_EXPLICIT: idx %d out of system palette, assuming black.\n", index);
+ WARN(palette,"PC_EXPLICIT: idx %d out of system palette, assuming black.\n", index);
index = 0;
}
break;
@@ -1077,7 +1077,7 @@
if( !prevMapping || palPtr->mapping[uStart] != index ) iRemapped++;
palPtr->mapping[uStart] = index;
- TRACE(palette,"\tentry %i (%lx) -> pixel %i\n", uStart,
+ TRACE(palette,"entry %i (%lx) -> pixel %i\n", uStart,
*(COLORREF*)(palPtr->logpalette.palPalEntry + uStart), index);
}
diff --git a/objects/cursoricon.c b/objects/cursoricon.c
index 84170bf..36918ef 100644
--- a/objects/cursoricon.c
+++ b/objects/cursoricon.c
@@ -44,6 +44,7 @@
#include "keyboard.h"
extern UINT16 COLOR_GetSystemPaletteSize();
+extern void _XInitImageFuncPtrs(XImage *);
Cursor CURSORICON_XCursor = None; /* Current X cursor */
static HCURSOR32 hActiveCursor = 0; /* Active cursor */
@@ -63,7 +64,7 @@
if (dir->idCount < 1)
{
- fprintf( stderr, "Icon: empty directory!\n" );
+ WARN(icon, "Empty directory!\n" );
return NULL;
}
if (dir->idCount == 1) return &dir->idEntries[0].icon; /* No choice... */
@@ -168,7 +169,7 @@
if (dir->idCount < 1)
{
- fprintf( stderr, "Cursor: empty directory!\n" );
+ WARN(cursor, "Empty directory!\n" );
return NULL;
}
if (dir->idCount == 1) return &dir->idEntries[0].cursor; /* No choice... */
@@ -278,7 +279,7 @@
* Convert to mono when cFlag is LR_MONOCHROME. Do something
* with cbSize parameter as well.
*/
-static HGLOBAL16 CURSORICON_CreateFromResource( HINSTANCE32 hInstance, HGLOBAL16 hObj, LPBYTE bits,
+static HGLOBAL16 CURSORICON_CreateFromResource( HINSTANCE16 hInstance, HGLOBAL16 hObj, LPBYTE bits,
UINT32 cbSize, BOOL32 bIcon, DWORD dwVersion,
INT32 width, INT32 height, UINT32 cFlag )
{
@@ -400,7 +401,7 @@
CURSORICONINFO *info;
/* Make it owned by the module */
- if (hInstance) FarSetOwner( hObj, MODULE_HANDLEtoHMODULE16(hInstance));
+ if (hInstance) FarSetOwner( hObj, GetExePtr(hInstance) );
info = (CURSORICONINFO *)GlobalLock16( hObj );
info->ptHotSpot.x = hotspot.x;
@@ -571,7 +572,7 @@
if( !pRsrcEntry->ResourceHandle )
{
LPBYTE bits = (LPBYTE)LockResource32( handle );
- h = CURSORICON_CreateFromResource( hInstance, 0, bits, dirEntry.icon.dwBytesInRes,
+ h = CURSORICON_CreateFromResource( 0, 0, bits, dirEntry.icon.dwBytesInRes,
!fCursor, 0x00030000, width, height, LR_DEFAULTCOLOR );
pRsrcEntry->ResourceHandle = h;
}
@@ -1099,7 +1100,8 @@
while(hwnd)
{
Window win = WIN_GetXWindow( hwnd );
- if (win) XDefineCursor( display, win, cursor );
+ if (win && win!=DefaultRootWindow(display))
+ XDefineCursor( display, win, cursor );
hwnd = GetWindow32( hwnd, GW_HWNDNEXT );
}
}
@@ -1555,31 +1557,54 @@
return hObj;
}
+
/**********************************************************************
* DrawIconEx16 (USER.394)
*/
-
BOOL16 WINAPI DrawIconEx16 (HDC16 hdc, INT16 xLeft, INT16 yTop, HICON16 hIcon,
INT16 cxWidth, INT16 cyWidth, UINT16 istep,
HBRUSH16 hbr, UINT16 flags)
{
- return DrawIconEx32 (hdc, xLeft, yTop, hIcon, cxWidth, cyWidth,
- istep, hbr, flags);
+ return DrawIconEx32(hdc, xLeft, yTop, hIcon, cxWidth, cyWidth,
+ istep, hbr, flags);
}
-/**********************************************************************
- * DrawIconEx32 (USER32.160)
- */
-BOOL32 WINAPI DrawIconEx32 (HDC32 hdc, INT32 x0, INT32 y0, HICON32 hIcon,
- INT32 cxWidth, INT32 cyWidth, UINT32 istep,
- HBRUSH32 hbr, UINT32 flags)
+/******************************************************************************
+ * DrawIconEx32 [USER32.160] Draws an icon or cursor on device context
+ *
+ * NOTES
+ * Why is this using SM_CXICON instead of SM_CXCURSOR?
+ *
+ * PARAMS
+ * hdc [I] Handle to device context
+ * x0 [I] X coordinate of upper left corner
+ * y0 [I] Y coordinate of upper left corner
+ * hIcon [I] Handle to icon to draw
+ * cxWidth [I] Width of icon
+ * cyWidth [I] Height of icon
+ * istep [I] Index of frame in animated cursor
+ * hbr [I] Handle to background brush
+ * flags [I] Icon-drawing flags
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
+BOOL32 WINAPI DrawIconEx32( HDC32 hdc, INT32 x0, INT32 y0, HICON32 hIcon,
+ INT32 cxWidth, INT32 cyWidth, UINT32 istep,
+ HBRUSH32 hbr, UINT32 flags )
{
CURSORICONINFO *ptr = (CURSORICONINFO *)GlobalLock16 (hIcon);
HDC32 hMemDC = CreateCompatibleDC32 (hdc);
BOOL32 result = FALSE;
- FIXME(icon, "part stub.\n");
+ if (istep)
+ FIXME(icon, "Ignoring istep=%d\n", istep);
+ if (hbr)
+ FIXME(icon, "Ignoring hbr=%x\n", hbr);
+ if (flags & DI_COMPAT)
+ FIXME(icon, "Ignoring flag DI_COMPAT\n");
if (hMemDC && ptr)
{
diff --git a/objects/dc.c b/objects/dc.c
index 8db9adc..6c71c18 100644
--- a/objects/dc.c
+++ b/objects/dc.c
@@ -428,7 +428,7 @@
GCFont, &val );
return TRUE;
}
- fprintf( stderr, "DC_SetupGCForText: physical font failure\n" );
+ WARN(dc, "Physical font failure\n" );
return FALSE;
}
@@ -911,7 +911,7 @@
*/
HDC16 WINAPI ResetDC16( HDC16 hdc, const DEVMODE16 *devmode )
{
- fprintf( stderr, "ResetDC16: empty stub!\n" );
+ FIXME(dc, "stub\n" );
return hdc;
}
@@ -921,7 +921,7 @@
*/
HDC32 WINAPI ResetDC32A( HDC32 hdc, const DEVMODE32A *devmode )
{
- fprintf( stderr, "ResetDC32A: empty stub!\n" );
+ FIXME(dc, "stub\n" );
return hdc;
}
@@ -931,7 +931,7 @@
*/
HDC32 WINAPI ResetDC32W( HDC32 hdc, const DEVMODE32W *devmode )
{
- fprintf( stderr, "ResetDC32A: empty stub!\n" );
+ FIXME(dc, "stub\n" );
return hdc;
}
diff --git a/objects/dib.c b/objects/dib.c
index 7dd033f..a5ae6e3 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -77,7 +77,8 @@
for( i = 0; bitmapDepthTable[i] ; i++ )
if( bitmapDepthTable[i] == depth )
return (4 * ((width * ximageDepthTable[i] + 31)/32));
- fprintf(stderr, "DIB: unsupported depth %d.\n", depth );
+
+ WARN(bitmap, "(%d): Unsupported depth\n", depth );
return (4 * width);
}
@@ -101,7 +102,7 @@
case 24: words = (width * 3 + 3)/4; break;
default:
- fprintf(stderr, "DIB: unsupported depth %d.\n", depth );
+ WARN(bitmap, "(%d): Unsupported depth\n", depth );
/* fall through */
case 32:
words = width;
@@ -161,8 +162,7 @@
*bpp = core->bcBitCount;
return 0;
}
- fprintf( stderr, "DIB_GetBitmapInfo: wrong size (%ld) for header\n",
- header->biSize );
+ WARN(bitmap, "(%ld): wrong size for header\n", header->biSize );
return -1;
}
@@ -825,7 +825,7 @@
descr->width, descr->xSrc, descr->dc, bmpImage);
break;
default:
- fprintf( stderr, "Invalid depth %d for SetDIBits!\n", descr->infoBpp );
+ WARN(bitmap, "(%d): Invalid depth\n", descr->infoBpp );
break;
}
if (colorMapping) HeapFree( GetProcessHeap(), 0, colorMapping );
@@ -886,8 +886,21 @@
}
-/***********************************************************************
- * SetDIBits32 (GDI32.312)
+/******************************************************************************
+ * SetDIBits32 [GDI32.312] Sets pixels in a bitmap using colors from DIB
+ *
+ * PARAMS
+ * hdc [I] Handle to device context
+ * hbitmap [I] Handle to bitmap
+ * startscan [I] Starting scan line
+ * lines [I] Number of scan lines
+ * bits [I] Array of bitmap bits
+ * info [I] Address of structure with data
+ * coloruse [I] Type of color indexes to use
+ *
+ * RETURNS
+ * Success: Number of scan lines copied
+ * Failure: 0
*/
INT32 WINAPI SetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
UINT32 lines, LPCVOID bits, const BITMAPINFO *info,
@@ -1124,14 +1137,23 @@
}
-/***********************************************************************
- * GetDIBits32 (GDI32.170)
+/******************************************************************************
+ * GetDIBits32 [GDI32.170] Retrieves bits of bitmap and copies to buffer
+ *
+ * RETURNS
+ * Success: Number of scan lines copied from bitmap
+ * Failure: 0
*
* http://www.microsoft.com/msdn/sdk/platforms/doc/sdk/win32/func/src/f30_14.htm
*/
-INT32 WINAPI GetDIBits32( HDC32 hdc, HBITMAP32 hbitmap, UINT32 startscan,
- UINT32 lines, LPSTR bits, BITMAPINFO * info,
- UINT32 coloruse )
+INT32 WINAPI GetDIBits32(
+ HDC32 hdc, /* [in] Handle to device context */
+ HBITMAP32 hbitmap, /* [in] Handle to bitmap */
+ UINT32 startscan, /* [in] First scan line to set in dest bitmap */
+ UINT32 lines, /* [in] Number of scan lines to copy */
+ LPSTR bits, /* [out] Address of array for bitmap bits */
+ BITMAPINFO * info, /* [out] Address of structure with bitmap data */
+ UINT32 coloruse) /* [in] RGB or palette index */
{
DC * dc;
BITMAPOBJ * bmp;
@@ -1292,9 +1314,8 @@
}
break;
default:
- fprintf(stderr,"GetDIBits*: unsupported depth %d\n",
- info->bmiHeader.biBitCount
- );
+ WARN(bitmap,"Unsupported depth %d\n",
+ info->bmiHeader.biBitCount);
break;
}
@@ -1386,7 +1407,7 @@
}
else
{
- fprintf( stderr, "CreateDIBitmap: wrong size (%ld) for data\n",
+ WARN(bitmap, "(%ld): wrong size for data\n",
data->bmiHeader.biSize );
return 0;
}
@@ -1422,11 +1443,11 @@
{
HBITMAP32 res = 0;
- fprintf(stderr,
- "CreateDIBSection(%d,[w=%ld,h=%ld],%d,%p,0x%08x,%ld),semistub\n",
+ FIXME(bitmap,
+ "(%d,[w=%ld,h=%ld],%d,%p,0x%08x,%ld),semistub\n",
hdc,bmi->bmiHeader.biWidth,bmi->bmiHeader.biHeight,
- usage,bits,section,offset
- );
+ usage,bits,section,offset);
+
if (bmi->bmiHeader.biHeight < 0 ) bmi->bmiHeader.biHeight = -bmi->bmiHeader.biHeight;
if (bmi->bmiHeader.biWidth < 0 ) bmi->bmiHeader.biWidth = -bmi->bmiHeader.biWidth;
/* FIXME. The following line isn't quite right. */
@@ -1439,8 +1460,10 @@
/* FIXME: this is wrong! (bmBits is always NULL) */
if (bits) *bits = bmp.bmBits;
/* hmpf */
- fprintf(stderr,"allocating %ld bytes of memory\n",bmi->bmiHeader.biWidth*bmi->bmiHeader.biHeight*4);
- if (bits) *bits = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,bmi->bmiHeader.biWidth*bmi->bmiHeader.biHeight*4);
+ TRACE(bitmap,"allocating %ld bytes of memory\n",
+ bmi->bmiHeader.biWidth*bmi->bmiHeader.biHeight*4);
+ if (bits) *bits = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,
+ bmi->bmiHeader.biWidth*bmi->bmiHeader.biHeight*4);
return res;
}
}
diff --git a/objects/enhmetafile.c b/objects/enhmetafile.c
index 9745666..d6b784f 100644
--- a/objects/enhmetafile.c
+++ b/objects/enhmetafile.c
@@ -22,7 +22,7 @@
{
HENHMETAFILE32 hmf = 0;
ENHMETAHEADER h;
- char *p;
+ BYTE *p;
DWORD read;
HFILE32 hf = CreateFile32A(lpszMetaFile, GENERIC_READ, 0, 0,
OPEN_EXISTING, 0, 0);
@@ -31,7 +31,7 @@
if (read!=sizeof(ENHMETAHEADER)) return 0;
SetFilePointer(hf, 0, NULL, FILE_BEGIN);
/* hmf = CreateFileMapping32A( hf, NULL, NULL, NULL, NULL, "temp"); */
- hmf = GlobalAlloc32(GHND, h.nBytes);
+ hmf = GlobalAlloc32(GPTR, h.nBytes);
p = GlobalLock32(hmf);
if (!ReadFile(hf, p, h.nBytes, &read, NULL)) return 0;
GlobalUnlock32(hmf);
@@ -54,6 +54,7 @@
LPENHMETAHEADER p = GlobalLock32(hmf);
if (!buf) return sizeof(ENHMETAHEADER);
memmove(buf, p, MIN(sizeof(ENHMETAHEADER), bufsize));
+ GlobalUnlock32(hmf);
return MIN(sizeof(ENHMETAHEADER), bufsize);
}
@@ -105,6 +106,32 @@
return MIN(size,p->nDescription);
}
+/****************************************************************************
+ * SetEnhMetaFileBits (GDI32.315)
+ *
+ * Creates an enhanced metafile by copying _bufsize_ bytes from _buf_.
+ */
+HENHMETAFILE32 WINAPI SetEnhMetaFileBits(UINT32 bufsize, const BYTE *buf)
+{
+ HENHMETAFILE32 hmf = GlobalAlloc32(GPTR, bufsize);
+ LPENHMETAHEADER h = GlobalLock32(hmf);
+ memmove(h, buf, bufsize);
+ GlobalUnlock32(hmf);
+ return hmf;
+}
+
+/*****************************************************************************
+ * GetEnhMetaFileBits (GDI32.175)
+ *
+ */
+UINT32 WINAPI GetEnhMetaFileBits(
+ HENHMETAFILE32 hmf,
+ UINT32 bufsize,
+ LPBYTE buf
+) {
+ return 0;
+}
+
/*****************************************************************************
* PlayEnhMetaFileRecord (GDI32.264)
*
@@ -142,11 +169,9 @@
}
case EMR_EOF:
break;
-
case EMR_GDICOMMENT:
/* application defined and processed */
break;
-
case EMR_SETMAPMODE:
{
DWORD mode = mr->dParm[0];
@@ -212,7 +237,6 @@
IntersectClipRect32(hdc, left, top, right, bottom);
break;
}
-
case EMR_SELECTOBJECT:
{
DWORD obj = mr->dParm[0];
@@ -226,7 +250,6 @@
(handletable->objectHandle)[obj] = 0;
break;
}
-
case EMR_SETWINDOWORGEX:
{
DWORD x = mr->dParm[0], y = mr->dParm[1];
@@ -251,7 +274,6 @@
SetViewportExtEx32(hdc, x, y, NULL);
break;
}
-
case EMR_CREATEPEN:
{
DWORD obj = mr->dParm[0];
@@ -264,7 +286,7 @@
DWORD obj = mr->dParm[0];
DWORD style = mr->dParm[1], brush = mr->dParm[2];
LOGBRUSH32 *b = (LOGBRUSH32 *) &mr->dParm[3];
- /* FIXME: other args not handled */
+ FIXME(metafile, "Some ExtCreatePen args not handled\n");
(handletable->objectHandle)[obj] =
ExtCreatePen32(style, brush, b, 0, NULL);
break;
@@ -283,7 +305,6 @@
CreateFontIndirect32W((LOGFONT32W *) &(mr->dParm[1]));
break;
}
-
case EMR_MOVETOEX:
{
DWORD x = mr->dParm[0], y = mr->dParm[1];
@@ -310,14 +331,23 @@
Ellipse32(hdc, left, top, right, bottom);
break;
}
-
case EMR_POLYGON16:
{
- /* FIXME: 0-3 : a bounding rectangle? */
+ /* 0-3 : a bounding rectangle? */
INT32 count = mr->dParm[4];
+ FIXME(metafile, "Some Polygon16 args not handled\n");
Polygon16(hdc, (POINT16 *)&mr->dParm[5], count);
break;
}
+ case EMR_POLYLINE16:
+ {
+ /* 0-3 : a bounding rectangle? */
+ INT32 count = mr->dParm[4];
+ FIXME(metafile, "Some Polyline16 args not handled\n");
+ Polyline16(hdc, (POINT16 *)&mr->dParm[5], count);
+ break;
+ }
+
#if 0
case EMR_POLYPOLYGON16:
{
@@ -338,6 +368,7 @@
/* 10-16: ??? */
LPWSTR str = (LPWSTR)& mr->dParm[17];
/* trailing info: dx array? */
+ FIXME(metafile, "Many ExtTextOut args not handled\n");
ExtTextOut32W(hdc, x, y, flags, /* lpRect */ NULL,
str, count, /* lpDx */ NULL);
break;
@@ -413,27 +444,61 @@
INT32 count = ((LPENHMETAHEADER) p)->nHandles;
HANDLETABLE32 *ht = (HANDLETABLE32 *)GlobalAlloc32(GPTR,
sizeof(HANDLETABLE32)*count);
+ BOOL32 ret = FALSE;
+ if (lpRect) {
+ LPENHMETAHEADER h = (LPENHMETAHEADER) p;
+ FLOAT xscale = (h->rclBounds.right-h->rclBounds.left)/(lpRect->right-lpRect->left);
+ FLOAT yscale = (h->rclBounds.bottom-h->rclBounds.top)/(lpRect->bottom-lpRect->top);
+ XFORM xform = {xscale, 0, 0, yscale, 0, 0};
+ /* xform.eDx = lpRect->left;
+ xform.eDy = lpRect->top; */
+ FIXME(metafile, "play into rect doesn't work\n");
+ if (!SetWorldTransform(hdc, &xform)) {
+ WARN(metafile, "World transform failed!\n");
+ }
+ }
+
ht->objectHandle[0] = hmf;
while (1) {
PlayEnhMetaFileRecord(hdc, ht, p, count);
if (p->iType == EMR_EOF) break;
p = (void *) p + p->nSize; /* casted so that arithmetic is in bytes */
}
- return FALSE;
+ GlobalUnlock32(hmf);
+ return TRUE;
}
/*****************************************************************************
* DeleteEnhMetaFile (GDI32.68)
+ *
+ * Deletes an enhanced metafile and frees the associated storage.
*/
BOOL32 WINAPI DeleteEnhMetaFile(HENHMETAFILE32 hmf) {
return !GlobalFree32(hmf);
}
/*****************************************************************************
- * CopyEnhMetaFileA (GDI32.21)
+ * CopyEnhMetaFileA (GDI32.21) Duplicate an enhanced metafile
+ *
+ *
*/
-HENHMETAFILE32 WINAPI CopyEnhMetaFile32A(HENHMETAFILE32 hmf, LPCSTR file) {
- return 0;
+HENHMETAFILE32 WINAPI CopyEnhMetaFile32A(
+ HENHMETAFILE32 hmf,
+ LPCSTR file)
+{
+ if (!file) {
+ LPENHMETAHEADER h = GlobalLock32(hmf);
+ HENHMETAFILE32 hmf2 = GlobalAlloc32(GPTR, h->nBytes);
+ LPENHMETAHEADER h2 = GlobalLock32(hmf2);
+ if (!h2) return 0;
+ memmove(h2, h, h->nBytes);
+ GlobalUnlock32(hmf2);
+ GlobalUnlock32(hmf);
+ return hmf2;
+ } else {
+ FIXME(metafile, "write to file not implemented\n");
+ return 0;
+ }
}
diff --git a/objects/font.c b/objects/font.c
index 76948e8..7117e7e 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -221,12 +221,21 @@
fontPtr = (FONTOBJ *) GDI_HEAP_LOCK( hFont );
memcpy( &fontPtr->logfont, font, sizeof(LOGFONT16) );
- TRACE(font,"(%i %i) '%s' %s %s => %04x\n",
+ TRACE(font,"(%i %i %i %i) '%s' %s %s => %04x\n",
font->lfHeight, font->lfWidth,
+ font->lfEscapement, font->lfOrientation,
font->lfFaceName ? font->lfFaceName : "NULL",
font->lfWeight > 400 ? "Bold" : "",
font->lfItalic ? "Italic" : "",
hFont);
+
+ if (font->lfEscapement != font->lfOrientation) {
+ /* this should really depend on whether GM_ADVANCED is set */
+ fontPtr->logfont.lfOrientation = fontPtr->logfont.lfEscapement;
+ WARN(font,
+ "orientation angle %f set to escapement angle %f for new font %04x\n",
+ font->lfOrientation/10., font->lfEscapement/10., hFont);
+ }
GDI_HEAP_UNLOCK( hFont );
}
}
@@ -1052,19 +1061,32 @@
BOOL32 WINAPI GetCharABCWidths32A(HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
LPABC32 abc )
{
- /* No TrueType fonts in Wine so far */
- FIXME(font, "(%04x,%04x,%04x,%p): stub\n", hdc, firstChar, lastChar, abc );
- return FALSE;
+ return GetCharABCWidths32W( hdc, firstChar, lastChar, abc );
}
-/***********************************************************************
- * GetCharABCWidths32W (GDI32.152)
+/******************************************************************************
+ * GetCharABCWidths32W [GDI32.152] Retrieves widths of characters in range
+ *
+ * PARAMS
+ * hdc [I] Handle of device context
+ * firstChar [I] First character in range to query
+ * lastChar [I] Last character in range to query
+ * abc [O] Address of character-width structure
+ *
+ * NOTES
+ * Only works with TrueType fonts
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
*/
-BOOL32 WINAPI GetCharABCWidths32W(HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
- LPABC32 abc )
+BOOL32 WINAPI GetCharABCWidths32W( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
+ LPABC32 abc )
{
- return GetCharABCWidths32A( hdc, firstChar, lastChar, abc );
+ /* No TrueType fonts in Wine so far */
+ FIXME(font, "(%04x,%04x,%04x,%p): stub\n", hdc, firstChar, lastChar, abc);
+ return FALSE;
}
diff --git a/objects/gdiobj.c b/objects/gdiobj.c
index 8d060b0..ae4ad7e 100644
--- a/objects/gdiobj.c
+++ b/objects/gdiobj.c
@@ -471,7 +471,7 @@
result = PALETTE_GetObject( (PALETTEOBJ *)ptr, count, buffer );
break;
default:
- fprintf( stderr, "GetObject32: magic %04x not implemented\n",
+ FIXME(gdi, "Magic %04x not implemented\n",
ptr->wMagic );
break;
}
@@ -527,8 +527,8 @@
result = OBJ_METADC;
break;
- default:
- fprintf( stderr, "GetObjectType: magic %04x not implemented\n",
+ default:
+ FIXME(gdi, "Magic %04x not implemented\n",
ptr->wMagic );
break;
}
@@ -561,7 +561,7 @@
case OBJ_BITMAP: return dc->w.hBitmap;
default:
/* the SDK only mentions those above */
- fprintf(stderr,"GetCurrentObject(%08x,%d), unknown type.\n",hdc,type);
+ WARN(gdi,"(%08x,%d): unknown type.\n",hdc,type);
return 0;
}
}
@@ -699,7 +699,7 @@
break;
default:
- fprintf( stderr, "EnumObjects16: invalid type %d\n", nObjType );
+ WARN(gdi, "(%d): Invalid type\n", nObjType );
break;
}
return retval;
@@ -775,7 +775,7 @@
default:
/* FIXME: implement Win32 types */
- fprintf( stderr, "EnumObjects32: invalid type %d\n", nObjType );
+ WARN( gdi, "(%d): Invalid type\n", nObjType );
break;
}
return retval;
@@ -867,7 +867,7 @@
case 0x0103: /* LocalHeap */
return GDI_HeapSel;
default:
- fprintf(stderr, "GdiSeeGdiDo: wReqType %04x (unknown)", wReqType);
+ WARN(gdi, "(wReqType=%04x): Unknown\n", wReqType);
return (DWORD)-1;
}
}
diff --git a/objects/metafile.c b/objects/metafile.c
index ea424bc..6e3d0b8 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -186,7 +186,7 @@
METAHEADER *mh2;
HFILE32 hFile;
- TRACE(metafile,"%s\n", lpFilename);
+ TRACE(metafile,"(%08x,%s)\n", hSrcMetaFile, lpFilename);
mh = (METAHEADER *)GlobalLock16(hSrcMetaFile);
@@ -213,7 +213,8 @@
memcpy(mh2,mh, mh->mtSize * 2);
GlobalUnlock16(handle);
}
-
+
+ GlobalUnlock16(hSrcMetaFile);
return handle;
}
@@ -295,6 +296,8 @@
TRACE(metafile,"(%04x %04x)\n",hdc,hmf);
if (!mh) return FALSE;
+
+ /* save the current pen, brush and font */
if (!(dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ))) return 0;
hPen = dc->w.hPen;
hBrush = dc->w.hBrush;
@@ -311,10 +314,11 @@
while (offset < mh->mtSize * 2)
{
mr = (METARECORD *)((char *)mh + offset);
- TRACE(metafile,"offset = %04x size = %08lx\n",
- offset, mr->rdSize);
+ TRACE(metafile,"offset=%04x,size=%08lx\n",
+ offset, mr->rdSize);
if (!mr->rdSize) {
- fprintf(stderr,"METAFILE entry got size 0 at offset %d, total mf length is %ld\n",offset,mh->mtSize*2);
+ TRACE(metafile,"Entry got size 0 at offset %d, total mf length is %ld\n",
+ offset,mh->mtSize*2);
break; /* would loop endlessly otherwise */
}
offset += mr->rdSize * 2;
@@ -423,6 +427,68 @@
return result;
}
+BOOL32 WINAPI EnumMetaFile32(
+ HDC32 hdc,
+ HMETAFILE32 hmf,
+ MFENUMPROC32 lpEnumFunc,
+ LPARAM lpData
+) {
+ METAHEADER *mh = (METAHEADER *)GlobalLock16(hmf);
+ METARECORD *mr;
+ HANDLETABLE32 *ht;
+ BOOL32 result = TRUE;
+ int i, offset = 0;
+ DC *dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+ HPEN32 hPen;
+ HBRUSH32 hBrush;
+ HFONT32 hFont;
+
+ TRACE(metafile,"(%08x,%08x,%p,%p)\n",
+ hdc, hmf, lpEnumFunc, lpData);
+ if (!mh) return 0;
+
+ /* save the current pen, brush and font */
+ if (!dc) return 0;
+ hPen = dc->w.hPen;
+ hBrush = dc->w.hBrush;
+ hFont = dc->w.hFont;
+ GDI_HEAP_UNLOCK(hdc);
+
+
+ ht = (HANDLETABLE32 *) GlobalAlloc32(GPTR,
+ sizeof(HANDLETABLE32) * mh->mtNoObjects);
+
+ /* loop through metafile records */
+ offset = mh->mtHeaderSize * 2;
+
+ while (offset < (mh->mtSize * 2))
+ {
+ mr = (METARECORD *)((char *)mh + offset);
+ if (!lpEnumFunc( hdc, ht, mr, mh->mtNoObjects, (LONG)lpData ))
+ {
+ result = FALSE;
+ break;
+ }
+
+ offset += (mr->rdSize * 2);
+ }
+
+ /* restore pen, brush and font */
+ SelectObject32(hdc, hBrush);
+ SelectObject32(hdc, hPen);
+ SelectObject32(hdc, hFont);
+
+ /* free objects in handle table */
+ for(i = 0; i < mh->mtNoObjects; i++)
+ if(*(ht->objectHandle + i) != 0)
+ DeleteObject32(*(ht->objectHandle + i));
+
+ /* free handle table */
+ GlobalFree32(ht);
+ GlobalUnlock16(hmf);
+ return result;
+}
+
static BOOL32 MF_Meta_CreateRegion( METARECORD *mr, HRGN32 hrgn );
/******************************************************************
@@ -893,7 +959,16 @@
UINT32 handles
)
{
- PlayMetaFileRecord16(hdc, handletable, metarecord, handles);
+ HANDLETABLE16 * ht = (void *)GlobalAlloc32(GPTR,
+ handles*sizeof(HANDLETABLE16));
+ int i = 0;
+ TRACE(metafile, "(%08x,%p,%p,%d)\n", hdc, handletable, metarecord, handles);
+ for (i=0; i<handles; i++)
+ ht->objectHandle[i] = handletable->objectHandle[i];
+ PlayMetaFileRecord16(hdc, ht, metarecord, handles);
+ for (i=0; i<handles; i++)
+ handletable->objectHandle[i] = ht->objectHandle[i];
+ GlobalFree32(ht);
return TRUE;
}
@@ -961,11 +1036,39 @@
{
HMETAFILE32 hmf = GlobalAlloc16(GHND, size);
BYTE *p = GlobalLock16(hmf) ;
+ TRACE(metafile, "(%d,%p) returning %08x\n", size, lpData, hmf);
+ if (!hmf || !p) return 0;
memcpy(p, lpData, size);
GlobalUnlock16(hmf);
return hmf;
}
+/*****************************************************************
+ * GetMetaFileBitsEx (GDI32.198) Get raw metafile data
+ *
+ * Copies the data from metafile _hmf_ into the buffer _buf_.
+ * If _buf_ is zero, returns size of buffer required. Otherwise,
+ * returns number of bytes copied.
+ */
+UINT32 WINAPI GetMetaFileBitsEx(
+ HMETAFILE32 hmf, /* metafile */
+ UINT32 nSize, /* size of buf */
+ LPVOID buf /* buffer to receive raw metafile data */
+) {
+ METAHEADER *h = GlobalLock16(hmf);
+ TRACE(metafile, "(%08x,%d,%p)\n", hmf, nSize, buf);
+ if (!h) return 0; /* FIXME: error code */
+ if (!buf) {
+ GlobalUnlock16(hmf);
+ TRACE(metafile,"returning size %d\n", h->mtSize);
+ return h->mtSize;
+ }
+ memmove(buf, h, MIN(nSize, h->mtSize));
+ GlobalUnlock16(hmf);
+ return MIN(nSize, h->mtSize);
+}
+
+
/******************************************************************
* MF_Meta_CreateRegion
*
@@ -1008,20 +1111,20 @@
for(band = 0, start = &(mr->rdParam[11]); band < mr->rdParam[5];
band++, start = end + 1) {
if(*start / 2 != (*start + 1) / 2) {
- fprintf(stderr, "META_CREATEREGION: delimiter not even.\n");
+ WARN(metafile, "Delimiter not even.\n");
DeleteObject32( hrgn2 );
return FALSE;
}
end = start + *start + 3;
if(end > (WORD *)mr + mr->rdSize) {
- WARN(metafile, "META_CREATEREGION: end points outside record.\n");
+ WARN(metafile, "End points outside record.\n");
DeleteObject32( hrgn2 );
return FALSE;
}
if(*start != *end) {
- WARN(metafile, "META_CREATEREGION: mismatched delimiters.\n");
+ WARN(metafile, "Mismatched delimiters.\n");
DeleteObject32( hrgn2 );
return FALSE;
}
@@ -1384,7 +1487,7 @@
METARECORD *mr;
if((!flags && rect) || (flags && !rect))
- fprintf(stderr, "MF_ExtTextOut: Inconsistent flags and rect\n");
+ WARN(metafile, "Inconsistent flags and rect\n");
len = sizeof(METARECORD) + (((count + 1) >> 1) * 2) + 2 * sizeof(short)
+ sizeof(UINT16);
if(rect)
diff --git a/objects/oembitmap.c b/objects/oembitmap.c
index f7b83ce..9f2cd4b 100644
--- a/objects/oembitmap.c
+++ b/objects/oembitmap.c
@@ -410,7 +410,7 @@
if (!CALL_LARGE_STACK( OBM_CreateBitmaps, &descr ))
{
LeaveCriticalSection( &X11DRV_CritSection );
- fprintf( stderr, "Error creating OEM bitmap %d\n", OBM_FIRST+id );
+ WARN(bitmap, "Error creating OEM bitmap %d\n", OBM_FIRST+id );
return 0;
}
LeaveCriticalSection( &X11DRV_CritSection );
@@ -462,7 +462,7 @@
if (!CALL_LARGE_STACK( OBM_CreateBitmaps, &descr ))
{
LeaveCriticalSection( &X11DRV_CritSection );
- fprintf( stderr, "Error creating OEM cursor/icon %d\n", id );
+ WARN(cursor, "Error creating OEM cursor/icon %d\n", id );
return 0;
}
LeaveCriticalSection( &X11DRV_CritSection );
diff --git a/objects/pen.c b/objects/pen.c
index 79ca82c..e9ee9a8 100644
--- a/objects/pen.c
+++ b/objects/pen.c
@@ -85,10 +85,10 @@
LOGPEN32 logpen;
if ((style & PS_STYLE_MASK) == PS_USERSTYLE)
- fprintf(stderr, "ExtCreatePen: PS_USERSTYLE not handled\n");
+ FIXME(gdi, "PS_USERSTYLE not handled\n");
if ((style & PS_TYPE_MASK) == PS_GEOMETRIC)
if (brush->lbHatch)
- fprintf(stderr, "ExtCreatePen: Hatches not implemented\n");
+ FIXME(gdi, "Hatches not implemented\n");
logpen.lopnStyle = style & ~PS_TYPE_MASK;
logpen.lopnWidth.x = (style & PS_GEOMETRIC) ? width : 1;
diff --git a/objects/region.c b/objects/region.c
index 8572d56..9f771ed 100644
--- a/objects/region.c
+++ b/objects/region.c
@@ -536,15 +536,15 @@
lpXform, dwCount, rgndata, hrgn);
if(!hrgn)
{
- fprintf(stderr, "ExtCreateRegion can't create a region!\n");
+ WARN(region, "Can't create a region!\n");
return 0;
}
if(lpXform)
- fprintf(stderr, "ExtCreateRegion: Xform not implemented - ignoring\n");
+ WARN(region, "Xform not implemented - ignoring\n");
if(rgndata->rdh.iType != RDH_RECTANGLES)
{
- fprintf(stderr, "ExtCreateRegion: type not RDH_RECTANGLES\n");
+ WARN(region, "Type not RDH_RECTANGLES\n");
GDI_HEAP_UNLOCK( hrgn );
DeleteObject32( hrgn );
return 0;
@@ -1923,7 +1923,7 @@
tmpSLLBlock = HeapAlloc( SystemHeap, 0, sizeof(ScanLineListBlock));
if(!tmpSLLBlock)
{
- fprintf(stderr, "REGION_InsertEdgeInET(): Can't alloc SLLB\n");
+ WARN(region, "Can't alloc SLLB\n");
return;
}
(*SLLBlock)->next = tmpSLLBlock;
@@ -2371,8 +2371,7 @@
if (iPts == NUMPTSTOBUFFER) {
tmpPtBlock = HeapAlloc( SystemHeap, 0, sizeof(POINTBLOCK));
if(!tmpPtBlock) {
- fprintf(stderr,
- "CreatePolyPolygonRgn(): can't alloc tPB\n");
+ WARN(region, "Can't alloc tPB\n");
return 0;
}
curPtBlock->next = tmpPtBlock;
@@ -2423,8 +2422,7 @@
tmpPtBlock = HeapAlloc( SystemHeap, 0,
sizeof(POINTBLOCK) );
if(!tmpPtBlock) {
- fprintf(stderr,
- "CreatePolyPolygonRgn(): can't alloc tPB\n");
+ WARN(region, "Can't alloc tPB\n");
return 0;
}
curPtBlock->next = tmpPtBlock;
diff --git a/ole/compobj.c b/ole/compobj.c
index fc6346b..ce44806 100644
--- a/ole/compobj.c
+++ b/ole/compobj.c
@@ -288,7 +288,7 @@
(LPVOID)args,
(LPDWORD)idstr
)) {
- fprintf(stderr,"CallTo16 IMalloc16 failed\n");
+ WARN(ole,"CallTo16 IMalloc16 failed\n");
return E_FAIL;
}
return WINE_StringFromCLSID(id,PTR_SEG_TO_LIN(*idstr));
@@ -395,7 +395,7 @@
* LookupETask (COMPOBJ.94)
*/
OLESTATUS WINAPI LookupETask(LPVOID p1,LPVOID p2) {
- fprintf(stderr,"LookupETask(%p,%p),stub!\n",p1,p2);
+ FIXME(ole,"(%p,%p),stub!\n",p1,p2);
return 0;
}
@@ -403,7 +403,7 @@
* LookupETask (COMPOBJ.201)
*/
OLESTATUS WINAPI CallObjectInWOW(LPVOID p1,LPVOID p2) {
- fprintf(stderr,"CallObjectInWOW(%p,%p),stub!\n",p1,p2);
+ FIXME(ole,"(%p,%p),stub!\n",p1,p2);
return 0;
}
@@ -539,7 +539,7 @@
* CoInitializeWOW (OLE32.27)
*/
HRESULT WINAPI CoInitializeWOW(DWORD x,DWORD y) {
- fprintf(stderr,"CoInitializeWOW(0x%08lx,0x%08lx),stub!\n",x,y);
+ FIXME(ole,"(0x%08lx,0x%08lx),stub!\n",x,y);
return 0;
}
@@ -551,6 +551,6 @@
BOOL16 fLock, /* [in] do lock */
BOOL16 fLastUnlockReleases /* [in] ? */
) {
- fprintf(stderr,"CoLockObjectExternal(%p,%d,%d),stub!\n",pUnk,fLock,fLastUnlockReleases);
+ FIXME(ole,"(%p,%d,%d),stub!\n",pUnk,fLock,fLastUnlockReleases);
return S_OK;
}
diff --git a/ole/folders.c b/ole/folders.c
index 7903e89..6d159f5 100644
--- a/ole/folders.c
+++ b/ole/folders.c
@@ -19,14 +19,14 @@
*/
static ULONG WINAPI IEnumIDList_AddRef(LPENUMIDLIST this) {
- fprintf(stderr,"IEnumIDList(%p)->AddRef()\n",this);
+ TRACE(ole,"(%p)->()\n",this);
return ++(this->ref);
}
static ULONG WINAPI IEnumIDList_Release(LPENUMIDLIST this) {
- fprintf(stderr,"IEnumIDList(%p)->Release()\n",this);
+ TRACE(ole,"(%p)->()\n",this);
if (!--(this->ref)) {
- fprintf(stderr," -> freeing IEnumIDList(%p)\n",this);
+ WARN(ole," freeing IEnumIDList(%p)\n",this);
HeapFree(GetProcessHeap(),0,this);
return 0;
}
@@ -36,7 +36,7 @@
static HRESULT WINAPI IEnumIDList_Next(
LPENUMIDLIST this,ULONG celt,LPITEMIDLIST *rgelt,ULONG *pceltFetched
) {
- fprintf(stderr,"IEnumIDList(%p)->Next(%ld,%p,%p),stub!\n",
+ FIXME(ole,"(%p)->(%ld,%p,%p),stub!\n",
this,celt,rgelt,pceltFetched
);
*pceltFetched = 0; /* we don't have any ... */
@@ -66,9 +66,9 @@
* IShellFolder implementation
*/
static ULONG WINAPI IShellFolder_Release(LPSHELLFOLDER this) {
- fprintf(stderr,"IShellFolder(%p)->Release()\n",this);
+ TRACE(ole,"(%p)->()\n",this);
if (!--(this->ref)) {
- fprintf(stderr," -> freeing IShellFolder(%p)\n",this);
+ WARN(ole," freeing IShellFolder(%p)\n",this);
HeapFree(GetProcessHeap(),0,this);
return 0;
}
@@ -76,14 +76,14 @@
}
static ULONG WINAPI IShellFolder_AddRef(LPSHELLFOLDER this) {
- fprintf(stderr,"IShellFolder(%p)->AddRef()\n",this);
+ TRACE(ole,"(%p)->()\n",this);
return ++(this->ref);
}
static HRESULT WINAPI IShellFolder_GetAttributesOf(
LPSHELLFOLDER this,UINT32 cidl,LPCITEMIDLIST *apidl,DWORD *rgfInOut
) {
- fprintf(stderr,"IShellFolder(%p)->GetAttributesOf(%d,%p,%p),stub!\n",
+ FIXME(ole,"(%p)->(%d,%p,%p),stub!\n",
this,cidl,apidl,rgfInOut
);
return 0;
@@ -95,7 +95,7 @@
char xclsid[50];
WINE_StringFromCLSID(riid,xclsid);
- fprintf(stderr,"IShellFolder(%p)->BindToObject(%p,%p,%s,%p),stub!\n",
+ FIXME(ole,"(%p)->(%p,%p,%s,%p),stub!\n",
this,pidl,pbcReserved,xclsid,ppvOut
);
*ppvOut = IShellFolder_Constructor();
@@ -107,7 +107,7 @@
LPOLESTR32 lpszDisplayName,DWORD *pchEaten,LPITEMIDLIST *ppidl,
DWORD *pdwAttributes
) {
- fprintf(stderr,"IShellFolder(%p)->ParseDisplayName(%08x,%p,%p,%p,%p,%p),stub!\n",
+ FIXME(ole,"(%p)->(%08x,%p,%p,%p,%p,%p),stub!\n",
this,hwndOwner,pbcReserved,lpszDisplayName,pchEaten,ppidl,pdwAttributes
);
*(DWORD*)pbcReserved = 0;
@@ -118,7 +118,7 @@
LPSHELLFOLDER this,HWND32 hwndOwner,DWORD grfFlags,
LPENUMIDLIST* ppenumIDList
) {
- fprintf(stderr,"IShellFolder(%p)->EnumObjects(0x%04x,0x%08lx,%p),stub!\n",
+ FIXME(ole,"(%p)->(0x%04x,0x%08lx,%p),stub!\n",
this,hwndOwner,grfFlags,ppenumIDList
);
*ppenumIDList = IEnumIDList_Constructor();
@@ -131,7 +131,7 @@
char xclsid[50];
WINE_StringFromCLSID(riid,xclsid);
- fprintf(stderr,"IShellFolder(%p)->CreateViewObject(0x%04x,%s,%p),stub!\n",
+ FIXME(ole,"(%p)->(0x%04x,%s,%p),stub!\n",
this,hwndOwner,xclsid,ppv
);
*(DWORD*)ppv = 0;
diff --git a/ole/ifs.c b/ole/ifs.c
index 6f24584..2980ed1 100644
--- a/ole/ifs.c
+++ b/ole/ifs.c
@@ -137,29 +137,25 @@
LPMALLOC16
IMalloc16_Constructor() {
LPMALLOC16 this;
+ HMODULE16 hcomp = GetModuleHandle16("COMPOBJ");
this = (LPMALLOC16)SEGPTR_NEW(IMalloc16);
- if (__winelib) {
- this->lpvtbl = &mvt16;
- } else {
- HMODULE16 hcomp = GetModuleHandle16("COMPOBJ");
- if (!msegvt16) {
- this->lpvtbl = msegvt16 = SEGPTR_NEW(IMalloc16_VTable);
+ if (!msegvt16) {
+ this->lpvtbl = msegvt16 = SEGPTR_NEW(IMalloc16_VTable);
-#define FN(x) this->lpvtbl->fn##x = (void*)WIN32_GetProcAddress16(hcomp,"IMalloc16_"#x);assert(this->lpvtbl->fn##x);
- FN(QueryInterface)
- FN(AddRef)
- FN(Release)
- FN(Alloc)
- FN(Realloc)
- FN(Free)
- FN(GetSize)
- FN(DidAlloc)
- FN(HeapMinimize)
- msegvt16 = (LPMALLOC16_VTABLE)SEGPTR_GET(msegvt16);
+#define FN(x) this->lpvtbl->fn##x = (void*)WIN32_GetProcAddress16(hcomp,"IMalloc16_"#x);assert(this->lpvtbl->fn##x)
+ FN(QueryInterface);
+ FN(AddRef);
+ FN(Release);
+ FN(Alloc);
+ FN(Realloc);
+ FN(Free);
+ FN(GetSize);
+ FN(DidAlloc);
+ FN(HeapMinimize);
+ msegvt16 = (LPMALLOC16_VTABLE)SEGPTR_GET(msegvt16);
#undef FN
- }
- this->lpvtbl = msegvt16;
+ this->lpvtbl = msegvt16;
}
this->ref = 1;
/* FIXME: implement multiple heaps */
diff --git a/ole/moniker.c b/ole/moniker.c
index 17365cd..7904ab8 100644
--- a/ole/moniker.c
+++ b/ole/moniker.c
@@ -28,6 +28,6 @@
LPCOLESTR16 lpszPathName, /* [in] pathname */
LPMONIKER * ppmk /* [out] new moniker object */
) {
- fprintf(stderr,"CreateFileMoniker(%s,%p),stub!\n",lpszPathName,ppmk);
+ FIXME(ole,"(%s,%p),stub!\n",lpszPathName,ppmk);
return E_FAIL;
}
diff --git a/ole/ole2.c b/ole/ole2.c
index d6e4232..577c41d 100644
--- a/ole/ole2.c
+++ b/ole/ole2.c
@@ -66,7 +66,7 @@
* OleInitializeWOW (OLE32.27)
*/
HRESULT WINAPI OleInitializeWOW(DWORD x) {
- fprintf(stderr,"OleInitializeWOW(0x%08lx),stub!\n",x);
+ FIXME(ole,"(0x%08lx),stub!\n",x);
return 0;
}
@@ -74,7 +74,7 @@
* GetRunningObjectTable (OLE2.30)
*/
HRESULT WINAPI GetRunningObjectTable16(DWORD reserved, LPVOID *pprot) {
- fprintf(stderr,"GetRunningObjectTable(%ld,%p),stub!\n",reserved,pprot);
+ FIXME(ole,"(%ld,%p),stub!\n",reserved,pprot);
return E_FAIL;
}
@@ -85,7 +85,7 @@
HWND16 hwnd,
LPDROPTARGET pDropTarget
) {
- fprintf(stderr,"RegisterDragDrop(0x%04x,%p),stub!\n",hwnd,pDropTarget);
+ FIXME(ole,"(0x%04x,%p),stub!\n",hwnd,pDropTarget);
return S_OK;
}
diff --git a/ole/ole2disp.c b/ole/ole2disp.c
index 38d3399..169f30c 100644
--- a/ole/ole2disp.c
+++ b/ole/ole2disp.c
@@ -7,6 +7,7 @@
#include "windows.h"
#include "ole.h"
#include "ole2.h"
+#include "oleauto.h"
#include "interfaces.h"
#include "heap.h"
#include "ldt.h"
@@ -16,20 +17,18 @@
represents BSTR as a 16:16 far pointer, and the strings
as ISO-8859 */
-typedef DWORD BSTR;
-
-static BSTR BSTR_AllocBytes(int n)
+static BSTR16 BSTR_AllocBytes(int n)
{
void *ptr = SEGPTR_ALLOC(n);
- return SEGPTR_GET(ptr);
+ return (BSTR16)SEGPTR_GET(ptr);
}
-static void BSTR_Free(BSTR in)
+static void BSTR_Free(BSTR16 in)
{
SEGPTR_FREE( PTR_SEG_TO_LIN(in) );
}
-static void* BSTR_GetAddr(BSTR in)
+static void* BSTR_GetAddr(BSTR16 in)
{
return in ? PTR_SEG_TO_LIN(in) : 0;
}
@@ -37,31 +36,50 @@
/***********************************************************************
* SysAllocString [OLE2DISP.2]
*/
-BSTR WINAPI SysAllocString(char *in)
+BSTR16 WINAPI SysAllocString16(LPOLESTR16 in)
{
- BSTR out=BSTR_AllocBytes(strlen(in)+1);
+ BSTR16 out=BSTR_AllocBytes(strlen(in)+1);
if(!out)return 0;
strcpy(BSTR_GetAddr(out),in);
return out;
}
/***********************************************************************
+ * SysAllocString [OLEAUT32.2]
+ */
+BSTR32 WINAPI SysAllocString32(LPOLESTR32 in)
+{
+ return HEAP_strdupW(GetProcessHeap(),0,in);
+}
+
+/***********************************************************************
* SysReAllocString [OLE2DISP.3]
*/
-int WINAPI SysReAllocString(BSTR *old,char *in)
+INT16 WINAPI SysReAllocString16(LPBSTR16 old,LPOLESTR16 in)
{
- BSTR new=SysAllocString(in);
+ BSTR16 new=SysAllocString16(in);
BSTR_Free(*old);
*old=new;
return 1;
}
/***********************************************************************
+ * SysReAllocString [OLEAUT32.3]
+ */
+INT32 WINAPI SysReAllocString32(LPBSTR32 old,LPOLESTR32 in)
+{
+ BSTR32 new=SysAllocString32(in);
+ HeapFree(GetProcessHeap(),0,*old);
+ *old=new;
+ return 1;
+}
+
+/***********************************************************************
* SysAllocStringLen [OLE2DISP.4]
*/
-BSTR WINAPI SysAllocStringLen(char *in, int len)
+BSTR16 WINAPI SysAllocStringLen16(char *in, int len)
{
- BSTR out=BSTR_AllocBytes(len+1);
+ BSTR16 out=BSTR_AllocBytes(len+1);
if(!out)return 0;
strcpy(BSTR_GetAddr(out),in);
return out;
@@ -70,9 +88,9 @@
/***********************************************************************
* SysReAllocStringLen [OLE2DISP.5]
*/
-int WINAPI SysReAllocStringLen(BSTR *old,char *in,int len)
+int WINAPI SysReAllocStringLen16(BSTR16 *old,char *in,int len)
{
- BSTR new=SysAllocStringLen(in,len);
+ BSTR16 new=SysAllocStringLen16(in,len);
BSTR_Free(*old);
*old=new;
return 1;
@@ -81,25 +99,29 @@
/***********************************************************************
* SysFreeString [OLE2DISP.6]
*/
-void WINAPI SysFreeString(BSTR in)
+void WINAPI SysFreeString16(BSTR16 in)
{
BSTR_Free(in);
}
/***********************************************************************
+ * SysFreeString [OLEAUT32.6]
+ */
+void WINAPI SysFreeString32(BSTR32 in)
+{
+ HeapFree(GetProcessHeap(),0,in);
+}
+
+/***********************************************************************
* SysStringLen [OLE2DISP.7]
*/
-int WINAPI SysStringLen(BSTR str)
+int WINAPI SysStringLen16(BSTR16 str)
{
return strlen(BSTR_GetAddr(str));
}
-OLESTATUS WINAPI CreateDispTypeInfo(
- INTERFACEDATA * pidata,
- LCID lcid,
- LPVOID * * pptinfo) /* ITypeInfo */
-{
- fprintf(stderr,"CreateDispTypeInfo(%p,%ld,%p),stub\n",pidata,lcid,pptinfo);
+OLESTATUS WINAPI CreateDispTypeInfo(INTERFACEDATA * pidata,LCID lcid,LPVOID/*ITypeInfo*/ * * pptinfo) {
+ FIXME(ole,"(%p,%ld,%p),stub\n",pidata,lcid,pptinfo);
return 0;
}
@@ -108,6 +130,6 @@
) {
char buf[80];
WINE_StringFromCLSID(rclsid,buf);
- fprintf(stderr,"RegisterActiveObject(%p,%s,0x%08lx,%p),stub\n",punk,buf,dwFlags,pdwRegister);
+ FIXME(ole,"RegisterActiveObject(%p,%s,0x%08lx,%p),stub\n",punk,buf,dwFlags,pdwRegister);
return 0;
}
diff --git a/ole/ole2nls.c b/ole/ole2nls.c
index a0d5608..ec8d038 100644
--- a/ole/ole2nls.c
+++ b/ole/ole2nls.c
@@ -528,120 +528,105 @@
case LANG_En:
switch (LCType) {
-LOCVAL(LOCALE_ILANGUAGE,"9")
-LOCVAL(LOCALE_SLANGUAGE,"English")
-LOCVAL(LOCALE_SENGLANGUAGE,"English")
-LOCVAL(LOCALE_SABBREVLANGNAME,"en")
-LOCVAL(LOCALE_SNATIVELANGNAME,"English")
-LOCVAL(LOCALE_ICOUNTRY,"11")
-LOCVAL(LOCALE_SCOUNTRY,"United States")
-LOCVAL(LOCALE_SENGCOUNTRY,"United States")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"US")
-LOCVAL(LOCALE_SNATIVECTRYNAME,"United States")
-LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
-LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49")
-LOCVAL(LOCALE_IDEFAULTCODEPAGE,"437")
-/* Dunno
-LOCVAL(LOCALE_IDEFAULTANSICODEPAGE)
-*/
-LOCVAL(LOCALE_SLIST,";")
-LOCVAL(LOCALE_IMEASURE,"0")
-LOCVAL(LOCALE_SDECIMAL,".")
-LOCVAL(LOCALE_STHOUSAND,",")
+LOCVAL(LOCALE_ILANGUAGE, "0409")
+LOCVAL(LOCALE_SLANGUAGE, "English (United States)")
+LOCVAL(LOCALE_SENGLANGUAGE, "English")
+LOCVAL(LOCALE_SABBREVLANGNAME, "ENU")
+LOCVAL(LOCALE_SNATIVELANGNAME, "English")
+LOCVAL(LOCALE_ICOUNTRY, "1")
+LOCVAL(LOCALE_SCOUNTRY, "United States")
+LOCVAL(LOCALE_SENGCOUNTRY, "United States")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "USA")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "United States")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
+LOCVAL(LOCALE_SLIST, ",")
+LOCVAL(LOCALE_IMEASURE, "1")
+LOCVAL(LOCALE_SDECIMAL, ".")
+LOCVAL(LOCALE_STHOUSAND, ",")
LOCVAL(LOCALE_SGROUPING, "3;0")
-LOCVAL(LOCALE_IDIGITS,"2")
-LOCVAL(LOCALE_ILZERO,"1")
-/*
-LOCVAL(LOCALE_INEGNUMBER)
-Is this "0123456789" ??
-LOCVAL(LOCALE_SNATIVEDIGITS)
-*/
-LOCVAL(LOCALE_SCURRENCY,"DM")
+LOCVAL(LOCALE_IDIGITS, "2")
+LOCVAL(LOCALE_ILZERO, "1")
+LOCVAL(LOCALE_INEGNUMBER, "1")
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY, "$")
LOCVAL(LOCALE_SINTLSYMBOL, "USD")
LOCVAL(LOCALE_SMONDECIMALSEP, ".")
-LOCVAL(LOCALE_SMONTHOUSANDSEP, ".")
+LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
LOCVAL(LOCALE_SMONGROUPING, "3;0")
-LOCVAL(LOCALE_ICURRDIGITS,"2")
-LOCVAL(LOCALE_IINTLCURRDIGITS,"2")
-LOCVAL(LOCALE_ICURRENCY,"3")
-LOCVAL(LOCALE_INEGCURR,"8")
-LOCVAL(LOCALE_SDATE,".")
-LOCVAL(LOCALE_STIME,":")
-LOCVAL(LOCALE_SSHORTDATE,"MM/dd/yy")
-LOCVAL(LOCALE_SLONGDATE,"ddd, MMMM d\'th\', yyyy")
+LOCVAL(LOCALE_ICURRDIGITS, "2")
+LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
+LOCVAL(LOCALE_ICURRENCY, "0")
+LOCVAL(LOCALE_INEGCURR, "0")
+LOCVAL(LOCALE_SDATE, "/")
+LOCVAL(LOCALE_STIME, ":")
+LOCVAL(LOCALE_SSHORTDATE, "M/d/yy")
+LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
-LOCVAL(LOCALE_IDATE,"1")
-/*
-LOCVAL(LOCALE_ILDATE)
-*/
-LOCVAL(LOCALE_ITIME,"1")
-/*
-LOCVAL(LOCALE_ITIMEMARKPOSN)
-LOCVAL(LOCALE_ICENTURY)
-*/
-LOCVAL(LOCALE_ITLZERO,"1")
-/*
-LOCVAL(LOCALE_IDAYLZERO)
-LOCVAL(LOCALE_IMONLZERO)
-*/
-LOCVAL(LOCALE_S1159,"AM")
-LOCVAL(LOCALE_S2359,"PM")
-LOCVAL(LOCALE_ICALENDARTYPE,"1")
-/*
-LOCVAL(LOCALE_IOPTIONALCALENDAR)
-LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
-LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
-*/
-LOCVAL(LOCALE_SDAYNAME1,"Monday")
-LOCVAL(LOCALE_SDAYNAME2,"Tuesday")
-LOCVAL(LOCALE_SDAYNAME3,"Wednesday")
-LOCVAL(LOCALE_SDAYNAME4,"Thursday")
-LOCVAL(LOCALE_SDAYNAME5,"Friday")
-LOCVAL(LOCALE_SDAYNAME6,"Saturday")
-LOCVAL(LOCALE_SDAYNAME7,"Sunday")
-LOCVAL(LOCALE_SABBREVDAYNAME1,"Mon")
-LOCVAL(LOCALE_SABBREVDAYNAME2,"Tue")
-LOCVAL(LOCALE_SABBREVDAYNAME3,"Wed")
-LOCVAL(LOCALE_SABBREVDAYNAME4,"Thu")
-LOCVAL(LOCALE_SABBREVDAYNAME5,"Fri")
-LOCVAL(LOCALE_SABBREVDAYNAME6,"Sat")
-LOCVAL(LOCALE_SABBREVDAYNAME7,"Sun")
-LOCVAL(LOCALE_SMONTHNAME1,"January")
-LOCVAL(LOCALE_SMONTHNAME2,"February")
-LOCVAL(LOCALE_SMONTHNAME3,"March")
-LOCVAL(LOCALE_SMONTHNAME4,"April")
-LOCVAL(LOCALE_SMONTHNAME5,"May")
-LOCVAL(LOCALE_SMONTHNAME6,"June")
-LOCVAL(LOCALE_SMONTHNAME7,"July")
-LOCVAL(LOCALE_SMONTHNAME8,"August")
-LOCVAL(LOCALE_SMONTHNAME9,"September")
-LOCVAL(LOCALE_SMONTHNAME10,"October")
-LOCVAL(LOCALE_SMONTHNAME11,"November")
-LOCVAL(LOCALE_SMONTHNAME12,"December")
-LOCVAL(LOCALE_SMONTHNAME13,"")
-LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
-LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
-LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mar")
-LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
-LOCVAL(LOCALE_SABBREVMONTHNAME5,"May")
-LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun")
-LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul")
-LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
-LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep")
-LOCVAL(LOCALE_SABBREVMONTHNAME10,"Oct")
-LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
-LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dec")
-LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
-LOCVAL(LOCALE_SPOSITIVESIGN,"")
-LOCVAL(LOCALE_SNEGATIVESIGN,"-")
-/*
-LOCVAL(LOCALE_IPOSSIGNPOSN)
-LOCVAL(LOCALE_INEGSIGNPOSN)
-LOCVAL(LOCALE_IPOSSYMPRECEDES)
-LOCVAL(LOCALE_IPOSSEPBYSPACE)
-LOCVAL(LOCALE_INEGSYMPRECEDES)
-LOCVAL(LOCALE_INEGSEPBYSPACE)
-*/
+LOCVAL(LOCALE_IDATE, "0")
+LOCVAL(LOCALE_ILDATE, "0")
+LOCVAL(LOCALE_ITIME, "0")
+LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
+LOCVAL(LOCALE_ICENTURY, "0")
+LOCVAL(LOCALE_ITLZERO, "0")
+LOCVAL(LOCALE_IDAYLZERO, "0")
+LOCVAL(LOCALE_IMONLZERO, "0")
+LOCVAL(LOCALE_S1159, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+LOCVAL(LOCALE_ICALENDARTYPE, "1")
+LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
+LOCVAL(LOCALE_SDAYNAME1, "Monday")
+LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
+LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
+LOCVAL(LOCALE_SDAYNAME4, "Thursday")
+LOCVAL(LOCALE_SDAYNAME5, "Friday")
+LOCVAL(LOCALE_SDAYNAME6, "Saturday")
+LOCVAL(LOCALE_SDAYNAME7, "Sunday")
+LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
+LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
+LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
+LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
+LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
+LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
+LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
+LOCVAL(LOCALE_SMONTHNAME1, "January")
+LOCVAL(LOCALE_SMONTHNAME2, "February")
+LOCVAL(LOCALE_SMONTHNAME3, "March")
+LOCVAL(LOCALE_SMONTHNAME4, "April")
+LOCVAL(LOCALE_SMONTHNAME5, "May")
+LOCVAL(LOCALE_SMONTHNAME6, "June")
+LOCVAL(LOCALE_SMONTHNAME7, "July")
+LOCVAL(LOCALE_SMONTHNAME8, "August")
+LOCVAL(LOCALE_SMONTHNAME9, "September")
+LOCVAL(LOCALE_SMONTHNAME10, "October")
+LOCVAL(LOCALE_SMONTHNAME11, "November")
+LOCVAL(LOCALE_SMONTHNAME12, "December")
+LOCVAL(LOCALE_SMONTHNAME13, "")
+LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
+LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "0")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
default: found=0;break;
}
break; /* LANG(En) */
@@ -1005,111 +990,6 @@
}
break; /* LANG(It) */
- case 0x0409:
- switch (LCType) {
-LOCVAL(LOCALE_ILANGUAGE, "0409")
-LOCVAL(LOCALE_SLANGUAGE, "English (United States)")
-LOCVAL(LOCALE_SENGLANGUAGE, "English")
-LOCVAL(LOCALE_SABBREVLANGNAME, "ENU")
-LOCVAL(LOCALE_SNATIVELANGNAME, "English")
-LOCVAL(LOCALE_ICOUNTRY, "1")
-LOCVAL(LOCALE_SCOUNTRY, "United States")
-LOCVAL(LOCALE_SENGCOUNTRY, "United States")
-LOCVAL(LOCALE_SABBREVCTRYNAME, "USA")
-LOCVAL(LOCALE_SNATIVECTRYNAME, "United States")
-LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
-LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
-LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
-LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
-LOCVAL(LOCALE_SLIST, ",")
-LOCVAL(LOCALE_IMEASURE, "1")
-LOCVAL(LOCALE_SDECIMAL, ".")
-LOCVAL(LOCALE_STHOUSAND, ",")
-LOCVAL(LOCALE_SGROUPING, "3;0")
-LOCVAL(LOCALE_IDIGITS, "2")
-LOCVAL(LOCALE_ILZERO, "1")
-LOCVAL(LOCALE_INEGNUMBER, "1")
-LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
-LOCVAL(LOCALE_SCURRENCY, "$")
-LOCVAL(LOCALE_SINTLSYMBOL, "USD")
-LOCVAL(LOCALE_SMONDECIMALSEP, ".")
-LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
-LOCVAL(LOCALE_SMONGROUPING, "3;0")
-LOCVAL(LOCALE_ICURRDIGITS, "2")
-LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
-LOCVAL(LOCALE_ICURRENCY, "0")
-LOCVAL(LOCALE_INEGCURR, "0")
-LOCVAL(LOCALE_SDATE, "/")
-LOCVAL(LOCALE_STIME, ":")
-LOCVAL(LOCALE_SSHORTDATE, "M/d/yy")
-LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
-LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
-LOCVAL(LOCALE_IDATE, "0")
-LOCVAL(LOCALE_ILDATE, "0")
-LOCVAL(LOCALE_ITIME, "0")
-LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
-LOCVAL(LOCALE_ICENTURY, "0")
-LOCVAL(LOCALE_ITLZERO, "0")
-LOCVAL(LOCALE_IDAYLZERO, "0")
-LOCVAL(LOCALE_IMONLZERO, "0")
-LOCVAL(LOCALE_S1159, "AM")
-LOCVAL(LOCALE_S2359, "PM")
-LOCVAL(LOCALE_ICALENDARTYPE, "1")
-LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
-LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
-LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
-LOCVAL(LOCALE_SDAYNAME1, "Monday")
-LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
-LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
-LOCVAL(LOCALE_SDAYNAME4, "Thursday")
-LOCVAL(LOCALE_SDAYNAME5, "Friday")
-LOCVAL(LOCALE_SDAYNAME6, "Saturday")
-LOCVAL(LOCALE_SDAYNAME7, "Sunday")
-LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
-LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
-LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
-LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
-LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
-LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
-LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
-LOCVAL(LOCALE_SMONTHNAME1, "January")
-LOCVAL(LOCALE_SMONTHNAME2, "February")
-LOCVAL(LOCALE_SMONTHNAME3, "March")
-LOCVAL(LOCALE_SMONTHNAME4, "April")
-LOCVAL(LOCALE_SMONTHNAME5, "May")
-LOCVAL(LOCALE_SMONTHNAME6, "June")
-LOCVAL(LOCALE_SMONTHNAME7, "July")
-LOCVAL(LOCALE_SMONTHNAME8, "August")
-LOCVAL(LOCALE_SMONTHNAME9, "September")
-LOCVAL(LOCALE_SMONTHNAME10, "October")
-LOCVAL(LOCALE_SMONTHNAME11, "November")
-LOCVAL(LOCALE_SMONTHNAME12, "December")
-LOCVAL(LOCALE_SMONTHNAME13, "")
-LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
-LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
-LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
-LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
-LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
-LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
-LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
-LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
-LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
-LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
-LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
-LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
-LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
-LOCVAL(LOCALE_SPOSITIVESIGN, "")
-LOCVAL(LOCALE_SNEGATIVESIGN, "-")
-LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
-LOCVAL(LOCALE_INEGSIGNPOSN, "0")
-LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
-LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
-LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
-LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
- default: found=0;break;
- }
- break; /* LANG(0x0409) (U.S. English) */
-
case 0x0809:
switch (LCType) {
LOCVAL(LOCALE_ILANGUAGE, "0809")
@@ -1879,7 +1759,7 @@
}
/***********************************************************************
- * SetLocalInfoA (KERNEL32.499)
+ * SetLocaleInfoA [KERNEL32.499]
*/
BOOL16 WINAPI SetLocaleInfoA(DWORD lcid, DWORD lctype, LPCSTR data)
{
@@ -1888,7 +1768,7 @@
}
/***********************************************************************
- * IsValidLocale (KERNEL32.361)
+ * IsValidLocale [KERNEL32.361]
*/
BOOL32 WINAPI IsValidLocale(LCID lcid,DWORD flags)
{
@@ -1897,7 +1777,7 @@
}
/***********************************************************************
- * EnumSystemLocales32W (KERNEL32.93)
+ * EnumSystemLocales32W [KERNEL32.93]
*/
BOOL32 WINAPI EnumSystemLocales32W( LOCALE_ENUMPROC32W lpfnLocaleEnum,
DWORD flags )
@@ -1940,7 +1820,7 @@
}
/***********************************************************************
- * EnumSystemLocales32A (KERNEL32.92)
+ * EnumSystemLocales32A [KERNEL32.92]
*/
BOOL32 WINAPI EnumSystemLocales32A(LOCALE_ENUMPROC32A lpfnLocaleEnum,
DWORD flags)
@@ -1975,7 +1855,7 @@
}
/***********************************************************************
- * GetStringTypeA (OLE2NLS.7)
+ * GetStringTypeA [OLE2NLS.7]
*/
BOOL16 WINAPI GetStringType16(LCID locale,DWORD dwInfoType,LPCSTR src,
INT16 cchSrc,LPWORD chartype)
@@ -1983,7 +1863,7 @@
return GetStringTypeEx32A(locale,dwInfoType,src,cchSrc,chartype);
}
/***********************************************************************
- * GetStringTypeA (KERNEL32.277)
+ * GetStringTypeA [KERNEL32.277]
*/
BOOL32 WINAPI GetStringType32A(LCID locale,DWORD dwInfoType,LPCSTR src,
INT32 cchSrc,LPWORD chartype)
@@ -1991,7 +1871,7 @@
return GetStringTypeEx32A(locale,dwInfoType,src,cchSrc,chartype);
}
/***********************************************************************
- * GetStringTypeExA (KERNEL32.276)
+ * GetStringTypeExA [KERNEL32.276]
*/
BOOL32 WINAPI GetStringTypeEx32A(LCID locale,DWORD dwInfoType,LPCSTR src,
INT32 cchSrc,LPWORD chartype)
@@ -2026,8 +1906,10 @@
return TRUE;
}
-/***********************************************************************
- * GetStringTypeW (KERNEL32.279)
+/*********************************************************************
+ * GetStringTypeW [KERNEL32.279]
+ *
+ * NOTES
* Yes, this is missing LCID locale. MS fault.
*/
BOOL32 WINAPI GetStringType32W(DWORD dwInfoType,LPCWSTR src,INT32 cchSrc,
@@ -2036,8 +1918,8 @@
return GetStringTypeEx32W(0/*defaultlocale*/,dwInfoType,src,cchSrc,chartype);
}
-/***********************************************************************
- * GetStringTypeW (KERNEL32.278)
+/*********************************************************************
+ * GetStringTypeW [KERNEL32.278]
* FIXME: unicode chars are assumed chars
*/
BOOL32 WINAPI GetStringTypeEx32W(LCID locale,DWORD dwInfoType,LPCWSTR src,
@@ -2073,7 +1955,9 @@
return TRUE;
}
-/* VerLanguageName [VER.10] */
+/*****************************************************************
+ * VerLanguageName16 [VER.10]
+ */
DWORD WINAPI VerLanguageName16(UINT16 langid,LPSTR langname,UINT16 langnamelen)
{
int i;
@@ -2098,14 +1982,18 @@
return strlen(languages[i].langname);
}
-/* VerLanguageNameA [VERSION.9] */
+/*****************************************************************
+ * VerLanguageName32A [VERSION.9]
+ */
DWORD WINAPI VerLanguageName32A(UINT32 langid,LPSTR langname,
UINT32 langnamelen)
{
return VerLanguageName16(langid,langname,langnamelen);
}
-/* VerLanguageNameW [VERSION.10] */
+/*****************************************************************
+ * VerLanguageName32W [VERSION.10]
+ */
DWORD WINAPI VerLanguageName32W(UINT32 langid,LPWSTR langname,
UINT32 langnamelen)
{
@@ -2207,8 +2095,8 @@
/*****************************************************************
*
- * OLE_GetFormatA()
- * OLE_GetFormatW()
+ * OLE_GetFormatA() [internal]
+
This function implements stuff for GetDateFormat() and
GetTimeFormat().
@@ -2257,7 +2145,7 @@
const char ** dgfmt = _dgfmt - 1;
/* report, for debugging */
- TRACE(ole, "func(%#lx,%#lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p (%9s), len=%d)\n", locale, flags,
+ TRACE(ole, "func(%8lx,%8lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p (%9s), len=%d)\n", locale, flags,
xtime->wDay, xtime->wHour, xtime->wMinute, xtime->wSecond,
format, format, date, date, datelen);
@@ -2430,39 +2318,233 @@
return outpos;
}
+/* OLE_GetFormatW [internal] */
+
INT32 WINAPI OLE_GetFormatW(LCID locale, DWORD flags,
LPSYSTEMTIME xtime,
LPCWSTR format,
- LPWSTR timestr, INT32 timelen)
+ LPWSTR output, INT32 outlen)
{
- FIXME(ole, "(unicode GetDateFormat) STUB\n");
- return 0;
+ INT32 inpos, outpos;
+ int count, type, inquote;
+ int Overflow; /* loop check */
+ int usedate, usetime;
+ WCHAR buf[40];
+ int buflen;
+ char abuf[40];
+ WCHAR arg0[] = {0}, arg1[] = {'%','d',0};
+ WCHAR arg2[] = {'%','0','2','d',0};
+ WCHAR *argarr[] = {arg0, arg1, arg2};
+ int datevars, timevars;
+
+ /* make a debug report */
+ lstrcpynWtoA(abuf, format, sizeof(format));
+ TRACE(ole, "args: %8lx, %8lx, time(d=%d,h=%d,m=%d,s=%d), fmt:\'%s\' (at %p), %p with max len %d\n",
+ locale, flags,
+ xtime->wDay, xtime->wHour, xtime->wMinute, xtime->wSecond,
+ abuf, format, output, outlen);
+
+
+ /* initialize state variables */
+ inpos = outpos = 0;
+ count = 0;
+ inquote = Overflow = 0;
+ /* this is really just a sanity check */
+ output[0] = buf[0] = 0;
+ abuf[0] = '\0';
+ /* for compatibility with official Windows behavior */
+ usedate = flags & DATE_DATEVARSONLY;
+ usetime = flags & TIME_TIMEVARSONLY;
+
+ /* this loop is the core of the function */
+ for (inpos = 0; /* we have several break points */ ; inpos++) {
+ if (inquote) {
+ if (format[inpos] == (WCHAR) '\'') {
+ if (format[inpos+1] == '\'') {
+ inpos++;
+ output[outpos++] = '\'';
+ } else {
+ inquote = 0;
+ continue;
+ }
+ } else if (format[inpos] == 0) {
+ output[outpos++] = 0;
+ if (outpos > outlen) Overflow = 1;
+ break; /* normal exit (within a quote) */
+ } else {
+ output[outpos++] = format[inpos]; /* copy input */
+ if (outpos > outlen) {
+ Overflow = 1;
+ output[outpos-1] = 0;
+ break;
+ }
+ }
+ } else if ( (count && (format[inpos] != type))
+ || ( (count==4 && type =='y') ||
+ (count==4 && type =='M') ||
+ (count==4 && type =='d') ||
+ (count==2 && type =='g') ||
+ (count==2 && type =='h') ||
+ (count==2 && type =='H') ||
+ (count==2 && type =='m') ||
+ (count==2 && type =='s') ||
+ (count==2 && type =='t') ) ) {
+ if (type == 'd') {
+ if (count == 3) {
+ GetLocaleInfo32W(locale,
+ LOCALE_SDAYNAME1 + xtime->wDayOfWeek -1,
+ buf, sizeof(buf)/sizeof(WCHAR) );
+ } else if (count == 3) {
+ GetLocaleInfo32W(locale,
+ LOCALE_SABBREVDAYNAME1 +
+ xtime->wDayOfWeek -1,
+ buf, sizeof(buf)/sizeof(WCHAR) );
+ } else {
+ wsnprintf32W(buf, 5, argarr[count], xtime->wDay );
+ };
+ } else if (type == 'M') {
+ if (count == 4) {
+ GetLocaleInfo32W(locale, LOCALE_SMONTHNAME1 +
+ xtime->wMonth -1, buf,
+ sizeof(buf)/sizeof(WCHAR) );
+ } else if (count == 3) {
+ GetLocaleInfo32W(locale, LOCALE_SABBREVMONTHNAME1 +
+ xtime->wMonth -1, buf,
+ sizeof(buf)/sizeof(WCHAR) );
+ } else {
+ wsnprintf32W(buf, 5, argarr[count], xtime->wMonth);
+ }
+ } else if (type == 'y') {
+ if (count == 4) {
+ wsnprintf32W(buf, 6, argarr[1] /* "%d" */,
+ xtime->wYear);
+ } else if (count == 3) {
+ lstrcpynAtoW(buf, "yyy", 5);
+ } else {
+ wsnprintf32W(buf, 6, argarr[count],
+ xtime->wYear % 100);
+ }
+ } else if (type == 'g') {
+ if (count == 2) {
+ FIXME(ole, "LOCALE_ICALENDARTYPE unimplemented\n");
+ lstrcpynAtoW(buf, "AD", 5);
+ } else {
+ /* Win API sez we copy it verbatim */
+ lstrcpynAtoW(buf, "g", 5);
+ }
+ } else if (type == 'h') {
+ /* hours 1:00-12:00 --- is this right? */
+ wsnprintf32W(buf, 5, argarr[count],
+ (xtime->wHour-1)%12 +1);
+ } else if (type == 'H') {
+ wsnprintf32W(buf, 5, argarr[count],
+ xtime->wHour);
+ } else if (type == 'm') {
+ wsnprintf32W(buf, 5, argarr[count],
+ xtime->wMinute);
+ } else if (type == 's') {
+ wsnprintf32W(buf, 5, argarr[count],
+ xtime->wSecond);
+ } else if (type == 't') {
+ GetLocaleInfo32W(locale, (xtime->wHour < 12) ?
+ LOCALE_S1159 : LOCALE_S2359,
+ buf, sizeof(buf) );
+ if (count == 1) {
+ buf[1] = 0;
+ }
+}
+
+ /* no matter what happened, we need to check this next
+ character the next time we loop through */
+ inpos--;
+
+ /* cat buf onto the output */
+ outlen = lstrlen32W(buf);
+ if (outpos + buflen < outlen) {
+ output[outpos] = 0; /* a "hook" for strcat */
+ lstrcat32W(output, buf);
+ outpos += buflen;
+ } else {
+ output[outpos] = 0;
+ lstrcatn32W(output, buf, outlen - outpos);
+ output[outlen - 1] = 0;
+ Overflow = 1;
+ break; /* Abnormal exit */
+ }
+
+ /* reset the variables we used this time */
+ count = 0;
+ type = '\0';
+ } else if (format[inpos] == 0) {
+ /* we can't check for this at the beginning, because that
+ would keep us from printing a format spec that ended the
+ string */
+ output[outpos] = 0;
+ break; /* NORMAL EXIT */
+ } else if (count) {
+ /* how we keep track of the middle of a format spec */
+ count++;
+ continue;
+ } else if ( (datevars && (format[inpos]=='d' ||
+ format[inpos]=='M' ||
+ format[inpos]=='y' ||
+ format[inpos]=='g') ) ||
+ (timevars && (format[inpos]=='H' ||
+ format[inpos]=='h' ||
+ format[inpos]=='m' ||
+ format[inpos]=='s' ||
+ format[inpos]=='t') ) ) {
+ type = format[inpos];
+ count = 1;
+ continue;
+ } else if (format[inpos] == '\'') {
+ inquote = 1;
+ continue;
+ } else {
+ /* unquoted literals */
+ output[outpos++] = format[inpos];
+ }
+ }
+
+ if (Overflow) {
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ WARN(ole, " buffer overflow\n");
+ };
+
+ /* final string terminator and sanity check */
+ outpos++;
+ if (outpos > outlen-1) outpos = outlen-1;
+ output[outpos] = '0';
+
+ lstrcpynWtoA(abuf, output, sizeof(abuf) );
+ TRACE(ole, " returning string \'%s\'\n", abuf);
+
+ return (!Overflow) ? outlen : 0;
}
/*****************************************************************
+ * GetDateFormat32A() [KERNEL32.310] Makes an ASCII string of the date
*
- * GetDateFormat32A()
-
- This function uses format to format the date, or, if format
- is NULL, uses the default for the locale. format is a string
- of literal fields and characters as follows:
-
- d single-digit (no leading zero) day (of month)
- dd two-digit day (of month)
- ddd short day-of-week name
- dddd long day-of-week name
- M single-digit month
- MM two-digit month
- MMM short month name
- MMMM full month name
- y two-digit year, no leading 0
- yy two-digit year
- yyyy four-digit year
- gg era string
-
- * ***********************/
+ * This function uses format to format the date, or, if format
+ * is NULL, uses the default for the locale. format is a string
+ * of literal fields and characters as follows:
+ *
+ * - d single-digit (no leading zero) day (of month)
+ * - dd two-digit day (of month)
+ * - ddd short day-of-week name
+ * - dddd long day-of-week name
+ * - M single-digit month
+ * - MM two-digit month
+ * - MMM short month name
+ * - MMMM full month name
+ * - y two-digit year, no leading 0
+ * - yy two-digit year
+ * - yyyy four-digit year
+ * - gg era string
+ *
+ */
INT32 WINAPI GetDateFormat32A(LCID locale,DWORD flags,
LPSYSTEMTIME xtime,
@@ -2521,11 +2603,11 @@
}
/* ****************************************************************
- * GetDateFormat32W()
-
+ * GetDateFormat32W() [KERNEL32.311] Makes a Unicode string of the date
+ *
* Acts the same as GetDateFormat32A(), except that it's Unicode.
* Accepts & returns sizes as counts of Unicode characters.
-
+ *
*/
INT32 WINAPI GetDateFormat32W(LCID locale,DWORD flags,
LPSYSTEMTIME xtime,
@@ -2534,37 +2616,67 @@
{
short datearr[] = {'1','9','9','4','-','1','-','1',0};
- FIXME(ole, "STUB\n");
+ FIXME(ole, "STUB (should call OLE_GetFormatW)\n");
lstrcpyn32W(date, datearr, datelen);
return ( datelen < 9) ? datelen : 9;
}
+
+/**************************************************************************
+ * GetNumberFormat32A (KERNEL32.355)
+ */
+INT32 WINAPI GetNumberFormat32A(LCID locale, DWORD dwflags,
+ LPCSTR lpvalue, char *lpFormat,
+ LPSTR lpNumberStr, int cchNumber)
+/* NOTE: type of lpFormat should be CONST NUMBERFORMAT */
+
+{
+ int n;
+
+ FIXME(file,"%s: stub, no reformating done\n",lpvalue);
+
+ n = strlen(lpvalue);
+ if (cchNumber) {
+ strncpy(lpNumberStr,lpvalue,cchNumber);
+ if (cchNumber <= n) {
+ lpNumberStr[cchNumber-1] = 0;
+ n = cchNumber-1;
+ }
+ }
+ return n;
+}
+
+
+
/*****************************************************************
*
- * GetTimeFormat32A()
-
- Formats date according to format, or locale default if format is
- NULL. The format consists of literal characters and fields as follows:
-
- h hours with no leading zero (12-hour)
- hh hours with full two digits
- H hours with no leading zero (24-hour)
- HH hours with full two digits
- m minutes with no leading zero
- mm minutes with full two digits
- s seconds with no leading zero
- ss seconds with full two digits
- t time marker (A or P)
- tt time marker (AM, PM)
-
+ * GetTimeFormat32A() [KERNEL32.422] Makes an ASCII string of the time
+ *
+ * Formats date according to format, or locale default if format is
+ * NULL. The format consists of literal characters and fields as follows:
+ *
+ * h hours with no leading zero (12-hour)
+ * hh hours with full two digits
+ * H hours with no leading zero (24-hour)
+ * HH hours with full two digits
+ * m minutes with no leading zero
+ * mm minutes with full two digits
+ * s seconds with no leading zero
+ * ss seconds with full two digits
+ * t time marker (A or P)
+ * tt time marker (AM, PM)
+ *
*/
-INT32 WINAPI GetTimeFormat32A(LCID locale,DWORD flags,
- LPSYSTEMTIME xtime,
- LPCSTR format,
- LPSTR timestr,INT32 timelen)
+INT32 WINAPI
+GetTimeFormat32A(LCID locale, /* in */
+ DWORD flags, /* in */
+ LPSYSTEMTIME xtime, /* in */
+ LPCSTR format, /* in */
+ LPSTR timestr, /* out */
+ INT32 timelen /* in */)
{
LPCSTR realformat;
char fmt_buf[40];
@@ -2585,40 +2697,78 @@
if (!locale) {
locale = GetSystemDefaultLCID();
}
-
-
return OLE_GetFormatA(locale, flags, xtime, realformat, timestr, timelen);
-
}
+
/* ****************************************************************
- * GetTimeFormat32W()
+ * GetTimeFormat32W() [KERNEL32.423] Makes a Unicode string of the time
*
+
*
*/
-INT32 WINAPI GetTimeFormat32W(LCID locale,DWORD flags,
+INT32 WINAPI
+GetTimeFormat32W(LCID locale,DWORD flags,
LPSYSTEMTIME xtime,
LPCWSTR format,
LPWSTR timestr,INT32 timelen)
{
- char buf[40];
+ char debugbuf[40];
+ WCHAR buf[20];
+ LPCWSTR realformat;
+ SYSTEMTIME t;
+ LPSYSTEMTIME realtime;
+ WCHAR * fmt_buf = NULL;
+ int fmt_buf_size = 0; /* units of WCHARs */
+ INT32 retval;
- lstrcpynWtoA(buf, format, (sizeof(buf))/2);
-
+ lstrcpynWtoA(debugbuf, format, (sizeof(buf))/2);
TRACE(ole, "GetTimeFormatW len %d flags 0x%lX format >%s<\n",
- timelen, flags, buf);
- FIXME(ole, "STUB");
- SetLastError(ERROR_INSUFFICIENT_BUFFER);
- return 0;
+ timelen, flags, debugbuf);
+ /* Enforce the Windows behavior */
+ flags |= ~LOCALE_TIMEDATEBOTH;
+ flags |= TIME_TIMEVARSONLY;
+ /* take care of the format or locale not being given */
+ if (format) {
+ realformat = format;
+ } else if (locale) {
+ /* allocate memory */
+ fmt_buf = malloc((fmt_buf_size+=7) * sizeof(WCHAR));
+ if (!fmt_buf) {
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ WARN(ole, "could not allocate %d chars of memory\n", fmt_buf_size);
+ return 0;
+ };
+ while(!GetLocaleInfo32W(locale, LOCALE_STIMEFORMAT,
+ fmt_buf, fmt_buf_size)) {
+ fmt_buf = realloc(fmt_buf,
+ (fmt_buf_size += 10) * sizeof(WCHAR));
+ if (!fmt_buf) {
+ SetLastError(ERROR_OUTOFMEMORY);
+ WARN(ole, "could not allocate %d chars of memory\n", fmt_buf_size);
+ return 0;
+ };
+ };
+ realformat = fmt_buf;
+ } else {
+ FIXME(ole, "caller gave no locale, no format; what should we do?\n");
+ SetLastError(ERROR_BAD_FORMAT);
+ };
+ if (!locale) {
+ locale = GetSystemDefaultLCID();
}
+ realtime = xtime;
+ if (!realtime) {
+ realtime = &t;
+ GetSystemTime(realtime);
+ };
-
-
-
-
-
+ retval = OLE_GetFormatW(locale, flags, realtime, realformat, timestr, timelen);
+ if (fmt_buf) free(fmt_buf);
+ return retval;
+}
diff --git a/ole/storage.c b/ole/storage.c
index 19f4fbd..d7fcdc6 100644
--- a/ole/storage.c
+++ b/ole/storage.c
@@ -54,12 +54,12 @@
STORAGE_get_big_block(HFILE32 hf,int n,BYTE *block) {
assert(n>=-1);
if (-1==_llseek32(hf,(n+1)*BIGSIZE,SEEK_SET)) {
- fprintf(stderr,"STORAGE_get_big_block: seek failed (%ld)\n",GetLastError());
+ WARN(ole," seek failed (%ld)\n",GetLastError());
return FALSE;
}
assert((n+1)*BIGSIZE==_llseek32(hf,0,SEEK_CUR));
if (BIGSIZE!=_lread32(hf,block,BIGSIZE)) {
- fprintf(stderr,"STORAGE_get_big_block(%d): read didn't (%ld)\n",n,GetLastError());
+ WARN(ole,"(block size %d): read didn't read (%ld)\n",n,GetLastError());
assert(0);
return FALSE;
}
@@ -70,12 +70,12 @@
STORAGE_put_big_block(HFILE32 hf,int n,BYTE *block) {
assert(n>=-1);
if (-1==_llseek32(hf,(n+1)*BIGSIZE,SEEK_SET)) {
- fprintf(stderr,"STORAGE_put_big_block: seek failed (%ld)\n",GetLastError());
+ WARN(ole," seek failed (%ld)\n",GetLastError());
return FALSE;
}
assert((n+1)*BIGSIZE==_llseek32(hf,0,SEEK_CUR));
if (BIGSIZE!=_lwrite32(hf,block,BIGSIZE)) {
- fprintf(stderr,"STORAGE_put_big_block: write failed (%ld)\n",GetLastError());
+ WARN(ole," write failed (%ld)\n",GetLastError());
return FALSE;
}
return TRUE;
@@ -291,22 +291,22 @@
lstrcpyWtoA(name,stde->pps_rawname);
if (!stde->pps_sizeofname)
return;
- fprintf(stderr,"name: %s\n",name);
- fprintf(stderr,"type: %d\n",stde->pps_type);
- fprintf(stderr,"prev pps: %ld\n",stde->pps_prev);
- fprintf(stderr,"next pps: %ld\n",stde->pps_next);
- fprintf(stderr,"dir pps: %ld\n",stde->pps_dir);
- fprintf(stderr,"guid: %s\n",xguid);
+ DUMP("name: %s\n",name);
+ DUMP("type: %d\n",stde->pps_type);
+ DUMP("prev pps: %ld\n",stde->pps_prev);
+ DUMP("next pps: %ld\n",stde->pps_next);
+ DUMP("dir pps: %ld\n",stde->pps_dir);
+ DUMP("guid: %s\n",xguid);
if (stde->pps_type !=2) {
time_t t;
t = DOSFS_FileTimeToUnixTime(&(stde->pps_ft1),NULL);
- fprintf(stderr,"ts1: %s\n",ctime(&t));
+ DUMP("ts1: %s\n",ctime(&t));
t = DOSFS_FileTimeToUnixTime(&(stde->pps_ft2),NULL);
- fprintf(stderr,"ts2: %s\n",ctime(&t));
+ DUMP("ts2: %s\n",ctime(&t));
}
- fprintf(stderr,"startblock: %ld\n",stde->pps_sb);
- fprintf(stderr,"size: %ld\n",stde->pps_size);
+ DUMP("startblock: %ld\n",stde->pps_sb);
+ DUMP("size: %ld\n",stde->pps_size);
}
static BOOL32
@@ -585,7 +585,7 @@
char xrefiid[50];
WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
- TRACE(relay,"(%p)->QueryInterface(%s,%p)\n",this,xrefiid,obj);
+ TRACE(relay,"(%p)->(%s,%p)\n",this,xrefiid,obj);
if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) {
*obj = this;
return 0;
@@ -613,7 +613,7 @@
HRESULT WINAPI IStream16_Seek(
LPSTREAM16 this,LARGE_INTEGER offset,DWORD whence,ULARGE_INTEGER *newpos
) {
- TRACE(relay,"(%p)->Seek([%ld.%ld],%ld,%p)\n",this,offset.HighPart,offset.LowPart,whence,newpos);
+ TRACE(relay,"(%p)->([%ld.%ld],%ld,%p)\n",this,offset.HighPart,offset.LowPart,whence,newpos);
switch (whence) {
/* unix SEEK_xx should be the same as win95 ones */
@@ -657,7 +657,7 @@
ULONG *bytesread=pcbRead,xxread;
int blocknr;
- TRACE(relay,"(%p)->Read(%p,%ld,%p)\n",this,pv,cb,pcbRead);
+ TRACE(relay,"(%p)->(%p,%ld,%p)\n",this,pv,cb,pcbRead);
if (!pcbRead) bytesread=&xxread;
*bytesread = 0;
@@ -670,7 +670,7 @@
int cc;
if (!STORAGE_get_small_block(this->hf,blocknr,block)) {
- fprintf(stderr,"small block read failed!!!!\n");
+ WARN(ole,"small block read failed!!!\n");
return E_FAIL;
}
cc = cb;
@@ -690,7 +690,7 @@
int cc;
if (!STORAGE_get_big_block(this->hf,blocknr,block)) {
- fprintf(stderr,"big block read failed!!!!\n");
+ WARN(ole,"big block read failed!!!\n");
return E_FAIL;
}
cc = cb;
@@ -718,7 +718,7 @@
if (!pcbWrite) byteswritten=&xxwritten;
*byteswritten = 0;
- TRACE(relay,"(%p)->Write(%p,%ld,%p)\n",this,pv,cb,pcbWrite);
+ TRACE(relay,"(%p)->(%p,%ld,%p)\n",this,pv,cb,pcbWrite);
/* do we need to junk some blocks? */
newsize = this->offset.LowPart+cb;
oldsize = this->stde.pps_size;
@@ -1028,7 +1028,7 @@
char xrefiid[50];
WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
- TRACE(relay,"(%p)->QueryInterface(%s,%p)\n",this,xrefiid,obj);
+ TRACE(relay,"(%p)->(%s,%p)\n",this,xrefiid,obj);
if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) {
*obj = this;
return 0;
@@ -1075,7 +1075,7 @@
char xrefiid[50];
WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
- TRACE(relay,"(%p)->QueryInterface(%s,%p)\n",this,xrefiid,obj);
+ TRACE(relay,"(%p)->(%s,%p)\n",this,xrefiid,obj);
if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) {
*obj = this;
@@ -1099,13 +1099,13 @@
HRESULT WINAPI IStorage16_Stat(
LPSTORAGE16 this,STATSTG *pstatstg, DWORD grfStatFlag
) {
- fprintf(stderr,"IStorage16(%p)->Stat(%p,0x%08lx)\n",
+ TRACE(ole,"(%p)->(%p,0x%08lx)\n",
this,pstatstg,grfStatFlag
);
pstatstg->pwcsName=SEGPTR_GET(SEGPTR_STRDUP_WtoA(this->stde.pps_rawname));
pstatstg->type = this->stde.pps_type;
pstatstg->cbSize.LowPart = this->stde.pps_size;
- pstatstg->mtime = this->stde.pps_ft1; /* FIXME */
+ pstatstg->mtime = this->stde.pps_ft1; /* FIXME */ /* why? */
pstatstg->atime = this->stde.pps_ft2; /* FIXME */
pstatstg->ctime = this->stde.pps_ft2; /* FIXME */
pstatstg->grfMode = 0; /* FIXME */
@@ -1119,7 +1119,7 @@
HRESULT WINAPI IStorage16_Commit(
LPSTORAGE16 this,DWORD commitflags
) {
- fprintf(stderr,"IStorage16(%p)->Commit(0x%08lx),STUB!\n",
+ FIXME(ole,"(%p)->(0x%08lx),STUB!\n",
this,commitflags
);
return OLE_OK;
@@ -1132,7 +1132,7 @@
WINE_StringFromCLSID(rgiidExclude,xguid);
else
strcpy(xguid,"<no guid>");
- fprintf(stderr,"IStorage16(%p)->CopyTo(0x%08lx,%s,%p,%p),stub!\n",
+ FIXME(ole,"IStorage16(%p)->(0x%08lx,%s,%p,%p),stub!\n",
this,ciidExclude,xguid,SNB16Exclude,pstgDest
);
return OLE_OK;
@@ -1151,11 +1151,11 @@
READ_HEADER;
- fprintf(stderr,"IStorage16(%p)->CreateStorage(%s,0x%08lx,0x%08lx,0x%08lx,%p)\n",
+ TRACE(ole,"(%p)->(%s,0x%08lx,0x%08lx,0x%08lx,%p)\n",
this,pwcsName,grfMode,dwStgFormat,reserved2,ppstg
);
if (grfMode & STGM_TRANSACTED)
- fprintf(stderr,"IStorage::CreateStorage:We do not support transacted Compound Storage. Using direct mode.\n");
+ FIXME(ole,"We do not support transacted Compound Storage. Using direct mode.\n");
_create_istorage16(ppstg);
lpstg = (LPSTORAGE16)PTR_SEG_TO_LIN(*ppstg);
lpstg->hf = this->hf;
@@ -1168,7 +1168,7 @@
stde.pps_dir = ppsent;
x = this->ppsent;
} else {
- /* FIXME: use prev chain too ? */
+ FIXME(ole," use prev chain too ?\n");
x=stde.pps_dir;
if (1!=STORAGE_get_pps_entry(lpstg->hf,x,&stde))
return E_FAIL;
@@ -1203,11 +1203,11 @@
int ppsent,x;
struct storage_pps_entry stde;
- fprintf(stderr,"IStorage16(%p)->CreateStream(%s,0x%08lx,0x%08lx,0x%08lx,%p)\n",
+ TRACE(ole,"(%p)->(%s,0x%08lx,0x%08lx,0x%08lx,%p)\n",
this,pwcsName,grfMode,reserved1,reserved2,ppstm
);
if (grfMode & STGM_TRANSACTED)
- fprintf(stderr,"IStorage::CreateStream:We do not support transacted Compound Storage. Using direct mode.\n");
+ FIXME(ole,"We do not support transacted Compound Storage. Using direct mode.\n");
_create_istream16(ppstm);
lpstr = (LPSTREAM16)PTR_SEG_TO_LIN(*ppstm);
lpstr->hf = FILE_Dup(this->hf);
@@ -1251,11 +1251,11 @@
WCHAR name[33];
int newpps;
- TRACE(relay,"(%p)->OpenStorage(%s,%p,0x%08lx,%p,0x%08lx,%p)\n",
+ TRACE(relay,"(%p)->(%s,%p,0x%08lx,%p,0x%08lx,%p)\n",
this,pwcsName,pstgPrio,grfMode,snbExclude,reserved,ppstg
);
if (grfMode & STGM_TRANSACTED)
- fprintf(stderr,"IStorage::OpenStorage:We do not support transacted Compound Storage. Using direct mode.\n");
+ FIXME(ole,"We do not support transacted Compound Storage. Using direct mode.\n");
_create_istorage16(ppstg);
lpstg = (LPSTREAM16)PTR_SEG_TO_LIN(*ppstg);
lpstg->hf = FILE_Dup(this->hf);
@@ -1281,11 +1281,11 @@
WCHAR name[33];
int newpps;
- TRACE(relay,"(%p)->OpenStream(%s,%p,0x%08lx,0x%08lx,%p)\n",
+ TRACE(relay,"(%p)->(%s,%p,0x%08lx,0x%08lx,%p)\n",
this,pwcsName,reserved1,grfMode,reserved2,ppstm
);
if (grfMode & STGM_TRANSACTED)
- fprintf(stderr,"IStorage::OpenStream:We do not support transacted Compound Storage. Using direct mode.\n");
+ FIXME(ole,"We do not support transacted Compound Storage. Using direct mode.\n");
_create_istream16(ppstm);
lpstr = (LPSTREAM16)PTR_SEG_TO_LIN(*ppstm);
lpstr->hf = FILE_Dup(this->hf);
@@ -1377,7 +1377,7 @@
char xrefiid[50];
WINE_StringFromCLSID((LPCLSID)refiid,xrefiid);
- TRACE(relay,"(%p)->QueryInterface(%s,%p)\n",this,xrefiid,obj);
+ TRACE(relay,"(%p)->(%s,%p)\n",this,xrefiid,obj);
if (!memcmp(&IID_IUnknown,refiid,sizeof(IID_IUnknown))) {
*obj = this;
@@ -1401,7 +1401,7 @@
HRESULT WINAPI IStorage32_CreateStream(
LPSTORAGE32 this,LPCOLESTR32 pwcsName,DWORD grfMode,DWORD reserved1,DWORD reserved2, IStream32 **ppstm
) {
- fprintf(stderr,"IStorage32(%p)->CreateStream(%p,0x%08lx,0x%08lx,0x%08lx,%p)\n",
+ TRACE(ole,"(%p)->(%p,0x%08lx,0x%08lx,0x%08lx,%p)\n",
this,pwcsName,grfMode,reserved1,reserved2,ppstm
);
*ppstm = (IStream32*)HeapAlloc(GetProcessHeap(),0,sizeof(IStream32));
@@ -1414,7 +1414,7 @@
HRESULT WINAPI IStorage32_OpenStream(
LPSTORAGE32 this,LPCOLESTR32 pwcsName, void *reserved1, DWORD grfMode, DWORD reserved2, IStream32 **ppstm
) {
- fprintf(stderr,"IStorage32(%p)->OpenStream(%p,%p,0x%08lx,0x%08lx,%p)\n",
+ TRACE(ole,"(%p)->(%p,%p,0x%08lx,0x%08lx,%p)\n",
this,pwcsName,reserved1,grfMode,reserved2,ppstm
);
*ppstm = (IStream32*)HeapAlloc(GetProcessHeap(),0,sizeof(IStream32));
@@ -1453,13 +1453,13 @@
LPSTORAGE16 lpstg;
struct storage_pps_entry stde;
- fprintf(stderr,"StgCreateDocfile(%s,0x%08lx,0x%08lx,%p)\n",
+ TRACE(ole,"(%s,0x%08lx,0x%08lx,%p)\n",
pwcsName,grfMode,reserved,ppstgOpen
);
_create_istorage16(ppstgOpen);
hf = CreateFile32A(pwcsName,GENERIC_READ|GENERIC_WRITE,0,NULL,CREATE_NEW,0,0);
if (hf==INVALID_HANDLE_VALUE32) {
- fprintf(stderr,"couldn't open file for storage:%ld\n",GetLastError());
+ WARN(ole,"couldn't open file for storage:%ld\n",GetLastError());
return E_FAIL;
}
lpstg = (LPSTORAGE16)PTR_SEG_TO_LIN(*ppstgOpen);
@@ -1489,7 +1489,7 @@
OLESTATUS WINAPI StgCreateDocFile32(
LPCOLESTR32 pwcsName,DWORD grfMode,DWORD reserved,IStorage32 **ppstgOpen
) {
- fprintf(stderr,"StgCreateDocfile(%p,0x%08lx,0x%08lx,%p)\n",
+ TRACE(ole,"(%p,0x%08lx,0x%08lx,%p)\n",
pwcsName,grfMode,reserved,ppstgOpen
);
*ppstgOpen = (IStorage32*)HeapAlloc(GetProcessHeap(),0,sizeof(IStorage32));
@@ -1503,7 +1503,7 @@
OFSTRUCT ofs;
BYTE magic[24];
- fprintf(stderr,"StgIsStorageFile(%s)",fn);
+ TRACE(ole,"(\'%s\')",fn);
hf = OpenFile32(fn,&ofs,OF_SHARE_DENY_NONE);
if (hf==HFILE_ERROR32)
return STG_E_FILENOTFOUND;
@@ -1527,12 +1527,14 @@
_lclose32(hf);
return STG_E_OLDFORMAT;
}
- fprintf(stderr," -> Invalid header.\n");
+ WARN(ole," -> Invalid header.\n");
_lclose32(hf);
return STG_E_INVALIDHEADER;
}
-OLESTATUS WINAPI StgIsStorageFile32(LPCOLESTR32 fn) {
+OLESTATUS WINAPI
+StgIsStorageFile32(LPCOLESTR32 fn)
+{
LPOLESTR16 xfn = HEAP_strdupWtoA(GetProcessHeap(),0,fn);
OLESTATUS ret = StgIsStorageFile16(xfn);
@@ -1551,7 +1553,7 @@
LPSTORAGE16 lpstg;
struct storage_pps_entry stde;
- fprintf(stderr,"StgOpenStorage(%s,%p,0x%08lx,%p,%ld,%p)\n",
+ TRACE(ole,"(%s,%p,0x%08lx,%p,%ld,%p)\n",
pwcsName,pstgPriority,grfMode,snbExclude,reserved,ppstgOpen
);
_create_istorage16(ppstgOpen);
@@ -1584,11 +1586,13 @@
const OLECHAR32 * pwcsName,IStorage32 *pstgPriority,DWORD grfMode,
SNB32 snbExclude,DWORD reserved, IStorage32 **ppstgOpen
) {
- fprintf(stderr,"StgOpenStorage32(%p,%p,0x%08lx,%p,%ld,%p),stub!\n",
- pwcsName,pstgPriority,grfMode,snbExclude,reserved,ppstgOpen
- );
+ FIXME(ole,"StgOpenStorage32(%p,%p,0x%08lx,%p,%ld,%p),stub!\n",
+ pwcsName,pstgPriority,grfMode,snbExclude,reserved,
+ ppstgOpen);
*ppstgOpen = (IStorage32*)HeapAlloc(GetProcessHeap(),0,sizeof(IStorage32));
(*ppstgOpen)->ref = 1;
(*ppstgOpen)->lpvtbl = &stvt32;
return OLE_OK;
}
+
+
diff --git a/ole/typelib.c b/ole/typelib.c
index 4ad759d..9e529fe 100644
--- a/ole/typelib.c
+++ b/ole/typelib.c
@@ -8,36 +8,115 @@
#include <string.h>
#include <assert.h>
#include "wintypes.h"
+#include "heap.h"
#include "windows.h"
+#include "winreg.h"
#include "winerror.h"
#include "ole.h"
#include "ole2.h"
+#include "oleauto.h"
#include "compobj.h"
#include "debug.h"
/****************************************************************************
* QueryPathOfRegTypeLib (TYPELIB.14)
+ * the path is "Classes\Typelib\<guid>\<major>.<minor>\<lcid>\win16\"
* RETURNS
* path of typelib
*/
HRESULT WINAPI
-QueryPathOfRegTypeLib(
+QueryPathOfRegTypeLib16(
REFGUID guid, /* [in] referenced guid */
WORD wMaj, /* [in] major version */
WORD wMin, /* [in] minor version */
LCID lcid, /* [in] locale id */
- LPSTR path /* [out] path of typelib */
+ LPBSTR16 path /* [out] path of typelib */
) {
char xguid[80];
+ char typelibkey[100],pathname[260];
+ DWORD plen;
- if (HIWORD(guid))
+ if (HIWORD(guid)) {
WINE_StringFromCLSID(guid,xguid);
- else
+ sprintf(typelibkey,"SOFTWARE\\Classes\\Typelib\\%s\\%d.%d\\%ld\\win16",
+ xguid,wMaj,wMin,lcid&0xff
+ );
+ } else {
sprintf(xguid,"<guid 0x%08lx>",(DWORD)guid);
- FIXME(ole,"(%s,%d,%d,0x%04lx,%p),stub!\n",xguid,wMaj,wMin,lcid,path);
- return E_FAIL;
+ FIXME(ole,"(%s,%d,%d,0x%04x,%p),can't handle non-string guids.\n",xguid,wMaj,wMin,lcid,path);
+ return E_FAIL;
+ }
+ plen = sizeof(pathname);
+ if (RegQueryValue16(HKEY_LOCAL_MACHINE,typelibkey,pathname,&plen)) {
+ FIXME(ole,"key %s not found\n",typelibkey);
+ return E_FAIL;
+ }
+ *path = SysAllocString16(pathname);
+ return S_OK;
}
+/****************************************************************************
+ * QueryPathOfRegTypeLib (OLEAUT32.164)
+ * RETURNS
+ * path of typelib
+ */
+HRESULT WINAPI
+QueryPathOfRegTypeLib32(
+ REFGUID guid, /* [in] referenced guid */
+ WORD wMaj, /* [in] major version */
+ WORD wMin, /* [in] minor version */
+ LCID lcid, /* [in] locale id */
+ LPBSTR32 path /* [out] path of typelib */
+) {
+ char xguid[80];
+ char typelibkey[100],pathname[260];
+ DWORD plen;
+
+
+ if (HIWORD(guid)) {
+ WINE_StringFromCLSID(guid,xguid);
+ sprintf(typelibkey,"SOFTWARE\\Classes\\Typelib\\%s\\%d.%d\\%ld\\win32",
+ xguid,wMaj,wMin,lcid&0xff
+ );
+ } else {
+ sprintf(xguid,"<guid 0x%08lx>",(DWORD)guid);
+ FIXME(ole,"(%s,%d,%d,0x%04x,%p),stub!\n",xguid,wMaj,wMin,lcid,path);
+ return E_FAIL;
+ }
+ plen = sizeof(pathname);
+ if (RegQueryValue16(HKEY_LOCAL_MACHINE,typelibkey,pathname,&plen)) {
+ FIXME(ole,"key %s not found\n",typelibkey);
+ return E_FAIL;
+ }
+ *path = HEAP_strdupAtoW(GetProcessHeap(),0,pathname);
+ return S_OK;
+}
+
+/******************************************************************************
+ * LoadTypeLib [TYPELIB.3] Loads and registers a type library
+ *
+ * NOTES
+ * Docs: OLECHAR FAR* szFile
+ * Docs: iTypeLib FAR* FAR* pptLib
+ *
+ * RETURNS
+ * Success: S_OK
+ * Failure: Status
+ */
+HRESULT WINAPI LoadTypeLib(
+ void *szFile, /* [in] Name of file to load from */
+ void * *pptLib) /* [out] Pointer to pointer to loaded type library */
+{
+ FIXME(ole, "(%s,%p): stub\n",debugstr_a(szFile),pptLib);
+ return E_FAIL;
+}
+
+
+/****************************************************************************
+ * OABuildVersion (TYPELIB.15)
+ * RETURNS
+ * path of typelib
+ */
DWORD WINAPI OABuildVersion()
{
return MAKELONG(0xbd3, 0x3);
diff --git a/programs/clock/main.c b/programs/clock/main.c
index 7df6002..5d86501 100644
--- a/programs/clock/main.c
+++ b/programs/clock/main.c
@@ -274,7 +274,7 @@
class.hCursor = LoadCursor (0, IDC_ARROW);
class.hbrBackground = GetStockObject (GRAY_BRUSH);
class.lpszMenuName = "\0";
- class.lpszClassName = (SEGPTR)className;
+ class.lpszClassName = className;
}
if (!RegisterClass (&class))
return FALSE;
diff --git a/programs/notepad/main.c b/programs/notepad/main.c
index 4b434a2..8cd5fcd 100644
--- a/programs/notepad/main.c
+++ b/programs/notepad/main.c
@@ -149,7 +149,7 @@
class.hCursor = LoadCursor (0, IDC_ARROW);
class.hbrBackground = GetStockObject (WHITE_BRUSH);
class.lpszMenuName = 0;
- class.lpszClassName = (SEGPTR)className;
+ class.lpszClassName = className;
}
if (!RegisterClass (&class))
diff --git a/programs/progman/dialog.c b/programs/progman/dialog.c
index 76efc95..5157d92 100644
--- a/programs/progman/dialog.c
+++ b/programs/progman/dialog.c
@@ -573,7 +573,7 @@
{
LoadString(Globals.hInstance, ids, *p, MAX_STRING_LEN);
*p += strlen(*p) + 1;
- lstrcpy(*p, (SEGPTR) filter);
+ lstrcpy(*p, filter);
*p += strlen(*p) + 1;
**p = '\0';
}
diff --git a/programs/progman/grpfile.c b/programs/progman/grpfile.c
index bb4a5e5..01c83de 100644
--- a/programs/progman/grpfile.c
+++ b/programs/progman/grpfile.c
@@ -631,7 +631,7 @@
{
PROGRAM *program = LocalLock(hProgram);
CURSORICONINFO *iconinfo = LocalLock(program->hIcon);
- SEGPTR XorBits, AndBits;
+ LPVOID XorBits, AndBits;
INT sizeXor = iconinfo->nHeight * iconinfo->nWidthBytes;
INT sizeAnd = iconinfo->nHeight * ((iconinfo->nWidth + 15) / 16 * 2);
DumpIcon(LocalLock(program->hIcon), 0, &XorBits, &AndBits);
diff --git a/programs/winhelp/hlp2sgml.c b/programs/winhelp/hlp2sgml.c
index 2294c85..ba7827a 100644
--- a/programs/winhelp/hlp2sgml.c
+++ b/programs/winhelp/hlp2sgml.c
@@ -264,7 +264,7 @@
return 0;
}
-LONG _hread32( HFILE hFile, SEGPTR buffer, LONG count )
+LONG _hread32( HFILE hFile, LPVOID buffer, LONG count )
{
return fread(buffer, 1, count, file);
}
diff --git a/relay32/Makefile.in b/relay32/Makefile.in
index 52e1e6a..b42f3c4 100644
--- a/relay32/Makefile.in
+++ b/relay32/Makefile.in
@@ -14,6 +14,7 @@
ddraw.spec \
dinput.spec \
dplay.spec \
+ dplayx.spec \
dsound.spec \
gdi32.spec \
kernel32.spec \
@@ -22,6 +23,7 @@
msvfw32.spec \
ntdll.spec \
ole32.spec \
+ oleaut32.spec \
olecli32.spec \
olesvr32.spec \
shell32.spec \
diff --git a/relay32/advapi32.spec b/relay32/advapi32.spec
index 7c2edcc..53a9508 100644
--- a/relay32/advapi32.spec
+++ b/relay32/advapi32.spec
@@ -23,17 +23,17 @@
0019 stub ClearEventLogA
0020 stub ClearEventLogW
0021 stub CloseEventLog
-0022 stub CloseServiceHandle
-0023 stub ControlService
+0022 stdcall CloseServiceHandle(long) CloseServiceHandle
+0023 stdcall ControlService(long long ptr) ControlService
0024 stdcall CopySid(long ptr ptr) CopySid
0025 stub CreatePrivateObjectSecurity
0026 stub CreateProcessAsUserA
0027 stub CreateProcessAsUserW
-0028 stub CreateServiceA
+0028 stdcall CreateServiceA(long ptr ptr long long long long ptr ptr ptr ptr ptr ptr) CreateServiceA
0029 stub CreateServiceW
0030 stub DeleteAce
-0031 stub DeleteService
-0032 stub DeregisterEventSource
+0031 stdcall DeleteService(long) DeleteService
+0032 stdcall DeregisterEventSource(long) DeregisterEventSource
0033 stub DestroyPrivateObjectSecurity
0034 stub DuplicateToken
0035 stub EnumDependentServicesA
@@ -94,7 +94,7 @@
0090 stub LookupPrivilegeNameA
0091 stub LookupPrivilegeNameW
0092 stdcall LookupPrivilegeValueA(ptr ptr ptr) LookupPrivilegeValue32A
-0093 stub LookupPrivilegeValueW
+0093 stdcall LookupPrivilegeValueW(ptr ptr ptr) LookupPrivilegeValue32W
0094 stub MakeAbsoluteSD
0095 stub MakeSelfRelativeSD
0096 stub MapGenericMask
@@ -111,10 +111,10 @@
0107 stub OpenEventLogA
0108 stub OpenEventLogW
0109 stdcall OpenProcessToken(long long ptr) OpenProcessToken
-0110 stdcall OpenSCManagerA(ptr ptr long) OpenSCManagerA
-0111 stdcall OpenSCManagerW(ptr ptr long) OpenSCManagerW
-0112 stub OpenServiceA
-0113 stub OpenServiceW
+0110 stdcall OpenSCManagerA(ptr ptr long) OpenSCManager32A
+0111 stdcall OpenSCManagerW(ptr ptr long) OpenSCManager32W
+0112 stdcall OpenServiceA(long str long) OpenService32A
+0113 stdcall OpenServiceW(long wstr long) OpenService32W
0114 stdcall OpenThreadToken(long long long ptr) OpenThreadToken
0115 stub PrivilegeCheck
0116 stub PrivilegedServiceAuditAlarmA
@@ -145,7 +145,7 @@
0141 stdcall RegEnumValueA(long long ptr ptr ptr ptr ptr ptr) RegEnumValue32A
0142 stdcall RegEnumValueW(long long ptr ptr ptr ptr ptr ptr) RegEnumValue32W
0143 stdcall RegFlushKey(long) RegFlushKey
-0144 stub RegGetKeySecurity
+0144 stdcall RegGetKeySecurity(long long ptr ptr) RegGetKeySecurity
0145 stub RegLoadKeyA
0146 stub RegLoadKeyW
0147 stub RegNotifyChangeKeyValue
@@ -175,8 +175,8 @@
0171 stdcall RegSetValueW(long wstr long ptr long) RegSetValue32W
0172 stub RegUnLoadKeyA
0173 stub RegUnLoadKeyW
-0174 stub RegisterEventSourceA
-0175 stub RegisterEventSourceW
+0174 stdcall RegisterEventSourceA(ptr ptr) RegisterEventSource32A
+0175 stdcall RegisterEventSourceW(ptr ptr) RegisterEventSource32W
0176 stub RegisterServiceCtrlHandlerA
0177 stub RegisterServiceCtrlHandlerW
0178 stub ReportEventA
@@ -196,10 +196,10 @@
0192 stub SetServiceStatus
0193 stub SetThreadToken
0194 stub SetTokenInformation
-0195 stub StartServiceA
+0195 stdcall StartServiceA(long long ptr) StartService32A
0196 stdcall StartServiceCtrlDispatcherA(ptr) StartServiceCtrlDispatcher32A
0197 stdcall StartServiceCtrlDispatcherW(ptr) StartServiceCtrlDispatcher32W
-0198 stub StartServiceW
+0198 stdcall StartServiceW(long long ptr) StartService32W
0199 stub UnlockServiceDatabase
0200 stub LsaOpenPolicy
0201 stub LsaLookupSids
diff --git a/relay32/builtin32.c b/relay32/builtin32.c
index baa32d7..593cc10 100644
--- a/relay32/builtin32.c
+++ b/relay32/builtin32.c
@@ -9,6 +9,7 @@
#include <string.h>
#include "builtin32.h"
#include "module.h"
+#include "heap.h"
#include "task.h"
#include "process.h"
#include "debug.h"
@@ -46,6 +47,7 @@
extern const BUILTIN32_DESCRIPTOR DDRAW_Descriptor;
extern const BUILTIN32_DESCRIPTOR DINPUT_Descriptor;
extern const BUILTIN32_DESCRIPTOR DPLAY_Descriptor;
+extern const BUILTIN32_DESCRIPTOR DPLAYX_Descriptor;
extern const BUILTIN32_DESCRIPTOR DSOUND_Descriptor;
extern const BUILTIN32_DESCRIPTOR GDI32_Descriptor;
extern const BUILTIN32_DESCRIPTOR KERNEL32_Descriptor;
@@ -54,6 +56,7 @@
extern const BUILTIN32_DESCRIPTOR MSVFW32_Descriptor;
extern const BUILTIN32_DESCRIPTOR NTDLL_Descriptor;
extern const BUILTIN32_DESCRIPTOR OLE32_Descriptor;
+extern const BUILTIN32_DESCRIPTOR OLEAUT32_Descriptor;
extern const BUILTIN32_DESCRIPTOR OLECLI32_Descriptor;
extern const BUILTIN32_DESCRIPTOR OLESVR32_Descriptor;
extern const BUILTIN32_DESCRIPTOR SHELL32_Descriptor;
@@ -76,6 +79,7 @@
{ &DDRAW_Descriptor, NULL, TRUE },
{ &DINPUT_Descriptor, NULL, TRUE },
{ &DPLAY_Descriptor, NULL, TRUE },
+ { &DPLAYX_Descriptor, NULL, TRUE },
{ &DSOUND_Descriptor, NULL, TRUE },
{ &GDI32_Descriptor, NULL, TRUE },
{ &KERNEL32_Descriptor, NULL, TRUE },
@@ -84,6 +88,7 @@
{ &MSVFW32_Descriptor, NULL, FALSE },
{ &NTDLL_Descriptor, NULL, TRUE },
{ &OLE32_Descriptor, NULL, FALSE },
+ { &OLEAUT32_Descriptor, NULL, FALSE },
{ &OLECLI32_Descriptor, NULL, FALSE },
{ &OLESVR32_Descriptor, NULL, FALSE },
{ &SHELL32_Descriptor, NULL, TRUE },
@@ -93,7 +98,7 @@
{ &W32SKRNL_Descriptor, NULL, TRUE },
{ &WINMM_Descriptor, NULL, TRUE },
{ &WINSPOOL_Descriptor, NULL, TRUE },
- { &WOW32_Descriptor, NULL, TRUE },
+ { &WOW32_Descriptor, NULL, TRUE },
{ &WSOCK32_Descriptor, NULL, TRUE },
/* Last entry */
{ NULL, NULL, FALSE }
@@ -122,6 +127,7 @@
LPSTR *names;
DEBUG_ENTRY_POINT *debug;
REG_ENTRY_POINT *regs;
+ WINE_MODREF *wm;
PE_MODREF *pem;
INT32 i, size;
BYTE *addr;
@@ -212,7 +218,7 @@
/* Build the exports section data */
- exp->Name = (BYTE *)dll->descr->name - addr; /*??*/
+ exp->Name = ((BYTE *)dll->descr->name) - addr; /*??*/
exp->Base = dll->descr->base;
exp->NumberOfFunctions = dll->descr->nb_funcs;
exp->NumberOfNames = dll->descr->nb_names;
@@ -276,12 +282,16 @@
*names = (LPSTR)((BYTE *)dll->descr->names[i] - addr);
/* Create a modref */
+ wm = (WINE_MODREF *)HeapAlloc( pdb->heap, HEAP_ZERO_MEMORY, sizeof(*wm) );
+ wm->type = MODULE32_PE;
+ pem = &(wm->binfmt.pe);
+ wm->module = (HMODULE32)addr;
+ wm->next = pdb->modref_list;
+ pdb->modref_list = wm;
+ wm->modname = HEAP_strdupA(pdb->heap,0,dll->descr->name);
- pem = (PE_MODREF *)HeapAlloc( pdb->heap, HEAP_ZERO_MEMORY, sizeof(*pem) );
- pem->module = (HMODULE32)addr;
- pem->pe_export = exp;
- pem->next = pdb->modref_list;
- pdb->modref_list = pem;
+ pem->pe_export = exp;
+ pem->flags = PE_MODREF_INTERNAL;
/* Create a Win16 dummy module */
diff --git a/relay32/comdlg32.spec b/relay32/comdlg32.spec
index 14de9bd..696d149 100644
--- a/relay32/comdlg32.spec
+++ b/relay32/comdlg32.spec
@@ -5,7 +5,7 @@
1 stub ChooseColorA
2 stub ChooseColorW
3 stdcall ChooseFontA(ptr) ChooseFont32A
- 4 stub ChooseFontW
+ 4 stdcall ChooseFontW(ptr) ChooseFont32W
5 stdcall CommDlgExtendedError() CommDlgExtendedError
6 stdcall FindTextA(ptr) FindText32A
7 stdcall FindTextW(ptr) FindText32W
diff --git a/relay32/crtdll.spec b/relay32/crtdll.spec
index 01274c5..2c4b15d 100644
--- a/relay32/crtdll.spec
+++ b/relay32/crtdll.spec
@@ -137,7 +137,7 @@
133 stub _heapwalk
134 stub _hypot
135 cdecl _initterm(ptr ptr) CRTDLL__initterm
-136 stub _iob
+136 extern _iob CRTDLL_iob
137 cdecl _isatty(long) CRTDLL__isatty
138 cdecl _isctype(long long) CRTDLL__isctype
139 stub _ismbbalnum
diff --git a/relay32/dplayx.spec b/relay32/dplayx.spec
new file mode 100644
index 0000000..7a7cd75
--- /dev/null
+++ b/relay32/dplayx.spec
@@ -0,0 +1,9 @@
+name dplayx
+type win32
+
+ 1 stub DirectPlayCreate
+ 2 stub DirectPlayEnumerateA
+ 3 stub DirectPlayEnumerateW
+ 4 stub DirectPlayLobbyCreateA
+ 5 stub DirectPlayLobbyCreateW
+ 9 stub DirectPlayEnumerate
diff --git a/relay32/dsound.spec b/relay32/dsound.spec
index cfb19a7..f0d79ee 100644
--- a/relay32/dsound.spec
+++ b/relay32/dsound.spec
@@ -4,8 +4,8 @@
0 stdcall DirectSoundCreate(ptr ptr ptr) DirectSoundCreate
1 stdcall DirectSoundEnumerateA(ptr ptr) DirectSoundEnumerate32A
2 stub DirectSoundEnumerateW
-3 stub DllCanUnloadNow
-4 stub DllGetClassObject
+3 stdcall DllCanUnloadNow() DllCanUnloadNow
+4 stdcall DllGetClassObject(ptr ptr ptr) DllGetClassObject
5 stub DirectSoundCaptureCreate
6 stub DirectSoundCaptureEnumerateA
7 stub DirectSoundCaptureEnumerateW
diff --git a/relay32/gdi32.spec b/relay32/gdi32.spec
index a741b2d..a447b8d 100644
--- a/relay32/gdi32.spec
+++ b/relay32/gdi32.spec
@@ -14,7 +14,7 @@
10 stdcall BitBlt(long long long long long long long long long) BitBlt32
11 stub CancelDC
12 stub CheckColorsInGamut
- 13 stub ChoosePixelFormat
+ 13 stdcall ChoosePixelFormat(long ptr) ChoosePixelFormat
14 stdcall Chord(long long long long long long long long long) Chord32
15 stdcall CloseEnhMetaFile(long) CloseEnhMetaFile32
16 stdcall CloseFigure(long) CloseFigure32
@@ -22,7 +22,7 @@
18 stub ColorMatchToTarget
19 stdcall CombineRgn(long long long long) CombineRgn32
20 stub CombineTransform
- 21 stub CopyEnhMetaFileA
+ 21 stdcall CopyEnhMetaFileA(long str) CopyEnhMetaFile32A
22 stub CopyEnhMetaFileW
23 stdcall CopyMetaFileA(long str) CopyMetaFile32A
24 stdcall CopyMetaFileW(long wstr) CopyMetaFile32W
@@ -75,7 +75,7 @@
68 stdcall DeleteEnhMetaFile(long) DeleteEnhMetaFile
69 stdcall DeleteMetaFile(long) DeleteMetaFile32
70 stdcall DeleteObject(long) DeleteObject32
- 71 stub DescribePixelFormat
+ 71 stdcall DescribePixelFormat(long long long ptr) DescribePixelFormat
72 stub DeviceCapabilitiesExA
73 stub DeviceCapabilitiesExW
74 stub DrawEscape
@@ -92,7 +92,7 @@
85 stdcall EnumFontsW(long wstr ptr long) EnumFonts32W
86 stub EnumICMProfilesA
87 stub EnumICMProfilesW
- 88 stub EnumMetaFile
+ 88 stdcall EnumMetaFile(long long ptr ptr) EnumMetaFile32
89 stdcall EnumObjects(long long ptr long) EnumObjects32
90 stdcall EqualRgn(long long) EqualRgn32
91 stdcall Escape(long long long ptr ptr) Escape32
@@ -179,7 +179,7 @@
172 stub GetDeviceGammaRamp
173 stub GetETM
174 stdcall GetEnhMetaFileA(ptr) GetEnhMetaFile32A
-175 stub GetEnhMetaFileBits
+175 stdcall GetEnhMetaFileBits(long long ptr) GetEnhMetaFileBits
176 stdcall GetEnhMetaFileDescriptionA(long long ptr) GetEnhMetaFileDescription32A
177 stub GetEnhMetaFileDescriptionW
178 stdcall GetEnhMetaFileHeader(long long ptr) GetEnhMetaFileHeader
@@ -202,7 +202,7 @@
195 stub GetLogColorSpaceW
196 stdcall GetMapMode(long) GetMapMode32
197 stdcall GetMetaFileA(str) GetMetaFile32A
-198 stub GetMetaFileBitsEx
+198 stdcall GetMetaFileBitsEx(long long ptr) GetMetaFileBitsEx
199 stdcall GetMetaFileW(wstr) GetMetaFile32W
200 stub GetMetaRgn
201 stub GetMiterLimit
@@ -216,7 +216,7 @@
209 stdcall GetPaletteEntries(long long long ptr) GetPaletteEntries32
210 stdcall GetPath(long ptr ptr long) GetPath32
211 stdcall GetPixel(long long long) GetPixel32
-212 stub GetPixelFormat
+212 stdcall GetPixelFormat(long) GetPixelFormat
213 stdcall GetPolyFillMode(long) GetPolyFillMode32
214 stdcall GetROP2(long) GetROP232
215 stub GetRandomRgn
@@ -272,11 +272,11 @@
265 stdcall PlayMetaFile(long long) PlayMetaFile32
266 stdcall PlayMetaFileRecord(long ptr ptr long) PlayMetaFileRecord32
267 stub PlgBlt
-268 stub PolyBezier
+268 stdcall PolyBezier(long ptr long) PolyBezier32
269 stub PolyBezierTo
270 stub PolyDraw
271 stdcall PolyPolygon(long ptr ptr long) PolyPolygon32
-272 stub PolyPolyline
+272 stdcall PolyPolyline(long ptr ptr long) PolyPolyline32
273 stub PolyTextOutA
274 stub PolyTextOutW
275 stdcall Polygon(long ptr long) Polygon32
@@ -320,7 +320,7 @@
313 stdcall SetDIBitsToDevice(long long long long long long long long long
ptr ptr long) SetDIBitsToDevice32
314 stub SetDeviceGammaRamp
-315 stub SetEnhMetaFileBits
+315 stdcall SetEnhMetaFileBits(long ptr) SetEnhMetaFileBits
316 stub SetFontEnumeration
317 stdcall SetGraphicsMode(long long) SetGraphicsMode
318 stub SetICMMode
@@ -333,7 +333,7 @@
325 stub SetMiterLimit
326 stdcall SetPaletteEntries(long long long ptr) SetPaletteEntries32
327 stdcall SetPixel(long long long long) SetPixel32
-328 stub SetPixelFormat
+328 stdcall SetPixelFormat(long long ptr) SetPixelFormat
329 stdcall SetPixelV(long long long long) SetPixelV32
330 stdcall SetPolyFillMode(long long) SetPolyFillMode32
331 stdcall SetROP2(long long) SetROP232
@@ -361,7 +361,7 @@
ptr ptr long long) StretchDIBits32
352 stub StrokeAndFillPath
353 stub StrokePath
-354 stub SwapBuffers
+354 stdcall SwapBuffers(long) SwapBuffers
355 stdcall TextOutA(long long long str long) TextOut32A
356 stdcall TextOutW(long long long wstr long) TextOut32W
357 stub UnloadNetworkFonts
diff --git a/relay32/kernel32.spec b/relay32/kernel32.spec
index b4cbeb2..5a996b4 100644
--- a/relay32/kernel32.spec
+++ b/relay32/kernel32.spec
@@ -175,8 +175,8 @@
161 stdcall CreateFileW(wstr long long ptr long long long) CreateFile32W
162 stub CreateIoCompletionPort
163 stub CreateKernelThread
-164 stub CreateMailslotA
-165 stub CreateMailslotW
+164 stdcall CreateMailslotA(ptr long long ptr) CreateMailslot32A
+165 stdcall CreateMailslotW(ptr long long ptr) CreateMailslot32W
166 stdcall CreateMutexA(ptr long str) CreateMutex32A
167 stdcall CreateMutexW(ptr long wstr) CreateMutex32W
168 stdcall CreateNamedPipeA(str long long long long long long ptr) CreateNamedPipeA
@@ -252,9 +252,9 @@
238 stdcall FileTimeToDosDateTime(ptr ptr ptr) FileTimeToDosDateTime
239 stdcall FileTimeToLocalFileTime(ptr ptr) FileTimeToLocalFileTime
240 stdcall FileTimeToSystemTime(ptr ptr) FileTimeToSystemTime
-241 stub FillConsoleOutputAttribute
-242 stub FillConsoleOutputCharacterA
-243 stub FillConsoleOutputCharacterW
+241 stdcall FillConsoleOutputAttribute(long long long long ptr) FillConsoleOutputAttribute
+242 stdcall FillConsoleOutputCharacterA(long long long long ptr) FillConsoleOutputCharacterA
+243 stdcall FillConsoleOutputCharacterW(long long long long ptr) FillConsoleOutputCharacterW
244 stdcall FindAtomA(str) FindAtom32A
245 stdcall FindAtomW(wstr) FindAtom32W
247 stub FindCloseChangeNotification
@@ -302,8 +302,8 @@
288 stdcall GetCommTimeouts(long ptr) GetCommTimeouts
289 stdcall GetCommandLineA() GetCommandLine32A
290 stdcall GetCommandLineW() GetCommandLine32W
-291 stub GetCompressedFileSizeA
-292 stub GetCompressedFileSizeW
+291 stdcall GetCompressedFileSizeA(long ptr) GetCompressedFileSize32A
+292 stdcall GetCompressedFileSizeW(long ptr) GetCompressedFileSize32W
293 stdcall GetComputerNameA(ptr ptr) GetComputerName32A
294 stdcall GetComputerNameW(ptr ptr) GetComputerName32W
295 stdcall GetConsoleCP() GetConsoleCP
@@ -321,8 +321,8 @@
307 stdcall GetCurrentProcessId() GetCurrentProcessId
308 stdcall GetCurrentThread() GetCurrentThread
309 stdcall GetCurrentThreadId() GetCurrentThreadId
-310 stdcall GetDateFormatA(long long ptr ptr ptr long) GetDateFormat32A
-311 stub GetDateFormatW
+310 stdcall GetDateFormatA(long long ptr str ptr long) GetDateFormat32A
+311 stdcall GetDateFormatW(long long ptr wstr ptr long) GetDateFormat32W
312 stub GetDaylightFlag
313 stub GetDefaultCommConfigA
314 stub GetDefaultCommConfigW
@@ -336,7 +336,7 @@
322 stdcall GetEnvironmentVariableA(str ptr long) GetEnvironmentVariable32A
323 stdcall GetEnvironmentVariableW(wstr ptr long) GetEnvironmentVariable32W
324 stub GetErrorMode
-325 stub GetExitCodeProcess
+325 stdcall GetExitCodeProcess(long ptr) GetExitCodeProcess
326 stdcall GetExitCodeThread(long ptr) GetExitCodeThread
327 stdcall GetFileAttributesA(str) GetFileAttributes32A
328 stdcall GetFileAttributesW(wstr) GetFileAttributes32W
@@ -358,7 +358,7 @@
344 stdcall GetLogicalDriveStringsA(long ptr) GetLogicalDriveStrings32A
345 stdcall GetLogicalDriveStringsW(long ptr) GetLogicalDriveStrings32W
346 stdcall GetLogicalDrives() GetLogicalDrives
-347 stub GetMailslotInfo
+347 stdcall GetMailslotInfo(long ptr ptr ptr ptr) GetMailslotInfo
348 stdcall GetModuleFileNameA(long ptr long) GetModuleFileName32A
349 stdcall GetModuleFileNameW(long ptr long) GetModuleFileName32W
350 stdcall GetModuleHandleA(str) GetModuleHandle32A
@@ -434,7 +434,7 @@
420 stdcall GetThreadTimes(long ptr ptr ptr ptr) GetThreadTimes
421 stdcall GetTickCount() GetTickCount
422 stdcall GetTimeFormatA(long long ptr str ptr long) GetTimeFormat32A
-423 stub GetTimeFormatW
+423 stdcall GetTimeFormatW(long long ptr wstr ptr long) GetTimeFormat32W
424 stdcall GetTimeZoneInformation(ptr) GetTimeZoneInformation
425 stdcall GetUserDefaultLCID() GetUserDefaultLCID
426 stdcall GetUserDefaultLangID() GetUserDefaultLangID
@@ -580,7 +580,7 @@
566 stub QueueUserAPC
567 register RaiseException() EXC_RaiseException
568 stdcall ReadConsoleA(long ptr long ptr ptr) ReadConsole32A
-569 stub ReadConsoleInputA
+569 stdcall ReadConsoleInputA(long ptr long ptr) ReadConsoleInputA
570 stub ReadConsoleInputW
571 stub ReadConsoleOutputA
572 stub ReadConsoleOutputAttribute
@@ -632,8 +632,8 @@
618 stdcall SetCommMask(long ptr) SetCommMask
619 stdcall SetCommState(long ptr) SetCommState32
620 stdcall SetCommTimeouts(long ptr) SetCommTimeouts
-621 stub SetComputerNameA
-622 stub SetComputerNameW
+621 stdcall SetComputerNameA(str) SetComputerName32A
+622 stdcall SetComputerNameW(wstr) SetComputerName32W
623 stdcall SetConsoleActiveScreenBuffer(long) SetConsoleActiveScreenBuffer
624 stub SetConsoleCP
625 stdcall SetConsoleCtrlHandler(ptr long) SetConsoleCtrlHandler
@@ -641,11 +641,11 @@
627 stdcall SetConsoleCursorPosition(long long) SetConsoleCursorPosition
628 stdcall SetConsoleMode(long long) SetConsoleMode
629 stub SetConsoleOutputCP
-630 stub SetConsoleScreenBufferSize
-631 stub SetConsoleTextAttribute
+630 stdcall SetConsoleScreenBufferSize(long long) SetConsoleScreenBufferSize
+631 stdcall SetConsoleTextAttribute(long long) SetConsoleTextAttribute32
632 stdcall SetConsoleTitleA(str) SetConsoleTitle32A
633 stdcall SetConsoleTitleW(wstr) SetConsoleTitle32W
-634 stub SetConsoleWindowInfo
+634 stdcall SetConsoleWindowInfo(long long ptr) SetConsoleWindowInfo
635 stdcall SetCurrentDirectoryA(str) SetCurrentDirectory32A
636 stdcall SetCurrentDirectoryW(wstr) SetCurrentDirectory32W
637 stub SetDaylightFlag
@@ -731,7 +731,7 @@
717 stdcall VirtualQueryEx(long ptr ptr long) VirtualQueryEx
718 stdcall VirtualUnlock(ptr long) VirtualUnlock
719 stub WaitCommEvent
-720 stub WaitForDebugEvent
+720 stdcall WaitForDebugEvent(ptr long) WaitForDebugEvent
721 stdcall WaitForMultipleObjects(long ptr long long) WaitForMultipleObjects
722 stdcall WaitForMultipleObjectsEx(long ptr long long long) WaitForMultipleObjectsEx
723 stdcall WaitForSingleObject(long long) WaitForSingleObject
diff --git a/relay32/mpr.spec b/relay32/mpr.spec
index 2be81b5..ce8e821 100644
--- a/relay32/mpr.spec
+++ b/relay32/mpr.spec
@@ -24,13 +24,13 @@
0043 stub PwdGetPasswordStatusW
0044 stub PwdSetPasswordStatusA
0045 stub PwdSetPasswordStatusW
-0046 stub WNetAddConnection2A
-0047 stub WNetAddConnection2W
-0048 stub WNetAddConnection3A
-0049 stub WNetAddConnection3W
-0050 stub WNetAddConnectionA
-0051 stub WNetAddConnectionW
-0052 stdcall WNetCachePassword(ptr long ptr long long) WNetCachePassword
+0046 stdcall WNetAddConnection2A(ptr str str long) WNetAddConnection2_32A
+0047 stdcall WNetAddConnection2W(ptr wstr wstr long) WNetAddConnection2_32W
+0048 stdcall WNetAddConnection3A(long ptr str str long) WNetAddConnection3_32A
+0049 stdcall WNetAddConnection3W(long ptr wstr wstr long) WNetAddConnection3_32W
+0050 stdcall WNetAddConnectionA(str str str) WNetAddConnection32A
+0051 stdcall WNetAddConnectionW(wstr wstr wstr) WNetAddConnection32W
+0052 stdcall WNetCachePassword(str long str long long) WNetCachePassword
0053 stub WNetCancelConnection2A
0054 stub WNetCancelConnection2W
0055 stub WNetCancelConnectionA
diff --git a/relay32/oleaut32.spec b/relay32/oleaut32.spec
new file mode 100644
index 0000000..a315b0a
--- /dev/null
+++ b/relay32/oleaut32.spec
@@ -0,0 +1,292 @@
+name oleaut32
+type win32
+
+1 stub DllGetClassObject
+2 stdcall SysAllocString(wstr) SysAllocString32
+3 stdcall SysReAllocString(ptr wstr) SysReAllocString32
+4 stub SysAllocStringLen
+5 stub SysReAllocStringLen
+6 stdcall SysFreeString(wstr) SysFreeString32
+7 stub SysStringLen
+8 stub VariantInit
+9 stub VariantClear
+10 stub VariantCopy
+11 stub VariantCopyInd
+12 stub VariantChangeType
+13 stub VariantTimeToDosDateTime
+14 stub DosDateTimeToVariantTime
+15 stub SafeArrayCreate
+16 stub SafeArrayDestroy
+17 stub SafeArrayGetDim
+18 stub SafeArrayGetElemsize
+19 stub SafeArrayGetUBound
+20 stub SafeArrayGetLBound
+21 stub SafeArrayLock
+22 stub SafeArrayUnlock
+23 stub SafeArrayAccessData
+24 stub SafeArrayUnaccessData
+25 stub SafeArrayGetElement
+26 stub SafeArrayPutElement
+27 stub SafeArrayCopy
+28 stub DispGetParam
+29 stub DispGetIDsOfNames
+30 stub DispInvoke
+31 stub CreateDispTypeInfo
+32 stub CreateStdDispatch
+33 stub RegisterActiveObject
+34 stub RevokeActiveObject
+35 stub GetActiveObject
+36 stub SafeArrayAllocDescriptor
+37 stub SafeArrayAllocData
+38 stub SafeArrayDestroyDescriptor
+39 stub SafeArrayDestroyData
+40 stub SafeArrayRedim
+41 stub OACreateTypeLib2
+46 stub VarParseNumFromStr
+47 stub VarNumFromParseNum
+48 stub VarI2FromUI1
+49 stub VarI2FromI4
+50 stub VarI2FromR4
+51 stub VarI2FromR8
+52 stub VarI2FromCy
+53 stub VarI2FromDate
+54 stub VarI2FromStr
+55 stub VarI2FromDisp
+56 stub VarI2FromBool
+58 stub VarI4FromUI1
+59 stub VarI4FromI2
+60 stub VarI4FromR4
+61 stub VarI4FromR8
+62 stub VarI4FromCy
+63 stub VarI4FromDate
+64 stub VarI4FromStr
+65 stub VarI4FromDisp
+66 stub VarI4FromBool
+68 stub VarR4FromUI1
+69 stub VarR4FromI2
+70 stub VarR4FromI4
+71 stub VarR4FromR8
+72 stub VarR4FromCy
+73 stub VarR4FromDate
+74 stub VarR4FromStr
+75 stub VarR4FromDisp
+76 stub VarR4FromBool
+78 stub VarR8FromUI1
+79 stub VarR8FromI2
+80 stub VarR8FromI4
+81 stub VarR8FromR4
+82 stub VarR8FromCy
+83 stub VarR8FromDate
+84 stub VarR8FromStr
+85 stub VarR8FromDisp
+86 stub VarR8FromBool
+88 stub VarDateFromUI1
+89 stub VarDateFromI2
+90 stub VarDateFromI4
+91 stub VarDateFromR4
+92 stub VarDateFromR8
+93 stub VarDateFromCy
+94 stub VarDateFromStr
+95 stub VarDateFromDisp
+96 stub VarDateFromBool
+98 stub VarCyFromUI1
+99 stub VarCyFromI2
+100 stub VarCyFromI4
+101 stub VarCyFromR4
+102 stub VarCyFromR8
+103 stub VarCyFromDate
+104 stub VarCyFromStr
+105 stub VarCyFromDisp
+106 stub VarCyFromBool
+108 stub VarBstrFromUI1
+109 stub VarBstrFromI2
+110 stub VarBstrFromI4
+111 stub VarBstrFromR4
+112 stub VarBstrFromR8
+113 stub VarBstrFromCy
+114 stub VarBstrFromDate
+115 stub VarBstrFromDisp
+116 stub VarBstrFromBool
+118 stub VarBoolFromUI1
+119 stub VarBoolFromI2
+120 stub VarBoolFromI4
+121 stub VarBoolFromR4
+122 stub VarBoolFromR8
+123 stub VarBoolFromDate
+124 stub VarBoolFromCy
+125 stub VarBoolFromStr
+126 stub VarBoolFromDisp
+130 stub VarUI1FromI2
+131 stub VarUI1FromI4
+132 stub VarUI1FromR4
+133 stub VarUI1FromR8
+134 stub VarUI1FromCy
+135 stub VarUI1FromDate
+136 stub VarUI1FromStr
+137 stub VarUI1FromDisp
+138 stub VarUI1FromBool
+146 stub DispCallFunc
+147 stub VariantChangeTypeEx
+148 stub SafeArrayPtrOfIndex
+149 stub SysStringByteLen
+150 stub SysAllocStringByteLen
+160 stub CreateTypeLib
+161 stub LoadTypeLib
+162 stub LoadRegTypeLib
+163 stub RegisterTypeLib
+164 stdcall QueryPathOfRegTypeLib(ptr long long long ptr) QueryPathOfRegTypeLib32
+165 stub LHashValOfNameSys
+166 stub LHashValOfNameSysA
+170 stub OaBuildVersion
+171 stub ClearCustData
+180 stub CreateTypeLib2
+183 stub LoadTypeLibEx
+184 stub SystemTimeToVariantTime
+185 stub VariantTimeToSystemTime
+186 stub UnRegisterTypeLib
+190 stub VarDecFromUI1
+191 stub VarDecFromI2
+192 stub VarDecFromI4
+193 stub VarDecFromR4
+194 stub VarDecFromR8
+195 stub VarDecFromDate
+196 stub VarDecFromCy
+197 stub VarDecFromStr
+198 stub VarDecFromDisp
+199 stub VarDecFromBool
+200 stub GetErrorInfo
+201 stub SetErrorInfo
+202 stub CreateErrorInfo
+205 stub VarI2FromI1
+206 stub VarI2FromUI2
+207 stub VarI2FromUI4
+208 stub VarI2FromDec
+209 stub VarI4FromI1
+210 stub VarI4FromUI2
+211 stub VarI4FromUI4
+212 stub VarI4FromDec
+213 stub VarR4FromI1
+214 stub VarR4FromUI2
+215 stub VarR4FromUI4
+216 stub VarR4FromDec
+217 stub VarR8FromI1
+218 stub VarR8FromUI2
+219 stub VarR8FromUI4
+220 stub VarR8FromDec
+221 stub VarDateFromI1
+222 stub VarDateFromUI2
+223 stub VarDateFromUI4
+224 stub VarDateFromDec
+225 stub VarCyFromI1
+226 stub VarCyFromUI2
+227 stub VarCyFromUI4
+228 stub VarCyFromDec
+229 stub VarBstrFromI1
+230 stub VarBstrFromUI2
+231 stub VarBstrFromUI4
+232 stub VarBstrFromDec
+233 stub VarBoolFromI1
+234 stub VarBoolFromUI2
+235 stub VarBoolFromUI4
+236 stub VarBoolFromDec
+237 stub VarUI1FromI1
+238 stub VarUI1FromUI2
+239 stub VarUI1FromUI4
+240 stub VarUI1FromDec
+241 stub VarDecFromI1
+242 stub VarDecFromUI2
+243 stub VarDecFromUI4
+244 stub VarI1FromUI1
+245 stub VarI1FromI2
+246 stub VarI1FromI4
+247 stub VarI1FromR4
+248 stub VarI1FromR8
+249 stub VarI1FromDate
+250 stub VarI1FromCy
+251 stub VarI1FromStr
+252 stub VarI1FromDisp
+253 stub VarI1FromBool
+254 stub VarI1FromUI2
+255 stub VarI1FromUI4
+256 stub VarI1FromDec
+257 stub VarUI2FromUI1
+258 stub VarUI2FromI2
+259 stub VarUI2FromI4
+260 stub VarUI2FromR4
+261 stub VarUI2FromR8
+262 stub VarUI2FromDate
+263 stub VarUI2FromCy
+264 stub VarUI2FromStr
+265 stub VarUI2FromDisp
+266 stub VarUI2FromBool
+267 stub VarUI2FromI1
+268 stub VarUI2FromUI4
+269 stub VarUI2FromDec
+270 stub VarUI4FromUI1
+271 stub VarUI4FromI2
+272 stub VarUI4FromI4
+273 stub VarUI4FromR4
+274 stub VarUI4FromR8
+275 stub VarUI4FromDate
+276 stub VarUI4FromCy
+277 stub VarUI4FromStr
+278 stub VarUI4FromDisp
+279 stub VarUI4FromBool
+280 stub VarUI4FromI1
+281 stub VarUI4FromUI2
+282 stub VarUI4FromDec
+283 stub BSTR_UserSize
+284 stub BSTR_UserMarshal
+285 stub BSTR_UserUnmarshal
+286 stub BSTR_UserFree
+287 stub VARIANT_UserSize
+288 stub VARIANT_UserMarshal
+289 stub VARIANT_UserUnmarshal
+290 stub VARIANT_UserFree
+291 stub LPSAFEARRAY_UserSize
+292 stub LPSAFEARRAY_UserMarshal
+293 stub LPSAFEARRAY_UserUnmarshal
+294 stub LPSAFEARRAY_UserFree
+295 stub LPSAFEARRAY_Size
+296 stub LPSAFEARRAY_Marshal
+297 stub LPSAFEARRAY_Unmarshal
+320 stub DllRegisterServer
+321 stub DllUnregisterServer
+330 stub VarDateFromUdate
+331 stub VarUdateFromDate
+332 stub GetAltMonthNames
+380 stub UserHWND_from_local
+381 stub UserHWND_to_local
+382 stub UserHWND_free_inst
+383 stub UserHWND_free_local
+384 stub UserBSTR_from_local
+385 stub UserBSTR_to_local
+386 stub UserBSTR_free_inst
+387 stub UserBSTR_free_local
+388 stub UserVARIANT_from_local
+389 stub UserVARIANT_to_local
+390 stub UserVARIANT_free_inst
+391 stub UserVARIANT_free_local
+392 stub UserEXCEPINFO_from_local
+393 stub UserEXCEPINFO_to_local
+394 stub UserEXCEPINFO_free_inst
+395 stub UserEXCEPINFO_free_local
+396 stub UserMSG_from_local
+397 stub UserMSG_to_local
+398 stub UserMSG_free_inst
+399 stub UserMSG_free_local
+410 stub DllCanUnloadNow
+411 stub SafeArrayCreateVector
+412 stub SafeArrayCopyData
+413 stub VectorFromBstr
+414 stub BstrFromVector
+415 stub OleIconToCursor
+416 stub OleCreatePropertyFrameIndirect
+417 stub OleCreatePropertyFrame
+418 stub OleLoadPicture
+419 stub OleCreatePictureIndirect
+420 stub OleCreateFontIndirect
+421 stub OleTranslateColor
+422 stub OleLoadPictureFile
+423 stub OleSavePictureFile
+424 stub OleLoadPicturePath
diff --git a/relay32/relay386.c b/relay32/relay386.c
index 5177ac2..8203e40 100644
--- a/relay32/relay386.c
+++ b/relay32/relay386.c
@@ -190,8 +190,8 @@
void RELAY_CallFrom32Regs( CONTEXT context )
{
- void (CALLBACK *entry_point)(CONTEXT *) =
- *(void (CALLBACK **)(CONTEXT *)) (ESP_reg(&context) - 4);
+ typedef void (CALLBACK *entry_point_t)(CONTEXT *);
+ entry_point_t entry_point = *(entry_point_t*) (ESP_reg(&context) - 4);
if (!TRACE_ON(relay))
{
diff --git a/relay32/user32.spec b/relay32/user32.spec
index 1b3e611..e73bd80 100644
--- a/relay32/user32.spec
+++ b/relay32/user32.spec
@@ -79,8 +79,8 @@
76 stdcall CreateIconFromResource (ptr long long long) CreateIconFromResource32
77 stdcall CreateIconFromResourceEx(ptr long long long long long long) CreateIconFromResourceEx32
78 stdcall CreateIconIndirect(ptr) CreateIconIndirect
- 79 stub CreateMDIWindowA
- 80 stub CreateMDIWindowW
+ 79 stdcall CreateMDIWindowA(ptr ptr long long long long long long long long) CreateMDIWindowA
+ 80 stdcall CreateMDIWindowW(ptr ptr long long long long long long long long) CreateMDIWindowW
81 stdcall CreateMenu() CreateMenu32
82 stdcall CreatePopupMenu() CreatePopupMenu32
83 stdcall CreateWindowExA(long str str long long long long long
@@ -95,16 +95,16 @@
90 stdcall DdeClientTransaction(ptr long long long long long long ptr) DdeClientTransaction32
91 stub DdeCmpStringHandles
92 stdcall DdeConnect(long long long ptr) DdeConnect32
- 93 stub DdeConnectList
+ 93 stdcall DdeConnectList(long long long long ptr) DdeConnectList32
94 stub DdeCreateDataHandle
95 stdcall DdeCreateStringHandleA(long ptr long) DdeCreateStringHandle32A
96 stdcall DdeCreateStringHandleW(long ptr long) DdeCreateStringHandle32W
97 stdcall DdeDisconnect(long) DdeDisconnect32
- 98 stub DdeDisconnectList
+ 98 stdcall DdeDisconnectList(long) DdeDisconnectList32
99 stub DdeEnableCallback
100 stdcall DdeFreeDataHandle(long) DdeFreeDataHandle32
101 stdcall DdeFreeStringHandle(long long) DdeFreeStringHandle32
-102 stub DdeGetData
+102 stdcall DdeGetData(long ptr long long) DdeGetData32
103 stdcall DdeGetLastError(long) DdeGetLastError32
104 stub DdeGetQualityOfService
105 stub DdeImpersonateClient
@@ -112,7 +112,7 @@
107 stdcall DdeInitializeW(ptr ptr long long) DdeInitialize32W
108 stdcall DdeKeepStringHandle(long long) DdeKeepStringHandle32
109 stdcall DdeNameService(long long long long) DdeNameService32
-110 stub DdePostAdvise
+110 stdcall DdePostAdvise(long long long) DdePostAdvise32
111 stub DdeQueryConvInfo
112 stub DdeQueryNextServer
113 stub DdeQueryStringA
@@ -282,7 +282,7 @@
277 stdcall GetOpenClipboardWindow() GetOpenClipboardWindow32
278 stdcall GetParent(long) GetParent32
279 stdcall GetPriorityClipboardFormat(ptr long) GetPriorityClipboardFormat32
-280 stub GetProcessWindowStation
+280 stdcall GetProcessWindowStation() GetProcessWindowStation
281 stdcall GetPropA(long ptr) GetProp32A
282 stdcall GetPropW(long ptr) GetProp32W
283 stdcall GetQueueStatus(long) GetQueueStatus32
@@ -297,7 +297,7 @@
292 stdcall GetSystemMetrics(long) GetSystemMetrics32
293 stdcall GetTabbedTextExtentA(long str long long ptr) GetTabbedTextExtent32A
294 stdcall GetTabbedTextExtentW(long wstr long long ptr) GetTabbedTextExtent32W
-295 stub GetThreadDesktop
+295 stdcall GetThreadDesktop(long) GetThreadDesktop
296 stdcall GetTopWindow(long) GetTopWindow32
297 stdcall GetUpdateRect(long ptr long) GetUpdateRect32
298 stdcall GetUpdateRgn(long long long) GetUpdateRgn32
@@ -477,7 +477,7 @@
472 stdcall SetCursor(long) SetCursor32
473 stub SetCursorContents
474 stdcall SetCursorPos(long long) SetCursorPos32
-475 stub SetDebugErrorLevel
+475 stdcall SetDebugErrorLevel(long) SetDebugErrorLevel
476 stdcall SetDeskWallPaper(str) SetDeskWallPaper32
477 stdcall SetDlgItemInt(long long long long) SetDlgItemInt32
478 stdcall SetDlgItemTextA(long long str) SetDlgItemText32A
@@ -597,10 +597,10 @@
591 stub EnumDesktopWindows
592 stdcall EnumDisplaySettingsA(str long ptr) EnumDisplaySettings32A
593 stub EnumDisplaySettingsW
-594 stub GetWindowRgn
+594 stdcall GetWindowRgn(long long) GetWindowRgn32
595 stub MapVirtualKeyExW
596 stub RegisterServicesProcess
-597 stub SetWindowRgn
+597 stdcall SetWindowRgn(long long long) SetWindowRgn32
598 stub ToUnicodeEx
599 stdcall DrawCaptionTempA(long long ptr long long str long) DrawCaptionTemp32A
600 stub RegisterNetworkCapabilities
@@ -609,3 +609,4 @@
603 stub IsHungAppWindow
604 stub ChangeDisplaySettingsA
605 stub ChangeDisplaySettingsW
+606 stdcall SetWindowText(long str) SetWindowText32A
diff --git a/scheduler/process.c b/scheduler/process.c
index ce6fc50..361875e 100644
--- a/scheduler/process.c
+++ b/scheduler/process.c
@@ -261,6 +261,7 @@
{
size = 0x10000;
commit = 0;
+ pdb->flags |= PDB32_WIN16_PROC; /* This is a Win16 process */
}
if (!(pdb->heap = HeapCreate( HEAP_GROWABLE, size, commit ))) goto error;
pdb->heap_list = pdb->heap;
@@ -668,3 +669,28 @@
/* I don't think that Wine needs to do anything in that function */
return 1; /* success */
}
+
+/***********************************************************************
+ * GetExitCodeProcess [KERNEL32.325]
+ *
+ * Gets termination status of specified process
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ *
+ * FIXME
+ * Should call SetLastError (but doesn't).
+ */
+BOOL32 WINAPI GetExitCodeProcess(
+ HANDLE32 hProcess, /* [I] handle to the process */
+ LPDWORD lpExitCode) /* [O] address to receive termination status */
+{
+ PDB32 *process;
+
+ if (!(process = PROCESS_GetPtr( hProcess, PROCESS_QUERY_INFORMATION )))
+ return FALSE;
+ if (lpExitCode) *lpExitCode = process->exit_code;
+ K32OBJ_DecCount( &process->header );
+ return TRUE;
+}
diff --git a/win32/advapi.c b/win32/advapi.c
index d84a2f1..cee2675 100644
--- a/win32/advapi.c
+++ b/win32/advapi.c
@@ -35,16 +35,26 @@
}
-/***********************************************************************
- * OpenProcessToken [ADVAPI32.197]
+/******************************************************************************
+ * OpenProcessToken [ADVAPI32.109]
+ * Opens the access token associated with a process
+ *
+ * PARAMS
+ * ProcessHandle [I] Handle to process
+ * DesiredAccess [I] Desired access to process
+ * TokenHandle [O] Pointer to handle of open access token
+ *
+ * RETURNS STD
*/
-BOOL32 WINAPI OpenProcessToken(HANDLE32 process,DWORD desiredaccess,
- HANDLE32 *thandle)
+BOOL32 WINAPI OpenProcessToken( HANDLE32 ProcessHandle, DWORD DesiredAccess,
+ HANDLE32 *TokenHandle )
{
- FIXME(advapi,"(%08x,%08lx,%p):stub!\n",process,desiredaccess,thandle);
- return TRUE;
+ FIXME(advapi,"(%08x,%08lx,%p): stub\n",ProcessHandle,DesiredAccess,
+ TokenHandle);
+ return TRUE;
}
+
/***********************************************************************
* OpenThreadToken [ADVAPI32.114]
*/
@@ -56,15 +66,45 @@
return TRUE;
}
-/***********************************************************************
- * LookupPrivilegeValueA [ADVAPI32.90]
+
+/******************************************************************************
+ * LookupPrivilegeValue32A [ADVAPI32.92]
*/
-BOOL32 WINAPI LookupPrivilegeValue32A(LPCSTR system,LPCSTR name,LPVOID bla)
+BOOL32 WINAPI LookupPrivilegeValue32A( LPCSTR lpSystemName,
+ LPCSTR lpName, LPVOID lpLuid)
{
- FIXME(advapi,"(%s,%s,%p): stub\n",system,name,bla);
- return TRUE;
+ LPWSTR lpSystemNameW = HEAP_strdupAtoW(GetProcessHeap(), 0, lpSystemName);
+ LPWSTR lpNameW = HEAP_strdupAtoW(GetProcessHeap(), 0, lpName);
+ BOOL32 ret = LookupPrivilegeValue32W( lpSystemNameW, lpNameW, lpLuid);
+ HeapFree(GetProcessHeap(), 0, lpNameW);
+ HeapFree(GetProcessHeap(), 0, lpSystemNameW);
+ return ret;
}
+
+/******************************************************************************
+ * LookupPrivilegeValue32W [ADVAPI32.93]
+ * Retrieves LUID used on a system to represent the privilege name.
+ *
+ * NOTES
+ * lpLuid should be PLUID
+ *
+ * PARAMS
+ * lpSystemName [I] Address of string specifying the system
+ * lpName [I] Address of string specifying the privilege
+ * lpLuid [I] Address of locally unique identifier
+ *
+ * RETURNS STD
+ */
+BOOL32 WINAPI LookupPrivilegeValue32W( LPCWSTR lpSystemName,
+ LPCWSTR lpName, LPVOID lpLuid )
+{
+ FIXME(advapi,"(%s,%s,%p): stub\n",debugstr_w(lpSystemName),
+ debugstr_w(lpName), lpLuid);
+ return TRUE;
+}
+
+
/***********************************************************************
* AdjustTokenPrivileges [ADVAPI32.10]
*/
@@ -87,25 +127,245 @@
return TRUE;
}
-/*SC_HANDLE*/
-DWORD WINAPI OpenSCManagerA(LPCSTR machine,LPCSTR dbname,DWORD desiredaccess)
+
+/******************************************************************************
+ * OpenSCManager32A [ADVAPI32.110]
+ */
+HANDLE32 WINAPI OpenSCManager32A( LPCSTR lpMachineName, LPCSTR lpDatabaseName,
+ DWORD dwDesiredAccess )
{
- FIXME(advapi,"(%s,%s,%08lx): stub\n",machine,dbname,desiredaccess);
- return 0;
+ LPWSTR lpMachineNameW = HEAP_strdupAtoW(GetProcessHeap(),0,lpMachineName);
+ LPWSTR lpDatabaseNameW = HEAP_strdupAtoW(GetProcessHeap(),0,lpDatabaseName);
+ DWORD ret = OpenSCManager32W(lpMachineNameW,lpDatabaseNameW,
+ dwDesiredAccess);
+ HeapFree(GetProcessHeap(),0,lpDatabaseNameW);
+ HeapFree(GetProcessHeap(),0,lpMachineNameW);
+ return ret;
}
-DWORD WINAPI OpenSCManagerW(LPCWSTR machine,LPCWSTR dbname,DWORD desiredaccess)
+
+/******************************************************************************
+ * OpenSCManager32W [ADVAPI32.111]
+ * Establishes a connection to the service control manager and opens database
+ *
+ * NOTES
+ * This should return a SC_HANDLE
+ *
+ * PARAMS
+ * lpMachineName [I] Pointer to machine name string
+ * lpDatabaseName [I] Pointer to database name string
+ * dwDesiredAccess [I] Type of access
+ *
+ * RETURNS
+ * Success: Handle to service control manager database
+ * Failure: NULL
+ */
+HANDLE32 WINAPI OpenSCManager32W( LPCWSTR lpMachineName, LPCWSTR lpDatabaseName,
+ DWORD dwDesiredAccess )
{
- LPSTR machineA = HEAP_strdupWtoA(GetProcessHeap(),0,machine);
- LPSTR dbnameA = HEAP_strdupWtoA(GetProcessHeap(),0,dbname);
- FIXME(advapi,"(%s,%s,%08lx): stub\n",machineA,dbnameA,desiredaccess);
- HeapFree(GetProcessHeap(),0,machineA);
- HeapFree(GetProcessHeap(),0,dbnameA);
- return 0;
+ FIXME(advapi,"(%s,%s,%08lx): stub\n", debugstr_w(lpMachineName),
+ debugstr_w(lpDatabaseName), dwDesiredAccess);
+ return 1;
}
+
BOOL32 WINAPI AllocateLocallyUniqueId(LPLUID lpluid) {
lpluid->LowPart = time(NULL);
lpluid->HighPart = 0;
return TRUE;
}
+
+
+/******************************************************************************
+ * ControlService [ADVAPI32.23]
+ * Sends a control code to a Win32-based service.
+ *
+ * NOTES
+ * hService should be SC_HANDLE
+ *
+ * RETURNS STD
+ */
+BOOL32 WINAPI ControlService( HANDLE32 hService, DWORD dwControl,
+ LPSERVICE_STATUS lpServiceStatus )
+{
+ FIXME(advapi, "(%d,%ld,%p): stub\n",hService,dwControl,lpServiceStatus);
+ return TRUE;
+}
+
+
+/******************************************************************************
+ * CloseServiceHandle [ADVAPI32.22]
+ * Close handle to service or service control manager
+ *
+ * PARAMS
+ * hSCObject [I] Handle to service or service control manager database
+ *
+ * NOTES
+ * hSCObject should be SC_HANDLE
+ *
+ * RETURNS STD
+ */
+BOOL32 WINAPI CloseServiceHandle( HANDLE32 hSCObject )
+{
+ FIXME(advapi, "(%d): stub\n", hSCObject);
+ return TRUE;
+}
+
+
+/******************************************************************************
+ * OpenService32A [ADVAPI32.112]
+ */
+HANDLE32 WINAPI OpenService32A( HANDLE32 hSCManager, LPCSTR lpServiceName,
+ DWORD dwDesiredAccess )
+{
+ LPWSTR lpServiceNameW = HEAP_strdupAtoW(GetProcessHeap(),0,lpServiceName);
+ DWORD ret = OpenService32W( hSCManager, lpServiceNameW, dwDesiredAccess);
+ HeapFree(GetProcessHeap(),0,lpServiceNameW);
+ return ret;
+}
+
+
+/******************************************************************************
+ * OpenService32W [ADVAPI32.113]
+ * Opens a handle to an existing service
+ *
+ * NOTES
+ * The return value should be SC_HANDLE
+ * hSCManager should be SC_HANDLE
+ *
+ * RETURNS
+ * Success: Handle to the service
+ * Failure: NULL
+ */
+HANDLE32 WINAPI OpenService32W( HANDLE32 hSCManager, LPCWSTR lpServiceName,
+ DWORD dwDesiredAccess )
+{
+ FIXME(advapi, "(%d,%p,%ld): stub\n",hSCManager, lpServiceName,
+ dwDesiredAccess);
+ return 1;
+}
+
+
+/******************************************************************************
+ * CreateServiceA [ADVAPI32.28]
+ */
+DWORD WINAPI CreateServiceA( DWORD hSCManager, LPCSTR lpServiceName,
+ LPCSTR lpDisplayName, DWORD dwDesiredAccess,
+ DWORD dwServiceType, DWORD dwStartType,
+ DWORD dwErrorControl, LPCSTR lpBinaryPathName,
+ LPCSTR lpLoadOrderGroup, LPDWORD lpdwTagId,
+ LPCSTR lpDependencies, LPCSTR lpServiceStartName,
+ LPCSTR lpPassword )
+{
+ FIXME(advapi, "(%ld,%s,%s,...): stub\n",
+ hSCManager, debugstr_a(lpServiceName), debugstr_a(lpDisplayName));
+ return 1;
+}
+
+
+/******************************************************************************
+ * DeleteService [ADVAPI32.31]
+ *
+ * PARAMS
+ * hService [I] Handle to service
+ *
+ * RETURNS STD
+ *
+ * NOTES
+ * hService should be SC_HANDLE
+ */
+BOOL32 WINAPI DeleteService( HANDLE32 hService )
+{
+ FIXME(advapi, "(%d): stub\n",hService);
+ return TRUE;
+}
+
+
+/******************************************************************************
+ * StartService32A [ADVAPI32.195]
+ *
+ * NOTES
+ * How do we convert lpServiceArgVectors to use the 32W version?
+ */
+BOOL32 WINAPI StartService32A( HANDLE32 hService, DWORD dwNumServiceArgs,
+ LPCSTR *lpServiceArgVectors )
+{
+ FIXME(advapi, "(%d,%ld,%p): stub\n",hService,dwNumServiceArgs,lpServiceArgVectors);
+ return TRUE;
+}
+
+
+/******************************************************************************
+ * StartService32W [ADVAPI32.198]
+ * Starts a service
+ *
+ * PARAMS
+ * hService [I] Handle of service
+ * dwNumServiceArgs [I] Number of arguments
+ * lpServiceArgVectors [I] Address of array of argument string pointers
+ *
+ * RETURNS STD
+ *
+ * NOTES
+ * hService should be SC_HANDLE
+ */
+BOOL32 WINAPI StartService32W( HANDLE32 hService, DWORD dwNumServiceArgs,
+ LPCWSTR *lpServiceArgVectors )
+{
+ FIXME(advapi, "(%d,%ld,%p): stub\n",hService,dwNumServiceArgs,
+ lpServiceArgVectors);
+ return TRUE;
+}
+
+
+/******************************************************************************
+ * DeregisterEventSource [ADVAPI32.32]
+ * Closes a handle to the specified event log
+ *
+ * PARAMS
+ * hEventLog [I] Handle to event log
+ *
+ * RETURNS STD
+ */
+BOOL32 WINAPI DeregisterEventSource( HANDLE32 hEventLog )
+{
+ FIXME(advapi, "(%d): stub\n",hEventLog);
+ return TRUE;
+}
+
+
+/******************************************************************************
+ * RegisterEventSource32A [ADVAPI32.174]
+ */
+HANDLE32 WINAPI RegisterEventSource32A( LPCSTR lpUNCServerName,
+ LPCSTR lpSourceName )
+{
+ LPWSTR lpUNCServerNameW = HEAP_strdupAtoW(GetProcessHeap(),0,lpUNCServerName);
+ LPWSTR lpSourceNameW = HEAP_strdupAtoW(GetProcessHeap(),0,lpSourceName);
+ HANDLE32 ret = RegisterEventSource32W(lpUNCServerNameW,lpSourceNameW);
+ HeapFree(GetProcessHeap(),0,lpSourceNameW);
+ HeapFree(GetProcessHeap(),0,lpUNCServerNameW);
+ return ret;
+}
+
+
+/******************************************************************************
+ * RegisterEventSource32W [ADVAPI32.175]
+ * Returns a registered handle to an event log
+ *
+ * PARAMS
+ * lpUNCServerName [I] Server name for source
+ * lpSourceName [I] Source name for registered handle
+ *
+ * RETURNS
+ * Success: Handle
+ * Failure: NULL
+ */
+HANDLE32 WINAPI RegisterEventSource32W( LPCWSTR lpUNCServerName,
+ LPCWSTR lpSourceName )
+{
+ FIXME(advapi, "(%s,%s): stub\n", debugstr_w(lpUNCServerName),
+ debugstr_w(lpSourceName));
+ return 1;
+}
+
diff --git a/win32/code_page.c b/win32/code_page.c
index a43c226..f730121 100644
--- a/win32/code_page.c
+++ b/win32/code_page.c
@@ -13,14 +13,20 @@
#include "debug.h"
-/***********************************************************************
- * GetACP (KERNEL32.148)
+/******************************************************************************
+ * GetACP [KERNEL32.276] Gets current ANSI code-page identifier.
+ *
+ * RETURNS
+ * Current ANSI code-page identifier, default if no current defined
*/
UINT32 WINAPI GetACP(void)
{
+ /* This introduces too many messages */
+/* FIXME(win32, "(void): stub\n"); */
return 1252; /* Windows 3.1 ISO Latin */
}
+
/***********************************************************************
* GetCPInfo (KERNEL32.154)
*/
@@ -82,7 +88,34 @@
/***********************************************************************
- * MultiByteToWideChar (KERNEL32.392)
+ * MultiByteToWideChar (KERNEL32.534)
+ *
+ * PARAMS
+ * page [in] Codepage character set to convert from
+ * flags [in] Character mapping flags
+ * src [in] Source string buffer
+ * srclen [in] Length of source string buffer
+ * dst [in] Destination buffer
+ * dstlen [in] Length of destination buffer
+ *
+ * NOTES
+ * The returned length includes the null terminator character.
+ *
+ * RETURNS
+ * Success: If dstlen > 0, number of characters written to destination
+ * buffer. If dstlen == 0, number of characters needed to do
+ * conversion.
+ * Failure: 0. Occurs if not enough space is available.
+ *
+ * ERRORS
+ * ERROR_INSUFFICIENT_BUFFER
+ * ERROR_INVALID_FLAGS (not yet implemented)
+ * ERROR_INVALID_PARAMETER (not yet implemented)
+ *
+ * BUGS
+ * Does not properly handle codepage conversions.
+ * Does not properly handle flags.
+ *
*/
INT32 WINAPI MultiByteToWideChar(UINT32 page, DWORD flags,
LPCSTR src, INT32 srclen,
@@ -91,25 +124,56 @@
int ret;
if (srclen == -1)
- srclen = lstrlen32A(src);
+ srclen = lstrlen32A(src)+1;
if (!dstlen || !dst)
return srclen;
ret = srclen;
- while (srclen > 0 && dstlen > 0) {
+ while (srclen && dstlen) {
*dst = (WCHAR)(unsigned char)*src;
- if (!*src)
- return ret;
dst++; src++;
dstlen--; srclen--;
}
- if ((dstlen == 0) && *src) {
+ if (!dstlen && srclen) {
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return 0;
}
return ret;
}
+/***********************************************************************
+ * WideCharToMultiByte (KERNEL32.727)
+ *
+ * PARAMS
+ * page [in] Codepage character set to convert to
+ * flags [in] Character mapping flags
+ * src [in] Source string buffer
+ * srclen [in] Length of source string buffer
+ * dst [in] Destination buffer
+ * dstlen [in] Length of destination buffer
+ * defchar [in] Default character to use for conversion if no exact
+ * conversion can be made
+ * used [out] Set if default character was used in the conversion
+ *
+ * NOTES
+ * The returned length includes the null terminator character.
+ *
+ * RETURNS
+ * Success: If dstlen > 0, number of characters written to destination
+ * buffer. If dstlen == 0, number of characters needed to do
+ * conversion.
+ * Failure: 0. Occurs if not enough space is available.
+ *
+ * ERRORS
+ * ERROR_INSUFFICIENT_BUFFER
+ * ERROR_INVALID_FLAGS (not yet implemented)
+ * ERROR_INVALID_PARAMETER (not yet implemented)
+ *
+ * BUGS
+ * Does not properly handle codepage conversions.
+ * Does not properly handle flags.
+ *
+ */
INT32 WINAPI WideCharToMultiByte(UINT32 page, DWORD flags, LPCWSTR src,
INT32 srclen,LPSTR dst, INT32 dstlen,
LPCSTR defchar, BOOL32 *used)
diff --git a/win32/console.c b/win32/console.c
index 1ab7d84..89d70dc 100644
--- a/win32/console.c
+++ b/win32/console.c
@@ -48,6 +48,14 @@
} CONSOLE;
+/* This probably belongs somewhere else */
+typedef struct _CONSOLE_CURSOR_INFO {
+ DWORD dwSize; /* Between 1 & 100 for percentage of cell filled */
+ BOOL32 bVisible; /* Visibility of cursor */
+} CONSOLE_CURSOR_INFO, *LPCONSOLE_CURSOR_INFO;
+
+
+
static void CONSOLE_Destroy( K32OBJ *obj );
static BOOL32 CONSOLE_Write(K32OBJ *ptr, LPCVOID lpBuffer,
DWORD nNumberOfChars, LPDWORD lpNumberOfChars,
@@ -72,7 +80,9 @@
-
+/***********************************************************************
+ * CONSOLE_Destroy
+ */
static void CONSOLE_Destroy(K32OBJ *obj)
{
CONSOLE *console = (CONSOLE *)obj;
@@ -91,7 +101,12 @@
}
-/* lpOverlapped is ignored */
+/***********************************************************************
+ * CONSOLE_Read
+ *
+ * NOTES
+ * lpOverlapped is ignored
+ */
static BOOL32 CONSOLE_Read(K32OBJ *ptr, LPVOID lpBuffer, DWORD nNumberOfChars,
LPDWORD lpNumberOfChars, LPOVERLAPPED lpOverlapped)
{
@@ -112,7 +127,12 @@
}
-/* lpOverlapped is ignored */
+/***********************************************************************
+ * CONSOLE_Write
+ *
+ * NOTES
+ * lpOverlapped is ignored
+ */
static BOOL32 CONSOLE_Write(K32OBJ *ptr, LPCVOID lpBuffer,
DWORD nNumberOfChars,
LPDWORD lpNumberOfChars, LPOVERLAPPED lpOverlapped)
@@ -145,29 +165,51 @@
}
-
-
-/***********************************************************************
- * SetConsoleCtrlHandler (KERNEL32.459)
+/******************************************************************************
+ * SetConsoleCtrlHandler [KERNEL32.459] Adds function to calling process list
+ *
+ * PARAMS
+ * func [I] Address of handler function
+ * add [I] Handler to add or remove
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
*/
-BOOL32 WINAPI SetConsoleCtrlHandler(HANDLER_ROUTINE * func, BOOL32 a)
+BOOL32 WINAPI SetConsoleCtrlHandler( HANDLER_ROUTINE *func, BOOL32 add )
{
- return 0;
+ FIXME(console, "(%p,%i): stub\n",func,add);
+ return TRUE;
}
-/***********************************************************************
- * CreateConsoleScreenBuffer (KERNEL32.151)
+
+/******************************************************************************
+ * CreateConsoleScreenBuffer [KERNEL32.151] Creates a console screen buffer
+ *
+ * PARAMS
+ * dwDesiredAccess [I] Access flag
+ * dwShareMode [I] Buffer share mode
+ * sa [I] Security attributes
+ * dwFlags [I] Type of buffer to create
+ * lpScreenBufferData [I] Reserved
+ *
+ * NOTES
+ * Should call SetLastError
+ *
+ * RETURNS
+ * Success: Handle to new console screen buffer
+ * Failure: INVALID_HANDLE_VALUE
*/
HANDLE32 WINAPI CreateConsoleScreenBuffer( DWORD dwDesiredAccess,
- DWORD dwShareMode,
- LPSECURITY_ATTRIBUTES lpSecurityAttributes,
- DWORD dwFlags,
- LPVOID lpScreenBufferData)
+ DWORD dwShareMode, LPSECURITY_ATTRIBUTES sa,
+ DWORD dwFlags, LPVOID lpScreenBufferData )
{
- FIXME(console, "(...): stub !\n");
- return INVALID_HANDLE_VALUE32;
+ FIXME(console, "(%ld,%ld,%p,%ld,%p): stub\n",dwDesiredAccess,
+ dwShareMode, sa, dwFlags, lpScreenBufferData);
+ return 1;
}
+
/***********************************************************************
* GetConsoleScreenBufferInfo (KERNEL32.190)
*/
@@ -188,15 +230,22 @@
return TRUE;
}
-/***********************************************************************
- * SetConsoleActiveScreenBuffer (KERNEL32.623)
+
+/******************************************************************************
+ * SetConsoleActiveScreenBuffer [KERNEL32.623] Sets buffer to current console
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
*/
-BOOL32 WINAPI SetConsoleActiveScreenBuffer(HANDLE32 hConsoleOutput)
+BOOL32 WINAPI SetConsoleActiveScreenBuffer(
+ HANDLE32 hConsoleOutput) /* [in] Handle to console screen buffer */
{
- FIXME(console, "(%x): stub!\n", hConsoleOutput);
- return 0;
+ FIXME(console, "(%x): stub\n", hConsoleOutput);
+ return FALSE;
}
+
/***********************************************************************
* GetLargestConsoleWindowSize (KERNEL32.226)
*/
@@ -433,14 +482,18 @@
}
-/***********************************************************************
- * GetConsoleCP (KERNEL32.226)
+/******************************************************************************
+ * GetConsoleCP [KERNEL32.295] Returns the OEM code page for the console
+ *
+ * RETURNS
+ * Code page code
*/
UINT32 WINAPI GetConsoleCP(VOID)
{
return GetACP();
}
+
/***********************************************************************
* GetConsoleOutputCP (KERNEL32.189)
*/
@@ -460,15 +513,25 @@
return TRUE;
}
-/***********************************************************************
- * SetConsoleMode (KERNEL32.628)
+
+/******************************************************************************
+ * SetConsoleMode [KERNEL32.628] Sets input mode of console's input buffer
+ *
+ * PARAMS
+ * hcon [I] Handle to console input or screen buffer
+ * mode [I] Input or output mode to set
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
*/
-BOOL32 WINAPI SetConsoleMode(HANDLE32 hcon,DWORD mode)
+BOOL32 WINAPI SetConsoleMode( HANDLE32 hcon, DWORD mode )
{
- FIXME(console,"(%08x,%08lx): stub\n",hcon,mode);
- return TRUE;
+ FIXME(console,"(%08x,%08lx): stub\n",hcon,mode);
+ return TRUE;
}
+
/***********************************************************************
* GetConsoleTitleA (KERNEL32.191)
*/
@@ -485,21 +548,31 @@
return 0;
}
-/***********************************************************************
- * GetConsoleTitleW (KERNEL32.192)
+
+/******************************************************************************
+ * GetConsoleTitle32W [KERNEL32.192] Retrieves title string for console
+ *
+ * PARAMS
+ * title [O] Address of buffer for title
+ * size [I] Size of buffer
+ *
+ * RETURNS
+ * Success: Length of string copied
+ * Failure: 0
*/
-DWORD WINAPI GetConsoleTitle32W(LPWSTR title,DWORD size)
+DWORD WINAPI GetConsoleTitle32W( LPWSTR title, DWORD size )
{
- PDB32 *pdb = PROCESS_Current();
- CONSOLE *console= (CONSOLE *)pdb->console;
- if(console && console->title)
- {
- lstrcpynAtoW(title,console->title,size);
- return (lstrlen32W(title));
- }
- return 0;
+ PDB32 *pdb = PROCESS_Current();
+ CONSOLE *console= (CONSOLE *)pdb->console;
+ if(console && console->title)
+ {
+ lstrcpynAtoW(title,console->title,size);
+ return (lstrlen32W(title));
+ }
+ return 0;
}
+
/***********************************************************************
* WriteConsoleA (KERNEL32.729)
*/
@@ -514,6 +587,7 @@
lpNumberOfCharsWritten, NULL);
}
+
/***********************************************************************
* WriteConsoleOutputA (KERNEL32.732)
*/
@@ -523,7 +597,8 @@
COORD dwBufferCoord,
LPSMALL_RECT lpWriteRegion)
{
- return FALSE;
+ FIXME(console, "(...):stub\n");
+ return FALSE;
}
/***********************************************************************
@@ -545,9 +620,9 @@
lpNumberOfCharsWritten, NULL);
HeapFree( GetProcessHeap(), 0, xstring );
return ret;
-
}
+
/***********************************************************************
* ReadConsoleA (KERNEL32.419)
*/
@@ -610,6 +685,31 @@
}
+
+/******************************************************************************
+ * ReadConsoleInputA [KERNEL32.569] Reads data from a console
+ *
+ * PARAMS
+ * hConsoleInput [I] Handle to console input buffer
+ * lpBuffer [O] Address of buffer for read data
+ * nLength [I] Number of records to read
+ * lpNumberOfEventsRead [O] Address of number of records read
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
+BOOL32 WINAPI ReadConsoleInputA( HANDLE32 hConsoleInput,
+ LPINPUT_RECORD lpBuffer,
+ DWORD nLength, LPDWORD lpNumberOfEventsRead)
+{
+ FIXME(console, "(%d,%p,%ld,%p): stub\n",hConsoleInput, lpBuffer, nLength,
+ lpNumberOfEventsRead);
+ return ReadConsole32A(hConsoleInput, lpBuffer, nLength,
+ lpNumberOfEventsRead, 0);
+}
+
+
/***********************************************************************
* SetConsoleTitle32A (KERNEL32.476)
*/
@@ -622,7 +722,7 @@
LPSTR titlestring;
BOOL32 ret=FALSE;
- TRACE(console,"SetConsoleTitle(%s)\n",title);
+ TRACE(console,"(%s)\n",title);
console = (CONSOLE *)pdb->console;
if (!console)
@@ -645,8 +745,19 @@
return ret;
}
-/***********************************************************************
- * SetConsoleTitle32W (KERNEL32.477)
+
+/******************************************************************************
+ * SetConsoleTitle32W [KERNEL32.477] Sets title bar string for console
+ *
+ * PARAMS
+ * title [I] Address of new title
+ *
+ * NOTES
+ * This should not be calling the A version
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
*/
BOOL32 WINAPI SetConsoleTitle32W( LPCWSTR title )
{
@@ -658,6 +769,7 @@
return ret;
}
+
/***********************************************************************
* FlushConsoleInputBuffer (KERNEL32.132)
*/
@@ -667,26 +779,43 @@
return TRUE;
}
-BOOL32 WINAPI SetConsoleCursorPosition(HANDLE32 hcons,COORD c)
+
+/******************************************************************************
+ * SetConsoleCursorPosition [KERNEL32.627]
+ * Sets the cursor position in console
+ *
+ * PARAMS
+ * hConsoleOutput [I] Handle of console screen buffer
+ * dwCursorPosition [I] New cursor position coordinates
+ *
+ * RETURNS STD
+ */
+BOOL32 WINAPI SetConsoleCursorPosition( HANDLE32 hConsoleOutput,
+ COORD dwCursorPosition )
{
+ TRACE(console, "%d (%d x %d)\n", hConsoleOutput, dwCursorPosition.x,
+ dwCursorPosition.y);
/* x are columns, y rows */
- if (!c.y) {
+ if (!dwCursorPosition.y) {
fprintf(stderr,"\r");
- if (c.x)
- fprintf(stderr,"%c[%dC", 0x1B, c.x); /* note: 0x1b == ESC */
+ if (dwCursorPosition.x)
+ /* note: 0x1B == ESC */
+ fprintf(stderr,"%c[%dC", 0x1B, dwCursorPosition.x);
return TRUE;
}
- /* handle rest of the cases */
+ FIXME(console, "Unhandled case: y=%d\n", dwCursorPosition.y);
return FALSE;
}
+
/***********************************************************************
* GetNumberOfConsoleInputEvents (KERNEL32.246)
*/
BOOL32 WINAPI GetNumberOfConsoleInputEvents(HANDLE32 hcon,LPDWORD nrofevents)
{
- *nrofevents = 0;
- return TRUE;
+ *nrofevents = 0;
+ FIXME(console,"(%x): stub\n", hcon);
+ return TRUE;
}
/***********************************************************************
@@ -694,11 +823,12 @@
*/
BOOL32 WINAPI GetNumberOfConsoleMouseButtons(LPDWORD nrofbuttons)
{
+ FIXME(console,"(%p): stub\n", nrofbuttons);
*nrofbuttons = 2;
- FIXME(console,"(%p): STUB returning 2\n", nrofbuttons);
return TRUE;
}
+
/***********************************************************************
* PeekConsoleInputA (KERNEL32.550)
*/
@@ -710,10 +840,12 @@
pirBuffer = NULL;
cInRecords = 0;
*lpcRead = 0;
- FIXME(console,"(...): STUB returning TRUE\n");
- return TRUE;
+ FIXME(console,"(%d,%p,%ld,%p): stub\n",hConsoleInput, pirBuffer,
+ cInRecords, lpcRead);
+ return TRUE;
}
+
/***********************************************************************
* PeekConsoleInputW (KERNEL32.551)
*/
@@ -725,45 +857,169 @@
pirBuffer = NULL;
cInRecords = 0;
*lpcRead = 0;
- FIXME(console,"(...): STUB returning TRUE\n");
+ FIXME(console,"(%d,%p,%ld,%p): stub\n", hConsoleInput, pirBuffer,
+ cInRecords, lpcRead);
return TRUE;
}
-/***********************************************************************
- * GetConsoleCursorInfo32 (KERNEL32.296)
+
+/******************************************************************************
+ * GetConsoleCursorInfo32 [KERNEL32.296] Gets size and visibility of console
+ *
+ * PARAMS
+ * hcon [I] Handle to console screen buffer
+ * cinfo [O] Address of cursor information
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
*/
-BOOL32 WINAPI GetConsoleCursorInfo32(HANDLE32 hcon, LPDWORD cinfo)
+BOOL32 WINAPI GetConsoleCursorInfo32( HANDLE32 hcon,
+ LPCONSOLE_CURSOR_INFO cinfo )
{
- cinfo[0] = 10; /* 10% of character box is cursor. */
- cinfo[1] = TRUE; /* Cursor is visible. */
- FIXME(console, "(%x,%p): STUB!\n", hcon, cinfo);
- return TRUE;
+ FIXME(console, "(%x,%p): stub\n", hcon, cinfo);
+ if (!cinfo) return FALSE;
+ cinfo->dwSize = 10; /* 10% of character box is cursor. */
+ cinfo->bVisible = TRUE; /* Cursor is visible. */
+ return TRUE;
}
-/***********************************************************************
- * SetConsoleCursorInfo32 (KERNEL32.626)
+
+/******************************************************************************
+ * SetConsoleCursorInfo32 [KERNEL32.626] Sets size and visibility of cursor
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
*/
-BOOL32 WINAPI SetConsoleCursorInfo32(HANDLE32 hcon, LPDWORD cinfo)
+BOOL32 WINAPI SetConsoleCursorInfo32(
+ HANDLE32 hcon, /* [in] Handle to console screen buffer */
+ LPCONSOLE_CURSOR_INFO cinfo) /* [in] Address of cursor information */
{
- FIXME(console, "(%#x,%p): STUB!\n", hcon, cinfo);
- return TRUE;
+ FIXME(console, "(%x,%ld,%i): stub\n", hcon,cinfo->dwSize,cinfo->bVisible);
+ return TRUE;
}
-/***********************************************************************
- * SetConsoleWindowInfo32 (KERNEL32.634)
+
+/******************************************************************************
+ * SetConsoleWindowInfo [KERNEL32.634] Sets size and position of console
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
*/
-BOOL32 WINAPI SetConsoleWindowInfo32(HANDLE32 hcon, BOOL32 flag, LPSMALL_RECT window)
+BOOL32 WINAPI SetConsoleWindowInfo(
+ HANDLE32 hcon, /* [in] Handle to console screen buffer */
+ BOOL32 bAbsolute, /* [in] Coordinate type flag */
+ LPSMALL_RECT window) /* [in] Address of new window rectangle */
{
- FIXME(console, "(%x,%d,%p): STUB!\n", hcon, flag, window);
- return TRUE;
+ FIXME(console, "(%x,%d,%p): stub\n", hcon, bAbsolute, window);
+ return TRUE;
}
-/***********************************************************************
- * (KERNEL32.631)
+
+/******************************************************************************
+ * SetConsoleTextAttribute32 [KERNEL32.631] Sets colors for text
+ *
+ * Sets the foreground and background color attributes of characters
+ * written to the screen buffer.
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
*/
-BOOL32 WINAPI SetConsoleTextAttribute32(HANDLE32 hcon, DWORD attributes)
+BOOL32 WINAPI SetConsoleTextAttribute32(
+ HANDLE32 hcon, /* [in] Handle to console screen buffer */
+ DWORD attributes) /* [in] Text and background colors */
{
- FIXME(console, "(%#x,%#lx): STUB!\n", hcon, attributes);
- return TRUE;
+ FIXME(console, "(%x,%lx): stub\n", hcon, attributes);
+ return TRUE;
+}
+
+
+/******************************************************************************
+ * SetConsoleScreenBufferSize [KERNEL32.630] Changes size of console
+ *
+ * PARAMS
+ * hConsoleOutput [I] Handle to console screen buffer
+ * dwSize [I] New size in character rows and cols
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
+BOOL32 WINAPI SetConsoleScreenBufferSize( HANDLE32 hConsoleOutput,
+ COORD dwSize )
+{
+ FIXME(console, "(%d,%dx%d): stub\n",hConsoleOutput,dwSize.x,dwSize.y);
+ return TRUE;
+}
+
+
+/******************************************************************************
+ * FillConsoleOutputCharacterA [KERNEL32.242]
+ */
+BOOL32 WINAPI FillConsoleOutputCharacterA(
+ HANDLE32 hConsoleOutput,
+ CHAR cCharacter,
+ DWORD nLength,
+ COORD dwWriteCoord,
+ LPDWORD lpNumberOfCharsWritten)
+{
+ FIXME(console, "(%d,%c,%ld,%dx%d,%p): stub\n", hConsoleOutput,cCharacter,
+ nLength,dwWriteCoord.x,dwWriteCoord.y,lpNumberOfCharsWritten);
+ *lpNumberOfCharsWritten = 0;
+ return TRUE;
+}
+
+
+/******************************************************************************
+ * FillConsoleOutputCharacterW [KERNEL32.243] Writes characters to console
+ *
+ * PARAMS
+ * hConsoleOutput [I] Handle to screen buffer
+ * cCharacter [I] Character to write
+ * nLength [I] Number of cells to write to
+ * dwCoord [I] Coords of first cell
+ * lpNumCharsWritten [O] Pointer to number of cells written
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
+BOOL32 WINAPI FillConsoleOutputCharacterW( HANDLE32 hConsoleOutput,
+ WCHAR cCharacter, DWORD nLength,
+ COORD dwCoord,
+ LPDWORD lpNumCharsWritten )
+{
+ FIXME(console, "(%d,%c,%ld,%dx%d,%p): stub\n", hConsoleOutput,
+ cCharacter,nLength,dwCoord.x,dwCoord.y,lpNumCharsWritten);
+ *lpNumCharsWritten = 0;
+ return TRUE;
+}
+
+
+/******************************************************************************
+ * FillConsoleOutputAttribute [KERNEL32.241] Sets attributes for console
+ *
+ * PARAMS
+ * hConsoleOutput [I] Handle to screen buffer
+ * wAttribute [I] Color attribute to write
+ * nLength [I] Number of cells to write to
+ * dwCoord [I] Coords of first cell
+ * lpNumAttrsWritten [O] Pointer to number of cells written
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
+BOOL32 WINAPI FillConsoleOutputAttribute( HANDLE32 hConsoleOutput,
+ WORD wAttribute, DWORD nLength, COORD dwCoord,
+ LPDWORD lpNumAttrsWritten)
+{
+ FIXME(console, "(%d,%d,%ld,%dx%d,%p): stub\n", hConsoleOutput,
+ wAttribute,nLength,dwCoord.x,dwCoord.y,lpNumAttrsWritten);
+ *lpNumAttrsWritten = nLength;
+ return TRUE;
}
diff --git a/win32/file.c b/win32/file.c
index c0eb932..c999fb3 100644
--- a/win32/file.c
+++ b/win32/file.c
@@ -283,17 +283,20 @@
*/
VOID WINAPI SetFileApisToANSI(void)
{
- /*FIXME(file,"(): stub!\n");*/
+ /*FIXME(file,"(): stub\n");*/
}
-/**************************************************************************
- * AreFileApisANSI (KERNEL32.105)
+/******************************************************************************
+ * AreFileApisANSI [KERNEL32.105] Determines if file functions are using ANSI
+ *
+ * RETURNS
+ * TRUE: Set of file functions is using ANSI code page
+ * FALSE: Set of file functions is using OEM code page
*/
BOOL32 WINAPI AreFileApisANSI(void)
{
- FIXME(file,"(): stub!\n");
+ FIXME(file,"(void): stub\n");
return TRUE;
}
-
diff --git a/win32/newfns.c b/win32/newfns.c
index 3e6b9fd..ed0aa9d 100644
--- a/win32/newfns.c
+++ b/win32/newfns.c
@@ -14,6 +14,7 @@
#include "windows.h"
#include "winnt.h"
#include "winerror.h"
+#include "heap.h"
#include "debug.h"
/****************************************************************************
@@ -108,7 +109,10 @@
DWORD nDafaultTimeOut,
LPSECURITY_ATTRIBUTES lpSecurityAttributes)
{
- FIXME (win32, "CreateNamedPipeA: stub\n");
+ FIXME (win32, "(Name=%s, OpenMode=%#08x, dwPipeMode=%#08x, MaxInst=%d, OutBSize=%d, InBuffSize=%d, DefTimeOut=%d, SecAttr=%p): stub\n",
+ debugstr_a(lpName), dwOpenMode, dwPipeMode, nMaxInstances,
+ nOutBufferSize, nInBufferSize, nDafaultTimeOut,
+ lpSecurityAttributes);
/* if (nMaxInstances > PIPE_UNLIMITED_INSTANCES) {
SetLastError (ERROR_INVALID_PARAMETER);
return INVALID_HANDLE_VALUE;
@@ -127,7 +131,10 @@
DWORD nDafaultTimeOut,
LPSECURITY_ATTRIBUTES lpSecurityAttributes)
{
- FIXME (win32, "CreateNamedPipeW: stub\n");
+ FIXME (win32, "(Name=%s, OpenMode=%#08x, dwPipeMode=%#08x, MaxInst=%d, OutBSize=%d, InBuffSize=%d, DefTimeOut=%d, SecAttr=%p): stub\n",
+ debugstr_w(lpName), dwOpenMode, dwPipeMode, nMaxInstances,
+ nOutBufferSize, nInBufferSize, nDafaultTimeOut,
+ lpSecurityAttributes);
SetLastError (ERROR_UNKNOWN);
return INVALID_HANDLE_VALUE32;
@@ -163,26 +170,190 @@
return TRUE;
}
-/**************************************************************************
- * GetNumberFormat32A (KERNEL32.355)
+
+/******************************************************************************
+ * CreateMailslot32A [KERNEL32.164]
*/
-INT32 WINAPI GetNumberFormat32A(LCID locale, DWORD dwflags,
- LPCSTR lpvalue, char *lpFormat,
- LPSTR lpNumberStr, int cchNumber)
-/* NOTE: type of lpFormat should be CONST NUMBERFORMAT */
-
+HANDLE32 WINAPI CreateMailslot32A( LPCSTR lpName, DWORD nMaxMessageSize,
+ DWORD lReadTimeout, LPSECURITY_ATTRIBUTES sa)
{
- int n;
-
- FIXME(file,"%s: stub, no reformating done\n",lpvalue);
-
- n = strlen(lpvalue);
- if (cchNumber) {
- strncpy(lpNumberStr,lpvalue,cchNumber);
- if (cchNumber <= n) {
- lpNumberStr[cchNumber-1] = 0;
- n = cchNumber-1;
- }
- }
- return n;
+ FIXME(win32, "(%s,%ld,%ld,%p): stub\n", debugstr_a(lpName),
+ nMaxMessageSize, lReadTimeout, sa);
+ return 1;
}
+
+
+/******************************************************************************
+ * CreateMailslot32W [KERNEL32.165] Creates a mailslot with specified name
+ *
+ * PARAMS
+ * lpName [I] Pointer to string for mailslot name
+ * nMaxMessageSize [I] Maximum message size
+ * lReadTimeout [I] Milliseconds before read time-out
+ * sa [I] Pointer to security structure
+ *
+ * RETURNS
+ * Success: Handle to mailslot
+ * Failure: INVALID_HANDLE_VALUE
+ */
+HANDLE32 WINAPI CreateMailslot32W( LPCWSTR lpName, DWORD nMaxMessageSize,
+ DWORD lReadTimeout, LPSECURITY_ATTRIBUTES sa )
+{
+ FIXME(win32, "(%s,%ld,%ld,%p): stub\n", debugstr_w(lpName),
+ nMaxMessageSize, lReadTimeout, sa);
+ return 1;
+}
+
+
+/******************************************************************************
+ * GetMailslotInfo [KERNEL32.347] Retrieves info about specified mailslot
+ *
+ * PARAMS
+ * hMailslot [I] Mailslot handle
+ * lpMaxMessageSize [O] Address of maximum message size
+ * lpNextSize [O] Address of size of next message
+ * lpMessageCount [O] Address of number of messages
+ * lpReadTimeout [O] Address of read time-out
+ *
+ * RETURNS
+ * Success: TRUE
+ * Failure: FALSE
+ */
+BOOL32 WINAPI GetMailslotInfo( HANDLE32 hMailslot, LPDWORD lpMaxMessageSize,
+ LPDWORD lpNextSize, LPDWORD lpMessageCount,
+ LPDWORD lpReadTimeout )
+{
+ FIXME(win32, "(%d): stub\n",hMailslot);
+ *lpMaxMessageSize = NULL;
+ *lpNextSize = NULL;
+ *lpMessageCount = NULL;
+ *lpReadTimeout = NULL;
+ return TRUE;
+}
+
+
+/******************************************************************************
+ * GetCompressedFileSize32A [KERNEL32.291]
+ *
+ * NOTES
+ * This should call the W function below
+ */
+DWORD WINAPI GetCompressedFileSize32A(
+ LPCSTR lpFileName,
+ LPDWORD lpFileSizeHigh)
+{
+ FIXME(win32, "(...): stub\n");
+ return 0xffffffff;
+}
+
+
+/******************************************************************************
+ * GetCompressedFileSize32W [KERNEL32.292]
+ *
+ * RETURNS
+ * Success: Low-order doubleword of number of bytes
+ * Failure: 0xffffffff
+ */
+DWORD WINAPI GetCompressedFileSize32W(
+ LPCWSTR lpFileName, /* [in] Pointer to name of file */
+ LPDWORD lpFileSizeHigh) /* [out] Receives high-order doubleword of size */
+{
+ FIXME(win32, "(%s,%p): stub\n",debugstr_w(lpFileName),lpFileSizeHigh);
+ return 0xffffffff;
+}
+
+
+/******************************************************************************
+ * GetProcessWindowStation [USER32.280] Returns handle of window station
+ *
+ * NOTES
+ * Docs say the return value is HWINSTA
+ *
+ * RETURNS
+ * Success: Handle to window station associated with calling process
+ * Failure: NULL
+ */
+DWORD WINAPI GetProcessWindowStation(void)
+{
+ FIXME(win32, "(void): stub\n");
+ return 1;
+}
+
+
+/******************************************************************************
+ * GetThreadDesktop [USER32.295] Returns handle to desktop
+ *
+ * NOTES
+ * Docs say the return value is HDESK
+ *
+ * PARAMS
+ * dwThreadId [I] Thread identifier
+ *
+ * RETURNS
+ * Success: Handle to desktop associated with specified thread
+ * Failure: NULL
+ */
+DWORD WINAPI GetThreadDesktop( DWORD dwThreadId )
+{
+ FIXME(win32, "(%ld): stub\n",dwThreadId);
+ return 1;
+}
+
+
+/******************************************************************************
+ * SetDebugErrorLevel [USER32.475]
+ * Sets the minimum error level for generating debugging events
+ *
+ * PARAMS
+ * dwLevel [I] Debugging error level
+ */
+VOID WINAPI SetDebugErrorLevel( DWORD dwLevel )
+{
+ FIXME(win32, "(%ld): stub\n", dwLevel);
+}
+
+
+/******************************************************************************
+ * WaitForDebugEvent [KERNEL32.720]
+ * Waits for a debugging event to occur in a process being debugged
+ *
+ * PARAMS
+ * lpDebugEvent [I] Address of structure for event information
+ * dwMilliseconds [I] Number of milliseconds to wait for event
+ *
+ * RETURNS STD
+ */
+BOOL32 WINAPI WaitForDebugEvent( LPDEBUG_EVENT lpDebugEvent,
+ DWORD dwMilliseconds )
+{
+ FIXME(win32, "(%p,%ld): stub\n", lpDebugEvent, dwMilliseconds);
+ return TRUE;
+}
+
+
+/******************************************************************************
+ * SetComputerName32A [KERNEL32.621]
+ */
+BOOL32 WINAPI SetComputerName32A( LPCSTR lpComputerName )
+{
+ LPWSTR lpComputerNameW = HEAP_strdupAtoW(GetProcessHeap(),0,lpComputerName);
+ BOOL32 ret = SetComputerName32W(lpComputerNameW);
+ HeapFree(GetProcessHeap(),0,lpComputerNameW);
+ return ret;
+}
+
+
+/******************************************************************************
+ * SetComputerName32W [KERNEL32.622]
+ *
+ * PARAMS
+ * lpComputerName [I] Address of new computer name
+ *
+ * RETURNS STD
+ */
+BOOL32 WINAPI SetComputerName32W( LPCWSTR lpComputerName )
+{
+ FIXME(win32, "(%s): stub\n", debugstr_w(lpComputerName));
+ return TRUE;
+}
+
diff --git a/win32/ordinals.c b/win32/ordinals.c
index 7d94d54..6aa184a 100644
--- a/win32/ordinals.c
+++ b/win32/ordinals.c
@@ -20,16 +20,18 @@
static CRITICAL_SECTION Win16Mutex;
static SEGPTR segWin16Mutex = NULL;
+
/***********************************************
* GetPWinLock (KERNEL32.93)
* Return the infamous Win16Mutex.
*/
VOID WINAPI GetPWinLock(CRITICAL_SECTION **lock)
{
- fprintf(stderr,"GetPWinlock(%p)\n",lock);
- *lock = &Win16Mutex;
+ FIXME(win32, "(%p)\n",lock);
+ *lock = &Win16Mutex;
}
+
/**********************************************************************
* WOW32_1 (KERNEL32.88)
*/
diff --git a/windows/defwnd.c b/windows/defwnd.c
index 5ce2179..0411b64 100644
--- a/windows/defwnd.c
+++ b/windows/defwnd.c
@@ -443,7 +443,8 @@
/***********************************************************************
- * DefWindowProc32A (USER32.126)
+ * DefWindowProc32A [USER32.126]
+ *
*/
LRESULT WINAPI DefWindowProc32A( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
LPARAM lParam )
@@ -504,10 +505,19 @@
/***********************************************************************
- * DefWindowProc32W (USER32.127)
- */
-LRESULT WINAPI DefWindowProc32W( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
- LPARAM lParam )
+ * DefWindowProc32W [USER32.127] Calls default window message handler
+ *
+ * Calls default window procedure for messages not processed
+ * by application.
+ *
+ * RETURNS
+ * Return value is dependent upon the message.
+*/
+LRESULT WINAPI DefWindowProc32W(
+ HWND32 hwnd, /* [in] window procedure recieving message */
+ UINT32 msg, /* [in] message identifier */
+ WPARAM32 wParam, /* [in] first message parameter */
+ LPARAM lParam ) /* [in] second message parameter */
{
LRESULT result;
diff --git a/windows/driver.c b/windows/driver.c
index 317831f..a051bd9 100644
--- a/windows/driver.c
+++ b/windows/driver.c
@@ -119,9 +119,9 @@
lpnewdrv->dis.hDriver = hDrvr;
lstrcpy32A( lpnewdrv->dis.szAliasName, lpDriverName );
lpnewdrv->count = 1;
- ordinal = MODULE_GetOrdinal( lpnewdrv->dis.hModule, "DRIVERPROC" );
+ ordinal = NE_GetOrdinal( lpnewdrv->dis.hModule, "DRIVERPROC" );
if (!ordinal ||
- !(lpnewdrv->lpDrvProc = (DRIVERPROC16)MODULE_GetEntryPoint(
+ !(lpnewdrv->lpDrvProc = (DRIVERPROC16)NE_GetEntryPoint(
lpnewdrv->dis.hModule, ordinal )))
{
FreeModule16( lpnewdrv->dis.hModule );
diff --git a/windows/event.c b/windows/event.c
index 94e1e52..93a8d03 100644
--- a/windows/event.c
+++ b/windows/event.c
@@ -1219,8 +1219,7 @@
FARPROC16 WINAPI GetMouseEventProc(void)
{
HMODULE16 hmodule = GetModuleHandle16("USER");
- return MODULE_GetEntryPoint( hmodule,
- MODULE_GetOrdinal( hmodule, "Mouse_Event" ) );
+ return NE_GetEntryPoint( hmodule, NE_GetOrdinal( hmodule, "Mouse_Event" ));
}
diff --git a/windows/hook.c b/windows/hook.c
index a9e1089..9c8c0ca 100644
--- a/windows/hook.c
+++ b/windows/hook.c
@@ -1168,7 +1168,7 @@
FARPROC16 WINAPI SetWindowsHook16( INT16 id, HOOKPROC16 proc )
{
HANDLE16 handle;
- HINSTANCE16 hInst = __winelib ? 0 : FarGetOwner( HIWORD(proc) );
+ HINSTANCE16 hInst = FarGetOwner( HIWORD(proc) );
/* WH_MSGFILTER is the only task-specific hook for SetWindowsHook() */
HTASK16 hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0;
@@ -1191,12 +1191,10 @@
*/
HHOOK WINAPI SetWindowsHook32A( INT32 id, HOOKPROC32 proc )
{
- HINSTANCE16 hInst = __winelib ? 0 : FarGetOwner( HIWORD(proc) );
-
/* WH_MSGFILTER is the only task-specific hook for SetWindowsHook() */
HTASK16 hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0;
- HANDLE16 handle = HOOK_SetHook( id, proc, HOOK_WIN32A, hInst, hTask );
+ HANDLE16 handle = HOOK_SetHook( id, proc, HOOK_WIN32A, 0, hTask );
return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : 0;
}
@@ -1208,12 +1206,10 @@
*/
HHOOK WINAPI SetWindowsHook32W( INT32 id, HOOKPROC32 proc )
{
- HINSTANCE16 hInst = __winelib ? 0 : FarGetOwner( HIWORD(proc) );
-
/* WH_MSGFILTER is the only task-specific hook for SetWindowsHook() */
HTASK16 hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0;
- HANDLE16 handle = HOOK_SetHook( id, proc, HOOK_WIN32W, hInst, hTask );
+ HANDLE16 handle = HOOK_SetHook( id, proc, HOOK_WIN32W, 0, hTask );
return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : 0;
}
@@ -1241,7 +1237,7 @@
if (dwThreadID == GetCurrentThreadId())
hTask = GetCurrentTask();
else
- hTask = LOWORD(dwThreadID);
+ hTask = LOWORD(dwThreadID); /* FIXME! */
handle = HOOK_SetHook( id, proc, HOOK_WIN32A, hInst, hTask );
return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : (HHOOK)NULL;
@@ -1260,7 +1256,7 @@
if (dwThreadID == GetCurrentThreadId())
hTask = GetCurrentTask();
else
- hTask = LOWORD(dwThreadID);
+ hTask = LOWORD(dwThreadID); /* FIXME! */
handle = HOOK_SetHook( id, proc, HOOK_WIN32W, hInst, hTask );
return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : (HHOOK)NULL;
diff --git a/windows/mdi.c b/windows/mdi.c
index ac848c3..394b4c3 100644
--- a/windows/mdi.c
+++ b/windows/mdi.c
@@ -1466,12 +1466,51 @@
/**********************************************************************
- * CreateMDIWindowA (USER32.79)
+ * CreateMDIWindowA [USER32.79]
*/
+HWND32 WINAPI CreateMDIWindowA(
+ LPCSTR lpClassName,
+ LPCSTR lpWindowName,
+ DWORD dwStyle,
+ INT32 X,
+ INT32 Y,
+ INT32 nWidth,
+ INT32 nHeight,
+ HWND32 hWndParent,
+ HINSTANCE32 hInstance,
+ LPARAM lParam)
+{
+ FIXME(mdi, "(%s,%s,%ld,...): stub\n",debugstr_a(lpClassName),
+ debugstr_a(lpWindowName),dwStyle);
+ return (HWND32)NULL;
+}
-/**********************************************************************
- * CreateMDIWindowW (USER32.80)
+
+/******************************************************************************
+ * CreateMDIWindowW [USER32.80] Creates a MDI child window
+ *
+ * RETURNS
+ * Success: Handle to created window
+ * Failure: NULL
*/
+HWND32 WINAPI CreateMDIWindowW(
+ LPCWSTR lpClassName, /* [in] Pointer to registered child class name */
+ LPCWSTR lpWindowName, /* [in] Pointer to window name */
+ DWORD dwStyle, /* [in] Window style */
+ INT32 X, /* [in] Horizontal position of window */
+ INT32 Y, /* [in] Vertical position of window */
+ INT32 nWidth, /* [in] Width of window */
+ INT32 nHeight, /* [in] Height of window */
+ HWND32 hWndParent, /* [in] Handle to parent window */
+ HINSTANCE32 hInstance, /* [in] Handle to application instance */
+ LPARAM lParam) /* [in] Application-defined value */
+{
+ FIXME(mdi, "(%s,%s,%ld,%d,%d,%d,%d,%x,%d,%ld): stub\n",
+ debugstr_w(lpClassName),debugstr_w(lpWindowName),dwStyle,X,Y,
+ nWidth,nHeight,hWndParent,hInstance,lParam);
+ return (HWND32)NULL;
+}
+
/**********************************************************************
* TranslateMDISysAccel32 (USER32.555)
diff --git a/windows/queue.c b/windows/queue.c
index 1bf2270..7ecd256 100644
--- a/windows/queue.c
+++ b/windows/queue.c
@@ -816,7 +816,8 @@
*/
DWORD WINAPI WaitForInputIdle (HANDLE32 hProcess, DWORD dwTimeOut)
{
- FIXME (msg, "WaitForInputIdle: stub\n");
+ FIXME (msg, "(hProcess=%d, dwTimeOut=%d): stub\n", hProcess, dwTimeOut);
+
return WAIT_TIMEOUT;
}
diff --git a/windows/user.c b/windows/user.c
index 249cfa7..f0d920e 100644
--- a/windows/user.c
+++ b/windows/user.c
@@ -20,6 +20,7 @@
#include "debug.h"
#include "toolhelp.h"
#include "message.h"
+#include "module.h"
#include "miscemu.h"
#include "shell.h"
diff --git a/windows/win.c b/windows/win.c
index c251cba..5563a76 100644
--- a/windows/win.c
+++ b/windows/win.c
@@ -743,7 +743,11 @@
if (!(wndPtr->flags & WIN_NEED_SIZE))
{
/* send it anyway */
-
+ if (((wndPtr->rectClient.right-wndPtr->rectClient.left) <0)
+ ||((wndPtr->rectClient.bottom-wndPtr->rectClient.top)<0))
+ WARN(win,"sending bogus WM_SIZE message 0x%08lx\n",
+ MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
+ wndPtr->rectClient.bottom-wndPtr->rectClient.top));
SendMessage32A( hwnd, WM_SIZE, SIZE_RESTORED,
MAKELONG(wndPtr->rectClient.right-wndPtr->rectClient.left,
wndPtr->rectClient.bottom-wndPtr->rectClient.top));
@@ -1408,7 +1412,8 @@
if (HIWORD(wndPtr->wIDmenu))
fprintf(stderr,"GetWindowWord32(GWW_ID) discards high bits of 0x%08x!\n",wndPtr->wIDmenu);
return (WORD)wndPtr->wIDmenu;
- case GWW_HWNDPARENT: return wndPtr->parent ? wndPtr->parent->hwndSelf : 0;
+ case GWW_HWNDPARENT: return wndPtr->parent ?
+ wndPtr->parent->hwndSelf : wndPtr->owner->hwndSelf;
case GWW_HINSTANCE:
if (HIWORD(wndPtr->hInstance))
fprintf(stderr,"GetWindowWord32(GWW_HINSTANCE) discards high bits of 0x%08x!\n",wndPtr->hInstance);
diff --git a/windows/winpos.c b/windows/winpos.c
index e992acc..516f6e8 100644
--- a/windows/winpos.c
+++ b/windows/winpos.c
@@ -238,6 +238,41 @@
/***********************************************************************
+ * GetWindowRgn32
+ */
+BOOL32 WINAPI GetWindowRgn32 ( HWND32 hwnd, HRGN32 hrgn )
+
+{
+ RECT32 rect;
+ WND * wndPtr = WIN_FindWndPtr( hwnd );
+ if (!wndPtr) return (ERROR);
+
+ FIXME (win, "GetWindowRgn32: doesn't really do regions\n");
+
+ memset (&rect, 0, sizeof(rect));
+
+ GetWindowRect32 ( hwnd, &rect );
+
+ FIXME (win, "Check whether a valid region here\n");
+
+ SetRectRgn32 ( hrgn, rect.left, rect.top, rect.right, rect.bottom );
+
+ return (SIMPLEREGION);
+}
+
+/***********************************************************************
+ * SetWindowRgn32
+ */
+BOOL32 WINAPI SetWindowRgn32 ( HWND32 hwnd, HRGN32 hrgn,BOOL32 bRedraw)
+
+{
+
+ FIXME (win, "SetWindowRgn32: stub\n");
+ return TRUE;
+}
+
+
+/***********************************************************************
* GetClientRect16 (USER.33)
*/
void WINAPI GetClientRect16( HWND16 hwnd, LPRECT16 rect )
diff --git a/windows/winproc.c b/windows/winproc.c
index 66df775..517272b 100644
--- a/windows/winproc.c
+++ b/windows/winproc.c
@@ -251,7 +251,9 @@
if (((WINDOWPROC *)proc)->type == WIN_PROC_16)
return (WNDPROC16)&((WINDOWPROC *)proc)->thunk;
else
- return (WNDPROC16)&((WINDOWPROC *)proc)->jmp;
+ /* return (WNDPROC16)&((WINDOWPROC *)proc)->jmp; */
+ /* Some Win16 programs want to get back the proc they set */
+ return (WNDPROC16)((WINDOWPROC *)proc)->thunk.t_from16.proc;
}
}