Release 970804

Sun Aug  3 14:03:43 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [documentation/Makefile.in]
	Create links for files included from wine.texinfo.

	* [wine.man]
	Moved to documentation dir.

	* [if1632/builtin.c]
	Made SYSTEM.DLL always loaded by default.

	* [loader/signal.c] [if1632/signal.c]
	Split signal.c in generic/emulator-specific parts.

	* [misc/system.c] [if1632/thunk.c]
	Implemented system timer functions.
	Fixed InquireSystem parameters.

	* [msdos/ioports.c]
	Defined inb/outb functions to avoid including asm/io.h.
	Use the right instruction for word and dword direct access.

	* [multimedia/mmsystem.c]
	Fixed CallTo16 usage.

Sat Aug 2 13:05:23 1997  Andreas Mohr <100.30936@germany.net>

	* [controls/edit.c]
	When text is inserted into a newly created editline, the caret
	is placed after the text. Should be placed before the text. Fixed.

	* [files/file.c]
	Removed O_TRUNC flag from OF_WRITE mode in _lopen32().
	According to doc _lopen() never truncates files.

	* [if1632/user.spec] [misc/comm.c]
	Added stub for EnableCommNotification().

	* [misc/ver.c]
	Fixed problem with VerQueryValue*() running over end of name table
	in rare cases.

	* [msdos/int21.c]
	Enhanced ioctlGetDeviceInfo() to correctly return the current drive.

	* [multimedia/joystick.c] [windows/message.c]
	Added joystick support !!!
	Needs Linux >= 2.1.45 or joystick-0.8.0.tar.gz.

Fri Aug  1 18:02:09 1997  Morten Welinder  <terra@diku.dk>

	* [if1632/user32.spec]
	Define DrawAnimatedRects32.

	* [graphics/painting.c]
	(DrawAnimatedRects32): Create stub.

	* [misc/registry.c]
	Cope with NULL class in RegQueryInfoKey32A.

	* [if1632/user32.spec]
	Add GetMenuItemInfo32[AW].

	* [controls/menu.c]
	(InsertMenu32A): Upgrade flags to 8 hex-digits.
	(MENUEX_ParseResource): First shot at implementation.
	(LoadMenuIndirect32A): Handle extended menus.
	(GetMenuItemInfo32[AW]): First shot at implementation.

	* [include/windows.h]
	Define MFT_*, MFS_*, MIIM_* macros.  Define MENUITEMINFO[AW]
 	structures and pointers.

	* [Makefile.in]
	(etags): Add TAGS as target.

	* [if1632/comctl32.spec]
	Use Windows 95's ordinals.  Add a few missing stubs.

Thu Jul 31 14:01:13 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [objects/color.c]
	Fix for 16 color mode of XFree.

	* [if1632/kernel32.spec][win32/ordinals.c]
	Moved/added some ordinal only exported functions from kernel32.dll
	(mostly thunking preparation stuff).

Wed Jul 30 09:16:38 1997  John Harvey <john@division.co.uk>

	* [graphics/win16drv/init.c] [include/win16drv.h]
        Escape(SETABORTPROC) returns success to keep pbrush.exe happy.
        Escape(NEXTBAND) implemented to make HP PCL printer driver work in
 	word.  Stub for PATBLT added to start work on printing more than
 	text.

Mon Jul 28 13:14:28 1997  Victor Schneider <vischne@ibm.net>

	* [libtest/expand.c]
	New Winelib test program.

Wed Jul 23 09:37:13 1997  Adrian Harvey <adrian@select.com.au>

	* [tools/build.c] [tools/build-spec.txt] [if1632/kernel.spec]
	  [if1632/user.spec]
	Added ability to set filename wine considers the built-in DLLs 
	to be in  to something other than name.DLL with new "file" key
	in .spec files.
	Made kernel filename KRNL386.EXE (some programs use this name 
	explicitly - ChemOffice install now starts up).
	Made user filename USER.EXE (just to be tidy).

Sun Jul 20 23:51:02 1997  David A. Cuthbert <dacut@henry.ece.cmu.edu>

	* [controls/menu.c] [misc/tweak.c] [include/tweak.h]
	Fixed MENU_KeyLeft and MENU_KeyRight to handle multiple-column
	menus.  Misc menu drawing issues for Win95 tweaks fixed.  Misc
	warnings fixed.

	* [loader/module.c]
	Spaces are now permitted in file/path names on the command line.
	If multiple matches can be made, the preferred match is the
	path/file with fewer spaces.

Tue Jul 29 02:21:15 1997  Bruce Milner <Bruce.Milner@genetics.utah.edu>

	* [misc/compobj.c]
	Added CLSIDFromString and StringFromCLSID.
This commit is contained in:
Alexandre Julliard 1997-08-04 16:34:36 +00:00
parent d37eb3656c
commit 641ee76ace
73 changed files with 3856 additions and 920 deletions

View File

@ -1,13 +1,13 @@
This is release 970720 of Wine, the MS Windows emulator. This is still a
This is release 970804 of Wine, the MS Windows emulator. This is still a
developer's only release. There are many bugs and many unimplemented API
features. Most applications still do not work correctly.
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
forget to include a ChangeLog entry.
WHAT'S NEW with Wine-970720: (see ChangeLog for details)
- Preliminary Win95 look&feel implementation.
- Start of texinfo documentation.
WHAT'S NEW with Wine-970804: (see ChangeLog for details)
- Joystick support.
- More Win32 stuff.
- Lots of bug fixes.
See the README file in the distribution for installation instructions.
@ -16,10 +16,10 @@ Because of lags created by using mirror, this message may reach you before
the release is available at the ftp sites. The sources will be available
from the following locations:
ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970720.tar.gz
ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970720.tar.gz
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970720.tar.gz
ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-970720.tar.gz
ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970804.tar.gz
ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970804.tar.gz
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970804.tar.gz
ftp://ftp.progsoc.uts.edu.au/pub/Wine/development/Wine-970804.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite.

6
BUGS
View File

@ -9,6 +9,10 @@ As of June 1997 -
General:
* We need to do InsertMenuItem32[AW] and then code most of the other
inserting function in terms of this. Without this, we cannot support
all the new extended menus. Not hard, but slightly big.
* TrueType, .FON rasterizer.
* No thread/process scheduling support in Win32 code.
@ -53,5 +57,3 @@ Miscellaneous:
Where to look in source files:
* grep for FIXME in the source files.

130
ChangeLog
View File

@ -1,3 +1,133 @@
----------------------------------------------------------------------
Sun Aug 3 14:03:43 1997 Alexandre Julliard <julliard@lrc.epfl.ch>
* [documentation/Makefile.in]
Create links for files included from wine.texinfo.
* [wine.man]
Moved to documentation dir.
* [if1632/builtin.c]
Made SYSTEM.DLL always loaded by default.
* [loader/signal.c] [if1632/signal.c]
Split signal.c in generic/emulator-specific parts.
* [misc/system.c] [if1632/thunk.c]
Implemented system timer functions.
Fixed InquireSystem parameters.
* [msdos/ioports.c]
Defined inb/outb functions to avoid including asm/io.h.
Use the right instruction for word and dword direct access.
* [multimedia/mmsystem.c]
Fixed CallTo16 usage.
Sat Aug 2 13:05:23 1997 Andreas Mohr <100.30936@germany.net>
* [controls/edit.c]
When text is inserted into a newly created editline, the caret
is placed after the text. Should be placed before the text. Fixed.
* [files/file.c]
Removed O_TRUNC flag from OF_WRITE mode in _lopen32().
According to doc _lopen() never truncates files.
* [if1632/user.spec] [misc/comm.c]
Added stub for EnableCommNotification().
* [misc/ver.c]
Fixed problem with VerQueryValue*() running over end of name table
in rare cases.
* [msdos/int21.c]
Enhanced ioctlGetDeviceInfo() to correctly return the current drive.
* [multimedia/joystick.c] [windows/message.c]
Added joystick support !!!
Needs Linux >= 2.1.45 or joystick-0.8.0.tar.gz.
Fri Aug 1 18:02:09 1997 Morten Welinder <terra@diku.dk>
* [if1632/user32.spec]
Define DrawAnimatedRects32.
* [graphics/painting.c]
(DrawAnimatedRects32): Create stub.
* [misc/registry.c]
Cope with NULL class in RegQueryInfoKey32A.
* [if1632/user32.spec]
Add GetMenuItemInfo32[AW].
* [controls/menu.c]
(InsertMenu32A): Upgrade flags to 8 hex-digits.
(MENUEX_ParseResource): First shot at implementation.
(LoadMenuIndirect32A): Handle extended menus.
(GetMenuItemInfo32[AW]): First shot at implementation.
* [include/windows.h]
Define MFT_*, MFS_*, MIIM_* macros. Define MENUITEMINFO[AW]
structures and pointers.
* [Makefile.in]
(etags): Add TAGS as target.
* [if1632/comctl32.spec]
Use Windows 95's ordinals. Add a few missing stubs.
Thu Jul 31 14:01:13 1997 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
* [objects/color.c]
Fix for 16 color mode of XFree.
* [if1632/kernel32.spec][win32/ordinals.c]
Moved/added some ordinal only exported functions from kernel32.dll
(mostly thunking preparation stuff).
Wed Jul 30 09:16:38 1997 John Harvey <john@division.co.uk>
* [graphics/win16drv/init.c] [include/win16drv.h]
Escape(SETABORTPROC) returns success to keep pbrush.exe happy.
Escape(NEXTBAND) implemented to make HP PCL printer driver work in
word. Stub for PATBLT added to start work on printing more than
text.
Mon Jul 28 13:14:28 1997 Victor Schneider <vischne@ibm.net>
* [libtest/expand.c]
New Winelib test program.
Wed Jul 23 09:37:13 1997 Adrian Harvey <adrian@select.com.au>
* [tools/build.c] [tools/build-spec.txt] [if1632/kernel.spec]
[if1632/user.spec]
Added ability to set filename wine considers the built-in DLLs
to be in to something other than name.DLL with new "file" key
in .spec files.
Made kernel filename KRNL386.EXE (some programs use this name
explicitly - ChemOffice install now starts up).
Made user filename USER.EXE (just to be tidy).
Sun Jul 20 23:51:02 1997 David A. Cuthbert <dacut@henry.ece.cmu.edu>
* [controls/menu.c] [misc/tweak.c] [include/tweak.h]
Fixed MENU_KeyLeft and MENU_KeyRight to handle multiple-column
menus. Misc menu drawing issues for Win95 tweaks fixed. Misc
warnings fixed.
* [loader/module.c]
Spaces are now permitted in file/path names on the command line.
If multiple matches can be made, the preferred match is the
path/file with fewer spaces.
Tue Jul 29 02:21:15 1997 Bruce Milner <Bruce.Milner@genetics.utah.edu>
* [misc/compobj.c]
Added CLSIDFromString and StringFromCLSID.
----------------------------------------------------------------------
Sat Jul 19 13:03:01 1997 Alexandre Julliard <julliard@lrc.epfl.ch>

View File

@ -27,10 +27,14 @@ LDLIBS = @LDLIBS@
YACC = @YACC@
LEX = @LEX@
LEXLIB = @LEXLIB@
RANLIB = @RANLIB@
LN_S = @LN_S@
DIVINCL = -I$(TOPSRCDIR)/include -I$(TOPOBJDIR)/include -I$(SRCDIR) -I.
ALLCFLAGS = $(CFLAGS) $(DEFS) $(OPTIONS) $(DIVINCL) $(X_CFLAGS)
LDCOMBINE = ld -r
AR = ar rc
RM = rm -f
MKDIR = mkdir
BUILD = $(TOPOBJDIR)/tools/build@PROGEXT@
MAKEDEP = $(TOPOBJDIR)/tools/makedep@PROGEXT@
WINERC = $(TOPOBJDIR)/rc/winerc@PROGEXT@
@ -38,6 +42,20 @@ WINESTUB = $(TOPOBJDIR)/library/winestub.o
SUBMAKE = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(CFLAGS)' 'OPTIONS=$(OPTIONS)'
@SET_MAKE@
# Installation infos
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
libdir = @libdir@
infodir = @infodir@
mandir = @mandir@/man1
manext = .1
includedir = @includedir@/wine
OBJS = $(GEN_C_SRCS:.c=.o) $(C_SRCS:.c=.o) \
$(GEN_ASM_SRCS:.s=.o) $(ASM_SRCS:.S=.o) $(EXTRA_OBJS)
@ -96,7 +114,7 @@ depend:: $(MAKEDEP) $(C_SRCS) $(GEN_C_SRCS)
$(MAKEDEP) $(DIVINCL) -C. $(GEN_C_SRCS) -C$(SRCDIR) $(C_SRCS)
clean::
$(RM) *.o \#*\# *~ *.bak *.orig *.rej *.flc winerctmp.c $(GEN_C_SRCS) $(GEN_C_SRCS:.c=.h) $(GEN_ASM_SRCS) $(PROGRAMS)
$(RM) *.o \#*\# *~ *.bak *.orig *.rej *.flc winerctmp.c core $(GEN_C_SRCS) $(GEN_C_SRCS:.c=.h) $(GEN_ASM_SRCS) $(PROGRAMS)
dummy:

View File

@ -3,47 +3,23 @@
# all (default): build wine
# clean: remove all intermediate files
# distclean: also remove all files created by configure
# install: install everything
# depend: create the dependencies
# etags: Create a TAGS file for Emacs.
# etags: create a TAGS file for Emacs.
#
# Author: Michael Patra <micky@marie.physik.tu-berlin.de>
# <patra@itp1.physik.tu-berlin.de>
# First some useful definitions
SHELL = /bin/sh
CC = @CC@
CFLAGS = @CFLAGS@
OPTIONS = @OPTIONS@
X_LIBS = @X_LIBS@
TOPSRC = @top_srcdir@
XPM_LIB = -lXpm
XLIB = @X_PRE_LIBS@ -lXext -lX11 @X_EXTRA_LIBS@
LDLIBS = @LDLIBS@
AR = ar rc
RANLIB = @RANLIB@
RM = rm -f
MKDIR = mkdir
SUBMAKE = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(CFLAGS)' 'OPTIONS=$(OPTIONS)'
@SET_MAKE@
# Installation infos
INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@
prefix = @prefix@
exec_prefix = @exec_prefix@
bindir = @bindir@
libdir = @libdir@
mandir = @mandir@/man1
manext = .1
includedir = @includedir@/wine
# Main target to build
MAIN_TARGET = @MAIN_TARGET@
# Directories
TOPSRCDIR = @top_srcdir@
TOPOBJDIR = .
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = none
COMMONSUBDIRS = \
rc \
controls \
@ -76,6 +52,7 @@ PROGSUBDIRS = libtest programs
DOCSUBDIRS = documentation
# All sub-directories
ALLSUBDIRS = \
$(COMMONSUBDIRS) \
$(EMUSUBDIRS) \
@ -83,6 +60,12 @@ ALLSUBDIRS = \
$(PROGSUBDIRS) \
$(DOCSUBDIRS)
# Sub-directories to run make depend into
DEPENDSUBDIRS = $(COMMONSUBDIRS) $(LIBSUBDIRS) $(EMUSUBDIRS) $(DOCSUBDIRS)
# Sub-directories to run make install into
INSTALLSUBDIRS = $(DOCSUBDIRS)
COMMONOBJS = \
controls/controls.o \
files/files.o \
@ -109,10 +92,11 @@ EMUOBJS = \
LIBOBJS = library/library.o
all: $(MAIN_TARGET)
install: install_$(MAIN_TARGET)
@MAKE_RULES@
install:: install_$(MAIN_TARGET)
wine wine.sym: $(COMMONSUBDIRS) $(EMUSUBDIRS) dummy
$(CC) -o wine $(COMMONOBJS) $(EMUOBJS) $(LDOPTIONS) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
@ -120,7 +104,6 @@ wine wine.sym: $(COMMONSUBDIRS) $(EMUSUBDIRS) dummy
install_wine: dummy
$(INSTALL_PROGRAM) wine $(bindir)/wine
$(INSTALL_DATA) $(TOPSRC)/wine.man $(mandir)/wine$(manext)
libwine.a: $(COMMONSUBDIRS) $(LIBSUBDIRS) dummy
$(RM) $@
@ -146,17 +129,18 @@ $(ALLSUBDIRS): dummy
install_programs: dummy
@cd programs; $(SUBMAKE) install
depend: dummy
for i in $(COMMONSUBDIRS) $(LIBSUBDIRS) $(EMUSUBDIRS) $(DOCSUBDIRS); do \
(cd $$i; $(MAKE) depend) || exit 1; \
done
install::
for i in $(INSTALLSUBDIRS); do (cd $$i && $(MAKE) install) || exit 1; done
etags:
etags `find . -name '*.[chS]' -print | grep -v dbgmain`
depend:: dummy
for i in $(DEPENDSUBDIRS); do (cd $$i && $(MAKE) depend) || exit 1; done
clean:
TAGS etags:
etags `find $(TOPSRCDIR) -name '*.[chS]' -print | grep -v dbgmain`
clean::
for i in $(ALLSUBDIRS); do (cd $$i; $(MAKE) clean) || exit 1; done
for i in . include; do (cd $$i; $(RM) *.o \#*\# *~ *.bak *.orig *.rej *.flc); done
for i in include; do (cd $$i; $(RM) *.o \#*\# *~ *.bak *.orig *.rej *.flc); done
$(RM) wine wine.sym libwine.a libwine.so.1.0 TAGS
distclean: clean
@ -169,4 +153,4 @@ configure: configure.in
include/config.h.in: configure.in include/acconfig.h
autoheader -l include
dummy:
### Dependencies:

82
configure vendored
View File

@ -1872,8 +1872,29 @@ test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
echo "configure:1877: checking whether ln -s works" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
rm -f conftestdata
if ln -s X conftestdata 2>/dev/null
then
rm -f conftestdata
ac_cv_prog_LN_S="ln -s"
else
ac_cv_prog_LN_S=ln
fi
fi
LN_S="$ac_cv_prog_LN_S"
if test "$ac_cv_prog_LN_S" = "ln -s"; then
echo "$ac_t""yes" 1>&6
else
echo "$ac_t""no" 1>&6
fi
echo $ac_n "checking for i386_set_ldt in -li386""... $ac_c" 1>&6
echo "configure:1877: checking for i386_set_ldt in -li386" >&5
echo "configure:1898: checking for i386_set_ldt in -li386" >&5
ac_lib_var=`echo i386'_'i386_set_ldt | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
@ -1881,7 +1902,7 @@ else
ac_save_LIBS="$LIBS"
LIBS="-li386 $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1885 "configure"
#line 1906 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
@ -1892,7 +1913,7 @@ int main() {
i386_set_ldt()
; return 0; }
EOF
if { (eval echo configure:1896: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
if { (eval echo configure:1917: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
@ -1913,12 +1934,14 @@ else
fi
if test "$ac_cv_prog_LN_S" = "ln -s"; then : ; else LN_S=cp ; fi
if test "x${GCC}" = "xyes"
then
CFLAGS="$CFLAGS -Wall"
echo $ac_n "checking "for gcc strength-reduce bug"""... $ac_c" 1>&6
echo "configure:1922: checking "for gcc strength-reduce bug"" >&5
echo "configure:1945: checking "for gcc strength-reduce bug"" >&5
if eval "test \"`echo '$''{'ac_cv_c_gcc_strength_bug'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1926,7 +1949,7 @@ else
ac_cv_c_gcc_strength_bug="yes"
else
cat > conftest.$ac_ext <<EOF
#line 1930 "configure"
#line 1953 "configure"
#include "confdefs.h"
int main(void) {
@ -1937,7 +1960,7 @@ int main(void) {
exit( Array[1] != -2 );
}
EOF
if { (eval echo configure:1941: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
if { (eval echo configure:1964: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
then
ac_cv_c_gcc_strength_bug="no"
else
@ -1960,7 +1983,7 @@ fi
echo $ac_n "checking "whether external symbols need an underscore prefix"""... $ac_c" 1>&6
echo "configure:1964: checking "whether external symbols need an underscore prefix"" >&5
echo "configure:1987: checking "whether external symbols need an underscore prefix"" >&5
if eval "test \"`echo '$''{'ac_cv_c_extern_prefix'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1972,14 +1995,14 @@ _ac_test:
.long 0
EOF
cat > conftest.$ac_ext <<EOF
#line 1976 "configure"
#line 1999 "configure"
#include "confdefs.h"
extern int ac_test;
int main() {
if (ac_test) return 1
; return 0; }
EOF
if { (eval echo configure:1983: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
if { (eval echo configure:2006: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
ac_cv_c_extern_prefix="yes"
else
@ -2005,21 +2028,21 @@ fi
if test "$MAIN_TARGET" = "libwine.so.1.0"
then
echo $ac_n "checking "whether we can build a dll"""... $ac_c" 1>&6
echo "configure:2009: checking "whether we can build a dll"" >&5
echo "configure:2032: checking "whether we can build a dll"" >&5
if eval "test \"`echo '$''{'ac_cv_c_dll'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
saved_cflags=$CFLAGS
CFLAGS="$CFLAGS -fPIC -shared -Wl,-soname,conftest.so.1.0"
cat > conftest.$ac_ext <<EOF
#line 2016 "configure"
#line 2039 "configure"
#include "confdefs.h"
int main() {
return 1
; return 0; }
EOF
if { (eval echo configure:2023: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
if { (eval echo configure:2046: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
ac_cv_c_dll="yes"
else
@ -2046,12 +2069,12 @@ fi
for ac_func in memmove tcgetattr usleep wait4 waitpid
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:2050: checking for $ac_func" >&5
echo "configure:2073: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2055 "configure"
#line 2078 "configure"
#include "confdefs.h"
/* System header to define __stub macros and hopefully few prototypes,
which can conflict with char $ac_func(); below. */
@ -2074,7 +2097,7 @@ $ac_func();
; return 0; }
EOF
if { (eval echo configure:2078: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
if { (eval echo configure:2101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_func_$ac_func=yes"
else
@ -2099,12 +2122,12 @@ fi
done
echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6
echo "configure:2103: checking whether stat file-mode macros are broken" >&5
echo "configure:2126: checking whether stat file-mode macros are broken" >&5
if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2108 "configure"
#line 2131 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <sys/stat.h>
@ -2155,12 +2178,12 @@ EOF
fi
echo $ac_n "checking for working const""... $ac_c" 1>&6
echo "configure:2159: checking for working const" >&5
echo "configure:2182: checking for working const" >&5
if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2164 "configure"
#line 2187 "configure"
#include "confdefs.h"
int main() {
@ -2209,7 +2232,7 @@ ccp = (char const *const *) p;
; return 0; }
EOF
if { (eval echo configure:2213: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
if { (eval echo configure:2236: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest*
ac_cv_c_const=yes
else
@ -2230,12 +2253,12 @@ EOF
fi
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
echo "configure:2234: checking for ANSI C header files" >&5
echo "configure:2257: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2239 "configure"
#line 2262 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
@ -2243,7 +2266,7 @@ else
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:2247: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
{ (eval echo configure:2270: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out`
if test -z "$ac_err"; then
rm -rf conftest*
@ -2260,7 +2283,7 @@ rm -f conftest*
if test $ac_cv_header_stdc = yes; then
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
#line 2264 "configure"
#line 2287 "configure"
#include "confdefs.h"
#include <string.h>
EOF
@ -2278,7 +2301,7 @@ fi
if test $ac_cv_header_stdc = yes; then
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
#line 2282 "configure"
#line 2305 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
@ -2299,7 +2322,7 @@ if test "$cross_compiling" = yes; then
:
else
cat > conftest.$ac_ext <<EOF
#line 2303 "configure"
#line 2326 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
@ -2310,7 +2333,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
exit (0); }
EOF
if { (eval echo configure:2314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
if { (eval echo configure:2337: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
then
:
else
@ -2334,12 +2357,12 @@ EOF
fi
echo $ac_n "checking for size_t""... $ac_c" 1>&6
echo "configure:2338: checking for size_t" >&5
echo "configure:2361: checking for size_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.$ac_ext <<EOF
#line 2343 "configure"
#line 2366 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
@ -2549,6 +2572,7 @@ s%@LEXLIB@%$LEXLIB%g
s%@RANLIB@%$RANLIB%g
s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
s%@INSTALL_DATA@%$INSTALL_DATA%g
s%@LN_S@%$LN_S%g
/@MAKE_RULES@/r $MAKE_RULES
s%@MAKE_RULES@%%g

View File

@ -38,9 +38,13 @@ AC_PROG_YACC
AC_PROG_LEX
AC_PROG_RANLIB
AC_PROG_INSTALL
AC_PROG_LN_S
dnl Check for -li386 for NetBSD and OpenBSD
AC_CHECK_LIB(i386,i386_set_ldt,LDLIBS="$LDLIBS -li386")
dnl **** If ln -s doesn't work, use cp instead ****
if test "$ac_cv_prog_LN_S" = "ln -s"; then : ; else LN_S=cp ; fi
dnl **** Check for gcc strength-reduce bug ****
if test "x${GCC}" = "xyes"

View File

@ -3013,8 +3013,12 @@ static LRESULT EDIT_WM_Create(WND *wnd, LPCREATESTRUCT32A cs)
* functions can be called, and in what order.
*/
EDIT_WM_SetFont(wnd, es, 0, FALSE);
if (cs->lpszName && *(cs->lpszName) != '\0')
if (cs->lpszName && *(cs->lpszName) != '\0') {
EDIT_EM_ReplaceSel(wnd, es, FALSE, cs->lpszName);
/* if we insert text to the editline, the text scrolls out of the window, as the caret is placed after the insert pos normally; thus we reset es->selection... to 0 and update caret */
es->selection_start = es->selection_end = 0;
EDIT_EM_ScrollCaret(wnd, es);
}
return 0;
}

View File

@ -167,7 +167,7 @@ static HMENU32 MENU_CopySysPopup(void)
fprintf( stderr, "Unable to load default system menu\n" );
}
dprintf_menu( stddeb, "MENU_CopySysPopup: returning %ld.\n", hMenu );
dprintf_menu( stddeb, "MENU_CopySysPopup: returning %d.\n", hMenu );
return hMenu;
}
@ -279,6 +279,74 @@ void MENU_InitSysMenuPopup( HMENU32 hmenu, DWORD style, DWORD clsStyle )
}
/******************************************************************************
*
* UINT32 MENU_GetStartOfNextColumn(
* HMENU32 hMenu )
*
*****************************************************************************/
static UINT32 MENU_GetStartOfNextColumn(
HMENU32 hMenu )
{
POPUPMENU *menu = (POPUPMENU *)USER_HEAP_LIN_ADDR(hMenu);
UINT32 i = menu->FocusedItem + 1;
if(!menu)
return NO_SELECTED_ITEM;
if( i == NO_SELECTED_ITEM )
return i;
for( ; i < menu->nItems; ++i ) {
if( menu->items[i].item_flags & MF_MENUBARBREAK )
return i;
}
return NO_SELECTED_ITEM;
}
/******************************************************************************
*
* UINT32 MENU_GetStartOfPrevColumn(
* HMENU32 hMenu )
*
*****************************************************************************/
static UINT32 MENU_GetStartOfPrevColumn(
HMENU32 hMenu )
{
POPUPMENU const *menu = (POPUPMENU *)USER_HEAP_LIN_ADDR(hMenu);
UINT32 i;
if( !menu )
return NO_SELECTED_ITEM;
if( menu->FocusedItem == 0 || menu->FocusedItem == NO_SELECTED_ITEM )
return NO_SELECTED_ITEM;
/* Find the start of the column */
for(i = menu->FocusedItem; i != 0 &&
!(menu->items[i].item_flags & MF_MENUBARBREAK);
--i); /* empty */
if(i == 0)
return NO_SELECTED_ITEM;
for(--i; i != 0; --i) {
if(menu->items[i].item_flags & MF_MENUBARBREAK)
break;
}
dprintf_menu( stddeb, "MENU_GetStartOfPrevColumn: ret %d.\n", i );
return i;
}
/***********************************************************************
* MENU_FindItem
*
@ -424,8 +492,8 @@ static void MENU_CalcItemSize( HDC32 hdc, MENUITEM *lpitem, HWND32 hwndOwner,
DWORD dwSize;
char *p;
dprintf_menu( stddeb, "MENU_CalcItemSize: HDC 0x%lx, item '%s', at "
"(%d, %d) %s\n", hdc, lpitem->text, orgX, orgY,
dprintf_menu( stddeb, "MENU_CalcItemSize: HDC %p, item '%s', at "
"(%d, %d) %s\n", (void *)hdc, lpitem->text, orgX, orgY,
menuBar ? "(MenuBar)" : "" );
SetRect32( &lpitem->rect, orgX, orgY, orgX, orgY );
@ -689,12 +757,17 @@ static void MENU_DrawMenuItem( HWND32 hwnd, HDC32 hdc, MENUITEM *lpitem,
/* Draw the background */
if(TWEAK_Win95Look) {
rect.left += 2;
rect.right -= 2;
/*
if(menuBar) {
--rect.left;
++rect.bottom;
--rect.top;
}
InflateRect32( &rect, -1, -1 );
*/
}
if (lpitem->item_flags & MF_HILITE) {
@ -720,16 +793,20 @@ static void MENU_DrawMenuItem( HWND32 hwnd, HDC32 hdc, MENUITEM *lpitem,
if (!menuBar && (lpitem->item_flags & MF_MENUBARBREAK))
{
SelectObject32( hdc, sysColorObjects.hpenWindowFrame );
MoveTo( hdc, rect.left, 0 );
LineTo32( hdc, rect.left, height );
if(TWEAK_Win95Look)
TWEAK_DrawMenuSeparatorVert95(hdc, rect.left - 1, 3, height - 3);
else {
SelectObject32( hdc, sysColorObjects.hpenWindowFrame );
MoveTo( hdc, rect.left, 0 );
LineTo32( hdc, rect.left, height );
}
}
if (lpitem->item_flags & MF_SEPARATOR)
{
if(TWEAK_Win95Look)
TWEAK_DrawMenuSeparator95(hdc, rect.left + 1,
rect.top + SEPARATOR_HEIGHT / 2 + 1,
rect.right - 1);
TWEAK_DrawMenuSeparatorHoriz95(hdc, rect.left + 1,
rect.top + SEPARATOR_HEIGHT / 2 + 1,
rect.right - 1);
else {
SelectObject32( hdc, sysColorObjects.hpenWindowFrame );
MoveTo( hdc, rect.left, rect.top + SEPARATOR_HEIGHT/2 );
@ -830,17 +907,19 @@ static void MENU_DrawMenuItem( HWND32 hwnd, HDC32 hdc, MENUITEM *lpitem,
DT_LEFT | DT_VCENTER | DT_SINGLELINE );
}
else {
++rect.left;
++rect.top;
++rect.right;
++rect.bottom;
SetTextColor32(hdc, RGB(0xff, 0xff, 0xff));
DrawText32A( hdc, lpitem->text, i, &rect,
DT_LEFT | DT_VCENTER | DT_SINGLELINE );
--rect.left;
--rect.top;
--rect.right;
--rect.bottom;
if (!(lpitem->item_flags & MF_HILITE)) {
++rect.left;
++rect.top;
++rect.right;
++rect.bottom;
SetTextColor32(hdc, RGB(0xff, 0xff, 0xff));
DrawText32A( hdc, lpitem->text, i, &rect,
DT_LEFT | DT_VCENTER | DT_SINGLELINE );
--rect.left;
--rect.top;
--rect.right;
--rect.bottom;
}
SetTextColor32(hdc, RGB(0x80, 0x80, 0x80));
DrawText32A( hdc, lpitem->text, i, &rect,
DT_LEFT | DT_VCENTER | DT_SINGLELINE );
@ -872,13 +951,16 @@ static void MENU_DrawPopupMenu( HWND32 hwnd, HDC32 hdc, HMENU32 hmenu )
RECT32 rect;
GetClientRect32( hwnd, &rect );
rect.bottom -= POPUP_YSHADE * SYSMETRICS_CYBORDER;
rect.right -= POPUP_XSHADE * SYSMETRICS_CXBORDER;
/* if(!TWEAK_Win95Look) { */
rect.bottom -= POPUP_YSHADE * SYSMETRICS_CYBORDER;
rect.right -= POPUP_XSHADE * SYSMETRICS_CXBORDER;
/* } */
if((hPrevBrush = SelectObject32( hdc, sysColorObjects.hbrushMenu )))
{
HPEN32 hPrevPen;
Rectangle32( hdc, rect.left, rect.top, rect.right, rect.bottom );
hPrevPen = SelectObject32( hdc, GetStockObject32( NULL_PEN ) );
@ -1380,6 +1462,68 @@ static LPCSTR MENU_ParseResource( LPCSTR res, HMENU32 hMenu, BOOL32 unicode )
}
/**********************************************************************
* MENUEX_ParseResource
*
* Parse an extended menu resource and add items to the menu.
* Return a pointer to the end of the resource.
*/
static LPCSTR MENUEX_ParseResource( LPCSTR res, HMENU32 hMenu)
{
DWORD flags;
DWORD state;
DWORD id;
LPCWSTR str;
WORD resinfo;
do
{
/* printf ("%p:", res); */
flags = GET_DWORD(res);
res += sizeof(DWORD);
state = GET_DWORD(res);
res += sizeof(DWORD);
id = GET_DWORD(res);
res += sizeof(DWORD);
resinfo = GET_WORD(res); /* FIXME: for 16-bit apps this is a byte. */
res += sizeof(WORD);
/* Align the text on a word boundary. */
res += (~((int)res - 1)) & 1;
str = (LPCWSTR)res;
res += (1 + lstrlen32W (str)) * sizeof(WCHAR);
/* Align the following fields on a dword boundary. */
res += (~((int)res - 1)) & 3;
/* FIXME: This is inefficient and cannot be optimised away by gcc. */
{
LPSTR newstr = HEAP_strdupWtoA( GetProcessHeap(), 0, str );
dprintf_menu (stddeb, "Menu item: [%08lx,%08lx,%04lx,%04x,%s]\n",
flags, state, id, resinfo, newstr);
HeapFree( GetProcessHeap(), 0, newstr );
}
if (resinfo & 1) /* Pop-up? */
{
DWORD helpid = GET_DWORD(res); /* FIXME: use this. */
HMENU32 hSubMenu = CreatePopupMenu32();
res += sizeof(DWORD);
if (!hSubMenu) return NULL;
if (!(res = MENUEX_ParseResource( res, hSubMenu)))
return NULL;
AppendMenu32W( hMenu, flags | MF_POPUP /* HACK! FIXME */,
(UINT32)hSubMenu, (LPCWSTR)str );
}
else /* Not a popup */
{
AppendMenu32W( hMenu, flags, id,
*(LPCWSTR)str ? (LPCWSTR)str : NULL );
}
} while (!(resinfo & MF_END));
return res;
}
/***********************************************************************
* MENU_GetSubPopup
*
@ -1861,10 +2005,20 @@ static void MENU_KeyLeft( MTRACKER* pmt )
{
POPUPMENU *menu;
HMENU32 hmenutmp, hmenuprev;
UINT32 prevcol;
hmenuprev = hmenutmp = pmt->hTopMenu;
menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( hmenutmp );
/* Try to move 1 column left (if possible) */
if( (prevcol = MENU_GetStartOfPrevColumn( pmt->hCurrentMenu )) !=
NO_SELECTED_ITEM ) {
MENU_SelectItem( pmt->hOwnerWnd, pmt->hCurrentMenu,
prevcol, TRUE );
return;
}
/* close topmost popup */
while (hmenutmp != pmt->hCurrentMenu)
{
@ -1904,6 +2058,13 @@ static void MENU_KeyRight( MTRACKER* pmt )
{
HMENU32 hmenutmp;
POPUPMENU *menu = (POPUPMENU *) USER_HEAP_LIN_ADDR( pmt->hTopMenu );
UINT32 nextcol;
dprintf_menu( stddeb, "MENU_KeyRight called, cur %x (%s), top %x (%s).\n",
pmt->hCurrentMenu,
((POPUPMENU *)USER_HEAP_LIN_ADDR(pmt->hCurrentMenu))->
items[0].text,
pmt->hTopMenu, menu->items[0].text );
if ( (menu->wFlags & MF_POPUP) || (pmt->hCurrentMenu != pmt->hTopMenu))
{
@ -1916,6 +2077,15 @@ static void MENU_KeyRight( MTRACKER* pmt )
if (hmenutmp != pmt->hCurrentMenu) return;
}
/* Check to see if there's another column */
if( (nextcol = MENU_GetStartOfNextColumn( pmt->hCurrentMenu )) !=
NO_SELECTED_ITEM ) {
dprintf_menu( stddeb, "KeyRight: Going to %d.\n", nextcol );
MENU_SelectItem( pmt->hOwnerWnd, pmt->hCurrentMenu,
nextcol, TRUE );
return;
}
if (!(menu->wFlags & MF_POPUP)) /* menu bar tracking */
{
if( pmt->hCurrentMenu != pmt->hTopMenu )
@ -2687,10 +2857,10 @@ BOOL32 InsertMenu32A( HMENU32 hMenu, UINT32 pos, UINT32 flags,
MENUITEM *item;
if (IS_STRING_ITEM(flags) && str)
dprintf_menu( stddeb, "InsertMenu: hMenu %04x, pos %d, flags %04x, "
dprintf_menu( stddeb, "InsertMenu: hMenu %04x, pos %d, flags %08x, "
"id %04x, str '%s'\n",
hMenu, pos, flags, id, str );
else dprintf_menu( stddeb, "InsertMenu: hMenu %04x, pos %d, flags %04x, "
else dprintf_menu( stddeb, "InsertMenu: hMenu %04x, pos %d, flags %08x, "
"id %04x, str %08lx (not a string)\n",
hMenu, pos, flags, id, (DWORD)str );
@ -3341,24 +3511,36 @@ HMENU32 LoadMenuIndirect32A( LPCVOID template )
WORD version, offset;
LPCSTR p = (LPCSTR)template;
dprintf_menu(stddeb,"LoadMenuIndirect16: %p\n", template );
dprintf_menu(stddeb,"LoadMenuIndirect32A: %p\n", template );
version = GET_WORD(p);
p += sizeof(WORD);
if (version)
{
switch (version)
{
case 0:
offset = GET_WORD(p);
p += sizeof(WORD) + offset;
if (!(hMenu = CreateMenu32())) return 0;
if (!MENU_ParseResource( p, hMenu, TRUE ))
{
DestroyMenu32( hMenu );
return 0;
}
return hMenu;
case 1:
offset = GET_WORD(p);
p += sizeof(WORD) + offset;
if (!(hMenu = CreateMenu32())) return 0;
if (!MENUEX_ParseResource( p, hMenu))
{
DestroyMenu32( hMenu );
return 0;
}
return hMenu;
default:
fprintf( stderr, "LoadMenuIndirect32A: version %d not supported.\n",
version );
return 0;
}
offset = GET_WORD(p);
p += sizeof(WORD) + offset;
if (!(hMenu = CreateMenu32())) return 0;
if (!MENU_ParseResource( p, hMenu, TRUE ))
{
DestroyMenu32( hMenu );
return 0;
}
return hMenu;
}
}
@ -3382,6 +3564,73 @@ BOOL16 IsMenu16( HMENU16 hmenu )
return (menu->wMagic == MENU_MAGIC);
}
/**********************************************************************
* GetMenuItemInfo32_common
*/
static BOOL32 GetMenuItemInfo32_common ( HMENU32 hmenu, UINT32 item,
BOOL32 bypos,
LPMENUITEMINFO32A lpmii,
BOOL32 unicode)
{
MENUITEM *menu = MENU_FindItem (&hmenu, &item, bypos);
if (!menu) return FALSE;
if (lpmii->fMask && MIIM_TYPE)
{
lpmii->fType = menu->item_flags;
lpmii->dwTypeData = menu->text;
if (IS_STRING_ITEM (menu->item_flags))
{
lpmii->cch = strlen (menu->text);
if (unicode)
; /* UGH! FIXME */
}
else
lpmii->cch = 0;
}
if (lpmii->fMask && MIIM_STATE)
lpmii->fState = 0; /* FIXME -- not saved. */
if (lpmii->wID && MIIM_ID)
lpmii->fType = menu->item_id;
if (lpmii->fMask && MIIM_SUBMENU)
lpmii->hSubMenu = menu->item_id; /* FIXME: ??? */
if (lpmii->fMask && MIIM_CHECKMARKS)
{
PCBITMAPS pCB = menu->pCB;
lpmii->hbmpChecked = pCB ? pCB->hCheckBit : 0;
lpmii->hbmpUnchecked = pCB ? pCB->hUnCheckBit : 0;
}
if (lpmii->fMask && MIIM_DATA)
lpmii->dwItemData = 0; /* FIXME -- not saved. */
return TRUE;
}
/**********************************************************************
* GetMenuItemInfo32A (USER32.263)
*/
BOOL32 GetMenuItemInfo32A( HMENU32 hmenu, UINT32 item, BOOL32 bypos,
LPMENUITEMINFO32A lpmii)
{
return GetMenuItemInfo32_common (hmenu, item, bypos, lpmii, FALSE);
}
/**********************************************************************
* GetMenuItemInfo32W (USER32.264)
*/
BOOL32 GetMenuItemInfo32W( HMENU32 hmenu, UINT32 item, BOOL32 bypos,
LPMENUITEMINFO32W lpmii)
{
return GetMenuItemInfo32_common (hmenu, item, bypos,
(LPMENUITEMINFO32A)lpmii, TRUE);
}
/**********************************************************************
* IsMenu32 (USER32.345)

View File

@ -4,24 +4,43 @@ SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = none
INCLUDES = \
AUTHORS \
LICENSE \
WARRANTY
SOURCES = \
wine.texinfo \
$(TOPSRCDIR)/AUTHORS \
$(TOPSRCDIR)/LICENSE \
$(TOPSRCDIR)/WARRANTY
$(INCLUDES)
all: wine.info
INFOFILES = \
wine.info \
wine.info-1 \
wine.info-2
DVIFILES = wine.dvi
all: $(INFOFILES) $(DVIFILES)
@MAKE_RULES@
wine.info: $(SOURCES)
makeinfo -I$(TOPSRCDIR) $(SRCDIR)/wine.texinfo
$(INFOFILES): $(SOURCES)
makeinfo $(SRCDIR)/wine.texinfo
wine.dvi: $(SOURCES)
$(DVIFILES): $(SOURCES)
texi2dvi $(SRCDIR)/wine.texinfo
$(INCLUDES):
$(RM) $(INCLUDES)
for i in $(INCLUDES); do $(LN_S) $(TOPSRCDIR)/$$i $$i || exit 1; done
install:: $(INFOFILES)
for i in $(INFOFILES); do $(INSTALL_DATA) $$i $(infodir)/$$i; done
$(INSTALL_DATA) $(SRCDIR)/wine.man $(mandir)/wine$(manext)
clean::
$(RM) wine.aux wine.cp wine.cps wine.dvi wine.fn wine.fns wine.info \
wine.ky wine.log wine.pg wine.toc wine.tp wine.tps wine.vr
$(RM) $(INFOFILES) $(DVIFILES) $(INCLUDES)
$(RM) wine.aux wine.cp wine.cps wine.fn wine.fns wine.ky wine.log \
wine.pg wine.toc wine.tp wine.tps wine.vr wine.vrs
### Dependencies:

File diff suppressed because it is too large Load Diff

View File

@ -502,9 +502,9 @@ DWORD DIR_SearchPath( LPCSTR path, LPCSTR name, LPCSTR ext,
/* First check the supplied parameters */
if (!(p = strrchr( name, '\\' ))) p = name;
if (!(p = strrchr( p, '/' ))) p = name;
if (strchr( p, '.' )) ext = NULL; /* Ignore the specified extension */
p = strrchr( name, '.' );
if (p && !strchr( p, '/' ) && !strchr( p, '\\' ))
ext = NULL; /* Ignore the specified extension */
if ((*name && (name[1] == ':')) ||
strchr( name, '/' ) || strchr( name, '\\' ))
path = NULL; /* Ignore path if name already contains a path */

View File

@ -951,7 +951,7 @@ HFILE32 _lopen32( LPCSTR path, INT32 mode )
switch(mode & 3)
{
case OF_WRITE:
unixMode = O_WRONLY | O_TRUNC;
unixMode = O_WRONLY;
break;
case OF_READWRITE:
unixMode = O_RDWR;

View File

@ -764,3 +764,14 @@ BOOL32 DrawFrameControl32( HDC32 hdc, LPRECT32 rc, UINT32 uType, UINT32 uState )
hdc,rc,uType,uState );
return TRUE;
}
/**********************************************************************
* DrawFrameControl32 (USER32.152)
*/
BOOL32 DrawAnimatedRects32( HWND32 hwnd, int idAni,
const LPRECT32 lprcFrom, const LPRECT32 lprcTo )
{
fprintf( stdnimp,"DrawAnimatedRects32(%x,%d,%p,%p), empty stub!\n",
hwnd, idAni, lprcFrom, lprcTo );
return TRUE;
}

View File

@ -73,7 +73,7 @@ static const DC_FUNCTIONS WIN16DRV_Funcs =
NULL, /* pOffsetViewportOrgEx */
NULL, /* pOffsetWindowOrgEx */
NULL, /* pPaintRgn */
NULL, /* pPatBlt */
WIN16DRV_PatBlt, /* pPatBlt */
NULL, /* pPie */
NULL, /* pPolyPolygon */
NULL, /* pPolygon */
@ -223,13 +223,13 @@ BOOL32 WIN16DRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device, LPCSTR output,
int nPDEVICEsize;
PDEVICE_HEADER *pPDH;
WIN16DRV_PDEVICE *physDev;
int numFonts;
/* Realizing fonts */
int nSize;
char printerEnabled[20];
PROFILE_GetWineIniString( "wine", "printer", "off",
printerEnabled, sizeof(printerEnabled) );
if (strcmp(printerEnabled,"on"))
if (lstrcmpi32A(printerEnabled,"on"))
{
printf("WIN16DRV_CreateDC disabled in wine.conf file\n");
return FALSE;
@ -323,6 +323,7 @@ BOOL32 WIN16DRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device, LPCSTR output,
wepfc.nCount = 0;
PRTDRV_EnumDFonts(physDev->segptrPDEVICE, NULL, pfnCallback,
(void *)&wepfc);
numFonts = wepfc.nCount;
}
}
}
@ -378,7 +379,12 @@ BOOL32 WIN16DRV_CreateDC( DC *dc, LPCSTR driver, LPCSTR device, LPCSTR output,
return TRUE;
}
extern BOOL32 WIN16DRV_PatBlt( struct tagDC *dc, INT32 left, INT32 top,
INT32 width, INT32 height, DWORD rop )
{
printf("In WIN16DRV_PatBlt\n");
return FALSE;
}
/*
* Escape (GDI.38)
*/
@ -393,31 +399,56 @@ static INT32 WIN16DRV_Escape( DC *dc, INT32 nEscape, INT32 cbInput,
if (dc != NULL && physDev->segptrPDEVICE != 0)
{
switch(nEscape)
{
case SETABORTPROC:
printf("Escape: SetAbortProc ignored\n");
{
case SETABORTPROC:
printf("Escape: SetAbortProc ignored should be stored in dc somewhere\n");
/* Make calling application believe this worked */
nRet = 1;
break;
case GETEXTENDEDTEXTMETRICS:
{
SEGPTR newInData = WIN16_GlobalLock16(GlobalAlloc16(GHND, sizeof(EXTTEXTDATA)));
EXTTEXTDATA *textData = (EXTTEXTDATA *)(PTR_SEG_TO_LIN(newInData));
case NEXTBAND:
{
SEGPTR newInData = WIN16_GlobalLock16(GlobalAlloc16(GHND, sizeof(POINT16)));
nRet = PRTDRV_Control(physDev->segptrPDEVICE, nEscape,
newInData, lpOutData);
GlobalFree16(newInData);
break;
}
textData->nSize = cbInput;
textData->lpindata = lpInData;
textData->lpFont = physDev->segptrFontInfo;
textData->lpXForm = win16drv_SegPtr_TextXForm;
textData->lpDrawMode = win16drv_SegPtr_DrawMode;
case GETEXTENDEDTEXTMETRICS:
{
SEGPTR newInData = WIN16_GlobalLock16(GlobalAlloc16(GHND, sizeof(EXTTEXTDATA)));
EXTTEXTDATA *textData = (EXTTEXTDATA *)(PTR_SEG_TO_LIN(newInData));
textData->nSize = cbInput;
textData->lpindata = lpInData;
textData->lpFont = physDev->segptrFontInfo;
textData->lpXForm = win16drv_SegPtr_TextXForm;
textData->lpDrawMode = win16drv_SegPtr_DrawMode;
nRet = PRTDRV_Control(physDev->segptrPDEVICE, nEscape,
newInData, lpOutData);
GlobalFree16(newInData);
}
break;
case STARTDOC:
nRet = PRTDRV_Control(physDev->segptrPDEVICE, nEscape,
newInData, lpOutData);
GlobalFree16(newInData);
}
break;
lpInData, lpOutData);
if (nRet != -1)
{
SEGPTR newInData = WIN16_GlobalLock16(GlobalAlloc16(GHND, sizeof(HDC32)));
#define SETPRINTERDC SETABORTPROC
HDC32 *tmpHdc = (HDC32 *)(PTR_SEG_TO_LIN(newInData));
*tmpHdc = dc->hSelf;
PRTDRV_Control(physDev->segptrPDEVICE, SETPRINTERDC,
newInData, (SEGPTR)NULL);
GlobalFree16(newInData);
}
break;
default:
nRet = PRTDRV_Control(physDev->segptrPDEVICE, nEscape,
lpInData, lpOutData);
break;
}
}
else

View File

@ -58,6 +58,7 @@ C_SRCS = \
builtin.c \
dummy.c \
relay.c \
signal.c \
thunk.c
GEN_ASM_SRCS = \

View File

@ -119,6 +119,7 @@ static BUILTIN_DLL BuiltinDLLs[] =
{ &KERNEL_Descriptor, DLL_FLAG_ALWAYS_USED },
{ &USER_Descriptor, DLL_FLAG_ALWAYS_USED },
{ &GDI_Descriptor, DLL_FLAG_ALWAYS_USED },
{ &SYSTEM_Descriptor, DLL_FLAG_ALWAYS_USED },
{ &WIN87EM_Descriptor, DLL_FLAG_NOT_USED },
{ &SHELL_Descriptor, 0 },
{ &SOUND_Descriptor, 0 },
@ -126,7 +127,6 @@ static BUILTIN_DLL BuiltinDLLs[] =
{ &WINSOCK_Descriptor, 0 },
{ &STRESS_Descriptor, 0 },
{ &MMSYSTEM_Descriptor, 0 },
{ &SYSTEM_Descriptor, 0 },
{ &TOOLHELP_Descriptor, 0 },
{ &MOUSE_Descriptor, 0 },
{ &COMMDLG_Descriptor, DLL_FLAG_NOT_USED },

View File

@ -2,6 +2,10 @@ name comctl32
type win32
base 2
# Functions exported by the Win95 comctl32.dll
# (these need to have these exact ordinals, because some win95 dlls
# import comctl32.dll by ordinal)
00 stub MenuHelp
01 stub ShowHideMenuCtl
02 stub GetEffectiveClientRect
@ -9,53 +13,60 @@ base 2
04 stdcall CreateStatusWindowA(long ptr long long) CreateStatusWindow32A
05 stub CreateToolbar
06 stub CreateMappedBitmap
07 stub CreatePropertySheetPage
08 stub CreatePropertySheetPageA
09 stub CreatePropertySheetPageW
10 stub CreateStatusWindow
07 stub Cctl1632_ThunkData32
08 stub CreatePropertySheetPage
09 stub CreatePropertySheetPageA
10 stub CreatePropertySheetPageW
11 stub MakeDragList
12 stub LBItemFromPt
13 stub DrawInsert
14 stub CreateUpDownControl
15 stdcall InitCommonControls() InitCommonControls
16 stub CreateStatusWindowW
17 stub CreateToolbarEx
18 stub DestroyPropertySheetPage
19 stub DrawStatusText
20 stub DrawStatusTextW
21 stub ImageList_Add
22 stub ImageList_AddIcon
23 stub ImageList_AddMasked
24 stub ImageList_BeginDrag
25 stub ImageList_Create
26 stub ImageList_Destroy
27 stub ImageList_DragEnter
28 stub ImageList_DragLeave
29 stub ImageList_DragMove
30 stub ImageList_DragShowNolock
31 stub ImageList_Draw
32 stub ImageList_DrawEx
33 stub ImageList_EndDrag
34 stub ImageList_GetBkColor
35 stub ImageList_GetDragImage
36 stub ImageList_GetIcon
37 stub ImageList_GetIconSize
38 stub ImageList_GetImageCount
39 stub ImageList_GetImageInfo
40 stub ImageList_GetImageRect
41 stub ImageList_LoadImage
42 stub ImageList_LoadImageA
43 stub ImageList_LoadImageW
44 stub ImageList_Merge
45 stub ImageList_Read
46 stub ImageList_Remove
47 stub ImageList_Replace
48 stub ImageList_ReplaceIcon
49 stub ImageList_SetBkColor
50 stub ImageList_SetDragCursorImage
51 stub ImageList_SetIconSize
52 stub ImageList_SetOverlayImage
53 stub ImageList_Write
54 stub PropertySheet
55 stub PropertySheetA
56 stub PropertySheetW
16 stub CreateStatusWindow
17 stub CreateStatusWindowW
18 stub CreateToolbarEx
19 stub DestroyPropertySheetPage
20 stub DllGetVersion
21 stub DrawStatusText
22 stub DrawStatusTextW
23 stub ImageList_Add
24 stub ImageList_AddIcon
25 stub ImageList_AddMasked
26 stub ImageList_BeginDrag
27 stub ImageList_Copy
28 stub ImageList_Create
29 stub ImageList_Destroy
30 stub ImageList_DragEnter
31 stub ImageList_DragLeave
32 stub ImageList_DragMove
33 stub ImageList_DragShowNolock
34 stub ImageList_Draw
35 stub ImageList_DrawEx
36 stub ImageList_EndDrag
37 stub ImageList_GetBkColor
38 stub ImageList_GetDragImage
39 stub ImageList_GetIcon
40 stub ImageList_GetIconSize
41 stub ImageList_GetImageCount
42 stub ImageList_GetImageInfo
43 stub ImageList_GetImageRect
44 stub ImageList_LoadImage
45 stub ImageList_LoadImageA
46 stub ImageList_LoadImageW
47 stub ImageList_Merge
48 stub ImageList_Read
49 stub ImageList_Remove
50 stub ImageList_Replace
51 stub ImageList_ReplaceIcon
52 stub ImageList_SetBkColor
53 stub ImageList_SetDragCursorImage
54 stub ImageList_SetFilter
55 stub ImageList_SetIconSize
56 stub ImageList_SetImageCount
57 stub ImageList_SetOverlayImage
58 stub ImageList_Write
59 stub InitCommonControlsEx
60 stub PropertySheet
61 stub PropertySheetA
62 stub PropertySheetW
63 stub _TrackMouseEvent

View File

@ -19,8 +19,8 @@ type win16
16 stub CORELEASEMARSHALDATA
17 stub COFREEUNUSEDLIBRARIES
18 stub ISEQUALGUID
19 stub STRINGFROMCLSID
20 stub CLSIDFROMSTRING
19 pascal STRINGFROMCLSID(ptr ptr) StringFromCLSID
20 pascal CLSIDFROMSTRING(str ptr) CLSIDFromString
21 stub ISVALIDPTRIN
22 stub ISVALIDPTROUT
23 stub ISVALIDINTERFACE

View File

@ -1,6 +1,7 @@
name gdi
type win16
heap 65488 # 65536 - 16 (instance data) - 32 (stock objects)
file gdi.exe
1 pascal SetBkColor(word long) SetBkColor16
2 pascal16 SetBkMode(word word) SetBkMode16

View File

@ -1,5 +1,6 @@
name kernel
type win16
file krnl386.exe
1 stub FatalExit
2 stub ExitKernel
@ -317,9 +318,9 @@ type win16
502 stub KERNEL_502
503 stub KERNEL_503
511 stub KERNEL_511
513 pascal LoadLibraryEx32W(ptr long long) LoadLibraryEx32W16
514 stub FreeLibrary32W
515 pascal GetProcAddress32W(long ptr) GetProcAddress32
513 pascal LoadLibraryEx32W(ptr long long) LoadLibraryEx32W16
514 pascal16 FreeLibrary32W(long) FreeLibrary32
515 pascal GetProcAddress32W(long ptr) GetProcAddress32
516 stub GetVDMPointer32W
517 pascal CallProc32W() WIN16_CallProc32W
518 stub CallProcEx32W

View File

@ -26,14 +26,18 @@ base 1
30 stub _KERNEL32_31
34 stub LoadLibrary16
33 stdcall _KERNEL32_34() _KERNEL32_34
34 stdcall LoadLibrary16(ptr) LoadLibrary16
35 stub FreeLibrary16
36 stub GetProcAddress16
36 stdcall GetProcAddress16(long ptr) WIN32_GetProcAddress16
39 stub _KERNEL32_40
42 return _KERNEL32_43 20 0
44 stub _KERNEL32_45
40 stdcall _KERNEL32_41(long long long long long) _KERNEL32_41
41 stub _KERNEL32_42
42 stdcall _KERNEL32_43(long ptr long ptr ptr) _KERNEL32_43
44 register _KERNEL32_45(long) _KERNEL32_45
45 stdcall _KERNEL32_46(long long long long long) _KERNEL32_46
46 stub _KERNEL32_47
49 stdcall AddAtomA(ptr) AddAtom32A
@ -42,7 +46,7 @@ base 1
# WOW calls
53 stub WOWCallback16
54 stub WOWCallback16Ex
55 stub WOWGetVDMPointer
55 stdcall WOWGetVDMPointer(long long long) WOWGetVDMPointer
56 stub WOWHandle32
57 stub WOWHandle16
58 stub WOWGlobalAlloc16
@ -54,9 +58,9 @@ base 1
64 stub WOWGlobalLockSize16
65 stub WOWYield16
66 stub WOWDirectedYield16
67 stub WOWGetVDMPointerFix
68 stub WOWGetVDMPointerUnfix
69 stub WOW32_1
67 stdcall WOWGetVDMPointerFix(long long long) WOWGetVDMPointerFix
68 stdcall WOWGetVDMPointerUnfix(long) WOWGetVDMPointerUnfix
69 stdcall WOW32_1(long long) WOW32_1
71 stub RtlLargeIntegerAdd
72 stub RtlEnlargedIntegerMultiply
@ -73,11 +77,12 @@ base 1
83 stub RtlConvertLongToLargeInteger
84 stub RtlConvertUlongToLargeInteger
86 stub _KERNEL32_87
87 stub _KERNEL32_88
90 stub _KERNEL32_90
91 stub _KERNEL32_91
86 stdcall _KERNEL32_87() _KERNEL32_87
87 cdecl _KERNEL32_88(long long ptr) _KERNEL32_88
88 stub _KERNEL32_89
89 stub _KERNEL32_90
90 register _KERNEL32_91() _KERNEL32_91
91 stub _KERNEL32_92
92 stdcall GETPWIN16LOCK(ptr) GetPWinLock
96 stub ENTERSYSLEVEL
97 stub LEAVESYSLEVEL

124
if1632/signal.c Normal file
View File

@ -0,0 +1,124 @@
/*
* Emulator signal handling
*
* Copyright 1995 Alexandre Julliard
*/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include <setjmp.h>
#include <sys/time.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <sys/wait.h>
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__svr4__) || defined(_SCO_DS) || defined(__EMX__)
# if !defined(_SCO_DS) && !defined(__EMX__)
# include <sys/syscall.h>
# endif
# include <sys/param.h>
#else
# include <syscall.h>
#endif
#include "debugger.h"
#include "options.h"
#include "sigcontext.h"
#include "miscemu.h"
/* Signal handler declaration */
#ifdef linux
#define HANDLER_DEF(name) void name (int signal, SIGCONTEXT context_struct)
#define HANDLER_PROLOG SIGCONTEXT *context = &context_struct; {
#define HANDLER_EPILOG }
#elif defined(__svr4__) || defined(_SCO_DS)
#define HANDLER_DEF(name) void name (int signal, void *siginfo, SIGCONTEXT *context)
#define HANDLER_PROLOG /* nothing */
#define HANDLER_EPILOG /* nothing */
#else
#define HANDLER_DEF(name) void name (int signal, int code, SIGCONTEXT *context)
#define HANDLER_PROLOG /* nothing */
#define HANDLER_EPILOG /* nothing */
#endif
extern void SIGNAL_SetHandler( int sig, void (*func)(), int flags );
extern BOOL32 INSTR_EmulateInstruction( SIGCONTEXT *context );
/**********************************************************************
* SIGNAL_break
*
* Handle Ctrl-C and such
*/
static HANDLER_DEF(SIGNAL_break)
{
HANDLER_PROLOG;
if (Options.debug) wine_debug( signal, context ); /* Enter our debugger */
else exit(0);
HANDLER_EPILOG;
}
/**********************************************************************
* SIGNAL_trap
*
* SIGTRAP handler.
*/
static HANDLER_DEF(SIGNAL_trap)
{
HANDLER_PROLOG;
wine_debug( signal, context ); /* Enter our debugger */
HANDLER_EPILOG;
}
/**********************************************************************
* SIGNAL_fault
*
* Segfault handler.
*/
static HANDLER_DEF(SIGNAL_fault)
{
HANDLER_PROLOG;
if (CS_sig(context) == WINE_CODE_SELECTOR)
{
fprintf( stderr, "Segmentation fault in Wine program (%04x:%08lx)."
" Please debug.\n",
(unsigned short) CS_sig(context), EIP_sig(context));
}
else
{
if (INSTR_EmulateInstruction( context )) return;
fprintf( stderr, "Segmentation fault in Windows program %04x:%08lx.\n",
(unsigned short) CS_sig(context), EIP_sig(context) );
}
wine_debug( signal, context );
HANDLER_EPILOG;
}
/**********************************************************************
* SIGNAL_InitEmulator
*
* Initialize emulator signals.
*/
BOOL32 SIGNAL_InitEmulator(void)
{
SIGNAL_SetHandler( SIGINT, (void (*)())SIGNAL_break, 1);
SIGNAL_SetHandler( SIGSEGV, (void (*)())SIGNAL_fault, 1);
SIGNAL_SetHandler( SIGILL, (void (*)())SIGNAL_fault, 1);
SIGNAL_SetHandler( SIGFPE, (void (*)())SIGNAL_fault, 1);
SIGNAL_SetHandler( SIGTRAP, (void (*)())SIGNAL_trap, 1); /* debugger */
SIGNAL_SetHandler( SIGHUP, (void (*)())SIGNAL_trap, 1); /* forced break*/
#ifdef SIGBUS
SIGNAL_SetHandler( SIGBUS, (void (*)())SIGNAL_fault, 1);
#endif
return TRUE;
}

View File

@ -1,11 +1,11 @@
name system
type win16
1 pascal InquireSystem(word word word) InquireSystem
2 stub CreateSystemTimer
3 stub KillSystemTimer
4 stub EnableSystemTimers
5 stub DisableSystemTimers
1 pascal InquireSystem(word word) InquireSystem
2 pascal16 CreateSystemTimer(word segptr) THUNK_CreateSystemTimer
3 pascal16 KillSystemTimer(word) THUNK_KillSystemTimer
4 pascal16 EnableSystemTimers() EnableSystemTimers
5 pascal16 DisableSystemTimers() DisableSystemTimers
6 pascal GetSystemMSecCount() GetTickCount
7 return Get80x87SaveSize 0 94
8 stub Save80x87State

View File

@ -595,7 +595,33 @@ BOOL16 THUNK_UnhookWindowsHookEx16( HHOOK hhook )
}
/*************************************************************
/***********************************************************************
* THUNK_CreateSystemTimer (SYSTEM.2)
*/
WORD THUNK_CreateSystemTimer( WORD rate, FARPROC16 callback )
{
THUNK *thunk = THUNK_Alloc( callback, (RELAY)CallTo16_word_ );
if (!thunk) return 0;
return CreateSystemTimer( rate, (FARPROC16)thunk );
}
/***********************************************************************
* THUNK_KillSystemTimer (SYSTEM.3)
*/
WORD THUNK_KillSystemTimer( WORD timer )
{
extern WORD SYSTEM_KillSystemTimer( WORD timer ); /* misc/system.c */
extern FARPROC16 SYSTEM_GetTimerProc( WORD timer ); /* misc/system.c */
THUNK *thunk = (THUNK *)SYSTEM_GetTimerProc( timer );
WORD ret = SYSTEM_KillSystemTimer( timer );
if (thunk) THUNK_Free( thunk );
return ret;
}
/***********************************************************************
* THUNK_SetUnhandledExceptionFilter (KERNEL32.516)
*/
LPTOP_LEVEL_EXCEPTION_FILTER THUNK_SetUnhandledExceptionFilter(

View File

@ -1,6 +1,7 @@
name user
type win16
heap 65520
file user.exe
1 pascal16 MessageBox(word str str word) MessageBox16
2 stub OldExitWindows
@ -247,7 +248,7 @@ heap 65520
CreateDialogIndirectParam16
243 pascal GetDialogBaseUnits() GetDialogBaseUnits
244 pascal16 EqualRect(ptr ptr) EqualRect16
245 stub EnableCommNotification
245 pascal16 EnableCommNotification(s_word word s_word s_word) EnableCommNotification
246 pascal16 ExitWindowsExec(str str) ExitWindowsExec16
247 pascal16 GetCursor() GetCursor16
248 pascal16 GetOpenClipboardWindow() GetOpenClipboardWindow16

View File

@ -156,7 +156,7 @@ base 1
0149 stdcall DlgDirSelectExW(long ptr long long) DlgDirSelectEx32W
0150 stdcall DragDetect(long long long) DragDetect32
0151 stub DragObject
0152 stub DrawAnimatedRects
0152 stdcall DrawAnimatedRects(long long ptr ptr) DrawAnimatedRects32
0153 stub DrawCaption
0154 stdcall DrawEdge(long ptr long long) DrawEdge32
0155 stdcall DrawFocusRect(long ptr) DrawFocusRect32
@ -267,8 +267,8 @@ base 1
0260 stub GetMenuIndex
0261 stdcall GetMenuItemCount(long) GetMenuItemCount32
0262 stdcall GetMenuItemID(long long) GetMenuItemID32
0263 stub GetMenuItemInfoA
0264 stub GetMenuItemInfoW
0263 stdcall GetMenuItemInfoA(long long long ptr) GetMenuItemInfo32A
0264 stdcall GetMenuItemInfoW(long long long ptr) GetMenuItemInfo32W
0265 stub GetMenuItemRect
0266 stdcall GetMenuState(long long long) GetMenuState32
0267 stdcall GetMenuStringA(long long ptr long long) GetMenuString32A

View File

@ -48,6 +48,8 @@ extern LONG CallTo16_long_lwwllwlllllw( FARPROC16, LONG, WORD, WORD, LONG,
#define CallDriverProc( func, dwId, msg, hdrvr, lparam1, lparam2 ) \
CallTo16_long_lwwll( func, dwId, msg, hdrvr, lparam1, lparam2 )
#define CallDriverCallback( func, hdev, msg, user, lparam1, lparam2 ) \
CallTo16_word_wwlll( func, hdev, msg, user, lparam1, lparam2 )
#define CallTimeFuncProc( func, id, msg, dwUser, dw1, dw2 ) \
CallTo16_word_wwlll( func, id, msg, dwUser, dw1, dw2 )
#define CallWindowsExitProc( func, nExitType ) \
@ -78,6 +80,8 @@ extern LONG CallTo32_5( FARPROC32, DWORD, DWORD, DWORD, DWORD, DWORD );
#define CallDriverProc( func, dwId, msg, hdrvr, lparam1, lparam2 ) \
(*func)( dwId, msg, hdrvr, lparam1, lparam2 )
#define CallDriverCallback( func, hdev, msg, user, lparam1, lparam2 ) \
(*func)( hdev, msg, user, lparam1, lparam2 )
#define CallTimeFuncProc( func, id, msg, dwUser, dw1, dw2 ) \
(*func)( id, msg, dwUser, dw1, dw2 )
#define CallWindowsExitProc( func, nExitType ) \

16
include/compobj.h Normal file
View File

@ -0,0 +1,16 @@
#if !defined(COMPOBJ_H)
#define COMPOBJ_H
struct tagCLSID {
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
};
typedef struct tagCLSID CLSID;
OLESTATUS StringFromCLSID(const CLSID *id, LPSTR);
OLESTATUS CLSIDFromString(const LPCSTR, CLSID *);
#endif

View File

@ -10,7 +10,7 @@
#include <stdio.h>
#include "winnt.h"
/* miscemu/dosmem.c */
/* msdos/dosmem.c */
extern HANDLE16 DOSMEM_BiosSeg;
extern DWORD DOSMEM_CollateTable;
@ -24,9 +24,6 @@ extern LPVOID DOSMEM_MapRealToLinear(DWORD); /* real-mode to linear */
extern LPVOID DOSMEM_MapDosToLinear(UINT32); /* linear DOS to Wine */
extern UINT32 DOSMEM_MapLinearToDos(LPVOID); /* linear Wine to DOS */
/* miscemu/interrupts.c */
extern BOOL32 INT_Init(void);
/* msdos/interrupts.c */
extern FARPROC16 INT_GetHandler( BYTE intnum );
extern void INT_SetHandler( BYTE intnum, FARPROC16 handler );
@ -39,6 +36,14 @@ extern void IO_outport( int port, int count, DWORD value );
/* msdos/int1a.c */
extern DWORD INT1A_GetTicksSinceMidnight(void);
/* loader/signal.c */
extern BOOL32 SIGNAL_Init(void);
extern void SIGNAL_SetHandler( int sig, void (*func)(), int flags );
extern void SIGNAL_MaskAsyncEvents( BOOL32 flag );
/* if1632/signal.c */
extern BOOL32 SIGNAL_InitEmulator(void);
#define INT_BARF(context,num) \
fprintf( stderr, "int%x: unknown/not implemented parameters:\n" \
"int%x: AX %04x, BX %04x, CX %04x, DX %04x, " \

View File

@ -126,6 +126,7 @@ extern FARPROC16 MODULE_GetEntryPoint( HMODULE16 hModule, WORD ordinal );
extern BOOL16 MODULE_SetEntryPoint( HMODULE16 hModule, WORD ordinal,
WORD offset );
extern FARPROC16 MODULE_GetWndProcEntry16( const char *name );
extern FARPROC16 WIN32_GetProcAddress16( HMODULE16 hmodule, LPSTR name );
/* builtin.c */
extern BOOL16 BUILTIN_Init(void);

View File

@ -15,7 +15,9 @@ int TWEAK_Init();
int TWEAK_CheckConfiguration();
INT32 TWEAK_PartyMessageBox(LPCSTR, LPCSTR, DWORD);
void TWEAK_DrawReliefRect95(HDC32, RECT32 const *);
void TWEAK_DrawMenuSeparator95(HDC32, UINT32, UINT32, UINT32);
void TWEAK_DrawRevReliefRect95(HDC32, RECT32 const *);
void TWEAK_DrawMenuSeparatorHoriz95(HDC32, UINT32, UINT32, UINT32);
void TWEAK_DrawMenuSeparatorVert95(HDC32, UINT32, UINT32, UINT32);
extern int TWEAK_Win95Look;
extern int TWEAK_WineInitialized;
extern HPEN32 TWEAK_PenFF95;

View File

@ -188,6 +188,8 @@ extern BOOL32 WIN16DRV_ExtTextOut( DC *dc, INT32 x, INT32 y, UINT32 flags,
const RECT32 *lprect, LPCSTR str, UINT32 count,
const INT32 *lpDx );
extern HGDIOBJ32 WIN16DRV_SelectObject( DC *dc, HGDIOBJ32 handle );
extern BOOL32 WIN16DRV_PatBlt( struct tagDC *dc, INT32 left, INT32 top,
INT32 width, INT32 height, DWORD rop );

View File

@ -2844,6 +2844,67 @@ typedef struct
#define MF_HELP 0x4000
#define MF_MOUSESELECT 0x8000
/* Flags for extended menu item types. */
#define MFT_STRING MF_STRING
#define MFT_BITMAP MF_BITMAP
#define MFT_MENUBARBREAK MF_MENUBARBREAK
#define MFT_MENUBREAK MF_MENUBREAK
#define MFT_OWNERDRAW MF_OWNERDRAW
#define MFT_RADIOCHECK 0x00000200L
#define MFT_SEPARATOR MF_SEPARATOR
#define MFT_RIGHTORDER 0x00002000L
#define MFT_RIGHTJUSTIFY MF_RIGHTJUSTIFY
/* Flags for extended menu item states. */
#define MFS_GRAYED 0x00000003L
#define MFS_DISABLED MFS_GRAYED
#define MFS_CHECKED MF_CHECKED
#define MFS_HILITE MF_HILITE
#define MFS_ENABLED MF_ENABLED
#define MFS_UNCHECKED MF_UNCHECKED
#define MFS_UNHILITE MF_UNHILITE
#define MFS_DEFAULT MF_DEFAULT
typedef struct {
UINT32 cbSize;
UINT32 fMask;
UINT32 fType;
UINT32 fState;
UINT32 wID;
HMENU32 hSubMenu;
HBITMAP32 hbmpChecked;
HBITMAP32 hbmpUnchecked;
DWORD dwItemData;
LPSTR dwTypeData;
UINT32 cch;
} MENUITEMINFO32A, *LPMENUITEMINFO32A;
typedef struct {
UINT32 cbSize;
UINT32 fMask;
UINT32 fType;
UINT32 fState;
UINT32 wID;
HMENU32 hSubMenu;
HBITMAP32 hbmpChecked;
HBITMAP32 hbmpUnchecked;
DWORD dwItemData;
LPWSTR dwTypeData;
UINT32 cch;
} MENUITEMINFO32W, *LPMENUITEMINFO32W;
DECL_WINELIB_TYPE_AW(MENUITEMINFO);
DECL_WINELIB_TYPE_AW(LPMENUITEMINFO);
/* Field specifiers for MENUITEMINFO[AW] type. */
#define MIIM_STATE 0x00000001
#define MIIM_ID 0x00000002
#define MIIM_SUBMENU 0x00000004
#define MIIM_CHECKMARKS 0x00000008
#define MIIM_TYPE 0x00000010
#define MIIM_DATA 0x00000020
#ifndef NOWINOFFSETS
#define GCW_HBRBACKGROUND (-10)
#endif
@ -5070,13 +5131,17 @@ INT16 Catch(LPCATCHBUF);
WORD ChangeSelector(WORD,WORD);
INT16 CloseComm(INT16);
HGLOBAL16 CreateCursorIconIndirect(HINSTANCE16,CURSORICONINFO*,LPCVOID,LPCVOID);
WORD CreateSystemTimer(WORD,FARPROC16);
BOOL16 DCHook(HDC16,WORD,DWORD,LPARAM);
VOID DirectedYield(HTASK16);
HGLOBAL16 DirectResAlloc(HINSTANCE16,WORD,UINT16);
VOID DisableSystemTimers(void);
BOOL16 DlgDirSelect(HWND16,LPSTR,INT16);
BOOL16 DlgDirSelectComboBox(HWND16,LPSTR,INT16);
DWORD DumpIcon(SEGPTR,WORD*,SEGPTR*,SEGPTR*);
BOOL16 EnableCommNotification(INT16,HWND16,INT16,INT16);
BOOL16 EnableHardwareInput(BOOL16);
VOID EnableSystemTimers(void);
INT16 ExcludeVisRect(HDC16,INT16,INT16,INT16,INT16);
HANDLE16 FarGetOwner(HGLOBAL16);
VOID FarSetOwner(HGLOBAL16,HANDLE16);
@ -5283,6 +5348,9 @@ DWORD GetFullPathName32W(LPCWSTR,DWORD,LPWSTR,LPWSTR*);
#define GetFullPathName WINELIB_NAME_AW(GetFullPathName)
VOID GetLocalTime(LPSYSTEMTIME);
DWORD GetLogicalDrives(void);
BOOL32 GetMenuItemInfo32A(HMENU32,UINT32,BOOL32,MENUITEMINFO32A*);
BOOL32 GetMenuItemInfo32W(HMENU32,UINT32,BOOL32,MENUITEMINFO32W*);
#define GetMenuItemInfo WINELIB_NAME_AW(GetMenuItemInfo)
UINT32 GetOEMCP(void);
DWORD GetPriorityClass(HANDLE32);
HANDLE32 GetProcessHeap(void);

View File

@ -12,10 +12,6 @@
#include "global.h"
#include "debug.h"
void SIGNAL_MaskAsyncEvents( BOOL32 mask )
{
/* FIXME: signals don't work in the library */
}
/* for windows/winproc.c */
void CallFrom16_long_wwwll(void) {}

View File

@ -3,10 +3,11 @@ TOPOBJDIR = ..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = none
PROGRAMS = hello hello2 hello3 hello4 new rolex
PROGRAMS = expand hello hello2 hello3 hello4 new rolex
ALL_LIBS = $(WINELIB) $(X_LIBS) $(XPM_LIB) $(XLIB) $(LDLIBS)
C_SRCS = \
expand.c \
hello.c \
hello2.c \
hello3.c \
@ -21,6 +22,9 @@ all: check_winerc $(PROGRAMS)
@MAKE_RULES@
expand: expand.o
$(CC) -o expand expand.o $(LDOPTIONS) $(ALL_LIBS)
hello: hello.o
$(CC) -o hello hello.o $(LDOPTIONS) $(ALL_LIBS)

76
libtest/expand.c Normal file
View File

@ -0,0 +1,76 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <lzexpand.h>
int PASCAL WinMain(HINSTANCE hinstCurrent,
HINSTANCE hinstPrevious,
LPSTR lpCmdLine,
int nCmdShow)
{
OFSTRUCT SourceOpenStruct1, SourceOpenStruct2;
char OriginalName[256], WriteBuf[256];
char FAR *lpzDestFile,
FAR *lpzHolder = lpCmdLine,
FAR *arrgv[2] = {0};
int wargs;
DWORD dwreturn;
HFILE hSourceFile, hDestFile;
for (wargs = 1; wargs < 3; wargs++)
{arrgv[wargs] = lpzHolder;
for (; *lpzHolder != '\0'; lpzHolder++)
if (*lpzHolder == ' ') {*lpzHolder++ = '\0'; break;};
};
MessageBox((HWND)NULL, (LPCSTR)arrgv[1], (LPCSTR)"arrgv[1]:", MB_OK);
MessageBox((HWND)NULL, (LPCSTR)arrgv[2], (LPCSTR)"arrgv[2]:", MB_OK);
hSourceFile = LZOpenFile(arrgv[1], (LPOFSTRUCT) &SourceOpenStruct1,
OF_READ);
wsprintf(WriteBuf, "Source File Handle: %d\nNo. of args: %d",
hSourceFile, wargs);
MessageBox((HWND)NULL, (LPCSTR)WriteBuf, (LPCSTR)NULL, MB_OK);
if ((wargs == 3) && (arrgv[2] != NULL)) lpzDestFile = arrgv[2];
else
{
lpzDestFile = OriginalName;
GetExpandedName(arrgv[1], lpzDestFile);
};
MessageBox((HWND)NULL, (LPCSTR)lpzDestFile, (LPCSTR)"Destination File",
MB_OK);
hDestFile = LZOpenFile(lpzDestFile, (LPOFSTRUCT) &SourceOpenStruct2,
OF_CREATE | OF_WRITE);
wsprintf(WriteBuf, "Destination File Handle: %d\nNo. of args: %d",
hDestFile, wargs-1);
MessageBox((HWND)NULL, (LPCSTR)WriteBuf, (LPCSTR)NULL, MB_OK);
dwreturn = LZCopy(hSourceFile, hDestFile);
if (dwreturn == LZERROR_BADINHANDLE)
MessageBox((HWND)NULL, (LPCSTR)"LZERROR_BADINHANDLE\n", (LPCSTR)NULL, MB_OK);
if (dwreturn == LZERROR_BADOUTHANDLE)
MessageBox((HWND)NULL, (LPCSTR)"LZERROR_BADOUTHANDLE\n", (LPCSTR)NULL, MB_OK);
if (dwreturn == LZERROR_BADVALUE)
MessageBox((HWND)NULL, (LPCSTR)"LZERROR_BADVALUE\n", (LPCSTR)NULL, MB_OK);
if (dwreturn == LZERROR_GLOBALLOC)
MessageBox((HWND)NULL, (LPCSTR)"LZERROR_GLOBALLOC\n", (LPCSTR)NULL, MB_OK);
if (dwreturn == LZERROR_GLOBLOCK)
MessageBox((HWND)NULL, (LPCSTR)"LZERROR_GLOBLOCK\n", (LPCSTR)NULL, MB_OK);
if (dwreturn == LZERROR_READ)
MessageBox((HWND)NULL, (LPCSTR)"LZERROR_READ\n", (LPCSTR)NULL, MB_OK);
if (dwreturn == LZERROR_WRITE)
MessageBox((HWND)NULL, (LPCSTR)"LZERROR_WRITE\n", (LPCSTR)NULL, MB_OK);
if ((long)dwreturn > 0L)
{wsprintf((LPSTR)WriteBuf, (LPCSTR)"Successful decompression from %s to %s\n",
arrgv[1], lpzDestFile);
MessageBox((HWND)NULL, (LPSTR)WriteBuf, (LPCSTR)NULL, MB_OK);
};
LZClose(hSourceFile); LZClose(hDestFile);
return dwreturn;
}

View File

@ -44,12 +44,7 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
#include "debugger.h"
#endif
/* Winelib run-time flag */
#ifdef WINELIB
int __winelib = 1;
#else
int __winelib = 0;
#endif
int __winelib = 1; /* Winelib run-time flag */
HANDLE32 SystemHeap = 0;
HANDLE32 SegptrHeap = 0;
@ -61,7 +56,6 @@ int MAIN_Init(void)
{
extern BOOL32 RELAY_Init(void);
extern BOOL32 WIN16DRV_Init(void);
extern BOOL32 SIGNAL_Init(void);
extern BOOL32 VIRTUAL_Init(void);
extern BOOL32 WIDGETS_Init(void);
@ -80,6 +74,9 @@ int MAIN_Init(void)
/* Initialize DOS memory */
if (!DOSMEM_Init()) return 0;
/* Initialize signal handling */
if (!SIGNAL_Init()) return 0;
#ifdef WINELIB
/* Create USER and GDI heap */
USER_HeapSel = GlobalAlloc16( GMEM_FIXED, 0x10000 );
@ -94,7 +91,7 @@ int MAIN_Init(void)
if (!BUILTIN_Init()) return 0;
/* Initialize signal handling */
if (!SIGNAL_Init()) return 0;
if (!SIGNAL_InitEmulator()) return 0;
/* Create the Win16 printer driver */
if (!WIN16DRV_Init()) return 0;
@ -184,6 +181,8 @@ int main(int argc, char *argv[] )
int i,loaded;
HINSTANCE16 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.

View File

@ -1162,8 +1162,9 @@ HINSTANCE16 MODULE_Load( LPCSTR name, LPVOID paramBlock, BOOL32 first )
0xFF00, hModule, FALSE, FALSE, FALSE)
);
oldstack = IF1632_Saved16_ss_sp;
IF1632_Saved16_ss_sp = MAKELONG( 0xFF00 - sizeof(*stack16Top),
pModule->self_loading_sel );
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;
@ -1458,10 +1459,11 @@ HINSTANCE32 WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow )
{
LOADPARAMS params;
HGLOBAL16 cmdShowHandle, cmdLineHandle;
HINSTANCE16 handle;
HINSTANCE16 handle = 2;
WORD *cmdShowPtr;
char *p, *cmdline, filename[256];
static int use_load_module = 1;
int spacelimit = 0, exhausted = 0;
if (!lpCmdLine)
return 2; /* File not found */
@ -1473,115 +1475,148 @@ HINSTANCE32 WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow )
return 8; /* Out of memory */
}
/* Store nCmdShow */
/* Keep trying to load a file by trying different filenames; e.g.,
for the cmdline "abcd efg hij", try "abcd" with args "efg hij",
then "abcd efg" with arg "hij", and finally "abcd efg hij" with
no args */
cmdShowPtr = (WORD *)GlobalLock16( cmdShowHandle );
cmdShowPtr[0] = 2;
cmdShowPtr[1] = nCmdShow;
while(!exhausted && handle == 2) {
int spacecount = 0;
/* Build the filename and command-line */
/* Store nCmdShow */
cmdline = (char *)GlobalLock16( cmdLineHandle );
lstrcpyn32A(filename, lpCmdLine, sizeof(filename) - 4 /* for extension */);
for (p = filename; *p && (*p != ' ') && (*p != '\t'); p++);
if (*p) lstrcpyn32A( cmdline + 1, p + 1, 127 );
else cmdline[1] = '\0';
cmdline[0] = strlen( cmdline + 1 ) + 1;
*p = '\0';
cmdShowPtr = (WORD *)GlobalLock16( cmdShowHandle );
cmdShowPtr[0] = 2;
cmdShowPtr[1] = nCmdShow;
/* Now load the executable file */
/* Build the filename and command-line */
if (use_load_module)
{
cmdline = (char *)GlobalLock16( cmdLineHandle );
lstrcpyn32A(filename, lpCmdLine,
sizeof(filename) - 4 /* for extension */);
/* Keep grabbing characters until end-of-string, tab, or until the
number of spaces is greater than the spacelimit */
for (p = filename; ; p++) {
if(*p == ' ') {
++spacecount;
if(spacecount > spacelimit) {
++spacelimit;
break;
}
}
if(*p == '\0' || *p == '\t') {
exhausted = 1;
break;
}
}
if (*p)
lstrcpyn32A( cmdline + 1, p + 1, 127 );
else
cmdline[1] = '\0';
cmdline[0] = strlen( cmdline + 1 ) + 1;
*p = '\0';
/* Now load the executable file */
if (use_load_module)
{
#ifdef WINELIB
/* WINELIB: Use LoadModule() only for the program itself */
use_load_module = 0;
params.hEnvironment = (HGLOBAL16)GetDOSEnvironment();
/* WINELIB: Use LoadModule() only for the program itself */
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.showCmd = (SEGPTR)WIN16_GlobalLock16( cmdShowHandle );
params.reserved = 0;
handle = LoadModule16( filename, &params );
if (handle == 2) /* file not found */
{
/* Check that the original file name did not have a suffix */
p = strrchr(filename, '.');
/* if there is a '.', check if either \ OR / follow */
if (!p || strchr(p, '/') || strchr(p, '\\'))
{
p = filename + strlen(filename);
strcpy( p, ".exe" );
handle = LoadModule16( filename, &params );
*p = '\0'; /* Remove extension */
}
params.cmdLine = (SEGPTR)WIN16_GlobalLock16( cmdLineHandle );
params.showCmd = (SEGPTR)WIN16_GlobalLock16( cmdShowHandle );
params.reserved = 0;
handle = LoadModule16( filename, &params );
if (handle == 2) /* file not found */
{
/* Check that the original file name did not have a suffix */
p = strrchr(filename, '.');
/* if there is a '.', check if either \ OR / follow */
if (!p || strchr(p, '/') || strchr(p, '\\'))
{
p = filename + strlen(filename);
strcpy( p, ".exe" );
handle = LoadModule16( filename, &params );
*p = '\0'; /* Remove extension */
}
}
}
}
else handle = 2;
else
handle = 2; /* file not found */
if (handle < 32)
{
/* Try to start it as a unix program */
if (!fork())
if (handle < 32)
{
/* Child process */
DOS_FULL_NAME full_name;
const char *unixfilename = NULL;
const char *argv[256], **argptr;
int iconic = (nCmdShow == SW_SHOWMINIMIZED ||
nCmdShow == SW_SHOWMINNOACTIVE);
/* Try to start it as a unix program */
if (!fork())
{
/* Child process */
DOS_FULL_NAME full_name;
const char *unixfilename = NULL;
const char *argv[256], **argptr;
int iconic = (nCmdShow == SW_SHOWMINIMIZED ||
nCmdShow == SW_SHOWMINNOACTIVE);
/* get unixfilename */
if (strchr(filename, '/') ||
strchr(filename, ':') ||
strchr(filename, '\\'))
{
if (DOSFS_GetFullName( filename, TRUE, &full_name ))
unixfilename = full_name.long_name;
}
else unixfilename = filename;
/* get unixfilename */
if (strchr(filename, '/') ||
strchr(filename, ':') ||
strchr(filename, '\\'))
{
if (DOSFS_GetFullName( filename, TRUE, &full_name ))
unixfilename = full_name.long_name;
}
else unixfilename = filename;
if (unixfilename)
{
/* build argv */
argptr = argv;
if (iconic) *argptr++ = "-iconic";
*argptr++ = unixfilename;
p = cmdline;
while (1)
{
while (*p && (*p == ' ' || *p == '\t')) *p++ = '\0';
if (!*p) break;
*argptr++ = p;
while (*p && *p != ' ' && *p != '\t') p++;
}
*argptr++ = 0;
if (unixfilename)
{
/* build argv */
argptr = argv;
if (iconic) *argptr++ = "-iconic";
*argptr++ = unixfilename;
p = cmdline;
while (1)
{
while (*p && (*p == ' ' || *p == '\t')) *p++ = '\0';
if (!*p) break;
*argptr++ = p;
while (*p && *p != ' ' && *p != '\t') p++;
}
*argptr++ = 0;
/* Execute */
execvp(argv[0], (char**)argv);
}
/* Execute */
execvp(argv[0], (char**)argv);
}
/* Failed ! */
/* Failed ! */
if (__winelib)
{
/* build argv */
argptr = argv;
*argptr++ = "wine";
if (iconic) *argptr++ = "-iconic";
*argptr++ = lpCmdLine;
*argptr++ = 0;
if (__winelib)
{
/* build argv */
argptr = argv;
*argptr++ = "wine";
if (iconic) *argptr++ = "-iconic";
*argptr++ = lpCmdLine;
*argptr++ = 0;
/* Execute */
execvp(argv[0] , (char**)argv);
/* Execute */
execvp(argv[0] , (char**)argv);
/* Failed ! */
fprintf(stderr, "WinExec: can't exec 'wine %s'\n", lpCmdLine);
}
exit(1);
/* Failed ! */
fprintf(stderr, "WinExec: can't exec 'wine %s'\n",
lpCmdLine);
}
exit(1);
}
}
}
} /* while (!exhausted && handle < 32) */
GlobalFree16( cmdShowHandle );
GlobalFree16( cmdLineHandle );
@ -1589,6 +1624,35 @@ HINSTANCE32 WinExec32( LPCSTR lpCmdLine, UINT32 nCmdShow )
}
/***********************************************************************
* WIN32_GetProcAddress16 (KERNEL32.36)
* Get procaddress in 16bit module from win32... (kernel32 undoc. ordinal func)
*/
FARPROC16 WIN32_GetProcAddress16( HMODULE16 hModule, LPSTR name )
{
WORD ordinal;
FARPROC16 ret;
if (!hModule) {
fprintf(stderr,"WIN32_GetProcAddress16: hModule may not be 0!\n");
return (FARPROC16)0;
}
hModule = GetExePtr(hModule);
if (HIWORD(name)) {
ordinal = MODULE_GetOrdinal( hModule, name );
dprintf_module( stddeb, "WIN32_GetProcAddress16: %04x '%s'\n",
hModule, name );
} else {
ordinal = LOWORD(name);
dprintf_module( stddeb, "GetProcAddress: %04x %04x\n",
hModule, ordinal );
}
if (!ordinal) return (FARPROC16)0;
ret = MODULE_GetEntryPoint( hModule, ordinal );
dprintf_module(stddeb,"WIN32_GetProcAddress16: returning %08x\n",(UINT32)ret);
return ret;
}
/***********************************************************************
* GetProcAddress16 (KERNEL.50)
*/

View File

@ -77,8 +77,8 @@ BOOL32 NE_LoadSegment( HMODULE16 hModule, WORD segnum )
PTR_SEG_OFF_TO_LIN(pSegTable->selector,0);
oldstack = IF1632_Saved16_ss_sp;
oldselector = pSeg->selector;
IF1632_Saved16_ss_sp = MAKELONG( 0xFF00 - sizeof(*stack16Top),
pModule->self_loading_sel );
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->ds = stack16Top->es = pModule->self_loading_sel;

View File

@ -626,7 +626,7 @@ LoadString32A(HINSTANCE32 instance,UINT32 resource_id,LPSTR buffer,int buflen)
if (buffer) buffer2 = HeapAlloc( GetProcessHeap(), 0, buflen * 2 );
retval = LoadString32W(instance,resource_id,buffer2,buflen);
if (buffer)
if (buffer2)
{
lstrcpynWtoA( buffer, buffer2, buflen );
HeapFree( GetProcessHeap(), 0, buffer2 );

View File

@ -1,4 +1,8 @@
#ifndef WINELIB
/*
* Wine signal handling
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
@ -21,198 +25,110 @@
#include <syscall.h>
#endif
#include "debugger.h"
#include "options.h"
#include "sigcontext.h"
#include "win.h"
#include "miscemu.h"
#include "winsock.h"
#if !defined(BSD4_4) || defined(linux) || defined(__FreeBSD__)
char * cstack[4096];
#endif
#ifdef linux
extern void ___sig_restore();
extern void ___masksig_restore();
/* Linux sigaction function */
#if defined(linux) && defined(__i386__)
/* This is the sigaction structure from the Linux 2.1.20 kernel. */
struct kernel_sigaction {
__sighandler_t sa_handler;
unsigned long sa_mask;
unsigned long sa_flags;
void (*sa_restorer) __P ((void));
struct kernel_sigaction
{
void (*sa_handler)();
unsigned long sa_mask;
unsigned long sa_flags;
void (*sa_restorer)();
};
/* Similar to the sigaction function in libc, except it leaves alone the
restorer field */
static int
wine_sigaction(int sig,struct kernel_sigaction * new,
struct kernel_sigaction * old)
restorer field, which is used to specify the signal stack address */
static __inline__ int wine_sigaction( int sig, struct kernel_sigaction *new,
struct kernel_sigaction *old )
{
__asm__("int $0x80":"=a" (sig)
:"0" (SYS_sigaction),"b" (sig),"c" (new),"d" (old));
if (sig>=0)
return 0;
errno = -sig;
return -1;
__asm__ __volatile__( "int $0x80"
: "=a" (sig)
: "0" (SYS_sigaction),
"b" (sig),
"c" (new),
"d" (old) );
if (sig>=0)
return 0;
errno = -sig;
return -1;
}
#endif /* linux */
#endif /* linux && __i386__ */
#ifdef linux
#define HANDLER_DEF(name) void name (int signal, SIGCONTEXT context_struct)
#define HANDLER_PROLOG SIGCONTEXT *context = &context_struct; (void)context; {
#define HANDLER_EPILOG }
#elif defined(__svr4__) || defined(_SCO_DS)
#define HANDLER_DEF(name) void name (int signal, void *siginfo, SIGCONTEXT *context)
#define HANDLER_PROLOG /* nothing */
#define HANDLER_EPILOG /* nothing */
/* Signal stack */
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
# define SIGNAL_STACK_SIZE MINSIGSTKSZ
#elif defined (__svr4__) || defined(_SCO_DS)
# define SIGNAL_STACK_SIZE SIGSTKSZ
#else
#define HANDLER_DEF(name) void name (int signal, int code, SIGCONTEXT *context)
#define HANDLER_PROLOG /* nothing */
#define HANDLER_EPILOG /* nothing */
# define SIGNAL_STACK_SIZE 4096
#endif
extern BOOL32 INSTR_EmulateInstruction( SIGCONTEXT *context );
static char SIGNAL_Stack[SIGNAL_STACK_SIZE];
/**********************************************************************
* wine_timer
*
* SIGALRM handler.
*/
static
HANDLER_DEF(wine_timer)
{
HANDLER_PROLOG;
/* Should do real-time timers here */
DOSMEM_Tick();
HANDLER_EPILOG;
}
/**********************************************************************
* SIGNAL_break
*
* Handle Ctrl-C and such
*/
static
HANDLER_DEF(SIGNAL_break)
{
HANDLER_PROLOG;
if (Options.debug) wine_debug( signal, context ); /* Enter our debugger */
exit(0);
HANDLER_EPILOG;
}
/**********************************************************************
* SIGNAL_child
*
* wait4 terminated child processes
*/
static
HANDLER_DEF(SIGNAL_child)
static void SIGNAL_child(void)
{
HANDLER_PROLOG;
#ifdef HAVE_WAIT4
wait4( 0, NULL, WNOHANG, NULL);
wait4( 0, NULL, WNOHANG, NULL);
#elif defined (HAVE_WAITPID)
/* I am sort-of guessing that this is the same as the wait4 call. */
waitpid (0, NULL, WNOHANG);
/* I am sort-of guessing that this is the same as the wait4 call. */
waitpid (0, NULL, WNOHANG);
#else
wait(NULL);
wait(NULL);
#endif
HANDLER_EPILOG;
}
/**********************************************************************
* SIGNAL_trap
*
* SIGTRAP handler.
*/
static
HANDLER_DEF(SIGNAL_trap)
{
HANDLER_PROLOG;
wine_debug( signal, context ); /* Enter our debugger */
HANDLER_EPILOG;
}
/**********************************************************************
* SIGNAL_fault
*
* Segfault handler.
*/
static
HANDLER_DEF(SIGNAL_fault)
{
HANDLER_PROLOG;
if (CS_sig(context) == WINE_CODE_SELECTOR)
{
fprintf( stderr, "Segmentation fault in Wine program (%04x:%08lx)."
" Please debug.\n",
(unsigned short) CS_sig(context), EIP_sig(context));
}
else
{
if (INSTR_EmulateInstruction( context )) return;
fprintf( stderr, "Segmentation fault in Windows program %04x:%08lx.\n",
(unsigned short) CS_sig(context), EIP_sig(context) );
}
wine_debug( signal, context );
HANDLER_EPILOG;
}
/**********************************************************************
* SIGNAL_SetHandler
*/
static void SIGNAL_SetHandler( int sig, void (*func)(), int flags )
void SIGNAL_SetHandler( int sig, void (*func)(), int flags )
{
int ret;
#ifdef linux
#if defined(linux) && defined(__i386__)
struct kernel_sigaction sig_act;
sig_act.sa_handler = func;
sig_act.sa_flags = SA_RESTART | (flags) ? SA_NOMASK : 0;
/* Point to the top of the stack, minus 4 just in case, and make
it aligned */
sig_act.sa_restorer =
(void (*)()) (((unsigned int)(cstack) + sizeof(cstack) - 4) & ~3);
(void (*)())((int)(SIGNAL_Stack + sizeof(SIGNAL_Stack) - 4) & ~3);
ret = wine_sigaction( sig, &sig_act, NULL );
#endif /* linux */
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
#else /* linux && __i386__ */
struct sigaction sig_act;
sigset_t sig_mask;
sigemptyset(&sig_mask);
sig_act.sa_handler = func;
sig_act.sa_mask = sig_mask;
# if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
sig_act.sa_flags = SA_ONSTACK;
sig_act.sa_mask = sig_mask;
ret = sigaction( sig, &sig_act, NULL );
#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ */
#if defined (__svr4__) || defined(_SCO_DS)
struct sigaction sig_act;
sigset_t sig_mask;
sigemptyset(&sig_mask);
sig_act.sa_handler = func;
# elif defined (__svr4__) || defined(_SCO_DS)
sig_act.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_RESTART;
sig_act.sa_mask = sig_mask;
ret = sigaction( sig, &sig_act, NULL );
#endif /* __svr4__ || _SCO_DS */
#if defined(__EMX__)
struct sigaction sig_act;
sigset_t sig_mask;
sigemptyset(&sig_mask);
sig_act.sa_handler = func;
# elif defined(__EMX__)
sig_act.sa_flags = 0; /* FIXME: EMX has only SA_ACK and SA_SYSV */
sig_act.sa_mask = sig_mask;
# else
sig_act.sa_flags = 0;
# endif
ret = sigaction( sig, &sig_act, NULL );
#endif /* __EMX__ */
#endif /* linux && __i386__ */
if (ret < 0)
{
@ -230,80 +146,29 @@ extern void WINSOCK_sigio(int a);
*/
BOOL32 SIGNAL_Init(void)
{
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined (__svr4__) || defined(_SCO_DS)
struct sigaltstack ss;
if ((ss.ss_sp = malloc(MINSIGSTKSZ)) == NULL) {
fprintf(stderr, "Unable to allocate signal stack (%d bytes)\n",
MINSIGSTKSZ);
return FALSE;
}
ss.ss_size = MINSIGSTKSZ;
ss.ss_sp = SIGNAL_Stack;
ss.ss_size = sizeof(SIGNAL_Stack);
ss.ss_flags = 0;
if (sigaltstack(&ss, NULL) < 0) {
if (sigaltstack(&ss, NULL) < 0)
{
perror("sigstack");
return FALSE;
}
#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ */
#if defined (__svr4__) || defined(_SCO_DS)
struct sigaltstack ss;
if ((ss.ss_sp = malloc(SIGSTKSZ) ) == NULL) {
fprintf(stderr, "Unable to allocate signal stack (%d bytes)\n",
SIGSTKSZ);
return FALSE;
}
ss.ss_size = SIGSTKSZ;
ss.ss_flags = 0;
if (sigaltstack(&ss, NULL) < 0) {
perror("sigstack");
return FALSE;
}
#endif /* __svr4__ || _SCO_DS */
#endif /* __FreeBSD__ || __NetBSD__ || __OpenBSD__ || __svr4__ || _SCO_DS */
SIGNAL_SetHandler( SIGALRM, (void (*)())wine_timer, 1);
SIGNAL_SetHandler( SIGINT, (void (*)())SIGNAL_break, 1);
SIGNAL_SetHandler( SIGCHLD, (void (*)())SIGNAL_child, 1);
SIGNAL_SetHandler( SIGSEGV, (void (*)())SIGNAL_fault, 1);
SIGNAL_SetHandler( SIGILL, (void (*)())SIGNAL_fault, 1);
SIGNAL_SetHandler( SIGFPE, (void (*)())SIGNAL_fault, 1);
SIGNAL_SetHandler( SIGTRAP, (void (*)())SIGNAL_trap, 1); /* debugger */
SIGNAL_SetHandler( SIGHUP, (void (*)())SIGNAL_trap, 1); /* forced break */
#ifdef SIGBUS
SIGNAL_SetHandler( SIGBUS, (void (*)())SIGNAL_fault, 1);
#endif
#ifdef CONFIG_IPC
SIGNAL_SetHandler( SIGUSR2, (void (*)())stop_wait, 1); /* For IPC */
#endif
#ifndef __EMX__ /* FIXME */
#ifdef SIGIO
SIGNAL_SetHandler( SIGIO, (void (*)())WINSOCK_sigio, 0);
#endif
return TRUE;
}
/**********************************************************************
* SIGNAL_StartBIOSTimer
*
* Start the BIOS tick timer.
*/
void SIGNAL_StartBIOSTimer(void)
{
#ifndef __EMX__ /* FIXME: Time don't work... Use BIOS directly instead */
struct itimerval vt_timer;
static int timer_started = 0;
if (timer_started) return;
timer_started = 1;
vt_timer.it_interval.tv_sec = 0;
vt_timer.it_interval.tv_usec = 54929;
vt_timer.it_value = vt_timer.it_interval;
setitimer(ITIMER_REAL, &vt_timer, NULL);
#endif
}
/**********************************************************************
* SIGNAL_MaskAsyncEvents
*/
@ -311,7 +176,7 @@ void SIGNAL_MaskAsyncEvents( BOOL32 flag )
{
sigset_t set;
sigemptyset(&set);
#ifndef __EMX__ /* FIXME */
#ifdef SIGIO
sigaddset(&set, SIGIO);
#endif
sigaddset(&set, SIGUSR1);
@ -320,5 +185,3 @@ void SIGNAL_MaskAsyncEvents( BOOL32 flag )
#endif
sigprocmask( (flag) ? SIG_BLOCK : SIG_UNBLOCK , &set, NULL);
}
#endif /* ifndef WINELIB */

View File

@ -578,9 +578,9 @@ HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
/* Create the 16-bit stack frame */
pTask->ss_sp = MAKELONG( ((pModule->sp != 0) ? pModule->sp :
pSegTable[pModule->ss-1].minsize + pModule->stack_size) & ~1,
hInstance );
pTask->ss_sp = PTR_SEG_OFF_TO_SEGPTR( hInstance,
((pModule->sp != 0) ? pModule->sp :
pSegTable[pModule->ss-1].minsize + pModule->stack_size) & ~1 );
stack16Top = (char *)PTR_SEG_TO_LIN( pTask->ss_sp );
frame16 = (STACK16FRAME *)stack16Top - 1;
frame16->saved_ss_sp = 0;
@ -1159,8 +1159,8 @@ void SwitchStackTo( WORD seg, WORD ptr, WORD top )
/* Switch to the new stack */
IF1632_Saved16_ss_sp = pTask->ss_sp = MAKELONG( ptr - sizeof(STACK16FRAME),
seg );
IF1632_Saved16_ss_sp = pTask->ss_sp = PTR_SEG_OFF_TO_SEGPTR( seg,
ptr - sizeof(STACK16FRAME) );
newFrame = CURRENT_STACK16;
/* Copy the stack frame and the local variables to the new stack */
@ -1216,23 +1216,19 @@ void SwitchStackBack(void)
/***********************************************************************
* GetTaskQueueDS (KERNEL.118)
*/
#ifndef WINELIB
void GetTaskQueueDS( CONTEXT *context )
{
DS_reg(context) = GlobalHandleToSel( GetTaskQueue(0) );
}
#endif /* WINELIB */
/***********************************************************************
* GetTaskQueueES (KERNEL.119)
*/
#ifndef WINELIB
void GetTaskQueueES( CONTEXT *context )
{
ES_reg(context) = GlobalHandleToSel( GetTaskQueue(0) );
}
#endif /* WINELIB */
/***********************************************************************

View File

@ -13,8 +13,10 @@
#include "stddebug.h"
#include "debug.h"
#ifdef __i386__
#ifdef linux
#include <asm/unistd.h>
#include <sys/syscall.h>
struct modify_ldt_s
{
@ -28,8 +30,21 @@ struct modify_ldt_s
unsigned int seg_not_present : 1;
};
static __inline__ _syscall3(int, modify_ldt, int, func, void *, ptr,
unsigned long, bytecount);
static __inline__ int modify_ldt( int func, struct modify_ldt_s *ptr,
unsigned long count )
{
int res;
__asm__ __volatile__("int $0x80"
: "=a" (res)
: "0" (SYS_modify_ldt),
"b" (func),
"c" (ptr),
"d" (count) );
if (res >= 0) return res;
errno = -res;
return -1;
}
#endif /* linux */
#if defined(__svr4__) || defined(_SCO_DS)
@ -44,6 +59,8 @@ extern int i386_get_ldt(int, union descriptor *, int);
extern int i386_set_ldt(int, union descriptor *, int);
#endif /* __NetBSD__ || __FreeBSD__ || __OpenBSD__ */
#endif /* __i386__ */
ldt_copy_entry ldt_copy[LDT_SIZE];
unsigned char ldt_flags_copy[LDT_SIZE];
@ -129,6 +146,8 @@ int LDT_SetEntry( int entry, const ldt_entry *content )
/* Entry 0 must not be modified; its base and limit are always 0 */
if (!entry) return 0;
#ifdef __i386__
#ifdef linux
if (!__winelib)
{
@ -189,6 +208,7 @@ int LDT_SetEntry( int entry, const ldt_entry *content )
}
}
#endif /* __NetBSD__ || __FreeBSD__ || __OpenBSD__ */
#if defined(__svr4__) || defined(_SCO_DS)
if (!__winelib)
{
@ -217,6 +237,8 @@ int LDT_SetEntry( int entry, const ldt_entry *content )
}
#endif
#endif /* __i386__ */
if (ret < 0) return ret;
ldt_copy[entry].base = content->base;
if (!content->limit_in_pages) ldt_copy[entry].limit = content->limit;

View File

@ -159,7 +159,7 @@ static void LOCAL_MakeBlockFree( char *baseptr, WORD block )
next = pNext->next;
}
dprintf_local( stddeb, "Local_AddFreeBlock %04x, next %04x\n", block, next );
dprintf_local( stddeb, "Local_MakeBlockFree %04x, next %04x\n", block, next );
/* Insert the free block in the free-list */
pArena->free_prev = pNext->free_prev;

View File

@ -407,7 +407,7 @@ INT16 OpenComm(LPCSTR device,UINT16 cbInQueue,UINT16 cbOutQueue)
port = device[3] - '0';
if (port-- == 0) {
fprintf(stderr, "comm: BUG ! COM0 doesn't exists!.\n");
fprintf(stderr, "comm: BUG ! COM0 doesn't exist !\n");
commerror = IE_BADID;
}
@ -738,18 +738,27 @@ INT16 GetCommError(INT16 fd,LPCOMSTAT lpStat)
unsigned long cnt;
int rc;
lpStat->status = 0;
if (lpStat) {
lpStat->status = 0;
rc = ioctl(fd, TIOCOUTQ, &cnt);
lpStat->cbOutQue = cnt;
rc = ioctl(fd, TIOCOUTQ, &cnt);
if (rc) fprintf(stderr, "Error !\n");
lpStat->cbOutQue = cnt;
rc = ioctl(fd, TIOCINQ, &cnt);
lpStat->cbInQue = cnt;
rc = ioctl(fd, TIOCINQ, &cnt);
if (rc) fprintf(stderr, "Error !\n");
lpStat->cbInQue = cnt;
dprintf_comm(stddeb,
"GetCommError: fd %d, error %d, lpStat %d %d %d\n",
fd, commerror,
lpStat->status, lpStat->cbInQue, lpStat->cbOutQue);
}
else
dprintf_comm(stddeb,
"GetCommError: fd %d, error %d, lpStat NULL\n",
fd, commerror);
dprintf_comm(stddeb,
"GetCommError: fd %d, error %d, lpStat %d %d %d\n",
fd, commerror,
lpStat->status, lpStat->cbInQue, lpStat->cbOutQue);
/*
* [RER] I have no idea what the following is trying to accomplish.
* [RER] It is certainly not what the reference manual suggests.
@ -1652,7 +1661,7 @@ INT16 WriteComm(INT16 fd, LPSTR lpvBuf, INT16 cbWrite)
* GetCommTimeouts (KERNEL32.160)
*/
BOOL32 GetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) {
dprintf_comm(stddeb,"GetCommTimeouts(%x,%p), empty stub.\n",
fprintf(stderr,"GetCommTimeouts(%x,%p), empty stub.\n",
fd,lptimeouts
);
return TRUE;
@ -1662,8 +1671,19 @@ BOOL32 GetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) {
* SetCommTimeouts (KERNEL32.453)
*/
BOOL32 SetCommTimeouts(INT32 fd,LPCOMMTIMEOUTS lptimeouts) {
dprintf_comm(stddeb,"SetCommTimeouts(%x,%p), empty stub.\n",
fprintf(stderr,"SetCommTimeouts(%x,%p), empty stub.\n",
fd,lptimeouts
);
return TRUE;
}
/***********************************************************************
* EnableCommNotification (USER.246)
*/
BOOL16 EnableCommNotification( INT16 fd, HWND16 hwnd, INT16 cbWriteNotify,
INT16 cbOutQueue )
{
fprintf(stderr, "EnableCommNotification(%d, %x, %d, %d), empty stub.\n", fd, hwnd, cbWriteNotify, cbOutQueue);
return TRUE;
}

View File

@ -7,10 +7,14 @@
/* At the moment, these are only empty stubs.
*/
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include "ole.h"
#include "ole2.h"
#include "stddebug.h"
#include "debug.h"
#include "compobj.h"
DWORD currentMalloc=0;
@ -66,3 +70,109 @@ OLESTATUS CoDisconnectObject( LPUNKNOWN lpUnk, DWORD reserved )
dprintf_ole(stdnimp,"CoDisconnectObject:%p %lx\n",lpUnk,reserved);
return OLE_OK;
}
/***********************************************************************
* CLSIDFromString [COMPOBJ.20]
*/
/* Class id: DWORD-WORD-WORD-BYTES[2]-BYTES[6] */
OLESTATUS
CLSIDFromString(const LPCSTR idstr, CLSID *id)
{
BYTE *s = (BYTE *) idstr;
BYTE *p;
int i;
BYTE table[256];
dprintf_ole(stddeb,"ClsIDFromString() %s -> %p\n", idstr, id);
/* quick lookup table */
memset(table, 0, 256);
for (i = 0; i < 10; i++) {
table['0' + i] = i;
}
for (i = 0; i < 6; i++) {
table['A' + i] = i+10;
table['a' + i] = i+10;
}
/* in form {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} */
if (strlen(idstr) != 38)
return OLE_ERROR_OBJECT;
p = (BYTE *) id;
s++; /* skip leading brace */
for (i = 0; i < 4; i++) {
p[3 - i] = table[*s]<<4 | table[*(s+1)];
s += 2;
}
p += 4;
s++; /* skip - */
for (i = 0; i < 2; i++) {
p[1-i] = table[*s]<<4 | table[*(s+1)];
s += 2;
}
p += 2;
s++; /* skip - */
for (i = 0; i < 2; i++) {
p[1-i] = table[*s]<<4 | table[*(s+1)];
s += 2;
}
p += 2;
s++; /* skip - */
/* these are just sequential bytes */
for (i = 0; i < 2; i++) {
*p++ = table[*s]<<4 | table[*(s+1)];
s += 2;
}
s++; /* skip - */
for (i = 0; i < 6; i++) {
*p++ = table[*s]<<4 | table[*(s+1)];
s += 2;
}
return OLE_OK;
}
/***********************************************************************
* CLSIDFromString [COMPOBJ.19]
*/
OLESTATUS
StringFromCLSID(const CLSID *id, LPSTR idstr)
{
static const char *hex = "0123456789ABCDEF";
char *s;
int i;
sprintf(idstr, "{%08lx-%04x-%04x-%2x%2x-",
id->Data1, id->Data2, id->Data3,
id->Data4[0], id->Data4[1]);
s = &idstr[25];
/* 6 hex bytes */
for (i = 2; i < 8; i++) {
*s++ = hex[id->Data4[i]>>4];
*s++ = hex[id->Data4[i] & 0xf];
}
*s++ = '}';
*s++ = '\0';
for (i = strlen(idstr)-1; i >= 0; i--) {
idstr[i] = toupper(idstr[i]);
}
dprintf_ole(stddeb,"StringFromClsID: %p->%s\n", id, idstr);
return OLE_OK;
}

View File

@ -26,8 +26,6 @@
#include "xmalloc.h"
#include "winreg.h"
#define MAKE_DWORD(x,y) ((DWORD)MAKELONG(x,y))
/* FIXME: following defines should be configured global ... */
/* NOTE: do not append a /. linux' mkdir() WILL FAIL if you do that */
@ -275,6 +273,7 @@ SHELL_StartupRegistry() {
RegCreateKey16(HKEY_DYN_DATA,"\\PerfStats\\StatData",&xhkey);
RegCloseKey(xhkey);
xhkey = 0;
RegCreateKey16(HKEY_LOCAL_MACHINE,"\\HARDWARE\\DESCRIPTION\\System\\CentralProcessor",&hkey);
#ifdef linux
F=fopen("/proc/cpuinfo","r");
@ -392,7 +391,7 @@ _save_USTRING(FILE *F,LPWSTR wstr,int escapeeq) {
if (escapeeq && *s=='=')
doescape = 1;
if (*s=='\\')
fputc(*s,F); /* if \\ than put it twice. */
fputc(*s,F); /* if \\ then put it twice. */
if (doescape)
fprintf(F,"\\u%04x",*((unsigned short*)s));
else
@ -3000,7 +2999,7 @@ DWORD RegQueryInfoKey32A(
lpcbSecurityDescriptor,
ft
);
if (ret==ERROR_SUCCESS)
if (ret==ERROR_SUCCESS && lpszClass)
lstrcpyWtoA(lpszClass,lpszClassW);
if (lpcchClass)
*lpcchClass/=2;

View File

@ -5,29 +5,187 @@
*/
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "windows.h"
#include "miscemu.h"
typedef struct
{
FARPROC16 callback; /* NULL if not in use */
INT32 rate;
INT32 ticks;
} SYSTEM_TIMER;
#define NB_SYS_TIMERS 8
#define SYS_TIMER_RATE 54925
static SYSTEM_TIMER SYS_Timers[NB_SYS_TIMERS];
static int SYS_NbTimers = 0;
static BOOL32 SYS_TimersDisabled = FALSE;
/***********************************************************************
* SYSTEM_TimerTick
*/
static void SYSTEM_TimerTick(void)
{
int i;
for (i = 0; i < NB_SYS_TIMERS; i++)
{
if (!SYS_Timers[i].callback) continue;
if ((SYS_Timers[i].ticks -= SYS_TIMER_RATE) <= 0)
{
SYS_Timers[i].ticks += SYS_Timers[i].rate;
SYS_Timers[i].callback();
}
}
}
/**********************************************************************
* SYSTEM_StartTicks
*
* Start the system tick timer.
*/
static void SYSTEM_StartTicks(void)
{
static BOOL32 handler_installed = FALSE;
if (!handler_installed)
{
handler_installed = TRUE;
SIGNAL_SetHandler( SIGALRM, SYSTEM_TimerTick, 1 );
}
#ifndef __EMX__ /* FIXME: Time don't work... Use BIOS directly instead */
{
struct itimerval vt_timer;
vt_timer.it_interval.tv_sec = 0;
vt_timer.it_interval.tv_usec = 54929;
vt_timer.it_value = vt_timer.it_interval;
setitimer( ITIMER_REAL, &vt_timer, NULL );
}
#endif
}
/**********************************************************************
* SYSTEM_StopTicks
*
* Stop the system tick timer.
*/
static void SYSTEM_StopTicks(void)
{
#ifndef __EMX__ /* FIXME: Time don't work... Use BIOS directly instead */
struct itimerval vt_timer;
vt_timer.it_interval.tv_sec = 0;
vt_timer.it_interval.tv_usec = 0;
vt_timer.it_value = vt_timer.it_interval;
setitimer( ITIMER_REAL, &vt_timer, NULL );
#endif
}
/***********************************************************************
* InquireSystem (SYSTEM.1)
*/
DWORD InquireSystem( WORD code, WORD drive, BOOL16 enable )
*
* Note: the function always takes 2 WORD arguments, contrary to what
* "Undocumented Windows" says.
*/
DWORD InquireSystem( WORD code, WORD arg )
{
WORD drivetype;
switch(code)
{
case 0: /* Get timer resolution */
return 54925;
return SYS_TIMER_RATE;
case 1: /* Get drive type */
drivetype = GetDriveType16( drive );
drivetype = GetDriveType16( arg );
return MAKELONG( drivetype, drivetype );
case 2: /* Enable one-drive logic */
fprintf( stderr, "InquireSystem(2): set single-drive %d not supported\n", enable );
fprintf( stderr, "InquireSystem(2): set single-drive %d not supported\n", arg );
return 0;
}
fprintf( stderr, "InquireSystem: unknown code %d\n", code );
return 0;
}
/***********************************************************************
* CreateSystemTimer (SYSTEM.2)
*/
WORD CreateSystemTimer( WORD rate, FARPROC16 callback )
{
int i;
for (i = 0; i < NB_SYS_TIMERS; i++)
if (!SYS_Timers[i].callback) /* Found one */
{
SYS_Timers[i].rate = (UINT32)rate * 1000;
if (SYS_Timers[i].rate < SYS_TIMER_RATE)
SYS_Timers[i].rate = SYS_TIMER_RATE;
SYS_Timers[i].ticks = SYS_Timers[i].rate;
SYS_Timers[i].callback = callback;
if ((++SYS_NbTimers == 1) && !SYS_TimersDisabled)
SYSTEM_StartTicks();
return i + 1; /* 0 means error */
}
return 0;
}
/***********************************************************************
* KillSystemTimer (SYSTEM.3)
*
* Note: do not confuse this function with USER.182
*/
WORD SYSTEM_KillSystemTimer( WORD timer )
{
if (!timer || (timer > NB_SYS_TIMERS)) return timer; /* Error */
SYS_Timers[timer-1].callback = NULL;
if ((!--SYS_NbTimers) && !SYS_TimersDisabled) SYSTEM_StopTicks();
return 0;
}
/***********************************************************************
* EnableSystemTimers (SYSTEM.4)
*/
void EnableSystemTimers(void)
{
SYS_TimersDisabled = FALSE;
if (SYS_NbTimers) SYSTEM_StartTicks();
}
/***********************************************************************
* DisableSystemTimers (SYSTEM.5)
*/
void DisableSystemTimers(void)
{
SYS_TimersDisabled = TRUE;
if (SYS_NbTimers) SYSTEM_StopTicks();
}
/***********************************************************************
* SYSTEM_GetTimerProc
*
* Return the timer proc of a system timer. Used by thunking code.
*/
FARPROC16 SYSTEM_GetTimerProc( WORD timer )
{
if (!timer || (timer > NB_SYS_TIMERS)) return NULL;
return SYS_Timers[timer-1].callback;
}

View File

@ -410,16 +410,19 @@ void TWEAK_DrawReliefRect95(
/******************************************************************************
*
* void TWEAK_DrawMenuSeparator95(
* void TWEAK_DrawRevReliefRect95(
* HDC32 hdc, // Device context on which to draw
* UINT32 xc1, // Left x-coordinate
* UINT32 yc, // Y-coordinate of the LOWER line
* UINT32 xc2 ) // Right x-coordinate
* RECT32 const *rect ) // Rectangle to use
*
* Draws the menu separator bar Win 95 style.
* Draws the double-bordered Win95-style relief rectangle.
*
* Bugs
* Same as those for DrawReliefRect95.
* There are some checks missing from this function. Perhaps the
* SelectObject32 calls should be examined? Hasn't failed on me (yet).
*
* Should I really be calling X functions directly from here? It is
* an optimization, but should I be optimizing alpha code? Probably
* not.
*
* Revision history
* 08-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
@ -427,7 +430,76 @@ void TWEAK_DrawReliefRect95(
*
*****************************************************************************/
void TWEAK_DrawMenuSeparator95(
void TWEAK_DrawRevReliefRect95(
HDC32 hdc,
RECT32 const *rect )
{
DC *dc;
HPEN32 prevpen;
if((dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC))) {
/* Draw the top/left lines first */
prevpen = SelectObject32(hdc, TWEAK_Pen8095);
DC_SetupGCForPen(dc);
XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left, rect->top,
rect->right - 1, rect->top);
XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left, rect->top,
rect->left, rect->bottom - 1);
SelectObject32(hdc, TWEAK_Pen0095);
DC_SetupGCForPen(dc);
XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left + 1,
rect->top + 1, rect->right - 2, rect->top + 1);
XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left + 1,
rect->top + 1, rect->left + 1, rect->bottom - 2);
/* Now the bottom/right lines */
SelectObject32(hdc, TWEAK_PenFF95);
DC_SetupGCForPen(dc);
XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left,
rect->bottom - 1, rect->right - 1, rect->bottom - 1);
XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->right - 1,
rect->top, rect->right - 1, rect->bottom - 1);
SelectObject32(hdc, TWEAK_PenE095);
DC_SetupGCForPen(dc);
XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left + 1,
rect->bottom - 2, rect->right - 2, rect->bottom - 2);
XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->right - 2,
rect->top + 1, rect->right - 2, rect->bottom - 2);
SelectObject32(hdc, prevpen);
}
return;
}
/******************************************************************************
*
* void TWEAK_DrawMenuSeparatorHoriz95(
* HDC32 hdc, // Device context on which to draw
* UINT32 xc1, // Left x-coordinate
* UINT32 yc, // Y-coordinate of the LOWER line
* UINT32 xc2 ) // Right x-coordinate
*
* Draws a horizontal menu separator bar Win 95 style.
*
* Bugs
* Same as those for DrawReliefRect95.
*
* Revision history
* 08-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
* Original implementation.
* 11-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
* Changed name from DrawMenuSeparator95
*
*****************************************************************************/
void TWEAK_DrawMenuSeparatorHoriz95(
HDC32 hdc,
UINT32 xc1,
UINT32 yc,
@ -454,3 +526,52 @@ void TWEAK_DrawMenuSeparator95(
return;
}
/******************************************************************************
*
* void TWEAK_DrawMenuSeparatorVert95(
* HDC32 hdc, // Device context on which to draw
* UINT32 xc, // X-coordinate of the RIGHT line
* UINT32 yc1, // top Y-coordinate
* UINT32 yc2 ) // bottom Y-coordinate
*
* Draws a vertical menu separator bar Win 95 style.
*
* Bugs
* Same as those for DrawReliefRect95.
*
* Revision history
* 11-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
* Original implementation.
*
*****************************************************************************/
void TWEAK_DrawMenuSeparatorVert95(
HDC32 hdc,
UINT32 xc,
UINT32 yc1,
UINT32 yc2 )
{
DC *dc;
HPEN32 prevpen;
if((dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC))) {
/* Draw the top line */
prevpen = SelectObject32(hdc, TWEAK_Pen8095);
DC_SetupGCForPen(dc);
XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, xc, yc1, xc,
yc2);
/* And the bottom line */
SelectObject32(hdc, TWEAK_PenFF95);
DC_SetupGCForPen(dc);
XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, xc + 1, yc1, xc + 1,
yc2);
SelectObject32(hdc, prevpen);
}
return;
}

View File

@ -983,15 +983,15 @@ struct db {
/* in memory structure... */
char name[1]; /* padded to dword alignment */
/* ....
char data[datalen]; padded to dword alignemnt
char data[datalen]; padded to dword alignment
BYTE subdirdata[]; until nextoff
*/
};
static BYTE*
_find_data(BYTE *block,LPCSTR str) {
_find_data(BYTE *block,LPCSTR str, WORD buff_remain) {
char *nextslash;
int substrlen;
int substrlen, inc_size;
struct db *db;
while (*str && *str=='\\')
@ -1013,20 +1013,23 @@ _find_data(BYTE *block,LPCSTR str) {
dprintf_ver(stddeb,"db=%p,db->nextoff=%d,db->datalen=%d,db->name=%s,db->data=%s\n",
db,db->nextoff,db->datalen,db->name,(char*)((char*)db+4+((strlen(db->name)+4)&~3))
);
if (!db->nextoff)
if ((!db->nextoff) || (!buff_remain)) /* no more entries ? */
return NULL;
dprintf_ver(stddeb,"comparing with %s\n",db->name);
if (!strncmp(db->name,str,substrlen)) {
if (nextslash)
return _find_data(
block+4+((strlen(db->name)+4)&~3)+((db->datalen+3)&~3)
,nextslash
);
if (nextslash) {
inc_size = 4+((strlen(db->name)+4)&~3)+((db->datalen+3)&~3);
return _find_data( block+inc_size ,nextslash,
buff_remain - inc_size);
}
else
return block;
}
block=block+((db->nextoff+3)&~3);
inc_size=((db->nextoff+3)&~3);
block=block+inc_size;
buff_remain=buff_remain-inc_size;
}
}
@ -1044,7 +1047,7 @@ VerQueryValue16(SEGPTR segblock,LPCSTR subblock,SEGPTR *buffer,UINT16 *buflen)
);
s=(char*)xmalloc(strlen("VS_VERSION_INFO\\")+strlen(subblock)+1);
strcpy(s,"VS_VERSION_INFO\\");strcat(s,subblock);
b=_find_data(block,s);
b=_find_data(block, s, *(WORD *)block);
if (b==NULL) {
*buflen=0;
return 0;
@ -1071,7 +1074,7 @@ VerQueryValue32A(LPVOID vblock,LPCSTR subblock,LPVOID *vbuffer,UINT32 *buflen)
);
s=(char*)xmalloc(strlen("VS_VERSION_INFO\\")+strlen(subblock)+1);
strcpy(s,"VS_VERSION_INFO\\");strcat(s,subblock);
b=_find_data(block,s);
b=_find_data(block, s, *(WORD *)block);
if (b==NULL) {
*buflen=0;
return 0;
@ -1100,7 +1103,7 @@ VerQueryValue32W(LPVOID vblock,LPCWSTR subblock,LPVOID *vbuffer,UINT32 *buflen)
sb = HEAP_strdupWtoA( GetProcessHeap(), 0, subblock );
s=(char*)xmalloc(strlen("VS_VERSION_INFO\\")+strlen(sb)+1);
strcpy(s,"VS_VERSION_INFO\\");strcat(s,sb);
b=_find_data(block,s);
b=_find_data(block, s, *(WORD *)block);
if (b==NULL) {
*buflen=0;
HeapFree( GetProcessHeap(), 0, sb );

View File

@ -42,6 +42,7 @@
#include "heap.h"
#include "ldt.h"
#include "winsock.h"
#include "miscemu.h"
#include "stddebug.h"
#include "debug.h"
@ -51,8 +52,6 @@
inet_ntoa(((struct sockaddr_in *)a)->sin_addr), \
ntohs(((struct sockaddr_in *)a)->sin_port))
extern void SIGNAL_MaskAsyncEvents( BOOL32 );
#pragma pack(4)
/* ----------------------------------- internal data */

View File

@ -257,8 +257,15 @@ INT16 wvsnprintf16( LPSTR buffer, UINT16 maxlen, LPCSTR spec, LPCVOID args )
else cur_arg = (DWORD)PTR_SEG_TO_LIN( *(SEGPTR *)args );
args = (SEGPTR *)args + 1;
break;
case WPR_HEXA:
case WPR_SIGNED:
if (!(format.flags & WPRINTF_LONG))
{
cur_arg = (DWORD)(INT32)*(INT16 *)args;
args = (INT16 *)args + 1;
break;
}
/* fall through */
case WPR_HEXA:
case WPR_UNSIGNED:
if (format.flags & WPRINTF_LONG)
{

View File

@ -28,10 +28,11 @@ static WORD INSTR_ReplaceSelector( SIGCONTEXT *context, WORD sel)
{
if (sel == 0x40)
{
extern void SIGNAL_StartBIOSTimer(void);
static WORD sys_timer = 0;
fprintf( stderr, "Direct access to segment 0x40 (cs:ip=%04x:%04lx).\n",
CS_sig(context), EIP_sig(context) );
SIGNAL_StartBIOSTimer();
if (!sys_timer)
sys_timer = CreateSystemTimer( 55, (FARPROC16)DOSMEM_Tick );
return DOSMEM_BiosSeg;
}
return 0; /* Can't replace selector */

View File

@ -216,9 +216,11 @@ static void GetDrivePB( CONTEXT *context, int drive )
static void ioctlGetDeviceInfo( CONTEXT *context )
{
int curr_drive;
dprintf_int (stddeb, "int21: ioctl (%d, GetDeviceInfo)\n", BX_reg(context));
DX_reg(context) = 0x0942;
curr_drive = DRIVE_GetCurrentDrive();
DX_reg(context) = 0x0140 + curr_drive + ((curr_drive > 1) ? 0x0800 : 0); /* no floppy */
/* bits 0-5 are current drive
* bit 6 - file has NOT been written..FIXME: correct?
* bit 8 - generate int24 if no diskspace on write/ read past end of file
@ -332,10 +334,11 @@ void OpenExistingFile( CONTEXT *context )
SET_CFLAG(context);
}
#if 0
int handle;
int mode;
int lock;
{
int handle;
int mode;
int lock;
switch (AX_reg(context) & 0x0070)
{
case 0x00: /* compatability mode */
@ -385,7 +388,7 @@ void OpenExistingFile( CONTEXT *context )
if(result)
{
errno_to_doserr();
AX_reg(context) = ExtendedError;
AX_reg(context) = DOS_ExtendedError;
close(handle);
SET_CFLAG(context);
return;
@ -396,6 +399,7 @@ void OpenExistingFile( CONTEXT *context )
Error (0,0,0);
AX_reg(context) = handle;
RESET_CFLAG(context);
}
#endif
}

View File

@ -10,20 +10,15 @@
fix that, I guess.
*/
#ifdef linux
#include <ctype.h>
#include <unistd.h>
#include <asm/io.h>
#include <string.h>
#include "options.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "windows.h"
#include "options.h"
#include "stddebug.h"
/* #define DEBUG_INT */
#include "debug.h"
static BYTE cmosaddress;
@ -40,9 +35,18 @@ static BYTE cmosimage[64] =
0x1b, 0x7b, 0x21, 0x00, 0x00, 0x00, 0x05, 0x5f
};
#ifdef linux
char do_direct_port_access = 0;
char port_permissions[0x10000];
#if defined(linux) && defined(__i386__)
# define DIRECT_IO_ACCESS
#else
# undef DIRECT_IO_ACCESS
#endif /* linux && __i386__ */
#ifdef DIRECT_IO_ACCESS
static char do_direct_port_access = 0;
static char port_permissions[0x10000];
#define IO_READ 1
#define IO_WRITE 2
#endif
/**********************************************************************
@ -52,8 +56,8 @@ char port_permissions[0x10000];
/* set_IO_permissions(int val1, int val)
* Helper function for IO_port_init
*/
#ifdef linux
void set_IO_permissions(int val1, int val, char rw)
#ifdef DIRECT_IO_ACCESS
static void set_IO_permissions(int val1, int val, char rw)
{
int j;
if (val1 != -1) {
@ -76,7 +80,7 @@ void set_IO_permissions(int val1, int val, char rw)
* Helper function for IO_port_init
*/
void do_IO_port_init_read_or_write(char* temp, char rw)
static void do_IO_port_init_read_or_write(char* temp, char rw)
{
int val, val1, i, len;
if (!strcasecmp(temp, "all")) {
@ -126,32 +130,64 @@ void do_IO_port_init_read_or_write(char* temp, char rw)
}
}
#endif
static __inline__ BYTE inb( WORD port )
{
BYTE b;
__asm__ __volatile__( "inb %w1,%0" : "=a" (b) : "d" (port) );
return b;
}
static __inline__ WORD inw( WORD port )
{
WORD w;
__asm__ __volatile__( "inw %w1,%0" : "=a" (w) : "d" (port) );
return w;
}
static __inline__ DWORD inl( WORD port )
{
DWORD dw;
__asm__ __volatile__( "inl %w1,%0" : "=a" (dw) : "d" (port) );
return dw;
}
static __inline__ void outb( BYTE value, WORD port )
{
__asm__ __volatile__( "outb %b0,%w1" : : "a" (value), "d" (port) );
}
static __inline__ void outw( WORD value, WORD port )
{
__asm__ __volatile__( "outw %w0,%w1" : : "a" (value), "d" (port) );
}
static __inline__ void outl( DWORD value, WORD port )
{
__asm__ __volatile__( "outl %0,%w1" : : "a" (value), "d" (port) );
}
#endif /* DIRECT_IO_ACCESS */
void IO_port_init()
{
#ifdef linux
#ifdef DIRECT_IO_ACCESS
char temp[1024];
memset(port_permissions, 0, sizeof(port_permissions));
do_direct_port_access = 0;
/* Can we do that? */
if (!iopl(3)) {
iopl(0);
PROFILE_GetWineIniString( "ports", "read", "*",
temp, sizeof(temp) );
do_IO_port_init_read_or_write(temp, 1);
do_IO_port_init_read_or_write(temp, IO_READ);
PROFILE_GetWineIniString( "ports", "write", "*",
temp, sizeof(temp) );
do_IO_port_init_read_or_write(temp, 2);
do_IO_port_init_read_or_write(temp, IO_WRITE);
}
#endif
#endif /* DIRECT_IO_ACCESS */
}
/**********************************************************************
* IO_inport
*/
@ -160,43 +196,50 @@ DWORD IO_inport( int port, int count )
DWORD res = 0;
BYTE b;
#ifdef linux
if (do_direct_port_access) iopl(3);
#ifdef DIRECT_IO_ACCESS
if (do_direct_port_access)
{
/* Make sure we have access to the whole range */
int i;
for (i = 0; i < count; i++)
if (!(port_permissions[port+i] & IO_READ)) break;
if (i == count)
{
iopl(3);
switch(count)
{
case 1: res = inb( port ); break;
case 2: res = inw( port ); break;
case 4: res = inl( port ); break;
default:
fprintf( stderr, "IO_inport: invalid count %d\n", count);
}
iopl(0);
return res;
}
}
#endif
dprintf_int(stddeb, "IO: %d bytes from port 0x%02x ", count, port );
while (count-- > 0)
{
#ifdef linux
if(port_permissions[port] & 1) {
b = inb(port);
} else
#endif
{
switch (port)
{
case 0x70:
b = cmosaddress;
break;
case 0x71:
b = cmosimage[cmosaddress & 0x3f];
break;
default:
fprintf( stderr,
"Direct I/O read attempted "
"from port %x\n", port);
b = 0xff;
break;
}
}
port++;
res = (res << 8) | b;
switch (port)
{
case 0x70:
b = cmosaddress;
break;
case 0x71:
b = cmosimage[cmosaddress & 0x3f];
break;
default:
fprintf( stderr, "Direct I/O read attempted from port %x\n", port);
b = 0xff;
break;
}
port++;
res = (res << 8) | b;
}
#ifdef linux
if (do_direct_port_access) iopl(0);
#endif
dprintf_int(stddeb, "( 0x%lx )\n", res );
return res;
}
@ -212,37 +255,47 @@ void IO_outport( int port, int count, DWORD value )
dprintf_int( stddeb, "IO: 0x%lx (%d bytes) to port 0x%02x\n",
value, count, port );
#ifdef linux
if (do_direct_port_access) iopl(3);
#ifdef DIRECT_IO_ACCESS
if (do_direct_port_access)
{
/* Make sure we have access to the whole range */
int i;
for (i = 0; i < count; i++)
if (!(port_permissions[port+i] & IO_WRITE)) break;
if (i == count)
{
iopl(3);
switch(count)
{
case 1: outb( LOBYTE(value), port ); break;
case 2: outw( LOWORD(value), port ); break;
case 4: outl( value, port ); break;
default:
fprintf( stderr, "IO_outport: invalid count %d\n", count);
}
iopl(0);
return;
}
}
#endif
while (count-- > 0)
{
b = value & 0xff;
value >>= 8;
#ifdef linux
if (port_permissions[port] & 2) {
outb(b, port);
} else
#endif
{
switch (port)
{
case 0x70:
cmosaddress = b & 0x7f;
break;
case 0x71:
cmosimage[cmosaddress & 0x3f] = b;
break;
default:
fprintf( stderr, "Direct I/O write attempted "
"to port %x\n", port );
break;
}
}
switch (port)
{
case 0x70:
cmosaddress = b & 0x7f;
break;
case 0x71:
cmosimage[cmosaddress & 0x3f] = b;
break;
default:
fprintf( stderr, "Direct I/O write attempted "
"to port %x\n", port );
break;
}
port++;
}
#ifdef linux
if (do_direct_port_access) iopl(0);
#endif
}

View File

@ -1,7 +1,7 @@
/*
* MMSYTEM functions
* Joystick functions
*
* Copyright 1993 Martin Ayotte
* Copyright 1997 Andreas Mohr
*/
#include <unistd.h>
@ -18,13 +18,113 @@
#include "stddebug.h"
#include "debug.h"
static int count_use[4] = {0, 0, 0, 0};
static int dev_stat;
static int joy_nr_open = 0;
static BOOL16 JoyCaptured = FALSE;
static HWND16 CaptureWnd[2] = {0, 0};
static int joy_dev[2] = {-1, -1};
static JOYINFO JoyCapData[2];
static unsigned int joy_threshold[2] = {0, 0};
struct js_status
{
int buttons;
int x;
int y;
};
/**************************************************************************
* JoyOpenDriver [internal]
*/
BOOL16 JoyOpenDriver(WORD wID)
{
char dev_name[] = "/dev/jsx";
if (joy_dev[wID] >= 0) return TRUE;
dev_name[strlen(dev_name)-1]=(char) wID+0x30;
if ((joy_dev[wID] = open(dev_name, O_RDONLY)) >= 0) {
joy_nr_open++;
return TRUE;
}
else return FALSE;
}
/**************************************************************************
* JoyCloseDriver [internal]
*/
void JoyCloseDriver(WORD wID)
{
if (joy_dev[wID] >= 0) {
close(joy_dev[wID]);
joy_dev[wID] = -1;
joy_nr_open--;
}
}
/**************************************************************************
* JoySendMessages [internal]
*/
void JoySendMessages(void)
{
int joy;
struct js_status js;
if (joy_nr_open)
for (joy=0; joy < 4; joy++)
if (joy_dev[joy] >= 0) {
if (count_use[joy] > 250) {
JoyCloseDriver(joy);
count_use[joy] = 0;
}
count_use[joy]++;
}
else return;
if (JoyCaptured == FALSE) return;
dprintf_mmsys(stddeb, "JoySendMessages()\n");
for (joy=0; joy < 4; joy++) {
if (JoyOpenDriver(joy) == FALSE) continue;
dev_stat = read(joy_dev[joy], &js, sizeof(js));
if (dev_stat == sizeof(js)) {
js.x = js.x*37;
js.y = js.y*37;
if ((JoyCapData[joy].wXpos != js.x) || (JoyCapData[joy].wYpos != js.y)) {
SendMessage32A(CaptureWnd[joy], MM_JOY1MOVE + joy, js.buttons, MAKELONG(js.x, js.y));
JoyCapData[joy].wXpos = js.x;
JoyCapData[joy].wYpos = js.y;
}
if (JoyCapData[joy].wButtons != js.buttons) {
unsigned int ButtonChanged = (WORD)(JoyCapData[joy].wButtons ^ js.buttons)<<8;
if (JoyCapData[joy].wButtons < js.buttons)
SendMessage32A(CaptureWnd[joy], MM_JOY1BUTTONDOWN + joy, ButtonChanged, MAKELONG(js.x, js.y));
else
if (JoyCapData[joy].wButtons > js.buttons)
SendMessage32A(CaptureWnd[joy], MM_JOY1BUTTONUP
+ joy, ButtonChanged, MAKELONG(js.x, js.y));
JoyCapData[joy].wButtons = js.buttons;
}
}
}
}
/**************************************************************************
* JoyGetNumDevs [MMSYSTEM.101]
*/
WORD JoyGetNumDevs(void)
{
fprintf(stdnimp, "EMPTY STUB !!! JoyGetNumDevs();\n");
return 0;
int joy;
WORD joy_cnt = 0;
dprintf_mmsys(stddeb, "JoyGetNumDevs: ");
for (joy=0; joy<4; joy++)
if (JoyOpenDriver(joy) == TRUE) {
JoyCloseDriver(joy);
joy_cnt++;
}
dprintf_mmsys(stddeb, "returning %d\n", joy_cnt);
if (!joy_cnt) fprintf(stderr, "No joystick found - perhaps get joystick-0.8.0.tar.gz and load it as module or use Linux >= 2.1.45 to be able to use joysticks.\n");
return joy_cnt;
}
/**************************************************************************
@ -32,8 +132,27 @@ WORD JoyGetNumDevs(void)
*/
WORD JoyGetDevCaps(WORD wID, LPJOYCAPS lpCaps, WORD wSize)
{
fprintf(stdnimp, "EMPTY STUB !!! JoyGetDevCaps(%04X, %p, %d);\n",
wID, lpCaps, wSize);
dprintf_mmsys(stderr, "JoyGetDevCaps(%04X, %p, %d);\n",
wID, lpCaps, wSize);
if (wSize != sizeof(*lpCaps)) return JOYERR_PARMS; /* FIXME: should we really return this error value ? */
if (JoyOpenDriver(wID) == TRUE) {
lpCaps->wMid = MM_MICROSOFT;
lpCaps->wPid = MM_PC_JOYSTICK;
strcpy(lpCaps->szPname, "WineJoy\0"); /* joystick product name */
lpCaps->wXmin = 0; /* FIXME */
lpCaps->wXmax = 0xffff;
lpCaps->wYmin = 0;
lpCaps->wYmax = 0xffff;
lpCaps->wZmin = 0;
lpCaps->wZmax = 0xffff;
lpCaps->wNumButtons = 2;
lpCaps->wPeriodMin = 0;
lpCaps->wPeriodMax = 50; /* FIXME end */
JoyCloseDriver(wID);
return JOYERR_NOERROR;
}
else
return MMSYSERR_NODRIVER;
}
@ -42,8 +161,24 @@ WORD JoyGetDevCaps(WORD wID, LPJOYCAPS lpCaps, WORD wSize)
*/
WORD JoyGetPos(WORD wID, LPJOYINFO lpInfo)
{
fprintf(stdnimp, "EMPTY STUB !!! JoyGetPos(%04X, %p);\n", wID, lpInfo);
return MMSYSERR_NODRIVER;
struct js_status js;
dprintf_mmsys(stderr, "JoyGetPos(%04X, %p):", wID, lpInfo);
if (JoyOpenDriver(wID) == FALSE) return MMSYSERR_NODRIVER;
dev_stat = read(joy_dev[wID], &js, sizeof(js));
if (dev_stat != sizeof(js)) {
JoyCloseDriver(wID);
return JOYERR_UNPLUGGED; /* FIXME: perhaps wrong, but what should I return else ? */
}
count_use[wID] = 0;
js.x = js.x*37;
js.y = js.y*37;
lpInfo->wXpos = js.x; /* FIXME: perhaps multiply it somehow ? */
lpInfo->wYpos = js.y;
lpInfo->wZpos = 0; /* FIXME: Don't know what to do with this value as joystick driver doesn't provide a Z value */
lpInfo->wButtons = js.buttons;
dprintf_mmsys(stderr, "x: %d, y: %d, buttons: %d\n", js.x, js.y, js.buttons);
return JOYERR_NOERROR;
}
/**************************************************************************
@ -51,8 +186,10 @@ WORD JoyGetPos(WORD wID, LPJOYINFO lpInfo)
*/
WORD JoyGetThreshold(WORD wID, LPWORD lpThreshold)
{
fprintf(stdnimp, "EMPTY STUB !!! JoyGetThreshold(%04X, %p);\n", wID, lpThreshold);
return MMSYSERR_NODRIVER;
dprintf_mmsys(stderr, "JoyGetThreshold(%04X, %p);\n", wID, lpThreshold);
if (wID > 3) return JOYERR_PARMS;
*lpThreshold = joy_threshold[wID];
return JOYERR_NOERROR;
}
/**************************************************************************
@ -60,8 +197,12 @@ WORD JoyGetThreshold(WORD wID, LPWORD lpThreshold)
*/
WORD JoyReleaseCapture(WORD wID)
{
fprintf(stdnimp, "EMPTY STUB !!! JoyReleaseCapture(%04X);\n", wID);
return MMSYSERR_NODRIVER;
dprintf_mmsys(stderr, "JoyReleaseCapture(%04X);\n", wID);
JoyCaptured = FALSE;
JoyCloseDriver(wID);
joy_dev[wID] = -1;
CaptureWnd[wID] = 0;
return JOYERR_NOERROR;
}
/**************************************************************************
@ -69,9 +210,18 @@ WORD JoyReleaseCapture(WORD wID)
*/
WORD JoySetCapture(HWND16 hWnd, WORD wID, WORD wPeriod, BOOL16 bChanged)
{
fprintf(stdnimp, "EMPTY STUB !!! JoySetCapture(%04X, %04X, %d, %d);\n",
dprintf_mmsys(stderr, "JoySetCapture(%04X, %04X, %d, %d);\n",
hWnd, wID, wPeriod, bChanged);
return MMSYSERR_NODRIVER;
if (!CaptureWnd[wID]) {
if (JoyOpenDriver(wID) == FALSE) return MMSYSERR_NODRIVER;
JoyCaptured = TRUE;
CaptureWnd[wID] = hWnd;
return JOYERR_NOERROR;
}
else
return JOYERR_NOCANDO; /* FIXME: what should be returned ? */
}
/**************************************************************************
@ -79,8 +229,11 @@ WORD JoySetCapture(HWND16 hWnd, WORD wID, WORD wPeriod, BOOL16 bChanged)
*/
WORD JoySetThreshold(WORD wID, WORD wThreshold)
{
fprintf(stdnimp, "EMPTY STUB !!! JoySetThreshold(%04X, %d);\n", wID, wThreshold);
return MMSYSERR_NODRIVER;
dprintf_mmsys(stderr, "JoySetThreshold(%04X, %d);\n", wID, wThreshold);
if (wID > 3) return JOYERR_PARMS;
joy_threshold[wID] = wThreshold;
return JOYERR_NOERROR;
}
/**************************************************************************
@ -88,6 +241,6 @@ WORD JoySetThreshold(WORD wID, WORD wThreshold)
*/
WORD JoySetCalibration(WORD wID)
{
fprintf(stdnimp, "EMPTY STUB !!! JoySetCalibration(%04X);\n", wID);
return MMSYSERR_NODRIVER;
fprintf(stderr, "EMPTY STUB !!! JoySetCalibration(%04X);\n", wID);
return JOYERR_NOCANDO;
}

View File

@ -293,7 +293,8 @@ BOOL16 DriverCallback(DWORD dwCallBack, UINT16 uFlags, HANDLE16 hDev,
return FALSE;
case DCB_FUNCTION:
dprintf_mmsys(stddeb, "DriverCallback() // CALLBACK_FUNCTION !\n");
CallTo16_word_wwlll((FARPROC16)dwCallBack,hDev,wMsg,dwUser,dwParam1,dwParam2);
CallDriverCallback( (FARPROC16)dwCallBack, hDev, wMsg,
dwUser, dwParam1, dwParam2 );
break;
}
return TRUE;

View File

@ -194,7 +194,9 @@ static void COLOR_FillDefaultColors(void)
int red, no_r, inc_r;
int green, no_g, inc_g;
int blue, no_b, inc_b;
if (cSpace.size <= NB_RESERVED_COLORS)
return;
while (i*i*i < (cSpace.size - NB_RESERVED_COLORS)) i++;
no_r = no_g = no_b = --i;
if ((no_r * (no_g+1) * no_b) < (cSpace.size - NB_RESERVED_COLORS)) no_g++;
@ -623,13 +625,29 @@ BOOL32 COLOR_Init(void)
case TrueColor:
cSpace.flags |= COLOR_VIRTUAL;
case StaticColor:
case StaticColor: {
int *depths,nrofdepths;
/* FIXME: hack to detect XFree32 XF_VGA16 ... We just have
* depths 1 and 4
*/
depths=XListDepths(display,DefaultScreen(display),&nrofdepths);
if ((nrofdepths==2) && ((depths[0]==4) || depths[1]==4)) {
cSpace.monoPlane = 1;
for( white = cSpace.size - 1; !(white & 1); white >>= 1 )
cSpace.monoPlane++;
cSpace.flags = (white & mask) ? COLOR_WHITESET : 0;
cSpace.colorMap = DefaultColormapOfScreen( screen );
XFree(depths);
break;
}
XFree(depths);
cSpace.colorMap = DefaultColormapOfScreen( screen );
cSpace.flags |= COLOR_FIXED;
COLOR_Computeshifts(visual->red_mask, &COLOR_Redshift, &COLOR_Redmax);
COLOR_Computeshifts(visual->green_mask, &COLOR_Greenshift, &COLOR_Greenmax);
COLOR_Computeshifts(visual->blue_mask, &COLOR_Blueshift, &COLOR_Bluemax);
break;
break;
}
}
dprintf_palette(stddeb," visual class %i (%i)\n",

View File

@ -1,3 +1,8 @@
Mon Jul 28 18:28:14 1997 Peter Schlaile <up9n@rz.uni-karlsruhe.de>
* [grpfile.c]
Added checksum calculation [UNTESTED!].
Fri Jul 4 12:00:00 1997 Henrik Olsen <Henrik.Olsen@iaeste.dk>
* [Da.rc] (new)

View File

@ -2,10 +2,12 @@
* Program Manager
*
* Copyright 1996 Ulrich Schmid
* 1997 Peter Schlaile
*/
#include "windows.h"
#include "progman.h"
#include "mmsystem.h"
#define MALLOCHUNK 1000
@ -370,11 +372,11 @@ BOOL GRPFILE_WriteGroupFile(HLOCAL hGroup)
}
{
/* Warn about the incompatibility */
/* Warn about the (possible) incompatibility */
CHAR msg[MAX_PATHNAME_LEN + 200];
wsprintf(msg,
"Group files written by this DRAFT Program Manager "
"cannot be read by the Microsoft Program Manager!!\n"
"possibly cannot be read by the Microsoft Program Manager!!\n"
"Are you sure to write %s?", szPath);
if (IDOK != MessageBox(Globals.hMainWnd, msg, "WARNING",
MB_OKCANCEL | MB_DEFBUTTON2)) return FALSE;
@ -425,6 +427,72 @@ static VOID GRPFILE_CalculateSizes(PROGRAM *program,
*Icons += sizeXor;
}
/***********************************************************************/
UINT16 GRPFILE_checksum;
BOOL GRPFILE_checksum_half_word;
BYTE GRPFILE_checksum_last_byte;
/***********************************************************************
*
* GRPFILE_InitChecksum
*/
static void GRPFILE_InitChecksum()
{
GRPFILE_checksum = 0;
GRPFILE_checksum_half_word = 0;
}
/***********************************************************************
*
* GRPFILE_GetChecksum
*/
static UINT16 GRPFILE_GetChecksum()
{
return GRPFILE_checksum;
}
/***********************************************************************
*
* GRPFILE_WriteWithChecksum
*
* Looks crazier than it is:
*
* chksum = 0;
* chksum = cksum - 1. word;
* chksum = cksum - 2. word;
* ...
*
* if (filelen is even)
* great I'm finished
* else
* ignore last byte
*/
static UINT GRPFILE_WriteWithChecksum(HFILE file, LPCSTR str, UINT size)
{
UINT i;
if (GRPFILE_checksum_half_word) {
GRPFILE_checksum -= GRPFILE_checksum_last_byte;
}
for (i=0; i < size; i++) {
if (GRPFILE_checksum_half_word) {
GRPFILE_checksum -= str[i] << 8;
} else {
GRPFILE_checksum -= str[i];
}
GRPFILE_checksum_half_word ^= 1;
}
if (GRPFILE_checksum_half_word) {
GRPFILE_checksum_last_byte = str[size-1];
GRPFILE_checksum += GRPFILE_checksum_last_byte;
}
return _lwrite(file, str, size);
}
/***********************************************************************
*
* GRPFILE_DoWriteGroupFile
@ -439,6 +507,10 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, GROUP *group)
BOOL need_extension;
LPCSTR lpszTitle = LocalLock(group->hName);
UINT16 checksum;
GRPFILE_InitChecksum();
/* Calculate offsets */
NumProg = 0;
Icons = 0;
@ -467,14 +539,10 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, GROUP *group)
/* Header */
buffer[0] = 'P';
buffer[1] = 'M';
#if 0
buffer[2] = 'C'; /* Original magic number */
buffer[2] = 'C';
buffer[3] = 'C';
#else
buffer[2] = 'X'; /* Modified magic number: no checksum */
buffer[3] = 'X';
#endif
PUT_SHORT(buffer, 4, 0); /* Checksum ignored */
PUT_SHORT(buffer, 4, 0); /* Checksum zero for now, written later */
PUT_SHORT(buffer, 6, Extension);
/* Update group->nCmdShow */
if (IsIconic(group->hWnd)) nCmdShow = SW_SHOWMINIMIZED;
@ -494,7 +562,7 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, GROUP *group)
PUT_SHORT(buffer, 30, 0x0000); /* unknown */
PUT_SHORT(buffer, 32, NumProg);
if (HFILE_ERROR == _lwrite(file, buffer, 34)) return FALSE;
if (HFILE_ERROR == GRPFILE_WriteWithChecksum(file, buffer, 34)) return FALSE;
/* Program table */
CurrProg = Progs;
@ -505,14 +573,16 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, GROUP *group)
PROGRAM *program = LocalLock(hProgram);
PUT_SHORT(buffer, 0, CurrProg);
if (HFILE_ERROR == _lwrite(file, buffer, 2)) return FALSE;
if (HFILE_ERROR == GRPFILE_WriteWithChecksum(file, buffer, 2))
return FALSE;
GRPFILE_CalculateSizes(program, &CurrProg, &CurrIcon);
hProgram = program->hNext;
}
/* Title */
if (HFILE_ERROR == _lwrite(file, lpszTitle, lstrlen(lpszTitle) + 1))
if (HFILE_ERROR == GRPFILE_WriteWithChecksum(file, lpszTitle,
lstrlen(lpszTitle) + 1))
return FALSE;
/* Program entries */
@ -545,10 +615,10 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, GROUP *group)
ptr += lstrlen(CmdLine) + 1;
PUT_SHORT(buffer, 22, ptr);
if (HFILE_ERROR == _lwrite(file, buffer, 24) ||
HFILE_ERROR == _lwrite(file, Name, lstrlen(Name) + 1) ||
HFILE_ERROR == _lwrite(file, CmdLine, lstrlen(CmdLine) + 1) ||
HFILE_ERROR == _lwrite(file, IconFile, lstrlen(IconFile) + 1))
if (HFILE_ERROR == GRPFILE_WriteWithChecksum(file, buffer, 24) ||
HFILE_ERROR == GRPFILE_WriteWithChecksum(file, Name, lstrlen(Name) + 1) ||
HFILE_ERROR == GRPFILE_WriteWithChecksum(file, CmdLine, lstrlen(CmdLine) + 1) ||
HFILE_ERROR == GRPFILE_WriteWithChecksum(file, IconFile, lstrlen(IconFile) + 1))
return FALSE;
GRPFILE_CalculateSizes(program, &CurrProg, &CurrIcon);
@ -574,9 +644,9 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, GROUP *group)
buffer[10] = iconinfo->bPlanes;
buffer[11] = iconinfo->bBitsPerPixel;
if (HFILE_ERROR == _lwrite(file, buffer, 12) ||
HFILE_ERROR == _lwrite(file, AndBits, sizeAnd) ||
HFILE_ERROR == _lwrite(file, XorBits, sizeXor)) return FALSE;
if (HFILE_ERROR == GRPFILE_WriteWithChecksum(file, buffer, 12) ||
HFILE_ERROR == GRPFILE_WriteWithChecksum(file, AndBits, sizeAnd) ||
HFILE_ERROR == GRPFILE_WriteWithChecksum(file, XorBits, sizeXor)) return FALSE;
hProgram = program->hNext;
}
@ -589,7 +659,8 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, GROUP *group)
PUT_SHORT(buffer, 4, 0x000a);
buffer[6] = 'P', buffer[7] = 'M';
buffer[8] = 'C', buffer[9] = 'C';
if (HFILE_ERROR == _lwrite(file, buffer, 10)) return FALSE;
if (HFILE_ERROR == GRPFILE_WriteWithChecksum(file, buffer, 10))
return FALSE;
seqnum = 0;
hProgram = group->hPrograms;
@ -604,8 +675,8 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, GROUP *group)
PUT_SHORT(buffer, 0, 0x8101);
PUT_SHORT(buffer, 2, seqnum);
PUT_SHORT(buffer, 4, 7 + lstrlen(lpszWorkDir));
if (HFILE_ERROR == _lwrite(file, buffer, 6) ||
HFILE_ERROR == _lwrite(file, lpszWorkDir, lstrlen(lpszWorkDir) + 1))
if (HFILE_ERROR == GRPFILE_WriteWithChecksum(file, buffer, 6) ||
HFILE_ERROR == GRPFILE_WriteWithChecksum(file, lpszWorkDir, lstrlen(lpszWorkDir) + 1))
return FALSE;
}
@ -616,7 +687,7 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, GROUP *group)
PUT_SHORT(buffer, 2, seqnum);
PUT_SHORT(buffer, 4, 8);
PUT_SHORT(buffer, 6, program->nHotKey);
if (HFILE_ERROR == _lwrite(file, buffer, 8)) return FALSE;
if (HFILE_ERROR == GRPFILE_WriteWithChecksum(file, buffer, 8)) return FALSE;
}
/* Show command */
@ -626,7 +697,7 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, GROUP *group)
PUT_SHORT(buffer, 2, seqnum);
PUT_SHORT(buffer, 4, 8);
PUT_SHORT(buffer, 6, program->nCmdShow);
if (HFILE_ERROR == _lwrite(file, buffer, 8)) return FALSE;
if (HFILE_ERROR == GRPFILE_WriteWithChecksum(file, buffer, 8)) return FALSE;
}
seqnum++;
@ -637,9 +708,14 @@ static BOOL GRPFILE_DoWriteGroupFile(HFILE file, GROUP *group)
PUT_SHORT(buffer, 0, 0xffff);
PUT_SHORT(buffer, 2, 0xffff);
PUT_SHORT(buffer, 4, 0x0000);
if (HFILE_ERROR == _lwrite(file, buffer, 6)) return FALSE;
if (HFILE_ERROR == GRPFILE_WriteWithChecksum(file, buffer, 6)) return FALSE;
}
checksum = GRPFILE_GetChecksum();
_llseek(file, 4, SEEK_SET);
PUT_SHORT(buffer, 0, checksum);
_lwrite(file, buffer, 2);
return TRUE;
}

View File

@ -9,9 +9,11 @@
#include <stdio.h>
#include <string.h>
#include "process.h"
#include "module.h"
#include "file.h"
#include "heap.h"
#include "task.h"
#include "ldt.h"
#include "thread.h"
#include "winerror.h"
@ -788,107 +790,6 @@ BOOL32 SetStdHandle( DWORD std_handle, HANDLE32 handle )
return FALSE;
}
/***********************************************************************
* _KERNEL32_18 (KERNEL32.18,Win95)
* 'Of course you cannot directly access Windows internal structures'
*/
extern THDB *pCurrentThread;
DWORD
_KERNEL32_18(DWORD processid,DWORD action) {
PDB32 *process;
TDB *pTask;
action+=56;
fprintf(stderr,"_KERNEL32_18(%ld,%ld+0x38)\n",processid,action);
if (action>56)
return 0;
if (!processid) {
process=pCurrentProcess;
/* check if valid process */
} else
process=(PDB32*)pCurrentProcess; /* decrypt too, if needed */
switch (action) {
case 0: /* return app compat flags */
pTask = (TDB*)GlobalLock16(process->task);
if (!pTask)
return 0;
return pTask->compat_flags;
case 4: /* returns offset 0xb8 of process struct... dunno what it is */
return 0;
case 8: /* return hinstance16 */
pTask = (TDB*)GlobalLock16(process->task);
if (!pTask)
return 0;
return pTask->hInstance;
case 12:/* return expected windows version */
pTask = (TDB*)GlobalLock16(process->task);
if (!pTask)
return 0;
return pTask->version;
case 16:/* return uncrypted pointer to current thread */
return (DWORD)pCurrentThread;
case 20:/* return uncrypted pointer to process */
return (DWORD)process;
case 24:/* return stdoutput handle from startupinfo */
return (DWORD)(process->env_db->startup_info->hStdOutput);
case 28:/* return stdinput handle from startupinfo */
return (DWORD)(process->env_db->startup_info->hStdInput);
case 32:/* get showwindow flag from startupinfo */
return (DWORD)(process->env_db->startup_info->wShowWindow);
case 36:{/* return startup x and y sizes */
LPSTARTUPINFO32A si = process->env_db->startup_info;
DWORD x,y;
x=si->dwXSize;if (x==0x80000000) x=0x8000;
y=si->dwYSize;if (y==0x80000000) y=0x8000;
return (y<<16)+x;
}
case 40:{/* return startup x and y */
LPSTARTUPINFO32A si = process->env_db->startup_info;
DWORD x,y;
x=si->dwX;if (x==0x80000000) x=0x8000;
y=si->dwY;if (y==0x80000000) y=0x8000;
return (y<<16)+x;
}
case 44:/* return startup flags */
return process->env_db->startup_info->dwFlags;
case 48:/* return uncrypted pointer to parent process (if any) */
return (DWORD)process->parent;
case 52:/* return process flags */
return process->flags;
case 56:/* unexplored */
return 0;
default:
fprintf(stderr,"_KERNEL32_18:unknown offset (%ld)\n",action);
return 0;
}
/* shouldn't come here */
}
VOID /* FIXME */
_KERNEL32_52(DWORD arg1,CONTEXT *regs) {
SEGPTR *str = SEGPTR_STRDUP("ThkBuf");
fprintf(stderr,"_KERNE32_52(arg1=%08lx,%08lx)\n",arg1,EDI_reg(regs));
EAX_reg(regs) = GetProcAddress16(EDI_reg(regs),SEGPTR_GET(str));
fprintf(stderr," GetProcAddress16(\"ThkBuf\") returns %08lx\n",
EAX_reg(regs)
);
SEGPTR_FREE(str);
}
/***********************************************************************
* GetPWinLock (KERNEL32) FIXME
*/
VOID
GetPWinLock(CRITICAL_SECTION **lock) {
static CRITICAL_SECTION plock;
fprintf(stderr,"GetPWinlock(%p)\n",lock);
*lock = &plock;
}
/***********************************************************************
* GetProcessVersion (KERNEL32)
*/

View File

@ -10,6 +10,7 @@
#include "winerror.h"
#include "heap.h"
#include "selectors.h"
#include "miscemu.h"
#include "winnt.h"
THDB *pCurrentThread = NULL;

View File

@ -1,5 +1,6 @@
name NAME
type win16|win32
[file WINFILENAME]
[base ORDINAL]
[heap SIZE]
@ -25,8 +26,12 @@ General:
declarations are optional, but the default handler will print an error
message. "base" gives the offset of the first ordinal; default is 0.
"heap" is the size of the module local heap (only valid for Win16
modules); default is no local heap. Lines whose first character is a
'#' will be ignored as comments.
modules); default is no local heap. "file" gives the name of the
Windows file that is replaced by the builtin. <name>.DLL is assumed if
none is given. (This is important for kernel, which lives in the
Windows file KRNL386.EXE). Lines whose first character is a '#' will
be ignored as comments.
Variable ordinals:
==================

View File

@ -125,7 +125,8 @@ typedef struct
static ORDDEF OrdinalDefinitions[MAX_ORDINALS];
static SPEC_TYPE SpecType = SPEC_INVALID;
char DLLName[80];
static char DLLName[80];
static char DLLFileName[80];
int Limit = 0;
int Base = 0;
int DLLHeapSize = 0;
@ -573,6 +574,12 @@ static int ParseTopLevel(void)
{
strcpy(DLLName, GetToken());
strupper(DLLName);
if (!DLLFileName[0]) sprintf( DLLFileName, "%s.DLL", DLLName );
}
else if (strcmp(token, "file") == 0)
{
strcpy(DLLFileName, GetToken());
strupper(DLLFileName);
}
else if (strcmp(token, "type") == 0)
{
@ -743,8 +750,8 @@ static int BuildModule16( FILE *outfile, int max_code_offset,
pModule->fileinfo = (int)pFileInfo - (int)pModule;
memset( pFileInfo, 0, sizeof(*pFileInfo) - sizeof(pFileInfo->szPathName) );
pFileInfo->cBytes = sizeof(*pFileInfo) - sizeof(pFileInfo->szPathName)
+ strlen(DLLName) + 4;
sprintf( pFileInfo->szPathName, "%s.DLL", DLLName );
+ strlen(DLLFileName);
strcpy( pFileInfo->szPathName, DLLFileName );
pstr = (char *)pFileInfo + pFileInfo->cBytes + 1;
/* Segment table */
@ -928,8 +935,8 @@ static int BuildModule32( FILE *outfile )
pModule->fileinfo = (int)pFileInfo - (int)pModule;
memset( pFileInfo, 0, sizeof(*pFileInfo) - sizeof(pFileInfo->szPathName) );
pFileInfo->cBytes = sizeof(*pFileInfo) - sizeof(pFileInfo->szPathName)
+ strlen(DLLName) + 4;
sprintf( pFileInfo->szPathName, "%s.DLL", DLLName );
+ strlen(DLLFileName);
strcpy( pFileInfo->szPathName, DLLFileName );
pstr = (char *)pFileInfo + pFileInfo->cBytes + 1;
/* Segment table */

View File

@ -17,6 +17,7 @@ C_SRCS = \
init.c \
k32obj.c \
newfns.c \
ordinals.c \
process.c \
security.c \
string32.c \

430
win32/ordinals.c Normal file
View File

@ -0,0 +1,430 @@
/*
* Win32 ordinal only exported functions
*
* Copyright 1997 Marcus Meissner
*/
#include <stdio.h>
#include "thread.h"
#include "winerror.h"
#include "heap.h"
#include "selectors.h"
#include "miscemu.h"
#include "winnt.h"
#include "module.h"
#include "callback.h"
#include "debug.h"
#include "stddebug.h"
extern THDB *pCurrentThread;
extern PDB32 *pCurrentProcess;
/**********************************************************************
* _KERNEL32_88
*/
DWORD
WOW32_1(DWORD x,DWORD y) {
fprintf(stderr,"WOW32_1(0x%08lx,0x%08lx), stub!\n",x,y);
return 0;
}
/**********************************************************************
* WOWGetVDMPointer (KERNEL32.55)
* Get linear from segmented pointer. (MSDN lib)
*/
LPVOID
WOWGetVDMPointer(DWORD vp,DWORD nrofbytes,BOOL32 protected) {
/* FIXME: add size check too */
fprintf(stdnimp,"WOWGetVDMPointer(%08lx,%ld,%d)\n",vp,nrofbytes,protected);
if (protected)
return PTR_SEG_TO_LIN(vp);
else
return DOSMEM_MapRealToLinear(vp);
}
/**********************************************************************
* WOWGetVDMPointerFix (KERNEL32.55)
* Dito, but fix heapsegment (MSDN lib)
*/
LPVOID
WOWGetVDMPointerFix(DWORD vp,DWORD nrofbytes,BOOL32 protected) {
/* FIXME: fix heapsegment */
fprintf(stdnimp,"WOWGetVDMPointerFix(%08lx,%ld,%d)\n",vp,nrofbytes,protected);
return WOWGetVDMPointer(vp,nrofbytes,protected);
}
/**********************************************************************
* WOWGetVDMPointerUnFix (KERNEL32.56)
*/
void
WOWGetVDMPointerUnfix(DWORD vp) {
fprintf(stdnimp,"WOWGetVDMPointerUnfix(%08lx), STUB\n",vp);
/* FIXME: unfix heapsegment */
}
/***********************************************************************
* _KERNEL32_18 (KERNEL32.18)
* 'Of course you cannot directly access Windows internal structures'
*/
DWORD
_KERNEL32_18(DWORD processid,DWORD action) {
PDB32 *process;
TDB *pTask;
action+=56;
fprintf(stderr,"KERNEL32_18(%ld,%ld+0x38)\n",processid,action);
if (action>56)
return 0;
if (!processid) {
process=pCurrentProcess;
/* check if valid process */
} else
process=(PDB32*)pCurrentProcess; /* decrypt too, if needed */
switch (action) {
case 0: /* return app compat flags */
pTask = (TDB*)GlobalLock16(process->task);
if (!pTask)
return 0;
return pTask->compat_flags;
case 4: /* returns offset 0xb8 of process struct... dunno what it is */
return 0;
case 8: /* return hinstance16 */
pTask = (TDB*)GlobalLock16(process->task);
if (!pTask)
return 0;
return pTask->hInstance;
case 12:/* return expected windows version */
pTask = (TDB*)GlobalLock16(process->task);
if (!pTask)
return 0;
return pTask->version;
case 16:/* return uncrypted pointer to current thread */
return (DWORD)pCurrentThread;
case 20:/* return uncrypted pointer to process */
return (DWORD)process;
case 24:/* return stdoutput handle from startupinfo */
return (DWORD)(process->env_db->startup_info->hStdOutput);
case 28:/* return stdinput handle from startupinfo */
return (DWORD)(process->env_db->startup_info->hStdInput);
case 32:/* get showwindow flag from startupinfo */
return (DWORD)(process->env_db->startup_info->wShowWindow);
case 36:{/* return startup x and y sizes */
LPSTARTUPINFO32A si = process->env_db->startup_info;
DWORD x,y;
x=si->dwXSize;if (x==0x80000000) x=0x8000;
y=si->dwYSize;if (y==0x80000000) y=0x8000;
return (y<<16)+x;
}
case 40:{/* return startup x and y */
LPSTARTUPINFO32A si = process->env_db->startup_info;
DWORD x,y;
x=si->dwX;if (x==0x80000000) x=0x8000;
y=si->dwY;if (y==0x80000000) y=0x8000;
return (y<<16)+x;
}
case 44:/* return startup flags */
return process->env_db->startup_info->dwFlags;
case 48:/* return uncrypted pointer to parent process (if any) */
return (DWORD)process->parent;
case 52:/* return process flags */
return process->flags;
case 56:/* unexplored */
return 0;
default:
fprintf(stderr,"_KERNEL32_18:unknown offset (%ld)\n",action);
return 0;
}
/* shouldn't come here */
}
/***********************************************************************
* _KERNEL32_52 (KERNEL32.52)
* FIXME: what does it really do?
*/
VOID
_KERNEL32_52(DWORD arg1,CONTEXT *regs) {
fprintf(stderr,"_KERNE32_52(arg1=%08lx,%08lx)\n",arg1,EDI_reg(regs));
EAX_reg(regs) = (DWORD)WIN32_GetProcAddress16(EDI_reg(regs),"ThkBuf");
fprintf(stderr," GetProcAddress16(\"ThkBuf\") returns %08lx\n",
EAX_reg(regs)
);
}
/***********************************************************************
* GetPWinLock (KERNEL32) FIXME
* get mutex? critical section for 16 bit mode?
*/
VOID
GetPWinLock(CRITICAL_SECTION **lock) {
static CRITICAL_SECTION plock;
fprintf(stderr,"GetPWinlock(%p)\n",lock);
*lock = &plock;
}
/***********************************************************************
* _KERNEL32_43 (KERNEL32.42)
* A thunkbuffer link routine
* The thunkbuf looks like:
*
* 00: DWORD length ? don't know exactly
* 04: SEGPTR ptr ? where does it point to?
* The pointer ptr is written into the first DWORD of 'thunk'.
* (probably correct implemented)
*/
BOOL32
_KERNEL32_43(LPDWORD thunk,LPCSTR thkbuf,DWORD len,LPCSTR dll16,LPCSTR dll32) {
HINSTANCE16 hmod;
LPDWORD addr;
SEGPTR segaddr;
fprintf(stderr,"_KERNEL32_43(%p,%s,0x%08lx,%s,%s)\n",thunk,thkbuf,len,dll16,dll32);
hmod = LoadLibrary16(dll16);
if (hmod<32) {
fprintf(stderr,"->failed to load 16bit DLL %s, error %d\n",dll16,hmod);
return NULL;
}
segaddr = (DWORD)WIN32_GetProcAddress16(hmod,(LPSTR)thkbuf);
if (!segaddr) {
fprintf(stderr,"->no %s exported from %s!\n",thkbuf,dll16);
return NULL;
}
addr = (LPDWORD)PTR_SEG_TO_LIN(segaddr);
if (addr[0] != len) {
fprintf(stderr,"->thkbuf length mismatch? %ld vs %ld\n",len,addr[0]);
return NULL;
}
if (!addr[1])
return 0;
*(DWORD*)thunk = addr[1];
return addr[1];
}
/***********************************************************************
* _KERNEL32_45 (KERNEL32.44)
* FIXME: not sure what it does
*/
VOID
_KERNEL32_45(DWORD x,CONTEXT *context) {
fprintf(stderr,"_KERNEL32_45(0x%08lx,%%eax=0x%08lx,%%cx=0x%04lx,%%edx=0x%08lx)\n",
x,(DWORD)EAX_reg(context),(DWORD)CX_reg(context),(DWORD)EDX_reg(context)
);
}
/***********************************************************************
* (KERNEL32.40)
* A thunk setup routine.
* Expects a pointer to a preinitialized thunkbuffer in the first argument
* looking like:
* 00..03: unknown (some pointer to the 16bit struct?)
* 04: EB1E jmp +0x20
*
* 06..23: unknown (space for replacement code, check .90)
*
* 24:>E8xxxxxxxx call <32bitoffset xxxxxxxx>
* 29: 58 pop eax
* 2A: 2D2500xxxx and eax,0x2500xxxx
* 2F: BAxxxxxxxx mov edx,xxxxxxxx
* 34: 68yyyyyyyy push KERNEL32.90
* 39: C3 ret
*
* 3A: EB1E jmp +0x20
* 3E ... 59: unknown (space for replacement code?)
* 5A: E8xxxxxxxx call <32bitoffset xxxxxxxx>
* 5F: 5A pop edx
* 60: 81EA25xxxxxx sub edx, 0x25xxxxxx
* 66: 52 push edx
* 67: 68xxxxxxxx push xxxxxxxx
* 6C: 68yyyyyyyy push KERNEL32.89
* 71: C3 ret
* 72: end?
* This function checks if the code is there, and replaces the yyyyyyyy entries
* by the functionpointers.
* The thunkbuf looks like:
*
* 00: DWORD length ? don't know exactly
* 04: SEGPTR ptr ? where does it point to?
* The segpointer ptr is written into the first DWORD of 'thunk'.
* (probably correct implemented)
*/
LPVOID
_KERNEL32_41(LPBYTE thunk,LPCSTR thkbuf,DWORD len,LPCSTR dll16,LPCSTR dll32) {
HMODULE32 hkrnl32 = WIN32_GetModuleHandleA("KERNEL32");
HMODULE16 hmod;
LPDWORD addr,addr2;
DWORD segaddr;
fprintf(stderr,"KERNEL32_41(%p,%s,%ld,%s,%s)\n",
thunk,thkbuf,len,dll16,dll32
);
/* FIXME: add checks for valid code ... */
/* write pointers to kernel32.89 and kernel32.90 (+ordinal base of 1) */
*(DWORD*)(thunk+0x35) = (DWORD)GetProcAddress32(hkrnl32,(LPSTR)91);
*(DWORD*)(thunk+0x6D) = (DWORD)GetProcAddress32(hkrnl32,(LPSTR)90);
hmod = LoadLibrary16(dll16);
if (hmod<32) {
fprintf(stderr,"->failed to load 16bit DLL %s, error %d\n",dll16,hmod);
return NULL;
}
segaddr = (DWORD)WIN32_GetProcAddress16(hmod,(LPSTR)thkbuf);
if (!segaddr) {
fprintf(stderr,"->no %s exported from %s!\n",thkbuf,dll16);
return NULL;
}
addr = (LPDWORD)PTR_SEG_TO_LIN(segaddr);
if (addr[0] != len) {
fprintf(stderr,"->thkbuf length mismatch? %ld vs %ld\n",len,addr[0]);
return NULL;
}
addr2 = PTR_SEG_TO_LIN(addr[1]);
if (HIWORD(addr2))
*(DWORD*)thunk = (DWORD)addr2;
return addr2;
}
/***********************************************************************
* (KERNEL32.33)
* Returns some internal value.... probably the default environment database?
*/
DWORD
_KERNEL32_34() {
fprintf(stderr,"KERNEL32_34(), STUB returning 0\n");
return 0;
}
/***********************************************************************
* (KERNEL32.90)
* Thunk priming? function
* Rewrites the first part of the thunk to use the QT_Thunk interface.
* Replaces offset 4 ... 24 by:
*
* 33C9 xor ecx, ecx
* 8A4DFC mov cl , [ebp-04]
* 8B148Dxxxxxxxx mov edx, [4*ecx + (EAX+EDX)]
* B8yyyyyyyy mov eax, QT_Thunk
* FFE0 jmp eax
* CC int 03
* CC int 03
* CC int 03
* CC int 03
* CC int 03
* CC int 03
* CC int 03
* CC int 03
* CC int 03
* CC int 03
* CC int 03
* CC int 03
* CC int 03
* and jumps to the start of that code.
* (ok)
*/
VOID
_KERNEL32_91(CONTEXT *context) {
LPBYTE x;
fprintf(stderr,"_KERNEL32_91(eax=0x%08lx,edx=0x%08lx)\n",
EAX_reg(context),EDX_reg(context)
);
x = (LPBYTE)EAX_reg(context);
*x++ = 0x33;*x++=0xC9; /* xor ecx,ecx */
*x++ = 0x8A;*x++=0x4D;*x++=0xFC; /* mov cl,[ebp-04] */
*x++ = 0x8B;*x++=0x14;*x++=0x8D;*(DWORD*)x= EAX_reg(context)+EDX_reg(context);
x+=4; /* mov edx, [4*ecx + (EAX+EDX) */
*x++ = 0xB8; *(DWORD*)x = (DWORD)GetProcAddress32(WIN32_GetModuleHandleA("KERNEL32"),"QT_Thunk");
x+=4; /* mov eax , QT_Thunk */
*x++ = 0xFF; *x++ = 0xE0; /* jmp eax */
*x++ = 0xCC; /* int 03 */
*x++ = 0xCC; /* int 03 */
*x++ = 0xCC; /* int 03 */
*x++ = 0xCC; /* int 03 */
*x++ = 0xCC; /* int 03 */
*x++ = 0xCC; /* int 03 */
*x++ = 0xCC; /* int 03 */
*x++ = 0xCC; /* int 03 */
*x++ = 0xCC; /* int 03 */
*x++ = 0xCC; /* int 03 */
*x++ = 0xCC; /* int 03 */
*x++ = 0xCC; /* int 03 */
*x++ = 0xCC; /* int 03 */
EIP_reg(context) = EAX_reg(context);
}
/***********************************************************************
* (KERNEL32.45)
* Another thunkbuf link routine.
* The start of the thunkbuf looks like this:
* 00: DWORD length
* 04: SEGPTR address for thunkbuffer pointer
*/
VOID
_KERNEL32_46(LPBYTE thunk,LPSTR thkbuf,DWORD len,LPSTR dll16,LPSTR dll32) {
LPDWORD addr;
HMODULE16 hmod;
SEGPTR segaddr;
fprintf(stderr,"KERNEL32_46(%p,%s,%lx,%s,%s)\n",
thunk,thkbuf,len,dll16,dll32
);
hmod = LoadLibrary16(dll16);
if (hmod < 32) {
fprintf(stderr,"->couldn't load %s, error %d\n",dll16,hmod);
return;
}
segaddr = (SEGPTR)WIN32_GetProcAddress16(hmod,thkbuf);
if (!segaddr) {
fprintf(stderr,"-> haven't found %s in %s!\n",thkbuf,dll16);
return;
}
addr = (LPDWORD)PTR_SEG_TO_LIN(segaddr);
if (addr[0] != len) {
fprintf(stderr,"-> length of thkbuf differs from expected length! (%ld vs %ld)\n",addr[0],len);
return;
}
*(DWORD*)PTR_SEG_TO_LIN(addr[1]) = (DWORD)thunk;
}
/**********************************************************************
* _KERNEL32_87
* Check if thunking is initialized (ss selector set up etc.)
*/
BOOL32 _KERNEL32_87() {
fprintf(stderr,"KERNEL32_87 stub, returning TRUE\n");
return TRUE;
}
/**********************************************************************
* _KERNEL32_88
* One of the real thunking functions
* Probably implemented totally wrong.
*/
BOOL32 _KERNEL32_88(DWORD nr,DWORD flags,LPVOID fun,DWORD *hmm) {
fprintf(stderr,"KERNEL32_88(%ld,0x%08lx,%p,%p) stub, returning TRUE\n",
nr,flags,fun,hmm
);
#ifndef WINELIB
switch (nr) {
case 0: CallTo32_0(fun);
break;
case 4: CallTo32_1(fun,hmm[0]);
break;
case 8: CallTo32_2(fun,hmm[0],hmm[1]);
break;
default:
fprintf(stderr," unsupported nr of arguments, %ld\n",nr);
break;
}
#endif
return TRUE;
}

View File

@ -320,10 +320,13 @@ ATOM RegisterClass16( const WNDCLASS16 *wc )
return 0;
}
dprintf_class( stddeb, "RegisterClass16: atom=%04x wndproc=%08lx hinst=%04x bg=%04x style=%08x clsExt=%d winExt=%d class=%p\n",
dprintf_class( stddeb, "RegisterClass16: atom=%04x wndproc=%08lx hinst=%04x
bg=%04x style=%08x clsExt=%d winExt=%d class=%p name='%s'\n",
atom, (DWORD)wc->lpfnWndProc, hInstance,
wc->hbrBackground, wc->style, wc->cbClsExtra,
wc->cbWndExtra, classPtr );
wc->cbWndExtra, classPtr,
HIWORD(wc->lpszClassName) ?
(char *)PTR_SEG_TO_LIN(wc->lpszClassName) : "" );
classPtr->hIcon = wc->hIcon;
classPtr->hIconSm = 0;
@ -357,10 +360,12 @@ ATOM RegisterClass32A( const WNDCLASS32A* wc )
return 0;
}
dprintf_class( stddeb, "RegisterClass32A: atom=%04x wndproc=%08lx hinst=%04x bg=%04x style=%08x clsExt=%d winExt=%d class=%p\n",
dprintf_class( stddeb, "RegisterClass32A: atom=%04x wndproc=%08lx
hinst=%04x bg=%04x style=%08x clsExt=%d winExt=%d class=%p name='%s'\n",
atom, (DWORD)wc->lpfnWndProc, hInstance,
wc->hbrBackground, wc->style, wc->cbClsExtra,
wc->cbWndExtra, classPtr );
wc->cbWndExtra, classPtr,
HIWORD(wc->lpszClassName) ? wc->lpszClassName : "" );
classPtr->hIcon = (HICON16)wc->hIcon;
classPtr->hIconSm = 0;

View File

@ -899,6 +899,13 @@ static BOOL32 DIALOG_IsDialogMessage( HWND32 hwnd, HWND32 hwndDlg,
*translate = *dispatch = FALSE;
if (message == WM_PAINT)
{
/* Apparently, we have to handle this one as well */
*dispatch = TRUE;
return TRUE;
}
/* Only the key messages get special processing */
if ((message != WM_KEYDOWN) &&
(message != WM_SYSCHAR) &&

View File

@ -37,6 +37,8 @@ typedef enum { SYSQ_MSG_ABANDON, SYSQ_MSG_SKIP,
extern MESSAGEQUEUE *pCursorQueue; /* queue.c */
extern MESSAGEQUEUE *pActiveQueue;
extern void JoySendMessages(void);
DWORD MSG_WineStartTicks; /* Ticks at Wine startup */
static UINT32 doubleClickSpeed = 452;
@ -412,6 +414,9 @@ static BOOL32 MSG_PeekHardwareMsg( MSG16 *msg, HWND16 hwnd, DWORD filter,
MESSAGEQUEUE *sysMsgQueue = QUEUE_GetSysQueue();
int i, kbd_msg, pos = sysMsgQueue->nextMessage;
/* FIXME: there has to be a better way to do this */
JoySendMessages();
/* If the queue is empty, attempt to fill it */
if (!sysMsgQueue->msgCount && XPending(display))
EVENT_WaitXEvent( FALSE, FALSE );

View File

@ -6,6 +6,7 @@
#include <stdlib.h>
#include <signal.h>
#include "miscemu.h"
#include "module.h"
#include "queue.h"
#include "task.h"
@ -26,8 +27,6 @@ static MESSAGEQUEUE *sysMsgQueue = NULL;
static MESSAGEQUEUE *pMouseQueue = NULL; /* Queue for last mouse message */
static MESSAGEQUEUE *pKbdQueue = NULL; /* Queue for last kbd message */
extern void SIGNAL_MaskAsyncEvents(BOOL32);
MESSAGEQUEUE *pCursorQueue = NULL;
MESSAGEQUEUE *pActiveQueue = NULL;

View File

@ -1172,6 +1172,10 @@ HWND16 FindWindowEx16( HWND16 parent, HWND16 child,
{
ATOM atom = 0;
dprintf_win(stddeb, "FindWindowEx16: %04x %04x '%s' '%s'\n", parent,
child, HIWORD(className)?(char *)PTR_SEG_TO_LIN(className):"",
title ? title : "");
if (className)
{
/* If the atom doesn't exist, then no class */