Release 971116

Sun Nov 16 07:42:44 1997  Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [windows/dce.c] [windows/clipboard.c] [windows/nonclient.c]
	Bug fixes.

	* [misc/shell.c] [resources/*]
	New "About" dialog.

Sat Nov 15 17:30:18 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [configure.in] [Makefile.in]
	Replaced --with-library option by --disable-emulator. The default
 	is now to build both the library and the emulator.
	Renamed --with options to --enable to follow autoconf guidelines.

	* [loader/main.c] [miscemu/main.c] (New file)
	Split initialization in WinelibInit/EmulatorInit.

	* [loader/*.c]
	Removed all remaining #ifdef's WINELIB.

	* [controls/widgets.c] [windows/mdi.c]
	Converted MDIClientWndProc to 32-bit.

	* [debugger/break.c] [if1632/signal.c] [include/selectors.h]
	  [scheduler/thread.c]
	Code and data selector values are now computed at run-time.

	* [library/libres.c]
	Moved to loader/ directory.

	* [misc/main.c] [misc/version.c] (New file)
	Moved all version stuff to version.c. Cleaned up a bit.

	* [msdos/dpmi.c]
	Update the REALMODECALL structure on return from real-mode
	interrupt.

	* [windows/event.c] [windows/keyboard.c]
	Changed the way event coordinates are determined. Don't rely on
	the ConfigureNotify event values. This should fix all problems
	with cursor position in -desktop and -managed modes.

Sat Nov 15 16:09:36 1997  Slaven Rezic  <eserte@cs.tu-berlin.de>

	* [controls/button.c]
	(BUTTON_CheckAutoRadioButton): Prevent possible endless loop.

Wed Nov 12 03:42:45 1997  Chris Faherty <chrisf@america.com>

	* [misc/ver.c]
	Changed VerInstall32A to assume srcdir as destination if destdir
	is blank.  This was causing alot of DLL installation into SYSTEM
	directory to fail.

	* [loader/ne_image.c]
	NE_LoadSegment buffer[100] was too small and getting overruns.
	Changed it to buffer[200].

Sat Nov  8 06:09:57 1997  Len White <phreak@cgocable.net>

	* [misc/ddeml.c] [include/ddeml.h] [if1632/ddeml.spec]
	Added stub functions DdeConnectList(), DdeQueryNextServer(),
	DdeDisconnectList(), DdeSetUserHandle(), DdeAbandonTransaction(),
	DdePostAdvise(), DdeCreateDataHandle(), DdeAddData(), DdeGetData(),
	DdeAccessData(), DdeUnaccessData(), DdeEnableCallback(),
	DdeCmpStringHandles().

Fri Nov  7 19:44:26 1997  Olaf Flebbe  <o.flebbe@science-computing.de>

	* [files/directory.c]
	Fix typo in directory.c [broke loading of cdplayer on nt40]

	* [misc/main.c]
	Implemented -winver nt40.

	* [loader/resource.c] [user32.spec]
	Stubs for CopyAcceleratorTable, Destroy AcceleratorTable.

Thu Nov  6 22:37:04 1997  Morten Welinder  <welinder@rentec.com>

	* [files/drive.c]
	(GetDiskFreeSpace32A): Cap at 2GB.

	* [include/windows.h]
	Prototype DrawIconEx and CreateDIBSection32.
	Define OBM_RADIOCHECK.
	Add DI_* macros.

	* [objects/dib.c] [if1632/gdi.spec]
	CreateDIBSection is a WINAPI.  Renamed to CreateDIBSection32.
	Implement CreateDIBSection16.

	* [if1632/user.spec] [if1632/user32.spec]
	Add DrawIconEx.

	* [objects/cursoricon.c]
	(CopyIcon32): Fix bogus implementation.

	* [objects/bitmap.c]
	(CopyBitmap32): New function.
	(CopyImage32): Do bitmaps.

	* [graphics/x11drv/text.c]
	(X11DRV_ExtTextOut): Change ascent and descent default to avoid
	zero-thinkness overstrike line.

	* [include/debugstr.h] [misc/debugstr.c]
	New files.

	* [msdos/dpmi.c]
	Don't prototype do_mscdex. In INT_Int31Handler, handle real-mode
	int 0x21, ah=0x52.

	* [msdos/int2f.c]
	Add dummys for 0x1681 and 0x1682.

	* [misc/registry.c]
	Fix memory leaks in RegDeleteKey32W.

	* [objects/text.c]
	In TEXT_NextLine, fix another off-by-one bug.

	* [include/bitmaps/obm_radiocheck]
	New file.  (It a small circle used to radio-button menu items
	when selected.)
	
	* [objects/oembitmap.c]
	Add obm_radiocheck.

	* [include/windows.h] [if1632/user32.spec] [controls/menu.c]
	  [if1632/user.spec]
	Define CheckMenuRadioItem{16,32}.  Define GetMenuItemRect{16,32}.

Wed Nov  5 11:30:14 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
	* [misc/main.c]
	Auto adjust versions depending on binary.

Tue Nov  4 15:21:00 1997  Kristian Nielsen  <kristian.nielsen@risoe.dk>

	* [controls/listbox.c]
	Paint full background in listbox items with tab stops enabled.

	* [if1632/thunk.c]
	Copy some more message parameter structures (DRAWITEMSTRUCT16,
	COMPAREITEMSTRUCT16) to the stack segment to fix broken programs
	that need this.

	* [windows/dce.c]
	Only clip sibling windows when the parent has the WS_CLIPSIBLINGS
	style set.

	* [windows/focus.c]
	Make order of events in FOCUS_SwitchFocus() reflect API docs.

	* [windows/defdlg.c]
	Fix problem with loss of focus in some dialogs.

	* [win32/code_page.c]
	Fix return value for MultiByteToWideChar().

	* [BUGS]
	BCW now works.
This commit is contained in:
Alexandre Julliard 1997-11-16 17:38:29 +00:00
parent 491502b951
commit a0b2b1d0f6
152 changed files with 3911 additions and 2534 deletions

View File

@ -1,14 +1,14 @@
This is release 971101 of Wine, the MS Windows emulator. This is still a This is release 971116 of Wine, the MS Windows emulator. This is still a
developer's only release. There are many bugs and many unimplemented API developer's only release. There are many bugs and many unimplemented API
features. Most applications still do not work correctly. features. Most applications still do not work correctly.
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
forget to include a ChangeLog entry. forget to include a ChangeLog entry.
WHAT'S NEW with Wine-971101: (see ChangeLog for details) WHAT'S NEW with Wine-971116: (see ChangeLog for details)
- Win32 version of multimedia functions. - Emulator and library unification.
- ASPI support. - New About dialog.
- Better DCE handling (in progress). - Menus improvements.
- Lots of bug fixes. - Lots of bug fixes.
See the README file in the distribution for installation instructions. See the README file in the distribution for installation instructions.
@ -17,10 +17,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 the release is available at the ftp sites. The sources will be available
from the following locations: from the following locations:
ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-971101.tar.gz ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-971116.tar.gz
ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-971101.tar.gz ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-971116.tar.gz
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-971101.tar.gz ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-971116.tar.gz
ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-971101.tar.gz ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-971116.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite. It should also be available from any site that mirrors tsx-11 or sunsite.

6
BUGS
View File

@ -5,7 +5,7 @@ done something for one of the problems. You are encouraged to
add new entries and, more importantly, remove those for the add new entries and, more importantly, remove those for the
bugs you fixed ;-) bugs you fixed ;-)
------------------------------------------------------------ ------------------------------------------------------------
As of Oct 1997 - As of Nov 1997 -
General: General:
@ -36,9 +36,7 @@ General:
Miscellaneous: Miscellaneous:
* Missing menu separators in BCW, other programs. * Invisible controls in BCW dialogs.
* BCW fails with "bad class 'MessageWindow'" message.
* MIRC is unable to show 'Options' dialog. * MIRC is unable to show 'Options' dialog.

167
ChangeLog
View File

@ -1,3 +1,168 @@
----------------------------------------------------------------------
Sun Nov 16 07:42:44 1997 Alex Korobka <alex@trantor.pharm.sunysb.edu>
* [windows/dce.c] [windows/clipboard.c] [windows/nonclient.c]
Bug fixes.
* [misc/shell.c] [resources/*]
New "About" dialog.
Sat Nov 15 17:30:18 1997 Alexandre Julliard <julliard@lrc.epfl.ch>
* [configure.in] [Makefile.in]
Replaced --with-library option by --disable-emulator. The default
is now to build both the library and the emulator.
Renamed --with options to --enable to follow autoconf guidelines.
* [loader/main.c] [miscemu/main.c] (New file)
Split initialization in WinelibInit/EmulatorInit.
* [loader/*.c]
Removed all remaining #ifdef's WINELIB.
* [controls/widgets.c] [windows/mdi.c]
Converted MDIClientWndProc to 32-bit.
* [debugger/break.c] [if1632/signal.c] [include/selectors.h]
[scheduler/thread.c]
Code and data selector values are now computed at run-time.
* [library/libres.c]
Moved to loader/ directory.
* [misc/main.c] [misc/version.c] (New file)
Moved all version stuff to version.c. Cleaned up a bit.
* [msdos/dpmi.c]
Update the REALMODECALL structure on return from real-mode
interrupt.
* [windows/event.c] [windows/keyboard.c]
Changed the way event coordinates are determined. Don't rely on
the ConfigureNotify event values. This should fix all problems
with cursor position in -desktop and -managed modes.
Sat Nov 15 16:09:36 1997 Slaven Rezic <eserte@cs.tu-berlin.de>
* [controls/button.c]
(BUTTON_CheckAutoRadioButton): Prevent possible endless loop.
Wed Nov 12 03:42:45 1997 Chris Faherty <chrisf@america.com>
* [misc/ver.c]
Changed VerInstall32A to assume srcdir as destination if destdir
is blank. This was causing alot of DLL installation into SYSTEM
directory to fail.
* [loader/ne_image.c]
NE_LoadSegment buffer[100] was too small and getting overruns.
Changed it to buffer[200].
Sat Nov 8 06:09:57 1997 Len White <phreak@cgocable.net>
* [misc/ddeml.c] [include/ddeml.h] [if1632/ddeml.spec]
Added stub functions DdeConnectList(), DdeQueryNextServer(),
DdeDisconnectList(), DdeSetUserHandle(), DdeAbandonTransaction(),
DdePostAdvise(), DdeCreateDataHandle(), DdeAddData(), DdeGetData(),
DdeAccessData(), DdeUnaccessData(), DdeEnableCallback(),
DdeCmpStringHandles().
Fri Nov 7 19:44:26 1997 Olaf Flebbe <o.flebbe@science-computing.de>
* [files/directory.c]
Fix typo in directory.c [broke loading of cdplayer on nt40]
* [misc/main.c]
Implemented -winver nt40.
* [loader/resource.c] [user32.spec]
Stubs for CopyAcceleratorTable, Destroy AcceleratorTable.
Thu Nov 6 22:37:04 1997 Morten Welinder <welinder@rentec.com>
* [files/drive.c]
(GetDiskFreeSpace32A): Cap at 2GB.
* [include/windows.h]
Prototype DrawIconEx and CreateDIBSection32.
Define OBM_RADIOCHECK.
Add DI_* macros.
* [objects/dib.c] [if1632/gdi.spec]
CreateDIBSection is a WINAPI. Renamed to CreateDIBSection32.
Implement CreateDIBSection16.
* [if1632/user.spec] [if1632/user32.spec]
Add DrawIconEx.
* [objects/cursoricon.c]
(CopyIcon32): Fix bogus implementation.
* [objects/bitmap.c]
(CopyBitmap32): New function.
(CopyImage32): Do bitmaps.
* [graphics/x11drv/text.c]
(X11DRV_ExtTextOut): Change ascent and descent default to avoid
zero-thinkness overstrike line.
* [include/debugstr.h] [misc/debugstr.c]
New files.
* [msdos/dpmi.c]
Don't prototype do_mscdex. In INT_Int31Handler, handle real-mode
int 0x21, ah=0x52.
* [msdos/int2f.c]
Add dummys for 0x1681 and 0x1682.
* [misc/registry.c]
Fix memory leaks in RegDeleteKey32W.
* [objects/text.c]
In TEXT_NextLine, fix another off-by-one bug.
* [include/bitmaps/obm_radiocheck]
New file. (It a small circle used to radio-button menu items
when selected.)
* [objects/oembitmap.c]
Add obm_radiocheck.
* [include/windows.h] [if1632/user32.spec] [controls/menu.c]
[if1632/user.spec]
Define CheckMenuRadioItem{16,32}. Define GetMenuItemRect{16,32}.
Wed Nov 5 11:30:14 1997 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
* [misc/main.c]
Auto adjust versions depending on binary.
Tue Nov 4 15:21:00 1997 Kristian Nielsen <kristian.nielsen@risoe.dk>
* [controls/listbox.c]
Paint full background in listbox items with tab stops enabled.
* [if1632/thunk.c]
Copy some more message parameter structures (DRAWITEMSTRUCT16,
COMPAREITEMSTRUCT16) to the stack segment to fix broken programs
that need this.
* [windows/dce.c]
Only clip sibling windows when the parent has the WS_CLIPSIBLINGS
style set.
* [windows/focus.c]
Make order of events in FOCUS_SwitchFocus() reflect API docs.
* [windows/defdlg.c]
Fix problem with loss of focus in some dialogs.
* [win32/code_page.c]
Fix return value for MultiByteToWideChar().
* [BUGS]
BCW now works.
---------------------------------------------------------------------- ----------------------------------------------------------------------
Thu Oct 30 21:52:23 1997 Martin Boehme <boehme@informatik.mu-luebeck.de> Thu Oct 30 21:52:23 1997 Martin Boehme <boehme@informatik.mu-luebeck.de>
@ -108,7 +273,7 @@ Sun Oct 26 14:25:00 1997 Nikita V. Youshchenko <yoush@cs.msu.su>
* [include/drive.h] [files/drive.c] [msdos/int21.c] * [include/drive.h] [files/drive.c] [msdos/int21.c]
Partially implemented DOS drive mapping (int21 AX=440F). Partially implemented DOS drive mapping (int21 AX=440F).
Sat Oct 25 13:03:29 1997 Alexandre Julliard <Alexandre.Julliard@urbanet.ch> Sat Oct 25 13:03:29 1997 Alexandre Julliard <julliard@lrc.epfl.ch>
* [debugger/debug.l] * [debugger/debug.l]
Support '.' in identifiers. Use "x . y" to access structure Support '.' in identifiers. Use "x . y" to access structure

View File

@ -23,7 +23,7 @@ X_CFLAGS = @X_CFLAGS@
X_LIBS = @X_LIBS@ X_LIBS = @X_LIBS@
XPM_LIB = -lXpm XPM_LIB = -lXpm
XLIB = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@ XLIB = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@
WINELIB = $(WINESTUB) $(TOPOBJDIR)/@MAIN_TARGET@ WINELIB = $(WINESTUB) $(TOPOBJDIR)/@LIB_TARGET@
LDLIBS = @LDLIBS@ LDLIBS = @LDLIBS@
YACC = @YACC@ YACC = @YACC@
LEX = @LEX@ LEX = @LEX@

View File

@ -1,6 +1,7 @@
# This Makefile understands the following targets: # This Makefile understands the following targets:
# #
# all (default): build wine # all (default): build wine
# lib: build libwine
# clean: remove all intermediate files # clean: remove all intermediate files
# distclean: also remove all files created by configure # distclean: also remove all files created by configure
# install: install everything # install: install everything
@ -11,6 +12,7 @@
# Main target to build # Main target to build
MAIN_TARGET = @MAIN_TARGET@ MAIN_TARGET = @MAIN_TARGET@
LIB_TARGET = @LIB_TARGET@
# Directories # Directories
@ -20,7 +22,7 @@ SRCDIR = @srcdir@
VPATH = @srcdir@ VPATH = @srcdir@
MODULE = none MODULE = none
COMMONSUBDIRS = \ LIBSUBDIRS = \
rc \ rc \
controls \ controls \
files \ files \
@ -28,6 +30,7 @@ COMMONSUBDIRS = \
graphics/metafiledrv \ graphics/metafiledrv \
graphics/x11drv \ graphics/x11drv \
ipc \ ipc \
library \
loader \ loader \
memory \ memory \
misc \ misc \
@ -46,27 +49,24 @@ EMUSUBDIRS = \
if1632 \ if1632 \
miscemu miscemu
LIBSUBDIRS = library
PROGSUBDIRS = libtest programs PROGSUBDIRS = libtest programs
DOCSUBDIRS = documentation DOCSUBDIRS = documentation
# All sub-directories # All sub-directories
ALLSUBDIRS = \ ALLSUBDIRS = \
$(COMMONSUBDIRS) \
$(EMUSUBDIRS) \
$(LIBSUBDIRS) \ $(LIBSUBDIRS) \
$(EMUSUBDIRS) \
$(PROGSUBDIRS) \ $(PROGSUBDIRS) \
$(DOCSUBDIRS) $(DOCSUBDIRS)
# Sub-directories to run make depend into # Sub-directories to run make depend into
DEPENDSUBDIRS = $(COMMONSUBDIRS) $(LIBSUBDIRS) $(EMUSUBDIRS) $(DOCSUBDIRS) DEPENDSUBDIRS = $(LIBSUBDIRS) $(EMUSUBDIRS) $(DOCSUBDIRS)
# Sub-directories to run make install into # Sub-directories to run make install into
INSTALLSUBDIRS = $(DOCSUBDIRS) INSTALLSUBDIRS = $(DOCSUBDIRS)
COMMONOBJS = \ LIBOBJS = \
controls/controls.o \ controls/controls.o \
files/files.o \ files/files.o \
graphics/graphics.o \ graphics/graphics.o \
@ -90,34 +90,33 @@ EMUOBJS = \
if1632/if1632.o \ if1632/if1632.o \
miscemu/miscemu.o miscemu/miscemu.o
LIBOBJS = library/library.o
all: $(MAIN_TARGET) all: $(MAIN_TARGET)
@MAKE_RULES@ @MAKE_RULES@
install:: install_$(MAIN_TARGET) install:: install_$(MAIN_TARGET)
wine wine.sym: $(COMMONSUBDIRS) $(EMUSUBDIRS) dummy emu: wine
$(CC) -o wine $(COMMONOBJS) $(EMUOBJS) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
lib: $(LIB_TARGET)
wine wine.sym: $(LIB_TARGET) $(EMUSUBDIRS) dummy
$(CC) -o wine $(EMUOBJS) $(LIB_TARGET) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
nm -n wine | grep -v _compiled >wine.sym nm -n wine | grep -v _compiled >wine.sym
install_wine: dummy libwine.a: $(LIBSUBDIRS) dummy
$(INSTALL_PROGRAM) wine $(bindir)/wine
libwine.a: $(COMMONSUBDIRS) $(LIBSUBDIRS) dummy
$(RM) $@ $(RM) $@
$(AR) $@ $(COMMONOBJS) $(LIBOBJS) $(AR) $@ $(LIBOBJS)
$(RANLIB) $@ $(RANLIB) $@
install_libwine.a: install_includes libwine.so.1.0: $(LIBSUBDIRS) dummy
$(INSTALL_DATA) libwine.a $(libdir) $(CC) -shared -Wl,-soname,libwine.so -o$@ $(LIBOBJS) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
libwine.so.1.0: $(COMMONSUBDIRS) $(LIBSUBDIRS) dummy install_emu: dummy
$(CC) -shared -Wl,-soname,libwine.so -o$@ $(COMMONOBJS) $(LIBOBJS) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS) $(INSTALL_PROGRAM) wine $(bindir)/wine
install_libwine.so.1.0: install_includes install_lib: install_includes
$(INSTALL_DATA) libwine.so.1.0 $(libdir) $(INSTALL_DATA) $(LIB_TARGET) $(libdir)
install_includes: dummy install_includes: dummy
if [ -d $(includedir) ]; then : ; else $(MKDIR) $(includedir); fi if [ -d $(includedir) ]; then : ; else $(MKDIR) $(includedir); fi

11
README
View File

@ -23,13 +23,12 @@ it are probably available on the ftp site where you got Wine. They can
also be found on ftp.x.org and all its mirror sites. also be found on ftp.x.org and all its mirror sites.
To build Wine, first do a "./configure" and then a "make depend; make". To build Wine, first do a "./configure" and then a "make depend; make".
The executable "wine" will be built. "wine" will load and run 16-bit This will build the library "libwine.a" and the program "wine".
Windows executables.
To build Winelib, do a "./configure --with-library", and then a "make The program "wine" will load and run Windows executables.
depend; make". The library "winelib.a" will be built, allowing to The library "libwine.a" can be used to compile and link Windows source
compile Windows source code under Unix. If you have an ELF compiler, code under Unix. If you have an ELF compiler, you can use
you can use "./configure --with-dll" instead to build a shared library. "./configure --enable-dll" to build a shared library instead.
To upgrade to a new release by using a patch file, first cd to the To upgrade to a new release by using a patch file, first cd to the
top-level directory of the release (the one containing this README top-level directory of the release (the one containing this README

230
configure vendored
View File

@ -13,11 +13,11 @@ ac_help=
ac_default_prefix=/usr/local ac_default_prefix=/usr/local
# Any additions from configure.in: # Any additions from configure.in:
ac_help="$ac_help ac_help="$ac_help
--with-library build Wine as a library instead of an emulator" --disable-emulator build only the Wine library, not the emulator"
ac_help="$ac_help ac_help="$ac_help
--with-dll build Wine as a DLL instead of an emulator" --enable-dll build the Wine library as a DLL"
ac_help="$ac_help ac_help="$ac_help
--with-ipc use inter-process communication for DDE" --enable-ipc use inter-process communication for DDE"
ac_help="$ac_help ac_help="$ac_help
--with-x use the X Window System" --with-x use the X Window System"
@ -553,26 +553,27 @@ test -z "$LDLIBS" && LDLIBS=-lm
test -z "$PROGEXT" && PROGEXT="" test -z "$PROGEXT" && PROGEXT=""
# Check whether --with-library or --without-library was given. MAIN_TARGET=emu
if test "${with_library+set}" = set; then LIB_TARGET=libwine.a
withval="$with_library"
OPTIONS="-DWINELIB" MAIN_TARGET="libwine.a" # Check whether --enable-emulator or --disable-emulator was given.
else if test "${enable_emulator+set}" = set; then
OPTIONS="" MAIN_TARGET="wine" enableval="$enable_emulator"
if test "$enableval" = "no"; then MAIN_TARGET="lib"; fi
fi fi
# Check whether --with-dll or --without-dll was given. # Check whether --enable-dll or --disable-dll was given.
if test "${with_dll+set}" = set; then if test "${enable_dll+set}" = set; then
withval="$with_dll" enableval="$enable_dll"
OPTIONS="-DWINELIB" MAIN_TARGET="libwine.so.1.0" if test "$enableval" = "no"; then : ; else LIB_TARGET="libwine.so.1.0"; fi
fi fi
# Check whether --with-ipc or --without-ipc was given. # Check whether --with-ipc or --without-ipc was given.
if test "${with_ipc+set}" = set; then if test "${with_ipc+set}" = set; then
withval="$with_ipc" withval="$with_ipc"
OPTIONS="$OPTIONS -DCONFIG_IPC" if test "$enableval" = "no"; then : ; else OPTIONS="-DCONFIG_IPC"; fi
fi fi
@ -580,8 +581,9 @@ fi
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
echo "configure:585: checking whether ${MAKE-make} sets \${MAKE}" >&5 echo "configure:587: checking whether ${MAKE-make} sets \${MAKE}" >&5
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` 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 if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@ -610,7 +612,7 @@ fi
# Extract the first word of "gcc", so it can be a program name with args. # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2 set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:614: checking for $ac_word" >&5 echo "configure:616: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -639,7 +641,7 @@ if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args. # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2 set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:643: checking for $ac_word" >&5 echo "configure:645: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -687,7 +689,7 @@ fi
fi fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:691: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 echo "configure:693: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@ -697,11 +699,11 @@ ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS
cross_compiling=$ac_cv_prog_cc_cross cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 701 "configure" #line 703 "configure"
#include "confdefs.h" #include "confdefs.h"
main(){return(0);} main(){return(0);}
EOF EOF
if { (eval echo configure:705: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:707: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
ac_cv_prog_cc_works=yes ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler. # If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then if (./conftest; exit) 2>/dev/null; then
@ -721,12 +723,12 @@ 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 fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:725: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "configure:727: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:730: checking whether we are using GNU C" >&5 echo "configure:732: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -735,7 +737,7 @@ else
yes; yes;
#endif #endif
EOF EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:739: \"$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:741: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes ac_cv_prog_gcc=yes
else else
ac_cv_prog_gcc=no ac_cv_prog_gcc=no
@ -750,7 +752,7 @@ if test $ac_cv_prog_gcc = yes; then
ac_save_CFLAGS="$CFLAGS" ac_save_CFLAGS="$CFLAGS"
CFLAGS= CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:754: checking whether ${CC-cc} accepts -g" >&5 echo "configure:756: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -778,7 +780,7 @@ else
fi fi
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:782: checking how to run the C preprocessor" >&5 echo "configure:784: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory. # On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then if test -n "$CPP" && test -d "$CPP"; then
CPP= CPP=
@ -793,13 +795,13 @@ else
# On the NeXT, cc -E runs the code through the compiler's parser, # On the NeXT, cc -E runs the code through the compiler's parser,
# not just through cpp. # not just through cpp.
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 797 "configure" #line 799 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:803: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:805: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out` ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then if test -z "$ac_err"; then
: :
@ -810,13 +812,13 @@ else
rm -rf conftest* rm -rf conftest*
CPP="${CC-cc} -E -traditional-cpp" CPP="${CC-cc} -E -traditional-cpp"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 814 "configure" #line 816 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <assert.h> #include <assert.h>
Syntax Error Syntax Error
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:820: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:822: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out` ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then if test -z "$ac_err"; then
: :
@ -843,7 +845,7 @@ echo "$ac_t""$CPP" 1>&6
# Uses ac_ vars as temps to allow command line to override cache and checks. # 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. # --without-x overrides everything else, but does not touch the cache.
echo $ac_n "checking for X""... $ac_c" 1>&6 echo $ac_n "checking for X""... $ac_c" 1>&6
echo "configure:847: checking for X" >&5 echo "configure:849: checking for X" >&5
# Check whether --with-x or --without-x was given. # Check whether --with-x or --without-x was given.
if test "${with_x+set}" = set; then if test "${with_x+set}" = set; then
@ -905,12 +907,12 @@ if test "$ac_x_includes" = NO; then
# First, try using that file with no special directory specified. # First, try using that file with no special directory specified.
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 909 "configure" #line 911 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <$x_direct_test_include> #include <$x_direct_test_include>
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:914: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:916: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out` ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then if test -z "$ac_err"; then
rm -rf conftest* rm -rf conftest*
@ -979,14 +981,14 @@ if test "$ac_x_libraries" = NO; then
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-l$x_direct_test_library $LIBS" LIBS="-l$x_direct_test_library $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 983 "configure" #line 985 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { int main() {
${x_direct_test_function}() ${x_direct_test_function}()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:990: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:992: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
LIBS="$ac_save_LIBS" LIBS="$ac_save_LIBS"
# We can link X programs with no special library path. # We can link X programs with no special library path.
@ -1092,17 +1094,17 @@ else
case "`(uname -sr) 2>/dev/null`" in case "`(uname -sr) 2>/dev/null`" in
"SunOS 5"*) "SunOS 5"*)
echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6 echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
echo "configure:1096: checking whether -R must be followed by a space" >&5 echo "configure:1098: checking whether -R must be followed by a space" >&5
ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1099 "configure" #line 1101 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { int main() {
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1106: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1108: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
ac_R_nospace=yes ac_R_nospace=yes
else else
@ -1118,14 +1120,14 @@ rm -f conftest*
else else
LIBS="$ac_xsave_LIBS -R $x_libraries" LIBS="$ac_xsave_LIBS -R $x_libraries"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1122 "configure" #line 1124 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { int main() {
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1129: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1131: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
ac_R_space=yes ac_R_space=yes
else else
@ -1157,7 +1159,7 @@ rm -f conftest*
# libraries were built with DECnet support. And karl@cs.umb.edu says # libraries were built with DECnet support. And karl@cs.umb.edu says
# the Alpha needs dnet_stub (dnet does not exist). # the Alpha needs dnet_stub (dnet does not exist).
echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6 echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
echo "configure:1161: checking for dnet_ntoa in -ldnet" >&5 echo "configure:1163: checking for dnet_ntoa in -ldnet" >&5
ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'` ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@ -1165,7 +1167,7 @@ else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-ldnet $LIBS" LIBS="-ldnet $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1169 "configure" #line 1171 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@ -1176,7 +1178,7 @@ int main() {
dnet_ntoa() dnet_ntoa()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1180: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1182: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1198,7 +1200,7 @@ fi
if test $ac_cv_lib_dnet_dnet_ntoa = no; then 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 $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
echo "configure:1202: checking for dnet_ntoa in -ldnet_stub" >&5 echo "configure:1204: checking for dnet_ntoa in -ldnet_stub" >&5
ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'` ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@ -1206,7 +1208,7 @@ else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-ldnet_stub $LIBS" LIBS="-ldnet_stub $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1210 "configure" #line 1212 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@ -1217,7 +1219,7 @@ int main() {
dnet_ntoa() dnet_ntoa()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1221: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1223: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1246,12 +1248,12 @@ fi
# The nsl library prevents programs from opening the X display # The nsl library prevents programs from opening the X display
# on Irix 5.2, according to dickey@clark.net. # on Irix 5.2, according to dickey@clark.net.
echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
echo "configure:1250: checking for gethostbyname" >&5 echo "configure:1252: checking for gethostbyname" >&5
if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1255 "configure" #line 1257 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char gethostbyname(); below. */ which can conflict with char gethostbyname(); below. */
@ -1274,7 +1276,7 @@ gethostbyname();
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1278: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1280: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_func_gethostbyname=yes" eval "ac_cv_func_gethostbyname=yes"
else else
@ -1295,7 +1297,7 @@ fi
if test $ac_cv_func_gethostbyname = no; then if test $ac_cv_func_gethostbyname = no; then
echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
echo "configure:1299: checking for gethostbyname in -lnsl" >&5 echo "configure:1301: checking for gethostbyname in -lnsl" >&5
ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@ -1303,7 +1305,7 @@ else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-lnsl $LIBS" LIBS="-lnsl $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1307 "configure" #line 1309 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@ -1314,7 +1316,7 @@ int main() {
gethostbyname() gethostbyname()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1318: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1320: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1344,12 +1346,12 @@ fi
# -lsocket must be given before -lnsl if both are needed. # -lsocket must be given before -lnsl if both are needed.
# We assume that if connect needs -lnsl, so does gethostbyname. # We assume that if connect needs -lnsl, so does gethostbyname.
echo $ac_n "checking for connect""... $ac_c" 1>&6 echo $ac_n "checking for connect""... $ac_c" 1>&6
echo "configure:1348: checking for connect" >&5 echo "configure:1350: checking for connect" >&5
if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1353 "configure" #line 1355 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char connect(); below. */ which can conflict with char connect(); below. */
@ -1372,7 +1374,7 @@ connect();
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1376: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1378: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_func_connect=yes" eval "ac_cv_func_connect=yes"
else else
@ -1393,7 +1395,7 @@ fi
if test $ac_cv_func_connect = no; then if test $ac_cv_func_connect = no; then
echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
echo "configure:1397: checking for connect in -lsocket" >&5 echo "configure:1399: checking for connect in -lsocket" >&5
ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@ -1401,7 +1403,7 @@ else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-lsocket $X_EXTRA_LIBS $LIBS" LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1405 "configure" #line 1407 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@ -1412,7 +1414,7 @@ int main() {
connect() connect()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1416: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1418: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1436,12 +1438,12 @@ fi
# gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
echo $ac_n "checking for remove""... $ac_c" 1>&6 echo $ac_n "checking for remove""... $ac_c" 1>&6
echo "configure:1440: checking for remove" >&5 echo "configure:1442: checking for remove" >&5
if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1445 "configure" #line 1447 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char remove(); below. */ which can conflict with char remove(); below. */
@ -1464,7 +1466,7 @@ remove();
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1468: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1470: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_func_remove=yes" eval "ac_cv_func_remove=yes"
else else
@ -1485,7 +1487,7 @@ fi
if test $ac_cv_func_remove = no; then if test $ac_cv_func_remove = no; then
echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
echo "configure:1489: checking for remove in -lposix" >&5 echo "configure:1491: checking for remove in -lposix" >&5
ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@ -1493,7 +1495,7 @@ else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-lposix $LIBS" LIBS="-lposix $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1497 "configure" #line 1499 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@ -1504,7 +1506,7 @@ int main() {
remove() remove()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1508: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1510: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1528,12 +1530,12 @@ fi
# BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
echo $ac_n "checking for shmat""... $ac_c" 1>&6 echo $ac_n "checking for shmat""... $ac_c" 1>&6
echo "configure:1532: checking for shmat" >&5 echo "configure:1534: checking for shmat" >&5
if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1537 "configure" #line 1539 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char shmat(); below. */ which can conflict with char shmat(); below. */
@ -1556,7 +1558,7 @@ shmat();
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1560: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1562: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_func_shmat=yes" eval "ac_cv_func_shmat=yes"
else else
@ -1577,7 +1579,7 @@ fi
if test $ac_cv_func_shmat = no; then if test $ac_cv_func_shmat = no; then
echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
echo "configure:1581: checking for shmat in -lipc" >&5 echo "configure:1583: checking for shmat in -lipc" >&5
ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@ -1585,7 +1587,7 @@ else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-lipc $LIBS" LIBS="-lipc $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1589 "configure" #line 1591 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@ -1596,7 +1598,7 @@ int main() {
shmat() shmat()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1600: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1602: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1629,7 +1631,7 @@ fi
# libraries we check for below, so use a different variable. # libraries we check for below, so use a different variable.
# --interran@uluru.Stanford.EDU, kb@cs.umb.edu. # --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
echo "configure:1633: checking for IceConnectionNumber in -lICE" >&5 echo "configure:1635: checking for IceConnectionNumber in -lICE" >&5
ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@ -1637,7 +1639,7 @@ else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-lICE $LIBS" LIBS="-lICE $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1641 "configure" #line 1643 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@ -1648,7 +1650,7 @@ int main() {
IceConnectionNumber() IceConnectionNumber()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1652: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1654: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1677,7 +1679,7 @@ do
# Extract the first word of "$ac_prog", so it can be a program name with args. # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2 set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1681: checking for $ac_word" >&5 echo "configure:1683: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1709,7 +1711,7 @@ test -n "$YACC" || YACC="yacc"
# Extract the first word of "flex", so it can be a program name with args. # Extract the first word of "flex", so it can be a program name with args.
set dummy flex; ac_word=$2 set dummy flex; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1713: checking for $ac_word" >&5 echo "configure:1715: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1742,7 +1744,7 @@ then
*) ac_lib=l ;; *) ac_lib=l ;;
esac esac
echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6 echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6
echo "configure:1746: checking for yywrap in -l$ac_lib" >&5 echo "configure:1748: checking for yywrap in -l$ac_lib" >&5
ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'` ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@ -1750,7 +1752,7 @@ else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-l$ac_lib $LIBS" LIBS="-l$ac_lib $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1754 "configure" #line 1756 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@ -1761,7 +1763,7 @@ int main() {
yywrap() yywrap()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1767: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1786,7 +1788,7 @@ fi
# Extract the first word of "ranlib", so it can be a program name with args. # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2 set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1790: checking for $ac_word" >&5 echo "configure:1792: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1823,7 +1825,7 @@ fi
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh. # ./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 $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
echo "configure:1827: checking for a BSD compatible install" >&5 echo "configure:1829: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@ -1873,7 +1875,7 @@ test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6 echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
echo "configure:1877: checking whether ln -s works" >&5 echo "configure:1879: checking whether ln -s works" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1894,7 +1896,7 @@ else
fi fi
echo $ac_n "checking for i386_set_ldt in -li386""... $ac_c" 1>&6 echo $ac_n "checking for i386_set_ldt in -li386""... $ac_c" 1>&6
echo "configure:1898: checking for i386_set_ldt in -li386" >&5 echo "configure:1900: checking for i386_set_ldt in -li386" >&5
ac_lib_var=`echo i386'_'i386_set_ldt | sed 'y%./+-%__p_%'` ac_lib_var=`echo i386'_'i386_set_ldt | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@ -1902,7 +1904,7 @@ else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-li386 $LIBS" LIBS="-li386 $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1906 "configure" #line 1908 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@ -1913,7 +1915,7 @@ int main() {
i386_set_ldt() i386_set_ldt()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1917: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1919: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@ -1941,7 +1943,7 @@ if test "x${GCC}" = "xyes"
then then
CFLAGS="$CFLAGS -Wall" CFLAGS="$CFLAGS -Wall"
echo $ac_n "checking "for gcc strength-reduce bug"""... $ac_c" 1>&6 echo $ac_n "checking "for gcc strength-reduce bug"""... $ac_c" 1>&6
echo "configure:1945: checking "for gcc strength-reduce bug"" >&5 echo "configure:1947: checking "for gcc strength-reduce bug"" >&5
if eval "test \"`echo '$''{'ac_cv_c_gcc_strength_bug'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_c_gcc_strength_bug'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1949,7 +1951,7 @@ else
ac_cv_c_gcc_strength_bug="yes" ac_cv_c_gcc_strength_bug="yes"
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1953 "configure" #line 1955 "configure"
#include "confdefs.h" #include "confdefs.h"
int main(void) { int main(void) {
@ -1960,7 +1962,7 @@ int main(void) {
exit( Array[1] != -2 ); exit( Array[1] != -2 );
} }
EOF EOF
if { (eval echo configure:1964: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null if { (eval echo configure:1966: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
then then
ac_cv_c_gcc_strength_bug="no" ac_cv_c_gcc_strength_bug="no"
else else
@ -1983,7 +1985,7 @@ fi
echo $ac_n "checking "whether external symbols need an underscore prefix"""... $ac_c" 1>&6 echo $ac_n "checking "whether external symbols need an underscore prefix"""... $ac_c" 1>&6
echo "configure:1987: checking "whether external symbols need an underscore prefix"" >&5 echo "configure:1989: checking "whether external symbols need an underscore prefix"" >&5
if eval "test \"`echo '$''{'ac_cv_c_extern_prefix'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_c_extern_prefix'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1995,14 +1997,14 @@ _ac_test:
.long 0 .long 0
EOF EOF
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1999 "configure" #line 2001 "configure"
#include "confdefs.h" #include "confdefs.h"
extern int ac_test; extern int ac_test;
int main() { int main() {
if (ac_test) return 1 if (ac_test) return 1
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:2006: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:2008: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
ac_cv_c_extern_prefix="yes" ac_cv_c_extern_prefix="yes"
else else
@ -2025,24 +2027,25 @@ EOF
fi fi
if test "$MAIN_TARGET" = "libwine.so.1.0" DLLFLAGS=""
if test "$LIB_TARGET" = "libwine.so.1.0"
then then
echo $ac_n "checking "whether we can build a dll"""... $ac_c" 1>&6 echo $ac_n "checking "whether we can build a dll"""... $ac_c" 1>&6
echo "configure:2032: checking "whether we can build a dll"" >&5 echo "configure:2035: checking "whether we can build a dll"" >&5
if eval "test \"`echo '$''{'ac_cv_c_dll'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_c_dll'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
saved_cflags=$CFLAGS saved_cflags=$CFLAGS
CFLAGS="$CFLAGS -fPIC -shared -Wl,-soname,conftest.so.1.0" CFLAGS="$CFLAGS -fPIC -shared -Wl,-soname,conftest.so.1.0"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2039 "configure" #line 2042 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { int main() {
return 1 return 1
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:2046: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:2049: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
ac_cv_c_dll="yes" ac_cv_c_dll="yes"
else else
@ -2059,22 +2062,23 @@ fi
echo "$ac_t""$ac_cv_c_dll" 1>&6 echo "$ac_t""$ac_cv_c_dll" 1>&6
if test "$ac_cv_c_dll" = "yes" if test "$ac_cv_c_dll" = "yes"
then then
CFLAGS="$CFLAGS -fPIC" DLLFLAGS="-fPIC"
else else
MAIN_TARGET="libwine.a" LIB_TARGET="libwine.a"
fi fi
fi fi
for ac_func in memmove tcgetattr usleep wait4 waitpid for ac_func in memmove tcgetattr usleep wait4 waitpid
do do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:2073: checking for $ac_func" >&5 echo "configure:2077: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2078 "configure" #line 2082 "configure"
#include "confdefs.h" #include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes, /* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */ which can conflict with char $ac_func(); below. */
@ -2097,7 +2101,7 @@ $ac_func();
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:2101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:2105: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_func_$ac_func=yes" eval "ac_cv_func_$ac_func=yes"
else else
@ -2122,12 +2126,12 @@ fi
done done
echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6 echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6
echo "configure:2126: checking whether stat file-mode macros are broken" >&5 echo "configure:2130: checking whether stat file-mode macros are broken" >&5
if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2131 "configure" #line 2135 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -2178,12 +2182,12 @@ EOF
fi fi
echo $ac_n "checking for working const""... $ac_c" 1>&6 echo $ac_n "checking for working const""... $ac_c" 1>&6
echo "configure:2182: checking for working const" >&5 echo "configure:2186: checking for working const" >&5
if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2187 "configure" #line 2191 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { int main() {
@ -2232,7 +2236,7 @@ ccp = (char const *const *) p;
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:2236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:2240: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
ac_cv_c_const=yes ac_cv_c_const=yes
else else
@ -2253,12 +2257,12 @@ EOF
fi fi
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
echo "configure:2257: checking for ANSI C header files" >&5 echo "configure:2261: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2262 "configure" #line 2266 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
@ -2266,7 +2270,7 @@ else
#include <float.h> #include <float.h>
EOF EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2270: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } { (eval echo configure:2274: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out` ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then if test -z "$ac_err"; then
rm -rf conftest* rm -rf conftest*
@ -2283,7 +2287,7 @@ rm -f conftest*
if test $ac_cv_header_stdc = yes; then if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI. # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2287 "configure" #line 2291 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <string.h> #include <string.h>
EOF EOF
@ -2301,7 +2305,7 @@ fi
if test $ac_cv_header_stdc = yes; then if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2305 "configure" #line 2309 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <stdlib.h> #include <stdlib.h>
EOF EOF
@ -2322,7 +2326,7 @@ if test "$cross_compiling" = yes; then
: :
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2326 "configure" #line 2330 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <ctype.h> #include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@ -2333,7 +2337,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
exit (0); } exit (0); }
EOF EOF
if { (eval echo configure:2337: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null if { (eval echo configure:2341: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
then then
: :
else else
@ -2357,12 +2361,12 @@ EOF
fi fi
echo $ac_n "checking for size_t""... $ac_c" 1>&6 echo $ac_n "checking for size_t""... $ac_c" 1>&6
echo "configure:2361: checking for size_t" >&5 echo "configure:2365: checking for size_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 2366 "configure" #line 2370 "configure"
#include "confdefs.h" #include "confdefs.h"
#include <sys/types.h> #include <sys/types.h>
#if STDC_HEADERS #if STDC_HEADERS
@ -2558,6 +2562,7 @@ s%@mandir@%$mandir%g
s%@LDLIBS@%$LDLIBS%g s%@LDLIBS@%$LDLIBS%g
s%@PROGEXT@%$PROGEXT%g s%@PROGEXT@%$PROGEXT%g
s%@MAIN_TARGET@%$MAIN_TARGET%g s%@MAIN_TARGET@%$MAIN_TARGET%g
s%@LIB_TARGET@%$LIB_TARGET%g
s%@OPTIONS@%$OPTIONS%g s%@OPTIONS@%$OPTIONS%g
s%@SET_MAKE@%$SET_MAKE%g s%@SET_MAKE@%$SET_MAKE%g
s%@CC@%$CC%g s%@CC@%$CC%g
@ -2573,6 +2578,7 @@ s%@RANLIB@%$RANLIB%g
s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
s%@INSTALL_DATA@%$INSTALL_DATA%g s%@INSTALL_DATA@%$INSTALL_DATA%g
s%@LN_S@%$LN_S%g s%@LN_S@%$LN_S%g
s%@DLLFLAGS@%$DLLFLAGS%g
/@MAKE_RULES@/r $MAKE_RULES /@MAKE_RULES@/r $MAKE_RULES
s%@MAKE_RULES@%%g s%@MAKE_RULES@%%g

View File

@ -12,20 +12,24 @@ test -z "$PROGEXT" && PROGEXT="" AC_SUBST(PROGEXT)
dnl **** Command-line arguments **** dnl **** Command-line arguments ****
AC_ARG_WITH(library, dnl Default values
[ --with-library build Wine as a library instead of an emulator], MAIN_TARGET=emu
[OPTIONS="-DWINELIB" MAIN_TARGET="libwine.a"], LIB_TARGET=libwine.a
[OPTIONS="" MAIN_TARGET="wine"])
AC_ARG_WITH(dll, AC_ARG_ENABLE(emulator,
[ --with-dll build Wine as a DLL instead of an emulator], [ --disable-emulator build only the Wine library, not the emulator],
[OPTIONS="-DWINELIB" MAIN_TARGET="libwine.so.1.0"]) [if test "$enableval" = "no"; then MAIN_TARGET="lib"; fi])
AC_ARG_ENABLE(dll,
[ --enable-dll build the Wine library as a DLL],
[if test "$enableval" = "no"; then : ; else LIB_TARGET="libwine.so.1.0"; fi])
AC_ARG_WITH(ipc, AC_ARG_WITH(ipc,
[ --with-ipc use inter-process communication for DDE], [ --enable-ipc use inter-process communication for DDE],
[OPTIONS="$OPTIONS -DCONFIG_IPC"]) [if test "$enableval" = "no"; then : ; else OPTIONS="-DCONFIG_IPC"; fi])
AC_SUBST(MAIN_TARGET) AC_SUBST(MAIN_TARGET)
AC_SUBST(LIB_TARGET)
AC_SUBST(OPTIONS) AC_SUBST(OPTIONS)
dnl **** Check for some programs and libraries **** dnl **** Check for some programs and libraries ****
@ -89,7 +93,8 @@ fi
dnl **** Check for working dll **** dnl **** Check for working dll ****
if test "$MAIN_TARGET" = "libwine.so.1.0" DLLFLAGS=""
if test "$LIB_TARGET" = "libwine.so.1.0"
then then
AC_CACHE_CHECK("whether we can build a dll", AC_CACHE_CHECK("whether we can build a dll",
ac_cv_c_dll, ac_cv_c_dll,
@ -100,11 +105,12 @@ then
]) ])
if test "$ac_cv_c_dll" = "yes" if test "$ac_cv_c_dll" = "yes"
then then
CFLAGS="$CFLAGS -fPIC" DLLFLAGS="-fPIC"
else else
MAIN_TARGET="libwine.a" LIB_TARGET="libwine.a"
fi fi
fi fi
AC_SUBST(DLLFLAGS)
dnl **** Check for functions and header files **** dnl **** Check for functions and header files ****

View File

@ -1,4 +1,4 @@
DEFS = -D__WINE__ DEFS = @DLLFLAGS@ -D__WINE__
TOPSRCDIR = @top_srcdir@ TOPSRCDIR = @top_srcdir@
TOPOBJDIR = .. TOPOBJDIR = ..
SRCDIR = @srcdir@ SRCDIR = @srcdir@

View File

@ -110,15 +110,16 @@ LRESULT WINAPI ButtonWndProc( HWND32 hWnd, UINT32 uMsg,
return 0; return 0;
case WM_ERASEBKGND: case WM_ERASEBKGND:
break; return 1;
case WM_PAINT: case WM_PAINT:
if (btnPaintFunc[style]) if (btnPaintFunc[style])
{ {
PAINTSTRUCT32 ps; PAINTSTRUCT32 ps;
HDC32 hdc = BeginPaint32( hWnd, &ps ); HDC32 hdc = wParam ? (HDC32)wParam : BeginPaint32( hWnd, &ps );
SetBkMode32( hdc, OPAQUE );
(btnPaintFunc[style])( wndPtr, hdc, ODA_DRAWENTIRE ); (btnPaintFunc[style])( wndPtr, hdc, ODA_DRAWENTIRE );
EndPaint32( hWnd, &ps ); if( !wParam ) EndPaint32( hWnd, &ps );
} }
break; break;
@ -384,7 +385,15 @@ static void CB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
rbox = rtext = client; rbox = rtext = client;
if (infoPtr->hFont) SelectObject32( hDC, infoPtr->hFont ); if (infoPtr->hFont) SelectObject32( hDC, infoPtr->hFont );
hBrush = BUTTON_SEND_CTLCOLOR( wndPtr, hDC );
/* Something is still not right, checkboxes (and edit controls)
* in wsping32 have white backgrounds instead of dark grey.
* BUTTON_SEND_CTLCOLOR() is even worse since it returns 0 in this
* particular case and the background is not painted at all.
*/
hBrush = GetControlBrush( wndPtr->hwndSelf, hDC, CTLCOLOR_BTN );
if (wndPtr->dwStyle & BS_LEFTTEXT) if (wndPtr->dwStyle & BS_LEFTTEXT)
{ {
/* magic +4 is what CTL3D expects */ /* magic +4 is what CTL3D expects */
@ -423,6 +432,7 @@ static void CB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
SetTextColor32( hDC, GetSysColor32(COLOR_GRAYTEXT) ); SetTextColor32( hDC, GetSysColor32(COLOR_GRAYTEXT) );
DrawText16( hDC, wndPtr->text, textlen, &rtext, DrawText16( hDC, wndPtr->text, textlen, &rtext,
DT_SINGLELINE | DT_VCENTER ); DT_SINGLELINE | DT_VCENTER );
textlen = 0; /* skip DrawText() below */
} }
} }
@ -453,14 +463,19 @@ static void CB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
*/ */
static void BUTTON_CheckAutoRadioButton( WND *wndPtr ) static void BUTTON_CheckAutoRadioButton( WND *wndPtr )
{ {
HWND32 parent, sibling; HWND32 parent, sibling, start;
if (!(wndPtr->dwStyle & WS_CHILD)) return; if (!(wndPtr->dwStyle & WS_CHILD)) return;
parent = wndPtr->parent->hwndSelf; parent = wndPtr->parent->hwndSelf;
for(sibling = GetNextDlgGroupItem32( parent, wndPtr->hwndSelf, FALSE ); /* assure that starting control is not disabled or invisible */
sibling != wndPtr->hwndSelf && sibling != 0; start = sibling = GetNextDlgGroupItem32( parent, wndPtr->hwndSelf, TRUE );
sibling = GetNextDlgGroupItem32( parent, sibling, FALSE )) do
if((WIN_FindWndPtr(sibling)->dwStyle & 0x0f) == BS_AUTORADIOBUTTON) {
SendMessage32A( sibling, BM_SETCHECK32, BUTTON_UNCHECKED, 0 ); if (!sibling) break;
if ((wndPtr->hwndSelf != sibling) &&
((WIN_FindWndPtr(sibling)->dwStyle & 0x0f) == BS_AUTORADIOBUTTON))
SendMessage32A( sibling, BM_SETCHECK32, BUTTON_UNCHECKED, 0 );
sibling = GetNextDlgGroupItem32( parent, sibling, FALSE );
} while (sibling != start);
} }
@ -506,9 +521,9 @@ static void UB_Paint( WND *wndPtr, HDC32 hDC, WORD action )
GetClientRect16( wndPtr->hwndSelf, &rc); GetClientRect16( wndPtr->hwndSelf, &rc);
if (infoPtr->hFont) SelectObject32( hDC, infoPtr->hFont ); if (infoPtr->hFont) SelectObject32( hDC, infoPtr->hFont );
hBrush = BUTTON_SEND_CTLCOLOR( wndPtr, hDC ); hBrush = GetControlBrush( wndPtr->hwndSelf, hDC, CTLCOLOR_BTN );
FillRect16( hDC, &rc, hBrush );
FillRect16( hDC, &rc, hBrush );
if ((action == ODA_FOCUS) || if ((action == ODA_FOCUS) ||
((action == ODA_DRAWENTIRE) && (infoPtr->state & BUTTON_HASFOCUS))) ((action == ODA_DRAWENTIRE) && (infoPtr->state & BUTTON_HASFOCUS)))
DrawFocusRect16( hDC, &rc ); DrawFocusRect16( hDC, &rc );

View File

@ -1055,24 +1055,33 @@ static INT32 EDIT_CharFromPos(WND *wnd, EDITSTATE *es, INT32 x, INT32 y, LPBOOL3
dc = GetDC32(wnd->hwndSelf); dc = GetDC32(wnd->hwndSelf);
if (es->font) if (es->font)
old_font = SelectObject32(dc, es->font); old_font = SelectObject32(dc, es->font);
if (x < 0) { if (x < 0)
x = -x; {
/* FIXME: inefficient algorithm */ INT32 low = 0;
for (index = es->x_offset ; index ; index--) { INT32 high = es->x_offset;
GetTextExtentPoint32A(dc, text + index, while (low < high - 1)
es->x_offset - index, &size); {
if (size.cx > x) INT32 mid = (low + high) / 2;
break; GetTextExtentPoint32A( dc, text + mid,
} es->x_offset - mid, &size );
} else { if (size.cx > -x) low = mid;
INT32 len = lstrlen32A(es->text); else high = mid;
/* FIXME: inefficient algorithm */ }
for (index = es->x_offset ; index < len ; index++) { index = low;
GetTextExtentPoint32A(dc, text + es->x_offset, }
index - es->x_offset, &size); else
if (size.cx >= x) {
break; INT32 low = es->x_offset;
} INT32 high = lstrlen32A(es->text) + 1;
while (low < high - 1)
{
INT32 mid = (low + high) / 2;
GetTextExtentPoint32A( dc, text + es->x_offset,
mid - es->x_offset, &size );
if (size.cx > x) high = mid;
else low = mid;
}
index = low;
} }
if (es->style & ES_PASSWORD) if (es->style & ES_PASSWORD)
HeapFree(es->heap, 0 ,text); HeapFree(es->heap, 0 ,text);

View File

@ -492,9 +492,14 @@ static void LISTBOX_PaintItem( WND *wnd, LB_DESCR *descr, HDC32 hdc,
ETO_OPAQUE | ETO_CLIPPED, rect, item->str, ETO_OPAQUE | ETO_CLIPPED, rect, item->str,
strlen(item->str), NULL ); strlen(item->str), NULL );
else else
{
/* Output empty string to paint background in the full width. */
ExtTextOut32A( hdc, rect->left + 1, rect->top + 1,
ETO_OPAQUE | ETO_CLIPPED, rect, NULL, 0, NULL );
TabbedTextOut32A( hdc, rect->left + 1 , rect->top + 1, TabbedTextOut32A( hdc, rect->left + 1 , rect->top + 1,
item->str, strlen(item->str), item->str, strlen(item->str),
descr->nb_tabs, descr->tabs, 0); descr->nb_tabs, descr->tabs, 0);
}
if (item && item->selected) if (item && item->selected)
{ {
SetBkColor32( hdc, oldBk ); SetBkColor32( hdc, oldBk );

View File

@ -3,6 +3,7 @@
* *
* Copyright 1993 Martin Ayotte * Copyright 1993 Martin Ayotte
* Copyright 1994 Alexandre Julliard * Copyright 1994 Alexandre Julliard
* Copyright 1997 Morten Welinder
*/ */
/* /*
@ -142,6 +143,7 @@ typedef struct
static WORD check_bitmap_width = 0, check_bitmap_height = 0; static WORD check_bitmap_width = 0, check_bitmap_height = 0;
static WORD arrow_bitmap_width = 0, arrow_bitmap_height = 0; static WORD arrow_bitmap_width = 0, arrow_bitmap_height = 0;
static HBITMAP32 hStdRadioCheck = 0;
static HBITMAP32 hStdCheck = 0; static HBITMAP32 hStdCheck = 0;
static HBITMAP32 hStdMnArrow = 0; static HBITMAP32 hStdMnArrow = 0;
static HBRUSH32 hShadeBrush = 0; static HBRUSH32 hShadeBrush = 0;
@ -316,38 +318,50 @@ HMENU32 MENU_GetSysMenu( HWND32 hWnd, HMENU32 hPopupMenu )
*/ */
BOOL32 MENU_Init() BOOL32 MENU_Init()
{ {
/* Load menu bitmaps */ HBITMAP32 hBitmap;
static unsigned char shade_bits[16] = { 0x55, 0, 0xAA, 0,
0x55, 0, 0xAA, 0,
0x55, 0, 0xAA, 0,
0x55, 0, 0xAA, 0 };
if ((hStdCheck = LoadBitmap32A( 0, (LPSTR)MAKEINTRESOURCE(OBM_CHECK) ))) /* Load menu bitmaps */
hStdCheck = LoadBitmap32A(0, (LPSTR)MAKEINTRESOURCE(OBM_CHECK));
hStdRadioCheck = LoadBitmap32A(0, (LPSTR)MAKEINTRESOURCE(OBM_RADIOCHECK));
hStdMnArrow = LoadBitmap32A(0, (LPSTR)MAKEINTRESOURCE(OBM_MNARROW));
if (hStdCheck)
{ {
BITMAP32 bm; BITMAP32 bm;
GetObject32A( hStdCheck, sizeof(bm), &bm ); GetObject32A( hStdCheck, sizeof(bm), &bm );
check_bitmap_width = bm.bmWidth; check_bitmap_width = bm.bmWidth;
check_bitmap_height = bm.bmHeight; check_bitmap_height = bm.bmHeight;
} else
return FALSE;
if ((hStdMnArrow = LoadBitmap32A(0,(LPSTR)MAKEINTRESOURCE(OBM_MNARROW)))) /* Assume that radio checks have the same size as regular check. */
if (!hStdRadioCheck)
return FALSE;
if (hStdMnArrow)
{ {
HBITMAP32 hBitmap; BITMAP32 bm;
static unsigned char shade_bits[16] = { 0x55, 0, 0xAA, 0,
0x55, 0, 0xAA, 0,
0x55, 0, 0xAA, 0,
0x55, 0, 0xAA, 0 };
GetObject32A( hStdMnArrow, sizeof(bm), &bm ); GetObject32A( hStdMnArrow, sizeof(bm), &bm );
arrow_bitmap_width = bm.bmWidth; arrow_bitmap_width = bm.bmWidth;
arrow_bitmap_height = bm.bmHeight; arrow_bitmap_height = bm.bmHeight;
} else
return FALSE;
if((hBitmap = CreateBitmap32( 8, 8, 1, 1, shade_bits))) if ((hBitmap = CreateBitmap32( 8, 8, 1, 1, shade_bits)))
{ {
if((hShadeBrush = CreatePatternBrush32( hBitmap ))) if((hShadeBrush = CreatePatternBrush32( hBitmap )))
{ {
DeleteObject32( hBitmap ); DeleteObject32( hBitmap );
if((MENU_DefSysPopup = MENU_CopySysPopup())) return TRUE; if ((MENU_DefSysPopup = MENU_CopySysPopup()))
} return TRUE;
}
} }
} }
return FALSE; /* failure */
return FALSE;
} }
/*********************************************************************** /***********************************************************************
@ -720,7 +734,7 @@ static void MENU_PopupMenuCalcSize( LPPOPUPMENU lppop, HWND32 hwndOwner )
/*********************************************************************** /***********************************************************************
* MENU_MenuBarCalcSize * MENU_MenuBarCalcSize
* *
* FIXME: Word 6 implements it's own MDI and it's 'close window' bitmap * FIXME: Word 6 implements its own MDI and its own 'close window' bitmap
* height is off by 1 pixel which causes lengthy window relocations when * height is off by 1 pixel which causes lengthy window relocations when
* active document window is maximized/restored. * active document window is maximized/restored.
* *
@ -936,10 +950,16 @@ static void MENU_DrawMenuItem( HWND32 hwnd, HDC32 hdc, MENUITEM *lpitem,
*/ */
if (lpitem->fState & MF_CHECKED) if (lpitem->fState & MF_CHECKED)
GRAPH_DrawBitmap( hdc, lpitem->hCheckBit ? lpitem->hCheckBit {
: hStdCheck, rect.left, (y - check_bitmap_height) / 2, HBITMAP32 bm =
0, 0, check_bitmap_width, check_bitmap_height, TRUE ); lpitem->hCheckBit ? lpitem->hCheckBit :
else if (lpitem->hUnCheckBit) ((lpitem->fType & MFT_RADIOCHECK)
? hStdRadioCheck : hStdCheck);
GRAPH_DrawBitmap( hdc, bm, rect.left,
(y - check_bitmap_height) / 2,
0, 0, check_bitmap_width,
check_bitmap_height, TRUE );
} else if (lpitem->hUnCheckBit)
GRAPH_DrawBitmap( hdc, lpitem->hUnCheckBit, rect.left, GRAPH_DrawBitmap( hdc, lpitem->hUnCheckBit, rect.left,
(y - check_bitmap_height) / 2, 0, 0, (y - check_bitmap_height) / 2, 0, 0,
check_bitmap_width, check_bitmap_height, TRUE ); check_bitmap_width, check_bitmap_height, TRUE );
@ -3872,3 +3892,105 @@ BOOL32 WINAPI InsertMenuItem32W(HMENU32 hMenu, UINT32 uItem, BOOL32 bypos,
MENUITEM *item = MENU_InsertItem(hMenu, uItem, bypos); MENUITEM *item = MENU_InsertItem(hMenu, uItem, bypos);
return SetMenuItemInfo32_common(item, (const MENUITEMINFO32A*)lpmii, TRUE); return SetMenuItemInfo32_common(item, (const MENUITEMINFO32A*)lpmii, TRUE);
} }
/**********************************************************************
* CheckMenuRadioItem32 (USER32.47)
*/
BOOL32 WINAPI CheckMenuRadioItem32(HMENU32 hMenu,
UINT32 first, UINT32 last, UINT32 check,
BOOL32 bypos)
{
MENUITEM *mifirst, *milast, *micheck;
HMENU32 mfirst = hMenu, mlast = hMenu, mcheck = hMenu;
dprintf_menu (stddeb,
"CheckMenuRadioItem32: ox%x: %d-%d, check %d, bypos=%d\n",
hMenu, first, last, check, bypos);
mifirst = MENU_FindItem (&mfirst, &first, bypos);
milast = MENU_FindItem (&mlast, &last, bypos);
micheck = MENU_FindItem (&mcheck, &check, bypos);
if (mifirst == NULL || milast == NULL || micheck == NULL ||
mifirst > milast || mfirst != mlast || mfirst != mcheck ||
micheck > milast || micheck < mifirst)
return FALSE;
while (mifirst <= milast)
{
if (mifirst == micheck)
{
mifirst->fType |= MFT_RADIOCHECK;
mifirst->fState |= MFS_CHECKED;
} else {
mifirst->fType &= ~MFT_RADIOCHECK;
mifirst->fState &= ~MFS_CHECKED;
}
mifirst++;
}
return TRUE;
}
/**********************************************************************
* CheckMenuRadioItem16 (not a Windows API)
*/
BOOL16 WINAPI CheckMenuRadioItem16(HMENU16 hMenu,
UINT16 first, UINT16 last, UINT16 check,
BOOL16 bypos)
{
return CheckMenuRadioItem32 (hMenu, first, last, check, bypos);
}
/**********************************************************************
* GetMenuItemRect32 (USER32.266)
*/
BOOL32 WINAPI GetMenuItemRect32 (HWND32 hwnd, HMENU32 hMenu, UINT32 uItem,
LPRECT32 rect)
{
RECT32 saverect, clientrect;
BOOL32 barp;
HDC32 hdc;
WND *wndPtr;
MENUITEM *item;
HMENU32 orghMenu = hMenu;
dprintf_menu (stddeb, "GetMenuItemRect32 (0x%x,0x%x,%d,%p)\n",
hwnd, hMenu, uItem, rect);
item = MENU_FindItem (&hMenu, &uItem, MF_BYPOSITION);
wndPtr = WIN_FindWndPtr (hwnd);
if (!rect || !item || !wndPtr) return FALSE;
GetClientRect32( hwnd, &clientrect );
hdc = GetDCEx32( hwnd, 0, DCX_CACHE | DCX_WINDOW );
barp = (hMenu == orghMenu);
saverect = item->rect;
MENU_CalcItemSize (hdc, item, hwnd,
clientrect.left, clientrect.top, barp);
*rect = item->rect;
item->rect = saverect;
ReleaseDC32( hwnd, hdc );
return TRUE;
}
/**********************************************************************
* GetMenuItemRect16 (USER.665)
*/
BOOL16 WINAPI GetMenuItemRect16 (HWND16 hwnd, HMENU16 hMenu, UINT16 uItem,
LPRECT16 rect)
{
RECT32 r32;
BOOL32 res;
if (!rect) return FALSE;
res = GetMenuItemRect32 (hwnd, hMenu, uItem, &r32);
CONV_RECT32TO16 (&r32, rect);
return res;
}

View File

@ -84,7 +84,7 @@ static HICON16 STATIC_SetBitmap( WND *wndPtr, HICON16 hicon )
{ {
HICON16 prevIcon; HICON16 prevIcon;
STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra; STATICINFO *infoPtr = (STATICINFO *)wndPtr->wExtra;
BITMAPOBJ *info = GDI_HEAP_LOCK(hicon); BITMAPOBJ *info = (BITMAPOBJ *)GDI_HEAP_LOCK(hicon);
if ((wndPtr->dwStyle & SS_TYPEMASK) != SS_BITMAP) return 0; if ((wndPtr->dwStyle & SS_TYPEMASK) != SS_BITMAP) return 0;
if (hicon && !info) { if (hicon && !info) {

View File

@ -32,31 +32,9 @@ extern LRESULT WINAPI PopupMenuWndProc( HWND32 hwnd, UINT32 msg,
extern LRESULT WINAPI IconTitleWndProc( HWND32 hwnd, UINT32 msg, extern LRESULT WINAPI IconTitleWndProc( HWND32 hwnd, UINT32 msg,
WPARAM32 wParam, LPARAM lParam ); WPARAM32 wParam, LPARAM lParam );
/* Win16 class info */ /* Built-in classes */
typedef struct static WNDCLASS32A WIDGETS_BuiltinClasses[BIC32_NB_CLASSES] =
{
UINT16 style;
INT16 wndExtra;
HBRUSH16 background;
LPCSTR procName;
LPCSTR className;
} BUILTIN_CLASS_INFO16;
/* Win16 built-in classes */
static const BUILTIN_CLASS_INFO16 WIDGETS_BuiltinClasses16[] =
{
{ CS_GLOBALCLASS, sizeof(MDICLIENTINFO),
STOCK_LTGRAY_BRUSH, "MDIClientWndProc", "MDIClient" }
};
#define NB_BUILTIN_CLASSES16 \
(sizeof(WIDGETS_BuiltinClasses16)/sizeof(WIDGETS_BuiltinClasses16[0]))
/* Win32 built-in classes */
static WNDCLASS32A WIDGETS_BuiltinClasses32[BIC32_NB_CLASSES] =
{ {
/* BIC32_BUTTON */ /* BIC32_BUTTON */
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC, { CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
@ -82,6 +60,9 @@ static WNDCLASS32A WIDGETS_BuiltinClasses32[BIC32_NB_CLASSES] =
/* BIC32_SCROLL */ /* BIC32_SCROLL */
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC, { CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
ScrollBarWndProc, 0, sizeof(SCROLLBAR_INFO), 0, 0, IDC_ARROW, 0, 0, "ScrollBar"}, ScrollBarWndProc, 0, sizeof(SCROLLBAR_INFO), 0, 0, IDC_ARROW, 0, 0, "ScrollBar"},
/* BIC32_MDICLIENT */
{ CS_GLOBALCLASS, MDIClientWndProc,
0, sizeof(MDICLIENTINFO), 0, 0, 0, STOCK_LTGRAY_BRUSH, 0, "MDIClient" },
/* BIC32_DESKTOP */ /* BIC32_DESKTOP */
{ CS_GLOBALCLASS, DesktopWndProc, 0, sizeof(DESKTOPINFO), { CS_GLOBALCLASS, DesktopWndProc, 0, sizeof(DESKTOPINFO),
0, 0, IDC_ARROW, 0, 0, DESKTOP_CLASS_NAME }, 0, 0, IDC_ARROW, 0, 0, DESKTOP_CLASS_NAME },
@ -103,45 +84,22 @@ static ATOM bicAtomTable[BIC32_NB_CLASSES];
BOOL32 WIDGETS_Init(void) BOOL32 WIDGETS_Init(void)
{ {
int i; int i;
char *name; WNDCLASS32A *cls = WIDGETS_BuiltinClasses;
const BUILTIN_CLASS_INFO16 *info16 = WIDGETS_BuiltinClasses16;
WNDCLASS16 class16;
WNDCLASS32A *class32 = WIDGETS_BuiltinClasses32;
if (!(name = SEGPTR_ALLOC( 20 * sizeof(char) ))) return FALSE; /* Create builtin classes */
/* Create 16-bit classes */ for (i = 0; i < BIC32_NB_CLASSES; i++, cls++)
class16.cbClsExtra = 0;
class16.hInstance = 0;
class16.hIcon = 0;
class16.hCursor = LoadCursor16( 0, IDC_ARROW );
class16.lpszMenuName = (SEGPTR)0;
class16.lpszClassName = SEGPTR_GET(name);
for (i = 0; i < NB_BUILTIN_CLASSES16; i++, info16++)
{
class16.style = info16->style;
class16.lpfnWndProc = (WNDPROC16)MODULE_GetWndProcEntry16( info16->procName );
class16.cbWndExtra = info16->wndExtra;
class16.hbrBackground = info16->background;
strcpy( name, info16->className );
if (!RegisterClass16( &class16 )) return FALSE;
}
/* Create 32-bit classes */
for (i = 0; i < BIC32_NB_CLASSES; i++, class32++)
{ {
char name[20];
/* Just to make sure the string is > 0x10000 */ /* Just to make sure the string is > 0x10000 */
strcpy( name, (char *)class32->lpszClassName ); strcpy( name, (char *)cls->lpszClassName );
class32->lpszClassName = name; cls->lpszClassName = name;
class32->hCursor = LoadCursor16( 0, class32->hCursor ); cls->hCursor = LoadCursor16( 0, cls->hCursor );
if (!(bicAtomTable[i] = RegisterClass32A( class32 ))) return FALSE; if (!(bicAtomTable[i] = RegisterClass32A( cls ))) return FALSE;
} }
/* FIXME: hack to enable using built-in controls with Windows COMCTL32 */ /* FIXME: hack to enable using built-in controls with Windows COMCTL32 */
InitCommonControls(); InitCommonControls();
SEGPTR_FREE(name);
return TRUE; return TRUE;
} }

View File

@ -388,12 +388,13 @@ BOOL32 DEBUG_ShouldContinue( enum exec_mode mode, int * count )
DBG_ADDR cond_addr; DBG_ADDR cond_addr;
int bpnum; int bpnum;
struct list_id list; struct list_id list;
WORD cs;
/* If not single-stepping, back up over the int3 instruction */ /* If not single-stepping, back up over the int3 instruction */
if (!(EFL_reg(&DEBUG_context) & STEP_FLAG)) EIP_reg(&DEBUG_context)--; if (!(EFL_reg(&DEBUG_context) & STEP_FLAG)) EIP_reg(&DEBUG_context)--;
addr.seg = (CS_reg(&DEBUG_context) == WINE_CODE_SELECTOR) ? GET_CS(cs);
0 : CS_reg(&DEBUG_context); addr.seg = (CS_reg(&DEBUG_context) == cs) ? 0 : CS_reg(&DEBUG_context);
addr.off = EIP_reg(&DEBUG_context); addr.off = EIP_reg(&DEBUG_context);
bpnum = DEBUG_FindBreakpoint( &addr ); bpnum = DEBUG_FindBreakpoint( &addr );
@ -512,9 +513,10 @@ enum exec_mode DEBUG_RestartExecution( enum exec_mode mode, int count )
unsigned int * value; unsigned int * value;
enum exec_mode ret_mode; enum exec_mode ret_mode;
BYTE *instr; BYTE *instr;
WORD cs;
addr.seg = (CS_reg(&DEBUG_context) == WINE_CODE_SELECTOR) ? GET_CS(cs);
0 : CS_reg(&DEBUG_context); addr.seg = (CS_reg(&DEBUG_context) == cs) ? 0 : CS_reg(&DEBUG_context);
addr.off = EIP_reg(&DEBUG_context); addr.off = EIP_reg(&DEBUG_context);
/* /*

View File

@ -441,13 +441,8 @@ static void DEBUG_Main( int signal )
DEBUG_ReadSymbolTable( SymbolTableFile ); DEBUG_ReadSymbolTable( SymbolTableFile );
} }
/*
* Read COFF, MSC, etc debug information that we noted when we
* started up the executable.
*/
DEBUG_ProcessDeferredDebug();
DEBUG_LoadEntryPoints(); DEBUG_LoadEntryPoints();
DEBUG_ProcessDeferredDebug();
fprintf(stderr,"\n"); fprintf(stderr,"\n");
} }

View File

@ -633,21 +633,19 @@ const char * DEBUG_FindNearestSymbol( const DBG_ADDR *addr, int flag,
* Try and find the nearest line number to the current offset. * Try and find the nearest line number to the current offset.
*/ */
if( nearest->linetab != NULL ) if( nearest->linetab != NULL )
{ {
/* low = 0;
* FIXME - this is an inefficient linear search. A binary high = nearest->n_lines;
* search would be better if this gets to be a performance while ((high - low) > 1)
* bottleneck. {
*/ mid = (high + low) / 2;
for(i=0; i < nearest->n_lines; i++) if (addr->off < nearest->linetab[mid].pc_offset.off)
{ high = mid;
if( addr->off < nearest->linetab[i].pc_offset.off ) else
{ low = mid;
break; }
} lineno = nearest->linetab[low].line_number;
lineno = nearest->linetab[i].line_number; }
}
}
if( lineno != -1 ) if( lineno != -1 )
{ {
@ -799,6 +797,7 @@ static void DEBUG_LoadEntryPoints32( PE_MODULE *pe, const char *name )
char buffer[256]; char buffer[256];
int i, j; int i, j;
IMAGE_EXPORT_DIRECTORY *exports; IMAGE_EXPORT_DIRECTORY *exports;
IMAGE_DATA_DIRECTORY *debug_dir;
DWORD load_addr; DWORD load_addr;
WORD *ordinals; WORD *ordinals;
void **functions; void **functions;
@ -859,6 +858,11 @@ static void DEBUG_LoadEntryPoints32( PE_MODULE *pe, const char *name )
addr.off = (DWORD)RVA( functions[i] ); addr.off = (DWORD)RVA( functions[i] );
DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC ); DEBUG_AddSymbol( buffer, &addr, NULL, SYM_WIN32 | SYM_FUNC );
} }
debug_dir = &pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG];
if (debug_dir->Size)
DEBUG_RegisterDebugInfo( pe, load_addr, name,
debug_dir->VirtualAddress, debug_dir->Size );
#undef RVA #undef RVA
} }
@ -976,7 +980,6 @@ int DEBUG_CheckLinenoStatus( const DBG_ADDR *addr)
{ {
struct name_hash * nearest = NULL; struct name_hash * nearest = NULL;
int mid, high, low; int mid, high, low;
int i;
if( sortlist_valid == FALSE ) if( sortlist_valid == FALSE )
{ {
@ -1100,24 +1103,18 @@ int DEBUG_CheckLinenoStatus( const DBG_ADDR *addr)
if( (nearest->sourcefile != NULL) if( (nearest->sourcefile != NULL)
&& (addr->off - nearest->addr.off < 0x100000) ) && (addr->off - nearest->addr.off < 0x100000) )
{ {
/* low = 0;
* FIXME - this is an inefficient linear search. A binary high = nearest->n_lines;
* search would be better if this gets to be a performance while ((high - low) > 1)
* bottleneck. {
*/ mid = (high + low) / 2;
for(i=0; i < nearest->n_lines; i++) if (addr->off < nearest->linetab[mid].pc_offset.off) high = mid;
{ else low = mid;
if( addr->off == nearest->linetab[i].pc_offset.off ) }
{ if (addr->off == nearest->linetab[low].pc_offset.off)
return AT_LINENUMBER; return AT_LINENUMBER;
} else
if( addr->off < nearest->linetab[i].pc_offset.off ) return NOT_ON_LINENUMBER;
{
break;
}
}
return NOT_ON_LINENUMBER;
} }
return FUNC_HAS_NO_LINES; return FUNC_HAS_NO_LINES;

View File

@ -34,11 +34,6 @@
#include "peexe.h" #include "peexe.h"
#include "xmalloc.h" #include "xmalloc.h"
/*
* This is used so that we have some idea of what we are in fact loading
* at any given time.
*/
char * DEBUG_curr_module = NULL;
/* /*
* This is an index we use to keep track of the debug information * This is an index we use to keep track of the debug information
@ -886,7 +881,8 @@ DEBUG_InitCVDataTypes()
* We don't fully process it here for performance reasons. * We don't fully process it here for performance reasons.
*/ */
int int
DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr, u_long v_addr, u_long size) DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr,
const char *module_name, u_long v_addr, u_long size)
{ {
int has_codeview = FALSE; int has_codeview = FALSE;
int rtn = FALSE; int rtn = FALSE;
@ -956,13 +952,13 @@ DEBUG_RegisterDebugInfo(struct pe_data * pe,int load_addr, u_long v_addr, u_long
* to proceed if we know what we need to do next. * to proceed if we know what we need to do next.
*/ */
deefer->dbg_size = dbgptr->SizeOfData; deefer->dbg_size = dbgptr->SizeOfData;
deefer->dbg_info = pe->mappeddll+dbgptr->PointerToRawData; deefer->dbg_info = (char *)(pe->mappeddll+dbgptr->PointerToRawData);
deefer->load_addr = (char *) load_addr; deefer->load_addr = (char *) load_addr;
deefer->dbgdir = dbgptr; deefer->dbgdir = dbgptr;
deefer->next = dbglist; deefer->next = dbglist;
deefer->loaded = FALSE; deefer->loaded = FALSE;
deefer->dbg_index = DEBUG_next_index; deefer->dbg_index = DEBUG_next_index;
deefer->module_name = xstrdup(DEBUG_curr_module); deefer->module_name = xstrdup(module_name);
deefer->sectp = pe->pe_seg; deefer->sectp = pe->pe_seg;
deefer->nsect = pe->pe_header->FileHeader.NumberOfSections; deefer->nsect = pe->pe_header->FileHeader.NumberOfSections;

View File

@ -147,13 +147,13 @@ void DEBUG_SetSigContext( const SIGCONTEXT *sigcontext )
#ifdef FS_sig #ifdef FS_sig
FS_reg(&DEBUG_context) = LOWORD(FS_sig(sigcontext)); FS_reg(&DEBUG_context) = LOWORD(FS_sig(sigcontext));
#else #else
__asm__("movw %%fs,%w0":"=r" (FS_reg(&DEBUG_context))); GET_FS( FS_reg(&DEBUG_context) );
FS_reg(&DEBUG_context) &= 0xffff; FS_reg(&DEBUG_context) &= 0xffff;
#endif #endif
#ifdef GS_sig #ifdef GS_sig
GS_reg(&DEBUG_context) = LOWORD(GS_sig(sigcontext)); GS_reg(&DEBUG_context) = LOWORD(GS_sig(sigcontext));
#else #else
__asm__("movw %%gs,%w0":"=r" (GS_reg(&DEBUG_context))); GET_GS( GS_reg(&DEBUG_context) );
GS_reg(&DEBUG_context) &= 0xffff; GS_reg(&DEBUG_context) &= 0xffff;
#endif #endif
} }
@ -183,12 +183,12 @@ void DEBUG_GetSigContext( SIGCONTEXT *sigcontext )
#ifdef FS_sig #ifdef FS_sig
FS_sig(sigcontext) = FS_reg(&DEBUG_context); FS_sig(sigcontext) = FS_reg(&DEBUG_context);
#else #else
__asm__("movw %w0,%%fs"::"r" (FS_reg(&DEBUG_context))); SET_FS( FS_reg(&DEBUG_context) );
#endif #endif
#ifdef GS_sig #ifdef GS_sig
GS_sig(sigcontext) = GS_reg(&DEBUG_context); GS_sig(sigcontext) = GS_reg(&DEBUG_context);
#else #else
__asm__("movw %w0,%%gs"::"r" (GS_reg(&DEBUG_context))); SET_GS( GS_reg(&DEBUG_context) );
#endif #endif
} }
@ -239,6 +239,8 @@ void DEBUG_InfoRegisters(void)
*/ */
BOOL32 DEBUG_ValidateRegisters(void) BOOL32 DEBUG_ValidateRegisters(void)
{ {
WORD cs, ds;
/* Check that a selector is a valid ring-3 LDT selector, or a NULL selector */ /* Check that a selector is a valid ring-3 LDT selector, or a NULL selector */
#define CHECK_SEG(seg,name) \ #define CHECK_SEG(seg,name) \
if (((seg) & ~3) && \ if (((seg) & ~3) && \
@ -249,18 +251,14 @@ BOOL32 DEBUG_ValidateRegisters(void)
return FALSE; \ return FALSE; \
} }
if (CS_reg(&DEBUG_context) != WINE_CODE_SELECTOR) GET_CS(cs);
CHECK_SEG( CS_reg(&DEBUG_context), "CS" ); GET_DS(ds);
if (SS_reg(&DEBUG_context) != WINE_DATA_SELECTOR) if (CS_reg(&DEBUG_context) != cs) CHECK_SEG(CS_reg(&DEBUG_context), "CS");
CHECK_SEG( SS_reg(&DEBUG_context), "SS" ); if (SS_reg(&DEBUG_context) != ds) CHECK_SEG(SS_reg(&DEBUG_context), "SS");
if (DS_reg(&DEBUG_context) != WINE_DATA_SELECTOR) if (DS_reg(&DEBUG_context) != ds) CHECK_SEG(DS_reg(&DEBUG_context), "DS");
CHECK_SEG( DS_reg(&DEBUG_context), "DS" ); if (ES_reg(&DEBUG_context) != ds) CHECK_SEG(ES_reg(&DEBUG_context), "ES");
if (ES_reg(&DEBUG_context) != WINE_DATA_SELECTOR) if (FS_reg(&DEBUG_context) != ds) CHECK_SEG(FS_reg(&DEBUG_context), "FS");
CHECK_SEG( ES_reg(&DEBUG_context), "ES" ); if (GS_reg(&DEBUG_context) != ds) CHECK_SEG(GS_reg(&DEBUG_context), "GS");
if (FS_reg(&DEBUG_context) != WINE_DATA_SELECTOR)
CHECK_SEG( FS_reg(&DEBUG_context), "FS" );
if (GS_reg(&DEBUG_context) != WINE_DATA_SELECTOR)
CHECK_SEG( GS_reg(&DEBUG_context), "GS" );
/* Check that CS and SS are not NULL */ /* Check that CS and SS are not NULL */

View File

@ -480,7 +480,6 @@ DEBUG_Disassemble(const DBG_ADDR *xstart,const DBG_ADDR *xend,int offset)
DBG_ADDR last; DBG_ADDR last;
DBG_ADDR end,start; DBG_ADDR end,start;
if (xstart) { if (xstart) {
start=*xstart; start=*xstart;
_disassemble_fixaddr(&start); _disassemble_fixaddr(&start);
@ -491,9 +490,12 @@ DEBUG_Disassemble(const DBG_ADDR *xstart,const DBG_ADDR *xend,int offset)
} }
if (!xstart && !xend) { if (!xstart && !xend) {
last = DEBUG_LastDisassemble; last = DEBUG_LastDisassemble;
if (!last.seg && !last.off) { if (!last.seg && !last.off)
last.seg = (CS_reg(&DEBUG_context)==WINE_CODE_SELECTOR)?0:CS_reg(&DEBUG_context); {
last.off = EIP_reg(&DEBUG_context); WORD cs;
GET_CS(cs);
last.seg = (CS_reg(&DEBUG_context) == cs) ? 0 : CS_reg(&DEBUG_context);
last.off = EIP_reg(&DEBUG_context);
} }
for (i=0;i<offset;i++) for (i=0;i<offset;i++)
if (!_disassemble(&last)) break; if (!_disassemble(&last)) break;

View File

@ -52,9 +52,11 @@ typedef struct
void DEBUG_InfoStack(void) void DEBUG_InfoStack(void)
{ {
DBG_ADDR addr; DBG_ADDR addr;
WORD ss;
fprintf(stderr,"Stack dump:\n"); fprintf(stderr,"Stack dump:\n");
if ((SS_reg(&DEBUG_context) == WINE_DATA_SELECTOR) || GET_SS(ss);
if ((SS_reg(&DEBUG_context) == ss) ||
(GET_SEL_FLAGS(SS_reg(&DEBUG_context)) & LDT_FLAGS_32BIT)) (GET_SEL_FLAGS(SS_reg(&DEBUG_context)) & LDT_FLAGS_32BIT))
{ /* 32-bit mode */ { /* 32-bit mode */
addr.seg = 0; addr.seg = 0;
@ -82,9 +84,11 @@ void DEBUG_BackTrace(void)
{ {
DBG_ADDR addr; DBG_ADDR addr;
int frameno = 0; int frameno = 0;
WORD ss;
fprintf(stderr,"Backtrace:\n"); fprintf(stderr,"Backtrace:\n");
if (SS_reg(&DEBUG_context) == WINE_DATA_SELECTOR) /* 32-bit mode */ GET_SS(ss);
if (SS_reg(&DEBUG_context) == ss) /* 32-bit mode */
{ {
nframe = 1; nframe = 1;
if (frames) free( frames ); if (frames) free( frames );
@ -158,14 +162,15 @@ void DEBUG_BackTrace(void)
*/ */
void DEBUG_SilentBackTrace(void) void DEBUG_SilentBackTrace(void)
{ {
WORD ss;
DBG_ADDR addr; DBG_ADDR addr;
int frameno = 0; int frameno = 0;
nframe = 1; nframe = 1;
if (frames) free( frames ); if (frames) free( frames );
frames = (struct bt_info *) xmalloc( sizeof(struct bt_info) ); frames = (struct bt_info *) xmalloc( sizeof(struct bt_info) );
GET_SS(ss);
if (SS_reg(&DEBUG_context) == WINE_DATA_SELECTOR) /* 32-bit mode */ if (SS_reg(&DEBUG_context) == ss) /* 32-bit mode */
{ {
addr.seg = 0; addr.seg = 0;
addr.off = EIP_reg(&DEBUG_context); addr.off = EIP_reg(&DEBUG_context);

View File

@ -101,7 +101,9 @@ Program hangs, nothing happens
Switch to UNIX shell, get the process-ID using "ps -a|grep wine", and do a Switch to UNIX shell, get the process-ID using "ps -a|grep wine", and do a
"kill -HUP <pid>" (without " and <>). Wine will then enter its internal "kill -HUP <pid>" (without " and <>). Wine will then enter its internal
debugger and you can proceed as explained above. debugger and you can proceed as explained above. Also, you can use -debug
switch and then you can get into internal debugger by pressing Ctrl-C in
the terminal where you run Wine.
Program reports an error with a Messagebox Program reports an error with a Messagebox
========================================== ==========================================

View File

@ -17,6 +17,7 @@ stuff (rectangles, clipboard, WNet, etc). Wine USER code is
located in windows/, controls/, and misc/ directories. located in windows/, controls/, and misc/ directories.
1. Windowing subsystem 1. Windowing subsystem
----------------------
windows/win.c windows/win.c
windows/winpos.c windows/winpos.c
@ -58,15 +59,17 @@ located in windows/, controls/, and misc/ directories.
active window ("foreground window" in Win32) is moved to the front active window ("foreground window" in Win32) is moved to the front
of z-order unless its top-level ancestor owns popup windows. of z-order unless its top-level ancestor owns popup windows.
All these issues are dealt with (or supposed to be) in All these issues are dealt with (or supposed to be) in windows/winpos.c
windows/winpos.c with SetWindowPos() being the primary interface to the window manager.
Wine specifics: in default and managed mode each top-level window Wine specifics: in default and managed mode each top-level window
gets its own X counterpart with desktop window being basically a gets its own X counterpart with desktop window being basically a
fake stub. In desktop mode, however, only desktop window has an X fake stub. In desktop mode, however, only desktop window has an X
window associated with it. window associated with it. Also, SetWindowPos() should eventually be
implemented via Begin/End/DeferWindowPos() calls and not the other way
around.
2. Visible region, clipping region and update region 1.1 Visible region, clipping region and update region
windows/dce.c windows/dce.c
windows/winpos.c windows/winpos.c
@ -143,9 +146,12 @@ located in windows/, controls/, and misc/ directories.
the DC cache to recalculate visible regions for entries whose windows the DC cache to recalculate visible regions for entries whose windows
were involved in the operation. DC entries (DCE) can be either private were involved in the operation. DC entries (DCE) can be either private
to the window, or private to the window class, or shared between all to the window, or private to the window class, or shared between all
windows. Windows 3.1 limits the number of shared DCEs to 5. windows (Windows 3.1 limits the number of shared DCEs to 5).
3. Messaging subsystem 1.2
2. Messaging subsystem
----------------------
windows/queue.c windows/queue.c
windows/message.c windows/message.c

View File

@ -1,6 +1,6 @@
prefix = @prefix@ prefix = @prefix@
sysconfdir = @sysconfdir@ sysconfdir = @sysconfdir@
DEFS = -D__WINE__ -DETCDIR=\"$(sysconfdir)\" DEFS = @DLLFLAGS@ -D__WINE__ -DETCDIR=\"$(sysconfdir)\"
TOPSRCDIR = @top_srcdir@ TOPSRCDIR = @top_srcdir@
TOPOBJDIR = .. TOPOBJDIR = ..
SRCDIR = @srcdir@ SRCDIR = @srcdir@

View File

@ -631,7 +631,7 @@ DWORD WINAPI SearchPath32W( LPCWSTR path, LPCWSTR name, LPCWSTR ext,
while (*res == '/') res++; while (*res == '/') res++;
if (buflen) if (buflen)
{ {
if (buflen > 3) lstrcpynAtoW( buffer + 3, res + 1, buflen - 3 ); if (buflen > 3) lstrcpynAtoW( buffer + 3, res, buflen - 3 );
for (p = buffer; *p; p++) if (*p == '/') *p = '\\'; for (p = buffer; *p; p++) if (*p == '/') *p = '\\';
if (lastpart) if (lastpart)
{ {

View File

@ -314,6 +314,7 @@ int DRIVE_FindDriveRoot( const char **path )
while (!IS_END_OF_NAME(*p)) *next++ = *p++; while (!IS_END_OF_NAME(*p)) *next++ = *p++;
*next = 0; *next = 0;
} }
*next = 0;
if (rootdrive != -1) if (rootdrive != -1)
dprintf_dosfs( stddeb, "DRIVE_FindDriveRoot: %s -> drive %c:, root='%s', name='%s'\n", dprintf_dosfs( stddeb, "DRIVE_FindDriveRoot: %s -> drive %c:, root='%s', name='%s'\n",
@ -618,6 +619,10 @@ BOOL32 WINAPI GetDiskFreeSpace32A( LPCSTR root, LPDWORD cluster_sectors,
} }
if (!DRIVE_GetFreeSpace(drive, &size, &available)) return FALSE; if (!DRIVE_GetFreeSpace(drive, &size, &available)) return FALSE;
/* Cap the size and available at 2GB as per specs. */
if (size > 0x7fffffff) size = 0x7fffffff;
if (available > 0x7fffffff) available = 0x7fffffff;
*sector_bytes = 512; *sector_bytes = 512;
size /= 512; size /= 512;
available /= 512; available /= 512;

View File

@ -1286,8 +1286,8 @@ LPVOID FILE_dommap( FILE_OBJECT *file, LPVOID start,
} }
/* printf( "FILE_mmap: mmap failed (%d), faking it\n", errno );*/ /* printf( "FILE_mmap: mmap failed (%d), faking it\n", errno );*/
/* Reserve the memory with an anonymous mmap */ /* Reserve the memory with an anonymous mmap */
ret = FILE_mmap( NULL, start, size_high, size_low, 0, 0, ret = FILE_dommap( NULL, start, size_high, size_low, 0, 0,
PROT_READ | PROT_WRITE, flags ); PROT_READ | PROT_WRITE, flags );
if (ret == (LPVOID)-1) return ret; if (ret == (LPVOID)-1) return ret;
/* Now read in the file */ /* Now read in the file */
if ((pos = lseek( fd, offset_low, SEEK_SET )) == -1) if ((pos = lseek( fd, offset_low, SEEK_SET )) == -1)

View File

@ -1,4 +1,4 @@
DEFS = -D__WINE__ DEFS = @DLLFLAGS@ -D__WINE__
TOPSRCDIR = @top_srcdir@ TOPSRCDIR = @top_srcdir@
TOPOBJDIR = .. TOPOBJDIR = ..
SRCDIR = @srcdir@ SRCDIR = @srcdir@

View File

@ -1,4 +1,4 @@
DEFS = -D__WINE__ DEFS = @DLLFLAGS@ -D__WINE__
TOPSRCDIR = @top_srcdir@ TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../.. TOPOBJDIR = ../..
SRCDIR = @srcdir@ SRCDIR = @srcdir@

View File

@ -21,12 +21,12 @@ HBRUSH32 WIN16DRV_BRUSH_SelectObject( DC * dc, HBRUSH32 hbrush,
lBrush16.lbStyle = brush->logbrush.lbStyle; lBrush16.lbStyle = brush->logbrush.lbStyle;
lBrush16.lbColor = brush->logbrush.lbColor; lBrush16.lbColor = brush->logbrush.lbColor;
lBrush16.lbHatch = brush->logbrush.lbHatch; lBrush16.lbHatch = brush->logbrush.lbHatch;
nSize = PRTDRV_RealizeObject (physDev->segptrPDEVICE, OBJ_BRUSH, nSize = PRTDRV_RealizeObject (physDev->segptrPDEVICE, DRVOBJ_BRUSH,
&lBrush16, NULL, &lBrush16, NULL,
0); 0);
/* may need to realloc segptrFOntInfo*/ /* may need to realloc segptrFOntInfo*/
physDev->segptrBrushInfo = WIN16_GlobalLock16(GlobalAlloc16(GHND, nSize)); physDev->segptrBrushInfo = WIN16_GlobalLock16(GlobalAlloc16(GHND, nSize));
nSize = PRTDRV_RealizeObject(physDev->segptrPDEVICE, OBJ_BRUSH, nSize = PRTDRV_RealizeObject(physDev->segptrPDEVICE, DRVOBJ_BRUSH,
&lBrush16, &lBrush16,
(LPVOID)physDev->segptrBrushInfo, (LPVOID)physDev->segptrBrushInfo,
win16drv_SegPtr_TextXForm); win16drv_SegPtr_TextXForm);

View File

@ -354,13 +354,13 @@ BOOL32 WIN16DRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device, LPCSTR output,
/* TTD should calculate this */ /* TTD should calculate this */
/* First get the size of the realized font */ /* First get the size of the realized font */
nSize = PRTDRV_RealizeObject(physDev->segptrPDEVICE, OBJ_FONT, nSize = PRTDRV_RealizeObject(physDev->segptrPDEVICE, DRVOBJ_FONT,
&pLPD->paPrinterFonts[0], NULL, &pLPD->paPrinterFonts[0], NULL,
0); 0);
physDev->segptrFontInfo = WIN16_GlobalLock16(GlobalAlloc16(GHND, nSize)); physDev->segptrFontInfo = WIN16_GlobalLock16(GlobalAlloc16(GHND, nSize));
/* Realize the font */ /* Realize the font */
PRTDRV_RealizeObject(physDev->segptrPDEVICE, OBJ_FONT, PRTDRV_RealizeObject(physDev->segptrPDEVICE, DRVOBJ_FONT,
&pLPD->paPrinterFonts[0], &pLPD->paPrinterFonts[0],
(LPVOID)physDev->segptrFontInfo, (LPVOID)physDev->segptrFontInfo,
win16drv_SegPtr_TextXForm); win16drv_SegPtr_TextXForm);

View File

@ -25,12 +25,12 @@ HPEN32 WIN16DRV_PEN_SelectObject( DC * dc, HPEN32 hpen, PENOBJ * pen )
lPen16.lopnWidth.x = pen->logpen.lopnWidth.x; lPen16.lopnWidth.x = pen->logpen.lopnWidth.x;
lPen16.lopnWidth.y = pen->logpen.lopnWidth.y; lPen16.lopnWidth.y = pen->logpen.lopnWidth.y;
lPen16.lopnColor = pen->logpen.lopnColor; lPen16.lopnColor = pen->logpen.lopnColor;
nSize = PRTDRV_RealizeObject (physDev->segptrPDEVICE, OBJ_PEN, nSize = PRTDRV_RealizeObject (physDev->segptrPDEVICE, DRVOBJ_PEN,
&lPen16, NULL, &lPen16, NULL,
0); 0);
/* may need to realloc segptrFOntInfo*/ /* may need to realloc segptrFOntInfo*/
physDev->segptrPenInfo = WIN16_GlobalLock16(GlobalAlloc16(GHND, nSize)); physDev->segptrPenInfo = WIN16_GlobalLock16(GlobalAlloc16(GHND, nSize));
nSize = PRTDRV_RealizeObject(physDev->segptrPDEVICE, OBJ_PEN, nSize = PRTDRV_RealizeObject(physDev->segptrPDEVICE, DRVOBJ_PEN,
&lPen16, &lPen16,
(LPVOID)physDev->segptrPenInfo, (LPVOID)physDev->segptrPenInfo,
0); 0);

View File

@ -428,16 +428,16 @@ DWORD PRTDRV_RealizeObject(LPPDEVICE lpDestDev, WORD wStyle,
switch (wStyle) switch (wStyle)
{ {
case OBJ_BRUSH: case DRVOBJ_BRUSH:
nSize = sizeof (LOGBRUSH16); nSize = sizeof (LOGBRUSH16);
break; break;
case OBJ_FONT: case DRVOBJ_FONT:
nSize = sizeof(LOGFONT16); nSize = sizeof(LOGFONT16);
break; break;
case OBJ_PEN: case DRVOBJ_PEN:
nSize = sizeof(LOGPEN16); nSize = sizeof(LOGPEN16);
break; break;
case OBJ_PBITMAP: case DRVOBJ_PBITMAP:
default: default:
fprintf(stderr, "PRTDRV_RealizeObject: Object type %d not supported\n", wStyle); fprintf(stderr, "PRTDRV_RealizeObject: Object type %d not supported\n", wStyle);
nSize = 0; nSize = 0;

View File

@ -1,4 +1,4 @@
DEFS = -D__WINE__ DEFS = @DLLFLAGS@ -D__WINE__
TOPSRCDIR = @top_srcdir@ TOPSRCDIR = @top_srcdir@
TOPOBJDIR = ../.. TOPOBJDIR = ../..
SRCDIR = @srcdir@ SRCDIR = @srcdir@

View File

@ -266,9 +266,9 @@ X11DRV_ExtTextOut( DC *dc, INT32 x, INT32 y, UINT32 flags,
{ {
long lineAscent, lineDescent; long lineAscent, lineDescent;
if (!XGetFontProperty( font, XA_STRIKEOUT_ASCENT, &lineAscent )) if (!XGetFontProperty( font, XA_STRIKEOUT_ASCENT, &lineAscent ))
lineAscent = font->ascent / 3; lineAscent = font->ascent / 2;
if (!XGetFontProperty( font, XA_STRIKEOUT_DESCENT, &lineDescent )) if (!XGetFontProperty( font, XA_STRIKEOUT_DESCENT, &lineDescent ))
lineDescent = -lineAscent; lineDescent = -lineAscent * 2 / 3;
XSetLineAttributes( display, dc->u.x.gc, lineAscent + lineDescent, XSetLineAttributes( display, dc->u.x.gc, lineAscent + lineDescent,
LineSolid, CapRound, JoinBevel ); LineSolid, CapRound, JoinBevel );
XDrawLine( display, dc->u.x.drawable, dc->u.x.gc, XDrawLine( display, dc->u.x.drawable, dc->u.x.gc,

View File

@ -99,6 +99,7 @@ static const char* INIFontMetrics = "/.cachedmetrics";
static const char* INIFontSection = "fonts"; static const char* INIFontSection = "fonts";
static const char* INISubSection = "Alias"; static const char* INISubSection = "Alias";
static const char* INIDefault = "Default"; static const char* INIDefault = "Default";
static const char* INIDefaultFixed = "DefaultFixed";
static const char* INIResolution = "Resolution"; static const char* INIResolution = "Resolution";
static const char* INIGlobalMetrics = "FontMetrics"; static const char* INIGlobalMetrics = "FontMetrics";
@ -782,6 +783,7 @@ static void XFONT_WindowsNames( char* buffer )
char* lpstr, *lpch; char* lpstr, *lpch;
int i, up; int i, up;
BYTE bFamilyStyle; BYTE bFamilyStyle;
const char* relocTable[] = { INIDefaultFixed, INIDefault, NULL };
for( fr = fontList; fr ; fr = fr->next ) for( fr = fontList; fr ; fr = fr->next )
{ {
@ -828,8 +830,9 @@ static void XFONT_WindowsNames( char* buffer )
fr->fr_flags |= FR_NAMESET; fr->fr_flags |= FR_NAMESET;
} }
if( PROFILE_GetWineIniString( INIFontSection, INIDefault, "", buffer, 128 ) ) for( up = 0; relocTable[up]; up++ )
{ if( PROFILE_GetWineIniString( INIFontSection, relocTable[up], "", buffer, 128 ) )
{
while( *buffer && isspace(*buffer) ) buffer++; while( *buffer && isspace(*buffer) ) buffer++;
for( fr = NULL, pfr = fontList; pfr; pfr = pfr->next ) for( fr = NULL, pfr = fontList; pfr; pfr = pfr->next )
{ {
@ -846,7 +849,7 @@ static void XFONT_WindowsNames( char* buffer )
} }
fr = pfr; fr = pfr;
} }
} }
} }
/*********************************************************************** /***********************************************************************

View File

@ -601,6 +601,8 @@ void BUILTIN_PrintDLLs(void)
int i; int i;
BUILTIN_DLL *dll; BUILTIN_DLL *dll;
fprintf(stderr,"Example: -dll -ole2 Do not use emulated OLE2.DLL\n");
fprintf(stderr,"Available DLLs:\n");
for (i = 0, dll = BuiltinDLLs; dll->descr; dll++) for (i = 0, dll = BuiltinDLLs; dll->descr; dll++)
{ {
if (!(dll->flags & DLL_FLAG_ALWAYS_USED)) if (!(dll->flags & DLL_FLAG_ALWAYS_USED))
@ -608,5 +610,4 @@ void BUILTIN_PrintDLLs(void)
((++i) % 8) ? ' ' : '\n' ); ((++i) % 8) ? ' ' : '\n' );
} }
fprintf(stderr,"\n"); fprintf(stderr,"\n");
exit(1);
} }

View File

@ -3,22 +3,22 @@ type win16
2 pascal16 DdeInitialize(ptr segptr long long) DdeInitialize16 2 pascal16 DdeInitialize(ptr segptr long long) DdeInitialize16
3 pascal16 DdeUninitialize(long) DdeUninitialize16 3 pascal16 DdeUninitialize(long) DdeUninitialize16
4 stub DdeConnectList #(long word word word ptr) DdeConnectList 4 pascal DdeConnectList(long word word word ptr) DdeConnectList
5 stub DdeQueryNextServer #(word word) DdeQueryNextServer 5 pascal DdeQueryNextServer(word word) DdeQueryNextServer
6 stub DdeDisconnectList #(word) DdeDisconnectList 6 pascal DdeDisconnectList(word) DdeDisconnectList
7 pascal DdeConnect(long long long ptr) DdeConnect16 7 pascal DdeConnect(long long long ptr) DdeConnect16
8 pascal16 DdeDisconnect(long) DdeDisconnect16 8 pascal16 DdeDisconnect(long) DdeDisconnect16
9 stub DdeQueryConvInfo #(word long ptr) DdeQueryConvInfo 9 stub DdeQueryConvInfo #(word long ptr) DdeQueryConvInfo
10 stub DdeSetUserHandle #(word long long) DdeSetUserHandle 10 pascal DdeSetUserHandle(word long long) DdeSetUserHandle
11 pascal DdeClientTransaction(ptr long long long s_word s_word long ptr) 11 pascal DdeClientTransaction(ptr long long long s_word s_word long ptr)
DdeClientTransaction16 DdeClientTransaction16
12 stub DdeAbandonTransaction #(long word long) DdeAbandonTransaction 12 pascal DdeAbandonTransaction(long word long) DdeAbandonTransaction
13 stub DdePostAdvise #(long word word) DdePostAdvise 13 pascal DdePostAdvise(long word word) DdePostAdvise
14 stub DdeCreateDataHandle #(long ptr long long word word word) DdeCreateDataHandle 14 pascal DdeCreateDataHandle(long ptr long long word word word) DdeCreateDataHandle
15 stub DdeAddData #(word ptr long long) DdeAddData 15 pascal DdeAddData(word ptr long long) DdeAddData
16 stub DdeGetData #(word ptr long long) DdeGetData 16 pascal DdeGetData(word ptr long long) DdeGetData
17 stub DdeAccessData #(word ptr) DdeAccessData 17 pascal DdeAccessData(word ptr) DdeAccessData
18 stub DdeUnaccessData #(word) DdeUnaccessData 18 pascal DdeUnaccessData(word) DdeUnaccessData
19 pascal16 DdeFreeDataHandle(long) DdeFreeDataHandle16 19 pascal16 DdeFreeDataHandle(long) DdeFreeDataHandle16
20 pascal16 DdeGetLastError(long) DdeGetLastError16 20 pascal16 DdeGetLastError(long) DdeGetLastError16
21 pascal DdeCreateStringHandle(long str s_word) DdeCreateStringHandle16 21 pascal DdeCreateStringHandle(long str s_word) DdeCreateStringHandle16
@ -26,8 +26,8 @@ type win16
23 stub DdeQueryString #(long word ptr long word) DdeQueryString 23 stub DdeQueryString #(long word ptr long word) DdeQueryString
24 pascal16 DdeKeepStringHandle(long long) DdeKeepStringHandle16 24 pascal16 DdeKeepStringHandle(long long) DdeKeepStringHandle16
26 stub DdeEnableCallback #(long word word) DdeEnableCallback 26 pascal DdeEnableCallback(long word word) DdeEnableCallback
27 pascal DdeNameService(long long long s_word) DdeNameService16 27 pascal DdeNameService(long long long s_word) DdeNameService16
36 stub DdeCmpStringHandles #(word word) DdeCmpStringHandles 36 pascal DdeCmpStringHandles(word word) DdeCmpStringHandles
37 pascal DdeReconnect(long) DdeReconnect 37 pascal DdeReconnect(long) DdeReconnect

View File

@ -315,7 +315,7 @@ file gdi.exe
485 pascal16 ScaleWindowExtEx(word s_word s_word s_word s_word ptr) 485 pascal16 ScaleWindowExtEx(word s_word s_word s_word s_word ptr)
ScaleWindowExtEx16 ScaleWindowExtEx16
486 pascal16 GetAspectRatioFilterEx(word ptr) GetAspectRatioFilterEx16 486 pascal16 GetAspectRatioFilterEx(word ptr) GetAspectRatioFilterEx16
489 stub CreateDIBSection 489 pascal16 CreateDIBSection(word ptr word ptr word long) CreateDIBSection16
490 stub CloseEnhMetafile 490 stub CloseEnhMetafile
491 stub CopyEnhMetafile 491 stub CopyEnhMetafile
492 stub CreateEnhMetafile 492 stub CreateEnhMetafile

View File

@ -37,7 +37,7 @@ type win32
33 stdcall CreateDCW(wstr wstr wstr ptr) CreateDC32W 33 stdcall CreateDCW(wstr wstr wstr ptr) CreateDC32W
34 stdcall CreateDIBPatternBrush(long long) CreateDIBPatternBrush32 34 stdcall CreateDIBPatternBrush(long long) CreateDIBPatternBrush32
35 stub CreateDIBPatternBrushPt 35 stub CreateDIBPatternBrushPt
36 stdcall CreateDIBSection(long ptr long ptr long long) CreateDIBSection 36 stdcall CreateDIBSection(long ptr long ptr long long) CreateDIBSection32
37 stdcall CreateDIBitmap(long ptr long ptr ptr long) CreateDIBitmap32 37 stdcall CreateDIBitmap(long ptr long ptr ptr long) CreateDIBitmap32
38 stdcall CreateDiscardableBitmap(long long long) CreateDiscardableBitmap32 38 stdcall CreateDiscardableBitmap(long long long) CreateDiscardableBitmap32
39 stdcall CreateEllipticRgn(long long long long) CreateEllipticRgn32 39 stdcall CreateEllipticRgn(long long long long) CreateEllipticRgn32
@ -234,10 +234,10 @@ type win32
227 stdcall GetTextColor(long) GetTextColor32 227 stdcall GetTextColor(long) GetTextColor32
228 stdcall GetTextExtentExPointA(long str long long ptr ptr ptr) GetTextExtentExPoint32A 228 stdcall GetTextExtentExPointA(long str long long ptr ptr ptr) GetTextExtentExPoint32A
229 stdcall GetTextExtentExPointW(long wstr long long ptr ptr ptr) GetTextExtentExPoint32W 229 stdcall GetTextExtentExPointW(long wstr long long ptr ptr ptr) GetTextExtentExPoint32W
230 stdcall GetTextExtentPoint32A(long str long ptr) GetTextExtentPoint32A 230 stdcall GetTextExtentPoint32A(long ptr long ptr) GetTextExtentPoint32A
231 stdcall GetTextExtentPoint32W(long wstr long ptr) GetTextExtentPoint32W 231 stdcall GetTextExtentPoint32W(long ptr long ptr) GetTextExtentPoint32W
232 stdcall GetTextExtentPointA(long str long ptr) GetTextExtentPoint32ABuggy 232 stdcall GetTextExtentPointA(long ptr long ptr) GetTextExtentPoint32ABuggy
233 stdcall GetTextExtentPointW(long wstr long ptr) GetTextExtentPoint32WBuggy 233 stdcall GetTextExtentPointW(long ptr long ptr) GetTextExtentPoint32WBuggy
234 stdcall GetTextFaceA(long long ptr) GetTextFace32A 234 stdcall GetTextFaceA(long long ptr) GetTextFace32A
235 stdcall GetTextFaceW(long long ptr) GetTextFace32W 235 stdcall GetTextFaceW(long long ptr) GetTextFace32W
236 stdcall GetTextMetricsA(long ptr) GetTextMetrics32A 236 stdcall GetTextMetricsA(long ptr) GetTextMetrics32A

View File

@ -5,12 +5,13 @@ type win32
# (these need to have these exact ordinals, for some win95 dlls # (these need to have these exact ordinals, for some win95 dlls
# import shell32.dll by ordinal) # import shell32.dll by ordinal)
2 stub SHELL32_2
3 stub CheckEscapesA 3 stub CheckEscapesA
6 stub CheckEscapesW 6 stub CheckEscapesW
7 stdcall CommandLineToArgvW(ptr ptr) CommandLineToArgvW 7 stdcall CommandLineToArgvW(ptr ptr) CommandLineToArgvW
8 stub Control_FillCache_RunDLL 8 stub Control_FillCache_RunDLL
12 stdcall Control_RunDLL(long long long long) Control_RunDLL 12 stdcall Control_RunDLL(long long long long) Control_RunDLL
14 stub DllGetClassObject 14 stdcall DllGetClassObject(long long ptr) SHELL32_DllGetClassObject
22 stub DoEnvironmentSubstA 22 stub DoEnvironmentSubstA
33 stub SHELL32_33 33 stub SHELL32_33
34 stub SHELL32_34 34 stub SHELL32_34

View File

@ -32,18 +32,6 @@
#include "miscemu.h" #include "miscemu.h"
#include "thread.h" #include "thread.h"
/* Signal handler declaration */
#ifdef linux
# define HANDLER_DEF(name) void name (int signal, SIGCONTEXT context)
# define HANDLER_CONTEXT (&context)
#elif defined(__svr4__) || defined(_SCO_DS)
# define HANDLER_DEF(name) void name(int signal, void *siginfo, SIGCONTEXT *context)
# define HANDLER_CONTEXT context
#else
# define HANDLER_DEF(name) void name(int signal, int code, SIGCONTEXT *context)
# define HANDLER_CONTEXT context
#endif
extern void SIGNAL_SetHandler( int sig, void (*func)(), int flags ); extern void SIGNAL_SetHandler( int sig, void (*func)(), int flags );
extern BOOL32 INSTR_EmulateInstruction( SIGCONTEXT *context ); extern BOOL32 INSTR_EmulateInstruction( SIGCONTEXT *context );
@ -80,7 +68,9 @@ static HANDLER_DEF(SIGNAL_trap)
*/ */
static HANDLER_DEF(SIGNAL_fault) static HANDLER_DEF(SIGNAL_fault)
{ {
if (CS_sig(HANDLER_CONTEXT) == WINE_CODE_SELECTOR) WORD cs;
GET_CS(cs);
if (CS_sig(HANDLER_CONTEXT) == cs)
{ {
fprintf( stderr, "Segmentation fault in 32-bit code (0x%08lx).\n", fprintf( stderr, "Segmentation fault in 32-bit code (0x%08lx).\n",
EIP_sig(HANDLER_CONTEXT) ); EIP_sig(HANDLER_CONTEXT) );
@ -120,13 +110,13 @@ static void SIGNAL_SetSigContext( const SIGCONTEXT *sigcontext,
#ifdef FS_sig #ifdef FS_sig
FS_reg(context) = LOWORD(FS_sig(sigcontext)); FS_reg(context) = LOWORD(FS_sig(sigcontext));
#else #else
__asm__("movw %%fs,%w0":"=r" (FS_reg(&DEBUG_context))); GET_FS( FS_reg(&DEBUG_context) );
FS_reg(context) &= 0xffff; FS_reg(context) &= 0xffff;
#endif #endif
#ifdef GS_sig #ifdef GS_sig
GS_reg(context) = LOWORD(GS_sig(sigcontext)); GS_reg(context) = LOWORD(GS_sig(sigcontext));
#else #else
__asm__("movw %%gs,%w0":"=r" (GS_reg(&DEBUG_context))); GET_GS( GS_reg(&DEBUG_context) );
GS_reg(context) &= 0xffff; GS_reg(context) &= 0xffff;
#endif #endif
} }
@ -157,12 +147,12 @@ static void SIGNAL_GetSigContext( SIGCONTEXT *sigcontext,
#ifdef FS_sig #ifdef FS_sig
FS_sig(sigcontext) = FS_reg(context); FS_sig(sigcontext) = FS_reg(context);
#else #else
__asm__("movw %w0,%%fs"::"r" (FS_reg(context))); SET_FS( FS_reg(&DEBUG_context) );
#endif #endif
#ifdef GS_sig #ifdef GS_sig
GS_sig(sigcontext) = GS_reg(context); GS_sig(sigcontext) = GS_reg(context);
#else #else
__asm__("movw %w0,%%gs"::"r" (GS_reg(context))); SET_GS( GS_reg(&DEBUG_context) );
#endif #endif
} }

View File

@ -93,11 +93,14 @@ static void WINAPI THUNK_CallTaskReschedule(void);
/* TASK_Reschedule() 16-bit entry point */ /* TASK_Reschedule() 16-bit entry point */
static FARPROC16 TASK_RescheduleProc; static FARPROC16 TASK_RescheduleProc;
extern void CallFrom16_long_wwwll(void);
/* Callbacks function table for the emulator */ /* Callbacks function table for the emulator */
static const CALLBACKS_TABLE CALLBACK_EmulatorTable = static const CALLBACKS_TABLE CALLBACK_EmulatorTable =
{ {
(void *)CallTo16_regs_short, /* CallRegisterProc */ (void *)CallTo16_regs_short, /* CallRegisterProc */
THUNK_CallTaskReschedule, /* CallTaskRescheduleProc */ THUNK_CallTaskReschedule, /* CallTaskRescheduleProc */
CallFrom16_long_wwwll, /* CallFrom16WndProc */
THUNK_CallWndProc16, /* CallWndProc */ THUNK_CallWndProc16, /* CallWndProc */
(void *)CallTo16_long_lwwll, /* CallDriverProc */ (void *)CallTo16_long_lwwll, /* CallDriverProc */
(void *)CallTo16_word_wwlll, /* CallDriverCallback */ (void *)CallTo16_word_wwlll, /* CallDriverCallback */
@ -209,16 +212,32 @@ static LRESULT WINAPI THUNK_CallWndProc16( WNDPROC16 proc, HWND16 hwnd,
EBP_reg(&context) = OFFSETOF(IF1632_Saved16_ss_sp) EBP_reg(&context) = OFFSETOF(IF1632_Saved16_ss_sp)
+ (WORD)&((STACK16FRAME*)0)->bp; + (WORD)&((STACK16FRAME*)0)->bp;
if (((msg == WM_CREATE) || (msg == WM_NCCREATE)) && lParam) if (lParam)
{ {
/* Build the CREATESTRUCT on the 16-bit stack. */ /* Some programs (eg. the "Undocumented Windows" examples, JWP) only
/* This is really ugly, but some programs (notably the */ work if structures passed in lParam are placed in the stack/data
/* "Undocumented Windows" examples) want it that way. */ segment. Programmers easily make the mistake of converting lParam
CREATESTRUCT16 *cs = (CREATESTRUCT16 *)PTR_SEG_TO_LIN(lParam); to a near rather than a far pointer, since Windows apparently
offset = sizeof(*cs); allows this. We copy the structures to the 16 bit stack; this is
lParam = STACK16_PUSH( offset ); ugly but makes these programs work. */
memcpy( PTR_SEG_TO_LIN(lParam), cs, offset ); switch (msg)
{
case WM_CREATE:
case WM_NCCREATE:
offset = sizeof(CREATESTRUCT16); break;
case WM_DRAWITEM:
offset = sizeof(DRAWITEMSTRUCT16); break;
case WM_COMPAREITEM:
offset = sizeof(COMPAREITEMSTRUCT16); break;
}
if (offset)
{
void *s = PTR_SEG_TO_LIN(lParam);
lParam = STACK16_PUSH( offset );
memcpy( PTR_SEG_TO_LIN(lParam), s, offset );
}
} }
args = (WORD *)CURRENT_STACK16 - 7; args = (WORD *)CURRENT_STACK16 - 7;
args[0] = LOWORD(lParam); args[0] = LOWORD(lParam);
args[1] = HIWORD(lParam); args[1] = HIWORD(lParam);

View File

@ -348,7 +348,7 @@ file user.exe
389 stub LoadImage 389 stub LoadImage
390 stub CopyImage 390 stub CopyImage
391 stub SignalProc32 391 stub SignalProc32
394 stub DrawIconEx 394 pascal16 DrawIconEx(word word word word word word word word word) DrawIconEx16
395 stub GetIconInfo 395 stub GetIconInfo
397 pascal16 RegisterClassEx(ptr) RegisterClassEx16 397 pascal16 RegisterClassEx(ptr) RegisterClassEx16
398 pascal16 GetClassInfoEx(word segstr ptr) GetClassInfoEx16 398 pascal16 GetClassInfoEx(word segstr ptr) GetClassInfoEx16
@ -491,7 +491,7 @@ file user.exe
662 stub DrawMenubarTemp 662 stub DrawMenubarTemp
663 stub GetMenuDefaultItem 663 stub GetMenuDefaultItem
664 stub SetMenuDefaultItem 664 stub SetMenuDefaultItem
665 stub GetMenuItemRect 665 pascal16 GetMenuItemRect(word word word ptr) GetMenuItemRect16
666 stub CheckMenuRadioItem 666 stub CheckMenuRadioItem
667 stub TrackPopupMenuEx 667 stub TrackPopupMenuEx
668 stub SetWindowRgn 668 stub SetWindowRgn

View File

@ -47,7 +47,7 @@ type win32
44 stdcall CharUpperW(wstr) CharUpper32W 44 stdcall CharUpperW(wstr) CharUpper32W
45 stdcall CheckDlgButton(long long long) CheckDlgButton32 45 stdcall CheckDlgButton(long long long) CheckDlgButton32
46 stdcall CheckMenuItem(long long long) CheckMenuItem32 46 stdcall CheckMenuItem(long long long) CheckMenuItem32
47 stub CheckMenuRadioItem 47 stdcall CheckMenuRadioItem(long long long long long) CheckMenuRadioItem32
48 stdcall CheckRadioButton(long long long long) CheckRadioButton32 48 stdcall CheckRadioButton(long long long long) CheckRadioButton32
49 stdcall ChildWindowFromPoint(long long long) ChildWindowFromPoint32 49 stdcall ChildWindowFromPoint(long long long) ChildWindowFromPoint32
50 stub ChildWindowFromPointEx 50 stub ChildWindowFromPointEx
@ -58,8 +58,8 @@ type win32
55 stub CloseDesktop 55 stub CloseDesktop
56 stdcall CloseWindow(long) CloseWindow32 56 stdcall CloseWindow(long) CloseWindow32
57 stub CloseWindowStation 57 stub CloseWindowStation
58 stub CopyAcceleratorTableA 58 stdcall CopyAcceleratorTableA(long ptr long) CopyAcceleratorTable32A
59 stub CopyAcceleratorTableW 59 stdcall CopyAcceleratorTableW(long ptr long) CopyAcceleratorTable32W
60 stdcall CopyIcon(long) CopyIcon32 60 stdcall CopyIcon(long) CopyIcon32
61 stdcall CopyImage(long long long long long) CopyImage32 61 stdcall CopyImage(long long long long long) CopyImage32
62 stdcall CopyRect(ptr ptr) CopyRect32 62 stdcall CopyRect(ptr ptr) CopyRect32
@ -132,7 +132,7 @@ type win32
127 stdcall DefWindowProcW(long long long long) DefWindowProc32W 127 stdcall DefWindowProcW(long long long long) DefWindowProc32W
128 stdcall DeferWindowPos(long long long long long long long long) DeferWindowPos32 128 stdcall DeferWindowPos(long long long long long long long long) DeferWindowPos32
129 stdcall DeleteMenu(long long long) DeleteMenu32 129 stdcall DeleteMenu(long long long) DeleteMenu32
130 stub DestroyAcceleratorTable 130 stdcall DestroyAcceleratorTable(long) DestroyAcceleratorTable
131 stdcall DestroyCaret() DestroyCaret32 131 stdcall DestroyCaret() DestroyCaret32
132 stdcall DestroyCursor(long) DestroyCursor32 132 stdcall DestroyCursor(long) DestroyCursor32
133 stdcall DestroyIcon(long) DestroyIcon32 133 stdcall DestroyIcon(long) DestroyIcon32
@ -162,7 +162,7 @@ type win32
157 stub DrawFrame 157 stub DrawFrame
158 stdcall DrawFrameControl(long ptr long long) DrawFrameControl32 158 stdcall DrawFrameControl(long ptr long long) DrawFrameControl32
159 stdcall DrawIcon(long long long long) DrawIcon32 159 stdcall DrawIcon(long long long long) DrawIcon32
160 stub DrawIconEx 160 stdcall DrawIconEx(long long long long long long long long long) DrawIconEx32
161 stdcall DrawMenuBar(long) DrawMenuBar32 161 stdcall DrawMenuBar(long) DrawMenuBar32
162 stdcall DrawStateA(long long ptr long long long long long long long) DrawState32A 162 stdcall DrawStateA(long long ptr long long long long long long long) DrawState32A
163 stub DrawStateW 163 stub DrawStateW
@ -268,7 +268,7 @@ type win32
263 stdcall GetMenuItemID(long long) GetMenuItemID32 263 stdcall GetMenuItemID(long long) GetMenuItemID32
264 stdcall GetMenuItemInfoA(long long long ptr) GetMenuItemInfo32A 264 stdcall GetMenuItemInfoA(long long long ptr) GetMenuItemInfo32A
265 stdcall GetMenuItemInfoW(long long long ptr) GetMenuItemInfo32W 265 stdcall GetMenuItemInfoW(long long long ptr) GetMenuItemInfo32W
266 stub GetMenuItemRect 266 stdcall GetMenuItemRect(long long long ptr) GetMenuItemRect32
267 stdcall GetMenuState(long long long) GetMenuState32 267 stdcall GetMenuState(long long long) GetMenuState32
268 stdcall GetMenuStringA(long long ptr long long) GetMenuString32A 268 stdcall GetMenuStringA(long long ptr long long) GetMenuString32A
269 stdcall GetMenuStringW(long long ptr long long) GetMenuString32W 269 stdcall GetMenuStringW(long long ptr long long) GetMenuString32W

View File

@ -1,7 +1,6 @@
name wprocs name wprocs
type win16 type win16
10 pascal MDIClientWndProc(word word word long) MDIClientWndProc
14 pascal FileOpenDlgProc(word word word long) FileOpenDlgProc 14 pascal FileOpenDlgProc(word word word long) FileOpenDlgProc
15 pascal FileSaveDlgProc(word word word long) FileSaveDlgProc 15 pascal FileSaveDlgProc(word word word long) FileSaveDlgProc
16 pascal ColorDlgProc(word word word long) ColorDlgProc 16 pascal ColorDlgProc(word word word long) ColorDlgProc

View File

@ -1,36 +0,0 @@
/*
* structure definitions for ACCELERATORS
*
* taken straight from Win32 SDK includes
*/
#ifndef __WINE_ACCEL_H
#define __WINE_ACCEL_H
#include "windows.h"
#pragma pack(1)
#define FVIRTKEY TRUE /* Assumed to be == TRUE */
#define FNOINVERT 0x02
#define FSHIFT 0x04
#define FCONTROL 0x08
#define FALT 0x10
typedef struct tagACCEL16 {
BYTE fVirt; /* Also called the flags field */
WORD key;
WORD cmd;
} ACCEL16, *LPACCEL16;
typedef struct tagACCEL32 {
BYTE fVirt; /* Also called the flags field */
BYTE pad0;
WORD key;
WORD cmd;
WORD pad1;
} ACCEL32, *LPACCEL32;
#pragma pack(4)
#endif /* __WINE_ACCEL_H */

View File

@ -0,0 +1,23 @@
/* XPM */
static char *obm_radiocheck[] = {
/* size */
"14 14 2 1",
/* colors */
". s white c white",
"# s black c black",
/* pixels */
"..............",
"..............",
"..............",
".....####.....",
"....######....",
"...########...",
"...########...",
"...########...",
"...########...",
"....######....",
".....####.....",
"..............",
"..............",
".............."
};

View File

@ -1,6 +1,6 @@
/* XPM */ /* XPM */
static char * ocr_ibeam[] = { static char * ocr_ibeam[] = {
"32 32 2 1 0 8", "32 32 2 1 3 8",
" s black c black", " s black c black",
". s None c None", ". s None c None",
" . .........................", " . .........................",

View File

@ -21,6 +21,7 @@ typedef struct
{ {
VOID (CALLBACK *CallRegisterProc)( CONTEXT *, INT32 ); VOID (CALLBACK *CallRegisterProc)( CONTEXT *, INT32 );
VOID (CALLBACK *CallTaskRescheduleProc)(void); VOID (CALLBACK *CallTaskRescheduleProc)(void);
VOID (CALLBACK *CallFrom16WndProc)(void);
LRESULT (CALLBACK *CallWndProc)( WNDPROC16, HWND16, UINT16, LRESULT (CALLBACK *CallWndProc)( WNDPROC16, HWND16, UINT16,
WPARAM16, LPARAM ); WPARAM16, LPARAM );
LRESULT (CALLBACK *CallDriverProc)( DRIVERPROC16, DWORD, HDRVR16, LRESULT (CALLBACK *CallDriverProc)( DRIVERPROC16, DWORD, HDRVR16,

View File

@ -1,9 +1,10 @@
#ifndef __WINE_CLIPBOARD_H #ifndef __WINE_CLIPBOARD_H
#define __WINE_CLIPBOARD_H #define __WINE_CLIPBOARD_H
void CLIPBOARD_ReadSelection(Window w,Atom prop); void CLIPBOARD_ResetLock(HQUEUE16 hqRef, HQUEUE16 hqNew);
void CLIPBOARD_ReleaseSelection(Window w,HWND32 hwnd); void CLIPBOARD_ResetOwner(WND* pWnd);
void CLIPBOARD_DisOwn(WND* pWnd); void CLIPBOARD_ReadSelection(Window w, Atom prop);
void CLIPBOARD_ReleaseSelection(Window w, HWND32 hwnd);
BOOL32 CLIPBOARD_IsPresent(WORD wFormat); BOOL32 CLIPBOARD_IsPresent(WORD wFormat);
#endif /* __WINE_CLIPBOARD_H */ #endif /* __WINE_CLIPBOARD_H */

View File

@ -52,6 +52,6 @@ extern DCE* DCE_FreeDCE( DCE *dce );
extern void DCE_FreeWindowDCE( WND* ); extern void DCE_FreeWindowDCE( WND* );
extern INT16 DCE_ExcludeRgn( HDC32, WND*, HRGN32 ); extern INT16 DCE_ExcludeRgn( HDC32, WND*, HRGN32 );
extern HRGN32 DCE_GetVisRgn( HWND32, WORD ); extern HRGN32 DCE_GetVisRgn( HWND32, WORD );
extern BOOL32 DCE_InvalidateDCE( WND*, RECT32* ); extern BOOL32 DCE_InvalidateDCE( WND*, const RECT32* );
#endif /* __WINE_DCE_H */ #endif /* __WINE_DCE_H */

View File

@ -2,6 +2,7 @@
* DDEML library definitions * DDEML library definitions
* *
* Copyright 1997 Alexandre Julliard * Copyright 1997 Alexandre Julliard
* Copyright 1997 Len White
*/ */
#ifndef __WINE__DDEML_H #ifndef __WINE__DDEML_H
@ -50,12 +51,17 @@ UINT32 WINAPI DdeInitialize32W(LPDWORD,PFNCALLBACK32,DWORD,DWORD);
BOOL16 WINAPI DdeUninitialize16(DWORD); BOOL16 WINAPI DdeUninitialize16(DWORD);
BOOL32 WINAPI DdeUninitialize32(DWORD); BOOL32 WINAPI DdeUninitialize32(DWORD);
#define DdeUninitialize WINELIB_NAME(DdeUninitialize) #define DdeUninitialize WINELIB_NAME(DdeUninitialize)
HCONVLIST WINAPI DdeConnectList(DWORD,HSZ,HSZ,HCONVLIST,LPCONVCONTEXT16);
HCONV WINAPI DdeQueryNextServer(HCONVLIST, HCONV);
BOOL16 WINAPI DdeDisconnectList(HCONVLIST);
HCONV WINAPI DdeConnect16(DWORD,HSZ,HSZ,LPCONVCONTEXT16); HCONV WINAPI DdeConnect16(DWORD,HSZ,HSZ,LPCONVCONTEXT16);
HCONV WINAPI DdeConnect32(DWORD,HSZ,HSZ,LPCONVCONTEXT32); HCONV WINAPI DdeConnect32(DWORD,HSZ,HSZ,LPCONVCONTEXT32);
#define DdeConnect WINELIB_NAME(DdeConnect) #define DdeConnect WINELIB_NAME(DdeConnect)
BOOL16 WINAPI DdeDisconnect16(HCONV); BOOL16 WINAPI DdeDisconnect16(HCONV);
BOOL32 WINAPI DdeDisconnect32(HCONV); BOOL32 WINAPI DdeDisconnect32(HCONV);
#define DdeDisconnect WINELIB_NAME(DdeDisconnect) #define DdeDisconnect WINELIB_NAME(DdeDisconnect)
BOOL16 WINAPI DdeSetUserHandle(HCONV,DWORD,DWORD);
HDDEDATA WINAPI DdeCreateHandleData(DWORD,LPBYTE,DWORD,DWORD,HSZ,UINT16,UINT16);
HCONV WINAPI DdeReconnect(HCONV); HCONV WINAPI DdeReconnect(HCONV);
HSZ WINAPI DdeCreateStringHandle16(DWORD,LPCSTR,INT16); HSZ WINAPI DdeCreateStringHandle16(DWORD,LPCSTR,INT16);
HSZ WINAPI DdeCreateStringHandle32A(DWORD,LPCSTR,INT32); HSZ WINAPI DdeCreateStringHandle32A(DWORD,LPCSTR,INT32);
@ -75,6 +81,16 @@ HDDEDATA WINAPI DdeClientTransaction16(LPVOID,DWORD,HCONV,HSZ,UINT16,
HDDEDATA WINAPI DdeClientTransaction32(LPBYTE,DWORD,HCONV,HSZ,UINT32, HDDEDATA WINAPI DdeClientTransaction32(LPBYTE,DWORD,HCONV,HSZ,UINT32,
UINT32,DWORD,LPDWORD); UINT32,DWORD,LPDWORD);
#define DdeClientTransaction WINELIB_NAME(DdeClientTransaction) #define DdeClientTransaction WINELIB_NAME(DdeClientTransaction)
BOOL16 WINAPI DdeAbandonTransaction(DWORD,HCONV,DWORD);
BOOL16 WINAPI DdePostAdvise(DWORD,HSZ,HSZ);
HDDEDATA WINAPI DdeAddData(HDDEDATA,LPBYTE,DWORD,DWORD);
DWORD WINAPI DdeGetData(HDDEDATA,LPBYTE,DWORD,DWORD);
LPBYTE WINAPI DdeAccessData(HDDEDATA,LPDWORD);
BOOL16 WINAPI DdeUnaccessData(HDDEDATA);
BOOL16 WINAPI DdeEnableCallback(DWORD,HCONV,UINT16);
int WINAPI DdeCmpStringHandles(HSZ,HSZ);
HDDEDATA WINAPI DdeNameService16(DWORD,HSZ,HSZ,UINT16); HDDEDATA WINAPI DdeNameService16(DWORD,HSZ,HSZ,UINT16);
HDDEDATA WINAPI DdeNameService32(DWORD,HSZ,HSZ,UINT32); HDDEDATA WINAPI DdeNameService32(DWORD,HSZ,HSZ,UINT32);
#define DdeNameService WINELIB_NAME(DdeNameService) #define DdeNameService WINELIB_NAME(DdeNameService)

View File

@ -86,9 +86,9 @@ typedef struct wine_locals WineLocals;
#define DBG_FIX_ADDR_SEG(addr,default) \ #define DBG_FIX_ADDR_SEG(addr,default) \
{ if ((addr)->seg == 0xffffffff) (addr)->seg = (default); \ { WORD cs, ds; GET_CS(cs); GET_DS(ds); \
if (((addr)->seg == WINE_CODE_SELECTOR) || \ if ((addr)->seg == 0xffffffff) (addr)->seg = (default); \
(addr)->seg == WINE_DATA_SELECTOR) (addr)->seg = 0; } if (((addr)->seg == cs) || (addr)->seg == ds) (addr)->seg = 0; }
#define DBG_ADDR_TO_LIN(addr) \ #define DBG_ADDR_TO_LIN(addr) \
((addr)->seg ? (char *)PTR_SEG_OFF_TO_LIN((addr)->seg,(addr)->off) \ ((addr)->seg ? (char *)PTR_SEG_OFF_TO_LIN((addr)->seg,(addr)->off) \
@ -266,8 +266,8 @@ extern int DEBUG_GetCurrentFrame(struct name_hash ** name,
extern int DEBUG_ReadExecutableDbgInfo(void); extern int DEBUG_ReadExecutableDbgInfo(void);
/* debugger/msc.c */ /* debugger/msc.c */
extern int DEBUG_RegisterDebugInfo(struct pe_data *pe, extern int DEBUG_RegisterDebugInfo(struct pe_data *pe, int, const char *,
int, unsigned long, unsigned long); unsigned long, unsigned long);
extern int DEBUG_ProcessDeferredDebug(void); extern int DEBUG_ProcessDeferredDebug(void);
extern int DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, char * name); extern int DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, char * name);
extern void DEBUG_InfoShare(void); extern void DEBUG_InfoShare(void);

15
include/debugstr.h Normal file
View File

@ -0,0 +1,15 @@
#ifndef __WINE_DEBUGSTR_H
#define __WINE_DEBUGSTR_H
#include "wintypes.h"
/* These function return a printable version of a string, including
quotes. The string will be valid for some time, but not indefinitely
as strings are re-used. */
LPSTR debugstr_an (LPCSTR s, int n);
LPSTR debugstr_a (LPCSTR s);
LPSTR debugstr_wn (LPCWSTR s, int n);
LPSTR debugstr_w (LPCWSTR s);
#endif /* __WINE_DEBUGSTR_H */

View File

@ -318,6 +318,5 @@ extern Display * display;
extern Screen * screen; extern Screen * screen;
extern Window rootWindow; extern Window rootWindow;
extern int screenWidth, screenHeight, screenDepth; extern int screenWidth, screenHeight, screenDepth;
extern int desktopX, desktopY; /* misc/main.c */
#endif /* __WINE_GDI_H */ #endif /* __WINE_GDI_H */

View File

@ -14,6 +14,6 @@ extern BYTE QueueKeyStateTable[256];
extern BYTE AsyncKeyStateTable[256]; extern BYTE AsyncKeyStateTable[256];
extern BOOL32 KEYBOARD_Init(void); extern BOOL32 KEYBOARD_Init(void);
extern void KEYBOARD_HandleEvent( XKeyEvent *event ); extern void KEYBOARD_HandleEvent( WND *pWnd, XKeyEvent *event );
#endif /* __WINE_KEYBOARD_H */ #endif /* __WINE_KEYBOARD_H */

View File

@ -20,21 +20,21 @@
#define WM_MDICALCCHILDSCROLL 0x10AC /* this is exactly what Windows uses */ #define WM_MDICALCCHILDSCROLL 0x10AC /* this is exactly what Windows uses */
extern LRESULT WINAPI MDIClientWndProc(HWND16 hwnd, UINT16 message, extern LRESULT WINAPI MDIClientWndProc( HWND32 hwnd, UINT32 message,
WPARAM16 wParam, LPARAM lParam); WPARAM32 wParam, LPARAM lParam );
typedef struct typedef struct
{ {
UINT16 nActiveChildren; UINT32 nActiveChildren;
HWND16 hwndChildMaximized; HWND32 hwndChildMaximized;
HWND16 hwndActiveChild; HWND32 hwndActiveChild;
HMENU16 hWindowMenu; HMENU32 hWindowMenu;
UINT32 idFirstChild; UINT32 idFirstChild;
LPSTR frameTitle; LPSTR frameTitle;
UINT16 nTotalCreated; UINT32 nTotalCreated;
UINT16 mdiFlags; UINT32 mdiFlags;
UINT16 sbRecalc; /* SB_xxx flags for scrollbar fixup */ UINT32 sbRecalc; /* SB_xxx flags for scrollbar fixup */
HWND16 self; HWND32 self;
} MDICLIENTINFO; } MDICLIENTINFO;
#endif /* __WINE_MDI_H */ #endif /* __WINE_MDI_H */

View File

@ -26,7 +26,7 @@ typedef UINT32 MMVERSION32;
DECL_WINELIB_TYPE(MMVERSION); DECL_WINELIB_TYPE(MMVERSION);
typedef UINT16 MCIDEVICEID16; typedef UINT16 MCIDEVICEID16;
typedef UINT32 MCIDEVICEID32; typedef UINT32 MCIDEVICEID32;
DECL_WINELIB_TYPE(MCIDEVICE); DECL_WINELIB_TYPE(MCIDEVICEID);
typedef struct { typedef struct {
UINT16 wType; /* indicates the contents of the union */ UINT16 wType; /* indicates the contents of the union */
@ -257,8 +257,8 @@ typedef struct {
WORD wReserved1; /* padding */ WORD wReserved1; /* padding */
DWORD dwSupport; /* functionality supported by driver */ DWORD dwSupport; /* functionality supported by driver */
} WAVEOUTCAPS32W, *LPWAVEOUTCAPS32W; } WAVEOUTCAPS32W, *LPWAVEOUTCAPS32W;
DECL_WINELIB_TYPE(WAVEOUTCAPS); DECL_WINELIB_TYPE_AW(WAVEOUTCAPS);
DECL_WINELIB_TYPE(LPWAVEOUTCAPS); DECL_WINELIB_TYPE_AW(LPWAVEOUTCAPS);
#define WAVECAPS_PITCH 0x0001 /* supports pitch control */ #define WAVECAPS_PITCH 0x0001 /* supports pitch control */
#define WAVECAPS_PLAYBACKRATE 0x0002 /* supports playback rate control */ #define WAVECAPS_PLAYBACKRATE 0x0002 /* supports playback rate control */
@ -293,8 +293,8 @@ typedef struct {
WORD wChannels; /* number of channels supported */ WORD wChannels; /* number of channels supported */
WORD wReserved1; WORD wReserved1;
} WAVEINCAPS32W, *LPWAVEINCAPS32W; } WAVEINCAPS32W, *LPWAVEINCAPS32W;
DECL_WINELIB_TYPE(WAVEINCAPS); DECL_WINELIB_TYPE_AW(WAVEINCAPS);
DECL_WINELIB_TYPE(LPWAVEINCAPS); DECL_WINELIB_TYPE_AW(LPWAVEINCAPS);
#define WAVE_INVALIDFORMAT 0x00000000 /* invalid format */ #define WAVE_INVALIDFORMAT 0x00000000 /* invalid format */
#define WAVE_FORMAT_1M08 0x00000001 /* 11.025 kHz, Mono, 8-bit */ #define WAVE_FORMAT_1M08 0x00000001 /* 11.025 kHz, Mono, 8-bit */
@ -1181,8 +1181,8 @@ typedef struct {
WCHAR szName[MIXER_LONG_NAME_CHARS]; WCHAR szName[MIXER_LONG_NAME_CHARS];
} MIXERCONTROLDETAILS_LISTTEXT32W,*LPMIXERCONTROLDETAILS_LISTTEXT32W; } MIXERCONTROLDETAILS_LISTTEXT32W,*LPMIXERCONTROLDETAILS_LISTTEXT32W;
DECL_WINELIB_TYPE_AW(MIXERCONTROLDETAILS); DECL_WINELIB_TYPE_AW(MIXERCONTROLDETAILS_LISTTEXT);
DECL_WINELIB_TYPE_AW(LPMIXERCONTROLDETAILS); DECL_WINELIB_TYPE_AW(LPMIXERCONTROLDETAILS_LISTTEXT);
/* MIXER_GETCONTROLDETAILSF_VALUE */ /* MIXER_GETCONTROLDETAILSF_VALUE */
typedef struct { typedef struct {
@ -1773,8 +1773,8 @@ typedef struct {
DWORD dwRetSize; DWORD dwRetSize;
} MCI_INFO_PARMS32W, *LPMCI_INFO_PARMS32W; } MCI_INFO_PARMS32W, *LPMCI_INFO_PARMS32W;
DECL_WINELIB_TYPE(MCI_INFO_PARMS); DECL_WINELIB_TYPE_AW(MCI_INFO_PARMS);
DECL_WINELIB_TYPE(LPMCI_INFO_PARMS); DECL_WINELIB_TYPE_AW(LPMCI_INFO_PARMS);
typedef struct { typedef struct {
DWORD dwCallback; DWORD dwCallback;
@ -1858,8 +1858,8 @@ typedef struct {
LPCWSTR lpfilename; LPCWSTR lpfilename;
} MCI_LOAD_PARMS32W, *LPMCI_LOAD_PARMS32W; } MCI_LOAD_PARMS32W, *LPMCI_LOAD_PARMS32W;
DECL_WINELIB_TYPE(MCI_LOAD_PARMS); DECL_WINELIB_TYPE_AW(MCI_LOAD_PARMS);
DECL_WINELIB_TYPE(LPMCI_LOAD_PARMS); DECL_WINELIB_TYPE_AW(LPMCI_LOAD_PARMS);
typedef struct { typedef struct {
DWORD dwCallback; DWORD dwCallback;
@ -1932,8 +1932,8 @@ typedef struct {
LPCWSTR lpstrCommand; LPCWSTR lpstrCommand;
} MCI_VD_ESCAPE_PARMS32W, *LPMCI_VD_ESCAPE_PARMS32W; } MCI_VD_ESCAPE_PARMS32W, *LPMCI_VD_ESCAPE_PARMS32W;
DECL_WINELIB_TYPE(MCI_VD_ESCAPE_PARMS); DECL_WINELIB_TYPE_AW(MCI_VD_ESCAPE_PARMS);
DECL_WINELIB_TYPE(LPMCI_VD_ESCAPE_PARMS); DECL_WINELIB_TYPE_AW(LPMCI_VD_ESCAPE_PARMS);
#define MCI_WAVE_OPEN_BUFFER 0x00010000L #define MCI_WAVE_OPEN_BUFFER 0x00010000L
@ -2190,8 +2190,8 @@ typedef struct {
LPCWSTR lpstrText; LPCWSTR lpstrText;
} MCI_ANIM_WINDOW_PARMS32W, *LPMCI_ANIM_WINDOW_PARMS32W; } MCI_ANIM_WINDOW_PARMS32W, *LPMCI_ANIM_WINDOW_PARMS32W;
DECL_WINELIB_TYPE(MCI_ANIM_WINDOW_PARMS); DECL_WINELIB_TYPE_AW(MCI_ANIM_WINDOW_PARMS);
DECL_WINELIB_TYPE(LPMCI_ANIM_WINDOW_PARMS); DECL_WINELIB_TYPE_AW(LPMCI_ANIM_WINDOW_PARMS);
typedef struct { typedef struct {
DWORD dwCallback; DWORD dwCallback;
@ -2320,8 +2320,8 @@ typedef struct {
LPCWSTR lpstrText; LPCWSTR lpstrText;
} MCI_OVLY_WINDOW_PARMS32W, *LPMCI_OVLY_WINDOW_PARMS32W; } MCI_OVLY_WINDOW_PARMS32W, *LPMCI_OVLY_WINDOW_PARMS32W;
DECL_WINELIB_TYPE_AW(MCI_OVLY_OPEN_WINDOW_PARMS); DECL_WINELIB_TYPE_AW(MCI_OVLY_WINDOW_PARMS);
DECL_WINELIB_TYPE_AW(LPMCI_OVLY_OPEN_WINDOW_PARMS); DECL_WINELIB_TYPE_AW(LPMCI_OVLY_WINDOW_PARMS);
typedef struct { typedef struct {
DWORD dwCallback; DWORD dwCallback;

View File

@ -142,7 +142,9 @@ extern BOOL32 BUILTIN_ParseDLLOptions( const char *str );
extern void BUILTIN_PrintDLLs(void); extern void BUILTIN_PrintDLLs(void);
/* ne_image.c */ /* ne_image.c */
extern BOOL32 NE_LoadSegment( HMODULE16 hModule, WORD segnum ); extern BOOL32 NE_LoadSegment( NE_MODULE *pModule, WORD segnum );
extern BOOL32 NE_LoadAllSegments( NE_MODULE *pModule );
extern BOOL32 NE_LoadDLLs( NE_MODULE *pModule );
extern void NE_FixupPrologs( NE_MODULE *pModule ); extern void NE_FixupPrologs( NE_MODULE *pModule );
extern void NE_InitializeDLLs( HMODULE16 hModule ); extern void NE_InitializeDLLs( HMODULE16 hModule );

View File

@ -5,6 +5,7 @@
#include <dirent.h> #include <dirent.h>
#include "windows.h" #include "windows.h"
#include "comm.h" #include "comm.h"
#include "winnt.h"
struct fcb { struct fcb {
BYTE drive; BYTE drive;
@ -55,8 +56,6 @@ typedef struct
DWORD filesize; /* 1c file size */ DWORD filesize; /* 1c file size */
} DOS_DIRENTRY_LAYOUT; } DOS_DIRENTRY_LAYOUT;
#define WINVERSION 0x0a03 /* Windows version 3.10 */
#define MAX_DOS_DRIVES 26 #define MAX_DOS_DRIVES 26
extern struct DosDeviceStruct COM[MAX_PORTS]; extern struct DosDeviceStruct COM[MAX_PORTS];
@ -157,4 +156,7 @@ extern BYTE DOS_ErrorClass, DOS_ErrorAction, DOS_ErrorLocus;
#define EL_Serial 0x04 #define EL_Serial 0x04
#define EL_Memory 0x05 #define EL_Memory 0x05
void WINAPI DOS3Call( CONTEXT *context );
void do_mscdex( CONTEXT *context );
#endif /* __WINE_MSDOS_H */ #endif /* __WINE_MSDOS_H */

View File

@ -13,8 +13,7 @@ extern LONG NC_HandleNCPaint( HWND32 hwnd , HRGN32 clip);
extern LONG NC_HandleNCActivate( WND *pwnd, WPARAM16 wParam ); extern LONG NC_HandleNCActivate( WND *pwnd, WPARAM16 wParam );
extern LONG NC_HandleNCCalcSize( WND *pWnd, RECT32 *winRect ); extern LONG NC_HandleNCCalcSize( WND *pWnd, RECT32 *winRect );
extern LONG NC_HandleNCHitTest( HWND32 hwnd, POINT16 pt ); extern LONG NC_HandleNCHitTest( HWND32 hwnd, POINT16 pt );
extern LONG NC_HandleNCLButtonDown( HWND32 hwnd, WPARAM16 wParam, extern LONG NC_HandleNCLButtonDown( WND* pWnd, WPARAM16 wParam, LPARAM lParam );
LPARAM lParam );
extern LONG NC_HandleNCLButtonDblClk( WND *pWnd, WPARAM16 wParam, LPARAM lParam); extern LONG NC_HandleNCLButtonDblClk( WND *pWnd, WPARAM16 wParam, LPARAM lParam);
extern LONG NC_HandleSysCommand( HWND32 hwnd, WPARAM16 wParam, POINT16 pt ); extern LONG NC_HandleSysCommand( HWND32 hwnd, WPARAM16 wParam, POINT16 pt );
extern LONG NC_HandleSetCursor( HWND32 hwnd, WPARAM16 wParam, LPARAM lParam ); extern LONG NC_HandleSetCursor( HWND32 hwnd, WPARAM16 wParam, LPARAM lParam );

View File

@ -48,6 +48,7 @@ struct options
char * desktopGeometry; /* NULL when no desktop */ char * desktopGeometry; /* NULL when no desktop */
char * programName; /* To use when loading resources */ char * programName; /* To use when loading resources */
char * argv0; /* argv[0] of Wine process */ char * argv0; /* argv[0] of Wine process */
char *dllFlags; /* -dll flags (hack for Winelib support) */
int usePrivateMap; int usePrivateMap;
int useFixedMap; int useFixedMap;
int synchronous; /* X synchronous mode */ int synchronous; /* X synchronous mode */
@ -81,4 +82,7 @@ extern int PROFILE_GetWineIniBool( char const *section, char const *key_name,
int def ); int def );
extern char* PROFILE_GetStringItem( char* ); extern char* PROFILE_GetStringItem( char* );
/* Version functions */
extern void VERSION_ParseVersion( char *arg );
#endif /* __WINE_OPTIONS_H */ #endif /* __WINE_OPTIONS_H */

View File

@ -7,7 +7,7 @@
#ifndef __WINE_SELECTORS_H #ifndef __WINE_SELECTORS_H
#define __WINE_SELECTORS_H #define __WINE_SELECTORS_H
#include "windows.h" #include "wintypes.h"
#include "ldt.h" #include "ldt.h"
extern WORD SELECTOR_AllocBlock( const void *base, DWORD size, extern WORD SELECTOR_AllocBlock( const void *base, DWORD size,
@ -18,24 +18,26 @@ extern WORD SELECTOR_ReallocBlock( WORD sel, const void *base, DWORD size,
BOOL32 readonly ); BOOL32 readonly );
extern void SELECTOR_FreeBlock( WORD sel, WORD count ); extern void SELECTOR_FreeBlock( WORD sel, WORD count );
#if defined(linux) #ifdef __i386__
# define WINE_DATA_SELECTOR 0x2b # define __GET_SEG(seg,res) __asm__( "movw %%" seg ",%w0" : "=r" (res) )
# define WINE_CODE_SELECTOR 0x23 # define __SET_SEG(seg,val) __asm__( "movw %w0,%%" seg : : "r" (val) )
#elif defined(__NetBSD__) || defined(__OpenBSD__) #else /* __i386__ */
# define WINE_DATA_SELECTOR 0x1f # define __GET_SEG(seg,res) ((res) = 0)
# define WINE_CODE_SELECTOR 0x17 # define __SET_SEG(seg,val) /* nothing */
#elif defined(__FreeBSD__) #endif /* __i386__ */
# define WINE_DATA_SELECTOR 0x27
# define WINE_CODE_SELECTOR 0x1f #define GET_CS(cs) __GET_SEG("cs",cs)
#elif defined(__svr4__) || defined(_SCO_DS) #define GET_DS(ds) __GET_SEG("ds",ds)
# define WINE_DATA_SELECTOR 0x1f #define GET_ES(es) __GET_SEG("es",es)
# define WINE_CODE_SELECTOR 0x17 #define GET_FS(fs) __GET_SEG("fs",fs)
#elif defined(__EMX__) #define GET_GS(gs) __GET_SEG("gs",gs)
# define WINE_DATA_SELECTOR 0x53 /* Is this always true? */ #define GET_SS(ss) __GET_SEG("ss",ss)
# define WINE_CODE_SELECTOR 0x5b
#else #define SET_CS(cs) __SET_SEG("cs",cs)
# define WINE_DATA_SELECTOR 0x00 #define SET_DS(ds) __SET_SEG("ds",ds)
# define WINE_CODE_SELECTOR 0x00 #define SET_ES(es) __SET_SEG("es",es)
#endif #define SET_FS(fs) __SET_SEG("fs",fs)
#define SET_GS(gs) __SET_SEG("gs",gs)
#define SET_SS(ss) __SET_SEG("ss",ss)
#endif /* __WINE_SELECTORS_H */ #endif /* __WINE_SELECTORS_H */

View File

@ -7,9 +7,7 @@
#ifndef __WINE_SIG_CONTEXT_H #ifndef __WINE_SIG_CONTEXT_H
#define __WINE_SIG_CONTEXT_H #define __WINE_SIG_CONTEXT_H
#ifdef WINELIB #ifdef __i386__
#error This file must not be used in Winelib
#endif
#ifdef linux #ifdef linux
typedef struct typedef struct
@ -37,20 +35,34 @@ typedef struct
unsigned long oldmask; unsigned long oldmask;
unsigned long cr2; unsigned long cr2;
} SIGCONTEXT; } SIGCONTEXT;
#define HANDLER_DEF(name) void name (int signal, SIGCONTEXT context)
#define HANDLER_CONTEXT (&context)
#endif /* linux */ #endif /* linux */
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) #if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
#include <signal.h> #include <signal.h>
typedef struct sigcontext SIGCONTEXT; typedef struct sigcontext SIGCONTEXT;
#define HANDLER_DEF(name) void name(int signal, int code, SIGCONTEXT *context)
#define HANDLER_CONTEXT context
#endif /* FreeBSD */ #endif /* FreeBSD */
#if defined(__svr4__) || defined(_SCO_DS) #if defined(__svr4__) || defined(_SCO_DS)
#include <signal.h> #include <signal.h>
#ifdef _SCO_DS #ifdef _SCO_DS
#include <sys/regset.h> #include <sys/regset.h>
#endif #endif
#include <sys/ucontext.h> #include <sys/ucontext.h>
typedef struct ucontext SIGCONTEXT; typedef struct ucontext SIGCONTEXT;
#define HANDLER_DEF(name) void name(int signal, void *siginfo, SIGCONTEXT *context)
#define HANDLER_CONTEXT context
#endif /* svr4 || SCO_DS */ #endif /* svr4 || SCO_DS */
#ifdef __EMX__ #ifdef __EMX__
@ -202,4 +214,6 @@ typedef struct _CONTEXT /* Note 1 */
#define FL_sig(context) (*(WORD*)&EFL_sig(context)) #define FL_sig(context) (*(WORD*)&EFL_sig(context))
#endif /* __i386__ */
#endif /* __WINE_SIG_CONTEXT_H */ #endif /* __WINE_SIG_CONTEXT_H */

1
include/version.h Normal file
View File

@ -0,0 +1 @@
#define WINE_RELEASE_INFO "Wine release 971116"

View File

@ -39,6 +39,7 @@ typedef enum
BIC32_POPUPMENU, BIC32_POPUPMENU,
BIC32_STATIC, BIC32_STATIC,
BIC32_SCROLL, BIC32_SCROLL,
BIC32_MDICLIENT,
BIC32_DESKTOP, BIC32_DESKTOP,
BIC32_DIALOG, BIC32_DIALOG,
BIC32_ICONTITLE, BIC32_ICONTITLE,
@ -127,7 +128,8 @@ extern BOOL32 WIN_IsWindowDrawable(WND*, BOOL32 );
extern HINSTANCE32 WIN_GetWindowInstance( HWND32 hwnd ); extern HINSTANCE32 WIN_GetWindowInstance( HWND32 hwnd );
extern WND** WIN_BuildWinArray( WND *wndPtr, UINT32 bwa, UINT32* pnum ); extern WND** WIN_BuildWinArray( WND *wndPtr, UINT32 bwa, UINT32* pnum );
extern void DEFWND_SetText( WND *wndPtr, LPCSTR text ); /* windows/defwnd.c */ extern void DEFWND_SetText( WND *wndPtr, LPCSTR text );
extern HBRUSH32 DEFWND_ControlColor( HDC32 hDC, UINT16 ctlType ); /* windows/defwnd.c */
extern void PROPERTY_RemoveWindowProps( WND *pWnd ); /* windows/property.c */ extern void PROPERTY_RemoveWindowProps( WND *pWnd ); /* windows/property.c */

View File

@ -149,10 +149,10 @@ typedef struct WINE_ENUM_PRINTER_FONT_CALLBACK
LOADED_PRINTER_DRIVER *pLPD; /* Printer driver info */ LOADED_PRINTER_DRIVER *pLPD; /* Printer driver info */
} WEPFC; } WEPFC;
#define OBJ_PEN 1 #define DRVOBJ_PEN 1
#define OBJ_BRUSH 2 #define DRVOBJ_BRUSH 2
#define OBJ_FONT 3 #define DRVOBJ_FONT 3
#define OBJ_PBITMAP 5 #define DRVOBJ_PBITMAP 5
/* Win16 printer driver physical DC */ /* Win16 printer driver physical DC */
typedef struct typedef struct

View File

@ -1947,6 +1947,40 @@ typedef struct {
HBITMAP32 hbmColor; HBITMAP32 hbmColor;
} ICONINFO,*LPICONINFO; } ICONINFO,*LPICONINFO;
#define FVIRTKEY TRUE /* Assumed to be == TRUE */
#define FNOINVERT 0x02
#define FSHIFT 0x04
#define FCONTROL 0x08
#define FALT 0x10
typedef struct
{
BYTE fVirt;
WORD key;
WORD cmd;
} ACCEL16, *LPACCEL16;
typedef struct
{
BYTE fVirt;
BYTE pad0;
WORD key;
WORD cmd;
WORD pad1;
} ACCEL32, *LPACCEL32;
DECL_WINELIB_TYPE(ACCEL);
DECL_WINELIB_TYPE(LPACCEL);
/* Flags for DrawIconEx. */
#define DI_MASK 1
#define DI_IMAGE 2
#define DI_NORMAL (DI_MASK | DI_IMAGE)
#define DI_COMPAT 4
#define DI_DEFAULTSIZE 8
typedef struct { typedef struct {
BYTE i; /* much more .... */ BYTE i; /* much more .... */
} KANJISTRUCT; } KANJISTRUCT;
@ -2452,6 +2486,9 @@ typedef struct tagCOMSTAT
#define OBM_CDROM 32729 #define OBM_CDROM 32729
#define OBM_TRTYPE 32728 #define OBM_TRTYPE 32728
/* Wine extension, I think. */
#define OBM_RADIOCHECK 32727
#define OBM_OLD_CLOSE 32767 #define OBM_OLD_CLOSE 32767
#define OBM_SIZE 32766 #define OBM_SIZE 32766
#define OBM_OLD_UPARROW 32765 #define OBM_OLD_UPARROW 32765
@ -5450,6 +5487,9 @@ BOOL32 WINAPI AreFileApisANSI(void);
BOOL32 WINAPI Beep(DWORD,DWORD); BOOL32 WINAPI Beep(DWORD,DWORD);
BOOL32 WINAPI ClearCommError(INT32,LPDWORD,LPCOMSTAT); BOOL32 WINAPI ClearCommError(INT32,LPDWORD,LPCOMSTAT);
BOOL32 WINAPI CloseHandle(HANDLE32); BOOL32 WINAPI CloseHandle(HANDLE32);
INT32 WINAPI CopyAcceleratorTable32A(HACCEL32,LPACCEL32,INT32);
INT32 WINAPI CopyAcceleratorTable32W(HACCEL32,LPACCEL32,INT32);
#define CopyAcceleratorTable WINELIB_NAME_AW(CopyAcceleratorTable)
BOOL32 WINAPI CopyFile32A(LPCSTR,LPCSTR,BOOL32); BOOL32 WINAPI CopyFile32A(LPCSTR,LPCSTR,BOOL32);
BOOL32 WINAPI CopyFile32W(LPCWSTR,LPCWSTR,BOOL32); BOOL32 WINAPI CopyFile32W(LPCWSTR,LPCWSTR,BOOL32);
#define CopyFile WINELIB_NAME_AW(CopyFile) #define CopyFile WINELIB_NAME_AW(CopyFile)
@ -5474,6 +5514,7 @@ HANDLE32 WINAPI CreateMutex32W(LPSECURITY_ATTRIBUTES,BOOL32,LPCWSTR);
HANDLE32 WINAPI CreateSemaphore32A(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCSTR); HANDLE32 WINAPI CreateSemaphore32A(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCSTR);
HANDLE32 WINAPI CreateSemaphore32W(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCWSTR); HANDLE32 WINAPI CreateSemaphore32W(LPSECURITY_ATTRIBUTES,LONG,LONG,LPCWSTR);
#define CreateSemaphore WINELIB_NAME_AW(CreateSemaphore) #define CreateSemaphore WINELIB_NAME_AW(CreateSemaphore)
BOOL32 WINAPI DestroyAcceleratorTable(HACCEL32);
BOOL32 WINAPI DisableThreadLibraryCalls(HMODULE32); BOOL32 WINAPI DisableThreadLibraryCalls(HMODULE32);
BOOL32 WINAPI DosDateTimeToFileTime(WORD,WORD,LPFILETIME); BOOL32 WINAPI DosDateTimeToFileTime(WORD,WORD,LPFILETIME);
INT32 WINAPI EnumPropsEx32A(HWND32,PROPENUMPROCEX32A,LPARAM); INT32 WINAPI EnumPropsEx32A(HWND32,PROPENUMPROCEX32A,LPARAM);
@ -5874,6 +5915,9 @@ BOOL32 WINAPI CheckDlgButton32(HWND32,INT32,UINT32);
BOOL16 WINAPI CheckMenuItem16(HMENU16,UINT16,UINT16); BOOL16 WINAPI CheckMenuItem16(HMENU16,UINT16,UINT16);
DWORD WINAPI CheckMenuItem32(HMENU32,UINT32,UINT32); DWORD WINAPI CheckMenuItem32(HMENU32,UINT32,UINT32);
#define CheckMenuItem WINELIB_NAME(CheckMenuItem) #define CheckMenuItem WINELIB_NAME(CheckMenuItem)
BOOL16 WINAPI CheckMenuRadioButton16(HMENU16,UINT16,UINT16,UINT16,BOOL16);
BOOL32 WINAPI CheckMenuRadioButton32(HMENU32,UINT32,UINT32,UINT32,BOOL32);
#define CheckMenuRadioButton WINELIB_NAME(CheckMenuRadioButton)
BOOL16 WINAPI CheckRadioButton16(HWND16,UINT16,UINT16,UINT16); BOOL16 WINAPI CheckRadioButton16(HWND16,UINT16,UINT16,UINT16);
BOOL32 WINAPI CheckRadioButton32(HWND32,UINT32,UINT32,UINT32); BOOL32 WINAPI CheckRadioButton32(HWND32,UINT32,UINT32,UINT32);
#define CheckRadioButton WINELIB_NAME(CheckRadioButton) #define CheckRadioButton WINELIB_NAME(CheckRadioButton)
@ -5986,6 +6030,11 @@ HBITMAP32 WINAPI CreateDIBitmap32(HDC32,const BITMAPINFOHEADER*,DWORD,
HBRUSH16 WINAPI CreateDIBPatternBrush16(HGLOBAL16,UINT16); HBRUSH16 WINAPI CreateDIBPatternBrush16(HGLOBAL16,UINT16);
HBRUSH32 WINAPI CreateDIBPatternBrush32(HGLOBAL32,UINT32); HBRUSH32 WINAPI CreateDIBPatternBrush32(HGLOBAL32,UINT32);
#define CreateDIBPatternBrush WINELIB_NAME(CreateDIBPatternBrush) #define CreateDIBPatternBrush WINELIB_NAME(CreateDIBPatternBrush)
HBITMAP16 WINAPI CreateDIBSection16 (HDC16, BITMAPINFO *, UINT16,
LPVOID **, HANDLE16, DWORD offset);
HBITMAP32 WINAPI CreateDIBSection32 (HDC32, BITMAPINFO *, UINT32,
LPVOID **, HANDLE32, DWORD offset);
#define CreateDIBSection WINELIB_NAME(CreateDIBSection)
BOOL16 WINAPI CreateDirectory16(LPCSTR,LPVOID); BOOL16 WINAPI CreateDirectory16(LPCSTR,LPVOID);
BOOL32 WINAPI CreateDirectory32A(LPCSTR,LPSECURITY_ATTRIBUTES); BOOL32 WINAPI CreateDirectory32A(LPCSTR,LPSECURITY_ATTRIBUTES);
BOOL32 WINAPI CreateDirectory32W(LPCWSTR,LPSECURITY_ATTRIBUTES); BOOL32 WINAPI CreateDirectory32W(LPCWSTR,LPSECURITY_ATTRIBUTES);
@ -6206,6 +6255,11 @@ BOOL32 WINAPI DrawFrameControl32(HDC32,LPRECT32,UINT32,UINT32);
BOOL16 WINAPI DrawIcon16(HDC16,INT16,INT16,HICON16); BOOL16 WINAPI DrawIcon16(HDC16,INT16,INT16,HICON16);
BOOL32 WINAPI DrawIcon32(HDC32,INT32,INT32,HICON32); BOOL32 WINAPI DrawIcon32(HDC32,INT32,INT32,HICON32);
#define DrawIcon WINELIB_NAME(DrawIcon) #define DrawIcon WINELIB_NAME(DrawIcon)
BOOL16 WINAPI DrawIconEx16(HDC16,INT16,INT16,HICON16,INT16,INT16,
UINT16,HBRUSH16,UINT16);
BOOL32 WINAPI DrawIconEx32(HDC32,INT32,INT32,HICON32,INT32,INT32,
UINT32,HBRUSH32,UINT32);
#define DrawIconEx WINELIB_NAME(DrawIconEx)
VOID WINAPI DrawMenuBar16(HWND16); VOID WINAPI DrawMenuBar16(HWND16);
BOOL32 WINAPI DrawMenuBar32(HWND32); BOOL32 WINAPI DrawMenuBar32(HWND32);
#define DrawMenuBar WINELIB_NAME(DrawMenuBar) #define DrawMenuBar WINELIB_NAME(DrawMenuBar)
@ -6596,6 +6650,9 @@ INT32 WINAPI GetMenuItemCount32(HMENU32);
UINT16 WINAPI GetMenuItemID16(HMENU16,INT16); UINT16 WINAPI GetMenuItemID16(HMENU16,INT16);
UINT32 WINAPI GetMenuItemID32(HMENU32,INT32); UINT32 WINAPI GetMenuItemID32(HMENU32,INT32);
#define GetMenuItemID WINELIB_NAME(GetMenuItemID) #define GetMenuItemID WINELIB_NAME(GetMenuItemID)
BOOL16 WINAPI GetMenuItemRect16(HWND16,HMENU16,UINT16,LPRECT16);
BOOL32 WINAPI GetMenuItemRect32(HWND32,HMENU32,UINT32,LPRECT32);
#define GetMenuItemRect WINELIB_NAME(GetMenuItemRect)
UINT16 WINAPI GetMenuState16(HMENU16,UINT16,UINT16); UINT16 WINAPI GetMenuState16(HMENU16,UINT16,UINT16);
UINT32 WINAPI GetMenuState32(HMENU32,UINT32,UINT32); UINT32 WINAPI GetMenuState32(HMENU32,UINT32,UINT32);
#define GetMenuState WINELIB_NAME(GetMenuState) #define GetMenuState WINELIB_NAME(GetMenuState)

View File

@ -8,32 +8,21 @@
#define __WINE_WINTYPES_H #define __WINE_WINTYPES_H
#ifdef __WINE__ #ifdef __WINE__
#include "config.h" # include "config.h"
#endif # undef WINELIB
# undef WINELIB16
#if !defined(__WINE__) && !defined(WINELIB) # undef WINELIB32
/* If we are not compiling Wine, then we should be using Winelib */ # undef UNICODE
#error You must use 'configure --with-library' to build Winelib programs #else /* __WINE__ */
#define WINELIB # ifndef WINELIB
#endif # define WINELIB
# endif
#ifdef WINELIB
# ifdef WINELIB16 # ifdef WINELIB16
# undef WINELIB32 # undef WINELIB32
# else # else
# ifndef WINELIB32 # define WINELIB32
# define WINELIB32
# endif
# endif # endif
#else #endif /* __WINE__ */
# ifdef WINELIB32
# undef WINELIB16
# define WINELIB
# endif
# ifdef WINELIB16
# define WINELIB
# endif
#endif
/* Macros to map Winelib names to the correct implementation name */ /* Macros to map Winelib names to the correct implementation name */
/* depending on WINELIB16, WINELIB32 and UNICODE macros. */ /* depending on WINELIB16, WINELIB32 and UNICODE macros. */

View File

@ -1,4 +1,4 @@
DEFS = -D__WINE__ DEFS = @DLLFLAGS@ -D__WINE__
TOPSRCDIR = @top_srcdir@ TOPSRCDIR = @top_srcdir@
TOPOBJDIR = .. TOPOBJDIR = ..
SRCDIR = @srcdir@ SRCDIR = @srcdir@

View File

@ -4,23 +4,10 @@ TOPOBJDIR = ..
SRCDIR = @srcdir@ SRCDIR = @srcdir@
VPATH = @srcdir@ VPATH = @srcdir@
MODULE = none MODULE = none
LIBMODULE = library
LIB_SRCS = \ C_SRCS = winestub.c
libres.c \
miscstubs.c
STUB_SRCS = winestub.c all: $(C_SRCS:.c=.o)
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@ @MAKE_RULES@

View File

@ -1,44 +0,0 @@
/*
* JBP (Jim Peterson <jspeter@birch.ee.vt.edu>): Lots of stubs needed for
* libwine.a.
*/
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "wintypes.h"
/* for windows/winproc.c */
void CallFrom16_long_wwwll(void) {}
extern LRESULT ColorDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
extern LRESULT FileOpenDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
extern LRESULT FileSaveDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
extern LRESULT FindTextDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
extern LRESULT MDIClientWndProc(HWND16,UINT16,WPARAM16,LPARAM);
extern LRESULT PrintDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
extern LRESULT PrintSetupDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
extern LRESULT ReplaceTextDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
/***********************************************************************
* MODULE_GetWndProcEntry16 (not a Windows API function)
*
* Return an entry point from the WPROCS dll.
*/
FARPROC16 MODULE_GetWndProcEntry16( char *name )
{
#define MAP_STR_TO_PROC(str,proc) if(!strcmp(name,str))return (FARPROC16)proc
MAP_STR_TO_PROC("ColorDlgProc",ColorDlgProc);
MAP_STR_TO_PROC("FileOpenDlgProc",FileOpenDlgProc);
MAP_STR_TO_PROC("FileSaveDlgProc",FileSaveDlgProc);
MAP_STR_TO_PROC("FindTextDlgProc",FindTextDlgProc);
MAP_STR_TO_PROC("MDIClientWndProc",MDIClientWndProc);
MAP_STR_TO_PROC("PrintDlgProc",PrintDlgProc);
MAP_STR_TO_PROC("PrintSetupDlgProc",PrintSetupDlgProc);
MAP_STR_TO_PROC("ReplaceTextDlgProc",ReplaceTextDlgProc);
fprintf(stderr,"warning: No mapping for %s(), add one in library/miscstubs.c\n",name);
assert( FALSE );
return NULL;
}

View File

@ -4,8 +4,14 @@
#include "windows.h" #include "windows.h"
#include "xmalloc.h" #include "xmalloc.h"
/* Stubs needed for linking with Winelib */
/* FIXME: this should not be necessary */
FARPROC32 BUILTIN_GetProcAddress32( void *mod, LPCSTR func ) { return 0; }
HMODULE32 BUILTIN_LoadModule( LPCSTR name, BOOL32 force ) { return 0; }
extern int PASCAL WinMain(HINSTANCE32,HINSTANCE32,LPSTR,int); extern int PASCAL WinMain(HINSTANCE32,HINSTANCE32,LPSTR,int);
extern int MAIN_Init(void); extern int MAIN_WinelibInit(void);
extern BOOL32 MAIN_WineInit( int *argc, char *argv[] ); extern BOOL32 MAIN_WineInit( int *argc, char *argv[] );
extern void TASK_Reschedule(void); extern void TASK_Reschedule(void);
@ -32,7 +38,7 @@ int main( int argc, char *argv [] )
else lpszCmdParam[0] = '\0'; else lpszCmdParam[0] = '\0';
for (i = 2; i < argc; i++) strcat(strcat(lpszCmdParam, " "), argv[i]); for (i = 2; i < argc; i++) strcat(strcat(lpszCmdParam, " "), argv[i]);
if(!MAIN_Init()) return 0; /* JBP: Needed for DosDrives[] structure, etc. */ if(!MAIN_WinelibInit()) return 0;
hInstance = WinExec32( *argv, SW_SHOWNORMAL ); hInstance = WinExec32( *argv, SW_SHOWNORMAL );
TASK_Reschedule(); TASK_Reschedule();
InitApp( hInstance ); InitApp( hInstance );

View File

@ -1,4 +1,4 @@
DEFS = -D__WINE__ DEFS = @DLLFLAGS@ -D__WINE__
TOPSRCDIR = @top_srcdir@ TOPSRCDIR = @top_srcdir@
TOPOBJDIR = .. TOPOBJDIR = ..
SRCDIR = @srcdir@ SRCDIR = @srcdir@
@ -6,6 +6,7 @@ VPATH = @srcdir@
MODULE = loader MODULE = loader
C_SRCS = \ C_SRCS = \
libres.c \
main.c \ main.c \
module.c \ module.c \
ne_image.c \ ne_image.c \

View File

@ -1,7 +1,7 @@
/* /*
static char RCSId[] = "$Id: wine.c,v 1.2 1993/07/04 04:04:21 root Exp root $"; * Main initialization code
static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; */
*/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
@ -23,7 +23,6 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
#include "queue.h" #include "queue.h"
#include "syscolor.h" #include "syscolor.h"
#include "sysmetrics.h" #include "sysmetrics.h"
#include "callback.h"
#include "file.h" #include "file.h"
#include "gdi.h" #include "gdi.h"
#include "heap.h" #include "heap.h"
@ -41,78 +40,48 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
#include "stddebug.h" #include "stddebug.h"
#include "debug.h" #include "debug.h"
#ifndef WINELIB
#include "debugger.h"
#endif
int __winelib = 1; /* Winelib run-time flag */ int __winelib = 1; /* Winelib run-time flag */
HANDLE32 SystemHeap = 0; HANDLE32 SystemHeap = 0;
HANDLE32 SegptrHeap = 0; HANDLE32 SegptrHeap = 0;
/*********************************************************************** /***********************************************************************
* Main initialisation routine * Kernel initialisation routine
*/ */
int MAIN_Init(void) BOOL32 MAIN_KernelInit(void)
{ {
extern BOOL32 EVENT_Init(void); extern BOOL32 EVENT_Init(void);
extern BOOL32 RELAY_Init(void);
extern BOOL32 WIN16DRV_Init(void);
extern BOOL32 VIRTUAL_Init(void); extern BOOL32 VIRTUAL_Init(void);
extern BOOL32 WIDGETS_Init(void);
int queueSize;
/* Initialize virtual memory management */ /* Initialize virtual memory management */
if (!VIRTUAL_Init()) return 0; if (!VIRTUAL_Init()) return FALSE;
/* Create the system and SEGPTR heaps */ /* Create the system and SEGPTR heaps */
if (!(SystemHeap = HeapCreate( HEAP_GROWABLE, 0x10000, 0 ))) return 0; if (!(SystemHeap = HeapCreate( HEAP_GROWABLE, 0x10000, 0 ))) return FALSE;
if (!(SegptrHeap = HeapCreate( HEAP_WINE_SEGPTR, 0, 0 ))) return 0; if (!(SegptrHeap = HeapCreate( HEAP_WINE_SEGPTR, 0, 0 ))) return FALSE;
/* Load the configuration file */ /* Load the configuration file */
if (!PROFILE_LoadWineIni()) return 0; if (!PROFILE_LoadWineIni()) return FALSE;
/* Initialize DOS memory */ /* Initialize DOS memory */
if (!DOSMEM_Init()) return 0; if (!DOSMEM_Init()) return FALSE;
/* Initialize signal handling */ /* Initialize signal handling */
if (!SIGNAL_Init()) return 0; if (!SIGNAL_Init()) return FALSE;
/* Initialize event handling */
if (!EVENT_Init()) return 0;
#ifdef WINELIB
/* Create USER and GDI heap */
USER_HeapSel = GlobalAlloc16( GMEM_FIXED, 0x10000 );
LocalInit( USER_HeapSel, 0, 0xffff );
GDI_HeapSel = GlobalAlloc16( GMEM_FIXED, GDI_HEAP_SIZE );
LocalInit( GDI_HeapSel, 0, GDI_HEAP_SIZE-1 );
#else
/* Initialize relay code */
if (!RELAY_Init()) return 0;
/* Initialize signal handling */
if (!SIGNAL_InitEmulator()) return 0;
/* Create the Win16 printer driver */
if (!WIN16DRV_Init()) return 0;
#endif /* WINELIB */
/* Initialize Wine tweaks */
if (!TWEAK_Init()) return 0;
/* Initialize OEM Bitmaps */
if (!OBM_Init()) return 0;
/* Initialise DOS drives */ /* Initialise DOS drives */
if (!DRIVE_Init()) return 0; if (!DRIVE_Init()) return FALSE;
/* Initialise DOS directories */ /* Initialise DOS directories */
if (!DIR_Init()) return 0; if (!DIR_Init()) return FALSE;
/* Initialize tasks */ /* Initialize tasks */
if (!TASK_Init()) return 0; if (!TASK_Init()) return FALSE;
/* Initialize event handling */
if (!EVENT_Init()) return FALSE;
/* Initialize communications */ /* Initialize communications */
COMM_Init(); COMM_Init();
@ -120,14 +89,45 @@ int MAIN_Init(void)
/* Initialize IO-port permissions */ /* Initialize IO-port permissions */
IO_port_init(); IO_port_init();
return TRUE;
}
/***********************************************************************
* USER (and GDI) initialisation routine
*/
BOOL32 MAIN_UserInit(void)
{
extern BOOL32 WIDGETS_Init(void);
int queueSize;
/* Create USER and GDI heap */
if (!USER_HeapSel)
{
USER_HeapSel = GlobalAlloc16( GMEM_FIXED, 0x10000 );
LocalInit( USER_HeapSel, 0, 0xffff );
}
if (!GDI_HeapSel)
{
GDI_HeapSel = GlobalAlloc16( GMEM_FIXED, GDI_HEAP_SIZE );
LocalInit( GDI_HeapSel, 0, GDI_HEAP_SIZE-1 );
}
/* Initialize Wine tweaks */
if (!TWEAK_Init()) return FALSE;
/* Initialize OEM Bitmaps */
if (!OBM_Init()) return FALSE;
/* registry initialisation */ /* registry initialisation */
SHELL_LoadRegistry(); SHELL_LoadRegistry();
/* Global atom table initialisation */ /* Global atom table initialisation */
if (!ATOM_Init()) return 0; if (!ATOM_Init()) return FALSE;
/* GDI initialisation */ /* GDI initialisation */
if (!GDI_Init()) return 0; if (!GDI_Init()) return FALSE;
/* Initialize system colors and metrics*/ /* Initialize system colors and metrics*/
SYSMETRICS_Init(); SYSMETRICS_Init();
@ -137,103 +137,49 @@ int MAIN_Init(void)
DCE_Init(); DCE_Init();
/* Initialize keyboard */ /* Initialize keyboard */
if (!KEYBOARD_Init()) return 0; if (!KEYBOARD_Init()) return FALSE;
/* Initialize window procedures */ /* Initialize window procedures */
if (!WINPROC_Init()) return 0; if (!WINPROC_Init()) return FALSE;
/* Initialize built-in window classes */ /* Initialize built-in window classes */
if (!WIDGETS_Init()) return 0; if (!WIDGETS_Init()) return FALSE;
/* Initialize dialog manager */ /* Initialize dialog manager */
if (!DIALOG_Init()) return 0; if (!DIALOG_Init()) return FALSE;
/* Initialize menus */ /* Initialize menus */
if (!MENU_Init()) return 0; if (!MENU_Init()) return FALSE;
/* Create desktop window */ /* Create desktop window */
if (!WIN_CreateDesktopWindow()) return 0; if (!WIN_CreateDesktopWindow()) return FALSE;
/* Initialize message spying */ /* Initialize message spying */
if (!SPY_Init()) return 0; if (!SPY_Init()) return FALSE;
/* Check wine.conf for old/bad entries */ /* Check wine.conf for old/bad entries */
if (!TWEAK_CheckConfiguration()) return 0; if (!TWEAK_CheckConfiguration()) return FALSE;
/* Create system message queue */ /* Create system message queue */
queueSize = GetProfileInt32A( "windows", "TypeAhead", 120 ); queueSize = GetProfileInt32A( "windows", "TypeAhead", 120 );
if (!QUEUE_CreateSysMsgQueue( queueSize )) return 0; if (!QUEUE_CreateSysMsgQueue( queueSize )) return FALSE;
/* Set double click time */ /* Set double click time */
SetDoubleClickTime32( GetProfileInt32A("windows","DoubleClickSpeed",452) ); SetDoubleClickTime32( GetProfileInt32A("windows","DoubleClickSpeed",452) );
return TRUE;
}
/***********************************************************************
* Winelib initialisation routine
*/
int MAIN_WinelibInit(void)
{
/* Initialize the kernel */
if (!MAIN_KernelInit()) return 0;
/* Initialize all the USER stuff */
if (!MAIN_UserInit()) return 0;
return 1; return 1;
} }
#ifndef WINELIB
/**********************************************************************
* main
*/
int main(int argc, char *argv[] )
{
extern BOOL32 MAIN_WineInit( int *argc, char *argv[] );
extern void *CALL32_Init(void);
extern char * DEBUG_argv0;
int i,loaded;
HINSTANCE32 handle;
__winelib = 0; /* First of all, clear the Winelib flag */
/*
* Save this so that the internal debugger can get a hold of it if
* it needs to.
*/
DEBUG_argv0 = argv[0];
if (!MAIN_WineInit( &argc, argv )) return 1;
if (!MAIN_Init()) return 1;
/* Initialize CALL32 routines */
/* This needs to be done just before task-switching starts */
IF1632_CallLargeStack = (int (*)(int (*func)(), void *arg))CALL32_Init();
loaded=0;
for (i = 1; i < argc; i++)
{
if ((handle = WinExec32( argv[i], SW_SHOWNORMAL )) < 32)
{
fprintf(stderr, "wine: can't exec '%s': ", argv[i]);
switch (handle)
{
case 2: fprintf( stderr, "file not found\n" ); break;
case 11: fprintf( stderr, "invalid exe file\n" ); break;
case 21: fprintf( stderr, "win32 executable\n" ); break;
default: fprintf( stderr, "error=%d\n", handle ); break;
}
return 1;
}
loaded++;
}
if (!loaded) { /* nothing loaded */
extern void MAIN_Usage(char*);
MAIN_Usage(argv[0]);
return 1;
}
if (!GetNumTasks())
{
fprintf( stderr, "wine: no executable file found.\n" );
return 0;
}
if (Options.debug) DEBUG_AddModuleBreakpoints();
Yield(); /* Start the first task */
fprintf( stderr, "WinMain: Should never happen: returned from Yield()\n" );
return 0;
}
#endif /* #ifndef WINELIB */

View File

@ -4,6 +4,7 @@
* Copyright 1995 Alexandre Julliard * Copyright 1995 Alexandre Julliard
*/ */
#include <assert.h>
#include <fcntl.h> #include <fcntl.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
@ -918,20 +919,54 @@ BOOL16 MODULE_SetEntryPoint( HMODULE32 hModule, WORD ordinal, WORD offset )
* *
* Return an entry point from the WPROCS dll. * Return an entry point from the WPROCS dll.
*/ */
#ifndef WINELIB FARPROC16 MODULE_GetWndProcEntry16( LPCSTR name )
FARPROC16 MODULE_GetWndProcEntry16( const char *name )
{ {
WORD ordinal; FARPROC16 ret = NULL;
FARPROC16 ret;
static HMODULE32 hModule = 0;
if (!hModule) hModule = GetModuleHandle16( "WPROCS" ); if (__winelib)
ordinal = MODULE_GetOrdinal( hModule, name ); {
if (!(ret = MODULE_GetEntryPoint( hModule, ordinal ))) /* FIXME: hack for Winelib */
fprintf( stderr, "GetWndProc16: %s not found, please report\n", name ); extern LRESULT ColorDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
extern LRESULT FileOpenDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
extern LRESULT FileSaveDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
extern LRESULT FindTextDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
extern LRESULT PrintDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
extern LRESULT PrintSetupDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
extern LRESULT ReplaceTextDlgProc(HWND16,UINT16,WPARAM16,LPARAM);
if (!strcmp(name,"ColorDlgProc"))
return (FARPROC16)ColorDlgProc;
if (!strcmp(name,"FileOpenDlgProc"))
return (FARPROC16)FileOpenDlgProc;
if (!strcmp(name,"FileSaveDlgProc"))
return (FARPROC16)FileSaveDlgProc;
if (!strcmp(name,"FindTextDlgProc"))
return (FARPROC16)FindTextDlgProc;
if (!strcmp(name,"PrintDlgProc"))
return (FARPROC16)PrintDlgProc;
if (!strcmp(name,"PrintSetupDlgProc"))
return (FARPROC16)PrintSetupDlgProc;
if (!strcmp(name,"ReplaceTextDlgProc"))
return (FARPROC16)ReplaceTextDlgProc;
fprintf(stderr,"warning: No mapping for %s(), add one in library/miscstubs.c\n",name);
assert( FALSE );
return NULL;
}
else
{
WORD ordinal;
static HMODULE32 hModule = 0;
if (!hModule) hModule = GetModuleHandle16( "WPROCS" );
ordinal = MODULE_GetOrdinal( hModule, name );
if (!(ret = MODULE_GetEntryPoint( hModule, ordinal )))
{
fprintf( stderr, "GetWndProc16: %s not found\n", name );
assert( FALSE );
}
}
return ret; return ret;
} }
#endif
/*********************************************************************** /***********************************************************************
@ -1109,203 +1144,97 @@ HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, UINT16 uFlags)
NE_MODULE *pModule; NE_MODULE *pModule;
LOADPARAMS *params = (LOADPARAMS *)paramBlock; LOADPARAMS *params = (LOADPARAMS *)paramBlock;
OFSTRUCT ofs; OFSTRUCT ofs;
#ifndef WINELIB
WORD *pModRef, *pDLLs;
HFILE32 hFile; HFILE32 hFile;
int i;
extern const char * DEBUG_curr_module;
hModule = MODULE_FindModule( name ); if (__winelib)
if (!hModule) /* We have to load the module */
{ {
/* Try to load the built-in first if not disabled */ lstrcpyn32A( ofs.szPathName, name, sizeof(ofs.szPathName) );
if ((hModule = BUILTIN_LoadModule( name, FALSE ))) return hModule; if ((hModule = MODULE_CreateDummyModule( &ofs )) < 32) return hModule;
pModule = (NE_MODULE *)GlobalLock16( hModule );
hPrevInstance = 0;
hInstance = MODULE_CreateInstance( hModule, params );
}
else
{
hModule = MODULE_FindModule( name );
if ((hFile = OpenFile32( name, &ofs, OF_READ )) == HFILE_ERROR32) if (!hModule) /* We have to load the module */
{ {
/* Now try the built-in even if disabled */ /* Try to load the built-in first if not disabled */
if ((hModule = BUILTIN_LoadModule( name, TRUE ))) if ((hModule = BUILTIN_LoadModule( name, FALSE ))) return hModule;
if ((hFile = OpenFile32( name, &ofs, OF_READ )) == HFILE_ERROR32)
{ {
fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name ); /* Now try the built-in even if disabled */
if ((hModule = BUILTIN_LoadModule( name, TRUE )))
{
fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name );
return hModule;
}
return 2; /* File not found */
}
/* Create the module structure */
hModule = MODULE_LoadExeHeader( hFile, &ofs );
if (hModule < 32)
{
if (hModule == 21)
hModule = PE_LoadModule( hFile, &ofs, paramBlock );
else _lclose32( hFile );
if (hModule < 32)
fprintf( stderr, "LoadModule: can't load '%s', error=%d\n",
name, hModule );
return hModule; return hModule;
} }
return 2; /* File not found */ _lclose32( hFile );
pModule = MODULE_GetPtr( hModule );
pModule->flags |= uFlags; /* stamp implicitly loaded modules */
/* Allocate the segments for this module */
MODULE_CreateSegments( hModule );
hPrevInstance = 0;
hInstance = MODULE_CreateInstance(hModule,(LOADPARAMS*)paramBlock);
/* Load the referenced DLLs */
if (!NE_LoadDLLs( pModule )) return 2; /* File not found */
/* Load the segments */
NE_LoadAllSegments( pModule );
/* Fixup the functions prologs */
NE_FixupPrologs( pModule );
/* Make sure the usage count is 1 on the first loading of */
/* the module, even if it contains circular DLL references */
pModule->count = 1;
/* Call initialization rountines for all loaded DLLs. Note that
* when we load implicitly linked DLLs this will be done by InitTask().
*/
if ((pModule->flags & (NE_FFLAGS_LIBMODULE | NE_FFLAGS_IMPLICIT)) ==
NE_FFLAGS_LIBMODULE )
NE_InitializeDLLs( hModule );
} }
else /* module is already loaded, just create a new data segment if it's a task */
/*
* Record this so that the internal debugger gets some
* record of what it is that we are working with.
*/
DEBUG_curr_module = name;
/* Create the module structure */
hModule = MODULE_LoadExeHeader( hFile, &ofs );
if (hModule < 32)
{ {
if (hModule == 21) pModule = MODULE_GetPtr( hModule );
hModule = PE_LoadModule( hFile, &ofs, paramBlock ); hPrevInstance = MODULE_GetInstance( hModule );
else _lclose32( hFile ); hInstance = MODULE_CreateInstance( hModule, params );
if (hInstance != hPrevInstance) /* not a library */
if (hModule < 32) NE_LoadSegment( pModule, pModule->dgroup );
fprintf( stderr, "LoadModule: can't load '%s', error=%d\n", pModule->count++;
name, hModule );
return hModule;
} }
_lclose32( hFile ); } /* !winelib */
pModule = MODULE_GetPtr( hModule );
pModule->flags |= uFlags; /* stamp implicitly loaded modules */
/* Allocate the segments for this module */ /* Create a task for this instance */
MODULE_CreateSegments( hModule );
hPrevInstance = 0;
hInstance = MODULE_CreateInstance( hModule, (LOADPARAMS*)paramBlock );
/* Load the referenced DLLs */
pModRef = (WORD *)((char *)pModule + pModule->modref_table);
pDLLs = (WORD *)GlobalLock16( pModule->dlls_to_init );
for (i = 0; i < pModule->modref_count; i++, pModRef++)
{
char buffer[256];
BYTE *pstr = (BYTE *)pModule + pModule->import_table + *pModRef;
memcpy( buffer, pstr + 1, *pstr );
strcpy( buffer + *pstr, ".dll" );
dprintf_module( stddeb, "Loading '%s'\n", buffer );
if (!(*pModRef = MODULE_FindModule( buffer )))
{
/* If the DLL is not loaded yet, load it and store */
/* its handle in the list of DLLs to initialize. */
HMODULE16 hDLL;
if ((hDLL = MODULE_Load( buffer, (LPVOID)-1, NE_FFLAGS_IMPLICIT )) == 2)
{
/* file not found */
char *p;
/* Try with prepending the path of the current module */
GetModuleFileName16( hModule, buffer, sizeof(buffer) );
if (!(p = strrchr( buffer, '\\' ))) p = buffer;
memcpy( p + 1, pstr + 1, *pstr );
strcpy( p + 1 + *pstr, ".dll" );
hDLL = MODULE_Load( buffer, (LPVOID)-1, NE_FFLAGS_IMPLICIT );
}
if (hDLL < 32)
{
/* FIXME: cleanup what was done */
fprintf( stderr, "Could not load '%s' required by '%s', error = %d\n",
buffer, name, hDLL );
return 2; /* file not found */
}
*pModRef = MODULE_HANDLEtoHMODULE16( hDLL );
*pDLLs++ = *pModRef;
}
else /* Increment the reference count of the DLL */
{
NE_MODULE *pOldDLL = MODULE_GetPtr( *pModRef );
if (pOldDLL) pOldDLL->count++;
}
}
/* Load the segments */
if (pModule->flags & NE_FFLAGS_SELFLOAD)
{
HFILE32 hf;
/* Handle self loading modules */
SEGTABLEENTRY * pSegTable = (SEGTABLEENTRY *) NE_SEG_TABLE(pModule);
SELFLOADHEADER *selfloadheader;
STACK16FRAME *stack16Top;
HMODULE16 hselfload = GetModuleHandle16("WPROCS");
DWORD oldstack;
WORD saved_dgroup = pSegTable[pModule->dgroup - 1].selector;
dprintf_module(stddeb, "MODULE_Load: %*.*s is a self-loading module!\n",
*((BYTE*)pModule + pModule->name_table),
*((BYTE*)pModule + pModule->name_table),
(char *)pModule + pModule->name_table + 1);
NE_LoadSegment( hModule, 1 );
selfloadheader = (SELFLOADHEADER *)
PTR_SEG_OFF_TO_LIN(pSegTable->selector, 0);
selfloadheader->EntryAddrProc =
MODULE_GetEntryPoint(hselfload,27);
selfloadheader->MyAlloc = MODULE_GetEntryPoint(hselfload,28);
selfloadheader->SetOwner = MODULE_GetEntryPoint(GetModuleHandle16("KERNEL"),403);
pModule->self_loading_sel = GlobalHandleToSel(
GLOBAL_Alloc (GMEM_ZEROINIT,
0xFF00, hModule, FALSE, FALSE, FALSE)
);
oldstack = IF1632_Saved16_ss_sp;
IF1632_Saved16_ss_sp =
PTR_SEG_OFF_TO_SEGPTR( pModule->self_loading_sel,
0xff00 - sizeof(*stack16Top) );
stack16Top = CURRENT_STACK16;
stack16Top->saved_ss_sp = 0;
stack16Top->ebp = 0;
stack16Top->ds = stack16Top->es = pModule->self_loading_sel;
stack16Top->entry_point = 0;
stack16Top->entry_ip = 0;
stack16Top->entry_cs = 0;
stack16Top->bp = 0;
stack16Top->ip = 0;
stack16Top->cs = 0;
hf = FILE_DupUnixHandle( MODULE_OpenFile( hModule ) );
Callbacks->CallBootAppProc( selfloadheader->BootApp,
hModule, hf );
_lclose32(hf);
/* some BootApp procs overwrite the selector of dgroup */
pSegTable[pModule->dgroup - 1].selector = saved_dgroup;
IF1632_Saved16_ss_sp = oldstack;
for (i = 2; i <= pModule->seg_count; i++)
NE_LoadSegment( hModule, i );
}
else
{
for (i = 1; i <= pModule->seg_count; i++)
NE_LoadSegment( hModule, i );
}
/* Fixup the functions prologs */
NE_FixupPrologs( pModule );
/* Make sure the usage count is 1 on the first loading of */
/* the module, even if it contains circular DLL references */
pModule->count = 1;
/* Call initialization rountines for all loaded DLLs. Note that
* when we load implicitly linked DLLs this will be done by the InitTask().
*/
if ((pModule->flags & (NE_FFLAGS_LIBMODULE | NE_FFLAGS_IMPLICIT)) ==
NE_FFLAGS_LIBMODULE ) NE_InitializeDLLs( hModule );
}
else /* module is already loaded, just create a new data segment if it's a task */
{
pModule = MODULE_GetPtr( hModule );
hPrevInstance = MODULE_GetInstance( hModule );
hInstance = MODULE_CreateInstance( hModule, params );
if (hInstance != hPrevInstance) /* not a library */
NE_LoadSegment( hModule, pModule->dgroup );
pModule->count++;
}
#else
lstrcpyn32A( ofs.szPathName, name, sizeof(ofs.szPathName) );
if ((hModule = MODULE_CreateDummyModule( &ofs )) < 32) return hModule;
pModule = (NE_MODULE *)GlobalLock16( hModule );
hPrevInstance = 0;
hInstance = MODULE_CreateInstance( hModule, params );
#endif /* WINELIB */
/* Create a task for this instance */
if (!(pModule->flags & NE_FFLAGS_LIBMODULE) && (paramBlock != (LPVOID)-1)) if (!(pModule->flags & NE_FFLAGS_LIBMODULE) && (paramBlock != (LPVOID)-1))
{ {
@ -1675,13 +1604,9 @@ HINSTANCE32 WINAPI WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow )
if (use_load_module) if (use_load_module)
{ {
#ifdef WINELIB /* Winelib: Use LoadModule() only for the program itself */
/* WINELIB: Use LoadModule() only for the program itself */ if (__winelib) use_load_module = 0;
use_load_module = 0;
params.hEnvironment = (HGLOBAL16)GetDOSEnvironment();
#else
params.hEnvironment = (HGLOBAL16)SELECTOROF( GetDOSEnvironment() ); params.hEnvironment = (HGLOBAL16)SELECTOROF( GetDOSEnvironment() );
#endif /* WINELIB */
params.cmdLine = (SEGPTR)WIN16_GlobalLock16( cmdLineHandle ); params.cmdLine = (SEGPTR)WIN16_GlobalLock16( cmdLineHandle );
params.showCmd = (SEGPTR)WIN16_GlobalLock16( cmdShowHandle ); params.showCmd = (SEGPTR)WIN16_GlobalLock16( cmdShowHandle );
params.reserved = 0; params.reserved = 0;
@ -1840,7 +1765,6 @@ FARPROC16 WINAPI GetProcAddress16( HMODULE16 hModule, SEGPTR name )
*/ */
FARPROC32 WINAPI GetProcAddress32( HMODULE32 hModule, LPCSTR function ) FARPROC32 WINAPI GetProcAddress32( HMODULE32 hModule, LPCSTR function )
{ {
#ifndef WINELIB
NE_MODULE *pModule; NE_MODULE *pModule;
if (HIWORD(function)) if (HIWORD(function))
@ -1858,9 +1782,6 @@ FARPROC32 WINAPI GetProcAddress32( HMODULE32 hModule, LPCSTR function )
return (FARPROC32)0; return (FARPROC32)0;
} }
return PE_FindExportedFunction( pModule->pe_module, function ); return PE_FindExportedFunction( pModule->pe_module, function );
#else
return NULL;
#endif
} }
/*********************************************************************** /***********************************************************************

View File

@ -16,6 +16,7 @@
#include <errno.h> #include <errno.h>
#include "neexe.h" #include "neexe.h"
#include "windows.h" #include "windows.h"
#include "global.h"
#include "task.h" #include "task.h"
#include "selectors.h" #include "selectors.h"
#include "callback.h" #include "callback.h"
@ -30,9 +31,8 @@
/*********************************************************************** /***********************************************************************
* NE_LoadSegment * NE_LoadSegment
*/ */
BOOL32 NE_LoadSegment( HMODULE16 hModule, WORD segnum ) BOOL32 NE_LoadSegment( NE_MODULE *pModule, WORD segnum )
{ {
NE_MODULE *pModule;
SEGTABLEENTRY *pSegTable, *pSeg; SEGTABLEENTRY *pSegTable, *pSeg;
WORD *pModuleTable; WORD *pModuleTable;
WORD count, i, offset; WORD count, i, offset;
@ -44,18 +44,17 @@ BOOL32 NE_LoadSegment( HMODULE16 hModule, WORD segnum )
int size; int size;
char* mem; char* mem;
char buffer[100]; char buffer[256];
int ordinal, additive; int ordinal, additive;
unsigned short *sp; unsigned short *sp;
if (!(pModule = MODULE_GetPtr( hModule ))) return FALSE;
pSegTable = NE_SEG_TABLE( pModule ); pSegTable = NE_SEG_TABLE( pModule );
pSeg = pSegTable + segnum - 1; pSeg = pSegTable + segnum - 1;
pModuleTable = NE_MODULE_TABLE( pModule ); pModuleTable = NE_MODULE_TABLE( pModule );
if (!pSeg->filepos) return TRUE; /* No file image, just return */ if (!pSeg->filepos) return TRUE; /* No file image, just return */
fd = MODULE_OpenFile( hModule ); fd = MODULE_OpenFile( pModule->self );
dprintf_module( stddeb, "Loading segment %d, selector=%04x\n", dprintf_module( stddeb, "Loading segment %d, selector=%04x\n",
segnum, pSeg->selector ); segnum, pSeg->selector );
lseek( fd, pSeg->filepos << pModule->alignment, SEEK_SET ); lseek( fd, pSeg->filepos << pModule->alignment, SEEK_SET );
@ -88,7 +87,7 @@ BOOL32 NE_LoadSegment( HMODULE16 hModule, WORD segnum )
stack16Top->ip = 0; stack16Top->ip = 0;
stack16Top->cs = 0; stack16Top->cs = 0;
newselector = Callbacks->CallLoadAppSegProc(selfloadheader->LoadAppSeg, newselector = Callbacks->CallLoadAppSegProc(selfloadheader->LoadAppSeg,
hModule, hf, segnum ); pModule->self, hf, segnum );
_lclose32( hf ); _lclose32( hf );
if (newselector != oldselector) { if (newselector != oldselector) {
/* Self loaders like creating their own selectors; /* Self loaders like creating their own selectors;
@ -218,16 +217,14 @@ BOOL32 NE_LoadSegment( HMODULE16 hModule, WORD segnum )
if (!address) if (!address)
{ {
NE_MODULE *pTarget = MODULE_GetPtr( module ); NE_MODULE *pTarget = MODULE_GetPtr( module );
fprintf( stderr, "Warning: no handler for %*.*s.%s, setting to 0:0\n", fprintf( stderr, "Warning: no handler for %.*s.%s, setting to 0:0\n",
*((BYTE *)pTarget + pTarget->name_table),
*((BYTE *)pTarget + pTarget->name_table), *((BYTE *)pTarget + pTarget->name_table),
(char *)pTarget + pTarget->name_table + 1, func_name ); (char *)pTarget + pTarget->name_table + 1, func_name );
} }
if (debugging_fixup) if (debugging_fixup)
{ {
NE_MODULE *pTarget = MODULE_GetPtr( module ); NE_MODULE *pTarget = MODULE_GetPtr( module );
fprintf( stddeb,"%d: %*.*s.%s=%04x:%04x\n", i + 1, fprintf( stddeb,"%d: %.*s.%s=%04x:%04x\n", i + 1,
*((BYTE *)pTarget + pTarget->name_table),
*((BYTE *)pTarget + pTarget->name_table), *((BYTE *)pTarget + pTarget->name_table),
(char *)pTarget + pTarget->name_table + 1, (char *)pTarget + pTarget->name_table + 1,
func_name, HIWORD(address), LOWORD(address) ); func_name, HIWORD(address), LOWORD(address) );
@ -237,7 +234,7 @@ BOOL32 NE_LoadSegment( HMODULE16 hModule, WORD segnum )
case NE_RELTYPE_INTERNAL: case NE_RELTYPE_INTERNAL:
if ((rep->target1 & 0xff) == 0xff) if ((rep->target1 & 0xff) == 0xff)
{ {
address = MODULE_GetEntryPoint( hModule, rep->target2 ); address = MODULE_GetEntryPoint( pModule->self, rep->target2 );
} }
else else
{ {
@ -282,7 +279,7 @@ BOOL32 NE_LoadSegment( HMODULE16 hModule, WORD segnum )
/* we ignore it for now */ /* we ignore it for now */
if (rep->address_type > NE_RADDR_OFFSET32) if (rep->address_type > NE_RADDR_OFFSET32)
fprintf( stderr, "WARNING: module %s: unknown reloc addr type = 0x%02x. Please report.\n", fprintf( stderr, "WARNING: module %s: unknown reloc addr type = 0x%02x. Please report.\n",
MODULE_GetModuleName(hModule), rep->address_type ); MODULE_GetModuleName(pModule->self), rep->address_type );
switch (rep->address_type & 0x7f) switch (rep->address_type & 0x7f)
{ {
@ -357,6 +354,122 @@ BOOL32 NE_LoadSegment( HMODULE16 hModule, WORD segnum )
} }
/***********************************************************************
* NE_LoadAllSegments
*/
BOOL32 NE_LoadAllSegments( NE_MODULE *pModule )
{
int i;
if (pModule->flags & NE_FFLAGS_SELFLOAD)
{
HFILE32 hf;
/* Handle self loading modules */
SEGTABLEENTRY * pSegTable = (SEGTABLEENTRY *) NE_SEG_TABLE(pModule);
SELFLOADHEADER *selfloadheader;
STACK16FRAME *stack16Top;
HMODULE16 hselfload = GetModuleHandle16("WPROCS");
DWORD oldstack;
WORD saved_dgroup = pSegTable[pModule->dgroup - 1].selector;
dprintf_module(stddeb, "MODULE_Load: %.*s is a self-loading module!\n",
*((BYTE*)pModule + pModule->name_table),
(char *)pModule + pModule->name_table + 1);
if (!NE_LoadSegment( pModule, 1 )) return FALSE;
selfloadheader = (SELFLOADHEADER *)
PTR_SEG_OFF_TO_LIN(pSegTable->selector, 0);
selfloadheader->EntryAddrProc = MODULE_GetEntryPoint(hselfload,27);
selfloadheader->MyAlloc = MODULE_GetEntryPoint(hselfload,28);
selfloadheader->SetOwner = MODULE_GetEntryPoint(GetModuleHandle16("KERNEL"),403);
pModule->self_loading_sel = GlobalHandleToSel(GLOBAL_Alloc(GMEM_ZEROINIT, 0xFF00, pModule->self, FALSE, FALSE, FALSE));
oldstack = IF1632_Saved16_ss_sp;
IF1632_Saved16_ss_sp = PTR_SEG_OFF_TO_SEGPTR(pModule->self_loading_sel,
0xff00 - sizeof(*stack16Top) );
stack16Top = CURRENT_STACK16;
stack16Top->saved_ss_sp = 0;
stack16Top->ebp = 0;
stack16Top->ds = stack16Top->es = pModule->self_loading_sel;
stack16Top->entry_point = 0;
stack16Top->entry_ip = 0;
stack16Top->entry_cs = 0;
stack16Top->bp = 0;
stack16Top->ip = 0;
stack16Top->cs = 0;
hf = FILE_DupUnixHandle( MODULE_OpenFile( pModule->self ) );
Callbacks->CallBootAppProc(selfloadheader->BootApp, pModule->self, hf);
_lclose32(hf);
/* some BootApp procs overwrite the selector of dgroup */
pSegTable[pModule->dgroup - 1].selector = saved_dgroup;
IF1632_Saved16_ss_sp = oldstack;
for (i = 2; i <= pModule->seg_count; i++)
if (!NE_LoadSegment( pModule, i )) return FALSE;
}
else
{
for (i = 1; i <= pModule->seg_count; i++)
if (!NE_LoadSegment( pModule, i )) return FALSE;
}
return TRUE;
}
/***********************************************************************
* NE_LoadDLLs
*/
BOOL32 NE_LoadDLLs( NE_MODULE *pModule )
{
int i;
WORD *pModRef = (WORD *)((char *)pModule + pModule->modref_table);
WORD *pDLLs = (WORD *)GlobalLock16( pModule->dlls_to_init );
for (i = 0; i < pModule->modref_count; i++, pModRef++)
{
char buffer[256];
BYTE *pstr = (BYTE *)pModule + pModule->import_table + *pModRef;
memcpy( buffer, pstr + 1, *pstr );
strcpy( buffer + *pstr, ".dll" );
dprintf_module( stddeb, "Loading '%s'\n", buffer );
if (!(*pModRef = MODULE_FindModule( buffer )))
{
/* If the DLL is not loaded yet, load it and store */
/* its handle in the list of DLLs to initialize. */
HMODULE16 hDLL;
if ((hDLL = MODULE_Load( buffer, (LPVOID)-1, NE_FFLAGS_IMPLICIT )) == 2)
{
/* file not found */
char *p;
/* Try with prepending the path of the current module */
GetModuleFileName16( pModule->self, buffer, sizeof(buffer) );
if (!(p = strrchr( buffer, '\\' ))) p = buffer;
memcpy( p + 1, pstr + 1, *pstr );
strcpy( p + 1 + *pstr, ".dll" );
hDLL = MODULE_Load( buffer, (LPVOID)-1, NE_FFLAGS_IMPLICIT );
}
if (hDLL < 32)
{
/* FIXME: cleanup what was done */
fprintf( stderr, "Could not load '%s' required by '%.*s', error = %d\n",
buffer, *((BYTE*)pModule + pModule->name_table),
(char *)pModule + pModule->name_table + 1, hDLL );
return FALSE;
}
*pModRef = MODULE_HANDLEtoHMODULE16( hDLL );
*pDLLs++ = *pModRef;
}
else /* Increment the reference count of the DLL */
{
NE_MODULE *pOldDLL = MODULE_GetPtr( *pModRef );
if (pOldDLL) pOldDLL->count++;
}
}
return TRUE;
}
/*********************************************************************** /***********************************************************************
* NE_FixupPrologs * NE_FixupPrologs
* *

View File

@ -34,9 +34,6 @@
#include "stddebug.h" #include "stddebug.h"
#include "debug.h" #include "debug.h"
#include "xmalloc.h" #include "xmalloc.h"
#ifndef WINELIB
#include "debugger.h"
#endif
static void PE_InitDLL(PE_MODREF* modref, DWORD type, LPVOID lpReserved); static void PE_InitDLL(PE_MODREF* modref, DWORD type, LPVOID lpReserved);
@ -49,7 +46,7 @@ void dump_exports(IMAGE_EXPORT_DIRECTORY * pe_exports, unsigned int load_addr)
int i, j; int i, j;
u_short *ordinal; u_short *ordinal;
u_long *function,*functions; u_long *function,*functions;
u_char **name,*ename; u_char **name;
Module = (char*)RVA(pe_exports->Name); Module = (char*)RVA(pe_exports->Name);
dprintf_win32(stddeb,"\n*******EXPORT DATA*******\nModule name is %s, %ld functions, %ld names\n", dprintf_win32(stddeb,"\n*******EXPORT DATA*******\nModule name is %s, %ld functions, %ld names\n",
@ -65,7 +62,7 @@ void dump_exports(IMAGE_EXPORT_DIRECTORY * pe_exports, unsigned int load_addr)
for (i=0;i<pe_exports->NumberOfFunctions;i++, function++) for (i=0;i<pe_exports->NumberOfFunctions;i++, function++)
{ {
if (!*function) continue; /* No such function */ if (!*function) continue; /* No such function */
dprintf_win32( stddeb,"%4d %08lx", i + pe_exports->Base, *function ); dprintf_win32( stddeb,"%4ld %08lx", i + pe_exports->Base, *function );
/* Check if we have a name for it */ /* Check if we have a name for it */
for (j = 0; j < pe_exports->NumberOfNames; j++) for (j = 0; j < pe_exports->NumberOfNames; j++)
if (ordinal[j] == i) if (ordinal[j] == i)
@ -584,16 +581,6 @@ PE_MapImage(PE_MODULE *pe,PDB32 *process, OFSTRUCT *ofs, DWORD flags) {
pem->pe_reloc = (void *) RVA(dir.VirtualAddress); pem->pe_reloc = (void *) RVA(dir.VirtualAddress);
} }
#ifndef WINELIB
if(pe->pe_header->OptionalHeader.DataDirectory
[IMAGE_DIRECTORY_ENTRY_DEBUG].Size)
{
DEBUG_RegisterDebugInfo(pe, load_addr,
pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress,
pe->pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size);
}
#endif
if(pe->pe_header->OptionalHeader.DataDirectory if(pe->pe_header->OptionalHeader.DataDirectory
[IMAGE_DIRECTORY_ENTRY_COPYRIGHT].Size) [IMAGE_DIRECTORY_ENTRY_COPYRIGHT].Size)
dprintf_win32(stdnimp,"Copyright string ignored\n"); dprintf_win32(stdnimp,"Copyright string ignored\n");
@ -667,20 +654,17 @@ HMODULE32 PE_LoadLibraryEx32A (LPCSTR name, HFILE32 hFile, DWORD flags) {
pModule = MODULE_GetPtr(hModule); pModule = MODULE_GetPtr(hModule);
} else { } else {
#ifndef WINELIB
/* try to load builtin, enabled modules first */ /* try to load builtin, enabled modules first */
if ((hModule = BUILTIN_LoadModule( name, FALSE ))) if ((hModule = BUILTIN_LoadModule( name, FALSE )))
return hModule; return hModule;
#endif
/* try to open the specified file */ /* try to open the specified file */
if (HFILE_ERROR32==(hFile=OpenFile32(name,&ofs,OF_READ))) { if (HFILE_ERROR32==(hFile=OpenFile32(name,&ofs,OF_READ))) {
#ifndef WINELIB
/* Now try the built-in even if disabled */ /* Now try the built-in even if disabled */
if ((hModule = BUILTIN_LoadModule( name, TRUE ))) { if ((hModule = BUILTIN_LoadModule( name, TRUE ))) {
fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name ); fprintf( stderr, "Warning: could not load Windows DLL '%s', using built-in module.\n", name );
return hModule; return hModule;
} }
#endif
return 1; return 1;
} }
if ((hModule = MODULE_CreateDummyModule( &ofs )) < 32) { if ((hModule = MODULE_CreateDummyModule( &ofs )) < 32) {

View File

@ -18,7 +18,6 @@
#include "heap.h" #include "heap.h"
#include "neexe.h" #include "neexe.h"
#include "task.h" #include "task.h"
#include "accel.h"
#include "module.h" #include "module.h"
#include "resource.h" #include "resource.h"
#include "stddebug.h" #include "stddebug.h"
@ -63,14 +62,16 @@ HRSRC16 WINAPI FindResource16( HMODULE16 hModule, SEGPTR name, SEGPTR type )
if ((pModule = MODULE_GetPtr( hModule ))) if ((pModule = MODULE_GetPtr( hModule )))
{ {
#ifndef WINELIB if (!__winelib)
if (pModule->flags & NE_FFLAGS_WIN32) {
fprintf(stderr,"FindResource16: %s", NEWin32FailureString); if (pModule->flags & NE_FFLAGS_WIN32)
else fprintf(stderr,"FindResource16: %s", NEWin32FailureString);
return NE_FindResource( hModule, type, name ); else
#else return NE_FindResource( hModule, type, name );
return LIBRES_FindResource16( hModule, name, type ); }
#endif else return LIBRES_FindResource16( hModule,
(LPCSTR)PTR_SEG_TO_LIN(name),
(LPCSTR)PTR_SEG_TO_LIN(type) );
} }
return 0; return 0;
} }
@ -114,28 +115,29 @@ HANDLE32 WINAPI FindResourceEx32A( HINSTANCE32 hModule, LPCSTR name,
HRSRC32 WINAPI FindResourceEx32W( HINSTANCE32 hModule, LPCWSTR name, HRSRC32 WINAPI FindResourceEx32W( HINSTANCE32 hModule, LPCWSTR name,
LPCWSTR type, WORD lang ) LPCWSTR type, WORD lang )
{ {
#ifndef WINELIB if (!__winelib)
NE_MODULE *pModule; {
NE_MODULE *pModule;
if (!hModule) hModule = GetTaskDS(); if (!hModule) hModule = GetTaskDS();
hModule = MODULE_HANDLEtoHMODULE32( hModule ); hModule = MODULE_HANDLEtoHMODULE32( hModule );
dprintf_resource(stddeb, "FindResource32W: module=%08x type=", hModule ); dprintf_resource(stddeb, "FindResource32W: module=%08x type=",
if (HIWORD(type)) hModule );
dprintf_resource(stddeb,"%p",type); if (HIWORD(type))
else dprintf_resource(stddeb,"%p",type);
dprintf_resource(stddeb,"#%p",type); else
dprintf_resource( stddeb, " name=" ); dprintf_resource(stddeb,"#%p",type);
if (HIWORD(name)) dprintf_resource( stddeb, " name=" );
dprintf_resource(stddeb,"%p",name); if (HIWORD(name))
else dprintf_resource(stddeb,"%p",name);
dprintf_resource(stddeb,"#%p",name); else
dprintf_resource( stddeb, "\n" ); dprintf_resource(stddeb,"#%p",name);
if (!(pModule = MODULE_GetPtr( hModule ))) return 0; dprintf_resource( stddeb, "\n" );
if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0; if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
return PE_FindResourceEx32W(hModule,name,type,lang); if (!(pModule->flags & NE_FFLAGS_WIN32)) return 0;
#else return PE_FindResourceEx32W(hModule,name,type,lang);
return LIBRES_FindResource32( hModule, name, type ); }
#endif else return LIBRES_FindResource32( hModule, name, type );
} }
/********************************************************************** /**********************************************************************
@ -160,14 +162,14 @@ HGLOBAL16 WINAPI LoadResource16( HMODULE16 hModule, HRSRC16 hRsrc )
if (!hRsrc) return 0; if (!hRsrc) return 0;
if ((pModule = MODULE_GetPtr( hModule ))) if ((pModule = MODULE_GetPtr( hModule )))
{ {
#ifndef WINELIB if (!__winelib)
if (pModule->flags & NE_FFLAGS_WIN32) {
fprintf(stderr,"LoadResource16: %s", NEWin32FailureString); if (pModule->flags & NE_FFLAGS_WIN32)
else fprintf(stderr,"LoadResource16: %s", NEWin32FailureString);
return NE_LoadResource( hModule, hRsrc ); else
#else return NE_LoadResource( hModule, hRsrc );
return LIBRES_LoadResource( hModule, hRsrc ); }
#endif else return LIBRES_LoadResource( hModule, hRsrc );
} }
return 0; return 0;
} }
@ -177,25 +179,25 @@ HGLOBAL16 WINAPI LoadResource16( HMODULE16 hModule, HRSRC16 hRsrc )
*/ */
HGLOBAL32 WINAPI LoadResource32( HINSTANCE32 hModule, HRSRC32 hRsrc ) HGLOBAL32 WINAPI LoadResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
{ {
#ifndef WINELIB if (!__winelib)
NE_MODULE *pModule;
if (!hModule) hModule = GetTaskDS(); /* FIXME: see FindResource32W */
hModule = MODULE_HANDLEtoHMODULE32( hModule );
dprintf_resource(stddeb, "LoadResource32: module=%04x res=%04x\n",
hModule, hRsrc );
if (!hRsrc) return 0;
if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
if (!(pModule->flags & NE_FFLAGS_WIN32))
{ {
fprintf(stderr,"LoadResource32: %s", PEWin16FailureString ); NE_MODULE *pModule;
return 0; /* FIXME? */
if (!hModule) hModule = GetTaskDS(); /* FIXME: see FindResource32W */
hModule = MODULE_HANDLEtoHMODULE32( hModule );
dprintf_resource(stddeb, "LoadResource32: module=%04x res=%04x\n",
hModule, hRsrc );
if (!hRsrc) return 0;
if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
if (!(pModule->flags & NE_FFLAGS_WIN32))
{
fprintf(stderr,"LoadResource32: %s", PEWin16FailureString );
return 0; /* FIXME? */
}
return PE_LoadResource32(hModule,hRsrc);
} }
return PE_LoadResource32(hModule,hRsrc); else return LIBRES_LoadResource( hModule, hRsrc );
#else
return LIBRES_LoadResource( hModule, hRsrc );
#endif
} }
@ -205,7 +207,6 @@ HGLOBAL32 WINAPI LoadResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
/* 16-bit version */ /* 16-bit version */
SEGPTR WINAPI WIN16_LockResource16(HGLOBAL16 handle) SEGPTR WINAPI WIN16_LockResource16(HGLOBAL16 handle)
{ {
#ifndef WINELIB
HMODULE16 hModule; HMODULE16 hModule;
NE_MODULE *pModule; NE_MODULE *pModule;
@ -219,31 +220,28 @@ SEGPTR WINAPI WIN16_LockResource16(HGLOBAL16 handle)
return 0; return 0;
} }
return NE_LockResource( hModule, handle ); return NE_LockResource( hModule, handle );
#else
return LIBRES_LockResource( handle );
#endif
} }
/* WINELIB 16-bit version */ /* Winelib 16-bit version */
LPVOID WINAPI LockResource16( HGLOBAL16 handle ) LPVOID WINAPI LockResource16( HGLOBAL16 handle )
{ {
#ifndef WINELIB if (!__winelib)
HMODULE16 hModule;
NE_MODULE *pModule;
dprintf_resource(stddeb, "LockResource: handle=%04x\n", handle );
if (!handle) return NULL;
hModule = MODULE_HANDLEtoHMODULE16( handle );
if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
if (pModule->flags & NE_FFLAGS_WIN32)
{ {
fprintf(stderr,"LockResource16: %s", NEWin32FailureString); HMODULE16 hModule;
return 0; NE_MODULE *pModule;
dprintf_resource(stddeb, "LockResource: handle=%04x\n", handle );
if (!handle) return NULL;
hModule = MODULE_HANDLEtoHMODULE16( handle );
if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
if (pModule->flags & NE_FFLAGS_WIN32)
{
fprintf(stderr,"LockResource16: %s", NEWin32FailureString);
return 0;
}
return (LPSTR)PTR_SEG_TO_LIN( NE_LockResource( hModule, handle ) );
} }
return (LPSTR)PTR_SEG_TO_LIN( NE_LockResource( hModule, handle ) ); else return LIBRES_LockResource( handle );
#else
return LIBRES_LockResource( handle );
#endif
} }
@ -261,23 +259,23 @@ LPVOID WINAPI LockResource32( HGLOBAL32 handle )
*/ */
BOOL16 WINAPI FreeResource16( HGLOBAL16 handle ) BOOL16 WINAPI FreeResource16( HGLOBAL16 handle )
{ {
#ifndef WINELIB if (!__winelib)
HMODULE16 hModule;
NE_MODULE *pModule;
dprintf_resource(stddeb, "FreeResource16: handle=%04x\n", handle );
if (!handle) return FALSE;
hModule = MODULE_HANDLEtoHMODULE16( handle );
if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
if (pModule->flags & NE_FFLAGS_WIN32)
{ {
fprintf(stderr,"FreeResource16: %s", NEWin32FailureString); HMODULE16 hModule;
return 0; NE_MODULE *pModule;
dprintf_resource(stddeb, "FreeResource16: handle=%04x\n", handle );
if (!handle) return FALSE;
hModule = MODULE_HANDLEtoHMODULE16( handle );
if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
if (pModule->flags & NE_FFLAGS_WIN32)
{
fprintf(stderr,"FreeResource16: %s", NEWin32FailureString);
return 0;
}
return NE_FreeResource( hModule, handle );
} }
return NE_FreeResource( hModule, handle ); else return LIBRES_FreeResource( handle );
#else
return LIBRES_FreeResource( handle );
#endif
} }
/********************************************************************** /**********************************************************************
@ -302,16 +300,16 @@ INT16 WINAPI AccessResource16( HINSTANCE16 hModule, HRSRC16 hRsrc )
hModule, hRsrc ); hModule, hRsrc );
if (!hRsrc) return 0; if (!hRsrc) return 0;
if (!(pModule = MODULE_GetPtr( hModule ))) return 0; if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
#ifndef WINELIB if (!__winelib)
if (pModule->flags & NE_FFLAGS_WIN32)
{ {
fprintf(stderr,"AccessResource16: %s", NEWin32FailureString); if (pModule->flags & NE_FFLAGS_WIN32)
return 0; {
fprintf(stderr,"AccessResource16: %s", NEWin32FailureString);
return 0;
}
return NE_AccessResource( hModule, hRsrc );
} }
return NE_AccessResource( hModule, hRsrc ); else return LIBRES_AccessResource( hModule, hRsrc );
#else
return LIBRES_AccessResource( hModule, hRsrc );
#endif
} }
@ -340,16 +338,16 @@ DWORD WINAPI SizeofResource16( HMODULE16 hModule, HRSRC16 hRsrc )
dprintf_resource(stddeb, "SizeofResource16: module=%04x res=%04x\n", dprintf_resource(stddeb, "SizeofResource16: module=%04x res=%04x\n",
hModule, hRsrc ); hModule, hRsrc );
if (!(pModule = MODULE_GetPtr( hModule ))) return 0; if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
#ifndef WINELIB if (!__winelib)
if (pModule->flags & NE_FFLAGS_WIN32)
{ {
fprintf(stderr,"SizeOfResource16: %s", NEWin32FailureString); if (pModule->flags & NE_FFLAGS_WIN32)
return 0; {
fprintf(stderr,"SizeOfResource16: %s", NEWin32FailureString);
return 0;
}
return NE_SizeofResource( hModule, hRsrc );
} }
return NE_SizeofResource( hModule, hRsrc ); else return LIBRES_SizeofResource( hModule, hRsrc );
#else
return LIBRES_SizeofResource( hModule, hRsrc );
#endif
} }
@ -361,12 +359,12 @@ DWORD WINAPI SizeofResource32( HINSTANCE32 hModule, HRSRC32 hRsrc )
hModule = MODULE_HANDLEtoHMODULE32( hModule ); hModule = MODULE_HANDLEtoHMODULE32( hModule );
dprintf_resource(stddeb, "SizeofResource32: module=%04x res=%04x\n", dprintf_resource(stddeb, "SizeofResource32: module=%04x res=%04x\n",
hModule, hRsrc ); hModule, hRsrc );
#ifndef WINELIB if (!__winelib) return PE_SizeofResource32(hModule,hRsrc);
return PE_SizeofResource32(hModule,hRsrc); else
#else {
fprintf(stderr,"SizeofResource32: not implemented\n"); fprintf(stderr,"SizeofResource32: not implemented\n");
return 0; return 0;
#endif }
} }
@ -382,16 +380,16 @@ HGLOBAL16 WINAPI AllocResource16( HMODULE16 hModule, HRSRC16 hRsrc, DWORD size)
hModule, hRsrc, size ); hModule, hRsrc, size );
if (!hRsrc) return 0; if (!hRsrc) return 0;
if (!(pModule = MODULE_GetPtr( hModule ))) return 0; if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
#ifndef WINELIB if (!__winelib)
if (pModule->flags & NE_FFLAGS_WIN32)
{ {
fprintf(stderr,"AllocResource16: %s", NEWin32FailureString); if (pModule->flags & NE_FFLAGS_WIN32)
return 0; {
fprintf(stderr,"AllocResource16: %s", NEWin32FailureString);
return 0;
}
return NE_AllocResource( hModule, hRsrc, size );
} }
return NE_AllocResource( hModule, hRsrc, size ); else return LIBRES_AllocResource( hModule, hRsrc, size );
#else
return LIBRES_AllocResource( hModule, hRsrc, size );
#endif
} }
/********************************************************************** /**********************************************************************
@ -471,7 +469,33 @@ HACCEL32 WINAPI LoadAccelerators32A(HINSTANCE32 instance,LPCSTR lpTableName)
return result; return result;
} }
/**********************************************************************
* CopyAcceleratorTable32A (USER32.58)
*/
INT32 WINAPI CopyAcceleratorTable32A(HACCEL32 src, LPACCEL32 dst, INT32 entries)
{
fprintf(stderr,"CopyAcceleratorTable32A: not implemented: %d\n", entries);
return 0;
}
/**********************************************************************
* CopyAcceleratorTable32W (USER32.59)
*/
INT32 WINAPI CopyAcceleratorTable32W(HACCEL32 src, LPACCEL32 dst, INT32 entries)
{
fprintf(stderr,"CopyAcceleratorTable32W: not implemented: %d\n", entries);
return 0;
}
/**********************************************************************
* DestroyAcceleratorTable (USER32.130)
*/
BOOL32 WINAPI DestroyAcceleratorTable( HACCEL32 handle )
{
fprintf(stderr,"DestroyAcceleratorTable: not implemented\n");
return TRUE;
}
/********************************************************************** /**********************************************************************
* LoadString16 * LoadString16
*/ */

View File

@ -65,9 +65,7 @@ BOOL32 TASK_Init(void)
if (!(hDOSEnvironment = TASK_CreateDOSEnvironment())) if (!(hDOSEnvironment = TASK_CreateDOSEnvironment()))
fprintf( stderr, "Not enough memory for DOS Environment\n" ); fprintf( stderr, "Not enough memory for DOS Environment\n" );
TASK_SystemTHDB.teb_sel = SELECTOR_AllocBlock( &TASK_SystemTHDB, 0x1000, SEGMENT_DATA, TRUE, FALSE ); TASK_SystemTHDB.teb_sel = SELECTOR_AllocBlock( &TASK_SystemTHDB, 0x1000, SEGMENT_DATA, TRUE, FALSE );
#ifdef __i386__ SET_FS( TASK_SystemTHDB.teb_sel );
__asm__ __volatile__("movw %w0,%%fs"::"r"(TASK_SystemTHDB.teb_sel));
#endif
return (hDOSEnvironment != 0); return (hDOSEnvironment != 0);
} }
@ -334,7 +332,6 @@ static BOOL32 TASK_FreeThunk( HTASK16 hTask, SEGPTR thunk )
* 32-bit entry point for a new task. This function is responsible for * 32-bit entry point for a new task. This function is responsible for
* setting up the registers and jumping to the 16-bit entry point. * setting up the registers and jumping to the 16-bit entry point.
*/ */
#ifndef WINELIB
static void TASK_CallToStart(void) static void TASK_CallToStart(void)
{ {
int exit_code = 1; int exit_code = 1;
@ -354,9 +351,7 @@ static void TASK_CallToStart(void)
InitTask( NULL ); InitTask( NULL );
InitApp( pTask->hModule ); InitApp( pTask->hModule );
#ifdef __i386__ SET_FS( pCurrentThread->teb_sel );
__asm__ __volatile__("movw %w0,%%fs"::"r" (pCurrentThread->teb_sel));
#endif
PE_InitializeDLLs( pCurrentProcess, DLL_PROCESS_ATTACH, (LPVOID)-1 ); PE_InitializeDLLs( pCurrentProcess, DLL_PROCESS_ATTACH, (LPVOID)-1 );
dprintf_relay( stddeb, "CallTo32(entryproc=%p)\n", entry ); dprintf_relay( stddeb, "CallTo32(entryproc=%p)\n", entry );
exit_code = entry(); exit_code = entry();
@ -398,7 +393,6 @@ static void TASK_CallToStart(void)
TASK_KillCurrentTask( 1 ); TASK_KillCurrentTask( 1 );
} }
} }
#endif
/*********************************************************************** /***********************************************************************
@ -415,13 +409,10 @@ HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
NE_MODULE *pModule; NE_MODULE *pModule;
SEGTABLEENTRY *pSegTable; SEGTABLEENTRY *pSegTable;
LPSTR name; LPSTR name;
WORD sp;
char *stack32Top; char *stack32Top;
STACK16FRAME *frame16; STACK16FRAME *frame16;
STACK32FRAME *frame32; STACK32FRAME *frame32;
#ifndef WINELIB
extern DWORD CALLTO16_RetAddr_regs;
extern void CALLTO16_Restore();
#endif
if (!(pModule = MODULE_GetPtr( hModule ))) return 0; if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
pSegTable = NE_SEG_TABLE( pModule ); pSegTable = NE_SEG_TABLE( pModule );
@ -489,10 +480,8 @@ HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
pTask->pdb.int20 = 0x20cd; pTask->pdb.int20 = 0x20cd;
pTask->pdb.dispatcher[0] = 0x9a; /* ljmp */ pTask->pdb.dispatcher[0] = 0x9a; /* ljmp */
#ifndef WINELIB PUT_DWORD(&pTask->pdb.dispatcher[1], (DWORD)MODULE_GetEntryPoint(
*(FARPROC16 *)&pTask->pdb.dispatcher[1] = MODULE_GetEntryPoint( GetModuleHandle16("KERNEL"), 102 )); /* KERNEL.102 is DOS3Call() */
GetModuleHandle16("KERNEL"), 102 ); /* KERNEL.102 is DOS3Call() */
#endif
pTask->pdb.savedint22 = INT_GetHandler( 0x22 ); pTask->pdb.savedint22 = INT_GetHandler( 0x22 );
pTask->pdb.savedint23 = INT_GetHandler( 0x23 ); pTask->pdb.savedint23 = INT_GetHandler( 0x23 );
pTask->pdb.savedint24 = INT_GetHandler( 0x24 ); pTask->pdb.savedint24 = INT_GetHandler( 0x24 );
@ -538,11 +527,9 @@ HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
pCurrentProcess->exe_modref->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint); pCurrentProcess->exe_modref->pe_module->pe_header->OptionalHeader.AddressOfEntryPoint);
*/ */
pTask->thdb = THREAD_Create( pdb32, 0, 0 ); pTask->thdb = THREAD_Create( pdb32, 0, 0 );
#ifndef WINELIB
/* FIXME: should not be done here */ /* FIXME: should not be done here */
pCurrentThread = pTask->thdb; pCurrentThread = pTask->thdb;
PE_InitTls( pdb32 ); PE_InitTls( pdb32 );
#endif
} }
else else
pTask->thdb = THREAD_Create( pdb32, 0, NULL ); pTask->thdb = THREAD_Create( pdb32, 0, NULL );
@ -558,32 +545,26 @@ HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
frame32->edx = 0; frame32->edx = 0;
frame32->ecx = 0; frame32->ecx = 0;
frame32->ebx = 0; frame32->ebx = 0;
frame32->ebp = 0;
#ifndef WINELIB
frame32->restore_addr = (DWORD)CALLTO16_Restore;
frame32->retaddr = (DWORD)TASK_CallToStart; frame32->retaddr = (DWORD)TASK_CallToStart;
frame32->codeselector = WINE_CODE_SELECTOR; /* The remaining fields will be initialized in TASK_Reschedule */
#endif
/* Create the 16-bit stack frame */ /* Create the 16-bit stack frame */
pTask->ss_sp = PTR_SEG_OFF_TO_SEGPTR( hInstance, if (!(sp = pModule->sp))
((pModule->sp != 0) ? pModule->sp : sp = pSegTable[pModule->ss-1].minsize + pModule->stack_size;
pSegTable[pModule->ss-1].minsize + pModule->stack_size) & ~1 ); sp &= ~1;
pTask->ss_sp -= sizeof(STACK16FRAME) - sizeof(DWORD) /* for saved %esp */; pTask->ss_sp = PTR_SEG_OFF_TO_SEGPTR( hInstance, sp );
pTask->ss_sp -= sizeof(STACK16FRAME) + sizeof(DWORD) /* for saved %esp */;
frame16 = (STACK16FRAME *)PTR_SEG_TO_LIN( pTask->ss_sp ); frame16 = (STACK16FRAME *)PTR_SEG_TO_LIN( pTask->ss_sp );
frame16->saved_ss_sp = 0; frame16->saved_ss_sp = 0;
frame16->ebp = 0; frame16->ebp = sp + (int)&((STACK16FRAME *)0)->bp;
frame16->bp = LOWORD(frame16->ebp);
frame16->ds = frame16->es = pTask->hInstance; frame16->ds = frame16->es = pTask->hInstance;
frame16->entry_point = 0; frame16->entry_point = 0;
frame16->entry_ip = 0;
frame16->entry_cs = 0; frame16->entry_cs = 0;
frame16->bp = 0; /* The remaining fields will be initialized in TASK_Reschedule */
*(STACK32FRAME **)(frame16 + 1) = frame32; /* Store the 32-bit %esp */ *(STACK32FRAME **)(frame16 + 1) = frame32; /* Store the 32-bit %esp */
#ifndef WINELIB
frame16->ip = LOWORD( CALLTO16_RetAddr_regs );
frame16->cs = HIWORD( CALLTO16_RetAddr_regs );
#endif /* WINELIB */
/* If there's no 16-bit stack yet, use a part of the new task stack */ /* If there's no 16-bit stack yet, use a part of the new task stack */
/* This is only needed to have a stack to switch from on the first */ /* This is only needed to have a stack to switch from on the first */
@ -717,6 +698,7 @@ void TASK_Reschedule(void)
{ {
TDB *pOldTask = NULL, *pNewTask; TDB *pOldTask = NULL, *pNewTask;
HTASK16 hTask = 0; HTASK16 hTask = 0;
STACK16FRAME *newframe16;
#ifdef CONFIG_IPC #ifdef CONFIG_IPC
dde_reschedule(); dde_reschedule();
@ -788,6 +770,23 @@ void TASK_Reschedule(void)
TASK_LinkTask( hTask ); TASK_LinkTask( hTask );
pNewTask->priority--; pNewTask->priority--;
/* Finish initializing the new task stack if necessary */
newframe16 = (STACK16FRAME *)PTR_SEG_TO_LIN( pNewTask->ss_sp );
if (!newframe16->entry_cs)
{
STACK16FRAME *oldframe16 = CURRENT_STACK16;
STACK32FRAME *oldframe32 = *(STACK32FRAME **)(oldframe16 + 1);
STACK32FRAME *newframe32 = *(STACK32FRAME **)(newframe16 + 1);
newframe16->entry_ip = oldframe16->entry_ip;
newframe16->entry_cs = oldframe16->entry_cs;
newframe16->ip = oldframe16->ip;
newframe16->cs = oldframe16->cs;
newframe32->ebp = oldframe32->ebp;
newframe32->restore_addr = oldframe32->restore_addr;
newframe32->codeselector = oldframe32->codeselector;
}
/* Switch to the new stack */ /* Switch to the new stack */
hCurrentTask = hTask; hCurrentTask = hTask;

View File

@ -1,4 +1,4 @@
DEFS = -D__WINE__ DEFS = @DLLFLAGS@ -D__WINE__
TOPSRCDIR = @top_srcdir@ TOPSRCDIR = @top_srcdir@
TOPOBJDIR = .. TOPOBJDIR = ..
SRCDIR = @srcdir@ SRCDIR = @srcdir@

View File

@ -144,16 +144,14 @@ void SELECTOR_FreeBlock( WORD sel, WORD count )
/* Check if we are freeing current %fs or %gs selector */ /* Check if we are freeing current %fs or %gs selector */
WORD fs, gs; WORD fs, gs;
GET_FS(fs);
__asm__("movw %%fs,%w0":"=r" (fs));
if ((fs >= sel) && (fs < nextsel)) if ((fs >= sel) && (fs < nextsel))
{ {
fprintf( stderr, "SELECTOR_FreeBlock: freeing %%fs selector (%04x), not good.\n", fs ); fprintf( stderr, "SELECTOR_FreeBlock: freeing %%fs selector (%04x), not good.\n", fs );
__asm__("movw %w0,%%fs"::"r" (0)); SET_FS( 0 );
} }
__asm__("movw %%gs,%w0":"=r" (gs)); GET_GS(gs);
if ((gs >= sel) && (gs < nextsel)) if ((gs >= sel) && (gs < nextsel)) SET_GS( 0 );
__asm__("movw %w0,%%gs"::"r" (0));
} }
#endif /* __i386__ */ #endif /* __i386__ */

View File

@ -12,6 +12,7 @@
#include "ldt.h" #include "ldt.h"
#include "stddebug.h" #include "stddebug.h"
#include "debug.h" #include "debug.h"
#include "debugstr.h"
static const BYTE STRING_Oem2Ansi[256] = static const BYTE STRING_Oem2Ansi[256] =
"\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\244" "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\244"
@ -77,8 +78,8 @@ SEGPTR WINAPI lstrcat16( SEGPTR dst, LPCSTR src )
*/ */
LPSTR WINAPI lstrcat32A( LPSTR dst, LPCSTR src ) LPSTR WINAPI lstrcat32A( LPSTR dst, LPCSTR src )
{ {
dprintf_string(stddeb,"strcat: Append '%s' to '%s'\n", dprintf_string(stddeb,"strcat: Append %s to %s\n",
(src)?src:"NULL",(dst)?dst:"NULL"); debugstr_a (src), debugstr_a (dst));
strcat( dst, src ); strcat( dst, src );
return dst; return dst;
} }
@ -90,6 +91,8 @@ LPSTR WINAPI lstrcat32A( LPSTR dst, LPCSTR src )
LPWSTR WINAPI lstrcat32W( LPWSTR dst, LPCWSTR src ) LPWSTR WINAPI lstrcat32W( LPWSTR dst, LPCWSTR src )
{ {
register LPWSTR p = dst; register LPWSTR p = dst;
dprintf_string(stddeb,"strcat: Append L%s to L%s\n",
debugstr_w (src), debugstr_w (dst));
while (*p) p++; while (*p) p++;
while ((*p++ = *src++)); while ((*p++ = *src++));
return dst; return dst;
@ -112,8 +115,8 @@ SEGPTR WINAPI lstrcatn16( SEGPTR dst, LPCSTR src, INT16 n )
LPSTR WINAPI lstrcatn32A( LPSTR dst, LPCSTR src, INT32 n ) LPSTR WINAPI lstrcatn32A( LPSTR dst, LPCSTR src, INT32 n )
{ {
register LPSTR p = dst; register LPSTR p = dst;
dprintf_string(stddeb,"strcatn add %d chars from '%s' to '%s'\n", dprintf_string(stddeb,"strcatn add %d chars from %s to %s\n",
n,(src)?src:"NULL",(dst)?dst:"NULL"); n, debugstr_an (src, n), debugstr_a (dst));
while (*p) p++; while (*p) p++;
if ((n -= (INT32)(p - dst)) <= 0) return dst; if ((n -= (INT32)(p - dst)) <= 0) return dst;
lstrcpyn32A( p, src, n ); lstrcpyn32A( p, src, n );
@ -127,6 +130,8 @@ LPSTR WINAPI lstrcatn32A( LPSTR dst, LPCSTR src, INT32 n )
LPWSTR WINAPI lstrcatn32W( LPWSTR dst, LPCWSTR src, INT32 n ) LPWSTR WINAPI lstrcatn32W( LPWSTR dst, LPCWSTR src, INT32 n )
{ {
register LPWSTR p = dst; register LPWSTR p = dst;
dprintf_string(stddeb,"strcatn add %d chars from L%s to L%s\n",
n, debugstr_wn (src, n), debugstr_w (dst));
while (*p) p++; while (*p) p++;
if ((n -= (INT32)(p - dst)) <= 0) return dst; if ((n -= (INT32)(p - dst)) <= 0) return dst;
lstrcpyn32W( p, src, n ); lstrcpyn32W( p, src, n );
@ -148,14 +153,13 @@ INT16 WINAPI lstrcmp16( LPCSTR str1, LPCSTR str2 )
*/ */
INT32 WINAPI lstrcmp32A( LPCSTR str1, LPCSTR str2 ) INT32 WINAPI lstrcmp32A( LPCSTR str1, LPCSTR str2 )
{ {
dprintf_string(stddeb,"strcmp: %s and %s\n",
debugstr_a (str1), debugstr_a (str2));
/* Win95 KERNEL32.DLL does it that way. Hands off! */ /* Win95 KERNEL32.DLL does it that way. Hands off! */
if (!str1 || !str2) { if (!str1 || !str2) {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
return 0; return 0;
} }
dprintf_string(stddeb,"strcmp: '%s' and '%s'\n",
(str1)?str1:"NULL",(str2)?str2:"NULL");
return (INT32)strcmp( str1, str2 ); return (INT32)strcmp( str1, str2 );
} }
@ -165,6 +169,8 @@ INT32 WINAPI lstrcmp32A( LPCSTR str1, LPCSTR str2 )
*/ */
INT32 WINAPI lstrcmp32W( LPCWSTR str1, LPCWSTR str2 ) INT32 WINAPI lstrcmp32W( LPCWSTR str1, LPCWSTR str2 )
{ {
dprintf_string(stddeb,"strcmp: L%s and L%s\n",
debugstr_w (str1), debugstr_w (str2));
if (!str1 || !str2) { if (!str1 || !str2) {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
return 0; return 0;
@ -190,12 +196,12 @@ INT32 WINAPI lstrcmpi32A( LPCSTR str1, LPCSTR str2 )
{ {
INT32 res; INT32 res;
dprintf_string(stddeb,"strcmpi %s and %s\n",
debugstr_a (str1), debugstr_a (str2));
if (!str1 || !str2) { if (!str1 || !str2) {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
return 0; return 0;
} }
dprintf_string(stddeb,"strcmpi '%s' and '%s'\n",
(str1)?str1:"NULL",(str2)?str2:"NULL");
while (*str1) while (*str1)
{ {
if ((res = toupper(*str1) - toupper(*str2)) != 0) return res; if ((res = toupper(*str1) - toupper(*str2)) != 0) return res;
@ -213,6 +219,11 @@ INT32 WINAPI lstrcmpi32W( LPCWSTR str1, LPCWSTR str2 )
{ {
INT32 res; INT32 res;
#if 0
/* Too much! (From registry loading.) */
dprintf_string(stddeb,"strcmpi L%s and L%s\n",
debugstr_w (str1), debugstr_w (str2));
#endif
if (!str1 || !str2) { if (!str1 || !str2) {
SetLastError(ERROR_INVALID_PARAMETER); SetLastError(ERROR_INVALID_PARAMETER);
return 0; return 0;
@ -243,8 +254,7 @@ SEGPTR WINAPI lstrcpy16( SEGPTR dst, LPCSTR src )
*/ */
LPSTR WINAPI lstrcpy32A( LPSTR dst, LPCSTR src ) LPSTR WINAPI lstrcpy32A( LPSTR dst, LPCSTR src )
{ {
dprintf_string(stddeb,"strcpy '%s'\n", dprintf_string(stddeb,"strcpy %s\n", debugstr_a (src));
(src)?src:"NULL");
if (!src || !dst) return NULL; if (!src || !dst) return NULL;
strcpy( dst, src ); strcpy( dst, src );
return dst; return dst;
@ -257,6 +267,7 @@ LPSTR WINAPI lstrcpy32A( LPSTR dst, LPCSTR src )
LPWSTR WINAPI lstrcpy32W( LPWSTR dst, LPCWSTR src ) LPWSTR WINAPI lstrcpy32W( LPWSTR dst, LPCWSTR src )
{ {
register LPWSTR p = dst; register LPWSTR p = dst;
dprintf_string(stddeb,"strcpy L%s\n", debugstr_w (src));
while ((*p++ = *src++)); while ((*p++ = *src++));
return dst; return dst;
} }
@ -278,8 +289,8 @@ SEGPTR WINAPI lstrcpyn16( SEGPTR dst, LPCSTR src, INT16 n )
LPSTR WINAPI lstrcpyn32A( LPSTR dst, LPCSTR src, INT32 n ) LPSTR WINAPI lstrcpyn32A( LPSTR dst, LPCSTR src, INT32 n )
{ {
LPSTR p = dst; LPSTR p = dst;
dprintf_string(stddeb,"strcpyn '%s' for %d chars\n", dprintf_string(stddeb,"strcpyn %s for %d chars\n",
(src)?src:"NULL",n); debugstr_an (src,n), n);
while ((n-- > 1) && *src) *p++ = *src++; while ((n-- > 1) && *src) *p++ = *src++;
if (n >= 0) *p = 0; if (n >= 0) *p = 0;
return dst; return dst;
@ -292,6 +303,8 @@ LPSTR WINAPI lstrcpyn32A( LPSTR dst, LPCSTR src, INT32 n )
LPWSTR WINAPI lstrcpyn32W( LPWSTR dst, LPCWSTR src, INT32 n ) LPWSTR WINAPI lstrcpyn32W( LPWSTR dst, LPCWSTR src, INT32 n )
{ {
LPWSTR p = dst; LPWSTR p = dst;
dprintf_string(stddeb,"strcpyn L%s for %d chars\n",
debugstr_wn (src,n), n);
while ((n-- > 1) && *src) *p++ = *src++; while ((n-- > 1) && *src) *p++ = *src++;
if (n >= 0) *p = 0; if (n >= 0) *p = 0;
return dst; return dst;
@ -316,7 +329,7 @@ INT32 WINAPI lstrlen32A( LPCSTR str )
* in lstrlen() ... we check only for NULL pointer reference. * in lstrlen() ... we check only for NULL pointer reference.
* - Marcus Meissner * - Marcus Meissner
*/ */
dprintf_string(stddeb,"strlen '%s'\n", (str)?str:"NULL"); dprintf_string(stddeb,"strlen %s\n", debugstr_a (str));
if (!str) return 0; if (!str) return 0;
return (INT32)strlen(str); return (INT32)strlen(str);
} }
@ -328,6 +341,7 @@ INT32 WINAPI lstrlen32A( LPCSTR str )
INT32 WINAPI lstrlen32W( LPCWSTR str ) INT32 WINAPI lstrlen32W( LPCWSTR str )
{ {
INT32 len = 0; INT32 len = 0;
dprintf_string(stddeb,"strlen L%s\n", debugstr_w (str));
if (!str) return 0; if (!str) return 0;
while (*str++) len++; while (*str++) len++;
return len; return len;
@ -339,8 +353,8 @@ INT32 WINAPI lstrlen32W( LPCWSTR str )
*/ */
INT32 WINAPI lstrncmp32A( LPCSTR str1, LPCSTR str2, INT32 n ) INT32 WINAPI lstrncmp32A( LPCSTR str1, LPCSTR str2, INT32 n )
{ {
dprintf_string(stddeb,"strncmp '%s' and '%s' for %d chars\n", dprintf_string(stddeb,"strncmp %s and %s for %d chars\n",
(str1)?str1:"NULL",(str2)?str2:"NULL",n); debugstr_an (str1, n), debugstr_an (str2, n), n);
return (INT32)strncmp( str1, str2, n ); return (INT32)strncmp( str1, str2, n );
} }
@ -350,6 +364,8 @@ INT32 WINAPI lstrncmp32A( LPCSTR str1, LPCSTR str2, INT32 n )
*/ */
INT32 WINAPI lstrncmp32W( LPCWSTR str1, LPCWSTR str2, INT32 n ) INT32 WINAPI lstrncmp32W( LPCWSTR str1, LPCWSTR str2, INT32 n )
{ {
dprintf_string(stddeb,"strncmp L%s and L%s for %d chars\n",
debugstr_wn (str1, n), debugstr_wn (str2, n), n);
if (!n) return 0; if (!n) return 0;
while ((--n > 0) && *str1 && (*str1 == *str2)) { str1++; str2++; } while ((--n > 0) && *str1 && (*str1 == *str2)) { str1++; str2++; }
return (INT32)(*str1 - *str2); return (INT32)(*str1 - *str2);
@ -363,8 +379,8 @@ INT32 WINAPI lstrncmpi32A( LPCSTR str1, LPCSTR str2, INT32 n )
{ {
INT32 res; INT32 res;
dprintf_string(stddeb,"strncmpi '%s' and '%s' for %d chars\n", dprintf_string(stddeb,"strncmpi %s and %s for %d chars\n",
(str1)?str1:"NULL",(str2)?str2:"NULL",n); debugstr_an (str1, n), debugstr_an (str2, n), n);
if (!n) return 0; if (!n) return 0;
while ((--n > 0) && *str1) while ((--n > 0) && *str1)
if ( (res = toupper(*str1++) - toupper(*str2++)) ) return res; if ( (res = toupper(*str1++) - toupper(*str2++)) ) return res;
@ -380,6 +396,8 @@ INT32 WINAPI lstrncmpi32W( LPCWSTR str1, LPCWSTR str2, INT32 n )
{ {
INT32 res; INT32 res;
dprintf_string(stddeb,"strncmpi L%s and L%s for %d chars\n",
debugstr_wn (str1, n), debugstr_wn (str2, n), n);
if (!n) return 0; if (!n) return 0;
while ((--n > 0) && *str1) while ((--n > 0) && *str1)
{ {
@ -517,10 +535,11 @@ void WINAPI OemToAnsiBuff16( LPCSTR s, LPSTR d, UINT16 len )
*/ */
BOOL32 WINAPI CharToOem32A( LPCSTR s, LPSTR d ) BOOL32 WINAPI CharToOem32A( LPCSTR s, LPSTR d )
{ {
LPSTR oldd = d;
if (!s || !d) return TRUE; if (!s || !d) return TRUE;
dprintf_string(stddeb,"CharToOem '%s'\n", (s)?s:"NULL"); dprintf_string (stddeb,"CharToOem %s\n", debugstr_a (s));
while ((*d++ = ANSI_TO_OEM(*s++))); while ((*d++ = ANSI_TO_OEM(*s++)));
dprintf_string(stddeb," to '%s'\n", (d)?d:"NULL"); dprintf_string (stddeb," to %s\n", debugstr_a (oldd));
return TRUE; return TRUE;
} }
@ -550,7 +569,11 @@ BOOL32 WINAPI CharToOemBuff32W( LPCWSTR s, LPSTR d, DWORD len )
*/ */
BOOL32 WINAPI CharToOem32W( LPCWSTR s, LPSTR d ) BOOL32 WINAPI CharToOem32W( LPCWSTR s, LPSTR d )
{ {
LPSTR oldd = d;
if (!s || !d) return TRUE;
dprintf_string (stddeb,"CharToOem L%s\n", debugstr_w (s));
while ((*d++ = ANSI_TO_OEM(*s++))); while ((*d++ = ANSI_TO_OEM(*s++)));
dprintf_string (stddeb," to %s\n", debugstr_a (oldd));
return TRUE; return TRUE;
} }
@ -561,9 +584,9 @@ BOOL32 WINAPI CharToOem32W( LPCWSTR s, LPSTR d )
BOOL32 WINAPI OemToChar32A( LPCSTR s, LPSTR d ) BOOL32 WINAPI OemToChar32A( LPCSTR s, LPSTR d )
{ {
LPSTR oldd = d; LPSTR oldd = d;
dprintf_string(stddeb,"OemToChar '%s'\n", (s)?s:"NULL"); dprintf_string(stddeb,"OemToChar %s\n", debugstr_a (s));
while ((*d++ = OEM_TO_ANSI(*s++))); while ((*d++ = OEM_TO_ANSI(*s++)));
dprintf_string(stddeb," to '%s'\n", oldd); dprintf_string(stddeb," to %s\n", debugstr_a (oldd));
return TRUE; return TRUE;
} }
@ -573,7 +596,7 @@ BOOL32 WINAPI OemToChar32A( LPCSTR s, LPSTR d )
*/ */
BOOL32 WINAPI OemToCharBuff32A( LPCSTR s, LPSTR d, DWORD len ) BOOL32 WINAPI OemToCharBuff32A( LPCSTR s, LPSTR d, DWORD len )
{ {
dprintf_string(stddeb,"OemToCharBuff '%s' for %ld chars\n", (s)?s:"NULL",len); dprintf_string(stddeb,"OemToCharBuff %s\n", debugstr_an (s, len));
while (len--) *d++ = OEM_TO_ANSI(*s++); while (len--) *d++ = OEM_TO_ANSI(*s++);
return TRUE; return TRUE;
} }
@ -584,6 +607,7 @@ BOOL32 WINAPI OemToCharBuff32A( LPCSTR s, LPSTR d, DWORD len )
*/ */
BOOL32 WINAPI OemToCharBuff32W( LPCSTR s, LPWSTR d, DWORD len ) BOOL32 WINAPI OemToCharBuff32W( LPCSTR s, LPWSTR d, DWORD len )
{ {
dprintf_string(stddeb,"OemToCharBuff %s\n", debugstr_an (s, len));
while (len--) *d++ = (WCHAR)OEM_TO_ANSI(*s++); while (len--) *d++ = (WCHAR)OEM_TO_ANSI(*s++);
return TRUE; return TRUE;
} }

View File

@ -1,4 +1,4 @@
DEFS = -D__WINE__ DEFS = @DLLFLAGS@ -D__WINE__
TOPSRCDIR = @top_srcdir@ TOPSRCDIR = @top_srcdir@
TOPOBJDIR = .. TOPOBJDIR = ..
SRCDIR = @srcdir@ SRCDIR = @srcdir@
@ -14,6 +14,7 @@ C_SRCS = \
crtdll.c \ crtdll.c \
cpu.c \ cpu.c \
ddeml.c \ ddeml.c \
debugstr.c \
error.c \ error.c \
lstr.c \ lstr.c \
lzexpand.c \ lzexpand.c \
@ -37,6 +38,7 @@ C_SRCS = \
toolhelp.c \ toolhelp.c \
tweak.c \ tweak.c \
ver.c \ ver.c \
version.c \
w32sys.c \ w32sys.c \
winsock.c \ winsock.c \
winsock_dns.c \ winsock_dns.c \

View File

@ -132,6 +132,7 @@ static const CALLBACKS_TABLE CALLBACK_WinelibTable =
{ {
CALLBACK_CallRegisterProc, /* CallRegisterProc */ CALLBACK_CallRegisterProc, /* CallRegisterProc */
TASK_Reschedule, /* CallTaskRescheduleProc */ TASK_Reschedule, /* CallTaskRescheduleProc */
NULL, /* CallFrom16WndProc */
CALLBACK_CallWndProc, /* CallWndProc */ CALLBACK_CallWndProc, /* CallWndProc */
CALLBACK_CallDriverProc, /* CallDriverProc */ CALLBACK_CallDriverProc, /* CallDriverProc */
CALLBACK_CallDriverCallback, /* CallDriverCallback */ CALLBACK_CallDriverCallback, /* CallDriverCallback */

View File

@ -2,6 +2,7 @@
* DDEML library * DDEML library
* *
* Copyright 1997 Alexandre Julliard * Copyright 1997 Alexandre Julliard
* Copyright 1997 Len White
*/ */
/* Only empty stubs for now */ /* Only empty stubs for now */
@ -63,6 +64,33 @@ BOOL32 WINAPI DdeUninitialize32( DWORD idInst )
return TRUE; return TRUE;
} }
/*****************************************************************
* DdeConnectList (DDEML.4)
*/
HCONVLIST WINAPI DdeConnectList( DWORD idInst, HSZ hszService, HSZ hszTopic,
HCONVLIST hConvList, LPCONVCONTEXT16 pCC )
{
fprintf( stdnimp, "DdeConnectList: empty stub\n" );
return 0;
}
/*****************************************************************
* DdeQueryNextServer (DDEML.5)
*/
HCONV WINAPI DdeQueryNextServer( HCONVLIST hConvList, HCONV hConvPrev )
{
fprintf( stdnimp, "DdeQueryNextServer: empty stub\n" );
return 0;
}
/*****************************************************************
* DdeDisconnectList (DDEML.6)
*/
BOOL16 WINAPI DdeDisconnectList( HCONVLIST hConvList )
{
fprintf( stdnimp, "DdeDisconnectList: empty stub\n" );
return 0;
}
/***************************************************************** /*****************************************************************
* DdeConnect16 (DDEML.7) * DdeConnect16 (DDEML.7)
@ -94,6 +122,23 @@ BOOL16 WINAPI DdeDisconnect16( HCONV hConv )
return (BOOL16)DdeDisconnect32( hConv ); return (BOOL16)DdeDisconnect32( hConv );
} }
/*****************************************************************
* DdeSetUserHandle (DDEML.10)
*/
BOOL16 WINAPI DdeSetUserHandle( HCONV hConv, DWORD id, DWORD hUser )
{
fprintf( stdnimp, "DdeSetUserHandle: empty stub\n" );
return 0;
}
/*****************************************************************
* DdeCreateDataHandle (DDEML.14)
*/
HDDEDATA WINAPI DdeCreateDataHandle( DWORD idInst, LPBYTE pSrc, DWORD cb, DWORD cbOff, HSZ hszItem, UINT16 wFmt, UINT16 afCmd )
{
fprintf( stdnimp, "DdeCreateDataHandle: empty stub\n" );
return 0;
}
/***************************************************************** /*****************************************************************
* DdeDisconnect32 (USER32.97) * DdeDisconnect32 (USER32.97)
@ -226,6 +271,71 @@ HDDEDATA WINAPI DdeClientTransaction32( LPBYTE pData, DWORD cbData,
return 0; return 0;
} }
/*****************************************************************
* DdeAbandonTransaction (DDEML.12)
*/
BOOL16 WINAPI DdeAbandonTransaction( DWORD idInst, HCONV hConv,
DWORD idTransaction )
{
fprintf( stdnimp, "DdeAbandonTransaction: empty stub\n" );
return 0;
}
/*****************************************************************
* DdePostAdvise (DDEML.13)
*/
BOOL16 WINAPI DdePostAdvise( DWORD idInst, HSZ hszTopic, HSZ hszItem )
{
fprintf( stdnimp, "DdePostAdvise: empty stub\n" );
return 0;
}
/*****************************************************************
* DdeAddData (DDEML.15)
*/
HDDEDATA WINAPI DdeAddData( HDDEDATA hData, LPBYTE pSrc, DWORD cb,
DWORD cbOff )
{
fprintf( stdnimp, "DdeAddData: empty stub\n" );
return 0;
}
/*****************************************************************
* DdeGetData (DDEML.16)
*/
DWORD WINAPI DdeGetData( HDDEDATA hData, LPBYTE pDst, DWORD cbMax,
DWORD cbOff )
{
fprintf( stdnimp, "DdeGetData: empty stub\n" );
return 0;
}
/*****************************************************************
* DdeAccessData (DDEML.17)
*/
LPBYTE WINAPI DdeAccessData( HDDEDATA hData, LPDWORD pcbDataSize )
{
fprintf( stdnimp, "DdeAccessData: empty stub\n" );
return 0;
}
/*****************************************************************
* DdeUnaccessData (DDEML.18)
*/
BOOL16 WINAPI DdeUnaccessData( HDDEDATA hData )
{
fprintf( stdnimp, "DdeUnaccessData: empty stub\n" );
return 0;
}
/*****************************************************************
* DdeEnableCallback (DDEML.26)
*/
BOOL16 WINAPI DdeEnableCallback( DWORD idInst, HCONV hConv, UINT16 wCmd )
{
fprintf( stdnimp, "DdeEnableCallback: empty stub\n" );
return 0;
}
/***************************************************************** /*****************************************************************
* DdeNameService16 (DDEML.27) * DdeNameService16 (DDEML.27)
@ -266,3 +376,14 @@ UINT32 WINAPI DdeGetLastError32( DWORD idInst )
return 0; return 0;
} }
/*****************************************************************
* DdeCmpStringHandles (DDEML.36)
*/
int WINAPI DdeCmpStringHandles( HSZ hsz1, HSZ hsz2 )
{
fprintf( stdnimp, "DdeCmpStringHandles: empty stub\n" );
return 0;
}

127
misc/debugstr.c Normal file
View File

@ -0,0 +1,127 @@
#include "debugstr.h"
#include "xmalloc.h"
#include <stdlib.h>
/* ---------------------------------------------------------------------- */
#define SAVE_STRING_COUNT 50
static void *strings[SAVE_STRING_COUNT];
static int nextstring;
/* ---------------------------------------------------------------------- */
static void *
gimme1 (int n)
{
void *res;
if (strings[nextstring]) free (strings[nextstring]);
res = strings[nextstring] = xmalloc (n);
if (++nextstring == SAVE_STRING_COUNT) nextstring = 0;
return res;
}
/* ---------------------------------------------------------------------- */
LPSTR
debugstr_an (LPCSTR src, int n)
{
LPSTR dst, res;
if (!src) return "(null)";
if (n < 0) n = 0;
dst = res = gimme1 (n * 4 + 10);
*dst++ = '"';
while (n-- > 0 && *src)
{
BYTE c = *src++;
switch (c)
{
case '\n': *dst++ = '\\'; *dst++ = 'n'; break;
case '\r': *dst++ = '\\'; *dst++ = 'r'; break;
case '\t': *dst++ = '\\'; *dst++ = 't'; break;
case '"': *dst++ = '\\'; *dst++ = '"'; break;
case '\\': *dst++ = '\\'; *dst++ = '\\'; break;
default:
if (c >= ' ' && c <= 126)
*dst++ = c;
else
{
*dst++ = '\\';
*dst++ = '0' + ((c >> 6) & 7);
*dst++ = '0' + ((c >> 3) & 7);
*dst++ = '0' + ((c >> 0) & 7);
}
}
}
if (*src)
{
*dst++ = '.';
*dst++ = '.';
*dst++ = '.';
}
*dst++ = '"';
*dst = 0;
return res;
}
/* ---------------------------------------------------------------------- */
LPSTR
debugstr_a (LPCSTR s)
{
return debugstr_an (s, 80);
}
/* ---------------------------------------------------------------------- */
LPSTR
debugstr_wn (LPCWSTR src, int n)
{
LPSTR dst, res;
if (!src) return "(null)";
if (n < 0) n = 0;
dst = res = gimme1 (n * 4 + 10);
*dst++ = '"';
while (n-- > 0 && *src)
{
WORD c = *src++;
switch (c)
{
case '\n': *dst++ = '\\'; *dst++ = 'n'; break;
case '\r': *dst++ = '\\'; *dst++ = 'r'; break;
case '\t': *dst++ = '\\'; *dst++ = 't'; break;
case '"': *dst++ = '\\'; *dst++ = '"'; break;
case '\\': *dst++ = '\\'; *dst++ = '\\'; break;
default:
if (c >= ' ' && c <= 126)
*dst++ = c;
else
{
*dst++ = '\\';
*dst++ = '0' + ((c >> 6) & 7);
*dst++ = '0' + ((c >> 3) & 7);
*dst++ = '0' + ((c >> 0) & 7);
}
}
}
if (*src)
{
*dst++ = '.';
*dst++ = '.';
*dst++ = '.';
}
*dst++ = '"';
*dst = 0;
return res;
}
/* ---------------------------------------------------------------------- */
LPSTR
debugstr_w (LPCWSTR s)
{
return debugstr_wn (s, 80);
}
/* ---------------------------------------------------------------------- */

View File

@ -20,138 +20,21 @@
#include <X11/cursorfont.h> #include <X11/cursorfont.h>
#include "heap.h" #include "heap.h"
#include "message.h" #include "message.h"
#include "module.h"
#include "msdos.h" #include "msdos.h"
#include "windows.h" #include "windows.h"
#include "color.h" #include "color.h"
#include "winsock.h" #include "winsock.h"
#include "options.h" #include "options.h"
#include "desktop.h" #include "desktop.h"
#include "process.h"
#include "shell.h" #include "shell.h"
#include "winbase.h" #include "winbase.h"
#define DEBUG_DEFINE_VARIABLES #define DEBUG_DEFINE_VARIABLES
#include "stddebug.h" #include "stddebug.h"
#include "debug.h" #include "debug.h"
#include "xmalloc.h" #include "xmalloc.h"
#include "version.h"
const char people[] = "Wine is available thanks to the work of "
"Bob Amstadt, "
"Dag Asheim, "
"Martin Ayotte, "
"Peter Bajusz, "
"Georg Beyerle, "
"Ross Biro, "
"Uwe Bonnes, "
"Erik Bos, "
"Fons Botman, "
"John Brezak, "
"Andrew Bulhak, "
"John Burton, "
"Niels de Carpentier, "
"Jimen Ching, "
"David A. Cuthbert, "
"Huw D. M. Davies, "
"Roman Dolejsi, "
"Frans van Dorsselaer, "
"Chris Faherty, "
"Paul Falstad, "
"David Faure, "
"Claus Fischer, "
"Olaf Flebbe, "
"Chad Fraleigh, "
"Peter Galbavy, "
"Ramon Garcia, "
"Matthew Ghio, "
"Jody Goldberg, "
"Hans de Graaff, "
"Charles M. Hannum, "
"Adrian Harvey, "
"John Harvey, "
"Cameron Heide, "
"Jochen Hoenicke, "
"Onno Hovers, "
"Jeffrey Hsu, "
"Miguel de Icaza, "
"Jukka Iivonen, "
"Lee Jaekil, "
"Alexandre Julliard, "
"Bang Jun-Young, "
"Pavel Kankovsky, "
"Jochen Karrer, "
"Andreas Kirschbaum, "
"Albrecht Kleine, "
"Jon Konrath, "
"Alex Korobka, "
"Greg Kreider, "
"Anand Kumria, "
"Scott A. Laird, "
"Andrew Lewycky, "
"Martin von Loewis, "
"Michiel van Loon, "
"Kenneth MacDonald, "
"Peter MacDonald, "
"William Magro, "
"Juergen Marquardt, "
"Ricardo Massaro, "
"Marcus Meissner, "
"Graham Menhennitt, "
"David Metcalfe, "
"Bruce Milner, "
"Steffen Moeller, "
"Andreas Mohr, "
"Philippe De Muyter, "
"Itai Nahshon, "
"Henrik Olsen, "
"Michael Patra, "
"Dimitrie O. Paun, "
"Jim Peterson, "
"Robert Pouliot, "
"Keith Reynolds, "
"Slaven Rezic, "
"John Richardson, "
"Rick Richardson, "
"Doug Ridgway, "
"Bernhard Rosenkraenzer, "
"Johannes Ruscheinski, "
"Thomas Sandford, "
"Constantine Sapuntzakis, "
"Pablo Saratxaga, "
"Daniel Schepler, "
"Peter Schlaile, "
"Ulrich Schmid, "
"Bernd Schmidt, "
"Ingo Schneider, "
"Victor Schneider, "
"Yngvi Sigurjonsson, "
"Stephen Simmons, "
"Rick Sladkey, "
"William Smith, "
"Dominik Strasser, "
"Vadim Strizhevsky, "
"Erik Svendsen, "
"Tristan Tarrant, "
"Andrew Taylor, "
"Duncan C Thomson, "
"Goran Thyni, "
"Jimmy Tirtawangsa, "
"Jon Tombs, "
"Linus Torvalds, "
"Gregory Trubetskoy, "
"Petri Tuomola, "
"Michael Veksler, "
"Sven Verdoolaege, "
"Ronan Waide, "
"Eric Warnke, "
"Manfred Weichel, "
"Morten Welinder, "
"Lawson Whitney, "
"Jan Willamowius, "
"Carl Williams, "
"Karl Guenter Wuensch, "
"Eric Youngdale, "
"James Youngman, "
"Mikolaj Zalewski, "
"and John Zero.";
const WINE_LANGUAGE_DEF Languages[] = const WINE_LANGUAGE_DEF Languages[] =
{ {
@ -183,19 +66,13 @@ Screen *screen;
Window rootWindow; Window rootWindow;
int screenWidth = 0, screenHeight = 0; /* Desktop window dimensions */ int screenWidth = 0, screenHeight = 0; /* Desktop window dimensions */
int screenDepth = 0; /* Screen depth to use */ int screenDepth = 0; /* Screen depth to use */
int desktopX = 0, desktopY = 0; /* Desktop window position (if any) */
/* Default version is the same as -winver win31 */
static LONG getVersion16 = MAKELONG( WINVERSION, 0x0616 ); /* DOS 6.22 */
static LONG getVersion32 = MAKELONG( WINVERSION, 0x8000 );
static OSVERSIONINFO32A getVersionEx = { sizeof(OSVERSIONINFO32A), 3, 10, 0,
VER_PLATFORM_WIN32s, "Win32s 1.3" };
struct options Options = struct options Options =
{ /* default options */ { /* default options */
NULL, /* desktopGeometry */ NULL, /* desktopGeometry */
NULL, /* programName */ NULL, /* programName */
NULL, /* argv0 */ NULL, /* argv0 */
NULL, /* dllFlags */
FALSE, /* usePrivateMap */ FALSE, /* usePrivateMap */
FALSE, /* useFixedMap */ FALSE, /* useFixedMap */
FALSE, /* synchronous */ FALSE, /* synchronous */
@ -262,20 +139,19 @@ static XrmOptionDescRec optionsTable[] =
" -perfect Favor correctness over speed for graphical operations\n" \ " -perfect Favor correctness over speed for graphical operations\n" \
" -privatemap Use a private color map\n" \ " -privatemap Use a private color map\n" \
" -synchronous Turn on synchronous display mode\n" \ " -synchronous Turn on synchronous display mode\n" \
" -winver Version to imitate (one of win31,win95,nt351)\n" " -version Display the Wine version\n" \
" -winver Version to imitate (one of win31,win95,nt351,nt40)\n"
/*********************************************************************** /***********************************************************************
* MAIN_Usage * MAIN_Usage
*/ */
#ifndef WINELIB32
void MAIN_Usage( char *name ) void MAIN_Usage( char *name )
{ {
fprintf( stderr, USAGE, name ); fprintf( stderr, USAGE, name );
exit(1); exit(1);
} }
#endif
/*********************************************************************** /***********************************************************************
@ -375,7 +251,6 @@ BOOL32 ParseDebugOptions(char *options)
#endif #endif
/*********************************************************************** /***********************************************************************
* MAIN_ParseLanguageOption * MAIN_ParseLanguageOption
* *
@ -419,48 +294,6 @@ static void MAIN_ParseModeOption( char *arg )
} }
} }
/**********************************************************************
* MAIN_ParseVersion
*/
static void MAIN_ParseVersion( char *arg )
{
/* If you add any other options,
verify the values you return on the real thing */
if(strcmp(arg,"win31")==0)
{
getVersion16 = 0x06160A03;
/* FIXME: My Win32s installation failed to execute the
MSVC 4 test program. So check these values */
getVersion32 = 0x80000A03;
getVersionEx.dwMajorVersion=3;
getVersionEx.dwMinorVersion=10;
getVersionEx.dwBuildNumber=0;
getVersionEx.dwPlatformId=VER_PLATFORM_WIN32s;
strcpy(getVersionEx.szCSDVersion,"Win32s 1.3");
}
else if(strcmp(arg, "win95")==0)
{
getVersion16 = 0x07005F03;
getVersion32 = 0xC0000004;
getVersionEx.dwMajorVersion=4;
getVersionEx.dwMinorVersion=0;
getVersionEx.dwBuildNumber=0x40003B6;
getVersionEx.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS;
strcpy(getVersionEx.szCSDVersion,"");
}
else if(strcmp(arg, "nt351")==0)
{
getVersion16 = 0x05000A03;
getVersion32 = 0x04213303;
getVersionEx.dwMajorVersion=3;
getVersionEx.dwMinorVersion=51;
getVersionEx.dwBuildNumber=0x421;
getVersionEx.dwPlatformId=VER_PLATFORM_WIN32_NT;
strcpy(getVersionEx.szCSDVersion,"Service Pack 2");
}
else fprintf(stderr, "Unknown winver system code - ignored\n");
}
/*********************************************************************** /***********************************************************************
* MAIN_ParseOptions * MAIN_ParseOptions
* *
@ -478,19 +311,15 @@ static void MAIN_ParseOptions( int *argc, char *argv[] )
Options.argv0 = argv[0]; Options.argv0 = argv[0];
/* Get display name from command line */ /* Get display name from command line */
for (i = 1; i < *argc - 1; i++) for (i = 1; i < *argc; i++)
if (!strcmp( argv[i], "-display" )) {
{ if (!strcmp( argv[i], "-display" )) display_name = argv[i+1];
display_name = argv[i+1]; if (!strcmp( argv[i], "-v" ) || !strcmp( argv[i], "-version" ))
break; {
printf( "%s\n", WINE_RELEASE_INFO );
exit(0);
} }
}
#ifdef WINELIB
/* Need to assemble command line and pass it to WinMain */
#else
if (*argc < 2 || lstrcmpi32A(argv[1], "-h") == 0)
MAIN_Usage( argv[0] );
#endif
/* Open display */ /* Open display */
@ -574,24 +403,20 @@ static void MAIN_ParseOptions( int *argc, char *argv[] )
#endif #endif
} }
if(MAIN_GetResource( db, ".dll", &value)) if (MAIN_GetResource( db, ".dll", &value))
{ {
#ifndef WINELIB /* Hack: store option value in Options to be retrieved */
if (!BUILTIN_ParseDLLOptions( (char*)value.addr )) /* later on inside the emulator code. */
if (!__winelib) Options.dllFlags = xstrdup((char *)value.addr);
else
{ {
fprintf(stderr,"%s: Syntax: -dll +xxx,... or -dll -xxx,...\n",argv[0]); fprintf( stderr, "-dll not supported in Winelib\n" );
fprintf(stderr,"Example: -dll -ole2 Do not use emulated OLE2.DLL\n");
fprintf(stderr,"Available DLLs:\n");
BUILTIN_PrintDLLs();
exit(1); exit(1);
} }
#else
fprintf(stderr,"-dll not supported in libwine\n");
#endif
} }
if(MAIN_GetResource( db, ".winver", &value)) if (MAIN_GetResource( db, ".winver", &value))
MAIN_ParseVersion( (char*)value.addr ); VERSION_ParseVersion( (char*)value.addr );
} }
@ -600,7 +425,7 @@ static void MAIN_ParseOptions( int *argc, char *argv[] )
*/ */
static void MAIN_CreateDesktop( int argc, char *argv[] ) static void MAIN_CreateDesktop( int argc, char *argv[] )
{ {
int flags; int x, y, flags;
unsigned int width = 640, height = 480; /* Default size = 640x480 */ unsigned int width = 640, height = 480; /* Default size = 640x480 */
char *name = "Wine desktop"; char *name = "Wine desktop";
XSizeHints *size_hints; XSizeHints *size_hints;
@ -610,8 +435,7 @@ static void MAIN_CreateDesktop( int argc, char *argv[] )
XTextProperty window_name; XTextProperty window_name;
Atom XA_WM_DELETE_WINDOW; Atom XA_WM_DELETE_WINDOW;
flags = XParseGeometry( Options.desktopGeometry, flags = XParseGeometry( Options.desktopGeometry, &x, &y, &width, &height );
&desktopX, &desktopY, &width, &height );
screenWidth = width; screenWidth = width;
screenHeight = height; screenHeight = height;
@ -619,12 +443,11 @@ static void MAIN_CreateDesktop( int argc, char *argv[] )
win_attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask | win_attr.event_mask = ExposureMask | KeyPressMask | KeyReleaseMask |
PointerMotionMask | ButtonPressMask | PointerMotionMask | ButtonPressMask |
ButtonReleaseMask | EnterWindowMask | ButtonReleaseMask | EnterWindowMask;
StructureNotifyMask;
win_attr.cursor = XCreateFontCursor( display, XC_top_left_arrow ); win_attr.cursor = XCreateFontCursor( display, XC_top_left_arrow );
rootWindow = XCreateWindow( display, DefaultRootWindow(display), rootWindow = XCreateWindow( display, DefaultRootWindow(display),
desktopX, desktopY, width, height, 0, x, y, width, height, 0,
CopyFromParent, InputOutput, CopyFromParent, CopyFromParent, InputOutput, CopyFromParent,
CWEventMask | CWCursor, &win_attr ); CWEventMask | CWCursor, &win_attr );
@ -806,99 +629,6 @@ BOOL32 WINAPI Beep( DWORD dwFreq, DWORD dwDur )
} }
/***********************************************************************
* GetVersion16 (KERNEL.3)
*/
LONG WINAPI GetVersion16(void)
{
return getVersion16;
}
/***********************************************************************
* GetVersion32 (KERNEL32.427)
*/
LONG WINAPI GetVersion32(void)
{
return getVersion32;
}
/***********************************************************************
* GetVersionExA
*/
BOOL32 WINAPI GetVersionEx32A(OSVERSIONINFO32A *v)
{
if(v->dwOSVersionInfoSize!=sizeof(OSVERSIONINFO32A))
{
fprintf(stddeb,"wrong OSVERSIONINFO size from app");
return FALSE;
}
v->dwMajorVersion = getVersionEx.dwMajorVersion;
v->dwMinorVersion = getVersionEx.dwMinorVersion;
v->dwBuildNumber = getVersionEx.dwBuildNumber;
v->dwPlatformId = getVersionEx.dwPlatformId;
strcpy(v->szCSDVersion, getVersionEx.szCSDVersion);
return TRUE;
}
/***********************************************************************
* GetVersionExW
*/
BOOL32 WINAPI GetVersionEx32W(OSVERSIONINFO32W *v)
{
OSVERSIONINFO32A v1;
if(v->dwOSVersionInfoSize!=sizeof(OSVERSIONINFO32W))
{
fprintf(stddeb,"wrong OSVERSIONINFO size from app");
return FALSE;
}
v1.dwOSVersionInfoSize=sizeof(v1);
GetVersionEx32A(&v1);
v->dwMajorVersion = v1.dwMajorVersion;
v->dwMinorVersion = v1.dwMinorVersion;
v->dwBuildNumber = v1.dwBuildNumber;
v->dwPlatformId = v1.dwPlatformId;
lstrcpyAtoW( v->szCSDVersion, v1.szCSDVersion );
return TRUE;
}
/***********************************************************************
* GetWinFlags (KERNEL.132)
*/
DWORD WINAPI GetWinFlags(void)
{
static const long cpuflags[5] =
{ WF_CPU086, WF_CPU186, WF_CPU286, WF_CPU386, WF_CPU486 };
SYSTEM_INFO si;
long result = 0,cpuflag;
GetSystemInfo(&si);
/* There doesn't seem to be any Pentium flag. */
cpuflag = cpuflags[MIN (si.wProcessorLevel, 4)];
switch(Options.mode) {
case MODE_STANDARD:
result = (WF_STANDARD | cpuflag | WF_PMODE | WF_80x87);
break;
case MODE_ENHANCED:
result = (WF_ENHANCED | cpuflag | WF_PMODE | WF_80x87 | WF_PAGING);
break;
default:
fprintf(stderr, "Unknown mode set? This shouldn't happen. Check GetWinFlags()!\n");
break;
}
if (si.wProcessorLevel>=4)
result |= WF_HASCPUID;
if( getVersionEx.dwPlatformId == VER_PLATFORM_WIN32_NT )
result |= WF_WIN32WOW; /* undocumented WF_WINNT */
return result;
}
/*********************************************************************** /***********************************************************************
* GetTimerResolution (USER.14) * GetTimerResolution (USER.14)
*/ */
@ -1302,27 +1032,3 @@ void WINAPI FileCDR(FARPROC16 x)
{ {
printf("FileCDR(%8x)\n", (int) x); printf("FileCDR(%8x)\n", (int) x);
} }
/***********************************************************************
* GetWinDebugInfo (KERNEL.355)
*/
BOOL16 WINAPI GetWinDebugInfo(WINDEBUGINFO *lpwdi, UINT16 flags)
{
printf("GetWinDebugInfo(%8lx,%d) stub returning 0\n", (unsigned long)lpwdi, flags);
/* 0 means not in debugging mode/version */
/* Can this type of debugging be used in wine ? */
/* Constants: WDI_OPTIONS WDI_FILTER WDI_ALLOCBREAK */
return 0;
}
/***********************************************************************
* GetWinDebugInfo (KERNEL.355)
*/
BOOL16 WINAPI SetWinDebugInfo(WINDEBUGINFO *lpwdi)
{
printf("SetWinDebugInfo(%8lx) stub returning 0\n", (unsigned long)lpwdi);
/* 0 means not in debugging mode/version */
/* Can this type of debugging be used in wine ? */
/* Constants: WDI_OPTIONS WDI_FILTER WDI_ALLOCBREAK */
return 0;
}

View File

@ -2112,7 +2112,7 @@ INT32 WINAPI LCMapString32W(
INT32 WINAPI GetDateFormat32A(LCID locale,DWORD flags,LPSYSTEMTIME xtime, INT32 WINAPI GetDateFormat32A(LCID locale,DWORD flags,LPSYSTEMTIME xtime,
LPCSTR format, LPSTR date,INT32 datelen LPCSTR format, LPSTR date,INT32 datelen
) { ) {
fprintf(stderr,"GetDateFormat(0x%04x,0x%08lx,%p,%s,%p,%d), stub\n", fprintf(stderr,"GetDateFormat(0x%04lx,0x%08lx,%p,%s,%p,%d), stub\n",
locale,flags,xtime,format,date,datelen locale,flags,xtime,format,date,datelen
); );
lstrcpyn32A(date,"1.4.1997",datelen); lstrcpyn32A(date,"1.4.1997",datelen);
@ -2122,7 +2122,7 @@ INT32 WINAPI GetDateFormat32A(LCID locale,DWORD flags,LPSYSTEMTIME xtime,
INT32 WINAPI GetTimeFormat32A(LCID locale,DWORD flags,LPSYSTEMTIME xtime, INT32 WINAPI GetTimeFormat32A(LCID locale,DWORD flags,LPSYSTEMTIME xtime,
LPCSTR format, LPSTR timestr,INT32 timelen LPCSTR format, LPSTR timestr,INT32 timelen
) { ) {
fprintf(stderr,"GetDateFormat(0x%04x,0x%08lx,%p,%s,%p,%d), stub\n", fprintf(stderr,"GetDateFormat(0x%04lx,0x%08lx,%p,%s,%p,%d), stub\n",
locale,flags,xtime,format,timestr,timelen locale,flags,xtime,format,timestr,timelen
); );
lstrcpyn32A(timestr,"00:00:42",timelen); lstrcpyn32A(timestr,"00:00:42",timelen);

View File

@ -1054,17 +1054,27 @@ _w95dkecomp(struct _w95nr2da *a,struct _w95nr2da *b){return a->dkeaddr-b->dkeadd
static struct _w95key* static struct _w95key*
_w95dkelookup(unsigned long dkeaddr,int n,struct _w95nr2da *nr2da,struct _w95key *keys) { _w95dkelookup(unsigned long dkeaddr,int n,struct _w95nr2da *nr2da,struct _w95key *keys) {
int i,off; int i;
int left, right;
if (dkeaddr == 0xFFFFFFFF) if (dkeaddr == 0xFFFFFFFF)
return NULL; return NULL;
if (dkeaddr<0x20) if (dkeaddr<0x20)
return NULL; return NULL;
dkeaddr=_w95_adj_da(dkeaddr+0x1c); dkeaddr=_w95_adj_da(dkeaddr+0x1c);
off = (dkeaddr-0x3c)/0x1c; left=0;
for (i=0;i<n;i++) right=n-1;
if (nr2da[(i+off)%n].dkeaddr == dkeaddr) while(left<=right)
return keys+nr2da[(i+off)%n].nr; {
i=(left+right)/2;
if(nr2da[i].dkeaddr == dkeaddr)
return keys+nr2da[i].nr;
else if(nr2da[i].dkeaddr < dkeaddr)
left=i+1;
else
right=i-1;
}
/* 0x3C happens often, just report unusual values */ /* 0x3C happens often, just report unusual values */
if (dkeaddr!=0x3c) if (dkeaddr!=0x3c)
dprintf_reg(stddeb,"search hasn't found dkeaddr %lx?\n",dkeaddr); dprintf_reg(stddeb,"search hasn't found dkeaddr %lx?\n",dkeaddr);
@ -2759,23 +2769,30 @@ DWORD WINAPI RegDeleteKey32W(HKEY hkey,LPWSTR lpszSubKey) {
hkey,W2C(lpszSubKey,0) hkey,W2C(lpszSubKey,0)
); );
lpNextKey = lookup_hkey(hkey); lpNextKey = lookup_hkey(hkey);
if (!lpNextKey) if (!lpNextKey) {
dprintf_reg (stddeb, " Badkey[1].\n");
return SHELL_ERROR_BADKEY; return SHELL_ERROR_BADKEY;
}
/* we need to know the previous key in the hier. */ /* we need to know the previous key in the hier. */
if (!lpszSubKey || !*lpszSubKey) if (!lpszSubKey || !*lpszSubKey) {
dprintf_reg (stddeb, " Badkey[2].\n");
return SHELL_ERROR_BADKEY; return SHELL_ERROR_BADKEY;
}
split_keypath(lpszSubKey,&wps,&wpc); split_keypath(lpszSubKey,&wps,&wpc);
i = 0; i = 0;
lpxkey = lpNextKey; lpxkey = lpNextKey;
while (i<wpc-1) { while (i<wpc-1) {
lpxkey=lpNextKey->nextsub; lpxkey=lpNextKey->nextsub;
while (lpxkey) { while (lpxkey) {
dprintf_reg (stddeb, " Scanning [%s]\n",
W2C (lpxkey->keyname, 0));
if (!lstrcmpi32W(wps[i],lpxkey->keyname)) if (!lstrcmpi32W(wps[i],lpxkey->keyname))
break; break;
lpxkey=lpxkey->next; lpxkey=lpxkey->next;
} }
if (!lpxkey) { if (!lpxkey) {
FREE_KEY_PATH; FREE_KEY_PATH;
dprintf_reg (stddeb, " Not found.\n");
/* not found is success */ /* not found is success */
return SHELL_ERROR_SUCCESS; return SHELL_ERROR_SUCCESS;
} }
@ -2785,15 +2802,24 @@ DWORD WINAPI RegDeleteKey32W(HKEY hkey,LPWSTR lpszSubKey) {
lpxkey = lpNextKey->nextsub; lpxkey = lpNextKey->nextsub;
lplpPrevKey = &(lpNextKey->nextsub); lplpPrevKey = &(lpNextKey->nextsub);
while (lpxkey) { while (lpxkey) {
dprintf_reg (stddeb, " Scanning [%s]\n",
W2C (lpxkey->keyname, 0));
if (!lstrcmpi32W(wps[i],lpxkey->keyname)) if (!lstrcmpi32W(wps[i],lpxkey->keyname))
break; break;
lplpPrevKey = &(lpxkey->next); lplpPrevKey = &(lpxkey->next);
lpxkey = lpxkey->next; lpxkey = lpxkey->next;
} }
if (!lpxkey) if (!lpxkey) {
FREE_KEY_PATH;
dprintf_reg (stddeb, " Not found.\n");
return SHELL_ERROR_BADKEY;
return SHELL_ERROR_SUCCESS; return SHELL_ERROR_SUCCESS;
if (lpxkey->nextsub) }
if (lpxkey->nextsub) {
FREE_KEY_PATH;
dprintf_reg (stddeb, " Not empty.\n");
return SHELL_ERROR_CANTWRITE; return SHELL_ERROR_CANTWRITE;
}
*lplpPrevKey = lpxkey->next; *lplpPrevKey = lpxkey->next;
free(lpxkey->keyname); free(lpxkey->keyname);
if (lpxkey->class) if (lpxkey->class)
@ -2802,6 +2828,7 @@ DWORD WINAPI RegDeleteKey32W(HKEY hkey,LPWSTR lpszSubKey) {
free(lpxkey->values); free(lpxkey->values);
free(lpxkey); free(lpxkey);
FREE_KEY_PATH; FREE_KEY_PATH;
dprintf_reg (stddeb, " Done.\n");
return SHELL_ERROR_SUCCESS; return SHELL_ERROR_SUCCESS;
} }

View File

@ -15,11 +15,135 @@
#include "resource.h" #include "resource.h"
#include "dlgs.h" #include "dlgs.h"
#include "win.h" #include "win.h"
#include "graphics.h"
#include "cursoricon.h" #include "cursoricon.h"
#include "stddebug.h" #include "stddebug.h"
#include "debug.h" #include "debug.h"
#include "winreg.h" #include "winreg.h"
static const char * const SHELL_People[] =
{
"Bob Amstadt",
"Dag Asheim",
"Martin Ayotte",
"Peter Bajusz",
"Georg Beyerle",
"Ross Biro",
"Uwe Bonnes",
"Erik Bos",
"Fons Botman",
"John Brezak",
"Andrew Bulhak",
"John Burton",
"Niels de Carpentier",
"Jimen Ching",
"David A. Cuthbert",
"Huw D. M. Davies",
"Roman Dolejsi",
"Frans van Dorsselaer",
"Chris Faherty",
"Paul Falstad",
"David Faure",
"Claus Fischer",
"Olaf Flebbe",
"Chad Fraleigh",
"Peter Galbavy",
"Ramon Garcia",
"Matthew Ghio",
"Jody Goldberg",
"Hans de Graaff",
"Charles M. Hannum",
"Adrian Harvey",
"John Harvey",
"Cameron Heide",
"Jochen Hoenicke",
"Onno Hovers",
"Jeffrey Hsu",
"Miguel de Icaza",
"Jukka Iivonen",
"Lee Jaekil",
"Alexandre Julliard",
"Bang Jun-Young",
"Pavel Kankovsky",
"Jochen Karrer",
"Andreas Kirschbaum",
"Albrecht Kleine",
"Jon Konrath",
"Alex Korobka",
"Greg Kreider",
"Anand Kumria",
"Scott A. Laird",
"Andrew Lewycky",
"Martin von Loewis",
"Michiel van Loon",
"Kenneth MacDonald",
"Peter MacDonald",
"William Magro",
"Juergen Marquardt",
"Ricardo Massaro",
"Marcus Meissner",
"Graham Menhennitt",
"David Metcalfe",
"Bruce Milner",
"Steffen Moeller",
"Andreas Mohr",
"Philippe De Muyter",
"Itai Nahshon",
"Henrik Olsen",
"Michael Patra",
"Dimitrie O. Paun",
"Jim Peterson",
"Robert Pouliot",
"Keith Reynolds",
"Slaven Rezic",
"John Richardson",
"Rick Richardson",
"Doug Ridgway",
"Bernhard Rosenkraenzer",
"Johannes Ruscheinski",
"Thomas Sandford",
"Constantine Sapuntzakis",
"Pablo Saratxaga",
"Daniel Schepler",
"Peter Schlaile",
"Ulrich Schmid",
"Bernd Schmidt",
"Ingo Schneider",
"Victor Schneider",
"Yngvi Sigurjonsson",
"Stephen Simmons",
"Rick Sladkey",
"William Smith",
"Dominik Strasser",
"Vadim Strizhevsky",
"Erik Svendsen",
"Tristan Tarrant",
"Andrew Taylor",
"Duncan C Thomson",
"Goran Thyni",
"Jimmy Tirtawangsa",
"Jon Tombs",
"Linus Torvalds",
"Gregory Trubetskoy",
"Petri Tuomola",
"Michael Veksler",
"Sven Verdoolaege",
"Ronan Waide",
"Eric Warnke",
"Manfred Weichel",
"Morten Welinder",
"Lawson Whitney",
"Jan Willamowius",
"Carl Williams",
"Karl Guenter Wuensch",
"Eric Youngdale",
"James Youngman",
"Mikolaj Zalewski",
"John Zero",
NULL
};
/* .ICO file ICONDIR definitions */ /* .ICO file ICONDIR definitions */
#pragma pack(1) #pragma pack(1)
@ -395,6 +519,27 @@ typedef struct
HICON32 hIcon; HICON32 hIcon;
} ABOUT_INFO; } ABOUT_INFO;
#define IDC_STATIC_TEXT 100
#define IDC_LISTBOX 99
#define IDC_WINE_TEXT 98
#define DROP_FIELD_TOP (-15)
#define DROP_FIELD_HEIGHT 15
extern HICON32 hIconTitleFont;
static BOOL32 __get_dropline( HWND32 hWnd, LPRECT32 lprect )
{
HWND32 hWndCtl = GetDlgItem32(hWnd, IDC_WINE_TEXT);
if( hWndCtl )
{
GetWindowRect32( hWndCtl, lprect );
MapWindowPoints32( 0, hWnd, (LPPOINT32)lprect, 2 );
lprect->bottom = (lprect->top += DROP_FIELD_TOP);
return TRUE;
}
return FALSE;
}
/************************************************************************* /*************************************************************************
* AboutDlgProc32 (not an exported API function) * AboutDlgProc32 (not an exported API function)
@ -402,6 +547,7 @@ typedef struct
LRESULT WINAPI AboutDlgProc32( HWND32 hWnd, UINT32 msg, WPARAM32 wParam, LRESULT WINAPI AboutDlgProc32( HWND32 hWnd, UINT32 msg, WPARAM32 wParam,
LPARAM lParam ) LPARAM lParam )
{ {
HWND32 hWndCtl;
char Template[512], AppTitle[512]; char Template[512], AppTitle[512];
switch(msg) switch(msg)
@ -411,15 +557,123 @@ LRESULT WINAPI AboutDlgProc32( HWND32 hWnd, UINT32 msg, WPARAM32 wParam,
ABOUT_INFO *info = (ABOUT_INFO *)lParam; ABOUT_INFO *info = (ABOUT_INFO *)lParam;
if (info) if (info)
{ {
const char* const *pstr = SHELL_People;
SendDlgItemMessage32A(hWnd, stc1, STM_SETICON32,info->hIcon, 0); SendDlgItemMessage32A(hWnd, stc1, STM_SETICON32,info->hIcon, 0);
GetWindowText32A( hWnd, Template, sizeof(Template) ); GetWindowText32A( hWnd, Template, sizeof(Template) );
sprintf( AppTitle, Template, info->szApp ); sprintf( AppTitle, Template, info->szApp );
SetWindowText32A( hWnd, AppTitle ); SetWindowText32A( hWnd, AppTitle );
SetWindowText32A( GetDlgItem32(hWnd,100), info->szOtherStuff ); SetWindowText32A( GetDlgItem32(hWnd, IDC_STATIC_TEXT),
info->szOtherStuff );
hWndCtl = GetDlgItem32(hWnd, IDC_LISTBOX);
SendMessage32A( hWndCtl, WM_SETREDRAW, 0, 0 );
SendMessage32A( hWndCtl, WM_SETFONT, hIconTitleFont, 0 );
while (*pstr)
{
SendMessage32A( hWndCtl, LB_ADDSTRING32,
(WPARAM32)-1, (LPARAM)*pstr );
pstr++;
}
SendMessage32A( hWndCtl, WM_SETREDRAW, 1, 0 );
} }
} }
return 1; return 1;
case WM_PAINT:
{
RECT32 rect;
PAINTSTRUCT32 ps;
HDC32 hDC = BeginPaint32( hWnd, &ps );
if( __get_dropline( hWnd, &rect ) )
GRAPH_DrawLines( hDC, (LPPOINT32)&rect, 1, GetStockObject32( BLACK_PEN ) );
EndPaint32( hWnd, &ps );
}
break;
case WM_LBTRACKPOINT:
hWndCtl = GetDlgItem32(hWnd, IDC_LISTBOX);
if( (INT16)GetKeyState16( VK_CONTROL ) < 0 )
{
if( DragDetect32( hWndCtl, *((LPPOINT32)&lParam) ) )
{
INT32 idx = SendMessage32A( hWndCtl, LB_GETCURSEL32, 0, 0 );
if( idx != -1 )
{
INT32 length = SendMessage32A( hWndCtl, LB_GETTEXTLEN32, (WPARAM32)idx, 0 );
HGLOBAL16 hMemObj = GlobalAlloc16( GMEM_MOVEABLE, length + 1 );
char* pstr = (char*)GlobalLock16( hMemObj );
if( pstr )
{
HCURSOR16 hCursor = LoadCursor16( 0, MAKEINTRESOURCE(OCR_DRAGOBJECT) );
SendMessage32A( hWndCtl, LB_GETTEXT32, (WPARAM32)idx, (LPARAM)pstr );
SendMessage32A( hWndCtl, LB_DELETESTRING32, (WPARAM32)idx, 0 );
UpdateWindow32( hWndCtl );
if( !DragObject16((HWND16)hWnd, (HWND16)hWnd, DRAGOBJ_DATA, 0, (WORD)hMemObj, hCursor) )
SendMessage32A( hWndCtl, LB_ADDSTRING32, (WPARAM32)-1, (LPARAM)pstr );
}
if( hMemObj ) GlobalFree16( hMemObj );
}
}
}
break;
case WM_QUERYDROPOBJECT:
if( wParam == 0 )
{
LPDRAGINFO lpDragInfo = (LPDRAGINFO)PTR_SEG_TO_LIN((SEGPTR)lParam);
if( lpDragInfo && lpDragInfo->wFlags == DRAGOBJ_DATA )
{
RECT32 rect;
if( __get_dropline( hWnd, &rect ) )
{
POINT32 pt = { lpDragInfo->pt.x, lpDragInfo->pt.y };
rect.bottom += DROP_FIELD_HEIGHT;
if( PtInRect32( &rect, pt ) )
{
SetWindowLong32A( hWnd, DWL_MSGRESULT, 1 );
return TRUE;
}
}
}
}
break;
case WM_DROPOBJECT:
if( wParam == hWnd )
{
LPDRAGINFO lpDragInfo = (LPDRAGINFO)PTR_SEG_TO_LIN((SEGPTR)lParam);
if( lpDragInfo && lpDragInfo->wFlags == DRAGOBJ_DATA && lpDragInfo->hList )
{
char* pstr = (char*)GlobalLock16( (HGLOBAL16)(lpDragInfo->hList) );
if( pstr )
{
static char __appendix_str[] = " with";
hWndCtl = GetDlgItem32( hWnd, IDC_WINE_TEXT );
SendMessage32A( hWndCtl, WM_GETTEXT, 512, (LPARAM)Template );
if( !lstrncmp32A( Template, "WINE", 4 ) )
SetWindowText32A( GetDlgItem32(hWnd, IDC_STATIC_TEXT), Template );
else
{
char* pch = Template + strlen(Template) - strlen(__appendix_str);
*pch = '\0';
SendMessage32A( GetDlgItem32(hWnd, IDC_LISTBOX), LB_ADDSTRING32,
(WPARAM32)-1, (LPARAM)Template );
}
lstrcpy32A( Template, pstr );
lstrcat32A( Template, __appendix_str );
SetWindowText32A( hWndCtl, Template );
SetWindowLong32A( hWnd, DWL_MSGRESULT, 1 );
return TRUE;
}
}
}
break;
case WM_COMMAND: case WM_COMMAND:
if (wParam == IDOK) if (wParam == IDOK)
{ {
@ -1067,3 +1321,28 @@ void WINAPI FreeIconList( DWORD dw )
{ {
fprintf( stdnimp, "FreeIconList: empty stub\n" ); fprintf( stdnimp, "FreeIconList: empty stub\n" );
} }
/*************************************************************************
* SHELL32_DllGetClassObject [SHELL32.14]
*
* http://premium.microsoft.com/msdn/library/sdkdoc/api2_48fo.htm
*/
/* This is the wrong place, but where is the right one? */
typedef UINT32 REFCLSID32;
typedef UINT32 REFIID32;
typedef UINT32 HRESULT32;
#define E_OUTOFMEMORY 0x8007000EL
HRESULT32 WINAPI SHELL32_DllGetClassObject (REFCLSID32 clsid,
REFIID32 riid,
LPVOID *ppv)
{
HRESULT32 hres = E_OUTOFMEMORY;
*ppv = NULL;
fprintf (stdnimp, "SHELL32_DllGetClassObject (0x%x,0x%x,%p) -- STUB\n",
clsid, riid, ppv);
return hres;
}

View File

@ -166,8 +166,7 @@ static int testFileExclusiveExistence(
} }
int static int read_xx_header(HFILE32 lzfd) {
read_xx_header(HFILE32 lzfd) {
IMAGE_DOS_HEADER mzh; IMAGE_DOS_HEADER mzh;
char magic[2]; char magic[2];
@ -189,8 +188,7 @@ read_xx_header(HFILE32 lzfd) {
} }
int static int find_ne_resource(
find_ne_resource(
HFILE32 lzfd,SEGPTR typeid,SEGPTR resid, HFILE32 lzfd,SEGPTR typeid,SEGPTR resid,
BYTE **resdata,int *reslen,DWORD *off BYTE **resdata,int *reslen,DWORD *off
) { ) {
@ -319,7 +317,7 @@ extern LPIMAGE_RESOURCE_DIRECTORY GetResDirEntryW(
/* Loads the specified PE resource. /* Loads the specified PE resource.
* FIXME: shouldn't load the whole image * FIXME: shouldn't load the whole image
*/ */
int static int
find_pe_resource( find_pe_resource(
HFILE32 lzfd,LPWSTR typeid,LPWSTR resid, HFILE32 lzfd,LPWSTR typeid,LPWSTR resid,
BYTE **resdata,int *reslen,DWORD *off BYTE **resdata,int *reslen,DWORD *off
@ -471,7 +469,7 @@ DWORD WINAPI GetFileResource(LPCSTR filename,SEGPTR restype,SEGPTR resid,
res= find_ne_resource(lzfd,restype,resid,&resdata,&reslen,&off); res= find_ne_resource(lzfd,restype,resid,&resdata,&reslen,&off);
break; break;
case IMAGE_NT_SIGNATURE: case IMAGE_NT_SIGNATURE:
res= find_pe_resource(lzfd,restype,resid,&resdata,&reslen,&off); res= find_pe_resource(lzfd,(LPWSTR)restype,(LPWSTR)resid,&resdata,&reslen,&off);
break; break;
} }
LZClose32(lzfd); LZClose32(lzfd);
@ -938,10 +936,14 @@ _error2vif(DWORD error) {
} }
} }
/* VerInstallFile32A
*/
DWORD WINAPI VerInstallFile32A( DWORD WINAPI VerInstallFile32A(
UINT32 flags,LPCSTR srcfilename,LPCSTR destfilename,LPCSTR srcdir, UINT32 flags,LPCSTR srcfilename,LPCSTR destfilename,LPCSTR srcdir,
LPCSTR destdir,LPCSTR curdir,LPSTR tmpfile,UINT32 *tmpfilelen ) LPCSTR destdir,LPCSTR curdir,LPSTR tmpfile,UINT32 *tmpfilelen )
{ {
LPCSTR pdest;
char destfn[260],tmpfn[260],srcfn[260]; char destfn[260],tmpfn[260],srcfn[260];
HFILE32 hfsrc,hfdst; HFILE32 hfsrc,hfdst;
DWORD attr,ret,xret,tmplast; DWORD attr,ret,xret,tmplast;
@ -953,12 +955,14 @@ DWORD WINAPI VerInstallFile32A(
); );
xret = 0; xret = 0;
sprintf(srcfn,"%s\\%s",srcdir,srcfilename); sprintf(srcfn,"%s\\%s",srcdir,srcfilename);
sprintf(destfn,"%s\\%s",destdir,destfilename); if (!destdir || !*destdir) pdest = srcdir;
else pdest = destdir;
sprintf(destfn,"%s\\%s",pdest,destfilename);
hfsrc=LZOpenFile32A(srcfn,&ofs,OF_READ); hfsrc=LZOpenFile32A(srcfn,&ofs,OF_READ);
if (hfsrc==HFILE_ERROR32) if (hfsrc==HFILE_ERROR32)
return VIF_CANNOTREADSRC; return VIF_CANNOTREADSRC;
sprintf(tmpfn,"%s\\%s",destdir,destfilename); sprintf(tmpfn,"%s\\%s",pdest,destfilename);
tmplast=strlen(destdir)+1; tmplast=strlen(pdest)+1;
attr = GetFileAttributes32A(tmpfn); attr = GetFileAttributes32A(tmpfn);
if (attr!=-1) { if (attr!=-1) {
if (attr & FILE_ATTRIBUTE_READONLY) { if (attr & FILE_ATTRIBUTE_READONLY) {
@ -970,8 +974,8 @@ DWORD WINAPI VerInstallFile32A(
attr = -1; attr = -1;
if (flags & VIFF_FORCEINSTALL) { if (flags & VIFF_FORCEINSTALL) {
if (tmpfile[0]) { if (tmpfile[0]) {
sprintf(tmpfn,"%s\\%s",destdir,tmpfile); sprintf(tmpfn,"%s\\%s",pdest,tmpfile);
tmplast = strlen(destdir)+1; tmplast = strlen(pdest)+1;
attr = GetFileAttributes32A(tmpfn); attr = GetFileAttributes32A(tmpfn);
/* if it exists, it has been copied by the call before. /* if it exists, it has been copied by the call before.
* we jump over the copy part... * we jump over the copy part...
@ -981,7 +985,7 @@ DWORD WINAPI VerInstallFile32A(
if (attr == -1) { if (attr == -1) {
char *s; char *s;
GetTempFileName32A(destdir,"ver",0,tmpfn); /* should not fail ... */ GetTempFileName32A(pdest,"ver",0,tmpfn); /* should not fail ... */
s=strrchr(tmpfn,'\\'); s=strrchr(tmpfn,'\\');
if (s) if (s)
tmplast = s-tmpfn; tmplast = s-tmpfn;
@ -1078,7 +1082,7 @@ DWORD WINAPI VerInstallFile32A(
if ((!(flags & VIFF_DONTDELETEOLD)) && if ((!(flags & VIFF_DONTDELETEOLD)) &&
curdir && curdir &&
*curdir && *curdir &&
lstrcmpi32A(curdir,destdir) lstrcmpi32A(curdir,pdest)
) { ) {
char curfn[260]; char curfn[260];

262
misc/version.c Normal file
View File

@ -0,0 +1,262 @@
/*
* Windows version functions
*
* Copyright 1997 Alexandre Julliard
* Copyright 1997 Marcus Meissner
*/
#include <stdio.h>
#include "windows.h"
#include "winbase.h"
#include "process.h"
#include "options.h"
typedef enum
{
WIN31, /* Windows 3.1 */
WIN95, /* Windows 95 */
NT351, /* Windows NT 3.51 */
NT40, /* Windows NT 4.0 */
NB_VERSIONS
} VERSION;
typedef struct
{
LONG getVersion16;
LONG getVersion32;
OSVERSIONINFO32A getVersionEx;
} VERSION_DATA;
/* FIXME: compare values below with original and fix */
static const VERSION_DATA VersionData[NB_VERSIONS] =
{
/* WIN31 */
{
MAKELONG( 0x0a03, 0x0616 ), /* DOS 6.22 */
MAKELONG( 0x0a03, 0x8000 ),
{
sizeof(OSVERSIONINFO32A), 3, 10, 0,
VER_PLATFORM_WIN32s, "Win32s 1.3"
}
},
/* WIN95 */
{
0x07005F03,
0xC0000004,
{
sizeof(OSVERSIONINFO32A), 4, 0, 0x40003B6,
VER_PLATFORM_WIN32_WINDOWS, "Win95"
}
},
/* NT351 */
{
0x05000A03,
0x04213303,
{
sizeof(OSVERSIONINFO32A), 3, 51, 0x421,
VER_PLATFORM_WIN32_NT, "Service Pack 2"
}
},
/* NT40 */
{
0x05000A03,
0x05650004,
{
sizeof(OSVERSIONINFO32A), 4, 0, 0x565,
VER_PLATFORM_WIN32_NT, "Service Pack 3"
}
}
};
static const char *VersionNames[NB_VERSIONS] =
{
"win31",
"win95",
"nt351",
"nt40"
};
/* the current version has not been autodetected but forced via cmdline */
static BOOL32 versionForced = FALSE;
static VERSION defaultVersion = WIN31;
/**********************************************************************
* VERSION_ParseVersion
*/
void VERSION_ParseVersion( char *arg )
{
int i;
for (i = 0; i < NB_VERSIONS; i++)
{
if (!strcmp( VersionNames[i], arg ))
{
defaultVersion = (VERSION)i;
versionForced = TRUE;
return;
}
}
fprintf( stderr, "Invalid winver value '%s' specified.\n", arg );
fprintf( stderr, "Valid versions are:" );
for (i = 0; i < NB_VERSIONS; i++)
fprintf( stderr, " '%s'%c", VersionNames[i],
(i == NB_VERSIONS - 1) ? '\n' : ',' );
}
/**********************************************************************
* VERSION_get_version
*/
static VERSION VERSION_GetVersion(void)
{
LPIMAGE_NT_HEADERS peheader;
if (versionForced) /* user has overridden any sensible checks */
return defaultVersion;
if (!pCurrentProcess) /* at startuptime probably */
return defaultVersion;
if (!pCurrentProcess->exe_modref)
return WIN31; /* FIXME: hmm, look at DDB.version ? */
peheader = pCurrentProcess->exe_modref->pe_module->pe_header;
if (peheader->OptionalHeader.MajorSubsystemVersion == 4)
/* FIXME: NT4 has the same majorversion; add a check here for it. */
return WIN95;
if (peheader->OptionalHeader.MajorSubsystemVersion == 3)
{
/* Win3.10 */
if (peheader->OptionalHeader.MinorSubsystemVersion <= 11) return WIN31;
/* NT 3.51 */
if (peheader->OptionalHeader.MinorSubsystemVersion == 51) return NT351;
}
fprintf(stderr,"VERSION_GetVersion: unknown subsystem version: %04x.%04x, please report.\n",
peheader->OptionalHeader.MajorSubsystemVersion,
peheader->OptionalHeader.MinorSubsystemVersion );
return defaultVersion;
}
/***********************************************************************
* GetVersion16 (KERNEL.3)
*/
LONG WINAPI GetVersion16(void)
{
VERSION ver = VERSION_GetVersion();
return VersionData[ver].getVersion16;
}
/***********************************************************************
* GetVersion32 (KERNEL32.427)
*/
LONG WINAPI GetVersion32(void)
{
VERSION ver = VERSION_GetVersion();
return VersionData[ver].getVersion32;
}
/***********************************************************************
* GetVersionEx32A (KERNEL32.428)
*/
BOOL32 WINAPI GetVersionEx32A(OSVERSIONINFO32A *v)
{
VERSION ver = VERSION_GetVersion();
if (v->dwOSVersionInfoSize != sizeof(OSVERSIONINFO32A))
{
fprintf(stderr,"wrong OSVERSIONINFO size from app");
return FALSE;
}
v->dwMajorVersion = VersionData[ver].getVersionEx.dwMajorVersion;
v->dwMinorVersion = VersionData[ver].getVersionEx.dwMinorVersion;
v->dwBuildNumber = VersionData[ver].getVersionEx.dwBuildNumber;
v->dwPlatformId = VersionData[ver].getVersionEx.dwPlatformId;
strcpy( v->szCSDVersion, VersionData[ver].getVersionEx.szCSDVersion );
return TRUE;
}
/***********************************************************************
* GetVersionEx32W (KERNEL32.429)
*/
BOOL32 WINAPI GetVersionEx32W(OSVERSIONINFO32W *v)
{
VERSION ver = VERSION_GetVersion();
if (v->dwOSVersionInfoSize!=sizeof(OSVERSIONINFO32W))
{
fprintf(stderr,"wrong OSVERSIONINFO size from app");
return FALSE;
}
v->dwMajorVersion = VersionData[ver].getVersionEx.dwMajorVersion;
v->dwMinorVersion = VersionData[ver].getVersionEx.dwMinorVersion;
v->dwBuildNumber = VersionData[ver].getVersionEx.dwBuildNumber;
v->dwPlatformId = VersionData[ver].getVersionEx.dwPlatformId;
lstrcpyAtoW( v->szCSDVersion, VersionData[ver].getVersionEx.szCSDVersion );
return TRUE;
}
/***********************************************************************
* GetWinFlags (KERNEL.132)
*/
DWORD WINAPI GetWinFlags(void)
{
static const long cpuflags[5] =
{ WF_CPU086, WF_CPU186, WF_CPU286, WF_CPU386, WF_CPU486 };
SYSTEM_INFO si;
OSVERSIONINFO32A ovi;
DWORD result;
GetSystemInfo(&si);
/* There doesn't seem to be any Pentium flag. */
result = cpuflags[MIN (si.wProcessorLevel, 4)];
switch(Options.mode)
{
case MODE_STANDARD:
result |= WF_STANDARD | WF_PMODE | WF_80x87;
break;
case MODE_ENHANCED:
result |= WF_ENHANCED | WF_PMODE | WF_80x87 | WF_PAGING;
break;
default:
fprintf(stderr, "Unknown mode set? This shouldn't happen. Check GetWinFlags()!\n");
break;
}
if (si.wProcessorLevel >= 4) result |= WF_HASCPUID;
ovi.dwOSVersionInfoSize = sizeof(ovi);
GetVersionEx32A(&ovi);
if (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT)
result |= WF_WIN32WOW; /* undocumented WF_WINNT */
return result;
}
/***********************************************************************
* GetWinDebugInfo (KERNEL.355)
*/
BOOL16 WINAPI GetWinDebugInfo(WINDEBUGINFO *lpwdi, UINT16 flags)
{
printf("GetWinDebugInfo(%8lx,%d) stub returning 0\n",
(unsigned long)lpwdi, flags);
/* 0 means not in debugging mode/version */
/* Can this type of debugging be used in wine ? */
/* Constants: WDI_OPTIONS WDI_FILTER WDI_ALLOCBREAK */
return 0;
}
/***********************************************************************
* SetWinDebugInfo (KERNEL.356)
*/
BOOL16 WINAPI SetWinDebugInfo(WINDEBUGINFO *lpwdi)
{
printf("SetWinDebugInfo(%8lx) stub returning 0\n", (unsigned long)lpwdi);
/* 0 means not in debugging mode/version */
/* Can this type of debugging be used in wine ? */
/* Constants: WDI_OPTIONS WDI_FILTER WDI_ALLOCBREAK */
return 0;
}

View File

@ -7,7 +7,8 @@ MODULE = miscemu
C_SRCS = \ C_SRCS = \
emulate.c \ emulate.c \
instr.c instr.c \
main.c
all: $(MODULE).o all: $(MODULE).o

120
miscemu/main.c Normal file
View File

@ -0,0 +1,120 @@
/*
* Emulator initialisation code
*
*/
#include <stdio.h>
#include "windows.h"
#include "callback.h"
#include "debugger.h"
#include "miscemu.h"
#include "module.h"
#include "options.h"
/***********************************************************************
* Emulator initialisation
*/
BOOL32 MAIN_EmulatorInit(void)
{
extern BOOL32 MAIN_KernelInit(void);
extern BOOL32 MAIN_UserInit(void);
extern BOOL32 WIN16DRV_Init(void);
extern BOOL32 RELAY_Init(void);
/* Initialize the kernel */
if (!MAIN_KernelInit()) return FALSE;
/* Initialize relay code */
if (!RELAY_Init()) return FALSE;
/* Initialize signal handling */
if (!SIGNAL_InitEmulator()) return FALSE;
/* Create the Win16 printer driver */
if (!WIN16DRV_Init()) return FALSE;
/* Initialize all the USER stuff */
return MAIN_UserInit();
}
/**********************************************************************
* main
*/
int main( int argc, char *argv[] )
{
extern BOOL32 MAIN_WineInit( int *argc, char *argv[] );
extern void *CALL32_Init(void);
extern char * DEBUG_argv0;
int i,loaded;
HINSTANCE32 handle;
__winelib = 0; /* First of all, clear the Winelib flag */
/*
* Save this so that the internal debugger can get a hold of it if
* it needs to.
*/
DEBUG_argv0 = argv[0];
if (!MAIN_WineInit( &argc, argv )) return 1;
/* Handle -dll option (hack) */
if (Options.dllFlags)
{
if (!BUILTIN_ParseDLLOptions( Options.dllFlags ))
{
fprintf( stderr, "%s: Syntax: -dll +xxx,... or -dll -xxx,...\n",
argv[0] );
BUILTIN_PrintDLLs();
exit(1);
}
}
/* Initialize everything */
if (!MAIN_EmulatorInit()) return 1;
/* Initialize CALL32 routines */
/* This needs to be done just before task-switching starts */
IF1632_CallLargeStack = (int (*)(int (*func)(), void *arg))CALL32_Init();
loaded=0;
for (i = 1; i < argc; i++)
{
if ((handle = WinExec32( argv[i], SW_SHOWNORMAL )) < 32)
{
fprintf(stderr, "wine: can't exec '%s': ", argv[i]);
switch (handle)
{
case 2: fprintf( stderr, "file not found\n" ); break;
case 11: fprintf( stderr, "invalid exe file\n" ); break;
case 21: fprintf( stderr, "win32 executable\n" ); break;
default: fprintf( stderr, "error=%d\n", handle ); break;
}
return 1;
}
loaded++;
}
if (!loaded) { /* nothing loaded */
extern void MAIN_Usage(char*);
MAIN_Usage(argv[0]);
return 1;
}
if (!GetNumTasks())
{
fprintf( stderr, "wine: no executable file found.\n" );
return 0;
}
if (Options.debug) DEBUG_AddModuleBreakpoints();
Yield(); /* Start the first task */
fprintf( stderr, "WinMain: Should never happen: returned from Yield()\n" );
return 0;
}

View File

@ -1,4 +1,4 @@
DEFS = -D__WINE__ DEFS = @DLLFLAGS@ -D__WINE__
TOPSRCDIR = @top_srcdir@ TOPSRCDIR = @top_srcdir@
TOPOBJDIR = .. TOPOBJDIR = ..
SRCDIR = @srcdir@ SRCDIR = @srcdir@

View File

@ -34,7 +34,7 @@ typedef struct
DWORD edx; DWORD edx;
DWORD ecx; DWORD ecx;
DWORD eax; DWORD eax;
WORD flags; WORD fl;
WORD es; WORD es;
WORD ds; WORD ds;
WORD fs; WORD fs;
@ -45,7 +45,186 @@ typedef struct
WORD ss; WORD ss;
} REALMODECALL; } REALMODECALL;
extern void do_mscdex( CONTEXT *context );
/**********************************************************************
* INT_GetRealModeContext
*/
static void INT_GetRealModeContext( REALMODECALL *call, CONTEXT *context )
{
EAX_reg(context) = call->eax;
EBX_reg(context) = call->ebx;
ECX_reg(context) = call->ecx;
EDX_reg(context) = call->edx;
ESI_reg(context) = call->esi;
EDI_reg(context) = call->edi;
EBP_reg(context) = call->ebp;
EFL_reg(context) = call->fl;
EIP_reg(context) = call->ip;
ESP_reg(context) = call->sp;
CS_reg(context) = call->cs;
DS_reg(context) = call->ds;
ES_reg(context) = call->es;
FS_reg(context) = call->fs;
GS_reg(context) = call->gs;
}
/**********************************************************************
* INT_SetRealModeContext
*/
static void INT_SetRealModeContext( REALMODECALL *call, CONTEXT *context )
{
call->eax = EAX_reg(context);
call->ebx = EBX_reg(context);
call->ecx = ECX_reg(context);
call->edx = EDX_reg(context);
call->esi = ESI_reg(context);
call->edi = EDI_reg(context);
call->ebp = EBP_reg(context);
call->fl = FL_reg(context);
call->ip = IP_reg(context);
call->sp = SP_reg(context);
call->cs = CS_reg(context);
call->ds = DS_reg(context);
call->es = ES_reg(context);
call->fs = FS_reg(context);
call->gs = GS_reg(context);
}
/**********************************************************************
* INT_DoRealModeInt
*/
static void INT_DoRealModeInt( CONTEXT *context )
{
CONTEXT realmode_ctx;
REALMODECALL *call = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context),
DI_reg(context) );
INT_GetRealModeContext( call, &realmode_ctx );
RESET_CFLAG(context);
switch (BL_reg(context))
{
case 0x2f: /* int2f */
switch (AH_reg(&realmode_ctx))
{
case 0x15:
/* MSCDEX hook */
do_mscdex( &realmode_ctx );
break;
default:
SET_CFLAG(context);
break;
}
break;
case 0x21: /* int21 */
switch (AH_reg(&realmode_ctx))
{
case 0x52:
ES_reg(&realmode_ctx) = 0;
EBX_reg(&realmode_ctx) = 0;
break;
case 0x65:
switch (AL_reg(&realmode_ctx))
{
case 0x06:
{/* get collate table */
/* ES:DI is a REALMODE pointer to 5 byte dosmem
* we fill that with 0x6, realmode pointer to collateTB
*/
char *table = DOSMEM_MapRealToLinear(
MAKELONG(EDI_reg(&realmode_ctx),ES_reg(&realmode_ctx)));
*(BYTE*)table = 0x06;
*(DWORD*)(table+1) = DOSMEM_CollateTable;
CX_reg(&realmode_ctx) = 258;/*FIXME: size of table?*/
break;
}
default:
SET_CFLAG(context);
break;
}
break;
case 0x44:
switch (AL_reg(&realmode_ctx))
{
case 0x0D:
{/* generic block device request */
BYTE *dataptr = DOSMEM_MapRealToLinear(
MAKELONG(EDX_reg(&realmode_ctx),DS_reg(&realmode_ctx)));
int drive = DOS_GET_DRIVE(BL_reg(&realmode_ctx));
if (CH_reg(&realmode_ctx) != 0x08)
{
SET_CFLAG(context);
break;
}
switch (CL_reg(&realmode_ctx))
{
case 0x66:
{
char label[12],fsname[9],path[4];
DWORD serial;
strcpy(path,"x:\\");path[0]=drive+'A';
GetVolumeInformation32A(path,label,12,&serial,NULL,NULL,fsname,9);
*(WORD*)dataptr = 0;
memcpy(dataptr+2,&serial,4);
memcpy(dataptr+6,label ,11);
memcpy(dataptr+17,fsname,8);
break;
}
case 0x60: /* get device parameters */
/* used by defrag.exe of win95 */
memset(dataptr, 0, 0x26);
dataptr[0] = 0x04;
dataptr[6] = 0; /* media type */
if (drive > 1)
{
dataptr[1] = 0x05; /* fixed disk */
setword(&dataptr[2], 0x01); /* non removable */
setword(&dataptr[4], 0x300); /* # of cylinders */
}
else
{
dataptr[1] = 0x07; /* block dev, floppy */
setword(&dataptr[2], 0x02); /* removable */
setword(&dataptr[4], 80); /* # of cylinders */
}
CreateBPB(drive, &dataptr[7]);
break;
default:
SET_CFLAG(context);
break;
}
}
break;
default:
SET_CFLAG(context);
break;
}
break;
default:
SET_CFLAG(context);
break;
}
break;
default:
SET_CFLAG(context);
break;
}
if (EFL_reg(context)&1)
fprintf(stdnimp,
"RealModeInt %02x: EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n"
" ESI=%08lx EDI=%08lx DS=%04lx ES=%04lx\n",
BL_reg(context), EAX_reg(&realmode_ctx),
EBX_reg(&realmode_ctx), ECX_reg(&realmode_ctx),
EDX_reg(&realmode_ctx), ESI_reg(&realmode_ctx),
EDI_reg(&realmode_ctx), DS_reg(&realmode_ctx),
ES_reg(&realmode_ctx) );
INT_SetRealModeContext( call, &realmode_ctx );
}
/********************************************************************** /**********************************************************************
* INT_Int31Handler * INT_Int31Handler
@ -206,118 +385,10 @@ void WINAPI INT_Int31Handler( CONTEXT *context )
DX_reg(context) )); DX_reg(context) ));
break; break;
case 0x0300: /* Simulate real mode interrupt case 0x0300: /* Simulate real mode interrupt */
* Interrupt number is in BL, flags are in BH INT_DoRealModeInt( context );
* ES:DI points to real-mode call structure
* Currently we just print it out and return error.
*/
RESET_CFLAG(context);
{
REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) );
switch (BL_reg(context)) {
case 0x2f: /* int2f */
switch ((p->eax & 0xFF00)>>8) {
case 0x15:
/* MSCDEX hook */
AX_reg(context) = p->eax & 0xFFFF;
do_mscdex( context );
break;
default:
SET_CFLAG(context);
break;
}
break;
case 0x21: /* int21 */
switch ((p->eax & 0xFF00)>>8) {
case 0x65:
switch (p->eax & 0xFF) {
case 06:{/* get collate table */
char *table;
/* ES:DI is a REALMODE pointer to 5 byte dosmem
* we fill that with 0x6, realmode pointer to collateTB
*/
table = DOSMEM_MapRealToLinear(MAKELONG(p->edi,p->es));
*(BYTE*)table = 0x06;
*(DWORD*)(table+1) = DOSMEM_CollateTable;
CX_reg(context) = 258;/*FIXME: size of table?*/
break;
}
default:
SET_CFLAG(context);
}
break;
case 0x44:
switch (p->eax & 0xFF) {
case 0x0D:{/* generic block device request */
BYTE *dataptr = DOSMEM_MapRealToLinear((p->ds)*0x1000+(p->edx & 0xFFFF));
int drive = DOS_GET_DRIVE(p->ebx&0xFF);
if ((p->ecx & 0xFF00) != 0x0800) {
SET_CFLAG(context);
break;
}
switch (p->ecx & 0xFF) {
case 0x66:{
char label[12],fsname[9],path[4];
DWORD serial;
strcpy(path,"x:\\");path[0]=drive+'A';
GetVolumeInformation32A(path,label,12,&serial,NULL,NULL,fsname,9);
*(WORD*)dataptr = 0;
memcpy(dataptr+2,&serial,4);
memcpy(dataptr+6,label ,11);
memcpy(dataptr+17,fsname,8);
break;
}
case 0x60: /* get device parameters */
/* used by defrag.exe of win95 */
memset(dataptr, 0, 0x26);
dataptr[0] = 0x04;
dataptr[6] = 0; /* media type */
if (drive > 1) {
dataptr[1] = 0x05; /* fixed disk */
setword(&dataptr[2], 0x01); /* non removable */
setword(&dataptr[4], 0x300); /* # of cylinders */
} else {
dataptr[1] = 0x07; /* block dev, floppy */
setword(&dataptr[2], 0x02); /* removable */
setword(&dataptr[4], 80); /* # of cylinders */
}
CreateBPB(drive, &dataptr[7]);
break;
default:
SET_CFLAG(context);
break;
}
}
break;
default:
SET_CFLAG(context);
break;
}
break;
default:
SET_CFLAG(context);
break;
}
break;
default:
SET_CFLAG(context);
break;
}
if (EFL_reg(context)&1) {
fprintf(stdnimp,
"RealModeInt %02x: EAX=%08lx EBX=%08lx ECX=%08lx EDX=%08lx\n"
" ESI=%08lx EDI=%08lx ES=%04x DS=%04x\n",
BL_reg(context), p->eax, p->ebx, p->ecx, p->edx,
p->esi, p->edi, p->es, p->ds
);
}
}
break; break;
case 0x0301: /* Call real mode procedure with far return */ case 0x0301: /* Call real mode procedure with far return */
{ {
REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) ); REALMODECALL *p = (REALMODECALL *)PTR_SEG_OFF_TO_LIN( ES_reg(context), DI_reg(context) );

Some files were not shown because too many files have changed in this diff Show More