From 7e6ae4ba5eaae3cf2df509b56f6314c0103c49a9 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Sun, 8 Dec 1996 19:25:27 +0000 Subject: [PATCH] Release 961208 Sun Dec 8 14:51:57 1996 Alexandre Julliard * [configure.in] Added check to see if the compiler supports building a DLL when the --with-dll option is used. * [controls/listbox.c] Don't send LBN_SELCHANGE too often. Added WM_CHARTOITEM support. * [Make.rules.in] [library/Makefile.in] Build winestub.o and link it with Winelib programs. * [objects/text.c] Added support for '&&' in DrawText(). * [tools/build.c] Added -o option. Sat Dec 7 12:07:07 1996 Andrew Lewycky * [win32/thread.c] GetCurrentThread(): return -2 (current thread pseudo-handle). GetCurrentThreadId(): return GetCurrentTask(). * [objects/font.c] [if1632/gdi32.spec] GetTextExtentPoint32{A,W}Buggy(): for future bug-compatibility. * [win32/findfile.c] FindClose(): ignore INVALID_HANDLE_VALUE (like Win95). * [windows/hook.c] [include/hook.h] [if1632/user.spec] [if1632/user32.spec] [windows/focus.c] [windows/message.c] [windows/nonclient.c] [windows/win.c] [windows/winpos.c] Hooks rewritten to support Win32. * [misc/winsock.c] WINSOCK_select(): need to put sockets with errors into exceptfds. WINSOCK_socket(): fix error return. * [windows/win.c] SetWindowWord(): call SetParent on GWW_HWNDPARENT. Wed Dec 4 22:03:05 1996 Andrew Taylor * [files/dos_fs.c] Check if buf is NULL before copying string in GetFullPathName32A(). Wed Dec 4 21:40:59 1996 Robert Pouliot * [graphics/wing.c] [if1632/wing.spec] Implemented many WinG functions, but some don't seem to work correctly (probably due to the one not done). Wed Dec 4 03:38:25 1996 Lee Jaekil * [misc/main.c] Implemented a few more of the SystemParametersInfo() cases. Sun Dec 1 22:30:00 1996 Alex Korobka * [controls/button.c] Improved focus rectangle painting. * [windows/dialog.c] [windows/defdlg.c] Fixed IE3.0 problems with DWL_MSGRESULT. Sun Dec 1 20:49:32 1996 Albrecht Kleine * [files/profile.c] Changed error handling in PROFILE_SetString(). --- ANNOUNCE | 18 +- BUGS | 15 +- ChangeLog | 73 +++ Make.rules.in | 28 +- configure | 368 +++++++------ configure.in | 22 +- controls/button.c | 14 +- controls/listbox.c | 70 ++- debugger/break.c | 4 +- files/dos_fs.c | 11 +- files/profile.c | 17 +- graphics/Makefile.in | 4 +- graphics/wing.c | 94 +++- if1632/Makefile.in | 41 +- if1632/gdi.spec | 4 +- if1632/gdi32.spec | 10 +- if1632/user.spec | 6 +- if1632/user32.spec | 12 +- if1632/wing.spec | 21 +- include/dialog.h | 15 +- include/hook.h | 21 +- include/windows.h | 24 +- include/winsock.h | 6 +- library/Makefile.in | 20 +- library/winestub.c | 48 +- library/winmain.c | 41 -- loader/main.c | 9 +- loader/task.c | 2 +- misc/main.c | 77 ++- misc/winsock.c | 94 +++- objects/dib.c | 34 +- objects/font.c | 32 +- objects/metafile.c | 18 +- objects/text.c | 25 +- rc/winerc.c | 8 +- tools/Makefile.in | 7 +- tools/build.c | 1206 +++++++++++++++++++++++------------------- tools/fnt2bdf.c | 584 ++++++++++++++++++++ tools/fnt2bdf.h | 74 +++ win32/code_page.c | 4 +- win32/findfile.c | 9 +- win32/newfns.c | 26 - win32/thread.c | 9 +- windows/defdlg.c | 24 +- windows/dialog.c | 9 +- windows/event.c | 2 + windows/focus.c | 6 +- windows/hook.c | 1172 ++++++++++++++++++++++++++++++++++++---- windows/message.c | 111 ++-- windows/nonclient.c | 6 +- windows/win.c | 47 +- windows/winpos.c | 12 +- 52 files changed, 3330 insertions(+), 1284 deletions(-) delete mode 100644 library/winmain.c create mode 100644 tools/fnt2bdf.c create mode 100644 tools/fnt2bdf.h diff --git a/ANNOUNCE b/ANNOUNCE index 38e3e596b2b..a1d89785b69 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -1,15 +1,13 @@ -This is release 961201 of Wine, the MS Windows emulator. This is still a +This is release 961208 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-961201: (see ChangeLog for details) - - Better Winsock. - - Rewritten listboxes. - - Windows 3.1 registry loader. - - Improved keyboard support. +WHAT'S NEW with Wine-961208: (see ChangeLog for details) + - Win32 hooks. + - fnt2bdf font conversion tool. - Lots of bug fixes. See the README file in the distribution for installation instructions. @@ -18,10 +16,10 @@ Because of lags created by using mirror, this message may reach you before 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-961201.tar.gz - ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-961201.tar.gz - ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-961201.tar.gz - ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-961201.tar.gz + ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-961208.tar.gz + ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-961208.tar.gz + ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-961208.tar.gz + ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-961208.tar.gz It should also be available from any site that mirrors tsx-11 or sunsite. diff --git a/BUGS b/BUGS index 4785851f70d..46fba4c2877 100644 --- a/BUGS +++ b/BUGS @@ -5,18 +5,13 @@ done something for one of the problems. You are encouraged to add new entries and, more importantly, remove those for the bugs you fixed ;-) ------------------------------------------------------------ -As of Nov 8 1996 - +As of Dec 1 1996 - General: * Combobox code is very inadequate (no notification messages, dropdown listboxes often stay visible, etc... ). - * Multicolumn and/or LBS_EXTENDEDSEL style listboxes are still - screwed up. [julliard@lrc.epfl.ch] - - * Winsock asynchronous functions do not work. - * Font mapping is too generic. No soft font loading, no rotated text support. [alex@amadeus.pharm.sunysb.edu] @@ -31,12 +26,16 @@ General: Miscellaneous: + * Simple OLE actions were working in October release, got + broken in November (in Winword "Insert Object" now results in + segfault right after the call to LoadModule()). + * Write and other applications have problems with displaying partially + obscured bitmaps. + * Asynchronous Winsock services sometimes produce zombie processes. * AllocCSToDSAlias() shouldn't alloc alias for the same segment multiple times. * ScrollWindowEx() is outdated. * HCBT_CLICKSKIPPED/HCBT_KEYSKIPPED hook actions are not implemented. - * Write sometimes segfaults in StretchDIBits() (when inside BITBLT_GetRow) - when only lower part of the resulting image is visible. Where to look in source files: diff --git a/ChangeLog b/ChangeLog index 0ef8d3345c3..fbff2bff75e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,76 @@ +---------------------------------------------------------------------- +Sun Dec 8 14:51:57 1996 Alexandre Julliard + + * [configure.in] + Added check to see if the compiler supports building a DLL when + the --with-dll option is used. + + * [controls/listbox.c] + Don't send LBN_SELCHANGE too often. + Added WM_CHARTOITEM support. + + * [Make.rules.in] [library/Makefile.in] + Build winestub.o and link it with Winelib programs. + + * [objects/text.c] + Added support for '&&' in DrawText(). + + * [tools/build.c] + Added -o option. + +Sat Dec 7 12:07:07 1996 Andrew Lewycky + + * [win32/thread.c] + GetCurrentThread(): return -2 (current thread pseudo-handle). + GetCurrentThreadId(): return GetCurrentTask(). + + * [objects/font.c] [if1632/gdi32.spec] + GetTextExtentPoint32{A,W}Buggy(): for future bug-compatibility. + + * [win32/findfile.c] + FindClose(): ignore INVALID_HANDLE_VALUE (like Win95). + + * [windows/hook.c] [include/hook.h] [if1632/user.spec] + [if1632/user32.spec] [windows/focus.c] [windows/message.c] + [windows/nonclient.c] [windows/win.c] [windows/winpos.c] + Hooks rewritten to support Win32. + + * [misc/winsock.c] + WINSOCK_select(): need to put sockets with errors into exceptfds. + WINSOCK_socket(): fix error return. + + * [windows/win.c] + SetWindowWord(): call SetParent on GWW_HWNDPARENT. + +Wed Dec 4 22:03:05 1996 Andrew Taylor + + * [files/dos_fs.c] + Check if buf is NULL before copying string in GetFullPathName32A(). + +Wed Dec 4 21:40:59 1996 Robert Pouliot + + * [graphics/wing.c] [if1632/wing.spec] + Implemented many WinG functions, but some don't seem to + work correctly (probably due to the one not done). + +Wed Dec 4 03:38:25 1996 Lee Jaekil + + * [misc/main.c] + Implemented a few more of the SystemParametersInfo() cases. + +Sun Dec 1 22:30:00 1996 Alex Korobka + + * [controls/button.c] + Improved focus rectangle painting. + + * [windows/dialog.c] [windows/defdlg.c] + Fixed IE3.0 problems with DWL_MSGRESULT. + +Sun Dec 1 20:49:32 1996 Albrecht Kleine + + * [files/profile.c] + Changed error handling in PROFILE_SetString(). + ---------------------------------------------------------------------- Sat Nov 30 19:21:17 1996 Alexandre Julliard diff --git a/Make.rules.in b/Make.rules.in index 2599eda3d2f..88b5f791fba 100644 --- a/Make.rules.in +++ b/Make.rules.in @@ -1,14 +1,15 @@ # Global rules shared by all makefiles -*-Makefile-*- # # Each individual makefile should define the following variables: -# TOPSRCDIR : top-level source directory -# TOPOBJDIR : top-level object directory -# SRCDIR : source directory for this module -# MODULE : name of the module being built -# C_SRCS : C sources for the module -# GEN_C_SRCS : generated C sources (optional) -# ASM_SRCS : assembly sources (optional) -# EXTRA_OBJS : extra object files (optional) +# TOPSRCDIR : top-level source directory +# TOPOBJDIR : top-level object directory +# SRCDIR : source directory for this module +# MODULE : name of the module being built +# C_SRCS : C sources for the module +# GEN_C_SRCS : generated C sources (optional) +# ASM_SRCS : assembly sources (optional) +# GEN_ASM_SRCS : generated assembly sources (optional) +# EXTRA_OBJS : extra object files (optional) # First some useful definitions @@ -21,7 +22,7 @@ X_CFLAGS = @X_CFLAGS@ X_LIBS = @X_LIBS@ XPM_LIB = -lXpm XLIB = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@ -WINELIB = -L$(TOPOBJDIR) -lwine +WINELIB = $(WINESTUB) $(TOPOBJDIR)/@MAIN_TARGET@ LDLIBS = @LDLIBS@ YACC = @YACC@ LEX = @LEX@ @@ -33,10 +34,12 @@ RM = rm -f BUILD = $(TOPOBJDIR)/tools/build MAKEDEP = $(TOPOBJDIR)/tools/makedep WINERC = $(TOPOBJDIR)/rc/winerc +WINESTUB = $(TOPOBJDIR)/library/winestub.o SUBMAKE = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(CFLAGS)' 'OPTIONS=$(OPTIONS)' @SET_MAKE@ -OBJS = $(GEN_C_SRCS:.c=.o) $(C_SRCS:.c=.o) $(ASM_SRCS:.S=.o) $(EXTRA_OBJS) +OBJS = $(GEN_C_SRCS:.c=.o) $(C_SRCS:.c=.o) \ + $(GEN_ASM_SRCS:.s=.o) $(ASM_SRCS:.S=.o) $(EXTRA_OBJS) # Implicit rules @@ -45,6 +48,9 @@ OBJS = $(GEN_C_SRCS:.c=.o) $(C_SRCS:.c=.o) $(ASM_SRCS:.S=.o) $(EXTRA_OBJS) .c.o: $(CC) -c $(ALLCFLAGS) -o $*.o $< +.s.o: + $(CC) -c -o $*.o $< + .S.o: $(CC) -c -o $*.o $< @@ -85,7 +91,7 @@ depend:: $(MAKEDEP) $(C_SRCS) $(GEN_C_SRCS) $(MAKEDEP) $(DIVINCL) -C. $(GEN_C_SRCS) -C$(SRCDIR) $(C_SRCS) clean:: - $(RM) *.o \#*\# *~ *.bak *.orig *.rej *.flc winerctmp.c $(GEN_C_SRCS) $(GEN_C_SRCS:.c=.h) $(PROGRAMS) + $(RM) *.o \#*\# *~ *.bak *.orig *.rej *.flc winerctmp.c $(GEN_C_SRCS) $(GEN_C_SRCS:.c=.h) $(GEN_ASM_SRCS) $(PROGRAMS) dummy: diff --git a/configure b/configure index e6d67cf80e9..b7d61639c92 100755 --- a/configure +++ b/configure @@ -2,7 +2,7 @@ # From configure.in configure.in 1.00 # Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.11 +# Generated automatically using autoconf version 2.12 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation @@ -341,7 +341,7 @@ EOF verbose=yes ;; -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.11" + echo "configure generated by autoconf version 2.12" exit 0 ;; -with-* | --with-*) @@ -443,11 +443,14 @@ do done # NLS nuisances. -# Only set LANG and LC_ALL to C if already set. -# These must not be set unconditionally because not all systems understand -# e.g. LANG=C (notably SCO). -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h @@ -509,6 +512,7 @@ ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. @@ -560,7 +564,7 @@ fi # Check whether --with-dll or --without-dll was given. if test "${with_dll+set}" = set; then withval="$with_dll" - OPTIONS="-DWINELIB -DWINELIBDLL" MAIN_TARGET="libwine.so.1.0" CFLAGS="$CFLAGS -fPIC" + OPTIONS="-DWINELIB" MAIN_TARGET="libwine.so.1.0" fi @@ -576,7 +580,7 @@ fi echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:580: checking whether ${MAKE-make} sets \${MAKE}" >&5 +echo "configure:584: checking whether ${MAKE-make} sets \${MAKE}" >&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -605,7 +609,7 @@ fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:609: checking for $ac_word" >&5 +echo "configure:613: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -634,7 +638,7 @@ if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:638: checking for $ac_word" >&5 +echo "configure:642: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -682,41 +686,46 @@ fi fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:686: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 +echo "configure:690: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then - rm -rf conftest* +if { (eval echo configure:704: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi else echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 - rm -rf conftest* ac_cv_prog_cc_works=no fi -rm -f conftest* - +rm -fr conftest* echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: Installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:724: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:720: checking whether we are using GNU C" >&5 +echo "configure:729: checking whether we are using GNU C" >&5 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -725,7 +734,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:729: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:738: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -740,24 +749,24 @@ if test $ac_cv_prog_gcc = yes; then ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:744: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc_g'+set}'`\" = set"; then +echo "configure:753: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_gcc_g=yes + ac_cv_prog_cc_g=yes else - ac_cv_prog_gcc_g=no + ac_cv_prog_cc_g=no fi rm -f conftest* fi -echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6 +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 if test "$ac_test_CFLAGS" = set; then CFLAGS="$ac_save_CFLAGS" - elif test $ac_cv_prog_gcc_g = yes; then + elif test $ac_cv_prog_cc_g = yes; then CFLAGS="-g -O2" else CFLAGS="-O2" @@ -768,7 +777,7 @@ else fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:772: checking how to run the C preprocessor" >&5 +echo "configure:781: checking how to run the C preprocessor" >&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -783,13 +792,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:793: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:802: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -800,13 +809,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:810: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:819: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : @@ -833,7 +842,7 @@ echo "$ac_t""$CPP" 1>&6 # Uses ac_ vars as temps to allow command line to override cache and checks. # --without-x overrides everything else, but does not touch the cache. echo $ac_n "checking for X""... $ac_c" 1>&6 -echo "configure:837: checking for X" >&5 +echo "configure:846: checking for X" >&5 # Check whether --with-x or --without-x was given. if test "${with_x+set}" = set; then @@ -895,12 +904,12 @@ if test "$ac_x_includes" = NO; then # First, try using that file with no special directory specified. cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:904: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:913: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -969,14 +978,14 @@ if test "$ac_x_libraries" = NO; then ac_save_LIBS="$LIBS" LIBS="-l$x_direct_test_library $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:989: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* LIBS="$ac_save_LIBS" # We can link X programs with no special library path. @@ -1034,7 +1043,6 @@ do done fi rm -f conftest* - fi # $ac_x_libraries = NO if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then @@ -1083,17 +1091,17 @@ else case "`(uname -sr) 2>/dev/null`" in "SunOS 5"*) echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6 -echo "configure:1087: checking whether -R must be followed by a space" >&5 +echo "configure:1095: checking whether -R must be followed by a space" >&5 ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1105: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* ac_R_nospace=yes else @@ -1103,21 +1111,20 @@ else ac_R_nospace=no fi rm -f conftest* - if test $ac_R_nospace = yes; then echo "$ac_t""no" 1>&6 X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1128: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* ac_R_space=yes else @@ -1127,7 +1134,6 @@ else ac_R_space=no fi rm -f conftest* - if test $ac_R_space = yes; then echo "$ac_t""yes" 1>&6 X_LIBS="$X_LIBS -R $x_libraries" @@ -1150,7 +1156,7 @@ rm -f conftest* # libraries were built with DECnet support. And karl@cs.umb.edu says # the Alpha needs dnet_stub (dnet does not exist). echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6 -echo "configure:1154: checking for dnet_ntoa in -ldnet" >&5 +echo "configure:1160: checking for dnet_ntoa in -ldnet" >&5 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1158,7 +1164,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldnet $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1179: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1191,7 +1197,7 @@ fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6 -echo "configure:1195: checking for dnet_ntoa in -ldnet_stub" >&5 +echo "configure:1201: checking for dnet_ntoa in -ldnet_stub" >&5 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1199,7 +1205,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldnet_stub $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1220: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1239,12 +1245,12 @@ fi # The nsl library prevents programs from opening the X display # on Irix 5.2, according to dickey@clark.net. echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 -echo "configure:1243: checking for gethostbyname" >&5 +echo "configure:1249: checking for gethostbyname" >&5 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1277: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_gethostbyname=yes" else @@ -1277,8 +1283,8 @@ else eval "ac_cv_func_gethostbyname=no" fi rm -f conftest* - fi + if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then echo "$ac_t""yes" 1>&6 : @@ -1288,7 +1294,7 @@ fi if test $ac_cv_func_gethostbyname = no; then echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 -echo "configure:1292: checking for gethostbyname in -lnsl" >&5 +echo "configure:1298: checking for gethostbyname in -lnsl" >&5 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1296,7 +1302,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1317: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1337,12 +1343,12 @@ fi # -lsocket must be given before -lnsl if both are needed. # We assume that if connect needs -lnsl, so does gethostbyname. echo $ac_n "checking for connect""... $ac_c" 1>&6 -echo "configure:1341: checking for connect" >&5 +echo "configure:1347: checking for connect" >&5 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1375: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_connect=yes" else @@ -1375,8 +1381,8 @@ else eval "ac_cv_func_connect=no" fi rm -f conftest* - fi + if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then echo "$ac_t""yes" 1>&6 : @@ -1386,7 +1392,7 @@ fi if test $ac_cv_func_connect = no; then echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 -echo "configure:1390: checking for connect in -lsocket" >&5 +echo "configure:1396: checking for connect in -lsocket" >&5 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1394,7 +1400,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1415: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1429,12 +1435,12 @@ fi # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. echo $ac_n "checking for remove""... $ac_c" 1>&6 -echo "configure:1433: checking for remove" >&5 +echo "configure:1439: checking for remove" >&5 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1467: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_remove=yes" else @@ -1467,8 +1473,8 @@ else eval "ac_cv_func_remove=no" fi rm -f conftest* - fi + if eval "test \"`echo '$ac_cv_func_'remove`\" = yes"; then echo "$ac_t""yes" 1>&6 : @@ -1478,7 +1484,7 @@ fi if test $ac_cv_func_remove = no; then echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 -echo "configure:1482: checking for remove in -lposix" >&5 +echo "configure:1488: checking for remove in -lposix" >&5 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1486,7 +1492,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lposix $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1507: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1521,12 +1527,12 @@ fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. echo $ac_n "checking for shmat""... $ac_c" 1>&6 -echo "configure:1525: checking for shmat" >&5 +echo "configure:1531: checking for shmat" >&5 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1559: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_shmat=yes" else @@ -1559,8 +1565,8 @@ else eval "ac_cv_func_shmat=no" fi rm -f conftest* - fi + if eval "test \"`echo '$ac_cv_func_'shmat`\" = yes"; then echo "$ac_t""yes" 1>&6 : @@ -1570,7 +1576,7 @@ fi if test $ac_cv_func_shmat = no; then echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 -echo "configure:1574: checking for shmat in -lipc" >&5 +echo "configure:1580: checking for shmat in -lipc" >&5 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1578,7 +1584,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lipc $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1599: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1622,7 +1628,7 @@ fi # libraries we check for below, so use a different variable. # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 -echo "configure:1626: checking for IceConnectionNumber in -lICE" >&5 +echo "configure:1632: checking for IceConnectionNumber in -lICE" >&5 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1630,7 +1636,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lICE $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1651: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1670,7 +1676,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1674: checking for $ac_word" >&5 +echo "configure:1680: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1702,7 +1708,7 @@ test -n "$YACC" || YACC="yacc" # Extract the first word of "flex", so it can be a program name with args. set dummy flex; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1706: checking for $ac_word" >&5 +echo "configure:1712: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1735,7 +1741,7 @@ then *) ac_lib=l ;; esac echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6 -echo "configure:1739: checking for yywrap in -l$ac_lib" >&5 +echo "configure:1745: checking for yywrap in -l$ac_lib" >&5 ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1743,7 +1749,7 @@ else ac_save_LIBS="$LIBS" LIBS="-l$ac_lib $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1764: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1779,7 +1785,7 @@ fi # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1783: checking for $ac_word" >&5 +echo "configure:1789: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1816,12 +1822,12 @@ fi # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:1820: checking for a BSD compatible install" >&5 +echo "configure:1826: checking for a BSD compatible install" >&5 if test -z "$INSTALL"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" + IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do # Account for people who put trailing slashes in PATH elements. case "$ac_dir/" in @@ -1844,7 +1850,7 @@ else ;; esac done - IFS="$ac_save_ifs" + IFS="$ac_save_IFS" fi if test "${ac_cv_path_install+set}" = set; then @@ -1866,7 +1872,7 @@ test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking for i386_set_ldt in -li386""... $ac_c" 1>&6 -echo "configure:1870: checking for i386_set_ldt in -li386" >&5 +echo "configure:1876: checking for i386_set_ldt in -li386" >&5 ac_lib_var=`echo i386'_'i386_set_ldt | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1874,7 +1880,7 @@ else ac_save_LIBS="$LIBS" LIBS="-li386 $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1895: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1910,39 +1916,8 @@ fi if test "x${GCC}" = "xyes" then CFLAGS="$CFLAGS -Wall" - # If we cannot run a trivial program, we are probably using a cross compiler. -echo $ac_n "checking whether using a cross-compiler""... $ac_c" 1>&6 -echo "configure:1916: checking whether using a cross-compiler" >&5 -if eval "test \"`echo '$''{'ac_cv_c_cross'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test "$cross_compiling" = yes; then - ac_cv_c_cross=yes -else - cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } -if test -s conftest && (./conftest; exit) 2>/dev/null; then - ac_cv_c_cross=no -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_c_cross=yes -fi -rm -fr conftest* -fi - -fi - -echo "$ac_t""$ac_cv_c_cross" 1>&6 -cross_compiling=$ac_cv_c_cross - echo $ac_n "checking "for gcc strength-reduce bug"""... $ac_c" 1>&6 -echo "configure:1946: checking "for gcc strength-reduce bug"" >&5 +echo "configure:1921: checking "for gcc strength-reduce bug"" >&5 if eval "test \"`echo '$''{'ac_cv_c_gcc_strength_bug'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1950,7 +1925,7 @@ else ac_cv_c_gcc_strength_bug="yes" else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } -if test -s conftest && (./conftest; exit) 2>/dev/null; then +if { (eval echo configure:1940: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then ac_cv_c_gcc_strength_bug="no" else echo "configure: failed program was:" >&5 @@ -1984,7 +1959,7 @@ fi echo $ac_n "checking "whether external symbols need an underscore prefix"""... $ac_c" 1>&6 -echo "configure:1988: checking "whether external symbols need an underscore prefix"" >&5 +echo "configure:1963: checking "whether external symbols need an underscore prefix"" >&5 if eval "test \"`echo '$''{'ac_cv_c_extern_prefix'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1996,14 +1971,14 @@ _ac_test: .long 0 EOF cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1982: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* ac_cv_c_extern_prefix="yes" else @@ -2013,7 +1988,6 @@ else ac_cv_c_extern_prefix="no" fi rm -f conftest* - LIBS=$saved_libs fi @@ -2027,15 +2001,56 @@ EOF fi +if test "$MAIN_TARGET" = "libwine.so.1.0" +then + echo $ac_n "checking "whether we can build a dll"""... $ac_c" 1>&6 +echo "configure:2008: checking "whether we can build a dll"" >&5 +if eval "test \"`echo '$''{'ac_cv_c_dll'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + saved_cflags=$CFLAGS + CFLAGS="$CFLAGS -fPIC -shared -Wl,-soname,conftest.so.1.0" + cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then + rm -rf conftest* + ac_cv_c_dll="yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_c_dll="no" +fi +rm -f conftest* + CFLAGS=$saved_cflags + +fi + +echo "$ac_t""$ac_cv_c_dll" 1>&6 + if test "$ac_cv_c_dll" = "yes" + then + CFLAGS="$CFLAGS -fPIC" + else + MAIN_TARGET="libwine.a" + fi +fi + + for ac_func in memmove tcgetattr usleep do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:2034: checking for $ac_func" >&5 +echo "configure:2049: checking for $ac_func" >&5 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2077: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else @@ -2068,8 +2083,8 @@ else eval "ac_cv_func_$ac_func=no" fi rm -f conftest* - fi + if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` @@ -2083,12 +2098,12 @@ fi done echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6 -echo "configure:2087: checking whether stat file-mode macros are broken" >&5 +echo "configure:2102: checking whether stat file-mode macros are broken" >&5 if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2139,12 +2154,12 @@ EOF fi echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:2143: checking for working const" >&5 +echo "configure:2158: checking for working const" >&5 if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2212: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_c_const=yes else @@ -2203,7 +2218,6 @@ else ac_cv_c_const=no fi rm -f conftest* - fi echo "$ac_t""$ac_cv_c_const" 1>&6 @@ -2215,12 +2229,12 @@ EOF fi echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:2219: checking for ANSI C header files" >&5 +echo "configure:2233: checking for ANSI C header files" >&5 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include @@ -2228,7 +2242,7 @@ else #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2232: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2246: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -2245,7 +2259,7 @@ rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -2263,7 +2277,7 @@ fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF @@ -2284,7 +2298,7 @@ if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') @@ -2295,8 +2309,8 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF -{ (eval echo configure:2299: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } -if test -s conftest && (./conftest; exit) 2>/dev/null; then +if { (eval echo configure:2313: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then : else echo "configure: failed program was:" >&5 @@ -2319,12 +2333,12 @@ EOF fi echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:2323: checking for size_t" >&5 +echo "configure:2337: checking for size_t" >&5 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS @@ -2373,12 +2387,25 @@ cat > confcache <<\EOF # --recheck option to rerun configure. # EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. -# HP-UX 10.01 sh prints single quotes around any value that contains spaces. (set) 2>&1 | -sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)='*\([^']*\)'*/\1=\${\1='\2'}/p"\ - >> confcache + case `(ac_space=' '; set) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache if cmp -s $cache_file confcache; then : else @@ -2433,7 +2460,7 @@ do echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.11" + echo "$CONFIG_STATUS generated by autoconf version 2.12" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; @@ -2590,9 +2617,9 @@ windows/Makefile "} EOF cat >> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile]", defaulting infile="outfile.in". + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac @@ -2634,12 +2661,14 @@ for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # $configure_input" ;; *) ac_comsub= ;; esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g s%@INSTALL@%$INSTALL%g -" $ac_given_srcdir/$ac_file_in | eval "$ac_sed_cmds" > $ac_file +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file fi; done rm -f conftest.s* @@ -2662,7 +2691,7 @@ ac_eB='$%\1#\2define\3' ac_eC=' ' ac_eD='%g' -if test -z "$CONFIG_HEADERS"; then +if test "${CONFIG_HEADERS+set}" != set; then EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF fi for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then - # Support "outfile[:infile]", defaulting infile="outfile.in". + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac @@ -2680,7 +2709,8 @@ for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then echo creating $ac_file rm -f conftest.frag conftest.in conftest.out - cp $ac_given_srcdir/$ac_file_in conftest.in + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in EOF @@ -2749,7 +2779,11 @@ cat >> $CONFIG_STATUS <<\EOF fi fi; done +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF exit 0 EOF diff --git a/configure.in b/configure.in index 8e49105d0f5..273f8422e18 100644 --- a/configure.in +++ b/configure.in @@ -18,7 +18,7 @@ AC_ARG_WITH(library, AC_ARG_WITH(dll, [ --with-dll build Wine as a DLL instead of an emulator], -[OPTIONS="-DWINELIB -DWINELIBDLL" MAIN_TARGET="libwine.so.1.0" CFLAGS="$CFLAGS -fPIC"]) +[OPTIONS="-DWINELIB" MAIN_TARGET="libwine.so.1.0"]) AC_ARG_WITH(ipc, [ --with-ipc use inter-process communication for DDE], @@ -45,7 +45,6 @@ dnl **** Check for gcc strength-reduce bug **** if test "x${GCC}" = "xyes" then CFLAGS="$CFLAGS -Wall" - AC_C_CROSS AC_CACHE_CHECK( "for gcc strength-reduce bug", ac_cv_c_gcc_strength_bug, AC_TRY_RUN([ int main(void) { @@ -83,6 +82,25 @@ then AC_DEFINE(NEED_UNDERSCORE_PREFIX) fi +dnl **** Check for working dll **** + +if test "$MAIN_TARGET" = "libwine.so.1.0" +then + AC_CACHE_CHECK("whether we can build a dll", + ac_cv_c_dll, + [saved_cflags=$CFLAGS + CFLAGS="$CFLAGS -fPIC -shared -Wl,-soname,conftest.so.1.0" + AC_TRY_LINK(,[return 1],ac_cv_c_dll="yes",ac_cv_c_dll="no") + CFLAGS=$saved_cflags + ]) + if test "$ac_cv_c_dll" = "yes" + then + CFLAGS="$CFLAGS -fPIC" + else + MAIN_TARGET="libwine.a" + fi +fi + dnl **** Check for functions and header files **** AC_CHECK_FUNCS(memmove tcgetattr usleep) diff --git a/controls/button.c b/controls/button.c index 1c4df7e5bbf..e53b4c0013b 100644 --- a/controls/button.c +++ b/controls/button.c @@ -427,11 +427,15 @@ static void CB_Paint( WND *wndPtr, HDC32 hDC, WORD action ) { /* again, this is what CTL3D expects */ - DWORD tm = (textlen) ? GetTextExtent( hDC, wndPtr->text, textlen) : 0x00020002; - delta = (rtext.bottom - rtext.top - HIWORD(tm) - 1)/2; - - rbox.bottom = (rbox.top = rtext.top + delta - 1) + HIWORD(tm) + 2; - rbox.right = (rbox.left = --rtext.left) + LOWORD(tm) + 2; + SetRectEmpty16(&rbox); + if( textlen ) + DrawText16( hDC, wndPtr->text, textlen, &rbox, + DT_SINGLELINE | DT_CALCRECT ); + textlen = rbox.bottom - rbox.top; + delta = ((rtext.bottom - rtext.top) - textlen)/2; + rbox.bottom = (rbox.top = rtext.top + delta - 1) + textlen + 2; + textlen = rbox.right - rbox.left; + rbox.right = (rbox.left += --rtext.left) + textlen + 2; IntersectRect16(&rbox, &rbox, &rtext); DrawFocusRect16( hDC, &rbox ); } diff --git a/controls/listbox.c b/controls/listbox.c index bad86a74c86..a39048bd8c6 100644 --- a/controls/listbox.c +++ b/controls/listbox.c @@ -1130,8 +1130,6 @@ static LRESULT LISTBOX_SelectItemRange( WND *wnd, LB_DESCR *descr, INT32 first, LISTBOX_RepaintItem( wnd, descr, i, ODA_SELECT ); } } - if (descr->style & LBS_NOTIFY) - SEND_NOTIFICATION( wnd, descr, LBN_SELCHANGE ); return LB_OKAY; } @@ -1180,7 +1178,6 @@ static LRESULT LISTBOX_SetSelection( WND *wnd, LB_DESCR *descr, INT32 index, if (oldsel != -1) descr->items[oldsel].selected = FALSE; if (index != -1) descr->items[index].selected = TRUE; descr->selected_item = index; -/* FIXME if (index != -1) LISTBOX_MakeItemVisible( wnd, descr, index );*/ if (oldsel != -1) LISTBOX_RepaintItem( wnd, descr, oldsel, ODA_SELECT); if (index != -1) LISTBOX_RepaintItem( wnd, descr, index, ODA_SELECT ); if (send_notify) SEND_NOTIFICATION( wnd, descr, @@ -1214,8 +1211,7 @@ static void LISTBOX_MoveCaret( WND *wnd, LB_DESCR *descr, INT32 index, else if (!(descr->style & LBS_MULTIPLESEL) && (descr->selected_item != -1)) { /* Set selection to new caret item */ - LISTBOX_SetSelection( wnd, descr, index, TRUE, - (descr->style & LBS_NOTIFY) != 0 ); + LISTBOX_SetSelection( wnd, descr, index, TRUE, FALSE ); } } @@ -1683,8 +1679,7 @@ static LRESULT LISTBOX_HandleLButtonDown( WND *wnd, LB_DESCR *descr, { LISTBOX_SetCaretIndex( wnd, descr, index, FALSE ); LISTBOX_SetSelection( wnd, descr, index, - !descr->items[index].selected, - (descr->style & LBS_NOTIFY) != 0 ); + !descr->items[index].selected, FALSE ); } else LISTBOX_MoveCaret( wnd, descr, index, FALSE ); } @@ -1693,8 +1688,7 @@ static LRESULT LISTBOX_HandleLButtonDown( WND *wnd, LB_DESCR *descr, LISTBOX_MoveCaret( wnd, descr, index, FALSE ); LISTBOX_SetSelection( wnd, descr, index, (!(descr->style & LBS_MULTIPLESEL) || - !descr->items[index].selected), - (descr->style & LBS_NOTIFY) != 0 ); + !descr->items[index].selected), FALSE ); } } SetFocus32( wnd->hwndSelf ); @@ -1715,6 +1709,21 @@ static LRESULT LISTBOX_HandleLButtonDown( WND *wnd, LB_DESCR *descr, } +/*********************************************************************** + * LISTBOX_HandleLButtonUp + */ +static LRESULT LISTBOX_HandleLButtonUp( WND *wnd, LB_DESCR *descr ) +{ + if (LISTBOX_Timer != LB_TIMER_NONE) + KillSystemTimer32( wnd->hwndSelf, LB_TIMER_ID ); + LISTBOX_Timer = LB_TIMER_NONE; + if (GetCapture32() == wnd->hwndSelf) ReleaseCapture(); + if (descr->style & LBS_NOTIFY) + SEND_NOTIFICATION( wnd, descr, LBN_SELCHANGE ); + return 0; +} + + /*********************************************************************** * LISTBOX_HandleTimer * @@ -1883,16 +1892,13 @@ static LRESULT LISTBOX_HandleKeyDown( WND *wnd, LB_DESCR *descr, caret = descr->nb_items - 1; break; case VK_SPACE: - if (descr->style & LBS_EXTENDEDSEL) - { - if (!(GetKeyState(VK_SHIFT) & 0x8000)) - descr->anchor_item = descr->focus_item; - LISTBOX_MoveCaret( wnd, descr, descr->focus_item, TRUE ); - } + if (descr->style & LBS_EXTENDEDSEL) caret = descr->focus_item; else if (descr->style & LBS_MULTIPLESEL) + { LISTBOX_SetSelection( wnd, descr, descr->focus_item, !descr->items[descr->focus_item].selected, (descr->style & LBS_NOTIFY) != 0 ); + } break; } if (caret >= 0) @@ -1901,6 +1907,8 @@ static LRESULT LISTBOX_HandleKeyDown( WND *wnd, LB_DESCR *descr, !(GetKeyState( VK_SHIFT ) & 0x8000)) descr->anchor_item = caret; LISTBOX_MoveCaret( wnd, descr, caret, TRUE ); + if (descr->style & LBS_NOTIFY) + SEND_NOTIFICATION( wnd, descr, LBN_SELCHANGE ); } return 0; } @@ -1912,11 +1920,24 @@ static LRESULT LISTBOX_HandleKeyDown( WND *wnd, LB_DESCR *descr, static LRESULT LISTBOX_HandleChar( WND *wnd, LB_DESCR *descr, WPARAM32 wParam ) { - INT32 index; + INT32 caret = -1; char str[2] = { wParam & 0xff, '\0' }; - index = LISTBOX_FindString( wnd, descr, descr->focus_item, str, FALSE ); - if (index != LB_ERR) LISTBOX_MoveCaret( wnd, descr, index, TRUE ); + if (descr->style & LBS_WANTKEYBOARDINPUT) + { + caret = SendMessage32A( descr->owner, WM_CHARTOITEM, + MAKEWPARAM(LOWORD(wParam), descr->focus_item), + wnd->hwndSelf ); + if (caret == -2) return 0; + } + if (caret == -1) + caret = LISTBOX_FindString( wnd, descr, descr->focus_item, str, FALSE); + if (caret != -1) + { + LISTBOX_MoveCaret( wnd, descr, caret, TRUE ); + if (descr->style & LBS_NOTIFY) + SEND_NOTIFICATION( wnd, descr, LBN_SELCHANGE ); + } return 0; } @@ -2159,8 +2180,7 @@ LRESULT ListBoxWndProc(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam) INT32 index = LISTBOX_FindString( wnd, descr, wParam, (LPCSTR)lParam, FALSE ); if (index == LB_ERR) return LB_ERR; - LISTBOX_SetSelection( wnd, descr, index, TRUE, - (descr->style & LBS_NOTIFY) != 0 ); + LISTBOX_SetSelection( wnd, descr, index, TRUE, FALSE ); return index; } @@ -2176,13 +2196,13 @@ LRESULT ListBoxWndProc(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam) lParam = (INT32)(INT16)lParam; /* fall through */ case LB_SETSEL32: - return LISTBOX_SetSelection( wnd, descr, lParam, wParam, - (descr->style & LBS_NOTIFY) != 0 ); + return LISTBOX_SetSelection( wnd, descr, lParam, wParam, FALSE ); case LB_SETCURSEL16: wParam = (INT32)(INT16)wParam; /* fall through */ case LB_SETCURSEL32: + if (wParam != -1) LISTBOX_MakeItemVisible( wnd, descr, wParam, TRUE ); return LISTBOX_SetSelection( wnd, descr, wParam, TRUE, FALSE ); case LB_GETSELCOUNT16: @@ -2344,11 +2364,7 @@ LRESULT ListBoxWndProc(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam) return 0; case WM_LBUTTONUP: - if (LISTBOX_Timer != LB_TIMER_NONE) - KillSystemTimer32( hwnd, LB_TIMER_ID ); - LISTBOX_Timer = LB_TIMER_NONE; - if (GetCapture32() == hwnd) ReleaseCapture(); - return 0; + return LISTBOX_HandleLButtonUp( wnd, descr ); case WM_KEYDOWN: return LISTBOX_HandleKeyDown( wnd, descr, wParam ); diff --git a/debugger/break.c b/debugger/break.c index 283d6faa358..7375a7544a0 100644 --- a/debugger/break.c +++ b/debugger/break.c @@ -137,7 +137,9 @@ void DEBUG_SetBreakpoints( BOOL32 set ) { if (breakpoints[i].in_use && breakpoints[i].enabled) { - if (DEBUG_IsBadWritePtr( &breakpoints[i].addr, 1 )) + /* Note: we check for read here, because if reading is allowed */ + /* writing permission will be forced in DEBUG_SetOpcode. */ + if (DEBUG_IsBadReadPtr( &breakpoints[i].addr, 1 )) { fprintf( stderr, "Invalid address for breakpoint %d, disabling it\n", i ); breakpoints[i].enabled = FALSE; diff --git a/files/dos_fs.c b/files/dos_fs.c index 77aa5ed2178..f07a117eae5 100644 --- a/files/dos_fs.c +++ b/files/dos_fs.c @@ -888,12 +888,15 @@ DWORD GetShortPathName32W( LPCWSTR longpath, LPWSTR shortpath, DWORD shortlen ) /*********************************************************************** * GetFullPathNameA (KERNEL32.272) */ -DWORD GetFullPathName32A( LPCSTR fn, DWORD buflen, LPSTR buf, LPSTR *lastpart) { +DWORD GetFullPathName32A( LPCSTR fn, DWORD buflen, LPSTR buf, LPSTR *lastpart) +{ dprintf_file(stddeb,"GetFullPathNameA(%s)\n",fn); /* FIXME */ - lstrcpyn32A(buf,fn,buflen); - if (lastpart) - *lastpart=strrchr(buf,'\\'); + if (buf) + { + lstrcpyn32A(buf,fn,buflen); + if (lastpart) *lastpart = strrchr(buf,'\\'); + } return strlen(fn); } diff --git a/files/profile.c b/files/profile.c index d1a8426ab60..8b6bf27d2ca 100644 --- a/files/profile.c +++ b/files/profile.c @@ -506,22 +506,21 @@ static INT32 PROFILE_GetString( LPCSTR section, LPCSTR key_name, static BOOL32 PROFILE_SetString( LPCSTR section_name, LPCSTR key_name, LPCSTR value ) { - BOOL32 ret; - if (!key_name) /* Delete a whole section */ { dprintf_profile(stddeb, "PROFILE_DeleteSection('%s')\n", section_name); - ret = PROFILE_DeleteSection( &CurProfile.section, section_name ); - CurProfile.changed |= ret; - return ret; + CurProfile.changed |= PROFILE_DeleteSection( &CurProfile.section, + section_name ); + return TRUE; /* Even if PROFILE_DeleteSection() has failed, + this is not an error on application's level.*/ } else if (!value) /* Delete a key */ { dprintf_profile( stddeb, "PROFILE_DeleteKey('%s','%s')\n", section_name, key_name ); - ret = PROFILE_DeleteKey( &CurProfile.section, section_name, key_name ); - CurProfile.changed |= ret; - return ret; + CurProfile.changed |= PROFILE_DeleteKey( &CurProfile.section, + section_name, key_name ); + return TRUE; /* same error handling as above */ } else /* Set the key value */ { @@ -542,8 +541,8 @@ static BOOL32 PROFILE_SetString( LPCSTR section_name, LPCSTR key_name, else dprintf_profile( stddeb, "creating key\n" ); key->value = xstrdup( value ); CurProfile.changed = TRUE; - return TRUE; } + return TRUE; } diff --git a/graphics/Makefile.in b/graphics/Makefile.in index cc14f5f4562..0db59ed05de 100644 --- a/graphics/Makefile.in +++ b/graphics/Makefile.in @@ -6,9 +6,9 @@ VPATH = @srcdir@ MODULE = graphics C_SRCS = \ - wing.c \ bitblt.c \ - driver.c + driver.c \ + wing.c all: $(MODULE).o diff --git a/graphics/wing.c b/graphics/wing.c index 4f3b29d5b09..3bae4894c95 100644 --- a/graphics/wing.c +++ b/graphics/wing.c @@ -5,19 +5,10 @@ */ #include "gdi.h" +#include "windows.h" #include "stddebug.h" #include "debug.h" -/* I dunno if this structure can be put here... Maybe copyright, I'm no lawyer... */ -typedef enum WING_DITHER_TYPE -{ - WING_DISPERSED_4x4, - WING_DISPERSED_8x8, - - WING_CLUSTERED_4x4 - -} WING_DITHER_TYPE; - /*********************************************************************** * WingCreateDC16 (WING.1001) */ @@ -33,8 +24,21 @@ HDC16 WinGCreateDC16(void) */ BOOL16 WinGRecommendDIBFormat16(BITMAPINFO *fmt) { - fprintf(stdnimp,"WinGRecommendDIBFormat: empty stub!\n"); - return 0; + HDC16 i=GetDC16(0); + + fmt->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); + fmt->bmiHeader.biWidth=0; + fmt->bmiHeader.biHeight=1; /* The important part */ + fmt->bmiHeader.biPlanes=GetDeviceCaps(i, PLANES); + fmt->bmiHeader.biBitCount=GetDeviceCaps(i, BITSPIXEL); + fmt->bmiHeader.biCompression=BI_RGB; + fmt->bmiHeader.biSizeImage=0; + fmt->bmiHeader.biXPelsPerMeter=1000/25.4*GetDeviceCaps(i,LOGPIXELSX); + fmt->bmiHeader.biYPelsPerMeter=1000/25.4*GetDeviceCaps(i,LOGPIXELSY); + fmt->bmiHeader.biClrUsed=0; + fmt->bmiHeader.biClrImportant=0; + ReleaseDC16(0, i); + return 1; } /*********************************************************************** @@ -42,26 +46,82 @@ BOOL16 WinGRecommendDIBFormat16(BITMAPINFO *fmt) */ HBITMAP16 WinGCreateBitmap16(HDC16 winDC, BITMAPINFO *header, void **bits) { - fprintf(stdnimp,"WinGCreateBitmap: empty stub! (expect failure)\n"); - *bits=0; + fprintf(stdnimp,"WinGCreateBitmap: almost empty stub! (expect failure)\n"); + /* Assume RGB color */ + if(bits==NULL) + return CreateDIBitmap(winDC, header, 0, bits, header, 0); + else + return CreateDIBitmap(winDC, header, 1, bits, header, 0); return 0; } +/*********************************************************************** + * WinGGetDIBPointer16 (WING.1004) + */ +void* WinGGetDIBPointer16(HBITMAP16 bmap, BITMAPINFO *header) +{ + fprintf(stdnimp,"WinGGetDIBPointer16: empty stub!\n"); + return NULL; +} + +/*********************************************************************** + * WinGGetDIBColorTable16 (WING.1005) + */ +UINT16 WinGGetDIBColorTable16(HDC16 winDC, UINT16 start, UINT16 numentry, + RGBQUAD* colors) +{ + return GetPaletteEntries(winDC, start, numentry, colors); +} + +/*********************************************************************** + * WinGSetDIBColorTable16 (WING.1006) + */ +UINT16 WinGSetDIBColorTable16(HDC16 winDC, UINT16 start, UINT16 numentry, + RGBQUAD* colors) +{ + return SetPaletteEntries(winDC, start, numentry, colors); +} + + /*********************************************************************** * WinGCreateHalfTonePalette16 (WING.1007) */ HPALETTE16 WinGCreateHalfTonePalette16(void) { - fprintf(stdnimp,"WinGCreateHalfTonePalette: empty stub!\n"); + fprintf(stdnimp,"WinGCreateHalfTonePalette16: empty stub!\n"); return 0; } /*********************************************************************** * WinGCreateHalfToneBrush16 (WING.1008) */ -HPALETTE16 WinGCreateHalfToneBrush16(HDC16 winDC, COLORREF col, WING_DITHER_TYPE type) +HPALETTE16 WinGCreateHalfToneBrush16(HDC16 winDC, COLORREF col, INT16 dithertype) { - fprintf(stdnimp,"WinGCreateHalfToneBrush: empty stub!\n"); + fprintf(stdnimp,"WinGCreateHalfToneBrush16: empty stub!\n"); return 0; } +/*********************************************************************** + * WinGStretchBlt16 (WING.1009) + */ +BOOL16 WinGStretchBlt16(HDC16 destDC, INT16 xDest, INT16 yDest, INT16 widDest, + INT16 heiDest, HDC16 srcDC, INT16 xSrc, INT16 ySrc, + INT16 widSrc, INT16 heiSrc) +{ + + return StretchBlt16(destDC, xDest, yDest, widDest, heiDest, srcDC, xSrc, ySrc, widSrc, heiSrc, SRCCOPY); +/* fprintf(stdnimp,"WinGStretchBlt16: empty stub!\n");*/ +/* return 0; */ +} + +/*********************************************************************** + * WinGBitBlt16 (WING.1010) + */ +BOOL16 WinGBitBlt16(HDC16 destDC, INT16 xDest, INT16 yDest, INT16 widDest, + INT16 heiDest, HDC16 srcDC, INT16 xSrc, INT16 ySrc) +{ + return BitBlt16(destDC, xDest, yDest, widDest, heiDest, srcDC, xSrc, ySrc, SRCCOPY); +/* fprintf(stdnimp,"WinGBitBlt16: empty stub!\n");*/ +/* return 0;*/ +} + diff --git a/if1632/Makefile.in b/if1632/Makefile.in index 9efa8c964ce..1df513d0dd2 100644 --- a/if1632/Makefile.in +++ b/if1632/Makefile.in @@ -11,7 +11,7 @@ DLLS = \ comdlg32.spec \ commdlg.spec \ compobj.spec \ - crtdll.spec \ + crtdll.spec \ ddeml.spec \ gdi.spec \ gdi32.spec \ @@ -23,7 +23,7 @@ DLLS = \ mmsystem.spec \ mouse.spec \ mpr.spec \ - ntdll.spec \ + ntdll.spec \ ole2.spec \ ole2conv.spec \ ole2disp.spec \ @@ -52,7 +52,7 @@ DLLS = \ wprocs.spec \ wsock32.spec -SPEC_FILES = $(DLLS:.spec=.S) +SPEC_FILES = $(DLLS:.spec=.s) C_SRCS = \ dummy.c \ @@ -60,17 +60,19 @@ C_SRCS = \ thunk.c ASM_SRCS = \ - $(SPEC_FILES) \ - callfrom16.S \ - callfrom32.S \ - callto16.S \ - callto32.S \ except.S +GEN_ASM_SRCS = \ + $(SPEC_FILES) \ + callfrom16.s \ + callfrom32.s \ + callto16.s \ + callto32.s \ + .SUFFIXES: .spec -.spec.S: - $(BUILD) -spec $< > $*.S +.spec.s: + $(BUILD) -o $@ -spec $< all: checkbuild $(MODULE).o @@ -81,22 +83,19 @@ $(SPEC_FILES): $(BUILD) $(BUILD) checkbuild: cd $(TOPOBJDIR)/tools; $(SUBMAKE) build -callfrom16.S: $(SPEC_FILES) - $(BUILD) -callfrom16 `cat $(SPEC_FILES) | grep CallFrom16_ | sed 's/.*CallFrom16_\(.*\)/\1/' | sort | uniq` > callfrom16.S +callfrom16.s: $(SPEC_FILES) + $(BUILD) -o $@ -callfrom16 `cat $(SPEC_FILES) | grep CallFrom16_ | sed 's/.*CallFrom16_\(.*\)/\1/' | sort | uniq` -callfrom32.S: $(SPEC_FILES) - $(BUILD) -callfrom32 `cat $(SPEC_FILES) | grep CallFrom32_ | sed 's/.*CallFrom32_\(.*\)/\1/' | sort | uniq` > callfrom32.S +callfrom32.s: $(SPEC_FILES) + $(BUILD) -o $@ -callfrom32 `cat $(SPEC_FILES) | grep CallFrom32_ | sed 's/.*CallFrom32_\(.*\)/\1/' | sort | uniq` -callto16.S: $(TOPSRCDIR)/include/callback.h $(BUILD) - $(BUILD) -callto16 `cat $(TOPSRCDIR)/include/callback.h | grep "extern.*CallTo16_" | sed 's/.*CallTo16_\(.*\)(.*/\1/' | sort | uniq` > callto16.S +callto16.s: $(TOPSRCDIR)/include/callback.h $(BUILD) + $(BUILD) -o $@ -callto16 `cat $(TOPSRCDIR)/include/callback.h | grep "extern.*CallTo16_" | sed 's/.*CallTo16_\(.*\)(.*/\1/' | sort | uniq` -callto32.S: $(TOPSRCDIR)/include/callback.h $(BUILD) - $(BUILD) -callto32 `cat $(TOPSRCDIR)/include/callback.h | grep "extern.*CallTo32_" | sed 's/.*CallTo32_\(.*\)(.*/\1/' | sort | uniq` > callto32.S +callto32.s: $(TOPSRCDIR)/include/callback.h $(BUILD) + $(BUILD) -o $@ -callto32 `cat $(TOPSRCDIR)/include/callback.h | grep "extern.*CallTo32_" | sed 's/.*CallTo32_\(.*\)(.*/\1/' | sort | uniq` except.o: except.S $(TOPOBJDIR)/include/config.h $(CC) -c $(DIVINCL) -o $*.o $(SRCDIR)/except.S -clean:: - $(RM) $(SPEC_FILES) callfrom16.S callfrom32.S callto16.S callto32.S - ### Dependencies: diff --git a/if1632/gdi.spec b/if1632/gdi.spec index 3fd6b1e3ffb..55654d2c514 100644 --- a/if1632/gdi.spec +++ b/if1632/gdi.spec @@ -272,8 +272,8 @@ heap 65488 # 65536 - 16 (instance data) - 32 (stock objects) 410 pascal16 IsValidMetaFile (word) IsValidMetaFile 411 pascal16 GetCurLogFont(word) GetCurLogFont 412 pascal16 IsDCCurrentPalette(word) IsDCCurrentPalette -439 pascal16 StretchDIBits (word s_word s_word word word word word - word word ptr ptr word long) StretchDIBits +439 pascal16 StretchDIBits (word s_word s_word s_word s_word s_word s_word + s_word s_word ptr ptr word long) StretchDIBits16 440 pascal16 SetDIBits(word word word word ptr ptr word) SetDIBits 441 pascal16 GetDIBits(word word word word ptr ptr word) GetDIBits 442 pascal16 CreateDIBitmap(word ptr long ptr ptr word) CreateDIBitmap diff --git a/if1632/gdi32.spec b/if1632/gdi32.spec index c84bf4a4b2a..d013da594bf 100644 --- a/if1632/gdi32.spec +++ b/if1632/gdi32.spec @@ -236,9 +236,9 @@ base 1 0228 stub GetTextExtentExPointA 0229 stub GetTextExtentExPointW 0230 stdcall GetTextExtentPoint32A(long ptr long ptr) GetTextExtentPoint32A -0231 stub GetTextExtentPoint32W -0232 stdcall GetTextExtentPointA(long ptr long ptr) GetTextExtentPoint32A -0233 stdcall GetTextExtentPointW(long ptr long ptr) GetTextExtentPoint32W +0231 stdcall GetTextExtentPoint32W(long ptr long ptr) GetTextExtentPoint32W +0232 stdcall GetTextExtentPointA(long ptr long ptr) GetTextExtentPoint32ABuggy +0233 stdcall GetTextExtentPointW(long ptr long ptr) GetTextExtentPoint32WBuggy 0234 stdcall GetTextFaceA(long long ptr) GetTextFace 0235 stub GetTextFaceW 0236 stdcall GetTextMetricsA(long ptr) GetTextMetrics32A @@ -358,8 +358,8 @@ base 1 0349 stub StartPage 0350 stdcall StretchBlt(long long long long long long long long long long long) StretchBlt32 -0351 stdcall StretchDIBits(long long long long long long long - long long long long long long) StretchDIBits +0351 stdcall StretchDIBits(long long long long long long long long long + ptr ptr long long) StretchDIBits32 0352 stub StrokeAndFillPath 0353 stub StrokePath 0354 stub SwapBuffers diff --git a/if1632/user.spec b/if1632/user.spec index 20ab847a325..91a3792f3e1 100644 --- a/if1632/user.spec +++ b/if1632/user.spec @@ -122,7 +122,7 @@ heap 65520 120 pascal GetMessageTime() GetMessageTime 121 pascal SetWindowsHook(s_word segptr) THUNK_SetWindowsHook16 122 pascal CallWindowProc(segptr word word word long) CallWindowProc16 -123 pascal16 CallMsgFilter(segptr s_word) CallMsgFilter +123 pascal16 CallMsgFilter(segptr s_word) CallMsgFilter16 124 pascal16 UpdateWindow(word) UpdateWindow 125 pascal16 InvalidateRect(word ptr word) InvalidateRect16 126 pascal16 InvalidateRgn(word word word) InvalidateRgn @@ -235,7 +235,7 @@ heap 65520 232 pascal16 SetWindowPos(word word word word word word word) SetWindowPos 233 pascal16 SetParent(word word) SetParent 234 pascal16 UnhookWindowsHook(s_word segptr) THUNK_UnhookWindowsHook16 -235 pascal DefHookProc(s_word word long ptr) DefHookProc +235 pascal DefHookProc(s_word word long ptr) DefHookProc16 236 pascal16 GetCapture() GetCapture16 237 pascal16 GetUpdateRgn(word word word) GetUpdateRgn 238 pascal16 ExcludeUpdateRgn(word word) ExcludeUpdateRgn @@ -296,7 +296,7 @@ heap 65520 290 pascal16 RedrawWindow(word ptr word word) RedrawWindow16 291 pascal SetWindowsHookEx(s_word segptr word word) THUNK_SetWindowsHookEx16 292 pascal16 UnhookWindowsHookEx(segptr) THUNK_UnhookWindowsHookEx16 -293 pascal CallNextHookEx(segptr s_word word long) CallNextHookEx +293 pascal CallNextHookEx(segptr s_word word long) CallNextHookEx16 294 stub LockWindowUpdate 299 register Mouse_Event() Mouse_Event 300 stub UnloadInstalledDrivers diff --git a/if1632/user32.spec b/if1632/user32.spec index e4c871d1192..75b8b0f6a5f 100644 --- a/if1632/user32.spec +++ b/if1632/user32.spec @@ -16,9 +16,9 @@ base 1 0011 stub BroadcastSystemMessage 0012 stub CalcChildScroll 0013 stub CallMsgFilter -0014 stub CallMsgFilterA -0015 stub CallMsgFilterW -0016 stub CallNextHookEx +0014 stdcall CallMsgFilterA(ptr long) CallMsgFilter32A +0015 stdcall CallMsgFilterW(ptr long) CallMsgFilter32W +0016 stdcall CallNextHookEx(long long long long) CallNextHookEx32 0017 stdcall CallWindowProcA(ptr long long long long) CallWindowProc32A 0018 stdcall CallWindowProcW(ptr long long long long) CallWindowProc32W 0019 stub CascadeChildWindows @@ -530,8 +530,8 @@ base 1 0523 stdcall SetWindowWord(long long long) SetWindowWord 0524 stdcall SetWindowsHookA(long ptr) SetWindowsHook32A 0525 stdcall SetWindowsHookExA(long long long long) SetWindowsHookEx32A -0526 stub SetWindowsHookExW -0527 stub SetWindowsHookW +0526 stdcall SetWindowsHookExW(long long long long) SetWindowsHookEx32W +0527 stdcall SetWindowsHookW(long long long long) SetWindowsHook32W 0528 stdcall ShowCaret(long) ShowCaret 0529 stdcall ShowCursor(long) ShowCursor 0530 stub ShowOwnedPopups @@ -560,7 +560,7 @@ base 1 0553 stub TranslateCharsetInfo 0554 stub TranslateMDISysAccel 0555 stdcall TranslateMessage(ptr) USER32_TranslateMessage -0556 stub UnhookWindowsHook +0556 stdcall UnhookWindowsHook(long ptr) UnhookWindowsHook32 0557 stdcall UnhookWindowsHookEx(long) UnhookWindowsHookEx32 0558 stdcall UnionRect(ptr ptr ptr) UnionRect32 0559 stub UnloadKeyboardLayout diff --git a/if1632/wing.spec b/if1632/wing.spec index f22122e9b0c..9477096bd28 100644 --- a/if1632/wing.spec +++ b/if1632/wing.spec @@ -1,17 +1,16 @@ name wing type win16 -1001 pascal16 WinGCreateDC() WinGCreateDC16 -1002 pascal16 WinGRecommendDIBFormat(ptr) WinGRecommendDIBFormat16 -1003 pascal16 WinGCreateBitmap(word ptr ptr) WinGCreateBitmap16 -1004 stub WINGGETDIBPOINTER -1005 stub WINGGETDIBCOLORTABLE -1006 stub WINGSETDIBCOLORTABLE -1007 pascal16 WinGCreateHalfTonePalette() WinGCreateHalfTonePalette16 -1008 pascal16 WinGCreateHalfToneBrush(word long word) WinGCreateHalfToneBrush16 -1009 stub WINGSTRETCHBLT -# Probably much like BitBlt16... but, without the last field (what value?) -1010 stub WINGBITBLT +1001 pascal16 WINGCREATEDC() WinGCreateDC16 +1002 pascal16 WINGRECOMMENDDIBFORMAT(ptr) WinGRecommendDIBFormat16 +1003 pascal16 WINGCREATEBITMAP(word ptr ptr) WinGCreateBitmap16 +1004 pascal WINGGETDIBPOINTER(word ptr) WinGGetDIBPointer16 +1005 pascal16 WINGGETDIBCOLORTABLE(word word word ptr) WinGGetDIBColorTable16 +1006 pascal16 WINGSETDIBCOLORTABLE(word word word ptr) WinGSetDIBColorTable16 +1007 pascal16 WINGCREATEHALFTONEPALETTE() WinGCreateHalfTonePalette16 +1008 pascal16 WINGCREATEHALFTONEBRUSH(word word word) WinGCreateHalfToneBrush16 +1009 pascal16 WINGSTRETCHBLT(word word word word word word word word word word) WinGStretchBlt16 +1010 pascal16 WINGBITBLT(word word word word word word word word) WinGBitBlt16 # Seem that 1299 is the limit... weird... #1500 stub WINGINITIALIZETHUNK16 diff --git a/include/dialog.h b/include/dialog.h index dd01585e8ae..eb95f2f9c24 100644 --- a/include/dialog.h +++ b/include/dialog.h @@ -14,20 +14,29 @@ * This structure is stored into the window extra bytes (cbWndExtra). * sizeof(DIALOGINFO) must be <= DLGWINDOWEXTRA (=30). */ + +#pragma pack(1) + typedef struct { - INT32 msgResult; /* Result of EndDialog() / Default button id */ - HWINDOWPROC dlgProc; /* Dialog procedure */ - LONG userInfo; /* User information (for DWL_USER) */ + INT32 msgResult; /* +00 Last message result */ + HWINDOWPROC dlgProc; /* +04 Dialog procedure */ + LONG userInfo; /* +08 User information (for DWL_USER) */ + + /* implementation-dependent part */ + HWND16 hwndFocus; /* Current control with focus */ HFONT16 hUserFont; /* Dialog font */ HMENU16 hMenu; /* Dialog menu */ WORD xBaseUnit; /* Dialog units (depends on the font) */ WORD yBaseUnit; + INT32 idResult; /* EndDialog() result / default pushbutton ID */ WORD fEnd; /* EndDialog() called for this dialog */ HGLOBAL16 hDialogHeap; } DIALOGINFO; +#pragma pack(4) + extern BOOL32 DIALOG_Init(void); #endif /* DIALOG_H */ diff --git a/include/hook.h b/include/hook.h index 2a9857b5849..21c0196adc9 100644 --- a/include/hook.h +++ b/include/hook.h @@ -9,12 +9,23 @@ #include "windows.h" -extern HANDLE16 HOOK_GetHook( INT16 id , HQUEUE16 hQueue ); -extern LRESULT HOOK_CallHooks( INT16 id, INT16 code, - WPARAM16 wParam, LPARAM lParam ); -extern HOOKPROC16 HOOK_GetProc16( HHOOK hook ); -extern void HOOK_ResetQueueHooks( HQUEUE16 hQueue ); +#define HOOK_WIN16 0x0 +#define HOOK_WIN32 0x1 +#define HOOK_UNICODE 0x2 + +#define HOOK_MAPTYPE (HOOK_WIN32 | HOOK_UNICODE) + +extern HOOKPROC16 HOOK_GetProc16( HHOOK hhook ); +extern BOOL32 HOOK_IsHooked( INT16 id ); +extern LRESULT HOOK_CallHooks16( INT16 id, INT16 code, WPARAM16 wParam, + LPARAM lParam ); +extern LRESULT HOOK_CallHooks32A( INT32 id, INT32 code, WPARAM32 wParam, + LPARAM lParam ); +extern LRESULT HOOK_CallHooks32W( INT32 id, INT32 code, WPARAM32 wParam, + LPARAM lParam ); extern void HOOK_FreeModuleHooks( HMODULE16 hModule ); extern void HOOK_FreeQueueHooks( HQUEUE16 hQueue ); +extern void HOOK_ResetQueueHooks( HQUEUE16 hQueue ); +extern HOOKPROC32 HOOK_GetProc( HHOOK hook ); #endif /* __WINE_HOOK_H */ diff --git a/include/windows.h b/include/windows.h index 2cf3596866e..6571cc02791 100644 --- a/include/windows.h +++ b/include/windows.h @@ -583,15 +583,16 @@ typedef struct { BOOL16 fMouse; HWND16 hWndActive; -} CBTACTIVATESTRUCT16; +} CBTACTIVATESTRUCT16, *LPCBTACTIVATESTRUCT16; typedef struct { BOOL32 fMouse; HWND32 hWndActive; -} CBTACTIVATESTRUCT32; +} CBTACTIVATESTRUCT32, *LPCBTACTIVATESTRUCT32; DECL_WINELIB_TYPE(CBTACTIVATESTRUCT); +DECL_WINELIB_TYPE(LPCBTACTIVATESTRUCT); /* Shell hook values */ #define HSHELL_WINDOWCREATED 1 @@ -977,6 +978,8 @@ typedef struct #define DEFAULT_CHARSET 1 #define SYMBOL_CHARSET 2 #define SHIFTJIS_CHARSET 128 +#define HANGEUL_CHARSET 129 +#define CHINESEBIG5_CHARSET 136 #define OEM_CHARSET 255 /* lfOutPrecision values */ @@ -4063,16 +4066,20 @@ HRSRC32 FindResourceEx32A(HINSTANCE32,LPCSTR,LPCSTR,WORD); HRSRC32 FindResourceEx32W(HINSTANCE32,LPCWSTR,LPCWSTR,WORD); #define FindResourceEx WINELIB_NAME_AW(FindResourceEx) BOOL32 FlushFileBuffers(HFILE); +UINT32 GetACP(void); LPCSTR GetCommandLine32A(); LPCWSTR GetCommandLine32W(); #define GetCommandLine WINELIB_NAME_AW(GetCommandLine) BOOL32 GetCommTimeouts(INT32,LPCOMMTIMEOUTS); +DWORD GetCurrentThreadId(void); +HANDLE32 GetCurrentThread(void); BOOL32 GetDCOrgEx(HDC32,LPPOINT32); DWORD GetFileInformationByHandle(HFILE,BY_HANDLE_FILE_INFORMATION*); DWORD GetFileSize(HFILE,LPDWORD); DWORD GetFileType(HFILE); VOID GetLocalTime(LPSYSTEMTIME); DWORD GetLogicalDrives(void); +UINT32 GetOEMCP(void); HANDLE32 GetProcessHeap(void); DWORD GetShortPathName32A(LPCSTR,LPSTR,DWORD); DWORD GetShortPathName32W(LPCWSTR,LPWSTR,DWORD); @@ -4228,6 +4235,9 @@ BOOL32 BuildCommDCB32W(LPCWSTR,LPDCB32); BOOL32 BuildCommDCBAndTimeouts32A(LPCSTR,LPDCB32,LPCOMMTIMEOUTS); BOOL32 BuildCommDCBAndTimeouts32W(LPCWSTR,LPDCB32,LPCOMMTIMEOUTS); #define BuildCommDCBAndTimeouts WINELIB_NAME_AW(BuildCommDCBAndTimeouts) +LRESULT CallNextHookEx16(HHOOK,INT16,WPARAM16,LPARAM); +LRESULT CallNextHookEx32(HHOOK,INT32,WPARAM32,LPARAM); +#define CallNextHookEx WINELIB_NAME(CallNextHookEx) LRESULT CallWindowProc16(WNDPROC16,HWND16,UINT16,WPARAM16,LPARAM); LRESULT CallWindowProc32A(WNDPROC32,HWND32,UINT32,WPARAM32,LPARAM); LRESULT CallWindowProc32W(WNDPROC32,HWND32,UINT32,WPARAM32,LPARAM); @@ -4403,6 +4413,10 @@ LRESULT DefFrameProc16(HWND16,HWND16,UINT16,WPARAM16,LPARAM); LRESULT DefFrameProc32A(HWND32,HWND32,UINT32,WPARAM32,LPARAM); LRESULT DefFrameProc32W(HWND32,HWND32,UINT32,WPARAM32,LPARAM); #define DefFrameProc WINELIB_NAME_AW(DefFrameProc) +LRESULT DefHookProc16(INT16,WPARAM16,LPARAM,HHOOK*); +#define DefHookProc32(code,wparam,lparam,phhook) \ + CallNextHookEx32(*(phhook),code,wparam,lparam) +#define DefHookProc WINELIB_NAME(DefHookProc) LRESULT DefMDIChildProc16(HWND16,UINT16,WPARAM16,LPARAM); LRESULT DefMDIChildProc32A(HWND32,UINT32,WPARAM32,LPARAM); LRESULT DefMDIChildProc32W(HWND32,UINT32,WPARAM32,LPARAM); @@ -5294,6 +5308,9 @@ BOOL16 StretchBlt16(HDC16,INT16,INT16,INT16,INT16,HDC16,INT16,INT16, BOOL32 StretchBlt32(HDC32,INT32,INT32,INT32,INT32,HDC32,INT32,INT32, INT32,INT32,DWORD); #define StretchBlt WINELIB_NAME(StretchBlt) +INT16 StretchDIBits16(HDC16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,INT16,const VOID*,const BITMAPINFO*,UINT16,DWORD); +INT32 StretchDIBits32(HDC32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,const VOID*,const BITMAPINFO*,UINT32,DWORD); +#define StretchDIBits WINELIB_NAME(StretchDIBits) BOOL16 SubtractRect16(LPRECT16,const RECT16*,const RECT16*); BOOL32 SubtractRect32(LPRECT32,const RECT32*,const RECT32*); #define SubtractRect WINELIB_NAME(SubtractRect) @@ -5468,7 +5485,6 @@ HDWP16 BeginDeferWindowPos(INT); BOOL BringWindowToTop(HWND); void CalcChildScroll(HWND,WORD); BOOL CallMsgFilter(SEGPTR,INT); -LRESULT CallNextHookEx(HHOOK,INT,WPARAM16,LPARAM); BOOL ChangeClipboardChain(HWND,HWND); INT CheckMenuItem(HMENU16,UINT,UINT); BOOL CloseClipboard(void); @@ -5488,7 +5504,6 @@ HICON16 CreateIcon(HINSTANCE16,INT,INT,BYTE,BYTE,const BYTE*,const BYTE*); HMENU16 CreateMenu(void); HPALETTE16 CreatePalette(const LOGPALETTE*); HMENU16 CreatePopupMenu(void); -DWORD DefHookProc(short,WORD,DWORD,HHOOK*); HDWP16 DeferWindowPos(HDWP16,HWND,HWND,INT,INT,INT,INT,UINT); ATOM DeleteAtom(ATOM); BOOL DeleteDC(HDC16); @@ -5716,7 +5731,6 @@ BOOL ShowWindow(HWND,int); DWORD SizeofResource(HMODULE16,HRSRC16); int StartSound(void); int StopSound(void); -int StretchDIBits(HDC16,WORD,WORD,WORD,WORD,WORD,WORD,WORD,WORD,LPSTR,LPBITMAPINFO,WORD,DWORD); BOOL SwapMouseButton(BOOL); void SwapRecording(WORD); int SyncAllVoices(void); diff --git a/include/winsock.h b/include/winsock.h index 9119c01a96c..ca7bcafc299 100644 --- a/include/winsock.h +++ b/include/winsock.h @@ -16,9 +16,7 @@ #include #include "windows.h" -#ifndef WINELIB -#pragma pack(1) /* tight alignment for the emulator */ -#endif +#pragma pack(1) /* Win16 socket-related types */ @@ -135,9 +133,7 @@ typedef struct WSAData { SEGPTR lpVendorInfo; } WSADATA, *LPWSADATA; -#ifndef WINELIB #pragma pack(4) -#endif /* ----------------------------------- no Win16 structure defs beyond this line! */ diff --git a/library/Makefile.in b/library/Makefile.in index 37edb7b185f..dce38c735f0 100644 --- a/library/Makefile.in +++ b/library/Makefile.in @@ -3,16 +3,26 @@ TOPSRCDIR = @top_srcdir@ TOPOBJDIR = .. SRCDIR = @srcdir@ VPATH = @srcdir@ -MODULE = library +MODULE = none +LIBMODULE = library -C_SRCS = \ +LIB_SRCS = \ arch.c \ libres.c \ miscstubs.c \ - sup.c \ - winmain.c + sup.c -all: $(MODULE).o +STUB_SRCS = winestub.c + +LIB_OBJS = $(LIB_SRCS:.c=.o) +STUB_OBJS = $(STUB_SRCS:.c=.o) + +C_SRCS = $(LIB_SRCS) $(STUB_SRCS) + +all: $(LIBMODULE).o $(STUB_OBJS) + +$(LIBMODULE).o: $(LIB_OBJS) + $(LDCOMBINE) $(LIB_OBJS) -o $(LIBMODULE).o @MAKE_RULES@ diff --git a/library/winestub.c b/library/winestub.c index b5323b807d4..33992cd7d8f 100644 --- a/library/winestub.c +++ b/library/winestub.c @@ -1,18 +1,51 @@ /* Sample winestub.c file for compiling programs with libwine.so. */ +#include #include "windows.h" -#ifdef WIN_DEBUG -#include -#endif +#include "xmalloc.h" -extern int PASCAL WinMain(HINSTANCE,HINSTANCE,LPSTR,int); +extern int WinMain(HINSTANCE32,HINSTANCE32,LPSTR,int); +extern int MAIN_Init(void); +extern BOOL32 MAIN_WineInit( int *argc, char *argv[] ); +extern void TASK_Reschedule(void); + +int main( int argc, char *argv [] ) +{ + HINSTANCE16 hInstance; + LPSTR lpszCmdParam; + int i, len = 0; + + MAIN_WineInit( &argc, argv ); + + /* Alloc szCmdParam */ + for (i = 1; i < argc; i++) len += strlen(argv[i]) + 1; + lpszCmdParam = (LPSTR) xmalloc(len + 1); + /* Concatenate arguments */ + if (argc > 1) strcpy(lpszCmdParam, argv[1]); + else lpszCmdParam[0] = '\0'; + for (i = 2; i < argc; i++) strcat(strcat(lpszCmdParam, " "), argv[i]); + + if(!MAIN_Init()) return 0; /* JBP: Needed for DosDrives[] structure, etc. */ + hInstance = WinExec( *argv, SW_SHOWNORMAL ); + TASK_Reschedule(); + InitApp( hInstance ); + + return WinMain (hInstance, /* hInstance */ + 0, /* hPrevInstance */ + lpszCmdParam, /* lpszCmdParam */ + SW_NORMAL); /* nCmdShow */ +} + +#if 0 + +extern int WinMain(HINSTANCE32,HINSTANCE32,LPSTR,int); /* This is the renamed main() subroutine in misc/main.c. */ /* Note that the libdll `init()' won't work: */ -extern HINSTANCE _wine_main(int, char *[]); +extern HINSTANCE32 _wine_main(int, char *[]); int main (int argc, char *argv []) { - HINSTANCE hInstance; + HINSTANCE32 hInstance; char szCmdParam[256] = {0}; int index, buffer_pos; char *arg_holder; @@ -22,7 +55,7 @@ int main (int argc, char *argv []) char *wine_argv[] = {argv[0], ""}; /* Initialize the library dll: */ - hInstance = (HINSTANCE)_wine_main((sizeof(wine_argv)/sizeof(char *))-1, wine_argv); + hInstance = (HINSTANCE32)_wine_main((sizeof(wine_argv)/sizeof(char *))-1, wine_argv); #ifdef WIN_DEBUG fprintf(stderr,"In winestub, reporting hInstance = %d\n", hInstance); @@ -49,3 +82,4 @@ int main (int argc, char *argv []) (LPSTR)szCmdParam, /* lpszCmdParam */ SW_NORMAL); /* nCmdShow */ } +#endif diff --git a/library/winmain.c b/library/winmain.c deleted file mode 100644 index 2ee677c4f7e..00000000000 --- a/library/winmain.c +++ /dev/null @@ -1,41 +0,0 @@ -#include -#include -#include -#include "windows.h" -#include "xmalloc.h" - -extern int MAIN_Init(void); -extern BOOL WIDGETS_Init(void); -extern BOOL WIN_CreateDesktopWindow(void); -extern int WinMain(HINSTANCE16,HINSTANCE16,LPSTR,int); -extern void TASK_Reschedule(void); - - -int _WinMain (int argc, char *argv []) -{ - HINSTANCE16 hInstance; - LPSTR lpszCmdParam; - int i, len = 0; - - /* Alloc szCmdParam */ - for (i = 1; i < argc; i++) len += strlen(argv[i]) + 1; - lpszCmdParam = (LPSTR) xmalloc(len + 1); - /* Concatenate arguments */ - if (argc > 1) strcpy(lpszCmdParam, argv[1]); - else lpszCmdParam[0] = '\0'; - for (i = 2; i < argc; i++) strcat(strcat(lpszCmdParam, " "), argv[i]); - - if(!MAIN_Init()) return 0; /* JBP: Needed for DosDrives[] structure, etc. */ - hInstance = WinExec( *argv, SW_SHOWNORMAL ); - TASK_Reschedule(); - InitApp( hInstance ); - -#ifdef WINELIBDLL - return (int)hInstance; -#else - return WinMain (hInstance, /* hInstance */ - 0, /* hPrevInstance */ - lpszCmdParam, /* lpszCmdParam */ - SW_NORMAL); /* nCmdShow */ -#endif -} diff --git a/loader/main.c b/loader/main.c index 8cac97659f7..3bd649e6196 100644 --- a/loader/main.c +++ b/loader/main.c @@ -163,12 +163,15 @@ int MAIN_Init(void) /********************************************************************** * main */ -int _WinMain(int argc, char **argv) +int main(int argc, char *argv[] ) { + extern BOOL32 MAIN_WineInit( int *argc, char *argv[] ); + int i; HINSTANCE16 handle; - if (!MAIN_Init()) return 0; + if (!MAIN_WineInit( &argc, argv )) return 1; + if (!MAIN_Init()) return 1; for (i = 1; i < argc; i++) { @@ -182,7 +185,7 @@ int _WinMain(int argc, char **argv) case 21: fprintf( stderr, "win32 executable\n" ); break; default: fprintf( stderr, "error=%d\n", handle ); break; } - exit(1); + return 1; } } diff --git a/loader/task.c b/loader/task.c index d55e252ff16..824e2d5f184 100644 --- a/loader/task.c +++ b/loader/task.c @@ -772,7 +772,7 @@ void TASK_Reschedule(void) /* extract hardware events only! */ - EVENT_WaitXEvent( FALSE, TRUE ); + if (!hTask) EVENT_WaitXEvent( FALSE, TRUE ); while (!hTask) { diff --git a/misc/main.c b/misc/main.c index f8597ec1604..9d558f12512 100644 --- a/misc/main.c +++ b/misc/main.c @@ -606,15 +606,12 @@ static void called_at_exit(void) } /*********************************************************************** - * main + * MAIN_WineInit + * + * Wine initialisation and command-line parsing */ -#if defined(WINELIB) && defined(WINELIBDLL) -int _wine_main (int argc, char *argv[]) -#else -int main( int argc, char *argv[] ) -#endif +BOOL32 MAIN_WineInit( int *argc, char *argv[] ) { - int ret_val; int depth_count, i; int *depth_list; struct timeval tv; @@ -645,7 +642,7 @@ int main( int argc, char *argv[] ) XrmInitialize(); - MAIN_ParseOptions( &argc, argv ); + MAIN_ParseOptions( argc, argv ); if (Options.desktopGeometry && Options.managed) { @@ -672,15 +669,12 @@ int main( int argc, char *argv[] ) } else screenDepth = DefaultDepthOfScreen( screen ); if (Options.synchronous) XSynchronize( display, True ); - if (Options.desktopGeometry) MAIN_CreateDesktop( argc, argv ); + if (Options.desktopGeometry) MAIN_CreateDesktop( *argc, argv ); else rootWindow = DefaultRootWindow( display ); MAIN_SaveSetup(); atexit(called_at_exit); - - ret_val = _WinMain( argc, argv ); - - return ret_val; + return TRUE; } @@ -1063,7 +1057,8 @@ BOOL SystemParametersInfo (UINT uAction, UINT uParam, LPVOID lpvParam, UINT fuWi XKeyboardControl keyboard_value; - switch (uAction) { + switch (uAction) + { case SPI_GETBEEP: XGetKeyboardControl(display, &keyboard_state); if (keyboard_state.bell_percent == 0) @@ -1089,20 +1084,22 @@ BOOL SystemParametersInfo (UINT uAction, UINT uParam, LPVOID lpvParam, UINT fuWi 1 ); break; - case SPI_GETICONTITLEWRAP: - *(BOOL *) lpvParam = FALSE; - /* FIXME GetProfileInt32A( "desktop", "?", True ) */ - break; + case SPI_GETICONTITLEWRAP: + *(BOOL *) lpvParam = GetProfileInt32A( "desktop", + "IconTitleWrap", + TRUE ); + break; - case SPI_GETKEYBOARDDELAY: - *(INT *) lpvParam = 1; - /* FIXME */ - break; + case SPI_GETKEYBOARDDELAY: + *(INT *) lpvParam = GetProfileInt32A( "keyboard", + "KeyboardDelay", 1 ); + break; - case SPI_GETKEYBOARDSPEED: - *(WORD *) lpvParam = 30; - /* FIXME */ - break; + case SPI_GETKEYBOARDSPEED: + *(WORD *) lpvParam = GetProfileInt32A( "keyboard", + "KeyboardSpeed", + 30 ); + break; case SPI_GETMENUDROPALIGNMENT: *(BOOL *) lpvParam = GetSystemMetrics( SM_MENUDROPALIGNMENT ); /* XXX check this */ @@ -1174,19 +1171,21 @@ BOOL SystemParametersInfo (UINT uAction, UINT uParam, LPVOID lpvParam, UINT fuWi case SPI_GETICONTITLELOGFONT: { - /* FIXME GetProfileString32A( "?", "?", "?" ) */ - LPLOGFONT16 lpLogFont = (LPLOGFONT16)lpvParam; - lpLogFont->lfHeight = 10; - lpLogFont->lfWidth = 0; - lpLogFont->lfEscapement = lpLogFont->lfOrientation = 0; - lpLogFont->lfWeight = FW_NORMAL; - lpLogFont->lfItalic = lpLogFont->lfStrikeOut = lpLogFont->lfUnderline = FALSE; - lpLogFont->lfCharSet = ANSI_CHARSET; - lpLogFont->lfOutPrecision = OUT_DEFAULT_PRECIS; - lpLogFont->lfClipPrecision = CLIP_DEFAULT_PRECIS; - lpLogFont->lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS; - break; - } + /* FIXME GetProfileString32A( "?", "?", "?" ) */ + LPLOGFONT16 lpLogFont = (LPLOGFONT16)lpvParam; + lpLogFont->lfHeight = 10; + lpLogFont->lfWidth = 0; + lpLogFont->lfEscapement = lpLogFont->lfOrientation = 0; + lpLogFont->lfWeight = FW_NORMAL; + lpLogFont->lfItalic = FALSE; + lpLogFont->lfStrikeOut = FALSE; + lpLogFont->lfUnderline = FALSE; + lpLogFont->lfCharSet = ANSI_CHARSET; + lpLogFont->lfOutPrecision = OUT_DEFAULT_PRECIS; + lpLogFont->lfClipPrecision = CLIP_DEFAULT_PRECIS; + lpLogFont->lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS; + break; + } case SPI_LANGDRIVER: case SPI_SETBORDER: diff --git a/misc/winsock.c b/misc/winsock.c index cb22484ccc0..1ec7004b15a 100644 --- a/misc/winsock.c +++ b/misc/winsock.c @@ -174,24 +174,68 @@ static void fd_set_normalize(fd_set* fds, LPWSINFO pwsi, ws_fd_set* ws, int* hig } } -static void fd_set_update(LPWSINFO pwsi, fd_set* fds, ws_fd_set* ws) +/* + * Note weirdness here: sockets with errors belong in exceptfds, but + * are given to us in readfds or writefds, so move them to exceptfds if + * there is an error. Note that this means that exceptfds may have mysterious + * sockets set in it that the program never asked for. + */ + +static int inline sock_error_p(int s) { - if( ws ) - { - int i, j, count = ws->fd_count; - ws_socket* pws; - for( i = 0, j = 0; i < count; i++ ) + unsigned int optval, optlen; + + optlen = sizeof(optval); + getsockopt(s, SOL_SOCKET, SO_ERROR, &optval, &optlen); + if (optval) dprintf_winsock(stddeb, "error: %d\n", optval); + return optval != 0; +} + +static void fd_set_update(LPWSINFO pwsi, fd_set* fds, ws_fd_set* ws, + fd_set *errorfds) +{ + if( ws ) { - pws = (ws_socket*)WS_HANDLE2PTR(ws->fd_array[i]); - if( _check_ws(pwsi, pws) ) - if( FD_ISSET(pws->fd, fds) ) - { - ws->fd_array[j++] = ws->fd_array[i]; - continue; - } - ws->fd_count--; + int i, j, count = ws->fd_count; + + for( i = 0, j = 0; i < count; i++ ) + { + ws_socket *pws = (ws_socket*)WS_HANDLE2PTR(ws->fd_array[i]); + int fd = pws->fd; + + if( _check_ws(pwsi, pws) && FD_ISSET(fd, fds) ) + { + /* if error, move to errorfds */ + if (errorfds && (FD_ISSET(fd, errorfds) || sock_error_p(fd))) + FD_SET(fd, errorfds); + else + ws->fd_array[j++] = ws->fd_array[i]; + } + } + ws->fd_count = j; + dprintf_winsock(stddeb, "\n"); } - } + return; +} + +static void fd_set_update_except(LPWSINFO pwsi, fd_set *fds, ws_fd_set *ws, + fd_set *errorfds) +{ + if (ws) + { + int i, j, count = ws->fd_count; + + for (i=j=0; i < count; i++) + { + ws_socket *pws = (ws_socket *)WS_HANDLE2PTR(ws->fd_array[i]); + + if (_check_ws(pwsi, pws) && (FD_ISSET(pws->fd, fds) + || FD_ISSET(pws->fd, errorfds))) + ws->fd_array[j++] = ws->fd_array[i]; + } + ws->fd_count = j; + } + return; } /* ----------------------------------- API ----- @@ -512,7 +556,7 @@ INT16 WINSOCK_getsockopt(SOCKET16 s, INT16 level, ws_socket* pws = (ws_socket*)WS_HANDLE2PTR(s); LPWSINFO pwsi = wsi_find(GetCurrentTask()); - dprintf_winsock(stddeb, "WSA_GETSOCKOPT(%08x): socket: %04x, opt %d, ptr %8x, ptr %8x\n", + dprintf_winsock(stddeb, "WS_GETSOCKOPT(%08x): socket: %04x, opt %d, ptr %8x, ptr %8x\n", (unsigned)pwsi, s, level, (int) optval, (int) *optlen); if( _check_ws(pwsi, pws) ) @@ -662,19 +706,20 @@ INT16 WINSOCK_select(INT16 nfds, ws_fd_set *ws_readfds, if( pwsi ) { int highfd = 0; - fd_set readfds, writefds, exceptfds; + fd_set readfds, writefds, exceptfds, errorfds; fd_set_normalize(&readfds, pwsi, ws_readfds, &highfd); fd_set_normalize(&writefds, pwsi, ws_writefds, &highfd); fd_set_normalize(&exceptfds, pwsi, ws_exceptfds, &highfd); + FD_ZERO(&errorfds); if( (highfd = select(highfd + 1, &readfds, &writefds, &exceptfds, timeout)) >= 0 ) { if( highfd ) { - fd_set_update(pwsi, &readfds, ws_readfds); - fd_set_update(pwsi, &writefds, ws_writefds); - fd_set_update(pwsi, &exceptfds, ws_exceptfds); + fd_set_update(pwsi, &readfds, ws_readfds, &errorfds); + fd_set_update(pwsi, &writefds, ws_writefds, &errorfds); + fd_set_update_except(pwsi, &exceptfds, ws_exceptfds, &errorfds); } return highfd; } @@ -820,14 +865,19 @@ SOCKET16 WINSOCK_socket(INT16 af, INT16 type, INT16 protocol) /* printf("created %04x (%i)\n", sock, (UINT16)WS_PTR2HANDLE(pnew)); */ if( pnew ) return (SOCKET16)WS_PTR2HANDLE(pnew); - else pwsi->errno = WSAENOBUFS; + else + { + close(sock); + pwsi->errno = WSAENOBUFS; + return INVALID_SOCKET; + } } if (errno == EPERM) /* raw socket denied */ { fprintf(stderr, "WS_SOCKET: not enough privileges\n"); pwsi->errno = WSAESOCKTNOSUPPORT; - } pwsi->errno = wsaErrno(); + } else pwsi->errno = wsaErrno(); } dprintf_winsock(stddeb, "\t\tfailed!\n"); diff --git a/objects/dib.c b/objects/dib.c index 7a4fcf0ef11..9ca8edfe6ed 100644 --- a/objects/dib.c +++ b/objects/dib.c @@ -619,26 +619,40 @@ static int DIB_SetImageBits( DC *dc, WORD lines, WORD depth, LPSTR bits, /*********************************************************************** - * StretchDIBits (GDI.439) + * StretchDIBits16 (GDI.439) */ -int StretchDIBits( HDC16 hdc, - WORD xDest, WORD yDest, WORD wDestWidth, WORD wDestHeight, - WORD xSrc, WORD ySrc, WORD wSrcWidth, WORD wSrcHeight, - LPSTR bits, LPBITMAPINFO info, WORD wUsage, DWORD dwRop ) +INT16 StretchDIBits16( HDC16 hdc, INT16 xDst, INT16 yDst, INT16 widthDst, + INT16 heightDst, INT16 xSrc, INT16 ySrc, INT16 widthSrc, + INT16 heightSrc, const VOID *bits, + const BITMAPINFO *info, UINT16 wUsage, DWORD dwRop ) { - HBITMAP16 hBitmap, hOldBitmap; - HDC16 hdcMem; + return (INT16)StretchDIBits32( hdc, xDst, yDst, widthDst, heightDst, + xSrc, ySrc, widthSrc, heightSrc, bits, + info, wUsage, dwRop ); +} + + +/*********************************************************************** + * StretchDIBits32 (GDI32.351) + */ +INT32 StretchDIBits32( HDC32 hdc, INT32 xDst, INT32 yDst, INT32 widthDst, + INT32 heightDst, INT32 xSrc, INT32 ySrc, INT32 widthSrc, + INT32 heightSrc, const void *bits, + const BITMAPINFO *info, UINT32 wUsage, DWORD dwRop ) +{ + HBITMAP32 hBitmap, hOldBitmap; + HDC32 hdcMem; hBitmap = CreateDIBitmap( hdc, &info->bmiHeader, CBM_INIT, bits, info, wUsage ); hdcMem = CreateCompatibleDC( hdc ); hOldBitmap = SelectObject32( hdcMem, hBitmap ); - StretchBlt32( hdc, xDest, yDest, wDestWidth, wDestHeight, - hdcMem, xSrc, ySrc, wSrcWidth, wSrcHeight, dwRop ); + StretchBlt32( hdc, xDst, yDst, widthDst, heightDst, + hdcMem, xSrc, ySrc, widthSrc, heightSrc, dwRop ); SelectObject32( hdcMem, hOldBitmap ); DeleteDC( hdcMem ); DeleteObject32( hBitmap ); - return wSrcHeight; + return heightSrc; } diff --git a/objects/font.c b/objects/font.c index 061e5cc234c..784cb2f5b1c 100644 --- a/objects/font.c +++ b/objects/font.c @@ -320,7 +320,9 @@ void FONT_GetMetrics( LOGFONT16 * logfont, XFontStruct * xfont, metrics->tmDigitizedAspectX = 1; metrics->tmDigitizedAspectY = 1; metrics->tmPitchAndFamily = (logfont->lfPitchAndFamily&0xf0)|TMPF_DEVICE; - if (logfont->lfPitchAndFamily & FIXED_PITCH) + + /* TMPF_FIXED_PITCH bit means variable pitch...Don't you love Microsoft? */ + if (xfont->min_bounds.width != xfont->max_bounds.width) metrics->tmPitchAndFamily |= TMPF_FIXED_PITCH; if (!xfont->per_char) average = metrics->tmMaxCharWidth; @@ -827,6 +829,10 @@ DWORD GetTextExtent( HDC16 hdc, LPCSTR str, short count ) /*********************************************************************** * GetTextExtentPoint16 (GDI.471) + * + * FIXME: Should this have a bug for compatibility? + * Original Windows versions of GetTextExtentPoint{A,W} have documented + * bugs. */ BOOL16 GetTextExtentPoint16( HDC16 hdc, LPCSTR str, INT16 count, LPSIZE16 size) { @@ -838,7 +844,7 @@ BOOL16 GetTextExtentPoint16( HDC16 hdc, LPCSTR str, INT16 count, LPSIZE16 size) /*********************************************************************** - * GetTextExtentPoint32A (GDI32.232) + * GetTextExtentPoint32A (GDI32.230) */ BOOL32 GetTextExtentPoint32A( HDC32 hdc, LPCSTR str, INT32 count, LPSIZE32 size ) @@ -861,7 +867,7 @@ BOOL32 GetTextExtentPoint32A( HDC32 hdc, LPCSTR str, INT32 count, /*********************************************************************** - * GetTextExtentPoint32W (GDI32.233) + * GetTextExtentPoint32W (GDI32.231) */ BOOL32 GetTextExtentPoint32W( HDC32 hdc, LPCWSTR str, INT32 count, LPSIZE32 size ) @@ -872,6 +878,26 @@ BOOL32 GetTextExtentPoint32W( HDC32 hdc, LPCWSTR str, INT32 count, return ret; } +/*********************************************************************** + * GetTextExtentPoint32ABuggy (GDI32.232) + */ +BOOL32 GetTextExtentPoint32ABuggy( HDC32 hdc, LPCSTR str, INT32 count, + LPSIZE32 size ) +{ + fprintf( stderr, "GetTextExtentPoint32ABuggy: not bug compatible.\n" ); + return GetTextExtentPoint32A( hdc, str, count, size ); +} + +/*********************************************************************** + * GetTextExtentPoint32WBuggy (GDI32.233) + */ +BOOL32 GetTextExtentPoint32WBuggy( HDC32 hdc, LPCWSTR str, INT32 count, + LPSIZE32 size ) +{ + fprintf( stderr, "GetTextExtentPoint32WBuggy: not bug compatible.\n" ); + return GetTextExtentPoint32W( hdc, str, count, size ); +} + /*********************************************************************** * GetTextMetrics16 (GDI.93) diff --git a/objects/metafile.c b/objects/metafile.c index 65e5484a442..d1891bb8f21 100644 --- a/objects/metafile.c +++ b/objects/metafile.c @@ -677,10 +677,10 @@ void PlayMetaFileRecord(HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr, LPBITMAPINFO info = (LPBITMAPINFO) &(mr->rdParam[11]); LPSTR bits = MF_GetDIBitsPointer(info); if (bits) - StretchDIBits(hdc,mr->rdParam[10],mr->rdParam[9],mr->rdParam[8], - mr->rdParam[7],mr->rdParam[6],mr->rdParam[5], - mr->rdParam[4],mr->rdParam[3],bits,info, - mr->rdParam[2],MAKELONG(mr->rdParam[0],mr->rdParam[1])); + StretchDIBits16(hdc,mr->rdParam[10],mr->rdParam[9],mr->rdParam[8], + mr->rdParam[7],mr->rdParam[6],mr->rdParam[5], + mr->rdParam[4],mr->rdParam[3],bits,info, + mr->rdParam[2],MAKELONG(mr->rdParam[0],mr->rdParam[1])); } break; @@ -689,10 +689,10 @@ void PlayMetaFileRecord(HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr, LPBITMAPINFO info = (LPBITMAPINFO) &(mr->rdParam[10]); LPSTR bits = MF_GetDIBitsPointer(info); if (bits) - StretchDIBits(hdc,mr->rdParam[9],mr->rdParam[8],mr->rdParam[7], - mr->rdParam[6],mr->rdParam[5],mr->rdParam[4], - mr->rdParam[3],mr->rdParam[2],bits,info, - DIB_RGB_COLORS,MAKELONG(mr->rdParam[0],mr->rdParam[1])); + StretchDIBits16(hdc,mr->rdParam[9],mr->rdParam[8],mr->rdParam[7], + mr->rdParam[6],mr->rdParam[5],mr->rdParam[4], + mr->rdParam[3],mr->rdParam[2],bits,info, + DIB_RGB_COLORS,MAKELONG(mr->rdParam[0],mr->rdParam[1])); } break; @@ -705,7 +705,7 @@ void PlayMetaFileRecord(HDC16 hdc, HANDLETABLE16 *ht, METARECORD *mr, mr->rdParam[14], /*BitsPixel*/ (LPSTR)&mr->rdParam[15]); /*bits*/ SelectObject32(hdcSrc,hbitmap); - StretchBlt32(hdc,mr->rdParam[9],mr->rdParam[8], + StretchBlt16(hdc,mr->rdParam[9],mr->rdParam[8], mr->rdParam[7],mr->rdParam[6], hdcSrc,mr->rdParam[5],mr->rdParam[4], mr->rdParam[3],mr->rdParam[2], diff --git a/objects/text.c b/objects/text.c index fd2450f699d..13659b2b0a0 100644 --- a/objects/text.c +++ b/objects/text.c @@ -86,19 +86,20 @@ static const char *TEXT_NextLine( HDC16 hdc, const char *str, int *count, case PREFIX: if (!(format & DT_NOPREFIX)) { - prefix_offset = j; - i++; - } - else - { - dest[j++] = str[i++]; - if (!(format & DT_NOCLIP) || (format & DT_WORDBREAK)) - { - if (!GetTextExtentPoint16(hdc, &dest[j-1], 1, &size)) - return NULL; - plen += size.cx; - } + if (str[++i] != PREFIX) + { + prefix_offset = j; + break; + } } + dest[j++] = str[i++]; + if (!(format & DT_NOCLIP) || !(format & DT_NOPREFIX) || + (format & DT_WORDBREAK)) + { + if (!GetTextExtentPoint16(hdc, &dest[j-1], 1, &size)) + return NULL; + plen += size.cx; + } break; case TAB: diff --git a/rc/winerc.c b/rc/winerc.c index 63a9f4e6247..3f9edbe4979 100644 --- a/rc/winerc.c +++ b/rc/winerc.c @@ -53,7 +53,6 @@ int main(int argc,char *argv[]) { extern int yydebug; extern char* optarg; - char* tmpc; int optc,lose,ret,binary; lose=binary=0; while((optc=getopt(argc,argv,"bcdp:vo:w:"))!=EOF) @@ -66,12 +65,7 @@ int main(int argc,char *argv[]) setbuf(stdout,0); setbuf(stderr,0); break; - case 'p':prefix=strdup(optarg); - if(!isalpha(*prefix))*prefix='_'; - for(tmpc=prefix;*tmpc;tmpc++) - if( !isalnum(*tmpc) && *tmpc!='_') - *tmpc='_'; - break; + case 'p':prefix=strdup(optarg); break; case 'c':constant=1;break; case 'v':verbose=1; setbuf(stderr,0); diff --git a/tools/Makefile.in b/tools/Makefile.in index fb8436a7d4a..c1d3f14dc1d 100644 --- a/tools/Makefile.in +++ b/tools/Makefile.in @@ -4,10 +4,10 @@ TOPOBJDIR = .. SRCDIR = @srcdir@ VPATH = @srcdir@ -PROGRAMS = build makedep +PROGRAMS = build makedep fnt2bdf MODULE = none -C_SRCS = build.c makedep.c +C_SRCS = build.c makedep.c fnt2bdf.c all: $(PROGRAMS) @@ -19,4 +19,7 @@ build: build.o makedep: makedep.o $(CC) $(CFLAGS) -o makedep makedep.o +fnt2bdf: fnt2bdf.o + $(CC) $(CFLAGS) -o fnt2bdf fnt2bdf.o + ### Dependencies: diff --git a/tools/build.c b/tools/build.c index 76de29e4757..2381002eeed 100644 --- a/tools/build.c +++ b/tools/build.c @@ -10,6 +10,7 @@ #include #include #include +#include #include "wintypes.h" #include "registers.h" #include "winerror.h" /* for ERROR_CALL_NOT_IMPLEMENTED */ @@ -253,6 +254,12 @@ static char * GetToken(void) return token; } + +/******************************************************************* + * ParseVariable + * + * Parse a variable definition. + */ static int ParseVariable( ORDDEF *odp ) { char *endptr; @@ -264,7 +271,7 @@ static int ParseVariable( ORDDEF *odp ) if (*token != '(') { fprintf(stderr, "%d: Expected '(' got '%s'\n", Line, token); - exit(1); + return -1; } n_values = 0; @@ -288,14 +295,14 @@ static int ParseVariable( ORDDEF *odp ) { fprintf(stderr, "%d: Expected number value, got '%s'\n", Line, token); - exit(1); + return -1; } } if (token == NULL) { fprintf(stderr, "%d: End of file in variable declaration\n", Line); - exit(1); + return -1; } odp->u.var.n_values = n_values; @@ -304,6 +311,12 @@ static int ParseVariable( ORDDEF *odp ) return 0; } + +/******************************************************************* + * ParseExportFunction + * + * Parse a function definition. + */ static int ParseExportFunction( ORDDEF *odp ) { char *token; @@ -315,19 +328,19 @@ static int ParseExportFunction( ORDDEF *odp ) if (odp->type == TYPE_STDCALL) { fprintf( stderr, "%d: 'stdcall' not supported for Win16\n", Line ); - exit(1); + return -1; } if (odp->type == TYPE_CDECL) { fprintf( stderr, "%d: 'cdecl' not supported for Win16\n", Line ); - exit(1); + return -1; } break; case SPEC_WIN32: if ((odp->type == TYPE_PASCAL) || (odp->type == TYPE_PASCAL_16)) { fprintf( stderr, "%d: 'pascal' not supported for Win32\n", Line ); - exit(1); + return -1; } break; default: @@ -338,7 +351,7 @@ static int ParseExportFunction( ORDDEF *odp ) if (*token != '(') { fprintf(stderr, "%d: Expected '(' got '%s'\n", Line, token); - exit(1); + return -1; } for (i = 0; i < sizeof(odp->u.func.arg_types)-1; i++) @@ -358,7 +371,7 @@ static int ParseExportFunction( ORDDEF *odp ) else { fprintf(stderr, "%d: Unknown variable type '%s'\n", Line, token); - exit(1); + return -1; } if (SpecType == SPEC_WIN32) { @@ -366,14 +379,14 @@ static int ParseExportFunction( ORDDEF *odp ) { fprintf( stderr, "%d: Type '%s' not supported for Win32\n", Line, token ); - exit(1); + return -1; } } } if (*token != ')') { fprintf( stderr, "%d: Too many arguments\n", Line ); - exit(1); + return -1; } odp->u.func.arg_types[i] = '\0'; if ((odp->type == TYPE_STDCALL) && !i) @@ -398,7 +411,7 @@ static int ParseEquate( ORDDEF *odp ) { fprintf(stderr, "%d: Expected number value, got '%s'\n", Line, token); - exit(1); + return -1; } odp->u.abs.value = value; @@ -422,7 +435,7 @@ static int ParseReturn( ORDDEF *odp ) { fprintf(stderr, "%d: Expected number value, got '%s'\n", Line, token); - exit(1); + return -1; } token = GetToken(); @@ -431,7 +444,7 @@ static int ParseReturn( ORDDEF *odp ) { fprintf(stderr, "%d: Expected number value, got '%s'\n", Line, token); - exit(1); + return -1; } return 0; @@ -461,7 +474,7 @@ static int ParseExtern( ORDDEF *odp ) if (SpecType == SPEC_WIN16) { fprintf( stderr, "%d: 'extern' not supported for Win16\n", Line ); - exit(1); + return -1; } strcpy( odp->u.ext.link_name, GetToken() ); return 0; @@ -481,7 +494,7 @@ static int ParseOrdinal(int ordinal) if (ordinal >= MAX_ORDINALS) { fprintf(stderr, "%d: Ordinal number too large\n", Line); - exit(1); + return -1; } if (ordinal > Limit) Limit = ordinal; @@ -489,7 +502,7 @@ static int ParseOrdinal(int ordinal) if (!(token = GetToken())) { fprintf(stderr, "%d: Expected type after ordinal\n", Line); - exit(1); + return -1; } for (odp->type = 0; odp->type < TYPE_NBTYPES; odp->type++) @@ -501,13 +514,13 @@ static int ParseOrdinal(int ordinal) fprintf( stderr, "%d: Expected type after ordinal, found '%s' instead\n", Line, token ); - exit(1); + return -1; } if (!(token = GetToken())) { fprintf( stderr, "%d: Expected name after type\n", Line ); - exit(1); + return -1; } strcpy( odp->name, token ); @@ -533,10 +546,16 @@ static int ParseOrdinal(int ordinal) return ParseExtern( odp ); default: fprintf( stderr, "Should not happen\n" ); - exit(1); + return -1; } } + +/******************************************************************* + * ParseTopLevel + * + * Parse a spec file. + */ static int ParseTopLevel(void) { char *token; @@ -556,7 +575,7 @@ static int ParseTopLevel(void) else { fprintf(stderr, "%d: Type must be 'win16' or 'win32'\n", Line); - exit(1); + return -1; } } else if (strcmp(token, "base") == 0) @@ -565,7 +584,7 @@ static int ParseTopLevel(void) if (!IsNumberString(token)) { fprintf(stderr, "%d: Expected number after base\n", Line); - exit(1); + return -1; } Base = atoi(token); } @@ -575,7 +594,7 @@ static int ParseTopLevel(void) if (!IsNumberString(token)) { fprintf(stderr, "%d: Expected number after heap\n", Line); - exit(1); + return -1; } DLLHeapSize = atoi(token); } @@ -592,7 +611,7 @@ static int ParseTopLevel(void) { fprintf(stderr, "%d: Expected name, id, length or ordinal\n", Line); - exit(1); + return -1; } } @@ -633,19 +652,20 @@ static int StoreVariableCode( unsigned char *buffer, int size, ORDDEF *odp ) * * Dump a byte stream into the assembly code. */ -static void DumpBytes( const unsigned char *data, int len, +static void DumpBytes( FILE *outfile, const unsigned char *data, int len, const char *section, const char *label_start ) { int i; - if (section) printf( "\t%s\n", section ); - if (label_start) printf( "%s:\n", label_start ); + if (section) fprintf( outfile, "\t%s\n", section ); + if (label_start) fprintf( outfile, "%s:\n", label_start ); for (i = 0; i < len; i++) { - if (!(i & 0x0f)) printf( "\t.byte " ); - printf( "%d", *data++ ); - if (i < len - 1) printf( "%c", ((i & 0x0f) != 0x0f) ? ',' : '\n' ); + if (!(i & 0x0f)) fprintf( outfile, "\t.byte " ); + fprintf( outfile, "%d", *data++ ); + if (i < len - 1) + fprintf( outfile, "%c", ((i & 0x0f) != 0x0f) ? ',' : '\n' ); } - printf( "\n" ); + fprintf( outfile, "\n" ); } @@ -655,7 +675,8 @@ static void DumpBytes( const unsigned char *data, int len, * Build the in-memory representation of a 16-bit NE module, and dump it * as a byte stream into the assembly code. */ -static int BuildModule16( int max_code_offset, int max_data_offset ) +static int BuildModule16( FILE *outfile, int max_code_offset, + int max_data_offset ) { ORDDEF *odp; int i; @@ -830,7 +851,7 @@ static int BuildModule16( int max_code_offset, int max_data_offset ) /* Dump the module content */ - DumpBytes( (char *)pModule, (int)pstr - (int)pModule, + DumpBytes( outfile, (char *)pModule, (int)pstr - (int)pModule, ".data", "Module_Start" ); return (int)pstr - (int)pModule; } @@ -842,7 +863,7 @@ static int BuildModule16( int max_code_offset, int max_data_offset ) * Build the in-memory representation of a 32-bit pseudo-NE module, and dump it * as a byte stream into the assembly code. */ -static int BuildModule32(void) +static int BuildModule32( FILE *outfile ) { char *buffer; NE_MODULE *pModule; @@ -940,27 +961,27 @@ static int BuildModule32(void) /* Dump the module content */ - DumpBytes( (char *)pModule, (int)pstr - (int)pModule, + DumpBytes( outfile, (char *)pModule, (int)pstr - (int)pModule, ".data", "Module_Start" ); return (int)pstr - (int)pModule; } /******************************************************************* - * BuildSpec32Files + * BuildSpec32File * * Build a Win32 assembly file from a spec file. */ -static void BuildSpec32Files(void) +static int BuildSpec32File( FILE *outfile ) { ORDDEF *odp; int i, module_size, len; char buffer[1024]; - printf( "/* File generated automatically; do not edit! */\n" ); - printf( "\t.text\n" ); - printf( "\t.align 4\n" ); - printf( "Code_Start:\n\n" ); + fprintf( outfile, "/* File generated automatically; do not edit! */\n" ); + fprintf( outfile, "\t.text\n" ); + fprintf( outfile, "\t.align 4\n" ); + fprintf( outfile, "Code_Start:\n\n" ); odp = OrdinalDefinitions; for (i = 0; i <= Limit; i++, odp++) @@ -974,62 +995,59 @@ static void BuildSpec32Files(void) case TYPE_CDECL: case TYPE_STUB: case TYPE_REGISTER: - printf( "/* %s.%d (%s) */\n", - DLLName, i, odp->name); - printf( "%s_%d:\n", DLLName, i ); - printf( "\tpushl %%ebp\n" ); - printf( "\tpushl $" PREFIX "%s\n", odp->u.func.link_name ); - printf( "\tcall " PREFIX "CallFrom32_%s_%d\n", - (odp->type == TYPE_REGISTER) ? "regs" : - ((odp->type == TYPE_STDCALL) ? "stdcall" : "cdecl"), - strlen(odp->u.func.arg_types)); - printf( "\tnop\n" ); + fprintf( outfile, "/* %s.%d (%s) */\n", DLLName, i, odp->name); + fprintf( outfile, "%s_%d:\n", DLLName, i ); + fprintf( outfile, "\tpushl %%ebp\n" ); + fprintf( outfile, "\tpushl $" PREFIX "%s\n",odp->u.func.link_name); + fprintf( outfile, "\tcall " PREFIX "CallFrom32_%s_%d\n", + (odp->type == TYPE_REGISTER) ? "regs" : + ((odp->type == TYPE_STDCALL) ? "stdcall" : "cdecl"), + strlen(odp->u.func.arg_types)); + fprintf( outfile, "\tnop\n" ); break; case TYPE_RETURN: - printf( "/* %s.%d (%s) */\n", - DLLName, i, odp->name); - printf( "%s_%d:\n", DLLName, i ); - printf( "\tmovl $%d,%%eax\n", ERROR_CALL_NOT_IMPLEMENTED ); - printf( "\tmovl %%eax," PREFIX "WIN32_LastError\n" ); - printf( "\tmovl $%d,%%eax\n", odp->u.ret.ret_value ); + fprintf( outfile, "/* %s.%d (%s) */\n", DLLName, i, odp->name); + fprintf( outfile, "%s_%d:\n", DLLName, i ); + fprintf( outfile, "\tmovl $%d,%%eax\n",ERROR_CALL_NOT_IMPLEMENTED); + fprintf( outfile, "\tmovl %%eax," PREFIX "WIN32_LastError\n" ); + fprintf( outfile, "\tmovl $%d,%%eax\n", odp->u.ret.ret_value ); if (odp->u.ret.arg_size) { - printf( "\tret $%d\n", odp->u.ret.arg_size ); - printf( "\tnop\n" ); - printf( "\tnop\n" ); + fprintf( outfile, "\tret $%d\n", odp->u.ret.arg_size ); + fprintf( outfile, "\tnop\n" ); + fprintf( outfile, "\tnop\n" ); } - else printf( "\tret\n" ); + else fprintf( outfile, "\tret\n" ); break; case TYPE_BYTE: - printf( "/* %s.%d (%s) */\n", - DLLName, i, odp->name); - printf( "\t.data\n" ); - printf( "%s_%d:\n", DLLName, i ); + fprintf( outfile, "/* %s.%d (%s) */\n", DLLName, i, odp->name); + fprintf( outfile, "\t.data\n" ); + fprintf( outfile, "%s_%d:\n", DLLName, i ); len = StoreVariableCode( buffer, 1, odp ); - DumpBytes( buffer, len, NULL, NULL ); - printf( "\t.text\n" ); + DumpBytes( outfile, buffer, len, NULL, NULL ); + fprintf( outfile, "\t.text\n" ); break; case TYPE_WORD: - printf( "/* %s.%d (%s) */\n", + fprintf( outfile, "/* %s.%d (%s) */\n", DLLName, i, odp->name); - printf( "\t.data\n" ); - printf( "%s_%d:\n", DLLName, i ); + fprintf( outfile, "\t.data\n" ); + fprintf( outfile, "%s_%d:\n", DLLName, i ); len = StoreVariableCode( buffer, 2, odp ); - DumpBytes( buffer, len, NULL, NULL ); - printf( "\t.text\n" ); + DumpBytes( outfile, buffer, len, NULL, NULL ); + fprintf( outfile, "\t.text\n" ); break; case TYPE_LONG: - printf( "/* %s.%d (%s) */\n", + fprintf( outfile, "/* %s.%d (%s) */\n", DLLName, i, odp->name); - printf( "\t.data\n" ); - printf( "%s_%d:\n", DLLName, i ); + fprintf( outfile, "\t.data\n" ); + fprintf( outfile, "%s_%d:\n", DLLName, i ); len = StoreVariableCode( buffer, 4, odp ); - DumpBytes( buffer, len, NULL, NULL ); - printf( "\t.text\n" ); + DumpBytes( outfile, buffer, len, NULL, NULL ); + fprintf( outfile, "\t.text\n" ); break; case TYPE_EXTERN: @@ -1038,42 +1056,42 @@ static void BuildSpec32Files(void) default: fprintf(stderr,"build: function type %d not available for Win32\n", odp->type); - exit(1); + return -1; } } - module_size = BuildModule32(); + module_size = BuildModule32( outfile ); /* Output the DLL functions table */ - printf( "\t.text\n" ); - printf( "\t.align 4\n" ); - printf( "Functions:\n" ); + fprintf( outfile, "\t.text\n" ); + fprintf( outfile, "\t.align 4\n" ); + fprintf( outfile, "Functions:\n" ); odp = OrdinalDefinitions; for (i = 0; i <= Limit; i++, odp++) { switch(odp->type) { case TYPE_INVALID: - printf( "\t.long 0\n" ); + fprintf( outfile, "\t.long 0\n" ); break; case TYPE_EXTERN: - printf( "\t.long " PREFIX "%s\n", odp->u.ext.link_name ); + fprintf( outfile, "\t.long " PREFIX "%s\n", odp->u.ext.link_name ); break; default: - printf( "\t.long %s_%d\n", DLLName, i ); + fprintf( outfile, "\t.long %s_%d\n", DLLName, i ); break; } } /* Output the DLL names table */ - printf( "FuncNames:\n" ); + fprintf( outfile, "FuncNames:\n" ); odp = OrdinalDefinitions; for (i = 0; i <= Limit; i++, odp++) { - if (odp->type == TYPE_INVALID) printf( "\t.long 0\n" ); - else printf( "\t.long Name_%d\n", i ); + if (odp->type == TYPE_INVALID) fprintf( outfile, "\t.long 0\n" ); + else fprintf( outfile, "\t.long Name_%d\n", i ); } /* Output the DLL names */ @@ -1081,32 +1099,33 @@ static void BuildSpec32Files(void) for (i = 0, odp = OrdinalDefinitions; i <= Limit; i++, odp++) { if (odp->type != TYPE_INVALID) - printf( "Name_%d:\t.ascii \"%s\\0\"\n", i, odp->name ); + fprintf( outfile, "Name_%d:\t.ascii \"%s\\0\"\n", i, odp->name ); } /* Output the DLL descriptor */ - printf( "DLLName:\t.ascii \"%s\\0\"\n", DLLName ); - printf( "\t.align 4\n" ); - printf( "\t.globl " PREFIX "%s_Descriptor\n", DLLName ); - printf( PREFIX "%s_Descriptor:\n", DLLName ); - printf( "\t.long DLLName\n" ); /* Name */ - printf( "\t.long Module_Start\n" ); /* Module start */ - printf( "\t.long %d\n", module_size ); /* Module size */ - printf( "\t.long %d\n", Base ); /* Base */ - printf( "\t.long %d\n", Limit+1 ); /* Size */ - printf( "\t.long Code_Start\n" ); /* Code start */ - printf( "\t.long Functions\n" ); /* Functions */ - printf( "\t.long FuncNames\n" ); /* Function names */ + fprintf( outfile, "DLLName:\t.ascii \"%s\\0\"\n", DLLName ); + fprintf( outfile, "\t.align 4\n" ); + fprintf( outfile, "\t.globl " PREFIX "%s_Descriptor\n", DLLName ); + fprintf( outfile, PREFIX "%s_Descriptor:\n", DLLName ); + fprintf( outfile, "\t.long DLLName\n" ); /* Name */ + fprintf( outfile, "\t.long Module_Start\n" ); /* Module start */ + fprintf( outfile, "\t.long %d\n", module_size ); /* Module size */ + fprintf( outfile, "\t.long %d\n", Base ); /* Base */ + fprintf( outfile, "\t.long %d\n", Limit+1 ); /* Size */ + fprintf( outfile, "\t.long Code_Start\n" ); /* Code start */ + fprintf( outfile, "\t.long Functions\n" ); /* Functions */ + fprintf( outfile, "\t.long FuncNames\n" ); /* Function names */ + return 0; } /******************************************************************* - * BuildSpec16Files + * BuildSpec16File * * Build a Win16 assembly file from a spec file. */ -static void BuildSpec16Files(void) +static int BuildSpec16File( FILE *outfile ) { ORDDEF *odp; int i; @@ -1117,9 +1136,9 @@ static void BuildSpec16Files(void) memset( data, 0, 16 ); data_offset = 16; - printf( "/* File generated automatically; do not edit! */\n" ); - printf( "\t.text\n" ); - printf( "Code_Start:\n" ); + fprintf( outfile, "/* File generated automatically; do not edit! */\n" ); + fprintf( outfile, "\t.text\n" ); + fprintf( outfile, "Code_Start:\n" ); code_offset = 0; odp = OrdinalDefinitions; @@ -1151,17 +1170,17 @@ static void BuildSpec16Files(void) break; case TYPE_RETURN: - printf( "/* %s.%d */\n", DLLName, i); - printf( "\tmovw $%d,%%ax\n", LOWORD(odp->u.ret.ret_value) ); - printf( "\tmovw $%d,%%dx\n", HIWORD(odp->u.ret.ret_value) ); - printf( "\t.byte 0x66\n"); + fprintf( outfile,"/* %s.%d */\n", DLLName, i); + fprintf( outfile,"\tmovw $%d,%%ax\n",LOWORD(odp->u.ret.ret_value)); + fprintf( outfile,"\tmovw $%d,%%dx\n",HIWORD(odp->u.ret.ret_value)); + fprintf( outfile,"\t.byte 0x66\n"); if (odp->u.ret.arg_size != 0) - printf( "\tlret $%d\n\n", odp->u.ret.arg_size); + fprintf( outfile, "\tlret $%d\n\n", odp->u.ret.arg_size); else { - printf( "\tlret\n"); - printf( "\tnop\n"); - printf( "\tnop\n\n"); + fprintf( outfile, "\tlret\n"); + fprintf( outfile, "\tnop\n"); + fprintf( outfile, "\tnop\n\n"); } odp->offset = code_offset; code_offset += 12; /* Assembly code is 12 bytes long */ @@ -1171,19 +1190,19 @@ static void BuildSpec16Files(void) case TYPE_PASCAL: case TYPE_PASCAL_16: case TYPE_STUB: - printf( "/* %s.%d */\n", DLLName, i); - printf( "\tpushw %%bp\n" ); - printf( "\tpushl $" PREFIX "%s\n", odp->u.func.link_name ); + fprintf( outfile, "/* %s.%d */\n", DLLName, i); + fprintf( outfile, "\tpushw %%bp\n" ); + fprintf( outfile, "\tpushl $" PREFIX "%s\n",odp->u.func.link_name); /* FreeBSD does not understand lcall, so do it the hard way */ - printf( "\t.byte 0x9a /*lcall*/\n" ); - printf( "\t.long " PREFIX "CallFrom16_%s_%s\n", - (odp->type == TYPE_REGISTER) ? "regs" : - (odp->type == TYPE_PASCAL) ? "long" : "word", - odp->u.func.arg_types ); - printf( "\t.byte 0x%02x,0x%02x\n", /* Some asms don't have .word */ - LOBYTE(WINE_CODE_SELECTOR), HIBYTE(WINE_CODE_SELECTOR) ); - printf( "\tnop\n" ); - printf( "\tnop\n\n" ); + fprintf( outfile, "\t.byte 0x9a /*lcall*/\n" ); + fprintf( outfile, "\t.long " PREFIX "CallFrom16_%s_%s\n", + (odp->type == TYPE_REGISTER) ? "regs" : + (odp->type == TYPE_PASCAL) ? "long" : "word", + odp->u.func.arg_types ); + fprintf( outfile,"\t.byte 0x%02x,0x%02x\n", /* Some asms don't have .word */ + LOBYTE(WINE_CODE_SELECTOR), HIBYTE(WINE_CODE_SELECTOR) ); + fprintf( outfile, "\tnop\n" ); + fprintf( outfile, "\tnop\n\n" ); odp->offset = code_offset; code_offset += 16; /* Assembly code is 16 bytes long */ break; @@ -1191,65 +1210,65 @@ static void BuildSpec16Files(void) default: fprintf(stderr,"build: function type %d not available for Win16\n", odp->type); - exit(1); + return -1; } } if (!code_offset) /* Make sure the code segment is not empty */ { - printf( "\t.byte 0\n" ); + fprintf( outfile, "\t.byte 0\n" ); code_offset++; } /* Output data segment */ - DumpBytes( data, data_offset, NULL, "Data_Start" ); + DumpBytes( outfile, data, data_offset, NULL, "Data_Start" ); /* Build the module */ - module_size = BuildModule16( code_offset, data_offset ); + module_size = BuildModule16( outfile, code_offset, data_offset ); /* Output the DLL descriptor */ - printf( "\t.text\n" ); - printf( "DLLName:\t.ascii \"%s\\0\"\n", DLLName ); - printf( "\t.align 4\n" ); - printf( "\t.globl " PREFIX "%s_Descriptor\n", DLLName ); - printf( PREFIX "%s_Descriptor:\n", DLLName ); - printf( "\t.long DLLName\n" ); /* Name */ - printf( "\t.long Module_Start\n" ); /* Module start */ - printf( "\t.long %d\n", module_size ); /* Module size */ - printf( "\t.long Code_Start\n" ); /* Code start */ - printf( "\t.long Data_Start\n" ); /* Data start */ + fprintf( outfile, "\t.text\n" ); + fprintf( outfile, "DLLName:\t.ascii \"%s\\0\"\n", DLLName ); + fprintf( outfile, "\t.align 4\n" ); + fprintf( outfile, "\t.globl " PREFIX "%s_Descriptor\n", DLLName ); + fprintf( outfile, PREFIX "%s_Descriptor:\n", DLLName ); + fprintf( outfile, "\t.long DLLName\n" ); /* Name */ + fprintf( outfile, "\t.long Module_Start\n" ); /* Module start */ + fprintf( outfile, "\t.long %d\n", module_size ); /* Module size */ + fprintf( outfile, "\t.long Code_Start\n" ); /* Code start */ + fprintf( outfile, "\t.long Data_Start\n" ); /* Data start */ + return 0; } /******************************************************************* - * BuildSpecFiles + * BuildSpecFile * * Build an assembly file from a spec file. */ -static void BuildSpecFiles( char *specname ) +static int BuildSpecFile( FILE *outfile, char *specname ) { SpecFp = fopen( specname, "r"); if (SpecFp == NULL) { fprintf(stderr, "Could not open specification file, '%s'\n", specname); - exit(1); + return -1; } - ParseTopLevel(); + if (ParseTopLevel() < 0) return -1; + switch(SpecType) { - case SPEC_INVALID: - fprintf( stderr, "%s: Missing 'type' declaration\n", specname ); - exit(1); case SPEC_WIN16: - BuildSpec16Files(); - break; + return BuildSpec16File( outfile ); case SPEC_WIN32: - BuildSpec32Files(); - break; + return BuildSpec32File( outfile ); + default: + fprintf( stderr, "%s: Missing 'type' declaration\n", specname ); + return -1; } } @@ -1273,65 +1292,62 @@ static void BuildSpecFiles( char *specname ) * (ebp+4) ret addr * (ebp) ebp */ -static void BuildCall32LargeStack(void) +static void BuildCall32LargeStack( FILE *outfile ) { /* Function header */ - printf( "/**********\n" ); - printf( " * " PREFIX "CallTo32_LargeStack\n" ); - printf( " **********/\n" ); - printf( "\t.align 4\n" ); - printf( "\t.globl " PREFIX "CallTo32_LargeStack\n\n" ); - printf( PREFIX "CallTo32_LargeStack:\n" ); + fprintf( outfile, "\n\t.align 4\n" ); + fprintf( outfile, "\t.globl " PREFIX "CallTo32_LargeStack\n" ); + fprintf( outfile, PREFIX "CallTo32_LargeStack:\n" ); /* Entry code */ - printf( "\tpushl %%ebp\n" ); - printf( "\tmovl %%esp,%%ebp\n" ); + fprintf( outfile, "\tpushl %%ebp\n" ); + fprintf( outfile, "\tmovl %%esp,%%ebp\n" ); /* Save registers */ - printf( "\tpushl %%ecx\n" ); - printf( "\tpushl %%esi\n" ); - printf( "\tpushl %%edi\n" ); + fprintf( outfile, "\tpushl %%ecx\n" ); + fprintf( outfile, "\tpushl %%esi\n" ); + fprintf( outfile, "\tpushl %%edi\n" ); /* Retrieve the original 32-bit stack pointer and switch to it if any */ - printf( "\tmovl " PREFIX "IF1632_Original32_esp, %%eax\n" ); - printf( "\torl %%eax,%%eax\n" ); - printf( "\tje no_orig_esp\n" ); - printf( "\tmovl %%eax,%%esp\n" ); - printf( "no_orig_esp:\n" ); + fprintf( outfile, "\tmovl " PREFIX "IF1632_Original32_esp, %%eax\n" ); + fprintf( outfile, "\torl %%eax,%%eax\n" ); + fprintf( outfile, "\tje no_orig_esp\n" ); + fprintf( outfile, "\tmovl %%eax,%%esp\n" ); + fprintf( outfile, "no_orig_esp:\n" ); /* Transfer the arguments */ - printf( "\tmovl 12(%%ebp),%%ecx\n" ); - printf( "\torl %%ecx,%%ecx\n" ); - printf( "\tje no_args\n" ); - printf( "\tleal 16(%%ebp),%%esi\n" ); - printf( "\tshll $2,%%ecx\n" ); - printf( "\tsubl %%ecx,%%esp\n" ); - printf( "\tmovl %%esp,%%edi\n" ); - printf( "\tshrl $2,%%ecx\n" ); - printf( "\tcld\n" ); - printf( "\trep; movsl\n" ); - printf( "no_args:\n" ); + fprintf( outfile, "\tmovl 12(%%ebp),%%ecx\n" ); + fprintf( outfile, "\torl %%ecx,%%ecx\n" ); + fprintf( outfile, "\tje no_args\n" ); + fprintf( outfile, "\tleal 16(%%ebp),%%esi\n" ); + fprintf( outfile, "\tshll $2,%%ecx\n" ); + fprintf( outfile, "\tsubl %%ecx,%%esp\n" ); + fprintf( outfile, "\tmovl %%esp,%%edi\n" ); + fprintf( outfile, "\tshrl $2,%%ecx\n" ); + fprintf( outfile, "\tcld\n" ); + fprintf( outfile, "\trep; movsl\n" ); + fprintf( outfile, "no_args:\n" ); /* Call the function */ - printf( "\tcall 8(%%ebp)\n" ); + fprintf( outfile, "\tcall 8(%%ebp)\n" ); /* Switch back to the normal stack */ - printf( "\tleal -12(%%ebp),%%esp\n" ); + fprintf( outfile, "\tleal -12(%%ebp),%%esp\n" ); /* Restore registers and return */ - printf( "\tpopl %%edi\n" ); - printf( "\tpopl %%esi\n" ); - printf( "\tpopl %%ecx\n" ); - printf( "\tpopl %%ebp\n" ); - printf( "\tret\n" ); + fprintf( outfile, "\tpopl %%edi\n" ); + fprintf( outfile, "\tpopl %%esi\n" ); + fprintf( outfile, "\tpopl %%ecx\n" ); + fprintf( outfile, "\tpopl %%ebp\n" ); + fprintf( outfile, "\tret\n" ); } @@ -1347,17 +1363,17 @@ static void BuildCall32LargeStack(void) * (bp+2) ip * (bp) bp */ -static int TransferArgs16To32( char *args ) +static int TransferArgs16To32( FILE *outfile, char *args ) { int i, pos16, pos32; /* Save ebx first */ - printf( "\tpushl %%ebx\n" ); + fprintf( outfile, "\tpushl %%ebx\n" ); /* Get the 32-bit stack pointer */ - printf( "\tmovl " PREFIX "IF1632_Saved32_esp,%%ebx\n" ); + fprintf( outfile, "\tmovl " PREFIX "IF1632_Saved32_esp,%%ebx\n" ); /* Copy the arguments */ @@ -1370,33 +1386,33 @@ static int TransferArgs16To32( char *args ) switch(args[i-1]) { case 'w': /* word */ - printf( "\tmovzwl %d(%%ebp),%%eax\n", pos16 ); - printf( "\tmovl %%eax,%d(%%ebx)\n", pos32 ); + fprintf( outfile, "\tmovzwl %d(%%ebp),%%eax\n", pos16 ); + fprintf( outfile, "\tmovl %%eax,%d(%%ebx)\n", pos32 ); pos16 += 2; break; case 's': /* s_word */ - printf( "\tmovswl %d(%%ebp),%%eax\n", pos16 ); - printf( "\tmovl %%eax,%d(%%ebx)\n", pos32 ); + fprintf( outfile, "\tmovswl %d(%%ebp),%%eax\n", pos16 ); + fprintf( outfile, "\tmovl %%eax,%d(%%ebx)\n", pos32 ); pos16 += 2; break; case 'l': /* long */ - printf( "\tmovl %d(%%ebp),%%eax\n", pos16 ); - printf( "\tmovl %%eax,%d(%%ebx)\n", pos32 ); + fprintf( outfile, "\tmovl %d(%%ebp),%%eax\n", pos16 ); + fprintf( outfile, "\tmovl %%eax,%d(%%ebx)\n", pos32 ); pos16 += 4; break; case 'p': /* ptr */ /* Get the selector */ - printf( "\tmovw %d(%%ebp),%%ax\n", pos16 + 2 ); + fprintf( outfile, "\tmovw %d(%%ebp),%%ax\n", pos16 + 2 ); /* Get the selector base */ - printf( "\tandl $0xfff8,%%eax\n" ); - printf( "\tmovl " PREFIX "ldt_copy(%%eax),%%eax\n" ); - printf( "\tmovl %%eax,%d(%%ebx)\n", pos32 ); + fprintf( outfile, "\tandl $0xfff8,%%eax\n" ); + fprintf( outfile, "\tmovl " PREFIX "ldt_copy(%%eax),%%eax\n" ); + fprintf( outfile, "\tmovl %%eax,%d(%%ebx)\n", pos32 ); /* Add the offset */ - printf( "\tmovzwl %d(%%ebp),%%eax\n", pos16 ); - printf( "\taddl %%eax,%d(%%ebx)\n", pos32 ); + fprintf( outfile, "\tmovzwl %d(%%ebp),%%eax\n", pos16 ); + fprintf( outfile, "\taddl %%eax,%d(%%ebx)\n", pos32 ); pos16 += 4; break; @@ -1407,7 +1423,7 @@ static int TransferArgs16To32( char *args ) /* Restore ebx */ - printf( "\tpopl %%ebx\n" ); + fprintf( outfile, "\tpopl %%ebx\n" ); return pos16 - 6; /* Return the size of the 16-bit args */ } @@ -1420,30 +1436,30 @@ static int TransferArgs16To32( char *args ) * The only valid registers in the context structure are: * eax, ebx, ecx, edx, esi, edi, ds, es, (some of the) flags */ -static void BuildContext16(void) +static void BuildContext16( FILE *outfile ) { /* Save ebx first */ - printf( "\tpushl %%ebx\n" ); + fprintf( outfile, "\tpushl %%ebx\n" ); /* Get the 32-bit stack pointer */ - printf( "\tmovl " PREFIX "IF1632_Saved32_esp,%%ebx\n" ); + fprintf( outfile, "\tmovl " PREFIX "IF1632_Saved32_esp,%%ebx\n" ); /* Store the registers */ - printf( "\tpopl %d(%%ebx)\n", SIGCONTEXTOFFSET(EBX) ); /* Get ebx from stack*/ - printf( "\tmovl %%eax,%d(%%ebx)\n", SIGCONTEXTOFFSET(EAX) ); - printf( "\tmovl %%ecx,%d(%%ebx)\n", SIGCONTEXTOFFSET(ECX) ); - printf( "\tmovl %%edx,%d(%%ebx)\n", SIGCONTEXTOFFSET(EDX) ); - printf( "\tmovl %%esi,%d(%%ebx)\n", SIGCONTEXTOFFSET(ESI) ); - printf( "\tmovl %%edi,%d(%%ebx)\n", SIGCONTEXTOFFSET(EDI) ); - printf( "\tmovw -10(%%ebp),%%ax\n" ); /* Get saved ds from stack */ - printf( "\tmovw %%ax,%d(%%ebx)\n", SIGCONTEXTOFFSET(DS) ); - printf( "\tmovw -6(%%ebp),%%ax\n" ); /* Get saved es from stack */ - printf( "\tmovw %%ax,%d(%%ebx)\n", SIGCONTEXTOFFSET(ES) ); - printf( "\tpushfl\n" ); - printf( "\tpopl %d(%%ebx)\n", SIGCONTEXTOFFSET(EFL) ); + fprintf( outfile, "\tpopl %d(%%ebx)\n", SIGCONTEXTOFFSET(EBX) ); /* Get ebx from stack*/ + fprintf( outfile, "\tmovl %%eax,%d(%%ebx)\n", SIGCONTEXTOFFSET(EAX) ); + fprintf( outfile, "\tmovl %%ecx,%d(%%ebx)\n", SIGCONTEXTOFFSET(ECX) ); + fprintf( outfile, "\tmovl %%edx,%d(%%ebx)\n", SIGCONTEXTOFFSET(EDX) ); + fprintf( outfile, "\tmovl %%esi,%d(%%ebx)\n", SIGCONTEXTOFFSET(ESI) ); + fprintf( outfile, "\tmovl %%edi,%d(%%ebx)\n", SIGCONTEXTOFFSET(EDI) ); + fprintf( outfile, "\tmovw -10(%%ebp),%%ax\n" ); /*Get saved ds from stack*/ + fprintf( outfile, "\tmovw %%ax,%d(%%ebx)\n", SIGCONTEXTOFFSET(DS) ); + fprintf( outfile, "\tmovw -6(%%ebp),%%ax\n" ); /*Get saved es from stack*/ + fprintf( outfile, "\tmovw %%ax,%d(%%ebx)\n", SIGCONTEXTOFFSET(ES) ); + fprintf( outfile, "\tpushfl\n" ); + fprintf( outfile, "\tpopl %d(%%ebx)\n", SIGCONTEXTOFFSET(EFL) ); } @@ -1452,26 +1468,26 @@ static void BuildContext16(void) * * Restore the registers from the context structure */ -static void RestoreContext16(void) +static void RestoreContext16( FILE *outfile ) { /* Get the 32-bit stack pointer */ - printf( "\tmovl " PREFIX "IF1632_Saved32_esp,%%ebx\n" ); + fprintf( outfile, "\tmovl " PREFIX "IF1632_Saved32_esp,%%ebx\n" ); /* Restore the registers */ - printf( "\tmovl %d(%%ebx),%%ecx\n", SIGCONTEXTOFFSET(ECX) ); - printf( "\tmovl %d(%%ebx),%%edx\n", SIGCONTEXTOFFSET(EDX) ); - printf( "\tmovl %d(%%ebx),%%esi\n", SIGCONTEXTOFFSET(ESI) ); - printf( "\tmovl %d(%%ebx),%%edi\n", SIGCONTEXTOFFSET(EDI) ); - printf( "\tpopl %%eax\n" ); /* Remove old ds and ip from stack */ - printf( "\tpopl %%eax\n" ); /* Remove old cs and es from stack */ - printf( "\tpushw %d(%%ebx)\n", SIGCONTEXTOFFSET(DS) ); /* Push new ds */ - printf( "\tpushw %d(%%ebx)\n", SIGCONTEXTOFFSET(ES) ); /* Push new es */ - printf( "\tpushl %d(%%ebx)\n", SIGCONTEXTOFFSET(EFL) ); - printf( "\tpopfl\n" ); - printf( "\tmovl %d(%%ebx),%%eax\n", SIGCONTEXTOFFSET(EAX) ); - printf( "\tmovl %d(%%ebx),%%ebx\n", SIGCONTEXTOFFSET(EBX) ); + fprintf( outfile, "\tmovl %d(%%ebx),%%ecx\n", SIGCONTEXTOFFSET(ECX) ); + fprintf( outfile, "\tmovl %d(%%ebx),%%edx\n", SIGCONTEXTOFFSET(EDX) ); + fprintf( outfile, "\tmovl %d(%%ebx),%%esi\n", SIGCONTEXTOFFSET(ESI) ); + fprintf( outfile, "\tmovl %d(%%ebx),%%edi\n", SIGCONTEXTOFFSET(EDI) ); + fprintf( outfile, "\tpopl %%eax\n" ); /* Remove old ds and ip from stack */ + fprintf( outfile, "\tpopl %%eax\n" ); /* Remove old cs and es from stack */ + fprintf( outfile, "\tpushw %d(%%ebx)\n", SIGCONTEXTOFFSET(DS) ); /* Push new ds */ + fprintf( outfile, "\tpushw %d(%%ebx)\n", SIGCONTEXTOFFSET(ES) ); /*Push new es */ + fprintf( outfile, "\tpushl %d(%%ebx)\n", SIGCONTEXTOFFSET(EFL) ); + fprintf( outfile, "\tpopfl\n" ); + fprintf( outfile, "\tmovl %d(%%ebx),%%eax\n", SIGCONTEXTOFFSET(EAX) ); + fprintf( outfile, "\tmovl %d(%%ebx),%%ebx\n", SIGCONTEXTOFFSET(EBX) ); } @@ -1498,7 +1514,7 @@ static void RestoreContext16(void) * (sp) word low word of ip of 16-bit entry point * */ -static void BuildCallFrom16Func( char *profile ) +static void BuildCallFrom16Func( FILE *outfile, char *profile ) { int argsize = 0; int short_ret = 0; @@ -1517,119 +1533,117 @@ static void BuildCallFrom16Func( char *profile ) /* Function header */ - printf( "/**********\n" ); - printf( " * " PREFIX "CallFrom16_%s\n", profile ); - printf( " **********/\n" ); - printf( "\t.align 4\n" ); - printf( "\t.globl " PREFIX "CallFrom16_%s\n\n", profile ); - printf( PREFIX "CallFrom16_%s:\n", profile ); + fprintf( outfile, "\n\t.align 4\n" ); + fprintf( outfile, "\t.globl " PREFIX "CallFrom16_%s\n", profile ); + fprintf( outfile, PREFIX "CallFrom16_%s:\n", profile ); /* Setup bp to point to its copy on the stack */ - printf( "\tmovzwl %%sp,%%ebp\n" ); - printf( "\taddw $12,%%bp\n" ); + fprintf( outfile, "\tmovzwl %%sp,%%ebp\n" ); + fprintf( outfile, "\taddw $12,%%bp\n" ); /* Save 16-bit ds and es */ /* Stupid FreeBSD assembler doesn't know these either */ - /* printf( "\tmovw %%ds,-10(%%ebp)\n" ); */ - printf( "\t.byte 0x66,0x8c,0x5d,0xf6\n" ); - /* printf( "\tmovw %%es,-6(%%ebp)\n" ); */ - printf( "\t.byte 0x66,0x8c,0x45,0xfa\n" ); + /* fprintf( outfile, "\tmovw %%ds,-10(%%ebp)\n" ); */ + fprintf( outfile, "\t.byte 0x66,0x8c,0x5d,0xf6\n" ); + /* fprintf( outfile, "\tmovw %%es,-6(%%ebp)\n" ); */ + fprintf( outfile, "\t.byte 0x66,0x8c,0x45,0xfa\n" ); /* Restore 32-bit ds and es */ - printf( "\tpushl $0x%04x%04x\n", WINE_DATA_SELECTOR, WINE_DATA_SELECTOR ); - printf( "\tpopw %%ds\n" ); - printf( "\tpopw %%es\n" ); + fprintf( outfile, "\tpushl $0x%04x%04x\n", + WINE_DATA_SELECTOR, WINE_DATA_SELECTOR ); + fprintf( outfile, "\tpopw %%ds\n" ); + fprintf( outfile, "\tpopw %%es\n" ); /* Save the 16-bit stack */ - printf( "\tpushw " PREFIX "IF1632_Saved16_sp\n" ); - printf( "\tpushw " PREFIX "IF1632_Saved16_ss\n" ); + fprintf( outfile, "\tpushw " PREFIX "IF1632_Saved16_sp\n" ); + fprintf( outfile, "\tpushw " PREFIX "IF1632_Saved16_ss\n" ); #ifdef __svr4__ - printf("\tdata16\n"); + fprintf( outfile,"\tdata16\n"); #endif - printf( "\tmovw %%ss," PREFIX "IF1632_Saved16_ss\n" ); - printf( "\tmovw %%sp," PREFIX "IF1632_Saved16_sp\n" ); + fprintf( outfile, "\tmovw %%ss," PREFIX "IF1632_Saved16_ss\n" ); + fprintf( outfile, "\tmovw %%sp," PREFIX "IF1632_Saved16_sp\n" ); /* Transfer the arguments */ - if (reg_func) BuildContext16(); - else if (*args) argsize = TransferArgs16To32( args ); + if (reg_func) BuildContext16( outfile ); + else if (*args) argsize = TransferArgs16To32( outfile, args ); /* Get the address of the API function */ - printf( "\tmovl -4(%%ebp),%%eax\n" ); + fprintf( outfile, "\tmovl -4(%%ebp),%%eax\n" ); /* If necessary, save %edx over the API function address */ if (!reg_func && short_ret) - printf( "\tmovl %%edx,-4(%%ebp)\n" ); + fprintf( outfile, "\tmovl %%edx,-4(%%ebp)\n" ); /* Switch to the 32-bit stack */ - printf( "\tmovl " PREFIX "IF1632_Saved32_esp,%%ebp\n" ); - printf( "\tpushw %%ds\n" ); - printf( "\tpopw %%ss\n" ); - printf( "\tleal -%d(%%ebp),%%esp\n", - reg_func ? sizeof(SIGCONTEXT) : 4 * strlen(args) ); + fprintf( outfile, "\tmovl " PREFIX "IF1632_Saved32_esp,%%ebp\n" ); + fprintf( outfile, "\tpushw %%ds\n" ); + fprintf( outfile, "\tpopw %%ss\n" ); + fprintf( outfile, "\tleal -%d(%%ebp),%%esp\n", + reg_func ? sizeof(SIGCONTEXT) : 4 * strlen(args) ); if (reg_func) /* Push the address of the context struct */ - printf( "\tpushl %%esp\n" ); + fprintf( outfile, "\tpushl %%esp\n" ); /* Setup %ebp to point to the previous stack frame (built by CallTo16) */ - printf( "\taddl $24,%%ebp\n" ); + fprintf( outfile, "\taddl $24,%%ebp\n" ); /* Print the debug information before the call */ if (debugging) { - printf( "\tpushl %%eax\n" ); - printf( "\tpushl $Profile_%s\n", profile ); - printf( "\tpushl $%d\n", reg_func ? 2 : (short_ret ? 1 : 0) ); - printf( "\tcall " PREFIX "RELAY_DebugCallFrom16\n" ); - printf( "\tpopl %%eax\n" ); - printf( "\tpopl %%eax\n" ); - printf( "\tpopl %%eax\n" ); + fprintf( outfile, "\tpushl %%eax\n" ); + fprintf( outfile, "\tpushl $Profile_%s\n", profile ); + fprintf( outfile, "\tpushl $%d\n", reg_func ? 2 : (short_ret ? 1 : 0)); + fprintf( outfile, "\tcall " PREFIX "RELAY_DebugCallFrom16\n" ); + fprintf( outfile, "\tpopl %%eax\n" ); + fprintf( outfile, "\tpopl %%eax\n" ); + fprintf( outfile, "\tpopl %%eax\n" ); } /* Call the entry point */ - printf( "\tcall %%eax\n" ); + fprintf( outfile, "\tcall %%eax\n" ); /* Print the debug information after the call */ if (debugging) { - printf( "\tpushl %%eax\n" ); - printf( "\tpushl $%d\n", reg_func ? 2 : (short_ret ? 1 : 0) ); - printf( "\tcall " PREFIX "RELAY_DebugCallFrom16Ret\n" ); - printf( "\tpopl %%eax\n" ); - printf( "\tpopl %%eax\n" ); + fprintf( outfile, "\tpushl %%eax\n" ); + fprintf( outfile, "\tpushl $%d\n", reg_func ? 2 : (short_ret ? 1 : 0)); + fprintf( outfile, "\tcall " PREFIX "RELAY_DebugCallFrom16Ret\n" ); + fprintf( outfile, "\tpopl %%eax\n" ); + fprintf( outfile, "\tpopl %%eax\n" ); } /* Restore the 16-bit stack */ #ifdef __svr4__ - printf( "\tdata16\n"); + fprintf( outfile, "\tdata16\n"); #endif - printf( "\tmovw " PREFIX "IF1632_Saved16_ss,%%ss\n" ); - printf( "\tmovw " PREFIX "IF1632_Saved16_sp,%%sp\n" ); + fprintf( outfile, "\tmovw " PREFIX "IF1632_Saved16_ss,%%ss\n" ); + fprintf( outfile, "\tmovw " PREFIX "IF1632_Saved16_sp,%%sp\n" ); #ifdef __svr4__ - printf( "\tdata16\n"); + fprintf( outfile, "\tdata16\n"); #endif - printf( "\tpopw " PREFIX "IF1632_Saved16_ss\n" ); + fprintf( outfile, "\tpopw " PREFIX "IF1632_Saved16_ss\n" ); #ifdef __svr4__ - printf( "\tdata16\n"); + fprintf( outfile, "\tdata16\n"); #endif - printf( "\tpopw " PREFIX "IF1632_Saved16_sp\n" ); + fprintf( outfile, "\tpopw " PREFIX "IF1632_Saved16_sp\n" ); if (reg_func) { /* Restore registers from the context structure */ - RestoreContext16(); + RestoreContext16( outfile ); /* Calc the arguments size */ while (*args) @@ -1651,48 +1665,48 @@ static void BuildCallFrom16Func( char *profile ) } /* Restore ds and es */ - printf( "\tpopw %%es\n" ); - printf( "\tpopw %%ds\n" ); + fprintf( outfile, "\tpopw %%es\n" ); + fprintf( outfile, "\tpopw %%ds\n" ); /* Remove the entry point from the stack */ /* (we don't use add to avoid modifying the carry flag) */ - printf( "\tpopl %%ebp\n" ); + fprintf( outfile, "\tpopl %%ebp\n" ); } else { /* Restore ds and es */ - printf( "\tpopw %%bp\n" ); /* Remove ip */ - printf( "\tpopl %%ebp\n" ); /* Remove ds and cs */ - printf( "\tmovw %%bp,%%ds\n" ); /* Restore ds */ - printf( "\tpopw %%es\n" ); /* Restore es */ + fprintf( outfile, "\tpopw %%bp\n" ); /* Remove ip */ + fprintf( outfile, "\tpopl %%ebp\n" ); /* Remove ds and cs */ + fprintf( outfile, "\tmovw %%bp,%%ds\n" ); /* Restore ds */ + fprintf( outfile, "\tpopw %%es\n" ); /* Restore es */ - if (short_ret) printf( "\tpopl %%edx\n" ); /* Restore edx */ + if (short_ret) fprintf( outfile, "\tpopl %%edx\n" ); /* Restore edx */ else { /* Get the return value into dx:ax */ - printf( "\tpushl %%eax\n" ); - printf( "\tpopw %%ax\n" ); - printf( "\tpopw %%dx\n" ); + fprintf( outfile, "\tpushl %%eax\n" ); + fprintf( outfile, "\tpopw %%ax\n" ); + fprintf( outfile, "\tpopw %%dx\n" ); /* Remove API entry point */ - printf( "\taddl $4,%%esp\n" ); + fprintf( outfile, "\taddl $4,%%esp\n" ); } } /* Restore bp */ - printf( "\tpopw %%bp\n" ); + fprintf( outfile, "\tpopw %%bp\n" ); /* Remove the arguments and return */ if (argsize) { - printf( "\t.byte 0x66\n" ); - printf( "\tlret $%d\n", argsize ); + fprintf( outfile, "\t.byte 0x66\n" ); + fprintf( outfile, "\tlret $%d\n", argsize ); } else { - printf( "\t.byte 0x66\n" ); - printf( "\tlret\n" ); + fprintf( outfile, "\t.byte 0x66\n" ); + fprintf( outfile, "\tlret\n" ); } } @@ -1718,7 +1732,7 @@ static void BuildCallFrom16Func( char *profile ) * WORD ax, WORD bx, WORD cx, WORD dx, * WORD si, WORD di ); */ -static void BuildCallTo16Func( char *profile ) +static void BuildCallTo16Func( FILE *outfile, char *profile ) { int short_ret = 0; int reg_func = 0; @@ -1734,91 +1748,88 @@ static void BuildCallTo16Func( char *profile ) /* Function header */ - printf( "/**********\n" ); - printf( " * " PREFIX "CallTo16_%s\n", profile ); - printf( " **********/\n" ); - printf( "\t.align 4\n" ); - printf( "\t.globl " PREFIX "CallTo16_%s\n\n", profile ); - printf( PREFIX "CallTo16_%s:\n", profile ); + fprintf( outfile, "\n\t.align 4\n" ); + fprintf( outfile, "\t.globl " PREFIX "CallTo16_%s\n", profile ); + fprintf( outfile, PREFIX "CallTo16_%s:\n", profile ); /* Push code selector before return address to simulate a lcall */ - printf( "\tpopl %%eax\n" ); - printf( "\tpushl $0x%04x\n", WINE_CODE_SELECTOR ); - printf( "\tpushl %%eax\n" ); + fprintf( outfile, "\tpopl %%eax\n" ); + fprintf( outfile, "\tpushl $0x%04x\n", WINE_CODE_SELECTOR ); + fprintf( outfile, "\tpushl %%eax\n" ); /* Entry code */ - printf( "\tpushl %%ebp\n" ); - printf( "\tmovl %%esp,%%ebp\n" ); + fprintf( outfile, "\tpushl %%ebp\n" ); + fprintf( outfile, "\tmovl %%esp,%%ebp\n" ); /* Save the 32-bit registers */ - printf( "\tpushl %%ebx\n" ); - printf( "\tpushl %%ecx\n" ); - printf( "\tpushl %%edx\n" ); - printf( "\tpushl %%esi\n" ); - printf( "\tpushl %%edi\n" ); + fprintf( outfile, "\tpushl %%ebx\n" ); + fprintf( outfile, "\tpushl %%ecx\n" ); + fprintf( outfile, "\tpushl %%edx\n" ); + fprintf( outfile, "\tpushl %%esi\n" ); + fprintf( outfile, "\tpushl %%edi\n" ); /* Save the 32-bit stack */ - printf( "\tpushl " PREFIX "IF1632_Saved32_esp\n" ); - printf( "\tmovl %%esp," PREFIX "IF1632_Saved32_esp\n" ); - printf( "\tmovl %%ebp,%%ebx\n" ); + fprintf( outfile, "\tpushl " PREFIX "IF1632_Saved32_esp\n" ); + fprintf( outfile, "\tmovl %%esp," PREFIX "IF1632_Saved32_esp\n" ); + fprintf( outfile, "\tmovl %%ebp,%%ebx\n" ); /* Print debugging info */ if (debugging) { /* Push the address of the first argument */ - printf( "\tmovl %%ebx,%%eax\n" ); - printf( "\taddl $12,%%eax\n" ); - printf( "\tpushl $%d\n", reg_func ? 8 : strlen(args) ); - printf( "\tpushl %%eax\n" ); - printf( "\tcall " PREFIX "RELAY_DebugCallTo16\n" ); - printf( "\tpopl %%eax\n" ); - printf( "\tpopl %%eax\n" ); + fprintf( outfile, "\tmovl %%ebx,%%eax\n" ); + fprintf( outfile, "\taddl $12,%%eax\n" ); + fprintf( outfile, "\tpushl $%d\n", reg_func ? 8 : strlen(args) ); + fprintf( outfile, "\tpushl %%eax\n" ); + fprintf( outfile, "\tcall " PREFIX "RELAY_DebugCallTo16\n" ); + fprintf( outfile, "\tpopl %%eax\n" ); + fprintf( outfile, "\tpopl %%eax\n" ); } /* Switch to the 16-bit stack */ #ifdef __svr4__ - printf("\tdata16\n"); + fprintf( outfile,"\tdata16\n"); #endif - printf( "\tmovw " PREFIX "IF1632_Saved16_ss,%%ss\n" ); - printf( "\tmovw " PREFIX "IF1632_Saved16_sp,%%sp\n" ); + fprintf( outfile, "\tmovw " PREFIX "IF1632_Saved16_ss,%%ss\n" ); + fprintf( outfile, "\tmovw " PREFIX "IF1632_Saved16_sp,%%sp\n" ); /* Transfer the arguments */ if (reg_func) { /* Get the registers. ebx is handled later on. */ - printf( "\tpushw 20(%%ebx)\n" ); - printf( "\tpopw %%es\n" ); - printf( "\tmovl 24(%%ebx),%%ebp\n" ); - printf( "\tmovl 28(%%ebx),%%eax\n" ); - printf( "\tmovl 36(%%ebx),%%ecx\n" ); - printf( "\tmovl 40(%%ebx),%%edx\n" ); - printf( "\tmovl 44(%%ebx),%%esi\n" ); - printf( "\tmovl 48(%%ebx),%%edi\n" ); + fprintf( outfile, "\tpushw 20(%%ebx)\n" ); + fprintf( outfile, "\tpopw %%es\n" ); + fprintf( outfile, "\tmovl 24(%%ebx),%%ebp\n" ); + fprintf( outfile, "\tmovl 28(%%ebx),%%eax\n" ); + fprintf( outfile, "\tmovl 36(%%ebx),%%ecx\n" ); + fprintf( outfile, "\tmovl 40(%%ebx),%%edx\n" ); + fprintf( outfile, "\tmovl 44(%%ebx),%%esi\n" ); + fprintf( outfile, "\tmovl 48(%%ebx),%%edi\n" ); } else /* not a register function */ { int pos = 16; /* first argument position */ /* Make %bp point to the previous stackframe (built by CallFrom16) */ - printf( "\tmovzwl %%sp,%%ebp\n" ); - printf( "\taddw $16,%%bp\n" ); + fprintf( outfile, "\tmovzwl %%sp,%%ebp\n" ); + fprintf( outfile, "\taddw $16,%%bp\n" ); while (*args) { switch(*args++) { case 'w': /* word */ - printf( "\tpushw %d(%%ebx)\n", pos ); + fprintf( outfile, "\tpushw %d(%%ebx)\n", pos ); break; case 'l': /* long */ - printf( "\tpushl %d(%%ebx)\n", pos ); + fprintf( outfile, "\tpushl %d(%%ebx)\n", pos ); break; } pos += 4; @@ -1827,36 +1838,37 @@ static void BuildCallTo16Func( char *profile ) /* Push the return address */ - printf( "\tpushl " PREFIX "CALLTO16_RetAddr_%s\n", - short_ret ? "word" : "long" ); + fprintf( outfile, "\tpushl " PREFIX "CALLTO16_RetAddr_%s\n", + short_ret ? "word" : "long" ); /* Push the called routine address */ - printf( "\tpushl 12(%%ebx)\n" ); + fprintf( outfile, "\tpushl 12(%%ebx)\n" ); /* Get the 16-bit ds */ if (reg_func) { - printf( "\tpushw 16(%%ebx)\n" ); - printf( "\tmovl 32(%%ebx),%%ebx\n" ); /*Get ebx from the 32-bit stack*/ - printf( "\tpopw %%ds\n" ); + fprintf( outfile, "\tpushw 16(%%ebx)\n" ); + /* Get ebx from the 32-bit stack */ + fprintf( outfile, "\tmovl 32(%%ebx),%%ebx\n" ); + fprintf( outfile, "\tpopw %%ds\n" ); } else { /* Get previous ds from the 16-bit stack and */ /* set ax equal to ds for window procedures. */ - printf( "\tmovw -10(%%ebp),%%ax\n" ); + fprintf( outfile, "\tmovw -10(%%ebp),%%ax\n" ); #ifdef __svr4__ - printf( "\tdata16\n"); + fprintf( outfile, "\tdata16\n"); #endif - printf( "\tmovw %%ax,%%ds\n" ); + fprintf( outfile, "\tmovw %%ax,%%ds\n" ); } /* Jump to the called routine */ - printf( "\t.byte 0x66\n" ); - printf( "\tlret\n" ); + fprintf( outfile, "\t.byte 0x66\n" ); + fprintf( outfile, "\tlret\n" ); } @@ -1865,61 +1877,61 @@ static void BuildCallTo16Func( char *profile ) * * Build the return code for 16-bit callbacks */ -static void BuildRet16Func() +static void BuildRet16Func( FILE *outfile ) { - printf( "\t.globl " PREFIX "CALLTO16_Ret_word\n" ); - printf( "\t.globl " PREFIX "CALLTO16_Ret_long\n" ); + fprintf( outfile, "\t.globl " PREFIX "CALLTO16_Ret_word\n" ); + fprintf( outfile, "\t.globl " PREFIX "CALLTO16_Ret_long\n" ); /* Put return value into eax */ - printf( PREFIX "CALLTO16_Ret_long:\n" ); - printf( "\tpushw %%dx\n" ); - printf( "\tpushw %%ax\n" ); - printf( "\tpopl %%eax\n" ); - printf( PREFIX "CALLTO16_Ret_word:\n" ); + fprintf( outfile, PREFIX "CALLTO16_Ret_long:\n" ); + fprintf( outfile, "\tpushw %%dx\n" ); + fprintf( outfile, "\tpushw %%ax\n" ); + fprintf( outfile, "\tpopl %%eax\n" ); + fprintf( outfile, PREFIX "CALLTO16_Ret_word:\n" ); /* Restore 32-bit segment registers */ - printf( "\tmovw $0x%04x,%%bx\n", WINE_DATA_SELECTOR ); + fprintf( outfile, "\tmovw $0x%04x,%%bx\n", WINE_DATA_SELECTOR ); #ifdef __svr4__ - printf( "\tdata16\n"); + fprintf( outfile, "\tdata16\n"); #endif - printf( "\tmovw %%bx,%%ds\n" ); + fprintf( outfile, "\tmovw %%bx,%%ds\n" ); #ifdef __svr4__ - printf( "\tdata16\n"); + fprintf( outfile, "\tdata16\n"); #endif - printf( "\tmovw %%bx,%%es\n" ); + fprintf( outfile, "\tmovw %%bx,%%es\n" ); #ifdef __svr4__ - printf( "\tdata16\n"); + fprintf( outfile, "\tdata16\n"); #endif - printf( "\tmovw %%bx,%%ss\n" ); + fprintf( outfile, "\tmovw %%bx,%%ss\n" ); /* Restore the 32-bit stack */ - printf( "\tmovl " PREFIX "IF1632_Saved32_esp,%%esp\n" ); - printf( "\tpopl " PREFIX "IF1632_Saved32_esp\n" ); + fprintf( outfile, "\tmovl " PREFIX "IF1632_Saved32_esp,%%esp\n" ); + fprintf( outfile, "\tpopl " PREFIX "IF1632_Saved32_esp\n" ); /* Restore the 32-bit registers */ - printf( "\tpopl %%edi\n" ); - printf( "\tpopl %%esi\n" ); - printf( "\tpopl %%edx\n" ); - printf( "\tpopl %%ecx\n" ); - printf( "\tpopl %%ebx\n" ); + fprintf( outfile, "\tpopl %%edi\n" ); + fprintf( outfile, "\tpopl %%esi\n" ); + fprintf( outfile, "\tpopl %%edx\n" ); + fprintf( outfile, "\tpopl %%ecx\n" ); + fprintf( outfile, "\tpopl %%ebx\n" ); /* Return to caller */ - printf( "\tpopl %%ebp\n" ); - printf( "\tlret\n" ); + fprintf( outfile, "\tpopl %%ebp\n" ); + fprintf( outfile, "\tlret\n" ); /* Declare the return address variables */ - printf( "\t.data\n" ); - printf( "\t.globl " PREFIX "CALLTO16_RetAddr_word\n" ); - printf( "\t.globl " PREFIX "CALLTO16_RetAddr_long\n" ); - printf( PREFIX "CALLTO16_RetAddr_word:\t.long 0\n" ); - printf( PREFIX "CALLTO16_RetAddr_long:\t.long 0\n" ); - printf( "\t.text\n" ); + fprintf( outfile, "\t.data\n" ); + fprintf( outfile, "\t.globl " PREFIX "CALLTO16_RetAddr_word\n" ); + fprintf( outfile, "\t.globl " PREFIX "CALLTO16_RetAddr_long\n" ); + fprintf( outfile, PREFIX "CALLTO16_RetAddr_word:\t.long 0\n" ); + fprintf( outfile, PREFIX "CALLTO16_RetAddr_long:\t.long 0\n" ); + fprintf( outfile, "\t.text\n" ); } @@ -1928,41 +1940,41 @@ static void BuildRet16Func() * * Build the context structure on the stack. */ -static void BuildContext32(void) +static void BuildContext32( FILE *outfile ) { /* Build the context structure */ - printf( "\tpushfl\n" ); - printf( "\tsubl $%d,%%esp\n", sizeof(CONTEXT) ); - printf( "\tmovl %%eax,%d(%%esp)\n", CONTEXTOFFSET(Eax) ); - printf( "\tmovl %%ebx,%d(%%esp)\n", CONTEXTOFFSET(Ebx) ); - printf( "\tmovl %%ecx,%d(%%esp)\n", CONTEXTOFFSET(Ecx) ); - printf( "\tmovl %%edx,%d(%%esp)\n", CONTEXTOFFSET(Edx) ); - printf( "\tmovl %%esi,%d(%%esp)\n", CONTEXTOFFSET(Esi) ); - printf( "\tmovl %%edi,%d(%%esp)\n", CONTEXTOFFSET(Edi) ); + fprintf( outfile, "\tpushfl\n" ); + fprintf( outfile, "\tsubl $%d,%%esp\n", sizeof(CONTEXT) ); + fprintf( outfile, "\tmovl %%eax,%d(%%esp)\n", CONTEXTOFFSET(Eax) ); + fprintf( outfile, "\tmovl %%ebx,%d(%%esp)\n", CONTEXTOFFSET(Ebx) ); + fprintf( outfile, "\tmovl %%ecx,%d(%%esp)\n", CONTEXTOFFSET(Ecx) ); + fprintf( outfile, "\tmovl %%edx,%d(%%esp)\n", CONTEXTOFFSET(Edx) ); + fprintf( outfile, "\tmovl %%esi,%d(%%esp)\n", CONTEXTOFFSET(Esi) ); + fprintf( outfile, "\tmovl %%edi,%d(%%esp)\n", CONTEXTOFFSET(Edi) ); - printf( "\tmovl %d(%%esp),%%eax\n", sizeof(CONTEXT) ); - printf( "\tmovl %%eax,%d(%%esp)\n", CONTEXTOFFSET(EFlags) ); + fprintf( outfile, "\tmovl %d(%%esp),%%eax\n", sizeof(CONTEXT) ); + fprintf( outfile, "\tmovl %%eax,%d(%%esp)\n", CONTEXTOFFSET(EFlags) ); - printf( "\tmovl %%cs,%d(%%esp)\n", CONTEXTOFFSET(SegCs) ); - printf( "\tmovl %%ds,%d(%%esp)\n", CONTEXTOFFSET(SegDs) ); - printf( "\tmovl %%es,%d(%%esp)\n", CONTEXTOFFSET(SegEs) ); - printf( "\tmovl %%fs,%d(%%esp)\n", CONTEXTOFFSET(SegFs) ); - printf( "\tmovl %%gs,%d(%%esp)\n", CONTEXTOFFSET(SegGs) ); - printf( "\tmovl %%ss,%d(%%esp)\n", CONTEXTOFFSET(SegSs) ); + fprintf( outfile, "\tmovl %%cs,%d(%%esp)\n", CONTEXTOFFSET(SegCs) ); + fprintf( outfile, "\tmovl %%ds,%d(%%esp)\n", CONTEXTOFFSET(SegDs) ); + fprintf( outfile, "\tmovl %%es,%d(%%esp)\n", CONTEXTOFFSET(SegEs) ); + fprintf( outfile, "\tmovl %%fs,%d(%%esp)\n", CONTEXTOFFSET(SegFs) ); + fprintf( outfile, "\tmovl %%gs,%d(%%esp)\n", CONTEXTOFFSET(SegGs) ); + fprintf( outfile, "\tmovl %%ss,%d(%%esp)\n", CONTEXTOFFSET(SegSs) ); - printf( "\tfsave %d(%%esp)\n", CONTEXTOFFSET(FloatSave) ); + fprintf( outfile, "\tfsave %d(%%esp)\n", CONTEXTOFFSET(FloatSave) ); - printf( "\tmovl 4(%%ebp),%%eax\n" ); /* %eip at time of call */ - printf( "\tmovl %%eax,%d(%%esp)\n", CONTEXTOFFSET(Eip) ); - printf( "\tmovl 0(%%ebp),%%eax\n" ); /* %ebp at time of call */ - printf( "\tmovl %%eax,%d(%%esp)\n", CONTEXTOFFSET(Ebp) ); - printf( "\tleal 8(%%ebp),%%eax\n" ); /* %esp at time of call */ - printf( "\tmovl %%eax,%d(%%esp)\n", CONTEXTOFFSET(Esp) ); + fprintf( outfile, "\tmovl 4(%%ebp),%%eax\n" ); /* %eip at time of call */ + fprintf( outfile, "\tmovl %%eax,%d(%%esp)\n", CONTEXTOFFSET(Eip) ); + fprintf( outfile, "\tmovl 0(%%ebp),%%eax\n" ); /* %ebp at time of call */ + fprintf( outfile, "\tmovl %%eax,%d(%%esp)\n", CONTEXTOFFSET(Ebp) ); + fprintf( outfile, "\tleal 8(%%ebp),%%eax\n" ); /* %esp at time of call */ + fprintf( outfile, "\tmovl %%eax,%d(%%esp)\n", CONTEXTOFFSET(Esp) ); /* Push pointer to context */ - printf( "\tpushl %%esp\n" ); + fprintf( outfile, "\tpushl %%esp\n" ); } @@ -1971,40 +1983,40 @@ static void BuildContext32(void) * * Restore the registers from the context structure */ -static void RestoreContext32(void) +static void RestoreContext32( FILE *outfile ) { /* Restore the context structure */ - printf( "\tleal %d(%%ebp),%%esp\n", -sizeof(CONTEXT)-12 ); - printf( "\tfrstor %d(%%esp)\n", CONTEXTOFFSET(FloatSave) ); + fprintf( outfile, "\tleal %d(%%ebp),%%esp\n", -sizeof(CONTEXT)-12 ); + fprintf( outfile, "\tfrstor %d(%%esp)\n", CONTEXTOFFSET(FloatSave) ); - printf( "\tmovl %d(%%esp),%%ebx\n", CONTEXTOFFSET(Ebx) ); - printf( "\tmovl %d(%%esp),%%ecx\n", CONTEXTOFFSET(Ecx) ); - printf( "\tmovl %d(%%esp),%%edx\n", CONTEXTOFFSET(Edx) ); - printf( "\tmovl %d(%%esp),%%esi\n", CONTEXTOFFSET(Esi) ); - printf( "\tmovl %d(%%esp),%%edi\n", CONTEXTOFFSET(Edi) ); + fprintf( outfile, "\tmovl %d(%%esp),%%ebx\n", CONTEXTOFFSET(Ebx) ); + fprintf( outfile, "\tmovl %d(%%esp),%%ecx\n", CONTEXTOFFSET(Ecx) ); + fprintf( outfile, "\tmovl %d(%%esp),%%edx\n", CONTEXTOFFSET(Edx) ); + fprintf( outfile, "\tmovl %d(%%esp),%%esi\n", CONTEXTOFFSET(Esi) ); + fprintf( outfile, "\tmovl %d(%%esp),%%edi\n", CONTEXTOFFSET(Edi) ); - printf( "\tmovl %d(%%esp),%%eax\n", CONTEXTOFFSET(EFlags) ); - printf( "\tmovl %%eax,%d(%%esp)\n", sizeof(CONTEXT) ); + fprintf( outfile, "\tmovl %d(%%esp),%%eax\n", CONTEXTOFFSET(EFlags) ); + fprintf( outfile, "\tmovl %%eax,%d(%%esp)\n", sizeof(CONTEXT) ); -/* printf( "\tmovl %d(%%esp),%%cs\n", CONTEXTOFFSET(SegCs) ); */ - printf( "\tmovl %d(%%esp),%%ds\n", CONTEXTOFFSET(SegDs) ); - printf( "\tmovl %d(%%esp),%%es\n", CONTEXTOFFSET(SegEs) ); - printf( "\tmovl %d(%%esp),%%fs\n", CONTEXTOFFSET(SegFs) ); - printf( "\tmovl %d(%%esp),%%gs\n", CONTEXTOFFSET(SegGs) ); +/* fprintf( outfile, "\tmovl %d(%%esp),%%cs\n", CONTEXTOFFSET(SegCs) ); */ + fprintf( outfile, "\tmovl %d(%%esp),%%ds\n", CONTEXTOFFSET(SegDs) ); + fprintf( outfile, "\tmovl %d(%%esp),%%es\n", CONTEXTOFFSET(SegEs) ); + fprintf( outfile, "\tmovl %d(%%esp),%%fs\n", CONTEXTOFFSET(SegFs) ); + fprintf( outfile, "\tmovl %d(%%esp),%%gs\n", CONTEXTOFFSET(SegGs) ); - printf( "\tmovl %d(%%esp),%%eax\n", CONTEXTOFFSET(Eip) ); - printf( "\tmovl %%eax,4(%%ebp)\n" ); /* %eip at time of call */ - printf( "\tmovl %d(%%esp),%%eax\n", CONTEXTOFFSET(Ebp) ); - printf( "\tmovl %%eax,0(%%ebp)\n" ); /* %ebp at time of call */ + fprintf( outfile, "\tmovl %d(%%esp),%%eax\n", CONTEXTOFFSET(Eip) ); + fprintf( outfile, "\tmovl %%eax,4(%%ebp)\n" ); /* %eip at time of call */ + fprintf( outfile, "\tmovl %d(%%esp),%%eax\n", CONTEXTOFFSET(Ebp) ); + fprintf( outfile, "\tmovl %%eax,0(%%ebp)\n" ); /* %ebp at time of call */ -/* printf( "\tmovl %d(%%esp),%%ss\n", CONTEXTOFFSET(SegSs) ); */ -/* printf( "\tmovl %d(%%esp),%%eax\n", CONTEXTOFFSET(Esp) ); */ +/* fprintf( outfile, "\tmovl %d(%%esp),%%ss\n", CONTEXTOFFSET(SegSs) ); */ +/* fprintf( outfile, "\tmovl %d(%%esp),%%eax\n", CONTEXTOFFSET(Esp) ); */ - printf( "\tmovl %d(%%esp),%%eax\n", CONTEXTOFFSET(Eax) ); + fprintf( outfile, "\tmovl %d(%%esp),%%eax\n", CONTEXTOFFSET(Eax) ); - printf( "\taddl $%d,%%esp\n", sizeof(CONTEXT) ); - printf( "\tpopfl\n" ); + fprintf( outfile, "\taddl $%d,%%esp\n", sizeof(CONTEXT) ); + fprintf( outfile, "\tpopfl\n" ); } @@ -2023,7 +2035,7 @@ static void RestoreContext32(void) * (ebp-4) entry point * (ebp-8) relay addr */ -static void BuildCallFrom32Func( const char *profile ) +static void BuildCallFrom32Func( FILE *outfile, const char *profile ) { int args, stdcall, reg_func; @@ -2045,76 +2057,74 @@ static void BuildCallFrom32Func( const char *profile ) } else { - fprintf( stderr, "Invalid function profile '%s'\n", profile ); + fprintf( stderr, "Invalid function profile '%s', ignored\n", profile ); return; } /* Function header */ - printf( "/**********\n" ); - printf( " * " PREFIX "CallFrom32_%s\n", profile ); - printf( " **********/\n" ); - printf( "\t.align 4\n" ); - printf( "\t.globl " PREFIX "CallFrom32_%s\n\n", profile ); - printf( PREFIX "CallFrom32_%s:\n", profile ); + fprintf( outfile, "\n\t.align 4\n" ); + fprintf( outfile, "\t.globl " PREFIX "CallFrom32_%s\n", profile ); + fprintf( outfile, PREFIX "CallFrom32_%s:\n", profile ); /* Entry code */ - printf( "\tleal 8(%%esp),%%ebp\n" ); + fprintf( outfile, "\tleal 8(%%esp),%%ebp\n" ); /* Transfer the arguments */ - if (reg_func) BuildContext32(); + if (reg_func) BuildContext32( outfile ); if (args) { int i; - for (i = args; i > 0; i--) printf( "\tpushl %d(%%ebp)\n", 4 * i + 4 ); + for (i = args; i > 0; i--) + fprintf( outfile, "\tpushl %d(%%ebp)\n", 4 * i + 4 ); } else if (!reg_func) { /* Push the address of the arguments. The called function will */ /* ignore this if it really takes no arguments. */ - printf( "\tleal 8(%%ebp),%%eax\n" ); - printf( "\tpushl %%eax\n" ); + fprintf( outfile, "\tleal 8(%%ebp),%%eax\n" ); + fprintf( outfile, "\tpushl %%eax\n" ); } /* Print the debugging info */ if (debugging) { - printf( "\tpushl $%d\n", reg_func ? -1 : args ); /* Nb args */ - printf( "\tpushl %%ebp\n" ); - printf( "\tcall " PREFIX "RELAY_DebugCallFrom32\n" ); - printf( "\tadd $8, %%esp\n" ); + fprintf( outfile, "\tpushl $%d\n", reg_func ? -1 : args); /* Nb args */ + fprintf( outfile, "\tpushl %%ebp\n" ); + fprintf( outfile, "\tcall " PREFIX "RELAY_DebugCallFrom32\n" ); + fprintf( outfile, "\tadd $8, %%esp\n" ); } /* Call the function */ - printf( "\tcall -4(%%ebp)\n" ); + fprintf( outfile, "\tcall -4(%%ebp)\n" ); /* Print the debugging info */ if (debugging) { - printf( "\tpushl %%eax\n" ); - printf( "\tpushl $%d\n", reg_func ? -1 : args ); /* Nb args */ - printf( "\tpushl %%ebp\n" ); - printf( "\tcall " PREFIX "RELAY_DebugCallFrom32Ret\n" ); - printf( "\tpopl %%eax\n" ); - printf( "\tpopl %%eax\n" ); - printf( "\tpopl %%eax\n" ); + fprintf( outfile, "\tpushl %%eax\n" ); + fprintf( outfile, "\tpushl $%d\n", reg_func ? -1 : args); /* Nb args */ + fprintf( outfile, "\tpushl %%ebp\n" ); + fprintf( outfile, "\tcall " PREFIX "RELAY_DebugCallFrom32Ret\n" ); + fprintf( outfile, "\tpopl %%eax\n" ); + fprintf( outfile, "\tpopl %%eax\n" ); + fprintf( outfile, "\tpopl %%eax\n" ); } - if (reg_func) RestoreContext32(); + if (reg_func) RestoreContext32( outfile ); - printf( "\tmovl %%ebp,%%esp\n" ); - printf( "\tpopl %%ebp\n" ); + fprintf( outfile, "\tmovl %%ebp,%%esp\n" ); + fprintf( outfile, "\tpopl %%ebp\n" ); /* Return, removing arguments */ - if (args && stdcall) printf( "\tret $%d\n", args * 4 ); - else printf( "\tret\n" ); + if (args && stdcall) fprintf( outfile, "\tret $%d\n", args * 4 ); + else fprintf( outfile, "\tret\n" ); } @@ -2134,144 +2144,234 @@ static void BuildCallFrom32Func( const char *profile ) * Prototype for the CallTo32 functions: * extern LONG CallTo32_nn( FARPROC32 func, args... ); */ -static void BuildCallTo32Func( int args ) +static void BuildCallTo32Func( FILE *outfile, int args ) { /* Function header */ - printf( "/**********\n" ); - printf( " * " PREFIX "CallTo32_%d\n", args ); - printf( " **********/\n" ); - printf( "\t.align 4\n" ); - printf( "\t.globl " PREFIX "CallTo32_%d\n\n", args ); - printf( PREFIX "CallTo32_%d:\n", args ); + fprintf( outfile, "\n\t.align 4\n" ); + fprintf( outfile, "\t.globl " PREFIX "CallTo32_%d\n", args ); + fprintf( outfile, PREFIX "CallTo32_%d:\n", args ); /* Entry code */ - printf( "\tpushl %%ebp\n" ); - printf( "\tmovl %%esp,%%ebp\n" ); + fprintf( outfile, "\tpushl %%ebp\n" ); + fprintf( outfile, "\tmovl %%esp,%%ebp\n" ); /* Transfer arguments */ if (args) { int i; - for (i = args; i > 0; i--) printf( "\tpushl %d(%%ebp)\n", 4 * i + 8 ); + for (i = args; i > 0; i--) + fprintf( outfile, "\tpushl %d(%%ebp)\n", 4 * i + 8 ); } /* Print the debugging output */ if (debugging) { - printf( "\tpushl $%d\n", args ); - printf( "\tpushl 8(%%ebp)\n" ); - printf( "\tcall " PREFIX "RELAY_DebugCallTo32\n" ); - printf( "\taddl $8,%%esp\n" ); + fprintf( outfile, "\tpushl $%d\n", args ); + fprintf( outfile, "\tpushl 8(%%ebp)\n" ); + fprintf( outfile, "\tcall " PREFIX "RELAY_DebugCallTo32\n" ); + fprintf( outfile, "\taddl $8,%%esp\n" ); } /* Call the function */ - printf( "\tcall 8(%%ebp)\n" ); + fprintf( outfile, "\tcall 8(%%ebp)\n" ); /* Return to Wine */ - printf( "\tmovl %%ebp,%%esp\n" ); - printf( "\tpopl %%ebp\n" ); - printf( "\tret\n" ); + fprintf( outfile, "\tmovl %%ebp,%%esp\n" ); + fprintf( outfile, "\tpopl %%ebp\n" ); + fprintf( outfile, "\tret\n" ); } +/******************************************************************* + * BuildSpec + * + * Build the spec files + */ +static int BuildSpec( FILE *outfile, int argc, char *argv[] ) +{ + int i; + for (i = 2; i < argc; i++) + if (BuildSpecFile( outfile, argv[i] ) < 0) return -1; + return 0; +} + + +/******************************************************************* + * BuildCallFrom16 + * + * Build the 16-bit-to-Wine callbacks + */ +static int BuildCallFrom16( FILE *outfile, int argc, char *argv[] ) +{ + int i; + + /* File header */ + + fprintf( outfile, "/* File generated automatically. Do not edit! */\n\n" ); + fprintf( outfile, "\t.text\n" ); + + /* Build the 32-bit large stack callback */ + + BuildCall32LargeStack( outfile ); + + /* Build the callback functions */ + + for (i = 2; i < argc; i++) BuildCallFrom16Func( outfile, argv[i] ); + + /* Output the argument debugging strings */ + + if (debugging) + { + fprintf( outfile, "/* Argument strings */\n" ); + for (i = 2; i < argc; i++) + { + fprintf( outfile, "Profile_%s:\n", argv[i] ); + fprintf( outfile, "\t.ascii \"%s\\0\"\n", argv[i] + 5 ); + } + } + return 0; +} + + +/******************************************************************* + * BuildCallTo16 + * + * Build the Wine-to-16-bit callbacks + */ +static int BuildCallTo16( FILE *outfile, int argc, char *argv[] ) +{ + int i; + + /* File header */ + + fprintf( outfile, "/* File generated automatically. Do not edit! */\n\n" ); + fprintf( outfile, "\t.text\n" ); + fprintf( outfile, "\t.globl " PREFIX "CALLTO16_Start\n" ); + fprintf( outfile, PREFIX "CALLTO16_Start:\n" ); + + /* Build the callback functions */ + + for (i = 2; i < argc; i++) BuildCallTo16Func( outfile, argv[i] ); + + /* Output the 16-bit return code */ + + BuildRet16Func( outfile ); + + fprintf( outfile, "\t.globl " PREFIX "CALLTO16_End\n" ); + fprintf( outfile, PREFIX "CALLTO16_End:\n" ); + return 0; +} + + +/******************************************************************* + * BuildCallFrom32 + * + * Build the 32-bit-to-Wine callbacks + */ +static int BuildCallFrom32( FILE *outfile, int argc, char *argv[] ) +{ + int i; + + /* File header */ + + fprintf( outfile, "/* File generated automatically. Do not edit! */\n\n" ); + fprintf( outfile, "\t.text\n" ); + + /* Build the callback functions */ + + for (i = 2; i < argc; i++) BuildCallFrom32Func( outfile, argv[i] ); + return 0; +} + + +/******************************************************************* + * BuildCallTo32 + * + * Build the Wine-to-32-bit callbacks + */ +static int BuildCallTo32( FILE *outfile, int argc, char *argv[] ) +{ + int i; + + /* File header */ + + fprintf( outfile, "/* File generated automatically. Do not edit! */\n\n" ); + fprintf( outfile, "\t.text\n" ); + + /* Build the callback functions */ + + for (i = 2; i < argc; i++) BuildCallTo32Func( outfile, atoi(argv[i]) ); + return 0; +} + + +/******************************************************************* + * usage + */ static void usage(void) { - fprintf(stderr, "usage: build -spec SPECNAMES\n" - " build -callfrom16 FUNCTION_PROFILES\n" - " build -callto16 FUNCTION_PROFILES\n" - " build -callfrom32 FUNCTION_PROFILES\n" - " build -callto32 FUNCTION_PROFILES\n" ); + fprintf(stderr, "usage: build [-o outfile] -spec SPECNAMES\n" + " build [-o outfile] -callfrom16 FUNCTION_PROFILES\n" + " build [-o outfile] -callto16 FUNCTION_PROFILES\n" + " build [-o outfile] -callfrom32 FUNCTION_PROFILES\n" + " build [-o outfile] -callto32 FUNCTION_PROFILES\n"); exit(1); } +/******************************************************************* + * main + */ int main(int argc, char **argv) { - int i; + char *outname = NULL; + FILE *outfile = stdout; + int res = -1; if (argc <= 2) usage(); - if (!strcmp( argv[1], "-spec" )) + if (!strcmp( argv[1], "-o" )) { - for (i = 2; i < argc; i++) BuildSpecFiles( argv[i] ); - } - else if (!strcmp( argv[1], "-callfrom16" )) /* 16-bit-to-Wine callbacks */ - { - /* File header */ - - printf( "/* File generated automatically. Do not edit! */\n\n" ); - printf( "\t.text\n" ); - - /* Build the 32-bit large stack callback */ - - BuildCall32LargeStack(); - - /* Build the callback functions */ - - for (i = 2; i < argc; i++) BuildCallFrom16Func( argv[i] ); - - /* Output the argument debugging strings */ - - if (debugging) + outname = argv[2]; + argv += 2; + argc -= 2; + if (argc <= 2) usage(); + if (!(outfile = fopen( outname, "w" ))) { - printf( "/* Argument strings */\n" ); - for (i = 2; i < argc; i++) - { - printf( "Profile_%s:\n", argv[i] ); - printf( "\t.ascii \"%s\\0\"\n", argv[i] + 5 ); - } + fprintf( stderr, "Unable to create output file '%s'\n", outname ); + exit(1); } } - else if (!strcmp( argv[1], "-callto16" )) /* Wine-to-16-bit callbacks */ + + if (!strcmp( argv[1], "-spec" )) + res = BuildSpec( outfile, argc, argv ); + else if (!strcmp( argv[1], "-callfrom16" )) + res = BuildCallFrom16( outfile, argc, argv ); + else if (!strcmp( argv[1], "-callto16" )) + res = BuildCallTo16( outfile, argc, argv ); + else if (!strcmp( argv[1], "-callfrom32" )) + res = BuildCallFrom32( outfile, argc, argv ); + else if (!strcmp( argv[1], "-callto32" )) + res = BuildCallTo32( outfile, argc, argv ); + else { - /* File header */ - - printf( "/* File generated automatically. Do not edit! */\n\n" ); - printf( "\t.text\n" ); - printf( "\t.globl " PREFIX "CALLTO16_Start\n" ); - printf( PREFIX "CALLTO16_Start:\n" ); - - /* Build the callback functions */ - - for (i = 2; i < argc; i++) BuildCallTo16Func( argv[i] ); - - /* Output the 16-bit return code */ - - BuildRet16Func(); - - printf( "\t.globl " PREFIX "CALLTO16_End\n" ); - printf( PREFIX "CALLTO16_End:\n" ); + fclose( outfile ); + unlink( outname ); + usage(); } - else if (!strcmp( argv[1], "-callfrom32" )) /* 32-bit-to-Wine callbacks */ + + fclose( outfile ); + if (res < 0) { - /* File header */ - - printf( "/* File generated automatically. Do not edit! */\n\n" ); - printf( "\t.text\n" ); - - /* Build the callback functions */ - - for (i = 2; i < argc; i++) BuildCallFrom32Func( argv[i] ); + unlink( outname ); + return 1; } - else if (!strcmp( argv[1], "-callto32" )) /* Wine-to-32-bit callbacks */ - { - /* File header */ - - printf( "/* File generated automatically. Do not edit! */\n\n" ); - printf( "\t.text\n" ); - - /* Build the callback functions */ - - for (i = 2; i < argc; i++) BuildCallTo32Func( atoi(argv[i]) ); - } - else usage(); - return 0; } diff --git a/tools/fnt2bdf.c b/tools/fnt2bdf.c new file mode 100644 index 00000000000..f391b793ccf --- /dev/null +++ b/tools/fnt2bdf.c @@ -0,0 +1,584 @@ +/************************************************ + * + * Extract fonts from .fnt or Windows DLL files + * and convert them to the .bdf format. + * + * Copyright 1994-1996 Kevin Carothers and Alex Korobka + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "windows.h" +#include "fnt2bdf.h" +#include "neexe.h" +#include "module.h" + +#define MAP_BEG 118 + +extern char* g_lpstrFileName; +extern char* g_lpstrCharSet; + +#define FILE_ERROR 0 +#define FILE_DLL 1 +#define FILE_FNT 2 + +/* global options */ + +char* g_lpstrFileName = NULL; +char* g_lpstrCharSet = NULL; +char* g_lpstrInputFile = NULL; + +static char* errorDLLRead = "Unable to read Windows DLL.\n"; +static char* errorFNTRead = "Unable to read .FNT file.\n"; +static char* errorOpenFile = "Unable to open file.\n"; +static char* errorMemory = "Memory allocation error.\n"; +static char* errorFile = "Corrupt or invalid file.\n"; +static char* errorFontData = "Unable to parse font data: Error "; +static char* errorEmpty = "No fonts found.\n"; + +/* info */ + +void usage() +{ + printf("Usage: font2bdf [-c charset] [-o basename] [input file]\n"); + printf(" -c charset\tuse this charset name for OEM_CHARSET fonts\n"); + printf(" -f basename\tbasic output filename\n"); + printf(" input file\tMSWindows .fon, .fnt, .dll, or .exe file.\n"); + printf("\nExample:\n fnt2bdf -c winsys vgasys.fnt\n\n"); + exit(-1); +} + +/* convert big-endian value to the local format */ + +int return_data_value(enum data_types dtype, void * pChr) +{ +int ret_val = 0; + + switch(dtype) { + case (dfChar): + ret_val = (int) *(unsigned char *)pChr; + break; + + case(dfShort): + ret_val = *(unsigned char *)pChr; + ret_val += (*((unsigned char *)pChr + 1) << 8); + break; + + case(dfLong): { + int i; + + for(i=3; i >= 0; i--) { + ret_val += *((unsigned char *)pChr + i) << (8*i); + } + break; + } + case(dfString): + } + return ret_val; +} + +int make_bdf_filename(char* name, fnt_fontS* cpe_font_struct, unsigned char* file_buffer) +{ +int l_nameoffset = return_data_value(dfLong, cpe_font_struct->hdr.dfFace); +char* lpChar; + + if( !g_lpstrFileName ) + { + if( !l_nameoffset || + l_nameoffset > return_data_value(dfLong, cpe_font_struct->hdr.dfSize) + 1 ) + return ERROR_DATA; + lpChar = (char*)(file_buffer + l_nameoffset); + } + else lpChar = g_lpstrFileName; + + strcpy( name, lpChar ); + + while( (lpChar = strchr( name, ' ')) ) + *lpChar = '-'; + + /* construct a filename from the font typeface, slant, weight, and size */ + + if( cpe_font_struct->hdr.dfItalic[0] ) strcat(name, "_i" ); + else strcat(name, "_r" ); + + lpChar = name + strlen( name ); + sprintf(lpChar, "%d-%d.bdf", return_data_value(dfShort, cpe_font_struct->hdr.dfWeight), + return_data_value(dfShort, cpe_font_struct->hdr.dfPoints) ); + return 0; +} + +/* parse FONT resource and write .bdf file */ + +int parse_fnt_data(unsigned char* file_buffer, int length) +{ + fnt_fontS cpe_font_struct; + int ic=0, t; + + bcopy(file_buffer, (char *) &cpe_font_struct.hdr, sizeof(fnt_hdrS)); + + /* check font header */ + + t = return_data_value(dfShort, cpe_font_struct.hdr.dfVersion); + if( t != 0x300 && t != 0x200) return ERROR_VERSION; + + t = return_data_value(dfLong, cpe_font_struct.hdr.dfSize); + if( t > length ) return ERROR_SIZE; + else + { + /* set up the charWidth/charOffset structure pairs (dfCharTable)... */ + + int l_fchar = return_data_value(dfChar, cpe_font_struct.hdr.dfFirstChar), + l_lchar = return_data_value(dfChar, cpe_font_struct.hdr.dfLastChar); + int l_len = l_lchar-l_fchar, l_ptr = MAP_BEG; + + /* malloc size = (# chars) * sizeof(WinCharS) */ + + if((cpe_font_struct.dfCharTable = (WinCharS *) calloc(sizeof(WinCharS), l_len)) == NULL) + return ERROR_MEMORY; + + /* NOW, convert them all to UNIX (lton) notation... */ + + for(ic=0; ic < l_len; ic++) { + cpe_font_struct.dfCharTable[ic].charWidth = return_data_value(dfShort, &file_buffer[l_ptr]); + l_ptr += 2; /* bump by sizeof(short) */ + + + if( return_data_value(dfShort, cpe_font_struct.hdr.dfVersion) == 0x200) { + cpe_font_struct.dfCharTable[ic].charOffset = + return_data_value(dfShort, &file_buffer[l_ptr]); + l_ptr += 2; /* bump by sizeof(long) */ + } + else { /* Windows Version 3.0 type font */ + cpe_font_struct.dfCharTable[ic].charOffset = + return_data_value(dfLong, &file_buffer[l_ptr]); + l_ptr += 4; /* bump by sizeof(long) */ + } + } + t = dump_bdf(&cpe_font_struct, file_buffer); + free( cpe_font_struct.dfCharTable ); + } + return t; +} + +int dump_bdf( fnt_fontS* cpe_font_struct, unsigned char* file_buffer) +{ + FILE* fp; + int ic; + int l_fchar = return_data_value(dfChar, cpe_font_struct->hdr.dfFirstChar), + l_lchar = return_data_value(dfChar, cpe_font_struct->hdr.dfLastChar); + + int l_len = l_lchar-l_fchar, + l_hgt = return_data_value(dfChar, cpe_font_struct->hdr.dfPixHeight); + int l_ascent = return_data_value(dfShort, cpe_font_struct->hdr.dfAscent); + char l_filename[256]; + + if( (ic = make_bdf_filename(l_filename, cpe_font_struct, file_buffer)) ) + return ic; + + if((fp = fopen(l_filename, "w")) == (FILE *) 0) + { + fprintf(stderr, "Couldn't open \"%s\" for output.\n", l_filename); + return ERROR_FILE; + } + + dump_bdf_hdr(fp, cpe_font_struct, file_buffer); + + /* NOW, convert all chars to UNIX (lton) notation... */ + + for(ic=0; ic < l_len; ic++) { + int rowidx, l_span, /* how many char-cols wide is char? */ + l_idx = cpe_font_struct->dfCharTable[ic].charOffset; + + l_span = (int) (cpe_font_struct->dfCharTable[ic].charWidth-1)/8; + + fprintf(fp, "STARTCHAR %d \n", ic); + fprintf(fp, "ENCODING %d\n", l_fchar); + fprintf(fp, "SWIDTH %d %d \n", + cpe_font_struct->dfCharTable[ic].charWidth*1000, + 0); + + fprintf(fp, "DWIDTH %d %d \n", + cpe_font_struct->dfCharTable[ic].charWidth, 0); + + fprintf(fp, "BBX %d %d %d %d\n", + cpe_font_struct->dfCharTable[ic].charWidth, l_hgt, 0, + l_ascent - l_hgt); + + fprintf(fp, "BITMAP\n"); + for(rowidx=0; rowidx < l_hgt; rowidx++) { + switch(l_span) { + case(0): /* 1-7 pixels wide font */ + { + fprintf(fp, "%02X\n", (int) file_buffer[l_idx+rowidx]); + break; + } + + case(1): /* 8-15 pixels wide font */ + { + fprintf(fp, "%02X%02X", + (int) file_buffer[l_idx+rowidx], file_buffer[l_idx+l_hgt+rowidx]); + fprintf(fp, "\n"); + break; + } + + case(2): /* 16-23 pixels wide font */ + { + fprintf(fp, "%02X%02X%02X", + file_buffer[l_idx+rowidx], + file_buffer[l_idx+l_hgt+rowidx], + file_buffer[l_idx+(2*l_hgt)+rowidx]); + fprintf(fp, "\n"); + break; + } + + case(3): /* 24-31 pixels wide font */ + { + fprintf(fp, "%02X%02X%02X%02X", + file_buffer[l_idx+rowidx], + file_buffer[l_idx+l_hgt+rowidx], + file_buffer[l_idx+(2*l_hgt)+rowidx], + file_buffer[l_idx+(3*l_hgt)+rowidx]); + fprintf(fp, "\n"); + break; + } + case(4): /* 32-39 */ + { + fprintf(fp, "%02X%02X%02X%02X%02X", + file_buffer[l_idx+rowidx], + file_buffer[l_idx+l_hgt+rowidx], + file_buffer[l_idx+(2*l_hgt)+rowidx], + file_buffer[l_idx+(3*l_hgt)+rowidx], + file_buffer[l_idx+(4*l_hgt)+rowidx]); + fprintf(fp, "\n"); + break; + } + default: + fclose(fp); + unlink(l_filename); + return ERROR_DATA; + } + } + fprintf(fp, "ENDCHAR\n"); + + l_fchar++; /* Go to next one */ + } +fprintf(fp, "ENDFONT\n"); +fclose(fp); +return 0; +} + + +int dump_bdf_hdr(FILE* fs, fnt_fontS* cpe_font_struct, unsigned char* file_buffer) +{ +int l_fchar = return_data_value(dfChar, cpe_font_struct->hdr.dfFirstChar), + l_lchar = return_data_value(dfChar, cpe_font_struct->hdr.dfLastChar); +int l_len = l_lchar - l_fchar; +int l_nameoffset = return_data_value(dfLong, cpe_font_struct->hdr.dfFace); +int l_cellheight = return_data_value(dfShort, cpe_font_struct->hdr.dfPixHeight); +int l_ascent = return_data_value(dfShort, cpe_font_struct->hdr.dfAscent); + + fprintf(fs, "STARTFONT 2.1\n"); + + /* Compose font name */ + + if( l_nameoffset && + l_nameoffset < return_data_value(dfLong, cpe_font_struct->hdr.dfSize) ) + { + int dpi, point_size; + char* lpFace = (char*)(file_buffer + l_nameoffset), *lpChar; + short tmWeight = return_data_value(dfShort, cpe_font_struct->hdr.dfWeight); + + while((lpChar = strchr(lpFace, '-')) ) + *lpChar = ' '; + + fprintf(fs, "FONT -windows-%s-", lpFace ); + + if( tmWeight == 0 ) /* weight */ + fputs("medium-", fs); + else if( tmWeight <= FW_LIGHT ) + fputs("light-", fs); + else if( tmWeight <= FW_MEDIUM ) + fputs("medium-", fs); + else if( tmWeight <= FW_DEMIBOLD ) + fputs("demibold-", fs); + else if( tmWeight <= FW_BOLD ) + fputs("bold-", fs); + else fputs("black-", fs); + + if( cpe_font_struct->hdr.dfItalic[0] ) /* slant */ + fputs("i-", fs); + else fputs("r-", fs); + + /* style */ + + if( (cpe_font_struct->hdr.dfPitchAndFamily[0] & 0xF0) == FF_SWISS ) + fputs("normal-sans-", fs); + else fputs("normal--", fs); /* still can be -sans */ + + /* y extents */ + + point_size = 10 * return_data_value(dfShort, cpe_font_struct->hdr.dfPoints ); + dpi = (l_cellheight * 720) / point_size; + + fprintf(fs, "%d-%d-%d-%d-", l_cellheight, 10*l_cellheight, 72, 72); + /* point_size, dpi, dpi); */ + + /* spacing */ + + if( return_data_value(dfShort, cpe_font_struct->hdr.dfPixWidth) ) fputs("c-", fs); + else fputs("m-", fs); + + /* average width */ + + fprintf( fs, "%d-", 10 * return_data_value(dfShort, cpe_font_struct->hdr.dfAvgWidth) ); + + /* charset */ + + switch( cpe_font_struct->hdr.dfCharSet[0] ) + { + case ANSI_CHARSET: fputs("ansi-0\n", fs); break; + default: + case DEFAULT_CHARSET: fputs("iso8859-1\n", fs); break; + case SYMBOL_CHARSET: fputs("misc-fontspecific\n", fs); break; + case SHIFTJIS_CHARSET: fputs("jisx0208.1983-0\n", fs); break; + case OEM_CHARSET: + if( !g_lpstrCharSet ) + { fputs("Undefined OEM charset, use -c option.\n", stderr); + return ERROR_DATA; } + fprintf(fs, "%s\n", g_lpstrCharSet); + } + } + else return ERROR_DATA; + + fprintf(fs, "SIZE %d %d %d\n", + l_cellheight, + return_data_value(dfShort, cpe_font_struct->hdr.dfHorizRes), + return_data_value(dfShort, cpe_font_struct->hdr.dfVertRes)); /* dfVertRes[2] */ + + fprintf(fs, "FONTBOUNDINGBOX %d %d %d %d\n", + return_data_value(dfShort, cpe_font_struct->hdr.dfMaxWidth), + return_data_value(dfChar, cpe_font_struct->hdr.dfPixHeight), + 0, l_ascent - l_cellheight ); + + fprintf(fs, "STARTPROPERTIES 4\n"); + + fprintf(fs, "FONT_ASCENT %d\n", l_ascent ); /* dfAscent[2] */ + fprintf(fs, "FONT_DESCENT %d\n", l_cellheight - l_ascent ); + fprintf(fs, "CAP_HEIGHT %d\n", l_ascent - + return_data_value(dfShort, cpe_font_struct->hdr.dfInternalLeading)); + fprintf(fs, "DEFAULT_CHAR %d\n", return_data_value(dfShort, cpe_font_struct->hdr.dfDefaultChar)); + + fprintf(fs, "ENDPROPERTIES\n"); + + fprintf(fs, "CHARS %d\n", l_len); + return 0; +} + + + +void parse_options(int argc, char **argv) +{ + int i; + + switch( argc ) + { + case 2: + g_lpstrInputFile = argv[1]; + break; + + case 3: + case 4: + case 5: + case 6: + for( i = 1; i < argc - 1; i++ ) + { + if( argv[i][0] != '-' || + strlen(argv[i]) != 2 ) break; + + if( argv[i][1] == 'c' ) { g_lpstrCharSet = argv[i+1]; } + else + if( argv[i][1] == 'f' ) { g_lpstrFileName = argv[i+1]; } + else + usage(); + + i++; + } + if( i == argc - 1 ) + { + g_lpstrInputFile = argv[i]; + break; + } + default: usage(); + } + +} + +/* read file data and return file type */ + +int get_resource_table(int fd, unsigned char** lpdata, int fsize) +{ + struct mz_header_s mz_header; + struct ne_header_s ne_header; + short s, offset, size, retval; + + + lseek( fd, 0, SEEK_SET ); + + if( read(fd, &mz_header, sizeof(mz_header)) != sizeof(mz_header) ) + return FILE_ERROR; + + s = return_data_value(dfShort, &mz_header.mz_magic); + + if( s == MZ_SIGNATURE) /* looks like .dll file so far... */ + { + s = return_data_value(dfShort, &mz_header.ne_offset); + lseek( fd, s, SEEK_SET ); + + if( read(fd, &ne_header, sizeof(ne_header)) != sizeof(ne_header) ) + return FILE_ERROR; + + s = return_data_value(dfShort, &ne_header.ne_magic); + + if( s == PE_SIGNATURE) + { + fprintf( stderr, "Do not know how to handle 32-bit Windows DLLs.\n"); + return FILE_ERROR; + } + else if ( s != NE_SIGNATURE) return FILE_ERROR; + + s = return_data_value(dfShort, &ne_header.resource_tab_offset); + size = return_data_value(dfShort, &ne_header.rname_tab_offset); + + if( size > fsize ) return FILE_ERROR; + + size -= s; + offset = s + return_data_value(dfShort, &mz_header.ne_offset); + + if( size <= sizeof(NE_TYPEINFO) ) return FILE_ERROR; + retval = FILE_DLL; + } + else if( s == 0x300 || s == 0x200 ) /* maybe .fnt ? */ + { + size = return_data_value(dfLong, &mz_header.dont_care); + + if( size != fsize ) return FILE_ERROR; + offset = 0; + retval = FILE_FNT; + } + else return FILE_ERROR; + + *lpdata = (unsigned char*)malloc(size); + + if( *lpdata ) + { + lseek( fd, offset, SEEK_SET ); + if( read(fd, *lpdata, size) != size ) + { free( *lpdata ); *lpdata = NULL; } + } + return retval; +} + + +/* entry point */ + +int main(int argc, char **argv) +{ + unsigned char* lpdata = NULL; + int fd; + + parse_options( argc, argv); + + if( (fd = open( g_lpstrInputFile, O_RDONLY)) ) + { + int i; + struct stat file_stat; + + fstat( fd, &file_stat); + i = get_resource_table( fd, &lpdata, file_stat.st_size ); + + switch(i) + { + case FILE_DLL: + if( lpdata ) + { + int j, count = 0; + NE_TYPEINFO* pTInfo = (NE_TYPEINFO*)(lpdata + 2); + NE_NAMEINFO* pFontStorage = NULL; + + while( (i = return_data_value(dfShort, &pTInfo->type_id)) ) + { + j = return_data_value(dfShort, &pTInfo->count); + if( i == NE_RSCTYPE_FONT ) + { + count = j; + pFontStorage = (NE_NAMEINFO*)(pTInfo + 1); + } + + pTInfo = (NE_TYPEINFO *)((char*)(pTInfo+1) + j*sizeof(NE_NAMEINFO)); + } + if( pFontStorage && count ) + { + unsigned short size_shift = return_data_value(dfShort, lpdata); + unsigned char* lpfont = NULL; + unsigned offset; + unsigned length; + + for( j = 0; j < count; j++, pFontStorage++ ) + { + length = return_data_value(dfShort, &pFontStorage->length) << size_shift; + offset = return_data_value(dfShort, &pFontStorage->offset) << size_shift; + + if( !(lpfont = (unsigned char*) realloc( lpfont, length )) ) + { + fprintf(stderr, errorMemory ); + free(lpdata); + return -1; + } + + lseek( fd, offset, SEEK_SET ); + if( read(fd, lpfont, length) != length ) + { + fprintf(stderr, errorDLLRead ); + free(lpdata); free(lpfont); + return -1; + } + + if( (i = parse_fnt_data( lpfont, length )) ) + fprintf(stderr, "%s%d\n", errorFontData, i ); + } + free(lpfont); free(lpdata); + return 0; + } + else fprintf(stderr, errorEmpty ); + free( lpdata ); + } + else fprintf(stderr, errorDLLRead); + break; + + case FILE_FNT: + if( lpdata ) + { + if( (i = parse_fnt_data( lpdata, file_stat.st_size )) ) + fprintf(stderr, "%s%d\n", errorFontData, i ); + + free( lpdata ); + } + else fprintf(stderr, errorFNTRead); + break; + + case FILE_ERROR: + fprintf(stderr, errorFile ); + + } + close(fd); + } + else fprintf(stderr, errorOpenFile ); + return -1; +} diff --git a/tools/fnt2bdf.h b/tools/fnt2bdf.h new file mode 100644 index 00000000000..e40dbad1e0c --- /dev/null +++ b/tools/fnt2bdf.h @@ -0,0 +1,74 @@ +#include + +enum data_types {dfChar, dfShort, dfLong, dfString}; + +#define ERROR_DATA 1 +#define ERROR_VERSION 2 +#define ERROR_SIZE 3 +#define ERROR_MEMORY 4 +#define ERROR_FILE 5 + +typedef struct tagFontHeader +{ + unsigned char dfVersion[2]; /* Version (always 0x3000) */ + unsigned char dfSize[4]; /* Total File Size */ + unsigned char dfCopyright[60]; /* Copyright notice */ + unsigned char dfType[2]; /* Vector or bitmap font */ + unsigned char dfPoints[2]; /* Nominal point size */ + unsigned char dfVertRes[2]; /* Vertical Resolution */ + unsigned char dfHorizRes[2]; /* Horizontal Resolutionchar */ + unsigned char dfAscent[2]; /* Character ascent in pixels */ + unsigned char dfInternalLeading[2]; /* Leading included in character defn */ + unsigned char dfExternalLeading[2]; /* Leading to be added by Windows */ + unsigned char dfItalic[1]; /* 1=Italic font */ + unsigned char dfUnderline[1]; /* 1=underlined font */ + unsigned char dfStrikeOut[1]; /* 1=strike-out font */ + unsigned char dfWeight[2]; /* Weight: 400=normal */ + unsigned char dfCharSet[1]; /* Character Set for this font */ + unsigned char dfPixWidth[2]; /* Character width (0 for proportional) */ + unsigned char dfPixHeight[2]; /* Character height */ + unsigned char dfPitchAndFamily[1]; /* Font Pitch and family */ + unsigned char dfAvgWidth[2]; /* Average character width */ + unsigned char dfMaxWidth[2]; /* Maximum character width */ + unsigned char dfFirstChar[1]; /* Firwst character of the font */ + unsigned char dfLastChar[1]; /* Last character of the font */ + unsigned char dfDefaultChar[1]; /* Missing character */ + unsigned char dfBreakChar[1]; /* Character to indicate word breaks */ + unsigned char dfWidthBytes[2]; /* Number of bytes in each row */ + unsigned char dfDevice[4]; /* Offset to device name */ + unsigned char dfFace[4]; /* Offset to type face name */ + unsigned char dfBitsPointer[4]; + unsigned char dfBitsOffset[4]; /* Offset to bitmaps */ + unsigned char dfReserved[1]; + unsigned char dfFlags[4]; /* Bitmapped flags */ + unsigned char dfAspace[2]; + unsigned char dfBspace[2]; + unsigned char dfCspace[2]; + unsigned char dfColorTable[2]; /* Offset to Color table */ + unsigned char dfReserved1[4]; +} fnt_hdrS; + +typedef struct WinCharStruct +{ + unsigned int charWidth; + unsigned int charOffset; +} WinCharS; + +typedef struct fntFontStruct +{ + fnt_hdrS hdr; + WinCharS *dfCharTable; + unsigned char *dfDeviceP; + unsigned char *dfFaceP; + unsigned char *dfBitsPointerP; + unsigned char *dfBitsOffsetP; + short *dfColorTableP; +} fnt_fontS; + +extern int return_data_value(enum data_types, void *); + +extern int dump_bdf(fnt_fontS*, unsigned char* ); +extern int dump_bdf_hdr(FILE* fp,fnt_fontS*, unsigned char* ); + +extern int parse_fnt_data(unsigned char* file_buffer, int length); + diff --git a/win32/code_page.c b/win32/code_page.c index 2d60fc4f0bc..f181ad32863 100644 --- a/win32/code_page.c +++ b/win32/code_page.c @@ -17,7 +17,7 @@ /*********************************************************************** * GetACP (KERNEL32.148) */ -UINT GetACP(void) +UINT32 GetACP(void) { return 1252; /* Windows 3.1 ISO Latin */ } @@ -36,7 +36,7 @@ BOOL GetCPInfo(UINT codepage, LPCPINFO cpinfo) /*********************************************************************** * GetOEMCP (KERNEL32.248) */ -UINT GetOEMCP(void) +UINT32 GetOEMCP(void) { return 437; /* MS-DOS United States */ } diff --git a/win32/findfile.c b/win32/findfile.c index 50bb75d5401..011070e9ba7 100644 --- a/win32/findfile.c +++ b/win32/findfile.c @@ -5,6 +5,7 @@ #include #include "xmalloc.h" #include "windows.h" +#include "winerror.h" #include "dos_fs.h" #include "heap.h" #include "string32.h" @@ -188,8 +189,12 @@ BOOL32 FindClose32(HANDLE32 handle) { FindFileContext32 *context; - if (handle==(INVALID_HANDLE_VALUE)) - return TRUE; + /* Windows95 ignores an invalid handle. */ + if (handle == INVALID_HANDLE_VALUE) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } context = (FindFileContext32 *) handle; if (context->dir) closedir(context->dir); diff --git a/win32/newfns.c b/win32/newfns.c index e9de49a6c97..29f779fe10f 100644 --- a/win32/newfns.c +++ b/win32/newfns.c @@ -23,32 +23,6 @@ BOOL WIN32_WinHelpA(HWND hWnd,LPCSTR lpszHelp,UINT uCommand, DWORD dwData) return WinHelp(hWnd,lpszHelp,uCommand,dwData); } -HHOOK SetWindowsHookEx32A(INT32 id, HOOKPROC32 hookfn, HINSTANCE32 hModule, - DWORD ThreadId) - -{ - /* Stub for now */ - fprintf(stdnimp, "SetWindowsHookEx32A Stub called! (hook Id %d)\n",id); - - return (HHOOK) NULL; -} - -HHOOK SetWindowsHook32A(INT32 HookId, HOOKPROC32 hookfn) -{ - /* Stub for now */ - fprintf(stdnimp, "SetWindowsHook32A Stub called! (hook Id %d)\n", HookId); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return (HHOOK) NULL; -} - -BOOL32 UnhookWindowsHookEx32(HHOOK hHook) - -{ - /* Stub for now */ - fprintf(stdnimp, "UnhookWindowsHookEx32 Stub called!\n"); - return FALSE; -} - /**************************************************************************** * QueryPerformanceCounter (KERNEL32.415) */ diff --git a/win32/thread.c b/win32/thread.c index 37e3c544116..ae020f7aa8e 100644 --- a/win32/thread.c +++ b/win32/thread.c @@ -15,12 +15,13 @@ #include "xmalloc.h" /*********************************************************************** - * GetCurrentThreadId (KERNEL32.200) + * GetCurrentThreadId (KERNEL32.201) */ -int GetCurrentThreadId(void) +DWORD GetCurrentThreadId(void) { - return getpid(); + /* Windows 95 returns the address of the thread database (sorta) */ + return MAKELONG(GetCurrentTask(), 0); } /*********************************************************************** @@ -35,7 +36,7 @@ BOOL GetThreadContext(HANDLE32 hThread, void *lpContext) */ HANDLE32 GetCurrentThread(void) { - return 0; + return 0xFFFFFFFE; /* that's -2 */ } /********************************************************************** diff --git a/windows/defdlg.c b/windows/defdlg.c index 03a2d2214a7..99e2a1fe4eb 100644 --- a/windows/defdlg.c +++ b/windows/defdlg.c @@ -89,18 +89,18 @@ static BOOL32 DEFDLG_SetDefButton( HWND32 hwndDlg, DIALOGINFO *dlgInfo, !(SendMessage16(hwndNew, WM_GETDLGCODE, 0, 0 ) & DLGC_UNDEFPUSHBUTTON)) return FALSE; /* Destination is not a push button */ - if (dlgInfo->msgResult) /* There's already a default pushbutton */ + if (dlgInfo->idResult) /* There's already a default pushbutton */ { - HWND32 hwndOld = GetDlgItem( hwndDlg, dlgInfo->msgResult ); + HWND32 hwndOld = GetDlgItem( hwndDlg, dlgInfo->idResult ); if (SendMessage32A( hwndOld, WM_GETDLGCODE, 0, 0) & DLGC_DEFPUSHBUTTON) SendMessage32A( hwndOld, BM_SETSTYLE32, BS_PUSHBUTTON, TRUE ); } if (hwndNew) { SendMessage32A( hwndNew, BM_SETSTYLE32, BS_DEFPUSHBUTTON, TRUE ); - dlgInfo->msgResult = GetDlgCtrlID( hwndNew ); + dlgInfo->idResult = GetDlgCtrlID( hwndNew ); } - else dlgInfo->msgResult = 0; + else dlgInfo->idResult = 0; return TRUE; } @@ -177,8 +177,8 @@ static LRESULT DEFDLG_Proc( HWND32 hwnd, UINT32 msg, WPARAM32 wParam, case DM_GETDEFID: if (dlgInfo->fEnd) return 0; - if (dlgInfo->msgResult) - return MAKELONG( dlgInfo->msgResult, DC_HASDEFID ); + if (dlgInfo->idResult) + return MAKELONG( dlgInfo->idResult, DC_HASDEFID ); hwndDefId = DEFDLG_FindDefButton( hwnd ); if (hwndDefId) return MAKELONG( GetDlgCtrlID( hwndDefId ), DC_HASDEFID); @@ -223,7 +223,9 @@ LRESULT DefDlgProc16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam ) hwnd, msg, wParam, lParam ); /* Check if window was destroyed by dialog procedure */ - if (result || !IsWindow( hwnd )) return result; + + if (!IsWindow( hwnd )) return result; + else if( result ) return dlgInfo->msgResult; } switch(msg) @@ -267,7 +269,9 @@ LRESULT DefDlgProc32A( HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam) hwnd, msg, wParam, lParam ); /* Check if window was destroyed by dialog procedure */ - if (result || !IsWindow( hwnd )) return result; + + if (!IsWindow( hwnd )) return result; + else if( result ) return dlgInfo->msgResult; } switch(msg) @@ -310,7 +314,9 @@ LRESULT DefDlgProc32W( HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam) hwnd, msg, wParam, lParam ); /* Check if window was destroyed by dialog procedure */ - if (result || !IsWindow( hwnd )) return result; + + if (!IsWindow( hwnd )) return result; + else if( result ) return dlgInfo->msgResult; } switch(msg) diff --git a/windows/dialog.c b/windows/dialog.c index 7f51666cb24..e1b0946bfbb 100644 --- a/windows/dialog.c +++ b/windows/dialog.c @@ -293,7 +293,7 @@ static BOOL32 DIALOG_CreateControls( WND *pWnd, LPCSTR template, INT32 items, SendMessage32A( hwndDefButton, BM_SETSTYLE32, BS_PUSHBUTTON,FALSE ); hwndDefButton = hwndCtrl; - dlgInfo->msgResult = GetWindowWord( hwndCtrl, GWW_ID ); + dlgInfo->idResult = GetWindowWord( hwndCtrl, GWW_ID ); } } dprintf_dialog(stddeb, " END\n" ); @@ -583,7 +583,8 @@ static HWND DIALOG_CreateIndirect( HINSTANCE32 hInst, LPCSTR dlgTemplate, dlgInfo->hMenu = hMenu; dlgInfo->xBaseUnit = xUnit; dlgInfo->yBaseUnit = yUnit; - dlgInfo->msgResult = 0; /* This is used to store the default button id */ + dlgInfo->msgResult = 0; + dlgInfo->idResult = 0; dlgInfo->hDialogHeap = 0; if (dlgInfo->hUserFont) @@ -747,7 +748,7 @@ static INT32 DIALOG_DoDialogBox( HWND hwnd, HWND owner ) } if (dlgInfo->fEnd) break; } - retval = dlgInfo->msgResult; + retval = dlgInfo->idResult; EnableWindow( owner, TRUE ); DestroyWindow( hwnd ); return retval; @@ -860,7 +861,7 @@ BOOL16 EndDialog( HWND32 hwnd, INT32 retval ) { WND * wndPtr = WIN_FindWndPtr( hwnd ); DIALOGINFO * dlgInfo = (DIALOGINFO *)wndPtr->wExtra; - dlgInfo->msgResult = retval; + dlgInfo->idResult = retval; dlgInfo->fEnd = TRUE; dprintf_dialog(stddeb, "EndDialog: %04x %d\n", hwnd, retval ); return TRUE; diff --git a/windows/event.c b/windows/event.c index 49d325ac12a..1143c449fb7 100644 --- a/windows/event.c +++ b/windows/event.c @@ -307,6 +307,8 @@ void EVENT_RegisterWindow( WND *pWnd ) if( dndSelection == None ) dndSelection = XInternAtom( display, "DndSelection" , False ); + XSetWMProtocols( display, pWnd->window, &wmDeleteWindow, 1 ); + if (!winContext) winContext = XUniqueContext(); XSaveContext( display, pWnd->window, winContext, (char *)pWnd ); } diff --git a/windows/focus.c b/windows/focus.c index 99654b7a3af..7d284d0ede0 100644 --- a/windows/focus.c +++ b/windows/focus.c @@ -101,8 +101,8 @@ HWND32 SetFocus32( HWND32 hwnd ) if( hwnd == hwndFocus ) return hwnd; /* call hooks */ - if( HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, (WPARAM16)hwnd, - (LPARAM)hwndFocus) ) + if( HOOK_CallHooks16( WH_CBT, HCBT_SETFOCUS, (WPARAM16)hwnd, + (LPARAM)hwndFocus) ) return 0; /* activate hwndTop if needed. */ @@ -113,7 +113,7 @@ HWND32 SetFocus32( HWND32 hwnd ) if (!IsWindow( hwnd )) return 0; /* Abort if window destroyed */ } } - else if( HOOK_CallHooks( WH_CBT, HCBT_SETFOCUS, 0, (LPARAM)hwndFocus ) ) + else if( HOOK_CallHooks16( WH_CBT, HCBT_SETFOCUS, 0, (LPARAM)hwndFocus ) ) return 0; /* Change focus and send messages */ diff --git a/windows/hook.c b/windows/hook.c index ef81d3ab909..a64db7c7e9a 100644 --- a/windows/hook.c +++ b/windows/hook.c @@ -2,6 +2,7 @@ * Windows hook functions * * Copyright 1994, 1995 Alexandre Julliard + * 1996 Andrew Lewycky * * Based on investigations by Alex Korobka */ @@ -14,9 +15,13 @@ */ #define NO_TRANSITION_TYPES /* This file is Win32-clean */ +#include "windows.h" #include "hook.h" #include "queue.h" #include "user.h" +#include "heap.h" +#include "struct32.h" +#include "string32.h" #include "stddebug.h" #include "debug.h" @@ -26,11 +31,12 @@ typedef struct { HANDLE16 next; /* 00 Next hook in chain */ - HOOKPROC16 proc WINE_PACKED; /* 02 Hook procedure */ + HOOKPROC32 proc WINE_PACKED; /* 02 Hook procedure */ INT16 id; /* 06 Hook id (WH_xxx) */ HQUEUE16 ownerQueue; /* 08 Owner queue (0 for system hook) */ HMODULE16 ownerModule; /* 0a Owner module */ WORD inHookProc; /* 0c TRUE if in this->proc */ + INT32 flags; } HOOKDATA; #pragma pack(4) @@ -40,6 +46,743 @@ typedef struct /* This should probably reside in USER heap */ static HANDLE16 HOOK_systemHooks[WH_NB_HOOKS] = { 0, }; +typedef VOID (*HOOK_MapFunc)(INT32, INT32, WPARAM32 *, LPARAM *); +typedef VOID (*HOOK_UnMapFunc)(INT32, INT32, WPARAM32, LPARAM, WPARAM32, + LPARAM); + + +/*********************************************************************** + * Hook Mapping Functions + */ + + +/*********************************************************************** + * HOOK_Map16To32Common + */ +static void HOOK_Map16To32Common(INT32 id, INT32 code, WPARAM32 *pwParam, + LPARAM *plParam) +{ + switch (id) + { + case WH_MSGFILTER: + case WH_SYSMSGFILTER: + case WH_GETMESSAGE: + case WH_JOURNALRECORD: + { + LPMSG16 lpmsg16 = PTR_SEG_TO_LIN(*plParam); + LPMSG32 lpmsg32 = HeapAlloc( SystemHeap, 0, sizeof(*lpmsg32) ); + + STRUCT32_MSG16to32( lpmsg16, lpmsg32 ); + *plParam = (LPARAM)lpmsg32; + break; + } + case WH_JOURNALPLAYBACK: + { + LPEVENTMSG16 lpem16 = PTR_SEG_TO_LIN(*plParam); + LPEVENTMSG32 lpem32 = HeapAlloc( SystemHeap, 0, sizeof(*lpem32) ); + + lpem32->message = lpem16->message; + lpem32->paramL = lpem16->paramL; + lpem32->paramH = lpem16->paramH; + lpem32->time = lpem16->time; + lpem32->hwnd = 0; /* FIXME */ + + *plParam = (LPARAM)lpem32; + break; + } + case WH_CBT: + switch (code) + { + case HCBT_ACTIVATE: + { + LPCBTACTIVATESTRUCT16 lpcas16 = PTR_SEG_TO_LIN(*plParam); + LPCBTACTIVATESTRUCT32 lpcas32 = HeapAlloc( SystemHeap, 0, + sizeof(*lpcas32) ); + lpcas32->fMouse = lpcas16->fMouse; + lpcas32->hWndActive = lpcas16->hWndActive; + *plParam = (LPARAM)lpcas32; + break; + } + case HCBT_CLICKSKIPPED: + { + LPMOUSEHOOKSTRUCT16 lpms16 = PTR_SEG_TO_LIN(*plParam); + LPMOUSEHOOKSTRUCT32 lpms32 = HeapAlloc( SystemHeap, 0, + sizeof(*lpms32) ); + + STRUCT32_POINT16to32( &lpms16->pt, &lpms32->pt ); + + /* wHitTestCode may be negative, so convince compiler to do + correct sign extension. Yay. :| */ + lpms32->wHitTestCode = (INT32)((INT16)lpms16->wHitTestCode); + + lpms32->dwExtraInfo = lpms16->dwExtraInfo; + lpms32->hwnd = lpms16->hwnd; + *plParam = (LPARAM)lpms32; + break; + } + case HCBT_MOVESIZE: + { + LPRECT16 lprect16 = PTR_SEG_TO_LIN(*plParam); + LPRECT32 lprect32 = HeapAlloc( SystemHeap, 0, + sizeof(*lprect32) ); + + STRUCT32_RECT16to32( lprect16, lprect32 ); + *plParam = (LPARAM)lprect32; + break; + } + } + break; + case WH_MOUSE: + { + LPMOUSEHOOKSTRUCT16 lpms16 = PTR_SEG_TO_LIN(*plParam); + LPMOUSEHOOKSTRUCT32 lpms32 = HeapAlloc( SystemHeap, 0, + sizeof(*lpms32) ); + + STRUCT32_POINT16to32( &lpms16->pt, &lpms32->pt ); + + /* wHitTestCode may be negative, so convince compiler to do + correct sign extension. Yay. :| */ + lpms32->wHitTestCode = (INT32)((INT16)lpms16->wHitTestCode); + lpms32->dwExtraInfo = lpms16->dwExtraInfo; + lpms32->hwnd = lpms16->hwnd; + *plParam = (LPARAM)lpms32; + break; + } + case WH_DEBUG: + { + LPDEBUGHOOKINFO16 lpdh16 = PTR_SEG_TO_LIN(*plParam); + LPDEBUGHOOKINFO32 lpdh32 = HeapAlloc( SystemHeap, 0, + sizeof(*lpdh32) ); + + lpdh32->idThread = 0; /* FIXME */ + lpdh32->idThreadInstaller = 0; /* FIXME */ + lpdh32->lParam = lpdh16->lParam; /* FIXME Check for sign ext */ + lpdh32->wParam = lpdh16->wParam; + lpdh32->code = lpdh16->code; + + /* do sign extension if it was WH_MSGFILTER */ + if (*pwParam == 0xffff) *pwParam = WH_MSGFILTER; + + *plParam = (LPARAM)lpdh32; + break; + } + case WH_SHELL: + case WH_KEYBOARD: + break; + + case WH_CALLWNDPROC: + case WH_HARDWARE: + break; /* NYI */ + + default: + fprintf(stderr, "Unknown hook id: %d\n", id); + return; + } +} + + +/*********************************************************************** + * HOOK_Map16To32A + */ +static void HOOK_Map16To32A(INT32 id, INT32 code, WPARAM32 *pwParam, + LPARAM *plParam) +{ + if (id == WH_CBT && code == HCBT_CREATEWND) + { + LPCBT_CREATEWND16 lpcbtcw16 = PTR_SEG_TO_LIN(*plParam); + LPCBT_CREATEWND32A lpcbtcw32 = HeapAlloc( SystemHeap, 0, + sizeof(*lpcbtcw32) ); + lpcbtcw32->lpcs = HeapAlloc( SystemHeap, 0, + sizeof(*lpcbtcw32->lpcs) ); + + STRUCT32_CREATESTRUCT16to32A( lpcbtcw16->lpcs, lpcbtcw32->lpcs ); + + if (HIWORD(lpcbtcw16->lpcs->lpszName)) + lpcbtcw32->lpcs->lpszName + = PTR_SEG_TO_LIN(lpcbtcw16->lpcs->lpszName); + else + lpcbtcw32->lpcs->lpszName = (LPSTR)lpcbtcw16->lpcs->lpszName; + + if (HIWORD(lpcbtcw16->lpcs->lpszClass)) + lpcbtcw32->lpcs->lpszClass + = PTR_SEG_TO_LIN(lpcbtcw16->lpcs->lpszClass); + else + lpcbtcw32->lpcs->lpszClass = (LPSTR)lpcbtcw16->lpcs->lpszClass; + + lpcbtcw32->hwndInsertAfter = lpcbtcw16->hwndInsertAfter; + + *plParam = (LPARAM)lpcbtcw32; + } + else + HOOK_Map16To32Common( id, code, pwParam, plParam ); +} + + +/*********************************************************************** + * HOOK_Map16To32W + */ +static void HOOK_Map16To32W(INT32 id, INT32 code, WPARAM32 *pwParam, + LPARAM *plParam) +{ + if (id == WH_CBT && code == HCBT_CREATEWND) + { + LPCBT_CREATEWND16 lpcbtcw16 = PTR_SEG_TO_LIN(*plParam); + LPCREATESTRUCT16 lpcs16 = PTR_SEG_TO_LIN(lpcbtcw16->lpcs); + LPCBT_CREATEWND32W lpcbtcw32 = HeapAlloc( SystemHeap, 0, + sizeof(*lpcbtcw32) ); + lpcbtcw32->lpcs = HeapAlloc( SystemHeap, 0, + sizeof(*lpcbtcw32->lpcs) ); + + STRUCT32_CREATESTRUCT16to32A( lpcs16, + (LPCREATESTRUCT32A)lpcbtcw32->lpcs ); + + if (HIWORD(lpcs16->lpszName)) + lpcbtcw32->lpcs->lpszName = + STRING32_DupAnsiToUni( PTR_SEG_TO_LIN(lpcs16->lpszName) ); + else + lpcbtcw32->lpcs->lpszName = (LPWSTR)lpcs16->lpszName; + + if (HIWORD(lpcs16->lpszClass)) + lpcbtcw32->lpcs->lpszClass = + STRING32_DupAnsiToUni( PTR_SEG_TO_LIN(lpcs16->lpszClass) ); + else + lpcbtcw32->lpcs->lpszClass = (LPWSTR)lpcs16->lpszClass; + + lpcbtcw32->hwndInsertAfter = lpcbtcw16->hwndInsertAfter; + + *plParam = (LPARAM)lpcbtcw32; + } + else HOOK_Map16To32Common( id, code, pwParam, plParam ); +} + + +/*********************************************************************** + * HOOK_UnMap16To32Common + */ +static void HOOK_UnMap16To32Common(INT32 id, INT32 code, WPARAM32 wParamOrig, + LPARAM lParamOrig, WPARAM32 wParam, + LPARAM lParam) +{ + switch (id) + { + case WH_MSGFILTER: + case WH_SYSMSGFILTER: + case WH_JOURNALRECORD: + case WH_JOURNALPLAYBACK: + { + HeapFree( SystemHeap, 0, (LPVOID)lParam ); + break; + } + + case WH_GETMESSAGE: + { + LPMSG16 lpmsg16 = PTR_SEG_TO_LIN(lParamOrig); + STRUCT32_MSG32to16( (LPMSG32)lParam, lpmsg16 ); + HeapFree( SystemHeap, 0, (LPVOID)lParam ); + break; + } + + case WH_MOUSE: + case WH_DEBUG: + HeapFree( SystemHeap, 0, (LPVOID)lParam ); + break; + + /* I don't think any of these need to be copied */ + case WH_CBT: + switch (code) + { + case HCBT_ACTIVATE: + case HCBT_CLICKSKIPPED: + case HCBT_MOVESIZE: + HeapFree( SystemHeap, 0, (LPVOID)lParam); + break; + } + break; + + case WH_SHELL: + case WH_KEYBOARD: + break; + + case WH_CALLWNDPROC: + case WH_HARDWARE: + fprintf(stderr, "Can't map hook id: %d\n", id); + break; + + default: + fprintf(stderr, "Unknown hook id: %d\n", id); + return; + } +} + + +/*********************************************************************** + * HOOK_UnMap16To32A + */ +static void HOOK_UnMap16To32A(INT32 id, INT32 code, WPARAM32 wParamOrig, + LPARAM lParamOrig, WPARAM32 wParam, + LPARAM lParam) +{ + if (id == WH_CBT && code == HCBT_CREATEWND) + { + LPCBT_CREATEWND32A lpcbtcw32 = (LPCBT_CREATEWND32A)lParam; + HeapFree( SystemHeap, 0, lpcbtcw32->lpcs ); + HeapFree( SystemHeap, 0, lpcbtcw32 ); + } + else + HOOK_UnMap16To32Common( id, code, wParamOrig, lParamOrig, wParam, + lParam); + return; +} + + +/*********************************************************************** + * HOOK_UnMap16To32W + */ +static void HOOK_UnMap16To32W(INT32 id, INT32 code, WPARAM32 wParamOrig, + LPARAM lParamOrig, WPARAM32 wParam, + LPARAM lParam) +{ + if (id == WH_CBT && code == HCBT_CREATEWND) + { + LPCBT_CREATEWND32W lpcbtcw32 = (LPCBT_CREATEWND32W)lParam; + if (HIWORD(lpcbtcw32->lpcs->lpszName)) + free( (LPWSTR)lpcbtcw32->lpcs->lpszName ); + if (HIWORD(lpcbtcw32->lpcs->lpszClass)) + free( (LPWSTR)lpcbtcw32->lpcs->lpszClass ); + HeapFree( SystemHeap, 0, lpcbtcw32->lpcs ); + HeapFree( SystemHeap, 0, lpcbtcw32 ); + } + else + HOOK_UnMap16To32Common(id, code, wParamOrig, lParamOrig, wParam, lParam); +} + + +/*********************************************************************** + * HOOK_Map32To16Common + */ +static void HOOK_Map32To16Common(INT32 id, INT32 code, WPARAM32 *pwParam, + LPARAM *plParam) +{ + switch (id) + { + case WH_MSGFILTER: + case WH_SYSMSGFILTER: + case WH_GETMESSAGE: + case WH_JOURNALRECORD: + { + LPMSG32 lpmsg32 = (LPMSG32)*plParam; + LPMSG16 lpmsg16 = SEGPTR_NEW( MSG16 ); + + STRUCT32_MSG32to16( lpmsg32, lpmsg16 ); + + *plParam = (LPARAM)SEGPTR_GET( lpmsg16 ); + break; + } + + case WH_JOURNALPLAYBACK: + { + LPEVENTMSG32 lpem32 = (LPEVENTMSG32)*plParam; + LPEVENTMSG16 lpem16 = SEGPTR_NEW( EVENTMSG16 ); + + lpem16->message = lpem32->message; + lpem16->paramL = lpem32->paramL; + lpem16->paramH = lpem32->paramH; + lpem16->time = lpem32->time; + + *plParam = (LPARAM)SEGPTR_GET( lpem16 ); + break; + } + + case WH_CBT: + switch (code) + { + case HCBT_ACTIVATE: + { + LPCBTACTIVATESTRUCT32 lpcas32 = (LPCBTACTIVATESTRUCT32)*plParam; + LPCBTACTIVATESTRUCT16 lpcas16 =SEGPTR_NEW( CBTACTIVATESTRUCT16 ); + + lpcas16->fMouse = lpcas32->fMouse; + lpcas16->hWndActive = lpcas32->hWndActive +; + *plParam = (LPARAM)SEGPTR_GET( lpcas16 ); + break; + } + + case HCBT_CLICKSKIPPED: + { + LPMOUSEHOOKSTRUCT32 lpms32 = (LPMOUSEHOOKSTRUCT32)*plParam; + LPMOUSEHOOKSTRUCT16 lpms16 = SEGPTR_NEW( MOUSEHOOKSTRUCT16 ); + + STRUCT32_POINT32to16( &lpms32->pt, &lpms16->pt ); + + lpms16->hwnd = lpms32->hwnd; + lpms16->wHitTestCode = lpms32->wHitTestCode; + lpms16->dwExtraInfo = lpms32->dwExtraInfo; + + *plParam = (LPARAM)SEGPTR_GET( lpms16 ); + break; + } + + case HCBT_MOVESIZE: + { + LPRECT32 lprect32 = (LPRECT32)*plParam; + LPRECT16 lprect16 = SEGPTR_NEW( RECT16 ); + + STRUCT32_RECT32to16( lprect32, lprect16 ); + + *plParam = (LPARAM)SEGPTR_GET( lprect16 ); + break; + } + } + break; + + case WH_MOUSE: + { + LPMOUSEHOOKSTRUCT32 lpms32 = (LPMOUSEHOOKSTRUCT32)*plParam; + LPMOUSEHOOKSTRUCT16 lpms16 = SEGPTR_NEW( MOUSEHOOKSTRUCT16 ); + + STRUCT32_POINT32to16( &lpms32->pt, &lpms16->pt ); + + lpms16->hwnd = lpms32->hwnd; + lpms16->wHitTestCode = lpms32->wHitTestCode; + lpms16->dwExtraInfo = lpms32->dwExtraInfo; + + *plParam = (LPARAM)SEGPTR_GET( lpms16 ); + break; + } + + case WH_DEBUG: + { + LPDEBUGHOOKINFO32 lpdh32 = (LPDEBUGHOOKINFO32)*plParam; + LPDEBUGHOOKINFO16 lpdh16 = SEGPTR_NEW( DEBUGHOOKINFO16 ); + + lpdh16->hModuleHook = 0; /* FIXME */ + lpdh16->reserved = 0; + lpdh16->lParam = lpdh32->lParam; + lpdh16->wParam = lpdh32->wParam; + lpdh16->code = lpdh32->code; + + *plParam = (LPARAM)SEGPTR_GET( lpdh16 ); + break; + } + + case WH_SHELL: + case WH_KEYBOARD: + break; + + case WH_CALLWNDPROC: + case WH_HARDWARE: + fprintf(stderr, "Can't map hook id: %d\n", id); + break; + + default: + fprintf(stderr, "Unknown hook id: %d\n", id); + return; + } +} + + +/*********************************************************************** + * HOOK_Map32ATo16 + */ +static void HOOK_Map32ATo16(INT32 id, INT32 code, WPARAM32 *pwParam, + LPARAM *plParam) +{ + if (id == WH_CBT && code == HCBT_CREATEWND) + { + LPCBT_CREATEWND32A lpcbtcw32 = (LPCBT_CREATEWND32A)*plParam; + LPCBT_CREATEWND16 lpcbtcw16 = SEGPTR_NEW( CBT_CREATEWND16 ); + LPCREATESTRUCT16 lpcs16 = SEGPTR_NEW( CREATESTRUCT16 ); + + lpcbtcw16->lpcs = (LPCREATESTRUCT16)SEGPTR_GET( lpcs16 ); + STRUCT32_CREATESTRUCT32Ato16( lpcbtcw32->lpcs, lpcs16 ); + + if (HIWORD(lpcbtcw32->lpcs->lpszName)) + lpcs16->lpszName = + SEGPTR_GET( SEGPTR_STRDUP( lpcbtcw32->lpcs->lpszName ) ); + else + lpcs16->lpszName = (SEGPTR)lpcbtcw32->lpcs->lpszName; + + if (HIWORD(lpcbtcw32->lpcs->lpszClass)) + lpcs16->lpszClass = + SEGPTR_GET( SEGPTR_STRDUP( lpcbtcw32->lpcs->lpszClass ) ); + else + lpcs16->lpszClass = (SEGPTR)lpcbtcw32->lpcs->lpszClass; + + lpcbtcw16->hwndInsertAfter = lpcbtcw32->hwndInsertAfter; + + *plParam = (LPARAM)SEGPTR_GET( lpcbtcw16 ); + } + else HOOK_Map32To16Common(id, code, pwParam, plParam); +} + + +/*********************************************************************** + * HOOK_Map32WTo16 + */ +static void HOOK_Map32WTo16(INT32 id, INT32 code, WPARAM32 *pwParam, + LPARAM *plParam) +{ + if (id == WH_CBT && code == HCBT_CREATEWND) + { + LPCBT_CREATEWND32W lpcbtcw32 = (LPCBT_CREATEWND32W)*plParam; + LPCBT_CREATEWND16 lpcbtcw16 = SEGPTR_NEW( CBT_CREATEWND16 ); + LPCREATESTRUCT16 lpcs16 = SEGPTR_NEW( CREATESTRUCT16 ); + + lpcbtcw16->lpcs = (LPCREATESTRUCT16)SEGPTR_GET( lpcs16 ); + STRUCT32_CREATESTRUCT32Ato16( (LPCREATESTRUCT32A)lpcbtcw32->lpcs, + lpcs16 ); + + if (HIWORD(lpcbtcw32->lpcs->lpszName)) + { + LPSTR str = SEGPTR_ALLOC( lstrlen32W(lpcbtcw32->lpcs->lpszName) ); + STRING32_UniToAnsi( str, lpcbtcw32->lpcs->lpszName ); + lpcs16->lpszName = SEGPTR_GET( str ); + } + else + lpcs16->lpszName = (SEGPTR)lpcbtcw32->lpcs->lpszName; + + if (HIWORD(lpcbtcw32->lpcs->lpszClass)) + { + LPSTR str = SEGPTR_ALLOC( lstrlen32W(lpcbtcw32->lpcs->lpszClass) ); + STRING32_UniToAnsi( str, lpcbtcw32->lpcs->lpszClass ); + lpcs16->lpszClass = SEGPTR_GET( str ); + } + else + lpcs16->lpszClass = (SEGPTR)lpcbtcw32->lpcs->lpszClass; + + lpcbtcw16->hwndInsertAfter = lpcbtcw32->hwndInsertAfter; + + *plParam = (LPARAM)SEGPTR_GET( lpcbtcw16 ); + } + else HOOK_Map32To16Common(id, code, pwParam, plParam); +} + + +/*********************************************************************** + * HOOK_UnMap32To16Common + */ +static void HOOK_UnMap32To16Common(INT32 id, INT32 code, WPARAM32 wParamOrig, + LPARAM lParamOrig, WPARAM32 wParam, + LPARAM lParam) +{ + switch (id) + { + case WH_MSGFILTER: + case WH_SYSMSGFILTER: + case WH_JOURNALRECORD: + case WH_JOURNALPLAYBACK: + case WH_MOUSE: + case WH_DEBUG: + SEGPTR_FREE( PTR_SEG_TO_LIN(lParam) ); + break; + + case WH_GETMESSAGE: + { + LPMSG32 lpmsg32 = (LPMSG32)lParamOrig; + + STRUCT32_MSG16to32( (LPMSG16)PTR_SEG_TO_LIN(lParam), lpmsg32 ); + SEGPTR_FREE( PTR_SEG_TO_LIN(lParam) ); + break; + } + + case WH_CBT: + switch (code) + { + case HCBT_ACTIVATE: + case HCBT_CLICKSKIPPED: + case HCBT_MOVESIZE: + SEGPTR_FREE( (LPVOID)lParam ); + break; + } + break; + + case WH_SHELL: + case WH_KEYBOARD: + break; + + case WH_CALLWNDPROC: + case WH_HARDWARE: + fprintf(stderr, "Can't map hook id: %d\n", id); + break; + + default: + fprintf(stderr, "Unknown hook id: %d\n", id); + return; + } +} + + +/*********************************************************************** + * HOOK_UnMap32ATo16 + */ +static void HOOK_UnMap32ATo16(INT32 id, INT32 code, WPARAM32 wParamOrig, + LPARAM lParamOrig, WPARAM32 wParam, + LPARAM lParam) +{ + if (id == WH_CBT && code == HCBT_CREATEWND) + { + LPCBT_CREATEWND16 lpcbtcw16 = PTR_SEG_TO_LIN(lParam); + LPCREATESTRUCT16 lpcs16 = PTR_SEG_TO_LIN(lpcbtcw16->lpcs); + + if (HIWORD(lpcs16->lpszName)) + SEGPTR_FREE( PTR_SEG_TO_LIN(lpcs16->lpszName) ); + + if (HIWORD(lpcs16->lpszClass)) + SEGPTR_FREE( PTR_SEG_TO_LIN(lpcs16->lpszClass) ); + + SEGPTR_FREE( lpcs16 ); + SEGPTR_FREE( lpcbtcw16 ); + } + else + return HOOK_UnMap32To16Common( id, code, wParamOrig, lParamOrig, wParam, + lParam ); + return; +} + + +/*********************************************************************** + * HOOK_UnMap32WTo16 + */ +static void HOOK_UnMap32WTo16(INT32 id, INT32 code, WPARAM32 wParamOrig, + LPARAM lParamOrig, WPARAM32 wParam, + LPARAM lParam) +{ + HOOK_UnMap32ATo16( id, code, wParamOrig, lParamOrig, wParam, lParam ); +} + + +/*********************************************************************** + * HOOK_Map32ATo32W + */ +static void HOOK_Map32ATo32W(INT32 id, INT32 code, WPARAM32 *pwParam, + LPARAM *plParam) +{ + if (id == WH_CBT && code == HCBT_CREATEWND) + { + LPCBT_CREATEWND32A lpcbtcwA = (LPCBT_CREATEWND32A)*plParam; + LPCBT_CREATEWND32W lpcbtcwW = HeapAlloc( SystemHeap, 0, + sizeof(*lpcbtcwW) ); + lpcbtcwW->lpcs = HeapAlloc( SystemHeap, 0, sizeof(*lpcbtcwW->lpcs) ); + + lpcbtcwW->hwndInsertAfter = lpcbtcwA->hwndInsertAfter; + *lpcbtcwW->lpcs = *(LPCREATESTRUCT32W)lpcbtcwA->lpcs; + + if (HIWORD(lpcbtcwA->lpcs->lpszName)) + { + lpcbtcwW->lpcs->lpszName = + STRING32_DupAnsiToUni( lpcbtcwA->lpcs->lpszName ); + } + else + lpcbtcwW->lpcs->lpszName = (LPWSTR)lpcbtcwA->lpcs->lpszName; + + if (HIWORD(lpcbtcwA->lpcs->lpszClass)) + { + lpcbtcwW->lpcs->lpszClass = + STRING32_DupAnsiToUni( lpcbtcwA->lpcs->lpszClass); + } + else + lpcbtcwW->lpcs->lpszClass = (LPCWSTR)lpcbtcwA->lpcs->lpszClass; + } + return; +} + + +/*********************************************************************** + * HOOK_UnMap32ATo32W + */ +static void HOOK_UnMap32ATo32W(INT32 id, INT32 code, WPARAM32 wParamOrig, + LPARAM lParamOrig, WPARAM32 wParam, + LPARAM lParam) +{ + if (id == WH_CBT && code == HCBT_CREATEWND) + { + LPCBT_CREATEWND32W lpcbtcwW = (LPCBT_CREATEWND32W)lParam; + if (HIWORD(lpcbtcwW->lpcs->lpszName)) + free( (LPWSTR)lpcbtcwW->lpcs->lpszName ); + if (HIWORD(lpcbtcwW->lpcs->lpszClass)) + free( (LPWSTR)lpcbtcwW->lpcs->lpszClass ); + HeapFree( SystemHeap, 0, lpcbtcwW->lpcs ); + HeapFree( SystemHeap, 0, lpcbtcwW ); + } + return; +} + + +/*********************************************************************** + * HOOK_Map32WTo32A + */ +static void HOOK_Map32WTo32A(INT32 id, INT32 code, WPARAM32 *pwParam, + LPARAM *plParam) +{ + if (id == WH_CBT && code == HCBT_CREATEWND) + { + LPCBT_CREATEWND32W lpcbtcwW = (LPCBT_CREATEWND32W)*plParam; + LPCBT_CREATEWND32A lpcbtcwA = HeapAlloc( SystemHeap, 0, + sizeof(*lpcbtcwA) ); + lpcbtcwA->lpcs = HeapAlloc( SystemHeap, 0, sizeof(*lpcbtcwA->lpcs) ); + + lpcbtcwA->hwndInsertAfter = lpcbtcwW->hwndInsertAfter; + *lpcbtcwA->lpcs = *(LPCREATESTRUCT32A)lpcbtcwW->lpcs; + + if (HIWORD(lpcbtcwW->lpcs->lpszName)) + lpcbtcwA->lpcs->lpszName = + STRING32_DupUniToAnsi( lpcbtcwW->lpcs->lpszName ); + else + lpcbtcwA->lpcs->lpszName = (LPSTR)lpcbtcwW->lpcs->lpszName; + + if (HIWORD(lpcbtcwW->lpcs->lpszClass)) + lpcbtcwA->lpcs->lpszClass = + STRING32_DupUniToAnsi( lpcbtcwW->lpcs->lpszClass); + else + lpcbtcwA->lpcs->lpszClass = (LPSTR)lpcbtcwW->lpcs->lpszClass; + } + return; +} + + +/*********************************************************************** + * HOOK_UnMap32WTo32A + */ +static void HOOK_UnMap32WTo32A(INT32 id, INT32 code, WPARAM32 wParamOrig, + LPARAM lParamOrig, WPARAM32 wParam, + LPARAM lParam) +{ + if (id == WH_CBT && code == HCBT_CREATEWND) + { + LPCBT_CREATEWND32A lpcbtcwA = (LPCBT_CREATEWND32A)lParam; + if (HIWORD(lpcbtcwA->lpcs->lpszName)) + free( (LPSTR)lpcbtcwA->lpcs->lpszName ); + if (HIWORD(lpcbtcwA->lpcs->lpszClass)) + free( (LPSTR)lpcbtcwA->lpcs->lpszClass ); + HeapFree( SystemHeap, 0, lpcbtcwA->lpcs ); + HeapFree( SystemHeap, 0, lpcbtcwA ); + } + return; +} + + +/*********************************************************************** + * Map Function Tables + */ +static const HOOK_MapFunc HOOK_MapFuncs[3][3] = +{ + { NULL, HOOK_Map16To32A, HOOK_Map16To32W }, + { HOOK_Map32ATo16, NULL, HOOK_Map32ATo32W }, + { HOOK_Map32WTo16, HOOK_Map32WTo32A, NULL } +}; + +static const HOOK_UnMapFunc HOOK_UnMapFuncs[3][3] = +{ + { NULL, HOOK_UnMap16To32A, HOOK_UnMap16To32W }, + { HOOK_UnMap32ATo16, NULL, HOOK_UnMap32ATo32W }, + { HOOK_UnMap32WTo16, HOOK_UnMap32WTo32A, NULL } +}; + + +/*********************************************************************** + * Internal Functions + */ /*********************************************************************** * HOOK_GetNextHook @@ -49,9 +792,11 @@ static HANDLE16 HOOK_systemHooks[WH_NB_HOOKS] = { 0, }; static HANDLE16 HOOK_GetNextHook( HANDLE16 hook ) { HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR( hook ); + if (!data || !hook) return 0; if (data->next) return data->next; if (!data->ownerQueue) return 0; /* Already system hook */ + /* Now start enumerating the system hooks */ return HOOK_systemHooks[data->id - WH_MINHOOK]; } @@ -62,7 +807,7 @@ static HANDLE16 HOOK_GetNextHook( HANDLE16 hook ) * * Get the first hook for a given type. */ -HANDLE16 HOOK_GetHook( INT16 id , HQUEUE16 hQueue ) +static HANDLE16 HOOK_GetHook( INT16 id, HQUEUE16 hQueue ) { MESSAGEQUEUE *queue; HANDLE16 hook = 0; @@ -74,25 +819,13 @@ HANDLE16 HOOK_GetHook( INT16 id , HQUEUE16 hQueue ) } -/*********************************************************************** - * HOOK_GetProc16 - */ -HOOKPROC16 HOOK_GetProc16( HHOOK hhook ) -{ - HOOKDATA *data; - if (HIWORD(hhook) != HOOK_MAGIC) return NULL; - if (!(data = (HOOKDATA *)USER_HEAP_LIN_ADDR( LOWORD(hhook) ))) return NULL; - return data->proc; -} - - /*********************************************************************** * HOOK_SetHook * * Install a given hook. */ -static HANDLE16 HOOK_SetHook( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst, - HTASK16 hTask ) +static HANDLE16 HOOK_SetHook( INT16 id, LPVOID proc, INT32 type, + HINSTANCE16 hInst, HTASK16 hTask ) { HOOKDATA *data; HANDLE16 handle; @@ -104,6 +837,8 @@ static HANDLE16 HOOK_SetHook( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst, dprintf_hook( stddeb, "Setting hook %d: %08x %04x %04x\n", id, (UINT32)proc, hInst, hTask ); + if (id == WH_JOURNALPLAYBACK) EnableHardwareInput(FALSE); + if (hTask) /* Task-specific hook */ { if ((id == WH_JOURNALRECORD) || (id == WH_JOURNALPLAYBACK) || @@ -111,19 +846,6 @@ static HANDLE16 HOOK_SetHook( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst, if (!(hQueue = GetTaskQueue( hTask ))) return 0; } - if (id == WH_DEBUG) - { - fprintf( stdnimp,"WH_DEBUG is broken in 16-bit Windows.\n"); - return 0; - } - else if (id == WH_CBT || id == WH_SHELL) - { - fprintf( stdnimp, "Half-implemented hook set: (%s,%08lx,%04x,%04x)!\n", - (id==WH_CBT)?"WH_CBT":"WH_SHELL", (DWORD)proc, hInst, hTask ); - } - - if (id == WH_JOURNALPLAYBACK) EnableHardwareInput(FALSE); - /* Create the hook structure */ if (!(handle = USER_HEAP_ALLOC( sizeof(HOOKDATA) ))) return 0; @@ -133,6 +855,7 @@ static HANDLE16 HOOK_SetHook( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst, data->ownerQueue = hQueue; data->ownerModule = hInst; data->inHookProc = 0; + data->flags = type; /* Insert it in the correct linked list */ @@ -170,7 +893,7 @@ static BOOL32 HOOK_RemoveHook( HANDLE16 hook ) { /* Mark it for deletion later on */ dprintf_hook( stddeb, "Hook still running, deletion delayed\n" ); - data->proc = (HOOKPROC16)0; + data->proc = (HOOKPROC32)0; return TRUE; } @@ -196,58 +919,145 @@ static BOOL32 HOOK_RemoveHook( HANDLE16 hook ) } +/*********************************************************************** + * HOOK_FindValidHook + */ +static HANDLE16 HOOK_FindValidHook( HANDLE16 hook ) +{ + HOOKDATA *data; + + for (;;) + { + if (!(data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook))) return 0; + if (data->proc) return hook; + hook = data->next; + } +} + + /*********************************************************************** * HOOK_CallHook * * Call a hook procedure. */ -static LRESULT HOOK_CallHook( HANDLE16 hook, INT16 code, - WPARAM16 wParam, LPARAM lParam ) +static LRESULT HOOK_CallHook( HANDLE16 hook, INT32 fromtype, INT32 code, + WPARAM32 wParam, LPARAM lParam ) { - HOOKDATA *data; MESSAGEQUEUE *queue; HANDLE16 prevHook; + HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook); LRESULT ret; - /* Find the first hook with a valid proc */ + WPARAM32 wParamOrig = wParam; + LPARAM lParamOrig = lParam; + HOOK_MapFunc MapFunc; + HOOK_UnMapFunc UnMapFunc; - for (;;) - { - if (!hook) return 0; - if (!(data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook))) return 0; - if (data->proc) break; - hook = data->next; - } + MapFunc = HOOK_MapFuncs[fromtype][data->flags & HOOK_MAPTYPE]; + UnMapFunc = HOOK_UnMapFuncs[fromtype][data->flags & HOOK_MAPTYPE]; + + if (MapFunc) + MapFunc( data->id, code, &wParam, &lParam ); /* Now call it */ if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0; prevHook = queue->hCurHook; queue->hCurHook = hook; - data->inHookProc = 1; + data->inHookProc = TRUE; + + dprintf_hook( stddeb, "Calling hook %04x: %d %08x %08lx\n", + hook, code, wParam, lParam ); + + ret = data->proc(code, wParam, lParam); - dprintf_hook( stddeb, "Calling hook %04x: proc=%p %d %04lx %08lx\n", - hook, data->proc, code, (DWORD)wParam, lParam ); - ret = data->proc( code, wParam, lParam ); dprintf_hook( stddeb, "Ret hook %04x = %08lx\n", hook, ret ); - data->inHookProc = 0; + data->inHookProc = FALSE; queue->hCurHook = prevHook; + + if (UnMapFunc) + UnMapFunc( data->id, code, wParamOrig, lParamOrig, wParam, lParam ); + if (!data->proc) HOOK_RemoveHook( hook ); + return ret; } +/*********************************************************************** + * Exported Functions & APIs + */ + +/*********************************************************************** + * HOOK_GetProc16 + * + * Don't call this unless you are the if1632/thunk.c. + */ +HOOKPROC16 HOOK_GetProc16( HHOOK hhook ) +{ + HOOKDATA *data; + if (HIWORD(hhook) != HOOK_MAGIC) return NULL; + if (!(data = (HOOKDATA *)USER_HEAP_LIN_ADDR( LOWORD(hhook) ))) return NULL; + if (data->flags & HOOK_WIN32) return NULL; + return (HOOKPROC16)data->proc; +} + /*********************************************************************** - * HOOK_CallHooks + * HOOK_IsHooked + * + * Replacement for calling HOOK_GetHook from other modules. + */ +BOOL32 HOOK_IsHooked( INT16 id ) +{ + return HOOK_GetHook( id, GetTaskQueue(0) ) != 0; +} + + +/*********************************************************************** + * HOOK_CallHooks16 * * Call a hook chain. */ -LRESULT HOOK_CallHooks( INT16 id, INT16 code, WPARAM16 wParam, LPARAM lParam ) +LRESULT HOOK_CallHooks16( INT16 id, INT16 code, WPARAM16 wParam, + LPARAM lParam ) { - HANDLE16 hook = HOOK_GetHook( id , GetTaskQueue(0) ); - if (!hook) return 0; - return HOOK_CallHook( hook, code, wParam, lParam ); + HANDLE16 hook; + + if (!(hook = HOOK_GetHook( id , GetTaskQueue(0) ))) return 0; + if (!(hook = HOOK_FindValidHook(hook))) return 0; + return HOOK_CallHook( hook, HOOK_WIN16, code, wParam, lParam ); +} + +/*********************************************************************** + * HOOK_CallHooks32A + * + * Call a hook chain. + */ +LRESULT HOOK_CallHooks32A( INT32 id, INT32 code, WPARAM32 wParam, + LPARAM lParam ) +{ + HANDLE16 hook; + + if (!(hook = HOOK_GetHook( id , GetTaskQueue(0) ))) return 0; + if (!(hook = HOOK_FindValidHook(hook))) return 0; + return HOOK_CallHook( hook, HOOK_WIN32, code, wParam, lParam ); +} + +/*********************************************************************** + * HOOK_CallHooks32W + * + * Call a hook chain. + */ +LRESULT HOOK_CallHooks32W( INT32 id, INT32 code, WPARAM32 wParam, + LPARAM lParam ) +{ + HANDLE16 hook; + + if (!(hook = HOOK_GetHook( id , GetTaskQueue(0) ))) return 0; + if (!(hook = HOOK_FindValidHook(hook))) return 0; + return HOOK_CallHook( hook, HOOK_WIN32 | HOOK_UNICODE, code, wParam, + lParam ); } @@ -342,19 +1152,133 @@ void HOOK_FreeQueueHooks( HQUEUE16 hQueue ) */ FARPROC16 SetWindowsHook16( INT16 id, HOOKPROC16 proc ) { - HTASK16 hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0; - HANDLE16 handle = HOOK_SetHook( id, proc, 0, hTask ); + HANDLE16 handle; + HINSTANCE16 hInst = __winelib ? 0 : FarGetOwner( HIWORD(proc) ); + /* WH_MSGFILTER is the only task-specific hook for SetWindowsHook() */ + HTASK16 hTask = (id == WH_MSGFILTER) ? GetCurrentTask() : 0; + + if (id == WH_DEBUG) + { + fprintf( stdnimp, "WH_DEBUG is broken in 16-bit Windows.\n"); + return 0; + } + + handle = HOOK_SetHook( id, proc, HOOK_WIN16, hInst, hTask ); return (handle) ? (FARPROC16)MAKELONG( handle, HOOK_MAGIC ) : NULL; } +/*********************************************************************** + * SetWindowsHook32A (USER32.524) + * + * FIXME: I don't know if this is correct + */ +HHOOK 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_WIN32, hInst, hTask ); + return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : 0; +} + + +/*********************************************************************** + * SetWindowsHook32W (USER32.527) + * + * FIXME: I don't know if this is correct + */ +HHOOK 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_WIN32 | HOOK_UNICODE, + hInst, hTask ); + return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : 0; +} + + +/*********************************************************************** + * SetWindowsHookEx16 (USER.291) + */ +HHOOK SetWindowsHookEx16( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst, + HTASK16 hTask ) +{ + HANDLE16 handle = HOOK_SetHook( id, proc, HOOK_WIN16, hInst, hTask ); + return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : (HHOOK)NULL; +} + + +/*********************************************************************** + * SetWindowsHookEx32A (USER32.525) + */ +HHOOK SetWindowsHookEx32A( INT32 id, HOOKPROC32 proc, HINSTANCE32 hInst, + DWORD dwThreadID ) +{ + HANDLE16 handle; + HTASK16 hTask; + + if (dwThreadID == GetCurrentThreadId()) + hTask = GetCurrentTask(); + else + hTask = LOWORD(dwThreadID); + + handle = HOOK_SetHook( id, proc, HOOK_WIN32, hInst, hTask ); + return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : (HHOOK)NULL; +} + + +/*********************************************************************** + * SetWindowsHookEx32W (USER32.526) + */ +HHOOK SetWindowsHookEx32W( INT32 id, HOOKPROC32 proc, HINSTANCE32 hInst, + DWORD dwThreadID ) +{ + HANDLE16 handle; + HTASK16 hTask; + + if (dwThreadID == GetCurrentThreadId()) + hTask = GetCurrentTask(); + else + hTask = LOWORD(dwThreadID); + + handle = HOOK_SetHook( id, proc, HOOK_WIN32 | HOOK_UNICODE, hInst, hTask ); + return (handle) ? (HHOOK)MAKELONG( handle, HOOK_MAGIC ) : (HHOOK)NULL; +} + + /*********************************************************************** * UnhookWindowsHook16 (USER.234) */ BOOL16 UnhookWindowsHook16( INT16 id, HOOKPROC16 proc ) { - HANDLE16 hook = HOOK_GetHook( id, GetTaskQueue(0) ); + HANDLE16 hook = HOOK_GetHook( id , GetTaskQueue(0) ); + + dprintf_hook( stddeb, "UnhookWindowsHook: %d %08lx\n", id, (DWORD)proc ); + + while (hook) + { + HOOKDATA *data = (HOOKDATA *)USER_HEAP_LIN_ADDR(hook); + if (data->proc == (HOOKPROC32)proc) break; + hook = HOOK_GetNextHook( hook ); + } + if (!hook) return FALSE; + return HOOK_RemoveHook( hook ); +} + + +/*********************************************************************** + * UnhookWindowsHook32 (USER32.556) + */ +BOOL32 UnhookWindowsHook32( INT32 id, HOOKPROC32 proc ) +{ + HANDLE16 hook = HOOK_GetHook( id , GetTaskQueue(0) ); dprintf_hook( stddeb, "UnhookWindowsHook: %d %08lx\n", id, (DWORD)proc ); @@ -370,45 +1294,7 @@ BOOL16 UnhookWindowsHook16( INT16 id, HOOKPROC16 proc ) /*********************************************************************** - * DefHookProc (USER.235) - */ -LRESULT DefHookProc( INT16 code, WPARAM16 wParam, LPARAM lParam, HHOOK *hhook ) -{ - /* Note: the *hhook parameter is never used, since we rely on the - * current hook value from the task queue to find the next hook. */ - MESSAGEQUEUE *queue; - HANDLE16 next; - - if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0; - if (!(next = HOOK_GetNextHook( queue->hCurHook ))) return 0; - return HOOK_CallHook( next, code, wParam, lParam ); -} - - -/*********************************************************************** - * CallMsgFilter (USER.123) - */ -BOOL16 CallMsgFilter( SEGPTR msg, INT16 code ) -{ - if (GetSysModalWindow16()) return FALSE; - if (HOOK_CallHooks( WH_SYSMSGFILTER, code, 0, (LPARAM)msg )) return TRUE; - return HOOK_CallHooks( WH_MSGFILTER, code, 0, (LPARAM)msg ); -} - - -/*********************************************************************** - * SetWindowsHookEx16 (USER.291) - */ -HHOOK SetWindowsHookEx16( INT16 id, HOOKPROC16 proc, HINSTANCE16 hInst, - HTASK16 hTask ) -{ - HANDLE16 handle = HOOK_SetHook( id, proc, hInst, hTask ); - return (handle) ? MAKELONG( handle, HOOK_MAGIC ) : NULL; -} - - -/*********************************************************************** - * UnhookWindowsHookEx16 (USER.292) + * UnhookWindowHookEx16 (USER.292) */ BOOL16 UnhookWindowsHookEx16( HHOOK hhook ) { @@ -418,12 +1304,106 @@ BOOL16 UnhookWindowsHookEx16( HHOOK hhook ) /*********************************************************************** - * CallNextHookEx (USER.293) + * UnhookWindowHookEx32 (USER32.557) */ -LRESULT CallNextHookEx(HHOOK hhook, INT16 code, WPARAM16 wParam, LPARAM lParam) +BOOL32 UnhookWindowsHookEx32( HHOOK hhook ) +{ + return UnhookWindowsHookEx16( hhook ); +} + + +/*********************************************************************** + * CallNextHookEx16 (USER.293) + * + * I wouldn't have separated this into 16 and 32 bit versions, but I + * need a way to figure out if I need to do a mapping or not. + */ +LRESULT CallNextHookEx16( HHOOK hhook, INT16 code, WPARAM16 wParam, + LPARAM lParam ) { HANDLE16 next; + if (HIWORD(hhook) != HOOK_MAGIC) return 0; /* Not a new format hook */ if (!(next = HOOK_GetNextHook( LOWORD(hhook) ))) return 0; - return HOOK_CallHook( next, code, wParam, lParam ); + + return HOOK_CallHook( next, HOOK_WIN16, code, wParam, lParam ); +} + + +/*********************************************************************** + * CallNextHookEx32 (USER32.16) + * + * There aren't ANSI and UNICODE versions of this. + */ +LRESULT CallNextHookEx32( HHOOK hhook, INT32 code, WPARAM32 wParam, + LPARAM lParam ) +{ + HANDLE16 next; + INT32 fromtype; /* figure out Ansi/Unicode */ + HOOKDATA *oldhook; + + if (HIWORD(hhook) != HOOK_MAGIC) return 0; /* Not a new format hook */ + if (!(next = HOOK_GetNextHook( LOWORD(hhook) ))) return 0; + + oldhook = (HOOKDATA *)USER_HEAP_LIN_ADDR( LOWORD(hhook) ); + fromtype = oldhook->flags & HOOK_MAPTYPE; + + if (!(fromtype & HOOK_WIN32)) + fprintf(stderr, "CallNextHookEx32: called from 16bit hook!\n"); + + return HOOK_CallHook( next, fromtype, code, wParam, lParam ); +} + + +/*********************************************************************** + * DefHookProc16 (USER.235) + */ +LRESULT DefHookProc16( INT16 code, WPARAM16 wParam, LPARAM lParam, + HHOOK *hhook ) +{ + /* Note: the *hhook parameter is never used, since we rely on the + * current hook value from the task queue to find the next hook. */ + MESSAGEQUEUE *queue; + + if (!(queue = (MESSAGEQUEUE *)GlobalLock16( GetTaskQueue(0) ))) return 0; + return CallNextHookEx16( queue->hCurHook, code, wParam, lParam ); +} + + +/*********************************************************************** + * CallMsgFilter16 (USER.123) + */ +BOOL16 CallMsgFilter16( SEGPTR msg, INT16 code ) +{ + if (GetSysModalWindow16()) return FALSE; + if (HOOK_CallHooks16( WH_SYSMSGFILTER, code, 0, (LPARAM)msg )) return TRUE; + return HOOK_CallHooks16( WH_MSGFILTER, code, 0, (LPARAM)msg ); +} + + +/*********************************************************************** + * CallMsgFilter32A (USER32.14) + */ +/* + * FIXME: There are ANSI and UNICODE versions of this, plus an unspecified + * version, plus USER (the 16bit one) has a CallMsgFilter32 function. + */ +BOOL32 CallMsgFilter32A( LPMSG32 msg, INT32 code ) +{ + if (GetSysModalWindow16()) return FALSE; /* ??? */ + if (HOOK_CallHooks32A( WH_SYSMSGFILTER, code, 0, (LPARAM)msg )) + return TRUE; + return HOOK_CallHooks32A( WH_MSGFILTER, code, 0, (LPARAM)msg ); +} + + +/*********************************************************************** + * CallMsgFilter32W (USER32.15) + */ +BOOL32 CallMsgFilter32W( LPMSG32 msg, INT32 code ) +{ + if (GetSysModalWindow16()) return FALSE; /* ??? */ + if (HOOK_CallHooks32W( WH_SYSMSGFILTER, code, 0, (LPARAM)msg )) + return TRUE; + return HOOK_CallHooks32W( WH_MSGFILTER, code, 0, (LPARAM)msg ); } diff --git a/windows/message.c b/windows/message.c index 77ee2f9fb13..05f8ad56efe 100644 --- a/windows/message.c +++ b/windows/message.c @@ -91,15 +91,15 @@ static SYSQ_STATUS MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove ) msg->lParam = MAKELONG( pt.x, pt.y ); /* No need to further process the message */ - if (!HOOK_GetHook( WH_MOUSE, GetTaskQueue(0)) || + if (!HOOK_IsHooked( WH_MOUSE ) || !(hook = SEGPTR_NEW(MOUSEHOOKSTRUCT16))) return SYSQ_MSG_ACCEPT; hook->pt = msg->pt; hook->hwnd = msg->hwnd; hook->wHitTestCode = HTCLIENT; hook->dwExtraInfo = 0; - ret = !HOOK_CallHooks( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE, - msg->message, (LPARAM)SEGPTR_GET(hook)); + ret = !HOOK_CallHooks16( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE, + msg->message, (LPARAM)SEGPTR_GET(hook)); SEGPTR_FREE(hook); return ret ? SYSQ_MSG_ACCEPT : SYSQ_MSG_SKIP ; } @@ -195,7 +195,7 @@ static SYSQ_STATUS MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove ) /* Call the WH_MOUSE hook */ - if (!HOOK_GetHook( WH_MOUSE, GetTaskQueue(0)) || + if (!HOOK_IsHooked( WH_MOUSE ) || !(hook = SEGPTR_NEW(MOUSEHOOKSTRUCT16))) return SYSQ_MSG_ACCEPT; @@ -203,8 +203,8 @@ static SYSQ_STATUS MSG_TranslateMouseMsg( MSG16 *msg, BOOL remove ) hook->hwnd = msg->hwnd; hook->wHitTestCode = hittest; hook->dwExtraInfo = 0; - ret = !HOOK_CallHooks( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE, - msg->message, (LPARAM)SEGPTR_GET(hook) ); + ret = !HOOK_CallHooks16( WH_MOUSE, remove ? HC_ACTION : HC_NOREMOVE, + msg->message, (LPARAM)SEGPTR_GET(hook) ); SEGPTR_FREE(hook); return ret ? SYSQ_MSG_ACCEPT : SYSQ_MSG_SKIP; } @@ -245,9 +245,9 @@ static SYSQ_STATUS MSG_TranslateKeyboardMsg( MSG16 *msg, BOOL remove ) if (queue) QUEUE_SetWakeBit( queue, QS_KEY ); return SYSQ_MSG_ABANDON; } - return (HOOK_CallHooks( WH_KEYBOARD, remove ? HC_ACTION : HC_NOREMOVE, - msg->wParam, msg->lParam )) - ? SYSQ_MSG_SKIP : SYSQ_MSG_ACCEPT; + return (HOOK_CallHooks16( WH_KEYBOARD, remove ? HC_ACTION : HC_NOREMOVE, + msg->wParam, msg->lParam ) + ? SYSQ_MSG_SKIP : SYSQ_MSG_ACCEPT); } @@ -268,16 +268,16 @@ static void MSG_JournalRecordMsg( MSG16 *msg ) event->paramH = msg->lParam & 0x7FFF; if (HIWORD(msg->lParam) & 0x0100) event->paramH |= 0x8000; /* special_key - bit */ - HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, - (LPARAM)SEGPTR_GET(event) ); + HOOK_CallHooks16( WH_JOURNALRECORD, HC_ACTION, 0, + (LPARAM)SEGPTR_GET(event) ); } else if ((msg->message >= WM_MOUSEFIRST) && (msg->message <= WM_MOUSELAST)) { event->paramL = LOWORD(msg->lParam); /* X pos */ event->paramH = HIWORD(msg->lParam); /* Y pos */ ClientToScreen16( msg->hwnd, (LPPOINT16)&event->paramL ); - HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, - (LPARAM)SEGPTR_GET(event) ); + HOOK_CallHooks16( WH_JOURNALRECORD, HC_ACTION, 0, + (LPARAM)SEGPTR_GET(event) ); } else if ((msg->message >= WM_NCMOUSEFIRST) && (msg->message <= WM_NCMOUSELAST)) @@ -285,8 +285,8 @@ static void MSG_JournalRecordMsg( MSG16 *msg ) event->paramL = LOWORD(msg->lParam); /* X pos */ event->paramH = HIWORD(msg->lParam); /* Y pos */ event->message += WM_MOUSEMOVE-WM_NCMOUSEMOVE;/* give no info about NC area */ - HOOK_CallHooks( WH_JOURNALRECORD, HC_ACTION, 0, - (LPARAM)SEGPTR_GET(event) ); + HOOK_CallHooks16( WH_JOURNALRECORD, HC_ACTION, 0, + (LPARAM)SEGPTR_GET(event) ); } SEGPTR_FREE(event); } @@ -302,10 +302,11 @@ static int MSG_JournalPlayBackMsg(void) long wtime,lParam; WORD keyDown,i,wParam,result=0; - if ( HOOK_GetHook(WH_JOURNALPLAYBACK, 0) ) + if ( HOOK_IsHooked( WH_JOURNALPLAYBACK ) ) { tmpMsg = SEGPTR_NEW(EVENTMSG16); - wtime=HOOK_CallHooks( WH_JOURNALPLAYBACK, HC_GETNEXT, 0, (LPARAM)SEGPTR_GET(tmpMsg)); + wtime=HOOK_CallHooks16( WH_JOURNALPLAYBACK, HC_GETNEXT, 0, + (LPARAM)SEGPTR_GET(tmpMsg)); /* dprintf_msg(stddeb,"Playback wait time =%ld\n",wtime); */ if (wtime<=0) { @@ -360,7 +361,8 @@ static int MSG_JournalPlayBackMsg(void) tmpMsg->paramL, tmpMsg->paramH, tmpMsg->time, 0 ); } } - HOOK_CallHooks( WH_JOURNALPLAYBACK, HC_SKIP, 0, (LPARAM)SEGPTR_GET(tmpMsg)); + HOOK_CallHooks16( WH_JOURNALPLAYBACK, HC_SKIP, 0, + (LPARAM)SEGPTR_GET(tmpMsg)); } else result= QS_MOUSE | QS_KEY; @@ -412,9 +414,9 @@ static BOOL MSG_PeekHardwareMsg( MSG16 *msg, HWND hwnd, WORD first, WORD last, hook->wMessage = msg->message; hook->wParam = msg->wParam; hook->lParam = msg->lParam; - ret = HOOK_CallHooks( WH_HARDWARE, - remove ? HC_ACTION : HC_NOREMOVE, - 0, (LPARAM)SEGPTR_GET(hook) ); + ret = HOOK_CallHooks16( WH_HARDWARE, + remove ? HC_ACTION : HC_NOREMOVE, + 0, (LPARAM)SEGPTR_GET(hook) ); SEGPTR_FREE(hook); status = ret ? SYSQ_MSG_SKIP : SYSQ_MSG_ACCEPT; } @@ -434,7 +436,7 @@ static BOOL MSG_PeekHardwareMsg( MSG16 *msg, HWND hwnd, WORD first, WORD last, ((msg->message < first) || (msg->message > last))) continue; if (remove) { - if (HOOK_GetHook( WH_JOURNALRECORD, GetTaskQueue(0) )) + if (HOOK_IsHooked( WH_JOURNALRECORD )) MSG_JournalRecordMsg( msg ); QUEUE_RemoveMsg( sysMsgQueue, pos ); } @@ -776,18 +778,17 @@ BOOL32 MSG_InternalGetMessage( MSG16 *msg, HWND32 hwnd, HWND32 hwndOwner, /* Call message filters */ - if (HOOK_GetHook( WH_SYSMSGFILTER, GetTaskQueue(0) ) || - HOOK_GetHook( WH_MSGFILTER, GetTaskQueue(0) )) + if (HOOK_IsHooked( WH_SYSMSGFILTER ) || HOOK_IsHooked( WH_MSGFILTER )) { MSG16 *pmsg = SEGPTR_NEW(MSG16); if (pmsg) { BOOL32 ret; *pmsg = *msg; - ret = ((BOOL16)HOOK_CallHooks( WH_SYSMSGFILTER, code, 0, - (LPARAM)SEGPTR_GET(pmsg) ) || - (BOOL16)HOOK_CallHooks( WH_MSGFILTER, code, 0, - (LPARAM)SEGPTR_GET(pmsg) )); + ret = ((BOOL16)HOOK_CallHooks16( WH_SYSMSGFILTER, code, 0, + (LPARAM)SEGPTR_GET(pmsg) ) || + (BOOL16)HOOK_CallHooks16( WH_MSGFILTER, code, 0, + (LPARAM)SEGPTR_GET(pmsg) )); SEGPTR_FREE(pmsg); if (ret) { @@ -826,7 +827,7 @@ BOOL GetMessage( SEGPTR msg, HWND hwnd, UINT first, UINT last ) dprintf_msg(stddeb,"message %04x, hwnd %04x, filter(%04x - %04x)\n", lpmsg->message, hwnd, first, last ); - HOOK_CallHooks( WH_GETMESSAGE, HC_ACTION, 0, (LPARAM)msg ); + HOOK_CallHooks16( WH_GETMESSAGE, HC_ACTION, 0, (LPARAM)msg ); return (lpmsg->message != WM_QUIT); } @@ -924,30 +925,30 @@ LRESULT SendMessage16( HWND16 hwnd, UINT16 msg, WPARAM16 wParam, LPARAM lParam) return TRUE; } - if (HOOK_GetHook( WH_CALLWNDPROC, GetTaskQueue(0) )) - { - struct msgstruct - { - LPARAM lParam; - WPARAM16 wParam; - UINT16 wMsg; - HWND16 hWnd; - } *pmsg; - - if ((pmsg = SEGPTR_NEW(struct msgstruct))) - { - pmsg->hWnd = hwnd; - pmsg->wMsg = msg; - pmsg->wParam = wParam; - pmsg->lParam = lParam; - HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 1, - (LPARAM)SEGPTR_GET(pmsg) ); - hwnd = pmsg->hWnd; - msg = pmsg->wMsg; - wParam = pmsg->wParam; - lParam = pmsg->lParam; - SEGPTR_FREE( pmsg ); - } + if (HOOK_IsHooked( WH_CALLWNDPROC )) + { + struct msgstruct + { + LPARAM lParam; + WPARAM16 wParam; + UINT16 wMsg; + HWND16 hWnd; + } *pmsg; + + if ((pmsg = SEGPTR_NEW(struct msgstruct))) + { + pmsg->hWnd = hwnd; + pmsg->wMsg = msg; + pmsg->wParam = wParam; + pmsg->lParam = lParam; + HOOK_CallHooks16( WH_CALLWNDPROC, HC_ACTION, 1, + (LPARAM)SEGPTR_GET(pmsg) ); + hwnd = pmsg->hWnd; + msg = pmsg->wMsg; + wParam = pmsg->wParam; + lParam = pmsg->lParam; + SEGPTR_FREE( pmsg ); + } } if (!(wndPtr = WIN_FindWndPtr( hwnd ))) @@ -1134,7 +1135,7 @@ LONG DispatchMessage( const MSG16* msg ) { if (msg->lParam) { -/* HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 0, FIXME ); */ +/* HOOK_CallHooks16( WH_CALLWNDPROC, HC_ACTION, 0, FIXME ); */ return CallWindowProc16( (WNDPROC16)msg->lParam, msg->hwnd, msg->message, msg->wParam, GetTickCount() ); } @@ -1145,7 +1146,7 @@ LONG DispatchMessage( const MSG16* msg ) if (!wndPtr->winproc) return 0; painting = (msg->message == WM_PAINT); if (painting) wndPtr->flags |= WIN_NEEDS_BEGINPAINT; -/* HOOK_CallHooks( WH_CALLWNDPROC, HC_ACTION, 0, FIXME ); */ +/* HOOK_CallHooks16( WH_CALLWNDPROC, HC_ACTION, 0, FIXME ); */ SPY_EnterMessage( SPY_DISPATCHMESSAGE16, msg->hwnd, msg->message, msg->wParam, msg->lParam ); diff --git a/windows/nonclient.c b/windows/nonclient.c index d7f70cbb8ea..423cb4f8d8b 100644 --- a/windows/nonclient.c +++ b/windows/nonclient.c @@ -1149,14 +1149,14 @@ static void NC_DoSizeMove( HWND hwnd, WORD wParam, POINT16 pt ) if (rootWindow == DefaultRootWindow(display)) XUngrabServer( display ); } - if (HOOK_GetHook( WH_CBT, GetTaskQueue(0) )) + if (HOOK_IsHooked( WH_CBT )) { RECT16* pr = SEGPTR_NEW(RECT16); if( pr ) { *pr = sizingRect; - if( HOOK_CallHooks( WH_CBT, HCBT_MOVESIZE, hwnd, - (LPARAM)SEGPTR_GET(pr)) ) + if( HOOK_CallHooks16( WH_CBT, HCBT_MOVESIZE, hwnd, + (LPARAM)SEGPTR_GET(pr)) ) sizingRect = wndPtr->rectWindow; else sizingRect = *pr; diff --git a/windows/win.c b/windows/win.c index 2b48de3f6db..56cfa04a461 100644 --- a/windows/win.c +++ b/windows/win.c @@ -579,36 +579,20 @@ static HWND WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom, hwndLinkAfter = (cs->style & WS_CHILD) ? HWND_BOTTOM : HWND_TOP; - if (HOOK_GetHook( WH_CBT, GetTaskQueue(0) )) + if (HOOK_IsHooked( WH_CBT )) { - CBT_CREATEWND16* cbtc; + CBT_CREATEWND32A cbtc; - if ((cbtc = SEGPTR_NEW(CBT_CREATEWND16))) - { - /* Dummy message params to use WINPROC_MapMsg functions */ - UINT16 msg; - WPARAM16 wparam; - LPARAM lparam; - - /* Map the CREATESTRUCT to 16-bit format */ - lparam = (LPARAM)cs; - if (unicode) - WINPROC_MapMsg32WTo16( WM_CREATE, 0, &msg, &wparam, &lparam ); - else - WINPROC_MapMsg32ATo16( WM_CREATE, 0, &msg, &wparam, &lparam ); - cbtc->lpcs = (CREATESTRUCT16 *)lparam; - cbtc->hwndInsertAfter = hwndLinkAfter; - wmcreate = !HOOK_CallHooks( WH_CBT, HCBT_CREATEWND, hwnd, - (LPARAM)SEGPTR_GET(cbtc) ); - WINPROC_UnmapMsg32ATo16( WM_CREATE, 0, lparam ); - SEGPTR_FREE(cbtc); - if (!wmcreate) - { - dprintf_win(stddeb,"CreateWindowEx: CBT-hook returned 0\n" ); - USER_HEAP_FREE( hwnd ); - return 0; - } - } + cbtc.lpcs = cs; + cbtc.hwndInsertAfter = hwndLinkAfter; + wmcreate = !HOOK_CallHooks32A( WH_CBT, HCBT_CREATEWND, hwnd, + (LPARAM)&cbtc ); + if (!wmcreate) + { + dprintf_win(stddeb, "CreateWindowEx: CBT-hook returned 0\n"); + USER_HEAP_FREE( hwnd ); + return 0; + } } /* Set the window procedure */ @@ -817,7 +801,7 @@ static HWND WIN_CreateWindowEx( CREATESTRUCT32A *cs, ATOM classAtom, /* Call WH_SHELL hook */ if (!(wndPtr->dwStyle & WS_CHILD) && !wndPtr->owner) - HOOK_CallHooks( WH_SHELL, HSHELL_WINDOWCREATED, hwnd, 0 ); + HOOK_CallHooks16( WH_SHELL, HSHELL_WINDOWCREATED, hwnd, 0 ); dprintf_win(stddeb, "CreateWindowEx: returning %04x\n", hwnd); return hwnd; @@ -1019,12 +1003,12 @@ BOOL DestroyWindow( HWND hwnd ) /* Call hooks */ - if( HOOK_CallHooks( WH_CBT, HCBT_DESTROYWND, hwnd, 0L) ) + if( HOOK_CallHooks16( WH_CBT, HCBT_DESTROYWND, hwnd, 0L) ) return FALSE; if (!(wndPtr->dwStyle & WS_CHILD) && !wndPtr->owner) { - HOOK_CallHooks( WH_SHELL, HSHELL_WINDOWDESTROYED, hwnd, 0L ); + HOOK_CallHooks16( WH_SHELL, HSHELL_WINDOWDESTROYED, hwnd, 0L ); /* FIXME: clean up palette - see "Internals" p.352 */ } @@ -1406,6 +1390,7 @@ WORD SetWindowWord( HWND32 hwnd, INT32 offset, WORD newval ) { case GWW_ID: ptr = (WORD *)&wndPtr->wIDmenu; break; case GWW_HINSTANCE: ptr = (WORD *)&wndPtr->hInstance; break; + case GWW_HWNDPARENT: return SetParent( hwnd, newval ); default: fprintf( stderr, "SetWindowWord: invalid offset %d\n", offset ); return 0; diff --git a/windows/winpos.c b/windows/winpos.c index 81a727e90ca..3142e1475e4 100644 --- a/windows/winpos.c +++ b/windows/winpos.c @@ -595,7 +595,7 @@ BOOL ShowWindow( HWND hwnd, int cmd ) swpflags |= SWP_FRAMECHANGED; if (!(wndPtr->dwStyle & WS_MINIMIZE)) { - if( HOOK_CallHooks( WH_CBT, HCBT_MINMAX, hwnd, cmd) ) + if( HOOK_CallHooks16( WH_CBT, HCBT_MINMAX, hwnd, cmd) ) return 0; if (wndPtr->dwStyle & WS_MAXIMIZE) @@ -623,7 +623,7 @@ BOOL ShowWindow( HWND hwnd, int cmd ) swpflags |= SWP_SHOWWINDOW | SWP_FRAMECHANGED; if (!(wndPtr->dwStyle & WS_MAXIMIZE)) { - if( HOOK_CallHooks( WH_CBT, HCBT_MINMAX, hwnd, cmd) ) + if( HOOK_CallHooks16( WH_CBT, HCBT_MINMAX, hwnd, cmd) ) return 0; /* Store the current position and find the maximized size */ @@ -669,7 +669,7 @@ BOOL ShowWindow( HWND hwnd, int cmd ) if (wndPtr->dwStyle & WS_MINIMIZE) { - if( HOOK_CallHooks( WH_CBT, HCBT_MINMAX, hwnd, cmd) ) + if( HOOK_CallHooks16( WH_CBT, HCBT_MINMAX, hwnd, cmd) ) return 0; if( !SendMessage16( hwnd, WM_QUERYOPEN, 0, 0L) ) @@ -702,7 +702,7 @@ BOOL ShowWindow( HWND hwnd, int cmd ) } else if (wndPtr->dwStyle & WS_MAXIMIZE) { - if( HOOK_CallHooks( WH_CBT, HCBT_MINMAX, hwnd, cmd) ) + if( HOOK_CallHooks16( WH_CBT, HCBT_MINMAX, hwnd, cmd) ) return 0; wndPtr->ptMaxPos.x = wndPtr->rectWindow.left; @@ -962,8 +962,8 @@ BOOL32 WINPOS_SetActiveWindow( HWND32 hWnd, BOOL32 fMouse, BOOL32 fChangeFocus) LRESULT wRet; cbtStruct->fMouse = fMouse; cbtStruct->hWndActive = hwndActive; - wRet = HOOK_CallHooks( WH_CBT, HCBT_ACTIVATE, (WPARAM16)hWnd, - (LPARAM)SEGPTR_GET(cbtStruct) ); + wRet = HOOK_CallHooks16( WH_CBT, HCBT_ACTIVATE, (WPARAM16)hWnd, + (LPARAM)SEGPTR_GET(cbtStruct) ); SEGPTR_FREE(cbtStruct); if (wRet) return wRet; }