Release 950706

Wed Jul  5 19:06:35 1995  Alexandre Julliard  <julliard@sunsite.unc.edu>

	* [controls/scroll.c]
	Fixed drawing bug that caused part of a non-client scroll bar
	to be painted even when the scroll-bar was hidden.

	* [debugger/break.c] [debugger/dbg.y]
	Rewrote breakpoint handling to work in 16-bit mode.
	Implemented single-stepping ('step' and 'next' instructions).

	* [debugger/debug.l]
	Format specifier is now a separate token.
	Entering an empty line at the debugger prompt causes the previous
	command to be repeated, like under gdb.
	
	* [debugger/debug.l] [debugger/registers.c]
	Differentiate 16-bit and 32-bit registers without taking current
	mode into account ($eax is always 32-bit, $ax always 16-bit).

	* [debugger/stack.c]
	Fixed stack information routines to differentiate between 16-bit
	and 32-bit stacks.

	* [loader/task.c]
	Option -debug now sets a breakpoint at the first instruction of
	every loaded task.

	* [miscemu/instr.c]
	Added handling of lock, repe and repne prefixes.

	* [objects/dib.c]
	Changed StretchDIBits() to do the correct thing, even if it's still
	not really optimal.

	* [windows/graphics.c]
	Fixes in RoundRect(), thanks to Babak Masalehdan.

	* [windows/message.c]
	Tried to fix mouse event handling with respect to disabled
	windows.

	* [windows/painting.c]
	Clear WIN_NEEDS_NCPAINT flag before sending WM_NCPAINT to avoid
	infinite loops.

	* [windows/win.c]
	Fixed IsWindowVisible() to return FALSE when one of the parent
	windows is hidden.

Sat Jul  1 22:08:21 1995   Martin von Loewis <loewis@informatik.hu-berlin.de>

	* [if1632/compobj.spec][misc/compobj.c]
	CoGetMalloc: New function
	Added relay entries for COMPOBJ ordinals above 100
	CoInitialize: Changed parameter to DWORD

	* [if1632/ole2.spec]
	Exported implementation of OleBuildVersion

	* [if1632/ole2disp.spec][misc/ole2disp.c][misc/Imakefile]
	ole2disp.c: New file
	SysAllocString, SysReallocString, SysAllocStringLen,
	SysReAllocStringLen, SysFreeString, SysStringLen: new functions

	* [if1632/ole2nls.spec][include/winnls.h][misc/ole2nls.c]
	CompareStringA: New function

Thu Jun 29 19:42:02 1995  Marcus Meissner  <msmeissn@faui01.informatik.uni-erlangen.de>
	* [objects/font.c] [if1632/gdi.spec]
	New stubs for CreateScalableFontResource, GetGlyphOutline.

Thu Jun 29 13:47:08 GMT 1995  Gran Thyni  (goran@norrsken.bildbasen.se)

	* [misc/commdlg.c]
	Extensive changes and bug fixes to FileDialog handling,
        behaves more like native Windows.

Wed Jun 28 13:04:44 1995   Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>

        * [controls/listbox.c] [controls/combo.c]
	Some minor optimizations.
	
	* [memory/local.c]
	LOCAL_FindFreeBlock(): Never use the last one.
	
	* [memory/global.c]
	GlobalReAlloc(): GMEM_MODIFY must not be ignored when size==0.
	
	* [misc/file.c]
	read() returns an error when length==0. This is not what Windows
	programs expect, so pay attention to this in _lread(). Changed this
	in _lwrite(), _hread(), _hwrite(), too.

	* [loader/resource.c]
	LoadIcon(): Ignore bih->biSizeImage, some icons have wrong values in
	there.
	
	* [if1632/shell.spec] [misc/shell.c]
	Wrong spec file entries caused havoc: HKEY has 32 bit, not 16.
	Accept some more combinations of parameters in the Reg..() functions.
	
	* [if1632/toolhelp.spec]
	Make InterruptRegister() and InterruptUnregister() return false.

	* [windows/hook.c]
	CallNextHookEx() used to crash when called with a null hhook. Fixed.

Wed Jun 28 10:14:34 1995  Martin von Loewis  <martin@informatik.hu-berlin.de>

	* [include/neexe.h][loader/ne_image.c]
	NE_LoadSegment: Detect iterated segments

	* [misc/ole2nls.c]
	LOCALE_SLONGDATE: fixed typo

	* [miscemu/int5c.c]
	Reordered include files to avoid conflicts with Linux libc.5.1

	* [rc/winerc.c]
	Added -b option to process binary resource files into C arrays

	* [include/callback.h]
	CallWndProc: Added dummy ds parameter for libwine

	* [include/gdi.h][include/user.h]
	USER_HEAP_ALLOC, GDI_HEAP_ALLOC: dropped flags parameter

	* [include/ldt.h][include/stackframe.h]
	defined segment conversion macros for libwine

	* [misc/atom.c]
	Defined USER_HeapSel for libwine

	* [misc/main.c]
	Disable -dll option for libwine

	* [misc/user.c]
	removed GetFreeSystemResources, SystemHeapInfo from libwine for now

	* [toolkit/heap.c]
	fixed LocalLock prototype

	* [toolkit/sup.c]
	sync'ed load_mz_header, load_ne_header with structures

	* [toolkit/winmain.c]
	Disabled resource DLLs for libwine for now

Mon Jun 26 19:30:24 1995  Hans de Graaff  (graaff@twi72.twi.tudelft.nl)

	* [misc/main.c]
	Fixed -enhanced option to report a 386 CPU instead of a 286.

Fri Jun 23 23:18:25 1995  Marcus Meissner  <msmeissn@faui01.informatik.uni-erlangen.de>

	* [misc/dos_fs.c]
	Remove maximum open dosdirent limit (fixing the winfile.exe
 	problem) by using telldir()/seekdir().
	
Fri Jun 23 13:42:25 1995  Hans de Graaff  (graaff@twi72.twi.tudelft.nl)

	* [misc/profile.c]
	Fixed problem parsing empty lines within sections in .ini files.
This commit is contained in:
Alexandre Julliard 1995-07-06 17:18:27 +00:00
parent bd34d4ff41
commit ded3038c1c
78 changed files with 2584 additions and 1723 deletions

View File

@ -1,15 +1,14 @@
This is release 950620 of Wine the MS Windows emulator. This is still a
This is release 950706 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.
Patches should be submitted to "wine-new@amscons.com". Please don't forget
to include a ChangeLog entry. I'll make a new release every other Sunday.
WHAT'S NEW with Wine-950620: (see ChangeLog for details)
- Many fixes to edit and listbox controls.
- Better MDI code.
- Many local heap fixes.
- Some built-in DLLs are now disabled by default.
WHAT'S NEW with Wine-950706: (see ChangeLog for details)
- Built-in debugger supports single-stepping (please test it on *BSD).
- Winelib should compile again.
- More OLE2 functions.
- Lots of bug fixes.
See the README file in the distribution for installation instructions.
@ -18,11 +17,11 @@ 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:
sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-950620.tar.gz
tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-950620.tar.gz
ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-950620.tar.gz
ftp.funet.fi:/pub/OS/Linux/ALPHA/Wine/Wine-950620.tar.gz
aris.com:/pub/linux/ALPHA/Wine/development/Wine-950620.tar.gz
sunsite.unc.edu:/pub/Linux/ALPHA/wine/Wine-950706.tar.gz
tsx-11.mit.edu:/pub/linux/ALPHA/Wine/development/Wine-950706.tar.gz
ftp.infomagic.com:/pub/mirrors/linux/wine/development/Wine-950706.tar.gz
ftp.funet.fi:/pub/OS/Linux/ALPHA/Wine/Wine-950706.tar.gz
aris.com:/pub/linux/ALPHA/Wine/development/Wine-950706.tar.gz
It should also be available from any site that mirrors tsx-11 or sunsite.

165
ChangeLog
View File

@ -1,3 +1,168 @@
----------------------------------------------------------------------
Wed Jul 5 19:06:35 1995 Alexandre Julliard <alex@numenor>
* [controls/scroll.c]
Fixed drawing bug that caused part of a non-client scroll bar
to be painted even when the scroll-bar was hidden.
* [debugger/break.c] [debugger/dbg.y]
Rewrote breakpoint handling to work in 16-bit mode.
Implemented single-stepping ('step' and 'next' instructions).
* [debugger/debug.l]
Format specifier is now a separate token.
Entering an empty line at the debugger prompt causes the previous
command to be repeated, like under gdb.
* [debugger/debug.l] [debugger/registers.c]
Differentiate 16-bit and 32-bit registers without taking current
mode into account ($eax is always 32-bit, $ax always 16-bit).
* [debugger/stack.c]
Fixed stack information routines to differentiate between 16-bit
and 32-bit stacks.
* [loader/task.c]
Option -debug now sets a breakpoint at the first instruction of
every loaded task.
* [miscemu/instr.c]
Added handling of lock, repe and repne prefixes.
* [objects/dib.c]
Changed StretchDIBits() to do the correct thing, even if it's still
not really optimal.
* [windows/graphics.c]
Fixes in RoundRect(), thanks to Babak Masalehdan.
* [windows/message.c]
Tried to fix mouse event handling with respect to disabled
windows.
* [windows/painting.c]
Clear WIN_NEEDS_NCPAINT flag before sending WM_NCPAINT to avoid
infinite loops.
* [windows/win.c]
Fixed IsWindowVisible() to return FALSE when one of the parent
windows is hidden.
Sat Jul 1 22:08:21 1995 Martin von Loewis <loewis@informatik.hu-berlin.de>
* [if1632/compobj.spec][misc/compobj.c]
CoGetMalloc: New function
Added relay entries for COMPOBJ ordinals above 100
CoInitialize: Changed parameter to DWORD
* [if1632/ole2.spec]
Exported implementation of OleBuildVersion
* [if1632/ole2disp.spec][misc/ole2disp.c][misc/Imakefile]
ole2disp.c: New file
SysAllocString, SysReallocString, SysAllocStringLen,
SysReAllocStringLen, SysFreeString, SysStringLen: new functions
* [if1632/ole2nls.spec][include/winnls.h][misc/ole2nls.c]
CompareStringA: New function
Thu Jun 29 19:42:02 1995 Marcus Meissner <msmeissn@faui01.informatik.uni-erlangen.de>
* [objects/font.c] [if1632/gdi.spec]
New stubs for CreateScalableFontResource, GetGlyphOutline.
Thu Jun 29 13:47:08 GMT 1995 Göran Thyni (goran@norrsken.bildbasen.se)
* [misc/commdlg.c]
Extensive changes and bug fixes to FileDialog handling,
behaves more like native Windows.
Wed Jun 28 13:04:44 1995 Bernd Schmidt <crux@pool.informatik.rwth-aachen.de>
* [controls/listbox.c] [controls/combo.c]
Some minor optimizations.
* [memory/local.c]
LOCAL_FindFreeBlock(): Never use the last one.
* [memory/global.c]
GlobalReAlloc(): GMEM_MODIFY must not be ignored when size==0.
* [misc/file.c]
read() returns an error when length==0. This is not what Windows
programs expect, so pay attention to this in _lread(). Changed this
in _lwrite(), _hread(), _hwrite(), too.
* [loader/resource.c]
LoadIcon(): Ignore bih->biSizeImage, some icons have wrong values in
there.
* [if1632/shell.spec] [misc/shell.c]
Wrong spec file entries caused havoc: HKEY has 32 bit, not 16.
Accept some more combinations of parameters in the Reg..() functions.
* [if1632/toolhelp.spec]
Make InterruptRegister() and InterruptUnregister() return false.
* [windows/hook.c]
CallNextHookEx() used to crash when called with a null hhook. Fixed.
Wed Jun 28 10:14:34 1995 Martin von Loewis <martin@informatik.hu-berlin.de>
* [include/neexe.h][loader/ne_image.c]
NE_LoadSegment: Detect iterated segments
* [misc/ole2nls.c]
LOCALE_SLONGDATE: fixed typo
* [miscemu/int5c.c]
Reordered include files to avoid conflicts with Linux libc.5.1
* [rc/winerc.c]
Added -b option to process binary resource files into C arrays
* [include/callback.h]
CallWndProc: Added dummy ds parameter for libwine
* [include/gdi.h][include/user.h]
USER_HEAP_ALLOC, GDI_HEAP_ALLOC: dropped flags parameter
* [include/ldt.h][include/stackframe.h]
defined segment conversion macros for libwine
* [misc/atom.c]
Defined USER_HeapSel for libwine
* [misc/main.c]
Disable -dll option for libwine
* [misc/user.c]
removed GetFreeSystemResources, SystemHeapInfo from libwine for now
* [toolkit/heap.c]
fixed LocalLock prototype
* [toolkit/sup.c]
sync'ed load_mz_header, load_ne_header with structures
* [toolkit/winmain.c]
Disabled resource DLLs for libwine for now
Mon Jun 26 19:30:24 1995 Hans de Graaff (graaff@twi72.twi.tudelft.nl)
* [misc/main.c]
Fixed -enhanced option to report a 386 CPU instead of a 286.
Fri Jun 23 23:18:25 1995 Marcus Meissner <msmeissn@faui01.informatik.uni-erlangen.de>
* [misc/dos_fs.c]
Remove maximum open dosdirent limit (fixing the winfile.exe
problem) by using telldir()/seekdir().
Fri Jun 23 13:42:25 1995 Hans de Graaff (graaff@twi72.twi.tudelft.nl)
* [misc/profile.c]
Fixed problem parsing empty lines within sections in .ini files.
----------------------------------------------------------------------
Mon Jun 19 20:29:50 1995 Alexandre Julliard (julliard@sunsite.unc.edu)

View File

@ -103,7 +103,6 @@ then
fi
prompt "Where should Windows apps store temp files" CF_Temp $CF_Temp
prompt "Which path should be used to find progs/DLL's" CF_Path "$CF_Windows;$CF_System"
prompt "Where is sysres.dll" CF_SystemResources `pwd`/sysres.dll
prompt "Where is COM1" CF_Com1 '/dev/cua0'
prompt "Where is COM2" CF_Com2 '/dev/cua1'
prompt "Where is LPT1" CF_Lpt1 '/dev/lp0'

328
Wine.man Normal file
View File

@ -0,0 +1,328 @@
.\" -*- nroff -*-
.TH WINE 1 "June 29, 1995" "Version 6/20/95" "Windows Emulation"
.SH NAME
wine \- run Windows 3.x programs under Linux
.SH SYNOPSIS
.B wine
[
.I options
]
.I program_name
[
.I arguments
]
.SH DESCRIPTION
.B wine
invokes the Linux Windows emulator.
.PP
.B wine
currently runs a number of games and small applications (approximately
half of the applets and common games actually run), although the entire API
has not been implemented.
.PP
See the files
.B README,
.B ChangeLog,
.B Configure,
and the
.B Makefile
contained in the source distribution
to compile
.B wine.
.SH REQUIREMENTS
At present,
.B wine
will run under any Linux kernel more recent than 0.99.13, or
under recent releases of NetBSD and FreeBSD.
.PP
.B X
must be installed.
.PP
.B libXpm
must be installed. (It is probably available from the same site
.B wine
was, or the sources may be FTP'd from ftp.x.org).
.SH INSTALLATION
To install
.B wine,
run "./Configure", which will ask for configuration information and
create the Makefiles, then run "make".
.SH OPTIONS
.TP
.I -depth n
Change the depth to use for multiple-depth screens
.TP
.I -desktop geom
Use a desktop window of the given geometry
.TP
.I -display name
Use the specified display
.TP
.I -iconic
Start as an icon
.TP
.I -debug
Enter the debugger before starting application
.TP
.I -name name
Set the application name
.TP
.I -privatemap
Use a private color map
.TP
.I -synchronous
Turn on synchronous display mode
.TP
.I -backingstore
Turn on backing store
.TP
.I -spy file
Turn on message spying to the specified file
.TP
.I -debugmsg name[,name]
Turn debugging messages on or off - for instance,
.I -debugmsg +dll,+heap
will turn on DLL and heap debugging messages. The full list is:
all, accel, bitblt, bitmap, caret, catch, cdaudio, class, clipboard, clipping,
combo, comm, cursor, dc, dialog, dll, dosfs, driver, edit, enum, event, exec,
file, fixup, font, gdi, global, graphics, icon, int, key, keyboard, ldt,
listbox, local, malloc, mci, mcianim, mciwave, mdi, menu, menucalc, message,
metafile, midi, mmio, mmsys, mmtime, module, msg, nonclient, ole, palette,
profile, prop, reg, region, relay, resource, scroll, selector, selectors,
stress, syscolor, task, text, timer, toolhelp, utility, win, winsock.
.TP
.I -dll name
Enables/disables built-in DLL's - starting wine with
.I -dll -commdlg
is probably a good idea.
The full list of DLLs modifiable by this is:
KERNEL, USER, GDI, WIN87EM, SHELL, SOUND, KEYBOARD, WINSOCK, STRESS, MMSYSTEM,
SYSTEM, TOOLHELP, MOUSE, COMMDLG, OLE2, OLE2CONV, OLE2DISP, OLE2NLS, OLE2PROX,
OLECLI, OLESVR, COMPOBJ, STORAGE, WINPROCS, DDEML
.TP
.I -allowreadonly
Read only files may be opened in write mode
.TP
.I -enhanced
Starts wine in Enhanced mode (not guaranteed to work yet)
.PD 1
.SH PROGRAM/ARGUMENTS
The program name may be specified in DOS format (C:\\WINDOWS\\SOL.EXE) or in
Linux format (/msdos/windows/sol.exe). The program being executed may be
passed arguments by adding them on to the end of the command line invoking
.B wine
(such as: wine "notepad C:\\TEMP\\README.TXT"). Note that
the program name and its arguments
.I must
be passed as a single parameter, which is usually accomplished by placing
them together in quotation marks. Multiple applications may be started
by placing all of them on the command line (such as: wine notepad clock).
.SH CONFIGURATION FILE
.B wine
expects a configuration file (/usr/local/etc/wine.conf),
which should conform to the following rules. The actual file name may
be specified during the execution of the
.B Configure
script. Alternatively, you may have a
.I .winerc
file of this format in your home directory.
.SH CONFIGURATION FILE FORMAT
.B [drives]
.br
.I format: <driveletter> = <rootdirectory>
.br
default: none
.br
This section is used to specify the root directory of each
.B DOS
drive, since most Windows applications require a DOS/MS-Windows based
disk drive & directory scheme.
.br
If you mounted your dos partition as
.I /dos
and installed Microsoft Windows in
C:\\WINDOWS then you should specify
.I c=/dos
in the drives section.
.PP
.B [wine]
.br
.I format: windows = <directory>
.br
default: C:\\WINDOWS
.br
Used to specify a different Windows directory
.PP
.I format: system = <directory>
.br
default: C:\\WINDOWS\\SYSTEM
.br
Used to specify a different system directory
.PP
.I format: temp = <directory>
.br
default: C:\\TEMP
.br
Used to specify a directory where Windows applications can store
temporary files.
.PP
.I format: path = <directories separated by semi-colons>
.br
default: C:\\WINDOWS;C:\\WINDOWS\\SYSTEM
.br
Used to specify the path which will be used to find executables and .DLL's.
.PP
.I format: symboltablefile = <filename>
.br
default: wine.sym
.br
Used to specify the path and file name of the symbol table used by the built-in
debugger.
.PP
.B [serialports]
.br
.I format: com[12345678] = <devicename>
.br
default: none
.br
Used to specify the devices which are used as com1 - com8.
.PP
.B [parallelports]
.br
.I format: lpt[12345678] = <devicename>
.br
default: none
.br
Used to specify the devices which are used as lpt1 - lpt8.
.PP
.B [spy]
.br
.I format: file = <filename or CON when logging to stdout>
.br
default: none
.br
Used to specify the file which will be used as
.B logfile.
.PP
.I format: exclude = <message names separated by semicolons>
.br
default: none
.br
Used to specify which messages will be excluded from the logfile.
.PP
.I format: include = <message names separated by semicolons>
.br
default: none
.br Used to specify which messages will be included in the logfile.
.SH SAMPLE wine.conf
[drives]
.br
a=/mnt/fd0
.br
c=/dos
.br
d=~/Wine
.PP
[wine]
.br
windows=c:\\windows
.br
system=c:\\windows\\system
.br
temp=c:\\temp
.br
path=c:\\windows;c:\\windows\\system;c:\\winapps\\word
.br
symboltablefile=/usr/local/lib/wine.sym
.PP
[serialports]
.br
com1=/dev/cua1
.br
com2=/dev/cua1
.PP
[parallelports]
.br
lpt1=/dev/lp0
.PP
[spy]
.br
;File=CON
.br
;File=spy.log
.br
Exclude=WM_TIMER;WM_SETCURSOR;WM_MOUSEMOVE;WM_NCHITTEST;
.br
Include=WM_COMMAND;
.SH AUTHORS
.B Wine
is available thanks to the work of Bob Amstadt, Dag Asheim,
Martin Ayotte, Ross Biro, Erik Bos, Fons Botman, John Brezak,
Andrew Bulhak, John Burton, Paul Falstad, Olaf Flebbe, Peter Galbavy,
Cameron Heide, Jeffrey Hsu, Miguel de Icaza, Alexandre Julliard,
Jon Konrath, Scott A. Laird, Martin von Loewis, Kenneth MacDonald,
Peter MacDonald, William Magro, David Metcalfe, Michael Patra,
John Richardson, Johannes Ruscheinski, Thomas Sandford,
Constantine Sapuntzakis, Bernd Schmidt, Yngvi Sigurjonsson, Rick Sladkey,
William Smith, Erik Svendsen, Goran Thyni, Jimmy Tirtawangsa, Jon Tombs,
Linus Torvalds, Michael Veksler, Carl Williams, Karl Guenter Wuensch,
Eric Youngdale, and James Youngman.
.PP
This man page is maintained by Mike Phillips (msphil@mail.wm.edu), so please
send all corrections, comments, flames, etc., to him.
.SH BUGS
There are too many to count, much less list. Some are of note, however:
Any Windows program using Visual Basic (VBRUNxxx.DLL) will not run yet,
nor will any program depending on undocumented functions or on the
COMMDLG (any standard file open/save interface) unless you disable the
internal COMMDLG with the
.I -dll -commdlg
option. In addition, 16-color support is imperfect at best, and
icons sometimes display improperly on some systems. Certain
multi-language modules will not load properly. Progress is being made
regularly, however.
.PP
Currently, no directories in the path can have upper-case letters in them
(ex. /msdos/driveC), as the conversions necessary to handle the msdos
filename conventions currently cause them to be lost.
.PP
A partial list of applications known to work with
.B wine
include: sol, cruel, golf.exe, clock, notepad, charmap, and calc.
The following URLs point to different success/testing lists:
.br
.I http://www.ifi.uio.no/~dash/wine/working-apps.html
.br
.I http://dutifp.twi.tudelft.nl:8000/wine/
.PP
We would like to hear about what software does run under
.B Wine,
and such reports may be posted to
.I comp.emulators.ms-windows.wine.
.SH AVAILABILITY
The most recent public version of
.B wine
can be ftp'ed from tsx-11.mit.edu in the /pub/linux/ALPHA/Wine/development
directory. The releases are in the format 'Wine-yymmdd.tar.gz',
or 'Wine-yymmdd.diff.gz' for the diff's from the previous release.
.SH FILES
.PD 0
.TP
.I /usr/local/bin/wine
The invoker program.
.TP
.I /usr/local/etc/wine.conf
Main configuration file for wine.
.TP
.I ChangeLog
Changes in Wine, since the beginning (most recent changes first)
.TP
.I Configure
Shell script to automate compilation. Usually followed by make (or gmake
on *BSD systems) to compile wine; it can even build a sample
.B wine.conf
file
.TP
.I Wine newsgroup
Subscribe to comp.emulators.ms-windows.wine

View File

@ -29,100 +29,6 @@
* I hope no programs rely on the implementation of combos.
*/
static LONG CBNCCreate( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBCreate( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBGetDlgCode( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBDestroy( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBPaint( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBKeyDown( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBChar( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBSetFont( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBSetRedraw( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBLButtonDown( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBSetFocus( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBKillFocus( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBResetContent( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBDir( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBAddString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBGetLBText( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBInsertString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBDeleteString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBFindString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBGetCount( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBGetCurSel( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBGetItemData( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBGetItemHeight( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBGetLBTextLen( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBSelectString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBSetItemData( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBSetCurSel( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBSetItemHeight( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBShowDropDown( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBLCreate( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBLGetDlgCode( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBLKeyDown( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBLChar( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBLPaint( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBLKillFocus( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBLActivate( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBLLButtonDown( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBLLButtonUp( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBLMouseMove( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG CBLVScroll( HWND hwnd, WORD message, WORD wParam, LONG lParam );
typedef struct {
WORD message;
LONG (*handler)(HWND, WORD, WPARAM, LPARAM);
} msg_tbl;
static msg_tbl combo_tbl[] = {
{WM_NCCREATE, CBNCCreate},
{WM_CREATE, CBCreate},
{WM_DESTROY, CBDestroy},
{WM_GETDLGCODE, CBGetDlgCode},
{WM_KEYDOWN, CBKeyDown},
{WM_CHAR, CBChar},
{WM_SETFONT, CBSetFont},
{WM_SETREDRAW, CBSetRedraw},
{WM_PAINT, CBPaint},
{WM_LBUTTONDOWN, CBLButtonDown},
{WM_SETFOCUS, CBSetFocus},
{WM_KILLFOCUS, CBKillFocus},
{CB_RESETCONTENT, CBResetContent},
{CB_DIR, CBDir},
{CB_ADDSTRING, CBAddString},
{CB_INSERTSTRING, CBInsertString},
{CB_DELETESTRING, CBDeleteString},
{CB_FINDSTRING, CBFindString},
{CB_GETCOUNT, CBGetCount},
{CB_GETCURSEL, CBGetCurSel},
{CB_GETITEMDATA, CBGetItemData},
{CB_GETITEMHEIGHT, CBGetItemHeight},
{CB_GETLBTEXT, CBGetLBText},
{CB_GETLBTEXTLEN, CBGetLBTextLen},
{CB_SELECTSTRING, CBSelectString},
{CB_SETITEMDATA, CBSetItemData},
{CB_SETCURSEL, CBSetCurSel},
{CB_SETITEMHEIGHT, CBSetItemHeight},
{CB_SHOWDROPDOWN, CBShowDropDown}
};
static msg_tbl clbox_tbl[] = {
{WM_CREATE, CBLCreate},
{WM_GETDLGCODE, CBLGetDlgCode},
{WM_KEYDOWN, CBLKeyDown},
{WM_CHAR, CBLChar},
{WM_PAINT, CBLPaint},
{WM_KILLFOCUS, CBLKillFocus},
{WM_ACTIVATE, CBLActivate},
{WM_LBUTTONDOWN, CBLLButtonDown},
{WM_LBUTTONUP, CBLLButtonUp},
{WM_MOUSEMOVE, CBLMouseMove},
{WM_VSCROLL, CBLVScroll}
};
static HBITMAP hComboBit = 0;
static WORD CBitHeight, CBitWidth;
@ -174,7 +80,7 @@ void ComboUpdateWindow(HWND hwnd, LPHEADLIST lphl, LPHEADCOMBO lphc, BOOL repain
/***********************************************************************
* CBNCCreate
*/
static LONG CBNCCreate(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBNCCreate(HWND hwnd, WORD wParam, LONG lParam)
{
CREATESTRUCT *createStruct;
@ -185,14 +91,14 @@ static LONG CBNCCreate(HWND hwnd, WORD message, WORD wParam, LONG lParam)
SetWindowLong(hwnd, GWL_STYLE, createStruct->style);
dprintf_combo(stddeb,"ComboBox WM_NCCREATE!\n");
return DefWindowProc(hwnd, message, wParam, lParam);
return DefWindowProc(hwnd, WM_NCCREATE, wParam, lParam);
}
/***********************************************************************
* CBCreate
*/
static LONG CBCreate(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBCreate(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl;
LPHEADCOMBO lphc;
@ -268,7 +174,7 @@ static LONG CBCreate(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBDestroy
*/
static LONG CBDestroy(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBDestroy(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
@ -281,7 +187,7 @@ static LONG CBDestroy(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBPaint
*/
static LONG CBPaint(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBPaint(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
@ -324,7 +230,7 @@ static LONG CBPaint(HWND hwnd, WORD message, WORD wParam, LONG lParam)
height = lpls->mis.itemHeight;
rect.bottom = rect.top + height;
if (OWNER_DRAWN(lphl)) {
if (lphl->OwnerDrawn) {
ListBoxDrawItem (hwnd, lphl, hdc, lpls, &rect, ODA_DRAWENTIRE, 0);
} else {
ListBoxDrawItem (hwnd, lphl, hdc, lpls, &rect, ODA_DRAWENTIRE, 0);
@ -340,7 +246,7 @@ static LONG CBPaint(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBGetDlgCode
*/
static LONG CBGetDlgCode(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBGetDlgCode(HWND hwnd, WORD wParam, LONG lParam)
{
return DLGC_WANTARROWS | DLGC_WANTCHARS;
}
@ -348,7 +254,7 @@ static LONG CBGetDlgCode(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBLButtonDown
*/
static LONG CBLButtonDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBLButtonDown(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
SendMessage(hwnd,CB_SHOWDROPDOWN,!lphc->DropDownVisible,0);
@ -358,7 +264,7 @@ static LONG CBLButtonDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBKeyDown
*/
static LONG CBKeyDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
WORD newFocused = lphl->ItemFocused;
@ -397,7 +303,7 @@ static LONG CBKeyDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBChar
*/
static LONG CBChar(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBChar(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
WORD newFocused;
@ -422,7 +328,7 @@ static LONG CBChar(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBKillFocus
*/
static LONG CBKillFocus(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBKillFocus(HWND hwnd, WORD wParam, LONG lParam)
{
return 0;
}
@ -430,7 +336,7 @@ static LONG CBKillFocus(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBSetFocus
*/
static LONG CBSetFocus(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBSetFocus(HWND hwnd, WORD wParam, LONG lParam)
{
return 0;
}
@ -438,7 +344,7 @@ static LONG CBSetFocus(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBResetContent
*/
static LONG CBResetContent(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBResetContent(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
@ -451,7 +357,7 @@ static LONG CBResetContent(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBDir
*/
static LONG CBDir(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBDir(HWND hwnd, WORD wParam, LONG lParam)
{
WORD wRet;
LPHEADLIST lphl = ComboGetListHeader(hwnd);
@ -465,13 +371,13 @@ static LONG CBDir(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBInsertString
*/
static LONG CBInsertString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBInsertString(HWND hwnd, WORD wParam, LONG lParam)
{
WORD wRet;
LPHEADLIST lphl = ComboGetListHeader(hwnd);
LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
if (HasStrings(lphl))
if (lphl->HasStrings)
wRet = ListBoxInsertString(lphl, wParam, (LPSTR)PTR_SEG_TO_LIN(lParam));
else
wRet = ListBoxInsertString(lphl, wParam, (LPSTR)lParam);
@ -483,13 +389,13 @@ static LONG CBInsertString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBAddString
*/
static LONG CBAddString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBAddString(HWND hwnd, WORD wParam, LONG lParam)
{
WORD wRet;
LPHEADLIST lphl = ComboGetListHeader(hwnd);
LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
if (HasStrings(lphl))
if (lphl->HasStrings)
wRet = ListBoxAddString(lphl, (LPSTR)PTR_SEG_TO_LIN(lParam));
else
wRet = ListBoxAddString(lphl, (LPSTR)lParam);
@ -501,7 +407,7 @@ static LONG CBAddString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBDeleteString
*/
static LONG CBDeleteString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBDeleteString(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
@ -514,7 +420,7 @@ static LONG CBDeleteString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBSelectString
*/
static LONG CBSelectString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBSelectString(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
WORD wRet;
@ -529,7 +435,7 @@ static LONG CBSelectString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBFindString
*/
static LONG CBFindString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBFindString(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
return ListBoxFindString(lphl, wParam, lParam);
@ -538,7 +444,7 @@ static LONG CBFindString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBGetCount
*/
static LONG CBGetCount(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBGetCount(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
return lphl->ItemsCount;
@ -547,7 +453,7 @@ static LONG CBGetCount(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBSetCurSel
*/
static LONG CBSetCurSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBSetCurSel(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
WORD wRet;
@ -563,7 +469,7 @@ static LONG CBSetCurSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBGetCurSel
*/
static LONG CBGetCurSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBGetCurSel(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
return lphl->ItemFocused;
@ -572,7 +478,7 @@ static LONG CBGetCurSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBGetItemHeight
*/
static LONG CBGetItemHeight(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBGetItemHeight(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
LPLISTSTRUCT lpls = ListBoxGetItem (lphl, wParam);
@ -584,7 +490,7 @@ static LONG CBGetItemHeight(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBSetItemHeight
*/
static LONG CBSetItemHeight(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBSetItemHeight(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
return ListBoxSetItemHeight(lphl, wParam, lParam);
@ -593,7 +499,7 @@ static LONG CBSetItemHeight(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBSetRedraw
*/
static LONG CBSetRedraw(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBSetRedraw(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
lphl->bRedrawFlag = wParam;
@ -603,7 +509,7 @@ static LONG CBSetRedraw(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBSetFont
*/
static LONG CBSetFont(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBSetFont(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
@ -618,19 +524,19 @@ static LONG CBSetFont(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBGetLBTextLen
*/
static LONG CBGetLBTextLen(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBGetLBTextLen(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
LPLISTSTRUCT lpls = ListBoxGetItem(lphl,wParam);
if (lpls == NULL || !HasStrings(lphl)) return LB_ERR;
if (lpls == NULL || !lphl->HasStrings) return LB_ERR;
return strlen(lpls->itemText);
}
/***********************************************************************
* CBGetLBText
*/
static LONG CBGetLBText(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBGetLBText(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
return ListBoxGetText(lphl, wParam, (LPSTR)PTR_SEG_TO_LIN(lParam));
@ -639,7 +545,7 @@ static LONG CBGetLBText(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBGetItemData
*/
static LONG CBGetItemData(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBGetItemData(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
return ListBoxGetItemData(lphl, wParam);
@ -648,7 +554,7 @@ static LONG CBGetItemData(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBSetItemData
*/
static LONG CBSetItemData(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBSetItemData(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ComboGetListHeader(hwnd);
return ListBoxSetItemData(lphl, wParam, lParam);
@ -657,7 +563,7 @@ static LONG CBSetItemData(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* CBShowDropDown
*/
static LONG CBShowDropDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG CBShowDropDown(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADCOMBO lphc = ComboGetStorageHeader(hwnd);
RECT rect;
@ -681,16 +587,38 @@ static LONG CBShowDropDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
*/
LONG ComboBoxWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
{
int idx = 0;
int table_size = sizeof (combo_tbl) / sizeof (msg_tbl);
while (idx < table_size) {
if (message == combo_tbl[idx].message) {
return (*(combo_tbl[idx].handler))(hwnd, message, wParam, lParam);
switch(message) {
case WM_NCCREATE: return CBNCCreate(hwnd, wParam, lParam);
case WM_CREATE: return CBCreate(hwnd, wParam, lParam);
case WM_DESTROY: return CBDestroy(hwnd, wParam, lParam);
case WM_GETDLGCODE: return CBGetDlgCode(hwnd, wParam, lParam);
case WM_KEYDOWN: return CBKeyDown(hwnd, wParam, lParam);
case WM_CHAR: return CBChar(hwnd, wParam, lParam);
case WM_SETFONT: return CBSetFont(hwnd, wParam, lParam);
case WM_SETREDRAW: return CBSetRedraw(hwnd, wParam, lParam);
case WM_PAINT: return CBPaint(hwnd, wParam, lParam);
case WM_LBUTTONDOWN: return CBLButtonDown(hwnd, wParam, lParam);
case WM_SETFOCUS: return CBSetFocus(hwnd, wParam, lParam);
case WM_KILLFOCUS: return CBKillFocus(hwnd, wParam, lParam);
case CB_RESETCONTENT: return CBResetContent(hwnd, wParam, lParam);
case CB_DIR: return CBDir(hwnd, wParam, lParam);
case CB_ADDSTRING: return CBAddString(hwnd, wParam, lParam);
case CB_INSERTSTRING: return CBInsertString(hwnd, wParam, lParam);
case CB_DELETESTRING: return CBDeleteString(hwnd, wParam, lParam);
case CB_FINDSTRING: return CBFindString(hwnd, wParam, lParam);
case CB_GETCOUNT: return CBGetCount(hwnd, wParam, lParam);
case CB_GETCURSEL: return CBGetCurSel(hwnd, wParam, lParam);
case CB_GETITEMDATA: return CBGetItemData(hwnd, wParam, lParam);
case CB_GETITEMHEIGHT: return CBGetItemHeight(hwnd, wParam, lParam);
case CB_GETLBTEXT: return CBGetLBText(hwnd, wParam, lParam);
case CB_GETLBTEXTLEN: return CBGetLBTextLen(hwnd, wParam, lParam);
case CB_SELECTSTRING: return CBSelectString(hwnd, wParam, lParam);
case CB_SETITEMDATA: return CBSetItemData(hwnd, wParam, lParam);
case CB_SETCURSEL: return CBSetCurSel(hwnd, wParam, lParam);
case CB_SETITEMHEIGHT: return CBSetItemHeight(hwnd, wParam, lParam);
case CB_SHOWDROPDOWN: return CBShowDropDown(hwnd, wParam, lParam);
}
idx++;
}
return DefWindowProc (hwnd, message, wParam, lParam);
return DefWindowProc(hwnd, message, wParam, lParam);
}
/*--------------------------------------------------------------------*/
@ -709,7 +637,7 @@ LPHEADLIST CLBoxGetListHeader(HWND hwnd)
/***********************************************************************
* CBLCreate
*/
static LONG CBLCreate( HWND hwnd, WORD message, WORD wParam, LONG lParam )
static LONG CBLCreate( HWND hwnd, WORD wParam, LONG lParam )
{
CREATESTRUCT *createStruct = (CREATESTRUCT *)PTR_SEG_TO_LIN(lParam);
SetWindowWord(hwnd,0,LOWORD(createStruct->lpCreateParams));
@ -719,7 +647,7 @@ static LONG CBLCreate( HWND hwnd, WORD message, WORD wParam, LONG lParam )
/***********************************************************************
* CBLGetDlgCode
*/
static LONG CBLGetDlgCode( HWND hwnd, WORD message, WORD wParam, LONG lParam )
static LONG CBLGetDlgCode( HWND hwnd, WORD wParam, LONG lParam )
{
return DLGC_WANTARROWS | DLGC_WANTCHARS;
}
@ -727,7 +655,7 @@ static LONG CBLGetDlgCode( HWND hwnd, WORD message, WORD wParam, LONG lParam )
/***********************************************************************
* CBLKeyDown
*/
static LONG CBLKeyDown( HWND hwnd, WORD message, WORD wParam, LONG lParam )
static LONG CBLKeyDown( HWND hwnd, WORD wParam, LONG lParam )
{
LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
WORD newFocused = lphl->ItemFocused;
@ -775,7 +703,7 @@ static LONG CBLKeyDown( HWND hwnd, WORD message, WORD wParam, LONG lParam )
/***********************************************************************
* CBLChar
*/
static LONG CBLChar( HWND hwnd, WORD message, WORD wParam, LONG lParam )
static LONG CBLChar( HWND hwnd, WORD wParam, LONG lParam )
{
return 0;
}
@ -783,7 +711,7 @@ static LONG CBLChar( HWND hwnd, WORD message, WORD wParam, LONG lParam )
/***********************************************************************
* CBLPaint
*/
static LONG CBLPaint( HWND hwnd, WORD message, WORD wParam, LONG lParam )
static LONG CBLPaint( HWND hwnd, WORD wParam, LONG lParam )
{
LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
LPLISTSTRUCT lpls;
@ -828,7 +756,7 @@ static LONG CBLPaint( HWND hwnd, WORD message, WORD wParam, LONG lParam )
lpls->itemRect.right = rect.right;
dprintf_listbox(stddeb,"drawing item: %d %d %d %d %d\n",rect.left,top,rect.right,top+height,lpls->itemState);
if (OWNER_DRAWN(lphl)) {
if (lphl->OwnerDrawn) {
ListBoxDrawItem (combohwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_DRAWENTIRE, 0);
if (lpls->itemState)
ListBoxDrawItem (combohwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_SELECT, ODS_SELECTED);
@ -854,7 +782,7 @@ static LONG CBLPaint( HWND hwnd, WORD message, WORD wParam, LONG lParam )
/***********************************************************************
* CBLKillFocus
*/
static LONG CBLKillFocus( HWND hwnd, WORD message, WORD wParam, LONG lParam )
static LONG CBLKillFocus( HWND hwnd, WORD wParam, LONG lParam )
{
/* SendMessage(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);*/
return 0;
@ -863,7 +791,7 @@ static LONG CBLKillFocus( HWND hwnd, WORD message, WORD wParam, LONG lParam )
/***********************************************************************
* CBLActivate
*/
static LONG CBLActivate( HWND hwnd, WORD message, WORD wParam, LONG lParam )
static LONG CBLActivate( HWND hwnd, WORD wParam, LONG lParam )
{
if (wParam == WA_INACTIVE)
SendMessage(CLBoxGetCombo(hwnd),CB_SHOWDROPDOWN,0,0);
@ -873,7 +801,7 @@ static LONG CBLActivate( HWND hwnd, WORD message, WORD wParam, LONG lParam )
/***********************************************************************
* CBLLButtonDown
*/
static LONG CBLLButtonDown( HWND hwnd, WORD message, WORD wParam, LONG lParam )
static LONG CBLLButtonDown( HWND hwnd, WORD wParam, LONG lParam )
{
LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
int y;
@ -898,7 +826,7 @@ static LONG CBLLButtonDown( HWND hwnd, WORD message, WORD wParam, LONG lParam )
/***********************************************************************
* CBLLButtonUp
*/
static LONG CBLLButtonUp( HWND hwnd, WORD message, WORD wParam, LONG lParam )
static LONG CBLLButtonUp( HWND hwnd, WORD wParam, LONG lParam )
{
LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
@ -916,7 +844,7 @@ static LONG CBLLButtonUp( HWND hwnd, WORD message, WORD wParam, LONG lParam )
/***********************************************************************
* CBLMouseMove
*/
static LONG CBLMouseMove( HWND hwnd, WORD message, WORD wParam, LONG lParam )
static LONG CBLMouseMove( HWND hwnd, WORD wParam, LONG lParam )
{
LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
int y;
@ -959,7 +887,7 @@ static LONG CBLMouseMove( HWND hwnd, WORD message, WORD wParam, LONG lParam )
/***********************************************************************
* CBLVScroll
*/
static LONG CBLVScroll( HWND hwnd, WORD message, WORD wParam, LONG lParam )
static LONG CBLVScroll( HWND hwnd, WORD wParam, LONG lParam )
{
LPHEADLIST lphl = CLBoxGetListHeader(hwnd);
int y;
@ -1009,16 +937,20 @@ static LONG CBLVScroll( HWND hwnd, WORD message, WORD wParam, LONG lParam )
*/
LONG ComboLBoxWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
{
int idx = 0;
int table_size = sizeof (clbox_tbl) / sizeof (msg_tbl);
while (idx < table_size) {
if (message == clbox_tbl[idx].message) {
return (*(clbox_tbl[idx].handler))(hwnd, message, wParam, lParam);
switch(message) {
case WM_CREATE: return CBLCreate(hwnd, wParam, lParam);
case WM_GETDLGCODE: return CBLGetDlgCode(hwnd, wParam, lParam);
case WM_KEYDOWN: return CBLKeyDown(hwnd, wParam, lParam);
case WM_CHAR: return CBLChar(hwnd, wParam, lParam);
case WM_PAINT: return CBLPaint(hwnd, wParam, lParam);
case WM_KILLFOCUS: return CBLKillFocus(hwnd, wParam, lParam);
case WM_ACTIVATE: return CBLActivate(hwnd, wParam, lParam);
case WM_LBUTTONDOWN: return CBLLButtonDown(hwnd, wParam, lParam);
case WM_LBUTTONUP: return CBLLButtonUp(hwnd, wParam, lParam);
case WM_MOUSEMOVE: return CBLMouseMove(hwnd, wParam, lParam);
case WM_VSCROLL: return CBLVScroll(hwnd, wParam, lParam);
}
idx++;
}
return DefWindowProc (hwnd, message, wParam, lParam);
return DefWindowProc(hwnd, message, wParam, lParam);
}
/************************************************************************

View File

@ -40,120 +40,6 @@
#define LIST_HEAP_SIZE 0x10000
/* Design notes go here */
static LONG LBCreate( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBGetDlgCode( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBDestroy( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBVScroll( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBHScroll( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBLButtonDown( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBLButtonUp( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBRButtonUp( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBMouseMove( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBKeyDown( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBChar( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBSetFont( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBSetRedraw( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBPaint( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBSetFocus( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBKillFocus( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBResetContent( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBDir( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBAddString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBGetText( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBInsertString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBDeleteString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBFindString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBGetCaretIndex( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBGetCount( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBGetCurSel( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBGetHorizontalExtent(HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBGetItemData( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBGetItemHeight( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBGetItemRect( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBGetSel( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBGetSelCount( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBGetSelItems( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBGetTextLen( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBGetTopIndex( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBSelectString( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBSelItemRange( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBSetCaretIndex( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBSetColumnWidth( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBSetHorizontalExtent(HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBSetItemData( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBSetTabStops( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBSetCurSel( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBSetSel( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBSetTopIndex( HWND hwnd, WORD message, WORD wParam, LONG lParam );
static LONG LBSetItemHeight( HWND hwnd, WORD message, WORD wParam, LONG lParam );
typedef struct {
WORD message;
LONG (*handler)(HWND, WORD, WPARAM, LPARAM);
} msg_tbl;
static msg_tbl methods[] = {
{WM_CREATE, LBCreate},
{WM_DESTROY, LBDestroy},
{WM_GETDLGCODE, LBGetDlgCode},
{WM_VSCROLL, LBVScroll},
{WM_HSCROLL, LBHScroll},
{WM_LBUTTONDOWN, LBLButtonDown},
{WM_LBUTTONUP, LBLButtonUp},
{WM_RBUTTONUP, LBRButtonUp},
{WM_LBUTTONDBLCLK, LBRButtonUp},
{WM_MOUSEMOVE, LBMouseMove},
{WM_KEYDOWN, LBKeyDown},
{WM_CHAR, LBChar},
{WM_SETFONT, LBSetFont},
{WM_SETREDRAW, LBSetRedraw},
{WM_PAINT, LBPaint},
{WM_SETFOCUS, LBSetFocus},
{WM_KILLFOCUS, LBKillFocus},
{LB_RESETCONTENT, LBResetContent},
{LB_DIR, LBDir},
{LB_ADDSTRING, LBAddString},
{LB_INSERTSTRING, LBInsertString},
{LB_DELETESTRING, LBDeleteString},
{LB_FINDSTRING, LBFindString},
{LB_GETCARETINDEX, LBGetCaretIndex},
{LB_GETCOUNT, LBGetCount},
{LB_GETCURSEL, LBGetCurSel},
{LB_GETHORIZONTALEXTENT, LBGetHorizontalExtent},
{LB_GETITEMDATA, LBGetItemData},
{LB_GETITEMHEIGHT, LBGetItemHeight},
{LB_GETITEMRECT, LBGetItemRect},
{LB_GETSEL, LBGetSel},
{LB_GETSELCOUNT, LBGetSelCount},
{LB_GETSELITEMS, LBGetSelItems},
{LB_GETTEXT, LBGetText},
{LB_GETTEXTLEN, LBGetTextLen},
{LB_GETTOPINDEX, LBGetTopIndex},
{LB_SELECTSTRING, LBSelectString},
{LB_SELITEMRANGE, LBSelItemRange},
{LB_SETCARETINDEX, LBSetCaretIndex},
{LB_SETCOLUMNWIDTH, LBSetColumnWidth},
{LB_SETHORIZONTALEXTENT, LBSetHorizontalExtent},
{LB_SETITEMDATA, LBSetItemData},
{LB_SETTABSTOPS, LBSetTabStops},
{LB_SETCURSEL, LBSetCurSel},
{LB_SETSEL, LBSetSel},
{LB_SETTOPINDEX, LBSetTopIndex},
{LB_SETITEMHEIGHT, LBSetItemHeight}
};
BOOL OWNER_DRAWN(LPHEADLIST lphl)
{
return lphl->dwStyle & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE);
}
BOOL HasStrings(LPHEADLIST lphl)
{
return (lphl->dwStyle & LBS_HASSTRINGS) || !OWNER_DRAWN(lphl);
}
static void ListBoxInitialize(LPHEADLIST lphl)
{
lphl->lpFirst = NULL;
@ -187,8 +73,10 @@ void CreateListBoxStruct(HWND hwnd, WORD CtlType, LONG styles, HWND parent)
lphl->hParent = parent;
lphl->StdItemHeight = 15; /* FIXME: should get the font height */
lphl->dwStyle = styles;
lphl->OwnerDrawn = styles & (LBS_OWNERDRAWFIXED | LBS_OWNERDRAWVARIABLE);
lphl->HasStrings = (styles & LBS_HASSTRINGS) || !lphl->OwnerDrawn;
if (OWNER_DRAWN(lphl)) {
if (lphl->OwnerDrawn) {
LISTSTRUCT dummyls;
lphl->hDrawItemStruct = USER_HEAP_ALLOC(sizeof(DRAWITEMSTRUCT));
@ -302,7 +190,7 @@ LPLISTSTRUCT ListBoxGetItem(LPHEADLIST lphl, UINT uIndex)
void ListBoxDrawItem (HWND hwnd, LPHEADLIST lphl, HDC hdc, LPLISTSTRUCT lpls,
RECT *rect, WORD itemAction, WORD itemState)
{
if (OWNER_DRAWN(lphl)) {
if (lphl->OwnerDrawn) {
DRAWITEMSTRUCT *dis = USER_HEAP_LIN_ADDR(lphl->hDrawItemStruct);
dis->CtlID = lpls->mis.CtlID;
@ -446,7 +334,8 @@ int ListBoxInsertString(LPHEADLIST lphl, UINT uIndex, LPSTR newstr)
lphl->ItemsCount++;
hStr = 0;
if (HasStrings(lphl)) {
if (lphl->HasStrings) {
dprintf_listbox(stddeb," string: %s\n", newstr);
hStr = LIST_HEAP_ALLOC(lphl, LMEM_MOVEABLE, strlen(newstr) + 1);
str = (LPSTR)LIST_HEAP_ADDR(lphl, hStr);
if (str == NULL) return LB_ERRSPACE;
@ -480,7 +369,7 @@ int ListBoxAddString(LPHEADLIST lphl, LPSTR newstr)
{
UINT pos = (UINT) -1;
if (HasStrings(lphl) && (lphl->dwStyle & LBS_SORT)) {
if (lphl->HasStrings && (lphl->dwStyle & LBS_SORT)) {
LPLISTSTRUCT lpls = lphl->lpFirst;
for (pos = 0; lpls != NULL; lpls = lpls->lpNext, pos++)
if (strcmp(lpls->itemText, newstr) >= 0)
@ -502,7 +391,7 @@ int ListBoxGetText(LPHEADLIST lphl, UINT uIndex, LPSTR OutStr)
lpls = ListBoxGetItem (lphl, uIndex);
if (lpls == NULL) return LB_ERR;
if (!HasStrings(lphl)) {
if (!lphl->HasStrings) {
*((long *)OutStr) = lpls->mis.itemData;
return 4;
}
@ -578,12 +467,12 @@ int ListBoxFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr)
if (First > lphl->ItemsCount) return LB_ERR;
if (HasStrings(lphl)) lpMatchStr = PTR_SEG_TO_LIN(MatchStr);
if (lphl->HasStrings) lpMatchStr = PTR_SEG_TO_LIN(MatchStr);
lpls = ListBoxGetItem(lphl, First);
Count = 0;
while(lpls != NULL) {
if (HasStrings(lphl)) {
if (lphl->HasStrings) {
if (strstr(lpls->itemText, lpMatchStr) == lpls->itemText) return Count;
} else if (lphl->dwStyle & LBS_SORT) {
/* XXX Do a compare item */
@ -600,7 +489,7 @@ int ListBoxFindString(LPHEADLIST lphl, UINT nFirst, SEGPTR MatchStr)
lpls = lphl->lpFirst;
while (Count < First) {
if (HasStrings(lphl)) {
if (lphl->HasStrings) {
if (strstr(lpls->itemText, lpMatchStr) == lpls->itemText) return Count;
} else if (lphl->dwStyle & LBS_SORT) {
/* XXX Do a compare item */
@ -794,7 +683,7 @@ int ListBoxFindNextMatch(LPHEADLIST lphl, WORD wChar)
UINT count,first;
if ((char)wChar < ' ') return LB_ERR;
if (!HasStrings(lphl)) return LB_ERR;
if (!lphl->HasStrings) return LB_ERR;
lpls = lphl->lpFirst;
@ -815,7 +704,7 @@ int ListBoxFindNextMatch(LPHEADLIST lphl, WORD wChar)
/***********************************************************************
* LBCreate
*/
static LONG LBCreate(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBCreate(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl;
RECT rect;
@ -836,7 +725,7 @@ static LONG LBCreate(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBDestroy
*/
static LONG LBDestroy(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBDestroy(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
@ -850,7 +739,7 @@ static LONG LBDestroy(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBVScroll
*/
static LONG LBVScroll(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBVScroll(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
int y;
@ -899,7 +788,7 @@ static LONG LBVScroll(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBHScroll
*/
static LONG LBHScroll(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBHScroll(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl;
int y;
@ -956,7 +845,7 @@ static LONG LBHScroll(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBLButtonDown
*/
static LONG LBLButtonDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBLButtonDown(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
WORD wRet;
@ -992,7 +881,7 @@ static LONG LBLButtonDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBLButtonUp
*/
static LONG LBLButtonUp(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBLButtonUp(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
@ -1007,7 +896,7 @@ static LONG LBLButtonUp(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBRButtonUp
*/
static LONG LBRButtonUp(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBRButtonUp(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
@ -1020,7 +909,7 @@ static LONG LBRButtonUp(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBMouseMove
*/
static LONG LBMouseMove(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBMouseMove(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
int y;
@ -1071,7 +960,7 @@ static LONG LBMouseMove(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBKeyDown
*/
static LONG LBKeyDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBKeyDown(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
WORD newFocused = lphl->ItemFocused;
@ -1143,7 +1032,7 @@ static LONG LBKeyDown(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBChar
*/
static LONG LBChar(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBChar(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
WORD newFocused;
@ -1169,7 +1058,7 @@ static LONG LBChar(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBSetRedraw
*/
static LONG LBSetRedraw(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBSetRedraw(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
@ -1182,7 +1071,7 @@ static LONG LBSetRedraw(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBSetFont
*/
static LONG LBSetFont(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBSetFont(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
@ -1197,7 +1086,7 @@ static LONG LBSetFont(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBPaint
*/
static LONG LBPaint(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBPaint(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LPLISTSTRUCT lpls;
@ -1260,7 +1149,7 @@ static LONG LBPaint(HWND hwnd, WORD message, WORD wParam, LONG lParam)
lpls->itemRect.right = rect.right;
dprintf_listbox(stddeb,"drawing item: %d %d %d %d %d\n",rect.left,top,rect.right,top+height,lpls->itemState);
if (OWNER_DRAWN(lphl)) {
if (lphl->OwnerDrawn) {
ListBoxDrawItem (hwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_DRAWENTIRE, 0);
if (lpls->itemState)
ListBoxDrawItem (hwnd, lphl, hdc, lpls, &lpls->itemRect, ODA_SELECT, ODS_SELECTED);
@ -1286,7 +1175,7 @@ static LONG LBPaint(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBSetFocus
*/
static LONG LBSetFocus(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBSetFocus(HWND hwnd, WORD wParam, LONG lParam)
{
dprintf_listbox(stddeb,"ListBox WM_SETFOCUS !\n");
@ -1296,7 +1185,7 @@ static LONG LBSetFocus(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBKillFocus
*/
static LONG LBKillFocus(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBKillFocus(HWND hwnd, WORD wParam, LONG lParam)
{
dprintf_listbox(stddeb,"ListBox WM_KILLFOCUS !\n");
@ -1308,7 +1197,7 @@ static LONG LBKillFocus(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBResetContent
*/
static LONG LBResetContent(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBResetContent(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
@ -1321,7 +1210,7 @@ static LONG LBResetContent(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBDir
*/
static LONG LBDir(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBDir(HWND hwnd, WORD wParam, LONG lParam)
{
WORD wRet;
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
@ -1335,12 +1224,12 @@ static LONG LBDir(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBAddString
*/
static LONG LBAddString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBAddString(HWND hwnd, WORD wParam, LONG lParam)
{
WORD wRet;
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
if (HasStrings(lphl))
if (lphl->HasStrings)
wRet = ListBoxAddString(lphl, (LPSTR)PTR_SEG_TO_LIN(lParam));
else
wRet = ListBoxAddString(lphl, (LPSTR)lParam);
@ -1352,7 +1241,7 @@ static LONG LBAddString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBGetText
*/
static LONG LBGetText(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBGetText(HWND hwnd, WORD wParam, LONG lParam)
{
LONG wRet;
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
@ -1366,12 +1255,12 @@ static LONG LBGetText(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBInsertString
*/
static LONG LBInsertString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBInsertString(HWND hwnd, WORD wParam, LONG lParam)
{
WORD wRet;
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
if (HasStrings(lphl))
if (lphl->HasStrings)
wRet = ListBoxInsertString(lphl, wParam, (LPSTR)PTR_SEG_TO_LIN(lParam));
else
wRet = ListBoxInsertString(lphl, wParam, (LPSTR)lParam);
@ -1383,7 +1272,7 @@ static LONG LBInsertString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBDeleteString
*/
static LONG LBDeleteString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBDeleteString(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LONG lRet = ListBoxDeleteString(lphl,wParam);
@ -1395,7 +1284,7 @@ static LONG LBDeleteString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBFindString
*/
static LONG LBFindString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBFindString(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
return ListBoxFindString(lphl, wParam, lParam);
@ -1404,7 +1293,7 @@ static LONG LBFindString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBGetCaretIndex
*/
static LONG LBGetCaretIndex(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBGetCaretIndex(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
return lphl->ItemFocused;
@ -1413,7 +1302,7 @@ static LONG LBGetCaretIndex(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBGetCount
*/
static LONG LBGetCount(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBGetCount(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl;
@ -1424,7 +1313,7 @@ static LONG LBGetCount(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBGetCurSel
*/
static LONG LBGetCurSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBGetCurSel(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl;
@ -1437,7 +1326,7 @@ static LONG LBGetCurSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBGetHorizontalExtent
*/
static LONG LBGetHorizontalExtent(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBGetHorizontalExtent(HWND hwnd, WORD wParam, LONG lParam)
{
return 0;
}
@ -1445,7 +1334,7 @@ static LONG LBGetHorizontalExtent(HWND hwnd, WORD message, WORD wParam, LONG lPa
/***********************************************************************
* LBGetItemHeight
*/
static LONG LBGetItemHeight(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBGetItemHeight(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LPLISTSTRUCT lpls = ListBoxGetItem (lphl, wParam);
@ -1457,7 +1346,7 @@ static LONG LBGetItemHeight(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBGetItemRect
*/
static LONG LBGetItemRect(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBGetItemRect(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
return ListBoxGetItemRect(lphl, wParam, PTR_SEG_TO_LIN(lParam));
@ -1466,7 +1355,7 @@ static LONG LBGetItemRect(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBGetSel
*/
static LONG LBGetSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBGetSel(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
return ListBoxGetSel(lphl, wParam);
@ -1475,7 +1364,7 @@ static LONG LBGetSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBGetSelCount
*/
static LONG LBGetSelCount(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBGetSelCount(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LPLISTSTRUCT lpls;
@ -1497,7 +1386,7 @@ static LONG LBGetSelCount(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBGetSelItems
*/
static LONG LBGetSelItems(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBGetSelItems(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LPLISTSTRUCT lpls;
@ -1525,19 +1414,19 @@ static LONG LBGetSelItems(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBGetTextLen
*/
static LONG LBGetTextLen(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBGetTextLen(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LPLISTSTRUCT lpls = ListBoxGetItem(lphl,wParam);
if (lpls == NULL || !HasStrings(lphl)) return LB_ERR;
if (lpls == NULL || !lphl->HasStrings) return LB_ERR;
return strlen(lpls->itemText);
}
/***********************************************************************
* LBGetDlgCode
*/
static LONG LBGetDlgCode(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBGetDlgCode(HWND hwnd, WORD wParam, LONG lParam)
{
return DLGC_WANTARROWS | DLGC_WANTCHARS;
}
@ -1545,7 +1434,7 @@ static LONG LBGetDlgCode(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBGetTopIndex
*/
static LONG LBGetTopIndex(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBGetTopIndex(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
@ -1556,7 +1445,7 @@ static LONG LBGetTopIndex(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBSelectString
*/
static LONG LBSelectString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBSelectString(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
WORD wRet;
@ -1571,7 +1460,7 @@ static LONG LBSelectString(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBSelItemRange
*/
static LONG LBSelItemRange(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBSelItemRange(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
LPLISTSTRUCT lpls;
@ -1604,7 +1493,7 @@ static LONG LBSelItemRange(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBSetCaretIndex
*/
static LONG LBSetCaretIndex(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBSetCaretIndex(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
@ -1622,7 +1511,7 @@ static LONG LBSetCaretIndex(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBSetColumnWidth
*/
static LONG LBSetColumnWidth(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBSetColumnWidth(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
lphl->ColumnsWidth = wParam;
@ -1633,7 +1522,7 @@ static LONG LBSetColumnWidth(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBSetHorizontalExtent
*/
static LONG LBSetHorizontalExtent(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBSetHorizontalExtent(HWND hwnd, WORD wParam, LONG lParam)
{
return 0;
}
@ -1641,7 +1530,7 @@ static LONG LBSetHorizontalExtent(HWND hwnd, WORD message, WORD wParam, LONG lPa
/***********************************************************************
* LBGetItemData
*/
static LONG LBGetItemData(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBGetItemData(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
dprintf_listbox(stddeb, "LB_GETITEMDATA wParam=%x\n", wParam);
@ -1651,7 +1540,7 @@ static LONG LBGetItemData(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBSetItemData
*/
static LONG LBSetItemData(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBSetItemData(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
dprintf_listbox(stddeb, "LB_SETITEMDATA wParam=%x lParam=%lx\n", wParam, lParam);
@ -1661,7 +1550,7 @@ static LONG LBSetItemData(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBSetTabStops
*/
static LONG LBSetTabStops(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBSetTabStops(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl;
@ -1685,7 +1574,7 @@ static LONG LBSetTabStops(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBSetCurSel
*/
static LONG LBSetCurSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBSetCurSel(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
WORD wRet;
@ -1704,7 +1593,7 @@ static LONG LBSetCurSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBSetSel
*/
static LONG LBSetSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBSetSel(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
WORD wRet;
@ -1720,7 +1609,7 @@ static LONG LBSetSel(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBSetTopIndex
*/
static LONG LBSetTopIndex(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBSetTopIndex(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
@ -1737,7 +1626,7 @@ static LONG LBSetTopIndex(HWND hwnd, WORD message, WORD wParam, LONG lParam)
/***********************************************************************
* LBSetItemHeight
*/
static LONG LBSetItemHeight(HWND hwnd, WORD message, WORD wParam, LONG lParam)
static LONG LBSetItemHeight(HWND hwnd, WORD wParam, LONG lParam)
{
LPHEADLIST lphl = ListBoxGetStorageHeader(hwnd);
WORD wRet;
@ -1753,16 +1642,57 @@ static LONG LBSetItemHeight(HWND hwnd, WORD message, WORD wParam, LONG lParam)
*/
LONG ListBoxWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam)
{
int idx = 0;
int table_size = sizeof (methods) / sizeof (msg_tbl);
while (idx < table_size) {
if (message == methods[idx].message) {
return (*(methods[idx].handler))(hwnd, message, wParam, lParam);
switch (message) {
case WM_CREATE: return LBCreate(hwnd, wParam, lParam);
case WM_DESTROY: return LBDestroy(hwnd, wParam, lParam);
case WM_GETDLGCODE: return LBGetDlgCode(hwnd, wParam, lParam);
case WM_VSCROLL: return LBVScroll(hwnd, wParam, lParam);
case WM_HSCROLL: return LBHScroll(hwnd, wParam, lParam);
case WM_LBUTTONDOWN: return LBLButtonDown(hwnd, wParam, lParam);
case WM_LBUTTONUP: return LBLButtonUp(hwnd, wParam, lParam);
case WM_RBUTTONUP: return LBRButtonUp(hwnd, wParam, lParam);
case WM_LBUTTONDBLCLK: return LBRButtonUp(hwnd, wParam, lParam);
case WM_MOUSEMOVE: return LBMouseMove(hwnd, wParam, lParam);
case WM_KEYDOWN: return LBKeyDown(hwnd, wParam, lParam);
case WM_CHAR: return LBChar(hwnd, wParam, lParam);
case WM_SETFONT: return LBSetFont(hwnd, wParam, lParam);
case WM_SETREDRAW: return LBSetRedraw(hwnd, wParam, lParam);
case WM_PAINT: return LBPaint(hwnd, wParam, lParam);
case WM_SETFOCUS: return LBSetFocus(hwnd, wParam, lParam);
case WM_KILLFOCUS: return LBKillFocus(hwnd, wParam, lParam);
case LB_RESETCONTENT: return LBResetContent(hwnd, wParam, lParam);
case LB_DIR: return LBDir(hwnd, wParam, lParam);
case LB_ADDSTRING: return LBAddString(hwnd, wParam, lParam);
case LB_INSERTSTRING: return LBInsertString(hwnd, wParam, lParam);
case LB_DELETESTRING: return LBDeleteString(hwnd, wParam, lParam);
case LB_FINDSTRING: return LBFindString(hwnd, wParam, lParam);
case LB_GETCARETINDEX: return LBGetCaretIndex(hwnd, wParam, lParam);
case LB_GETCOUNT: return LBGetCount(hwnd, wParam, lParam);
case LB_GETCURSEL: return LBGetCurSel(hwnd, wParam, lParam);
case LB_GETHORIZONTALEXTENT: return LBGetHorizontalExtent(hwnd, wParam, lParam);
case LB_GETITEMDATA: return LBGetItemData(hwnd, wParam, lParam);
case LB_GETITEMHEIGHT: return LBGetItemHeight(hwnd, wParam, lParam);
case LB_GETITEMRECT: return LBGetItemRect(hwnd, wParam, lParam);
case LB_GETSEL: return LBGetSel(hwnd, wParam, lParam);
case LB_GETSELCOUNT: return LBGetSelCount(hwnd, wParam, lParam);
case LB_GETSELITEMS: return LBGetSelItems(hwnd, wParam, lParam);
case LB_GETTEXT: return LBGetText(hwnd, wParam, lParam);
case LB_GETTEXTLEN: return LBGetTextLen(hwnd, wParam, lParam);
case LB_GETTOPINDEX: return LBGetTopIndex(hwnd, wParam, lParam);
case LB_SELECTSTRING: return LBSelectString(hwnd, wParam, lParam);
case LB_SELITEMRANGE: return LBSelItemRange(hwnd, wParam, lParam);
case LB_SETCARETINDEX: return LBSetCaretIndex(hwnd, wParam, lParam);
case LB_SETCOLUMNWIDTH: return LBSetColumnWidth(hwnd, wParam, lParam);
case LB_SETHORIZONTALEXTENT: return LBSetHorizontalExtent(hwnd, wParam, lParam);
case LB_SETITEMDATA: return LBSetItemData(hwnd, wParam, lParam);
case LB_SETTABSTOPS: return LBSetTabStops(hwnd, wParam, lParam);
case LB_SETCURSEL: return LBSetCurSel(hwnd, wParam, lParam);
case LB_SETSEL: return LBSetSel(hwnd, wParam, lParam);
case LB_SETTOPINDEX: return LBSetTopIndex(hwnd, wParam, lParam);
case LB_SETITEMHEIGHT: return LBSetItemHeight(hwnd, wParam, lParam);
}
idx++;
}
return DefWindowProc (hwnd, message, wParam, lParam);
return DefWindowProc(hwnd, message, wParam, lParam);
}
/************************************************************************

View File

@ -340,9 +340,6 @@ static void SCROLL_DrawInterior( HWND hwnd, HDC hdc, int nBar, RECT *rect,
BOOL bottom_selected )
{
RECT r;
WND *wndPtr = WIN_FindWndPtr( hwnd );
if (((nBar == SB_VERT) && !(wndPtr->dwStyle & WS_VSCROLL))
|| ((nBar == SB_HORZ) && (!wndPtr->dwStyle & WS_HSCROLL))) return;
/* Select the correct brush and pen */
@ -440,9 +437,13 @@ void SCROLL_DrawScrollBar( HWND hwnd, HDC hdc, int nBar )
WORD arrowSize, thumbPos;
RECT rect;
BOOL vertical;
WND *wndPtr = WIN_FindWndPtr( hwnd );
SCROLLINFO *infoPtr = SCROLL_GetScrollInfo( hwnd, nBar );
if (!infoPtr) return;
if (!wndPtr || !infoPtr ||
((nBar == SB_VERT) && !(wndPtr->dwStyle & WS_VSCROLL)) ||
((nBar == SB_HORZ) && !(wndPtr->dwStyle & WS_HSCROLL))) return;
vertical = SCROLL_GetScrollBarRect( hwnd, nBar, &rect,
&arrowSize, &thumbPos );
/* Draw the arrows */
@ -467,9 +468,13 @@ static void SCROLL_RefreshScrollBar( HWND hwnd, int nBar )
RECT rect;
BOOL vertical;
HDC hdc;
WND *wndPtr = WIN_FindWndPtr( hwnd );
SCROLLINFO *infoPtr = SCROLL_GetScrollInfo( hwnd, nBar );
if (!infoPtr) return;
if (!wndPtr || !infoPtr ||
((nBar == SB_VERT) && !(wndPtr->dwStyle & WS_VSCROLL)) ||
((nBar == SB_HORZ) && !(wndPtr->dwStyle & WS_HSCROLL))) return;
vertical = SCROLL_GetScrollBarRect( hwnd, nBar, &rect,
&arrowSize, &thumbPos );
hdc = (nBar == SB_CTL) ? GetDC(hwnd) : GetWindowDC(hwnd);

View File

@ -16,7 +16,9 @@ SRCS = \
dbg.tab.c \
hash.c \
info.c \
lex.yy.c
lex.yy.c \
registers.c \
stack.c
SUBDIRS_OBJS = readline/readline.o

View File

@ -1,3 +1,9 @@
/*
* Debugger break-points handling
*
* Copyright 1994 Martin von Loewis
* Copyright 1995 Alexandre Julliard
*/
#include <stdio.h>
#include <stdlib.h>
@ -5,100 +11,42 @@
#ifdef linux
#include <sys/utsname.h>
#endif
#include <windows.h>
#include "db_disasm.h"
#include "windows.h"
#include "debugger.h"
#define N_BP 25
#define INT3 0xcc /* int 3 opcode */
#define STEP_FLAG 0x100 /* single-step flag */
extern int dbg_mode;
#define MAX_BREAKPOINTS 25
struct wine_bp{
unsigned long addr;
unsigned long next_addr;
char in_use;
char enabled;
unsigned char databyte;
};
static struct wine_bp wbp[N_BP] = {{0,},};
static int current_bp = -1;
static int cont_mode=0; /* 0 - continuous execution
1 - advancing after breakpoint
2 - single step - not implemented
*/
void info_break(void)
typedef struct
{
int j;
fprintf(stderr,"Breakpoint status\n");
for(j=0; j<N_BP; j++)
if(wbp[j].in_use)
fprintf(stderr,"%d: %c %8lx\n", j, (wbp[j].enabled ? 'y' : 'n'),
wbp[j].addr);
}
unsigned int segment;
unsigned int addr;
BYTE addrlen;
BYTE opcode;
BOOL enabled;
BOOL in_use;
} BREAKPOINT;
void disable_break(int bpnum)
static BREAKPOINT breakpoints[MAX_BREAKPOINTS] = { { 0, }, };
static int next_bp = 1; /* breakpoint 0 is reserved for step-over */
/***********************************************************************
* DEBUG_ChangeOpcode
*
* Change the opcode at segment:addr.
*/
static void DEBUG_SetOpcode( unsigned int segment, unsigned int addr, BYTE op )
{
if(bpnum >= N_BP || bpnum < 0)
fprintf(stderr,"Breakpoint number out of range\n");
wbp[bpnum].enabled = 0;
}
void enable_break(int bpnum)
{
if(bpnum >= N_BP || bpnum < 0)
fprintf(stderr,"Breakpoint number out of range\n");
wbp[bpnum].enabled = 1;
}
void add_break(unsigned long addr)
{
int j;
for(j=0; j<N_BP; j++)
if(!wbp[j].in_use)
{
wbp[j].in_use = 1;
wbp[j].enabled = 1;
wbp[j].addr = addr;
wbp[j].next_addr = 0;
return;
}
fprintf(stderr,"No more breakpoints\n");
}
static void bark()
{
static int barked=0;
if(barked)return;
barked=1;
perror("Sorry, can't set break point");
#ifdef linux
{struct utsname buf;
uname(&buf);
if(strcmp(buf.sysname,"Linux")==0)
{ if(strcmp(buf.release,"1.1.62")<0)
fprintf(stderr,"Your current Linux release is %s. "
"You should upgrade to 1.1.62 or higher\n"
"Alternatively, in /usr/src/linux/fs/exec.c,"
" change MAP_SHARED to MAP_PRIVATE.\n", buf.release);
} else
fprintf(stderr,"Why did you compile for Linux, while your system is"
" actually %s?\n",buf.sysname);
}
#endif
}
void insert_break(int flag)
{
unsigned char * pnt;
int j;
for(j=0; j<N_BP; j++)
if(wbp[j].enabled)
{
if (segment)
{
*(BYTE *)PTR_SEG_OFF_TO_LIN( segment, addr ) = op;
}
else /* 32-bit code, so we have to change the protection first */
{
/* There are a couple of problems with this. On Linux prior to
1.1.62, this call fails (ENOACCESS) due to a bug in fs/exec.c.
This code is currently not tested at all on BSD.
@ -108,54 +56,221 @@ void insert_break(int flag)
Not that portability matters, this code is i386 only anyways...
How do I get the old protection in order to restore it later on?
*/
if(mprotect((caddr_t)(wbp[j].addr & (~4095)), 4096,
PROT_READ|PROT_WRITE|PROT_EXEC) == -1){
bark();
if (mprotect((caddr_t)(addr & (~4095)), 4096,
PROT_READ|PROT_WRITE|PROT_EXEC) == -1)
{
perror( "Can't set break point" );
return;
}
pnt = (unsigned char *) wbp[j].addr;
if(flag) {
wbp[j].databyte = *pnt;
*pnt = 0xcc; /* Change to an int 3 instruction */
} else {
*pnt = wbp[j].databyte;
}
mprotect((caddr_t)(wbp[j].addr & ~4095), 4096, PROT_READ|PROT_EXEC);
}
}
/* Get the breakpoint number that we broke upon */
int get_bpnum(unsigned int addr)
{
int j;
for(j=0; j<N_BP; j++)
if(wbp[j].enabled)
if(wbp[j].addr == addr) return j;
return -1;
}
void toggle_next(int num)
{
unsigned int addr;
addr=wbp[num].addr;
if(wbp[num].next_addr == 0)
wbp[num].next_addr = db_disasm( 0, addr, (dbg_mode == 16) );
wbp[num].addr=wbp[num].next_addr;
wbp[num].next_addr=addr;
}
int should_continue(int bpnum)
{
if(bpnum<0)return 0;
toggle_next(bpnum);
if(bpnum==current_bp){
current_bp=-1;
cont_mode=0;
return 1;
*(BYTE *)addr = op;
mprotect((caddr_t)(addr & ~4095), 4096, PROT_READ|PROT_EXEC);
}
}
/***********************************************************************
* DEBUG_SetBreakpoints
*
* Set or remove all the breakpoints.
*/
void DEBUG_SetBreakpoints( BOOL set )
{
int i;
for (i = 0; i < MAX_BREAKPOINTS; i++)
{
if (breakpoints[i].in_use && breakpoints[i].enabled)
DEBUG_SetOpcode( breakpoints[i].segment, breakpoints[i].addr,
set ? INT3 : breakpoints[i].opcode );
}
}
/***********************************************************************
* DEBUG_FindBreakpoint
*
* Find the breakpoint for a given address. Return the breakpoint
* number or -1 if none.
*/
int DEBUG_FindBreakpoint( unsigned int segment, unsigned int addr )
{
int i;
for (i = 0; i < MAX_BREAKPOINTS; i++)
{
if (breakpoints[i].in_use && breakpoints[i].enabled &&
breakpoints[i].segment == segment && breakpoints[i].addr == addr)
return i;
}
return -1;
}
/***********************************************************************
* DEBUG_AddBreakpoint
*
* Add a breakpoint.
*/
void DEBUG_AddBreakpoint( unsigned int segment, unsigned int addr )
{
int num;
BYTE *p;
if (segment == 0xffffffff) segment = CS;
if (segment == WINE_CODE_SELECTOR) segment = 0;
if (next_bp < MAX_BREAKPOINTS)
num = next_bp++;
else /* try to find an empty slot */
{
for (num = 1; num < MAX_BREAKPOINTS; num++)
if (!breakpoints[num].in_use) break;
if (num >= MAX_BREAKPOINTS)
{
fprintf( stderr, "Too many breakpoints. Please delete some.\n" );
return;
}
}
p = segment ? (BYTE *)PTR_SEG_OFF_TO_LIN( segment, addr ) : (BYTE *)addr;
breakpoints[num].segment = segment;
breakpoints[num].addr = addr;
breakpoints[num].addrlen = !segment ? 32 :
(GET_SEL_FLAGS(segment) & LDT_FLAGS_32BIT) ? 32 : 16;
breakpoints[num].opcode = *p;
breakpoints[num].enabled = TRUE;
breakpoints[num].in_use = TRUE;
fprintf( stderr, "Breakpoint %d at ", num );
print_address( segment, addr, breakpoints[num].addrlen );
fprintf( stderr, "\n" );
}
/***********************************************************************
* DEBUG_DelBreakpoint
*
* Delete a breakpoint.
*/
void DEBUG_DelBreakpoint( int num )
{
if ((num <= 0) || (num >= next_bp) || !breakpoints[num].in_use)
{
fprintf( stderr, "Invalid breakpoint number %d\n", num );
return;
}
breakpoints[num].enabled = FALSE;
breakpoints[num].in_use = FALSE;
}
/***********************************************************************
* DEBUG_EnableBreakpoint
*
* Enable or disable a break point.
*/
void DEBUG_EnableBreakpoint( int num, BOOL enable )
{
if ((num <= 0) || (num >= next_bp) || !breakpoints[num].in_use)
{
fprintf( stderr, "Invalid breakpoint number %d\n", num );
return;
}
breakpoints[num].enabled = enable;
}
/***********************************************************************
* DEBUG_InfoBreakpoints
*
* Display break points information.
*/
void DEBUG_InfoBreakpoints(void)
{
int i;
fprintf( stderr, "Breakpoints:\n" );
for (i = 1; i < next_bp; i++)
{
if (breakpoints[i].in_use)
{
fprintf( stderr, "%d: %c ", i, breakpoints[i].enabled ? 'y' : 'n');
print_address( breakpoints[i].segment, breakpoints[i].addr,
breakpoints[i].addrlen );
fprintf( stderr, "\n" );
}
}
}
/***********************************************************************
* DEBUG_ShouldContinue
*
* Determine if we should continue execution after a SIGTRAP signal when
* executing in the given mode.
*/
BOOL DEBUG_ShouldContinue( struct sigcontext_struct *context,
enum exec_mode mode )
{
unsigned int segment, addr;
int bpnum;
/* If not single-stepping, back up over the int3 instruction */
if (!(EFL & STEP_FLAG)) EIP--;
segment = (CS == WINE_CODE_SELECTOR) ? 0 : CS;
addr = EIP;
bpnum = DEBUG_FindBreakpoint( segment, addr );
breakpoints[0].enabled = 0; /* disable the step-over breakpoint */
if ((bpnum != 0) && (bpnum != -1))
{
fprintf( stderr, "Stopped on breakpoint %d at ", bpnum );
print_address( breakpoints[bpnum].segment, breakpoints[bpnum].addr,
breakpoints[bpnum].addrlen );
fprintf( stderr, "\n" );
return FALSE;
}
/* no breakpoint, continue if in continuous mode */
return (mode == EXEC_CONT);
}
/***********************************************************************
* DEBUG_RestartExecution
*
* Set the breakpoints to the correct state to restart execution
* in the given mode.
*/
void DEBUG_RestartExecution( struct sigcontext_struct *context,
enum exec_mode mode, int instr_len )
{
unsigned int segment, addr;
segment = (CS == WINE_CODE_SELECTOR) ? 0 : CS;
addr = EIP;
if (DEBUG_FindBreakpoint( segment, addr ) != -1)
mode = EXEC_STEP_INSTR; /* If there's a breakpoint, skip it */
switch(mode)
{
case EXEC_CONT: /* Continuous execution */
EFL &= ~STEP_FLAG;
DEBUG_SetBreakpoints( TRUE );
break;
case EXEC_STEP_OVER: /* Stepping over a call */
EFL &= ~STEP_FLAG;
breakpoints[0].segment = segment;
breakpoints[0].addr = addr + instr_len;
breakpoints[0].enabled = TRUE;
breakpoints[0].in_use = TRUE;
breakpoints[0].opcode = segment ?
*(BYTE *)PTR_SEG_OFF_TO_LIN(segment,addr+instr_len) : *(BYTE *)addr;
DEBUG_SetBreakpoints( TRUE );
break;
case EXEC_STEP_INSTR: /* Single-stepping an instruction */
EFL |= STEP_FLAG;
break;
}
cont_mode=1;
current_bp=bpnum;
return 0;
}

View File

@ -61,25 +61,15 @@
/*
* Instruction disassembler.
*/
#if 0
#include <mach/boolean.h>
#include "db_machdep.h"
#include "db_access.h"
#include "db_sym.h"
#include <kern/task.h>
#endif
#include <stdio.h>
#include "db_disasm.h"
#include "windows.h"
#include "ldt.h"
extern void print_address( unsigned int seg, unsigned int addr, int addrlen );
/*
* Switch to disassemble 16-bit code.
*/
static boolean_t db_disasm_16 = FALSE;
static BOOL db_disasm_16 = FALSE;
/*
* Size attributes
@ -932,13 +922,9 @@ static unsigned int db_get_task_value( unsigned int segment, unsigned int loc,
/*
* Read address at location and return updated location.
*/
db_addr_t
db_read_address(segment, loc, short_addr, regmodrm, addrp)
unsigned int segment;
db_addr_t loc;
int short_addr;
int regmodrm;
struct i_addr *addrp; /* out */
unsigned int db_read_address( unsigned int segment, unsigned int loc,
int short_addr, int regmodrm,
struct i_addr *addrp )
{
int mod, rm, sib, index, disp;
@ -1058,21 +1044,15 @@ db_print_address(seg, size, addrp)
fprintf(stderr,",%s,%d", addrp->index, 1<<addrp->ss);
fprintf(stderr,")");
} else
db_task_printsym((db_addr_t)addrp->disp, size);
db_task_printsym(addrp->disp, size);
}
/*
* Disassemble floating-point ("escape") instruction
* and return updated location.
*/
db_addr_t
db_disasm_esc(segment, loc, inst, short_addr, size, seg)
unsigned int segment;
db_addr_t loc;
int inst;
int short_addr;
int size;
char * seg;
unsigned int db_disasm_esc( unsigned int segment, unsigned int loc,
int inst, int short_addr, int size, char *seg )
{
int regmodrm;
struct finst *fp;
@ -1151,11 +1131,7 @@ db_disasm_esc(segment, loc, inst, short_addr, size, seg)
* Disassemble instruction at 'loc'. Return address of start of
* next instruction.
*/
db_addr_t
db_disasm(segment, loc, flag16)
unsigned int segment;
db_addr_t loc;
boolean_t flag16;
unsigned int db_disasm( unsigned int segment, unsigned int loc )
{
int inst;
int size;
@ -1166,7 +1142,7 @@ db_disasm(segment, loc, flag16)
int i_size;
int i_mode;
int regmodrm = 0;
boolean_t first;
BOOL first;
int displ;
int prefix;
int imm;
@ -1174,7 +1150,8 @@ db_disasm(segment, loc, flag16)
int len;
struct i_addr address;
db_disasm_16 = flag16;
if (!segment) db_disasm_16 = FALSE;
else db_disasm_16 = !(GET_SEL_FLAGS(segment) & LDT_FLAGS_32BIT);
get_value_inc(inst, segment, loc, 1, FALSE);
@ -1240,7 +1217,7 @@ db_disasm(segment, loc, flag16)
} while (prefix);
if (inst >= 0xd8 && inst <= 0xdf) {
loc = db_disasm_esc(loc, inst, short_addr, size, seg);
loc = db_disasm_esc(segment, loc, inst, short_addr, size, seg);
fprintf(stderr,"\n");
return (loc);
}
@ -1441,8 +1418,7 @@ db_disasm(segment, loc, flag16)
if (seg)
fprintf(stderr,"%s:%d",seg, displ);
else
db_task_printsym((db_addr_t)displ,
short_addr ? WORD : LONG);
db_task_printsym(displ, short_addr ? WORD : LONG);
break;
case Db:
@ -1454,8 +1430,7 @@ db_disasm(segment, loc, flag16)
}
else
displ = displ + loc;
db_task_printsym((db_addr_t)displ,
short_addr ? WORD : LONG);
db_task_printsym(displ, short_addr ? WORD : LONG);
break;
case Dl:
@ -1469,8 +1444,7 @@ db_disasm(segment, loc, flag16)
get_value_inc(displ, segment, loc, 4, TRUE);
displ = displ + loc;
}
db_task_printsym((db_addr_t)displ,
short_addr ? WORD : LONG);
db_task_printsym( displ, short_addr ? WORD : LONG);
break;
case o1:

View File

@ -1,8 +0,0 @@
#define FALSE 0
#define TRUE 1
typedef unsigned char boolean_t;
typedef unsigned long db_addr_t;
extern db_addr_t db_disasm(unsigned int segment, db_addr_t loc,
boolean_t flag16);

View File

@ -10,24 +10,25 @@
#include <stdio.h>
#include <signal.h>
#include "ldt.h"
#include <unistd.h>
#include "windows.h"
#include "wine.h"
#include "debugger.h"
#define YYSTYPE int
#include "regpos.h"
extern FILE * yyin;
unsigned int * regval = NULL;
unsigned int dbg_mask = 0;
unsigned int dbg_mode = 0;
static enum exec_mode dbg_exec_mode = EXEC_CONT;
void issue_prompt(void);
void mode_command(int);
%}
%token CONT
%token STEP
%token NEXT
%token QUIT
%token HELP
%token BACKTRACE
@ -40,10 +41,13 @@ void mode_command(int);
%token ENABLE
%token DISABLE
%token BREAK
%token DELETE
%token SET
%token MODE
%token PRINT
%token EXAM
%token IDENTIFIER
%token FORMAT
%token NO_SYMBOL
%token SYMBOLFILE
%token DEFINE
@ -58,68 +62,59 @@ void mode_command(int);
| infocmd '\n'
| error '\n' { yyerrok; }
| QUIT '\n' { exit(0); }
| 'q' '\n' { exit(0); }
| HELP '\n' { dbg_help(); }
| CONT '\n' { return 0; }
| 'c' '\n' { return 0; }
| CONT '\n' { dbg_exec_mode = EXEC_CONT; return 0; }
| STEP '\n' { dbg_exec_mode = EXEC_STEP_INSTR; return 0; }
| NEXT '\n' { dbg_exec_mode = EXEC_STEP_OVER; return 0; }
| ABORT '\n' { kill(getpid(), SIGABRT); }
| SYMBOLFILE IDENTIFIER '\n' { read_symboltable($2); }
| SYMBOLFILE IDENTIFIER '\n' { read_symboltable($2); }
| DEFINE IDENTIFIER expr '\n' { add_hash($2, 0, $3); }
| MODE NUM { mode_command($2); }
| ENABLE NUM { enable_break($2); }
| DISABLE NUM { disable_break($2); }
| BREAK '*' expr { add_break($3); }
| MODE NUM '\n' { mode_command($2); }
| ENABLE NUM '\n' { DEBUG_EnableBreakpoint( $2, TRUE ); }
| DISABLE NUM '\n' { DEBUG_EnableBreakpoint( $2, FALSE ); }
| BREAK '*' expr { DEBUG_AddBreakpoint( 0xffffffff, $3 ); }
| BREAK '\n' { DEBUG_AddBreakpoint( 0xffffffff, EIP ); }
| DELETE BREAK NUM '\n' { DEBUG_DelBreakpoint( $3 ); }
| BACKTRACE '\n' { DEBUG_BackTrace(); }
| x_command
| BACKTRACE '\n' { dbg_bt(); }
| print_command
| deposit_command
deposit_command:
SET REG '=' expr '\n' { if(regval) regval[$2] = $4; else application_not_running();}
SET REG '=' expr '\n' { DEBUG_SetRegister( $2, $4 ); }
| SET '*' expr '=' expr '\n' { *((unsigned int *) $3) = $5; }
| SET symbol '=' expr '\n' { *((unsigned int *) $2) = $4; }
| SET symbol '=' expr '\n' { *((unsigned int *) $2) = $4; }
x_command:
'x' expr '\n' { examine_memory( 0xffffffff, $2, 1, 'x'); }
| 'x' '/' fmt expr '\n' { examine_memory( 0xffffffff, $4, 1, $3); }
| 'x' '/' NUM fmt expr '\n' { examine_memory( 0xffffffff, $5, $3, $4); }
EXAM expr '\n' { examine_memory( 0xffffffff, $2, 1, 'x'); }
| EXAM FORMAT expr '\n' { examine_memory( 0xffffffff, $3,
$2 >> 8, $2 & 0xff ); }
print:
'p'
| PRINT
print_command:
print expr '\n' { examine_memory( 0, ((unsigned int) &$2 ), 1, 'x'); }
| print '/' fmt expr '\n' { examine_memory( 0, (unsigned int) &$4, 1, $3); }
PRINT expr '\n' { examine_memory( 0, ((unsigned int) &$2 ), 1,'x'); }
| PRINT FORMAT expr '\n' { examine_memory( 0, (unsigned int)&$3,
$2 >> 8, $2 & 0xff ); }
fmt: 'x' { $$ = 'x'; }
| 'd' { $$ = 'd'; }
| 'i' { $$ = 'i'; }
| 'w' { $$ = 'w'; }
| 's' { $$ = 's'; }
| 'c' { $$ = 'c'; }
| 'b' { $$ = 'b'; }
symbol: IDENTIFIER { $$ = find_hash($1);
if($$ == 0xffffffff) {
fprintf(stderr,"Symbol %s not found\n", $1);
YYERROR;
}
}
symbol: IDENTIFIER { if (($$ = find_hash($1)) == 0xffffffff)
{
fprintf(stderr,"Symbol %s not found\n", (char *)$1);
YYERROR;
}
}
expr: NUM { $$ = $1; }
| REG { if(regval) $$ = regval[$1]; else application_not_running();}
| REG { $$ = DEBUG_GetRegister($1); }
| symbol { $$ = $1; }
| expr '+' NUM { $$ = $1 + $3; }
| expr '-' NUM { $$ = $1 - $3; }
| '(' expr ')' { $$ = $2; }
| '*' expr { $$ = *((unsigned int *) $2); }
infocmd: INFO REGS { info_reg(); }
| INFO STACK { info_stack(); }
infocmd: INFO REGS { DEBUG_InfoRegisters(); }
| INFO STACK { DEBUG_InfoStack(); }
| INFO BREAK { DEBUG_InfoBreakpoints(); }
| INFO SEGMENTS { LDT_Print(); }
| INFO BREAK { info_break(); }
%%
@ -133,78 +128,55 @@ issue_prompt(){
void mode_command(int newmode)
{
if(newmode == 16){
dbg_mask = 0xffff;
dbg_mode = 16;
return;
}
if(newmode == 32){
dbg_mask = 0xffffffff;
dbg_mode = 32;
return;
}
fprintf(stderr,"Invalid mode (use 16 or 32)\n");
if ((newmode == 16) || (newmode == 32)) dbg_mode = newmode;
else fprintf(stderr,"Invalid mode (use 16 or 32)\n");
}
static int loaded_symbols = 0;
void
wine_debug(int signal, int * regs)
void wine_debug( int signal, struct sigcontext_struct *regs )
{
static int dummy_regs[32];
char SymbolTableFile[256];
static int loaded_symbols = 0;
char SymbolTableFile[256];
int instr_len = 0, newmode;
#ifdef YYDEBUG
yydebug = 0;
yydebug = 1;
#endif
yyin = stdin;
regval = regs ? regs : dummy_regs;
yyin = stdin;
context = (struct sigcontext_struct *)regs;
if (SC_CS == WINE_CODE_SELECTOR) dbg_mode = 32;
else dbg_mode = (GET_SEL_FLAGS(SC_CS) & LDT_FLAGS_32BIT) ? 32 : 16;
dbg_mask = (dbg_mode == 32) ? 0xffffffff : 0xffff;
if (CS == WINE_CODE_SELECTOR) newmode = 32;
else newmode = (GET_SEL_FLAGS(CS) & LDT_FLAGS_32BIT) ? 32 : 16;
fprintf(stderr,"In %d bit mode.\n", dbg_mode);
if (newmode != dbg_mode)
fprintf(stderr,"In %d bit mode.\n", dbg_mode = newmode);
if(dbg_mode == 32 && !loaded_symbols)
{
loaded_symbols++;
GetPrivateProfileString("wine", "SymbolTableFile", "wine.sym",
SymbolTableFile, sizeof(SymbolTableFile), WINE_INI);
read_symboltable(SymbolTableFile);
}
if(dbg_mode == 32 && !loaded_symbols)
{
loaded_symbols++;
GetPrivateProfileString("wine", "SymbolTableFile", "wine.sym",
SymbolTableFile, sizeof(SymbolTableFile), WINE_INI);
read_symboltable(SymbolTableFile);
}
/* Remove the breakpoints from memory... */
insert_break(0);
DEBUG_SetBreakpoints( FALSE );
/* If we stopped on a breakpoint, report this fact */
if(signal == SIGTRAP)
{
unsigned int addr;
int bpnum;
addr = SC_EIP(dbg_mask);
if (dbg_mode == 16) addr = PTR_SEG_OFF_TO_LIN( SC_CS, addr );
if(should_continue(bpnum=get_bpnum(addr))){
insert_break(1);
return;
}
fprintf(stderr,"Stopped on breakpoint %d\n", bpnum);
}
if ((signal != SIGTRAP) || !DEBUG_ShouldContinue( regs, dbg_exec_mode ))
{
unsigned int segment = (CS == WINE_CODE_SELECTOR) ? 0 : CS;
/* Show where we crashed */
if(regs)
examine_memory(0xffffffff, SC_EIP(dbg_mask), 1, 'i');
issue_prompt();
yyparse();
flush_symbols();
/* Re-insert the breakpoints from memory... */
insert_break(1);
fprintf(stderr,"Returning to Wine...\n");
/* Show where we crashed */
print_address( segment, EIP, dbg_mode );
fprintf(stderr,": ");
instr_len = db_disasm( segment, EIP ) - EIP;
fprintf(stderr,"\n");
issue_prompt();
yyparse();
flush_symbols();
}
DEBUG_RestartExecution( regs, dbg_exec_mode, instr_len );
}

View File

@ -7,9 +7,10 @@
%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dbg.tab.h"
#include "regpos.h"
#include "debugger.h"
#ifdef USE_READLINE
#undef YY_INPUT
@ -19,102 +20,89 @@
#endif
extern char * readline(char *);
extern void add_history(char *);
static int dbg_read(char * buf, int size);
static char * make_symbol(char *);
void flush_symbols();
static int syntax_error;
extern int yylval;
%}
DIGIT [0-9]
HEXDIGIT [0-9a-fA-F]
DIGIT [0-9]
HEXDIGIT [0-9a-fA-F]
FORMAT [bcdiswx]
IDENTIFIER [_a-zA-Z\.~][_a-zA-Z0-9\.~]*
%%
\n { syntax_error = 0; return '\n'; } /* Indicate end of command */
\n { syntax_error = 0; return '\n'; } /*Indicate end of command*/
"+" { return '+'; }
[-+=()*] { return *yytext; }
"-" { return '-'; }
"0x"{HEXDIGIT}+ { sscanf(yytext, "%x", &yylval); return NUM; }
{DIGIT}+ { sscanf(yytext, "%d", &yylval); return NUM; }
"/" { return '/'; }
"/"{DIGIT}+{FORMAT} { char *last; yylval = strtol( yytext+1, &last, NULL );
yylval = (yylval << 8) | *last; return FORMAT; }
"/"{FORMAT} { yylval = (1 << 8) | yytext[1]; return FORMAT; }
"=" { return '='; }
$pc { yylval = REG_EIP; return REG; }
$flags { yylval = REG_EFL; return REG; }
$eip { yylval = REG_EIP; return REG; }
$ip { yylval = REG_IP; return REG; }
$esp { yylval = REG_ESP; return REG; }
$sp { yylval = REG_SP; return REG; }
$eax { yylval = REG_EAX; return REG; }
$ebx { yylval = REG_EBX; return REG; }
$ecx { yylval = REG_ECX; return REG; }
$edx { yylval = REG_EDX; return REG; }
$esi { yylval = REG_ESI; return REG; }
$edi { yylval = REG_EDI; return REG; }
$ebp { yylval = REG_EBP; return REG; }
$ax { yylval = REG_AX; return REG; }
$bx { yylval = REG_BX; return REG; }
$cx { yylval = REG_CX; return REG; }
$dx { yylval = REG_DX; return REG; }
$si { yylval = REG_SI; return REG; }
$di { yylval = REG_DI; return REG; }
$bp { yylval = REG_BP; return REG; }
$es { yylval = REG_ES; return REG; }
$ds { yylval = REG_DS; return REG; }
$cs { yylval = REG_CS; return REG; }
$ss { yylval = REG_SS; return REG; }
"(" { return '('; }
")" { return ')'; }
"*" { return '*'; }
"?" { return HELP; }
"0x"+{HEXDIGIT}+ {
sscanf(yytext, "%x", &yylval);
return NUM;
}
{DIGIT}+ {
sscanf(yytext, "%d", &yylval);
return NUM;
}
$pc { yylval = RN_EIP; return REG;}
$sp { yylval = RN_ESP_AT_SIGNAL; return REG;}
$eip { yylval = RN_EIP; return REG;}
$esp { yylval = RN_ESP_AT_SIGNAL; return REG;}
$ebp { yylval = RN_EBP; return REG;}
$eax { yylval = RN_EAX; return REG;}
$ebx { yylval = RN_EBX; return REG;}
$ecx { yylval = RN_ECX; return REG;}
$edx { yylval = RN_EDX; return REG;}
$esi { yylval = RN_ESI; return REG;}
$edi { yylval = RN_EDI; return REG;}
$es { yylval = RN_ES; return REG;}
$ds { yylval = RN_DS; return REG;}
$cs { yylval = RN_CS; return REG;}
$ss { yylval = RN_SS; return REG;}
info|inf|in { return INFO; }
segments|segm { return SEGMENTS; }
break|brea|bre { return BREAK; }
enable|enabl|enab|ena { return ENABLE;}
info|inf|in { return INFO; }
segments|segm { return SEGMENTS; }
break|brea|bre|br|b { return BREAK; }
enable|enabl|enab|ena { return ENABLE;}
disable|disabl|disab|disa|dis { return DISABLE; }
quit|qui|qu { return QUIT; }
delete|delet|dele|del { return DELETE; }
quit|qui|qu|q { return QUIT; }
x { return EXAM; }
help|hel|he { return HELP; }
"?" { return HELP; }
set|se { return SET; }
bt { return BACKTRACE; }
cont|con|co { return CONT; }
cont|con|co|c { return CONT; }
step|ste|st|s { return STEP; }
next|nex|ne|n { return NEXT; }
symbolfile|symbolfil|symbolfi|symbolf|symbol|symbo|symb { return SYMBOLFILE; }
define|defin|defi|def|de { return DEFINE; }
abort|abor|abo { return ABORT; }
print|prin|pri|pr { return PRINT; }
print|prin|pri|pr|p { return PRINT; }
mode { return MODE; }
regs|reg|re { return REGS; }
registers|regs|reg|re { return REGS; }
stack|stac|sta|st { return STACK; }
p { return 'p'; }
x { return 'x'; }
d { return 'd'; }
i { return 'i'; }
w { return 'w'; }
b { return 'b'; }
s { return 's'; }
c { return 'c'; }
q { return 'q'; }
{IDENTIFIER} {yylval = (int) make_symbol(yytext);
return IDENTIFIER;
}
@ -161,35 +149,45 @@ static void stripwhite (char *string)
string[++i] = '\0';
}
dbg_read(char * buf, int size){
char * line;
int len;
static int dbg_read(char * buf, int size)
{
static char last_line[256] = "";
char * line;
int len;
for (;;)
{
flush_symbols();
line = readline ("Wine-dbg>");
if (!line) exit(0);
do{
flush_symbols();
line = readline ("Wine-dbg>");
if (!line) return 0;
len = strlen(line);
/* Remove leading and trailing whitespace from the line.
Then, if there is anything left, add it to the history list
and execute it. */
stripwhite (line);
/* Remove leading and trailing whitespace from the line.
Then, if there is anything left, add it to the history list
and execute it. */
stripwhite (line);
if (*line)
{
add_history (line);
if(size < len + 1){
fprintf(stderr,"Fatal readline goof.\n");
exit(0);
}
strcpy(buf, line);
buf[len] = '\n';
buf[len+1] = 0;
free(line);
return len + 1;
}
} while (1==1);
if (*line)
{
add_history( line );
strncpy( last_line, line, 255 );
last_line[255] = '\0';
}
else line = last_line; /* Repeat previous command */
if ((len = strlen(line)) > 0)
{
if (size < len + 1)
{
fprintf(stderr,"Fatal readline goof.\n");
exit(0);
}
strcpy(buf, line);
buf[len] = '\n';
buf[len+1] = 0;
free(line);
return len + 1;
}
}
}
static char *local_symbols[10];

View File

@ -1,87 +0,0 @@
#include <signal.h>
#include <stdio.h>
extern void wine_debug(unsigned int*);
#ifdef linux
#include <linux/sched.h>
#include <asm/system.h>
#endif
struct sigaction segv_act;
#ifdef linux
struct sigcontext_struct {
unsigned short sc_gs, __gsh;
unsigned short sc_fs, __fsh;
unsigned short sc_es, __esh;
unsigned short sc_ds, __dsh;
unsigned long sc_edi;
unsigned long sc_esi;
unsigned long sc_ebp;
unsigned long sc_esp;
unsigned long sc_ebx;
unsigned long sc_edx;
unsigned long sc_ecx;
unsigned long sc_eax;
unsigned long sc_trapno;
unsigned long sc_err;
unsigned long sc_eip;
unsigned short sc_cs, __csh;
unsigned long sc_eflags;
unsigned long esp_at_signal;
unsigned short sc_ss, __ssh;
unsigned long i387;
unsigned long oldmask;
unsigned long cr2;
};
#endif
#ifdef linux
static void win_fault(int signal, struct sigcontext_struct context){
struct sigcontext_struct *scp = &context;
#else
static void win_fault(int signal, int code, struct sigcontext *scp){
#endif
wine_debug((unsigned int *) scp); /* Enter our debugger */
}
char realtext[] = "This is what should really be printed\n";
int
main(){
char * pnt;
#ifdef linux
segv_act.sa_handler = (__sighandler_t) win_fault;
sigaction(SIGSEGV, &segv_act, NULL);
#endif
#if defined(__NetBSD__) || defined(__FreeBSD__)
sigset_t sig_mask;
sigemptyset(&sig_mask);
segv_act.sa_handler = (__sighandler_t) win_fault;
segv_act.sa_flags = 0;
segv_act.sa_mask = sig_mask;
if (sigaction(SIGSEGV, &segv_act, NULL) < 0) {
perror("sigaction");
exit(1);
}
#endif
fprintf(stderr,"%x\n", realtext);
/* Now force a segmentation fault */
pnt = (char *) 0xc0000000;
fprintf(stderr,"%s", pnt);
return 0;
}
unsigned int * wine_files = NULL;
GetEntryPointFromOrdinal(int wpnt, int ordinal) {}

View File

@ -155,10 +155,6 @@ read_symboltable(char * filename){
}
/* Load the entry points from the dynamic linking into the hash tables.
* This does not work yet - something needs to be added before it scans the
* tables correctly
*/
void load_entrypoints( HMODULE hModule )
{

View File

@ -6,16 +6,10 @@
#include <stdio.h>
#include <stdlib.h>
#include "ldt.h"
#include "db_disasm.h"
#include "regpos.h"
#include "debugger.h"
extern char * find_nearest_symbol( unsigned int seg, unsigned int addr );
extern int * regval;
extern unsigned int dbg_mask;
extern unsigned int dbg_mode;
void application_not_running()
{
fprintf(stderr,"Application not running\n");
@ -32,54 +26,6 @@ void print_address( unsigned int segment, unsigned int addr, int addrlen )
}
void info_reg(){
if(!regval) {
application_not_running();
return;
}
fprintf(stderr,"Register dump:\n");
/* First get the segment registers out of the way */
fprintf(stderr," CS:%4.4x SS:%4.4x DS:%4.4x ES:%4.4x GS:%4.4x FS:%4.4x\n",
SC_CS, SC_SS, SC_DS, SC_ES, SC_GS, SC_FS);
/* Now dump the main registers */
fprintf(stderr," EIP:%8.8x ESP:%8.8x EBP:%8.8x EFLAGS:%8.8x\n",
SC_EIP(dbg_mask), SC_ESP(dbg_mask), SC_EBP(dbg_mask), SC_EFLAGS);
/* And dump the regular registers */
fprintf(stderr," EAX:%8.8x EBX:%8.8x ECX:%8.8x EDX:%8.8x\n",
SC_EAX(dbg_mask), SC_EBX(dbg_mask), SC_ECX(dbg_mask), SC_EDX(dbg_mask));
/* Finally dump these main registers */
fprintf(stderr," EDI:%8.8x ESI:%8.8x\n",
SC_EDI(dbg_mask), SC_ESI(dbg_mask));
}
void info_stack(){
unsigned int * dump;
int i;
if(!regval) {
application_not_running();
return;
}
fprintf(stderr,"Stack dump:\n");
dump = (int*) SC_ESP(dbg_mask);
for(i=0; i<22; i++)
{
fprintf(stderr," %8.8x", *dump++);
if ((i % 8) == 7)
fprintf(stderr,"\n");
}
fprintf(stderr,"\n");
}
void examine_memory( unsigned int segment, unsigned int addr,
int count, char format )
{
@ -88,9 +34,10 @@ void examine_memory( unsigned int segment, unsigned int addr,
unsigned short int * wdump;
int i;
if (segment == 0xffffffff)
segment = (dbg_mode == 32) ? 0 : (format == 'i' ? SC_CS : SC_DS);
if (segment == 0xffffffff) segment = (format == 'i' ? CS : DS);
if ((segment == WINE_CODE_SELECTOR) || (segment == WINE_DATA_SELECTOR))
segment = 0;
if (format != 'i' && count > 1)
{
print_address( segment, addr, dbg_mode );
@ -114,7 +61,7 @@ void examine_memory( unsigned int segment, unsigned int addr,
for(i=0; i<count; i++) {
print_address( segment, addr, dbg_mode );
fprintf(stderr,": ");
addr = db_disasm( segment, addr, (dbg_mode == 16) );
addr = db_disasm( segment, addr );
fprintf(stderr,"\n");
};
return;
@ -152,7 +99,7 @@ void examine_memory( unsigned int segment, unsigned int addr,
wdump = (unsigned short *)pnt;
for(i=0; i<count; i++)
{
fprintf(stderr," %x", *wdump++);
fprintf(stderr," %04x", *wdump++);
addr += 2;
if ((i % 10) == 7) {
fprintf(stderr,"\n");
@ -205,14 +152,15 @@ char * helptext[] = {
"The commands accepted by the Wine debugger are a small subset",
"of the commands that gdb would accept. The commands currently",
"are:\n",
" break *<addr> bt",
" break [*<addr>] delete break bpnum",
" disable bpnum enable bpnum",
" help quit",
" x <expr> cont",
" step next",
" mode [16,32] print <expr>",
" set <reg> = <expr> set *<expr> = <expr>",
" info [reg,stack,break,segments] symbolfile <filename>",
" define <identifier> <expr>",
" info [reg,stack,break,segments] bt",
" symbolfile <filename> define <identifier> <expr>",
"",
"The 'x' command accepts repeat counts and formats (including 'i') in the",
"same way that gdb does.",
@ -230,57 +178,3 @@ void dbg_help(){
i = 0;
while(helptext[i]) fprintf(stderr,"%s\n", helptext[i++]);
}
struct frame{
union{
struct {
unsigned short saved_bp;
unsigned short saved_ip;
unsigned short saved_cs;
} win16;
struct {
unsigned long saved_bp;
unsigned long saved_ip;
unsigned short saved_cs;
} win32;
} u;
};
void dbg_bt(){
struct frame * frame;
unsigned short cs;
int frameno = 0;
if(!regval) {
application_not_running();
return;
}
if (dbg_mode == 16)
frame = (struct frame *)PTR_SEG_OFF_TO_LIN( SC_SS, SC_BP & ~1 );
else
frame = (struct frame *)SC_EBP(dbg_mask);
fprintf(stderr,"Backtrace:\n");
cs = SC_CS;
while((cs & 3) == 3) {
/* See if in 32 bit mode or not. Assume GDT means 32 bit. */
if ((cs & 7) != 7) {
fprintf(stderr,"%d ",frameno++);
print_address( 0, frame->u.win32.saved_ip, 32 );
fprintf( stderr, "\n" );
if (!frame->u.win32.saved_ip) break;
frame = (struct frame *) frame->u.win32.saved_bp;
} else {
if (frame->u.win16.saved_bp & 1) cs = frame->u.win16.saved_cs;
fprintf(stderr,"%d %4.4x:%4.4x\n", frameno++, cs,
frame->u.win16.saved_ip);
if (!frame->u.win16.saved_bp) break;
frame = (struct frame *) PTR_SEG_OFF_TO_LIN( SC_SS, frame->u.win16.saved_bp & ~1);
}
}
putchar('\n');
}

119
debugger/registers.c Normal file
View File

@ -0,0 +1,119 @@
/*
* Debugger register handling
*
* Copyright 1995 Alexandre Julliard
*/
#include <stdio.h>
#include "debugger.h"
struct sigcontext_struct *context;
/***********************************************************************
* DEBUG_SetRegister
*
* Set a register value.
*/
void DEBUG_SetRegister( enum debug_regs reg, int val )
{
switch(reg)
{
case REG_EAX: EAX = val; break;
case REG_EBX: EBX = val; break;
case REG_ECX: ECX = val; break;
case REG_EDX: EDX = val; break;
case REG_ESI: ESI = val; break;
case REG_EDI: EDI = val; break;
case REG_EBP: EBP = val; break;
case REG_EFL: EFL = val; break;
case REG_EIP: EIP = val; break;
case REG_ESP: ESP = val; break;
case REG_AX: AX = val; break;
case REG_BX: BX = val; break;
case REG_CX: CX = val; break;
case REG_DX: DX = val; break;
case REG_SI: SI = val; break;
case REG_DI: DI = val; break;
case REG_BP: BP = val; break;
case REG_FL: FL = val; break;
case REG_IP: IP = val; break;
case REG_SP: SP = val; break;
case REG_CS: CS = val; break;
case REG_DS: DS = val; break;
case REG_ES: ES = val; break;
case REG_SS: SS = val; break;
}
}
/***********************************************************************
* DEBUG_GetRegister
*
* Get a register value.
*/
int DEBUG_GetRegister( enum debug_regs reg )
{
switch(reg)
{
case REG_EAX: return EAX;
case REG_EBX: return EBX;
case REG_ECX: return ECX;
case REG_EDX: return EDX;
case REG_ESI: return ESI;
case REG_EDI: return EDI;
case REG_EBP: return EBP;
case REG_EFL: return EFL;
case REG_EIP: return EIP;
case REG_ESP: return ESP;
case REG_AX: return AX;
case REG_BX: return BX;
case REG_CX: return CX;
case REG_DX: return DX;
case REG_SI: return SI;
case REG_DI: return DI;
case REG_BP: return BP;
case REG_FL: return FL;
case REG_IP: return IP;
case REG_SP: return SP;
case REG_CS: return CS;
case REG_DS: return DS;
case REG_ES: return ES;
case REG_SS: return SS;
}
return 0; /* should not happen */
}
/***********************************************************************
* DEBUG_InfoRegisters
*
* Display registers information.
*/
void DEBUG_InfoRegisters(void)
{
fprintf(stderr,"Register dump:\n");
/* First get the segment registers out of the way */
fprintf( stderr," CS:%04x SS:%04x DS:%04x ES:%04x\n", CS, SS, DS, ES );
if (dbg_mode == 16)
{
fprintf( stderr," IP:%04x SP:%04x BP:%04x FLAGS:%04x\n",
IP, SP, BP, FL );
fprintf( stderr," AX:%04x BX:%04x CX:%04x DX:%04x SI:%04x DI:%04x\n",
AX, BX, CX, DX, SI, DI );
}
else /* 32-bit mode */
{
fprintf( stderr, " EIP:%08lx ESP:%08lx EBP:%08lx EFLAGS:%08lx\n",
EIP, ESP, EBP, EFL );
fprintf( stderr, " EAX:%08lx EBX:%08lx ECX:%08lx EDX:%08lx\n",
EAX, EBX, ECX, EDX);
fprintf( stderr, " ESI:%08lx EDI:%08lx\n", ESI, EDI);
}
}

View File

@ -1,106 +0,0 @@
#ifdef linux
/* Register numbers */
#define RN_GS 0
#define RN_FS 1
#define RN_ES 2
#define RN_DS 3
#define RN_EDI 4
#define RN_ESI 5
#define RN_EBP 6
#define RN_ESP 7
#define RN_EBX 8
#define RN_EDX 9
#define RN_ECX 10
#define RN_EAX 11
#define RN_TRAPNO 12
#define RN_ERR 13
#define RN_EIP 14
#define RN_CS 15
#define RN_EFLAGS 16
#define RN_ESP_AT_SIGNAL 17
#define RN_SS 18
#define RN_I387 19
#define RN_OLDMASK 20
#define RN_CR2 21
#endif
#ifdef __NetBSD__
/* Register numbers */
#define RN_GS 0
#define RN_FS 1
#define RN_ES 2
#define RN_DS 3
#define RN_EDI 4
#define RN_ESI 5
#define RN_EBP 6
#define RN_EBX 7
#define RN_EDX 8
#define RN_ECX 9
#define RN_EAX 10
#define RN_EIP 11
#define RN_CS 12
#define RN_EFLAGS 13
#define RN_ESP_AT_SIGNAL 14
#define RN_SS 15
#define RN_OLDMASK 17
#endif
#ifdef __FreeBSD__
#define RN_OLDMASK 1
/* Register numbers */
#define RN_ESP 2
#define RN_EBP 3
#define RN_ESP_AT_SIGNAL 4
#define RN_EIP 5
#define RN_EFLAGS 6
#define RN_ES 7
#define RN_DS 8
#define RN_CS 9
#define RN_SS 10
#define RN_EDI 11
#define RN_ESI 12
#define RN_EBX 13
#define RN_EDX 14
#define RN_ECX 15
#define RN_EAX 16
/* FreeBSD doesn't save gs or fs */
#define SC_GS 0x27
#define SC_FS 0x27
#endif
#ifdef linux
#define SC_GS regval[RN_GS]
#define SC_FS regval[RN_FS]
#define I387 regval[RN_I387]
#define CR2 regval[RN_CR2]
#endif
#ifdef __NetBSD__
#define SC_GS regval[RN_GS]
#define SC_FS regval[RN_FS]
#endif
#define SC_ES regval[RN_ES]
#define SC_DS regval[RN_DS]
#define SC_EDI(dbg_mask) (regval[RN_EDI] & dbg_mask)
#define SC_ESI(dbg_mask) (regval[RN_ESI] & dbg_mask)
#define SC_EBP(dbg_mask) (regval[RN_EBP] & dbg_mask)
#define SC_EBX(dbg_mask) (regval[RN_EBX] & dbg_mask)
#define SC_EDX(dbg_mask) (regval[RN_EDX] & dbg_mask)
#define SC_ECX(dbg_mask) (regval[RN_ECX] & dbg_mask)
#define SC_EAX(dbg_mask) (regval[RN_EAX] & dbg_mask)
#define SC_DI (regval[RN_EDI] & 0xffff)
#define SC_SI (regval[RN_ESI] & 0xffff)
#define SC_BP (regval[RN_EBP] & 0xffff)
#define SC_SP (regval[RN_ESP] & 0xffff)
#define SC_BX (regval[RN_EBX] & 0xffff)
#define SC_DX (regval[RN_EDX] & 0xffff)
#define SC_CX (regval[RN_ECX] & 0xffff)
#define SC_AX (regval[RN_EAX] & 0xffff)
#define SC_TRAPNO regval[RN_TRAPNO]
#define SC_ERR regval[RN_ERR]
#define SC_EIP(dbg_mask) (regval[RN_EIP] & dbg_mask)
#define SC_CS regval[RN_CS]
#define SC_EFLAGS regval[RN_EFLAGS]
#define SC_ESP(dbg_mask) (regval[RN_ESP_AT_SIGNAL] & dbg_mask)
#define SC_SS regval[RN_SS]
#define OLDMASK regval[RN_OLDMASK]

89
debugger/stack.c Normal file
View File

@ -0,0 +1,89 @@
/*
* Debugger stack handling
*
* Copyright 1995 Alexandre Julliard
*/
#include <stdio.h>
#include "windows.h"
#include "debugger.h"
typedef struct
{
WORD bp;
WORD ip;
WORD cs;
} FRAME16;
typedef struct
{
DWORD bp;
DWORD ip;
WORD cs;
} FRAME32;
/***********************************************************************
* DEBUG_InfoStack
*
* Dump the top of the stack
*/
void DEBUG_InfoStack(void)
{
fprintf(stderr,"Stack dump:\n");
if ((SS == WINE_DATA_SELECTOR) ||
(GET_SEL_FLAGS(SS) & LDT_FLAGS_32BIT)) /* 32-bit mode */
{
examine_memory( 0, ESP, 10, 'x' );
}
else /* 16-bit mode */
{
examine_memory( SS, SP, 10, 'w' );
}
fprintf(stderr,"\n");
}
/***********************************************************************
* DEBUG_BackTrace
*
* Display a stack back-trace.
*/
void DEBUG_BackTrace(void)
{
int frameno = 0;
fprintf(stderr,"Backtrace:\n");
if (SS == WINE_DATA_SELECTOR) /* 32-bit mode */
{
FRAME32 *frame = (FRAME32 *)EBP;
while (frame->ip)
{
fprintf(stderr,"%d ",frameno++);
print_address( 0, frame->ip, 32 );
fprintf( stderr, "\n" );
frame = (FRAME32 *)frame->bp;
}
}
else /* 16-bit mode */
{
FRAME16 *frame = (FRAME16 *)PTR_SEG_OFF_TO_LIN( SS, BP & ~1 );
WORD cs = CS;
if (GET_SEL_FLAGS(SS) & LDT_FLAGS_32BIT)
{
fprintf( stderr, "Not implemented: 32-bit backtrace on a different stack segment.\n" );
return;
}
while (frame->bp)
{
if (frame->bp & 1) cs = frame->cs;
fprintf( stderr,"%d ", frameno++ );
print_address( cs, frame->ip, 16 );
fprintf( stderr, "\n" );
frame = (FRAME16 *)PTR_SEG_OFF_TO_LIN( SS, frame->bp & ~1 );
}
}
fprintf( stderr, "\n" );
}

View File

@ -2,9 +2,9 @@ name compobj
id 22
1 pascal CoBuildVersion() CoBuildVersion
2 pascal CoInitialize(ptr) CoInitialize
2 pascal CoInitialize(long) CoInitialize
3 pascal CoUninitialize() CoUnitialize
4 stub COGETMALLOC
4 pascal CoGetMalloc(long ptr) CoGetMalloc
5 stub COREGISTERCLASSOBJECT
6 stub COREVOKECLASSOBJECT
7 stub COGETCLASSOBJECT
@ -97,49 +97,49 @@ id 22
95 stub SETETASK
96 stub LRPCFREEMONITORDATA
97 stub REMLOOKUPSHUNK
#100 ??0CARRAYFVALUE@@REC@KI@Z
#101 ??1CARRAYFVALUE@@REC@XZ
#102 ?ASSERTVALID@CARRAYFVALUE@@RFCXXZ
#103 ?FREEEXTRA@CARRAYFVALUE@@RECXXZ
#104 ?_GETAT@CARRAYFVALUE@@RFCPEXH@Z
#105 ?GETSIZE@CARRAYFVALUE@@RFCHXZ
#108 ?INDEXOF@CARRAYFVALUE@@RECHPEXII@Z
#109 ?INSERTAT@CARRAYFVALUE@@RECHHPEXH@Z
#111 ?REMOVEAT@CARRAYFVALUE@@RECXHH@Z
#112 ?SETAT@CARRAYFVALUE@@RECXHPEX@Z
#113 ?SETATGROW@CARRAYFVALUE@@RECHHPEX@Z
#114 ?SETSIZE@CARRAYFVALUE@@RECHHH@Z
#120 ?GETASSOCAT@CMAPKEYTOVALUE@@BFCPEUCASSOC@1@PEXIAEI@Z
#121 ?SETASSOCKEY@CMAPKEYTOVALUE@@BFCHPEUCASSOC@1@PEXI@Z
#122 ??1CMAPKEYTOVALUE@@REC@XZ
#123 ?GETASSOCKEYPTR@CMAPKEYTOVALUE@@BFCXPEUCASSOC@1@PEPEXPEI@Z
#124 ?NEWASSOC@CMAPKEYTOVALUE@@BECPEUCASSOC@1@IPEXI0@Z
#125 ?SIZEASSOC@CMAPKEYTOVALUE@@BFCIXZ
#126 ?FREEASSOC@CMAPKEYTOVALUE@@BECXPEUCASSOC@1@@Z
#127 ?GETSTARTPOSITION@CMAPKEYTOVALUE@@RFCPEXXZ
#128 ?GETNEXTASSOC@CMAPKEYTOVALUE@@RFCXPEPEXPEXPEI1@Z
#129 ?COMPAREASSOCKEY@CMAPKEYTOVALUE@@BFCHPEUCASSOC@1@PEXI@Z
#130 ?REMOVEHKEY@CMAPKEYTOVALUE@@RECHK@Z
#131 ?GETHKEY@CMAPKEYTOVALUE@@RFCKPEXI@Z
#132 ?GETCOUNT@CMAPKEYTOVALUE@@RFCHXZ
#133 ?LOOKUP@CMAPKEYTOVALUE@@RFCHPEXI0@Z
#134 ?GETASSOCVALUE@CMAPKEYTOVALUE@@BFCXPEUCASSOC@1@PEX@Z
#135 ?REMOVEKEY@CMAPKEYTOVALUE@@RECHPEXI@Z
#136 ?REMOVEALL@CMAPKEYTOVALUE@@RECXXZ
#138 ?FREEASSOCKEY@CMAPKEYTOVALUE@@BFCXPEUCASSOC@1@@Z
#139 ?SETAT@CMAPKEYTOVALUE@@RECHPEXI0@Z
#140 ?LOOKUPHKEY@CMAPKEYTOVALUE@@RFCHKPEX@Z
#141 ?ASSERTVALID@CMAPKEYTOVALUE@@RFCXXZ
#142 ?SETASSOCVALUE@CMAPKEYTOVALUE@@BFCXPEUCASSOC@1@PEX@Z
#143 ?SETATHKEY@CMAPKEYTOVALUE@@RECHKPEX@Z
#144 ??0CMAPKEYTOVALUE@@REC@KIIHP7CIPEXI@ZI@Z
#145 ?INITHASHTABLE@CMAPKEYTOVALUE@@BECHXZ
#146 ?GETASSOCVALUEPTR@CMAPKEYTOVALUE@@BFCXPEUCASSOC@1@PEPEX@Z
#147 ?LOOKUPADD@CMAPKEYTOVALUE@@RFCHPEXI0@Z
#148 MKVDEFAULTHASHKEY
#150 COMEMCTXOF
#151 COMEMALLOC
#152 COMEMFREE
#160 CORUNMODALLOOP
#161 COHANDLEINCOMINGCALL
#162 COSETACKSTATE
100 stub ??0CARRAYFVALUE@@REC@KI@Z
101 stub ??1CARRAYFVALUE@@REC@XZ
102 stub ?ASSERTVALID@CARRAYFVALUE@@RFCXXZ
103 stub ?FREEEXTRA@CARRAYFVALUE@@RECXXZ
104 stub ?_GETAT@CARRAYFVALUE@@RFCPEXH@Z
105 stub ?GETSIZE@CARRAYFVALUE@@RFCHXZ
108 stub ?INDEXOF@CARRAYFVALUE@@RECHPEXII@Z
109 stub ?INSERTAT@CARRAYFVALUE@@RECHHPEXH@Z
111 stub ?REMOVEAT@CARRAYFVALUE@@RECXHH@Z
112 stub ?SETAT@CARRAYFVALUE@@RECXHPEX@Z
113 stub ?SETATGROW@CARRAYFVALUE@@RECHHPEX@Z
114 stub ?SETSIZE@CARRAYFVALUE@@RECHHH@Z
120 stub ?GETASSOCAT@CMAPKEYTOVALUE@@BFCPEUCASSOC@1@PEXIAEI@Z
121 stub ?SETASSOCKEY@CMAPKEYTOVALUE@@BFCHPEUCASSOC@1@PEXI@Z
122 stub ??1CMAPKEYTOVALUE@@REC@XZ
123 stub ?GETASSOCKEYPTR@CMAPKEYTOVALUE@@BFCXPEUCASSOC@1@PEPEXPEI@Z
124 stub ?NEWASSOC@CMAPKEYTOVALUE@@BECPEUCASSOC@1@IPEXI0@Z
125 stub ?SIZEASSOC@CMAPKEYTOVALUE@@BFCIXZ
126 stub ?FREEASSOC@CMAPKEYTOVALUE@@BECXPEUCASSOC@1@@Z
127 stub ?GETSTARTPOSITION@CMAPKEYTOVALUE@@RFCPEXXZ
128 stub ?GETNEXTASSOC@CMAPKEYTOVALUE@@RFCXPEPEXPEXPEI1@Z
129 stub ?COMPAREASSOCKEY@CMAPKEYTOVALUE@@BFCHPEUCASSOC@1@PEXI@Z
130 stub ?REMOVEHKEY@CMAPKEYTOVALUE@@RECHK@Z
131 stub ?GETHKEY@CMAPKEYTOVALUE@@RFCKPEXI@Z
132 stub ?GETCOUNT@CMAPKEYTOVALUE@@RFCHXZ
133 stub ?LOOKUP@CMAPKEYTOVALUE@@RFCHPEXI0@Z
134 stub ?GETASSOCVALUE@CMAPKEYTOVALUE@@BFCXPEUCASSOC@1@PEX@Z
135 stub ?REMOVEKEY@CMAPKEYTOVALUE@@RECHPEXI@Z
136 stub ?REMOVEALL@CMAPKEYTOVALUE@@RECXXZ
138 stub ?FREEASSOCKEY@CMAPKEYTOVALUE@@BFCXPEUCASSOC@1@@Z
139 stub ?SETAT@CMAPKEYTOVALUE@@RECHPEXI0@Z
140 stub ?LOOKUPHKEY@CMAPKEYTOVALUE@@RFCHKPEX@Z
141 stub ?ASSERTVALID@CMAPKEYTOVALUE@@RFCXXZ
142 stub ?SETASSOCVALUE@CMAPKEYTOVALUE@@BFCXPEUCASSOC@1@PEX@Z
143 stub ?SETATHKEY@CMAPKEYTOVALUE@@RECHKPEX@Z
144 stub ??0CMAPKEYTOVALUE@@REC@KIIHP7CIPEXI@ZI@Z
145 stub ?INITHASHTABLE@CMAPKEYTOVALUE@@BECHXZ
146 stub ?GETASSOCVALUEPTR@CMAPKEYTOVALUE@@BFCXPEUCASSOC@1@PEPEX@Z
147 stub ?LOOKUPADD@CMAPKEYTOVALUE@@RFCHPEXI0@Z
148 stub MKVDEFAULTHASHKEY
150 stub COMEMCTXOF
151 stub COMEMALLOC
152 stub COMEMFREE
160 stub CORUNMODALLOOP
161 stub COHANDLEINCOMINGCALL
162 stub COSETACKSTATE

View File

@ -205,8 +205,8 @@ id 3
306 stub ENGINEMAKEFONTDIR
307 stub GetCharABCWidths
308 stub GetOutLineTextMetrics
309 stub GetGlyphOutLine
310 stub CreateScalableFontResource
309 pascal GetGlyphOutLine(word word word ptr long ptr ptr) GetGlyphOutLine
310 pascal16 CreateScalableFontResource(word ptr ptr ptr) CreateScalableFontResource
311 stub GetFontData
312 stub ConvertOutLineFontFile
313 pascal16 GetRasterizerCaps(ptr word) GetRasterizerCaps

View File

@ -1,7 +1,7 @@
name OLE2
id 15
1 stub OleBuildVersion
1 pascal OleBuildVersion() OleBuildVersion
2 pascal OleInitialize(ptr) OleInitialize
3 pascal OleUninitialize() OleUninitialize
4 stub DLLGETCLASSOBJECT

View File

@ -2,12 +2,12 @@ name ole2disp
id 17
1 stub DLLGETCLASSOBJECT
2 stub SYSALLOCSTRING
3 stub SYSREALLOCSTRING
4 stub SYSALLOCSTRINGLEN
5 stub SYSREALLOCSTRINGLEN
6 stub SYSFREESTRING
7 stub SYSSTRINGLEN
2 pascal SysAllocString(ptr) SysAllocString
3 pascal SysReallocString(ptr ptr) SysReAllocString
4 pascal SysAllocStringLen(ptr word) SysAllocStringLen
5 pascal SysReAllocStringLen(ptr ptr word) SysReAllocStringLen
6 pascal SysFreeString(long) SysFreeString
7 pascal SysStringLen(long) SysStringLen
8 stub VARIANTINIT
9 stub VARIANTCLEAR
10 stub VARIANTCOPY

View File

@ -8,7 +8,7 @@ id 18
5 pascal GetLocaleInfoA(long long ptr word) GetLocaleInfoA
6 stub LCMAPSTRINGA
7 stub GETSTRINGTYPEA
8 stub COMPARESTRINGA
8 pascal16 CompareStringA(long long ptr word ptr word) CompareStringA
#9 WEP
10 stub LIBMAIN
11 stub NOTIFYWINDOWPROC

View File

@ -6,13 +6,13 @@ id 5
# proper parameters. It's just to have stub for PROGMAN.EXE ...
#
1 pascal RegOpenKey(word ptr ptr) RegOpenKey
2 pascal RegCreateKey(word ptr ptr) RegCreateKey
3 pascal RegCloseKey(word) RegCloseKey
4 pascal RegDeleteKey(word ptr) RegDeleteKey
5 pascal RegSetValue(word ptr long ptr long) RegSetValue
6 pascal RegQueryValue(word ptr ptr ptr) RegQueryValue
7 pascal RegEnumKey(word long ptr long) RegEnumKey
1 pascal RegOpenKey(long ptr ptr) RegOpenKey
2 pascal RegCreateKey(long ptr ptr) RegCreateKey
3 pascal RegCloseKey(long) RegCloseKey
4 pascal RegDeleteKey(long ptr) RegDeleteKey
5 pascal RegSetValue(long ptr long ptr long) RegSetValue
6 pascal RegQueryValue(long ptr ptr ptr) RegQueryValue
7 pascal RegEnumKey(long long ptr long) RegEnumKey
9 pascal16 DragAcceptFiles(word word) DragAcceptFiles
11 pascal16 DragQueryFile(word s_word ptr s_word) DragQueryFile
12 pascal16 DragFinish(word) DragFinish

View File

@ -26,8 +26,8 @@ id 12
72 pascal16 MemManInfo(ptr) MemManInfo
73 stub NOTIFYREGISTER
74 stub NOTIFYUNREGISTER
75 stub INTERRUPTREGISTER
76 stub INTERRUPTUNREGISTER
75 return INTERRUPTREGISTER 6 0
76 return INTERRUPTUNREGISTER 2 0
77 stub TERMINATEAPP
78 pascal MemoryRead(word long ptr long) MemoryRead
79 pascal MemoryWrite(word long ptr long) MemoryWrite

View File

@ -88,7 +88,7 @@ extern WORD CallTo16_regs_( FARPROC func, WORD ds, WORD es, WORD bp, WORD ax,
(*func)( code, wParam, lParam )
#define CallTimeFuncProc( func, id, msg, dwUser, dw1, dw2 ) \
(*func)( id, msg, dwUser, dw1, dw2 )
#define CallWndProc( func, hwnd, msg, wParam, lParam ) \
#define CallWndProc( func, ds, hwnd, msg, wParam, lParam ) \
(*func)( hwnd, msg, wParam, lParam )
#endif /* WINELIB */

63
include/debugger.h Normal file
View File

@ -0,0 +1,63 @@
/*
* Debugger definitions
*
* Copyright 1995 Alexandre Julliard
*/
#ifndef DEBUGGER_H
#define DEBUGGER_H
#include "ldt.h"
#include "registers.h"
#include "wine.h"
enum debug_regs
{
REG_EAX, REG_EBX, REG_ECX, REG_EDX, REG_ESI,
REG_EDI, REG_EBP, REG_EFL, REG_EIP, REG_ESP,
REG_AX, REG_BX, REG_CX, REG_DX, REG_SI,
REG_DI, REG_BP, REG_FL, REG_IP, REG_SP,
REG_CS, REG_DS, REG_ES, REG_SS
};
enum exec_mode
{
EXEC_CONT, /* Continuous execution */
EXEC_STEP_OVER, /* Stepping over a call */
EXEC_STEP_INSTR /* Single-stepping an instruction */
};
extern struct sigcontext_struct *context; /* debugger/registers.c */
extern unsigned int dbg_mode;
/* debugger/break.c */
extern void DEBUG_SetBreakpoints( BOOL set );
extern int DEBUG_FindBreakpoint( unsigned int segment, unsigned int addr );
extern void DEBUG_AddBreakpoint( unsigned int segment, unsigned int addr );
extern void DEBUG_DelBreakpoint( int num );
extern void DEBUG_EnableBreakpoint( int num, BOOL enable );
extern void DEBUG_InfoBreakpoints(void);
extern BOOL DEBUG_HandleTrap( struct sigcontext_struct *context );
extern BOOL DEBUG_ShouldContinue( struct sigcontext_struct *context,
enum exec_mode mode );
extern void DEBUG_RestartExecution( struct sigcontext_struct *context,
enum exec_mode mode, int instr_len );
/* debugger/registers.c */
extern void DEBUG_SetRegister( enum debug_regs reg, int val );
extern int DEBUG_GetRegister( enum debug_regs reg );
extern void DEBUG_InfoRegisters(void);
/* debugger/stack.c */
extern void DEBUG_InfoStack(void);
extern void DEBUG_BackTrace(void);
/* debugger/dbg.y */
extern void wine_debug( int signal, struct sigcontext_struct * regs );
extern void print_address( unsigned int seg, unsigned int addr, int addrlen );
extern unsigned int db_disasm( unsigned int segment, unsigned int loc );
#endif /* DEBUGGER_H */

View File

@ -20,6 +20,25 @@ typedef struct
LOGFONT logfont WINE_PACKED;
} FONTOBJ;
/* may be switched... */
#define GGO_BITMAP 0x4F4D
#define GGO_NATIVE 0x4F50
typedef struct
{
UINT gmBlackBoxX;
UINT gmBlackBoxY;
POINT gmptGlyphOrigin;
int gmCellIncX;
int gmCellIncY;
} GLYPHMETRICS,*LPGLYPHMETRICS;
typedef struct
{
DWORD eM11; /* all type FIXED in Borlands Handbook */
DWORD eM12;
DWORD eM21;
DWORD eM22;
} MAT2,*LPMAT2;
#ifndef WINELIB
#pragma pack(4)
#endif

View File

@ -245,7 +245,7 @@ typedef struct tagDC
#ifdef WINELIB
#define GDI_HEAP_ALLOC(f,size) LocalAlloc (f,size)
#define GDI_HEAP_ALLOC(size) LocalAlloc (LMEM_FIXED,size)
#define GDI_HEAP_LIN_ADDR(handle) LocalLock (handle)
#define GDI_HEAP_SEG_ADDR(handle) LocalLock (handle)
#define GDI_HEAP_FREE(handle) LocalFree (handle)

View File

@ -47,19 +47,33 @@ extern ldt_copy_entry ldt_copy[LDT_SIZE];
#define __AHSHIFT 3
#define __AHINCR (1 << __AHSHIFT)
#ifndef WINELIB
#define SELECTOR_TO_ENTRY(sel) (((int)(sel) & 0xffff) >> __AHSHIFT)
#define ENTRY_TO_SELECTOR(i) ((i) ? (((int)(i) << __AHSHIFT) | 7) : 0)
#define IS_LDT_ENTRY_FREE(i) (!(ldt_copy[(i)].base || ldt_copy[(i)].limit))
#define IS_SELECTOR_FREE(sel) (IS_LDT_ENTRY_FREE(SELECTOR_TO_ENTRY(sel)))
#define GET_SEL_BASE(sel) (ldt_copy[SELECTOR_TO_ENTRY(sel)].base)
#define GET_SEL_LIMIT(sel) (ldt_copy[SELECTOR_TO_ENTRY(sel)].limit)
#else
/* Complain if these are used in WineLib */
#define SELECTOR_TO_ENTRY(sel) error.error
#define ENTRY_TO_SELECTOR(i) error.error
#define IS_LDT_ENTRY_FREE(i) error.error
#define GET_SEL_BASE(sel) error.error
#define GET_SEL_LIMIT(sel) error.error
#endif
#ifndef WINELIB
/* Convert a segmented ptr (16:16) to a linear (32) pointer */
#define PTR_SEG_TO_LIN(ptr) \
((void*)(GET_SEL_BASE((int)(ptr) >> 16) + ((int)(ptr) & 0xffff)))
#define PTR_SEG_OFF_TO_LIN(seg,off) \
((void*)(GET_SEL_BASE(seg) + (unsigned int)(off)))
#else
#define PTR_SEG_TO_LIN(ptr) ((void*)(ptr))
#define PTR_SEG_OFF_TO_LIN(seg,off) ((void*)(off))
#endif
extern unsigned char ldt_flags_copy[LDT_SIZE];

View File

@ -28,6 +28,8 @@ typedef struct {
HWND hParent;
HFONT hFont;
BOOL bRedrawFlag;
BOOL HasStrings;
BOOL OwnerDrawn;
WORD iNumStops;
LPINT TabStops;
HANDLE hDrawItemStruct;
@ -41,9 +43,6 @@ extern void DestroyListBoxStruct(LPHEADLIST lphl);
extern void ListBoxSendNotification(LPHEADLIST lphl,HWND hwnd, WORD code);
extern BOOL OWNER_DRAWN(LPHEADLIST lphl);
extern BOOL HasStrings(LPHEADLIST lphl);
extern LPLISTSTRUCT ListBoxGetItem(LPHEADLIST lphl, UINT uIndex);
extern int ListMaxFirstVisible(LPHEADLIST lphl);
extern int ListBoxScrollToFocus(LPHEADLIST lphl);

View File

@ -15,6 +15,7 @@ struct dosdirent {
char search_attribute;
long filesize;
long filetime;
int telldirnum;
short entnum; /* Directory entry number */
};

View File

@ -102,6 +102,7 @@ struct ne_segment_table_entry_s
#define NE_SEGFLAGS_DATA 0x0001
#define NE_SEGFLAGS_ALLOCATED 0x0002
#define NE_SEGFLAGS_LOADED 0x0004
#define NE_SEGFLAGS_ITERATED 0x0008
#define NE_SEGFLAGS_MOVEABLE 0x0010
#define NE_SEGFLAGS_SHAREABLE 0x0020
#define NE_SEGFLAGS_PRELOAD 0x0040

View File

@ -20,7 +20,6 @@ extern HBITMAP ConvertInfoBitmap( HDC hdc, BITMAPINFO * image );
/* loader/signal.c */
extern void init_wine_signals(void);
extern void wine_debug(int signal, int * regs);
/* loader/wine.c */

View File

@ -13,6 +13,7 @@
#define EDX (context->sc_edx)
#define ESI (context->sc_esi)
#define EDI (context->sc_edi)
#define EBP (context->sc_ebp)
#define AX (*(WORD*)&context->sc_eax)
#define BX (*(WORD*)&context->sc_ebx)
@ -20,6 +21,7 @@
#define DX (*(WORD*)&context->sc_edx)
#define SI (*(WORD*)&context->sc_esi)
#define DI (*(WORD*)&context->sc_edi)
#define BP (*(WORD*)&context->sc_ebp)
#define AL (*(BYTE*)&context->sc_eax)
#define AH (*(((BYTE*)&context->sc_eax)+1))
@ -37,8 +39,10 @@
#ifndef __FreeBSD__
#define EFL (context->sc_eflags)
#define FL (*(WORD*)&context->sc_eflags)
#else
#define EFL (context->sc_efl)
#define FL (*(WORD*)&context->sc_efl)
#endif
#define EIP (context->sc_eip)

View File

@ -57,6 +57,7 @@ extern DWORD IF1632_Saved32_esp;
extern SEGPTR IF1632_Stack32_base;
extern DWORD IF1632_Original32_esp;
#ifndef WINELIB
#define CURRENT_STACK16 \
((STACK16FRAME *)PTR_SEG_OFF_TO_LIN(IF1632_Saved16_ss,IF1632_Saved16_sp))
@ -67,5 +68,10 @@ extern DWORD IF1632_Original32_esp;
#define MAKE_SEGPTR(ptr) \
((SEGPTR)IF1632_Stack32_base + \
((DWORD)(ptr) - (DWORD)PTR_SEG_TO_LIN(IF1632_Stack32_base)))
#else
#define CURRENT_STACK16 error.error
#define CURRENT_DS 0
#define MAKE_SEGPTR(ptr) (ptr)
#endif
#endif /* WINE_STACKFRAME_H */

View File

@ -14,8 +14,8 @@
#ifdef WINELIB
#define USER_HEAP_ALLOC(f,size) LocalAlloc (f, size)
#define USER_HEAP_REALLOC(handle,size,f) LocalReAlloc (handle,size,f)
#define USER_HEAP_ALLOC(size) LocalAlloc (LMEM_FIXED, size)
#define USER_HEAP_REALLOC(handle,size) LocalReAlloc (handle,size,LMEM_FIXED)
#define USER_HEAP_LIN_ADDR(handle) LocalLock (handle)
#define USER_HEAP_SEG_ADDR(handle) LocalLock (handle)
#define USER_HEAP_FREE(handle) LocalFree (handle)

View File

@ -98,3 +98,7 @@
#define LOCALE_INEGSYMPRECEDES 0x00000056
#define LOCALE_INEGSEPBYSPACE 0x00000057
#define NORM_IGNORECASE 1
#define NORM_IGNORENONSPACE 2
#define NORM_IGNORESYMBOLS 4
#define NORM_STRINGSORT 0x1000

View File

@ -20,7 +20,6 @@ typedef struct
} DWP;
extern HWND WINPOS_NextWindowFromPoint( HWND hwnd, POINT pt );
extern HWND WINPOS_ChangeActiveWindow( HWND hwnd, BOOL mouseMsg );
extern LONG WINPOS_SendNCCalcSize( HWND hwnd, BOOL calcValidRect,
RECT *newWindowRect, RECT *oldWindowRect,

View File

@ -11,13 +11,13 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
#include <string.h>
#include <errno.h>
#include "windows.h"
#include "debugger.h"
#include "dos_fs.h"
#include "dlls.h"
#include "miscemu.h"
#include "neexe.h"
#include "wineopts.h"
#include "task.h"
#include "options.h"
#include "task.h"
#include "pe_image.h"
#include "stddebug.h"
#include "debug.h"
@ -115,7 +115,7 @@ int _WinMain(int argc, char **argv)
}
}
if (Options.debug) wine_debug(0, NULL);
if (Options.debug) DEBUG_SetBreakpoints( TRUE ); /* Setup breakpoints */
Yield(); /* Start the first task */
fprintf( stderr, "WinMain: Should never happen: returned from Yield()\n" );

View File

@ -50,6 +50,18 @@ BOOL NE_LoadSegment( HMODULE hModule, WORD segnum )
pModuleTable = NE_MODULE_TABLE( pModule );
if (!pSeg->filepos) return TRUE; /* No file image, just return */
if (pSeg->flags & NE_SEGFLAGS_ITERATED)
{
fprintf(stderr, "Sorry, iterated segments are not supported\n"
"Please report that %*.*s, segment %d is such a segment\n",
*((BYTE*)pModule + pModule->name_table),
*((BYTE*)pModule + pModule->name_table),
(char *)pModule + pModule->name_table + 1,
segnum
);
exit(1);
}
fd = MODULE_OpenFile( hModule );
dprintf_module( stddeb, "Loading segment %d, selector=%04x\n",
@ -277,6 +289,9 @@ BOOL NE_LoadSegment( HMODULE hModule, WORD segnum )
*/
void NE_FixupPrologs( HMODULE hModule )
{
#ifdef WINELIB
fprintf(stderr,"NE_FixupPrologs should not be called for libwine\n");
#else
NE_MODULE *pModule;
SEGTABLEENTRY *pSegTable;
WORD dgroup = 0;
@ -357,6 +372,7 @@ void NE_FixupPrologs( HMODULE hModule )
p += (sel == 0xff) ? 6 : 3;
}
}
#endif
}

View File

@ -343,14 +343,14 @@ HICON LoadIcon( HANDLE instance, SEGPTR icon_name )
if (rsc_mem == (HANDLE)NULL) {
printf("LoadIcon / Icon %08x not Found !\n", (int) icon_name);
return 0;
}
}
lp = (WORD *)LockResource(rsc_mem);
lpicodesc = (ICONDESCRIP *)(lp + 3);
hIcon = GlobalAlloc(GMEM_MOVEABLE, sizeof(ICONALLOC) + 1024);
if (hIcon == (HICON)NULL) {
FreeResource( rsc_mem );
return 0;
}
}
lpico = (ICONALLOC *)GlobalLock(hIcon);
lpico->descriptor = *lpicodesc;
width = lpicodesc->Width;
@ -373,20 +373,15 @@ HICON LoadIcon( HANDLE instance, SEGPTR icon_name )
lpico->hBitmap = CreateDIBitmap( hdc, &pInfo->bmiHeader, CBM_INIT,
(char*)bmi + size, pInfo, DIB_RGB_COLORS );
if (bih->biSizeImage == 0)
if (bih->biCompression != BI_RGB)
{
if (bih->biCompression != BI_RGB)
{
fprintf(stderr,"Unknown size for compressed Icon bitmap.\n");
FreeResource( rsc_mem );
ReleaseDC( 0, hdc);
return 0;
}
bih->biSizeImage = (DIB_GetImageWidthBytes(bih->biWidth,bih->biBitCount) +
DIB_GetImageWidthBytes(bih->biWidth,1)) * bih->biHeight/2;
fprintf(stderr,"Unknown size for compressed Icon bitmap.\n");
FreeResource( rsc_mem );
ReleaseDC( 0, hdc);
return 0;
}
bits = (char *)bmi + size +
bih->biSizeImage * bih->biBitCount / (bih->biBitCount+1);
DIB_GetImageWidthBytes(bih->biWidth,bih->biBitCount) * bih->biHeight;
bih->biBitCount = 1;
bih->biClrUsed = bih->biClrImportant = 2;
rgbq = &pInfo->bmiColors[0];

View File

@ -14,7 +14,7 @@
#include <syscall.h>
#endif
#include "wine.h"
#include "debugger.h"
#include "prototypes.h"
#include "miscemu.h"
#include "registers.h"
@ -53,37 +53,20 @@ static void win_fault(int signal, struct sigcontext_struct context_struct)
static void win_fault(int signal, int code, struct sigcontext *context)
{
#endif
#if !(defined (linux) || defined (__NetBSD__))
int i, *dump;
#endif
if(signal == SIGTRAP) EIP--; /* Back up over the int3 instruction. */
else if (CS == WINE_CODE_SELECTOR)
if (signal != SIGTRAP)
{
fprintf(stderr, "Segmentation fault in Wine program (%x:%lx)."
" Please debug\n", CS, EIP );
if (CS == WINE_CODE_SELECTOR)
{
fprintf(stderr, "Segmentation fault in Wine program (%x:%lx)."
" Please debug\n", CS, EIP );
}
else if (INSTR_EmulateInstruction( context )) return;
fprintf(stderr,"In win_fault %x:%lx\n", CS, EIP );
}
else if (INSTR_EmulateInstruction( context )) return;
XUngrabPointer(display, CurrentTime);
XUngrabServer(display);
XFlush(display);
fprintf(stderr,"In win_fault %x:%lx\n", CS, EIP );
#if defined(linux) || defined(__NetBSD__) || defined(__FreeBSD__)
wine_debug(signal, (int *)context); /* Enter our debugger */
#else
fprintf(stderr,"Stack: %x:%x\n", SS, ESP );
dump = (int*) context;
for(i=0; i<22; i++)
{
fprintf(stderr," %8.8x", *dump++);
if ((i % 8) == 7)
fprintf(stderr,"\n");
}
fprintf(stderr,"\n");
exit(1);
#endif
wine_debug( signal, context ); /* Enter our debugger */
}
void init_wine_signals(void)

View File

@ -10,14 +10,15 @@
#include "windows.h"
#include "task.h"
#include "callback.h"
#include "debugger.h"
#include "global.h"
#include "instance.h"
#include "miscemu.h"
#include "module.h"
#include "neexe.h"
#include "options.h"
#include "selectors.h"
#include "toolhelp.h"
#include "wine.h"
#include "stddebug.h"
#include "debug.h"
@ -220,6 +221,7 @@ static void TASK_CallToStart(void)
dprintf_task( stddeb, "Starting main program: cs:ip=%04x:%04x ds=%04x ss:sp=%04x:%04x\n",
cs_reg, ip_reg, ds_reg,
IF1632_Saved16_ss, IF1632_Saved16_sp);
CallTo16_regs_( (FARPROC)(cs_reg << 16 | ip_reg), ds_reg,
pTask->hPDB /*es*/, 0 /*bp*/, 0 /*ax*/,
pModule->stack_size /*bx*/, pModule->heap_size /*cx*/,
@ -365,6 +367,14 @@ HTASK TASK_CreateTask( HMODULE hModule, HANDLE hInstance, HANDLE hPrevInstance,
IF1632_Saved16_sp = pTask->sp;
}
/* Add a breakpoint at the start of the task */
if (Options.debug)
{
fprintf( stderr, "Task '%s': ", name );
DEBUG_AddBreakpoint( pSegTable[pModule->cs-1].selector, pModule->ip );
}
/* Add the task to the linked list */
TASK_LinkTask( hTask );
@ -891,6 +901,7 @@ HMODULE GetExePtr( HANDLE handle )
(pTask->hInstance == owner) ||
(pTask->hQueue == owner) ||
(pTask->hPDB == owner)) return pTask->hModule;
hTask = pTask->hNext;
}
return 0;
}

View File

@ -194,7 +194,7 @@ HGLOBAL GlobalReAlloc( HGLOBAL handle, DWORD size, WORD flags )
/* Discard the block if requested */
if ((size == 0) && (flags & GMEM_MOVEABLE))
if ((size == 0) && (flags & GMEM_MOVEABLE) && !(flags & GMEM_MODIFY))
{
if (!(pArena->flags & GA_MOVEABLE) ||
!(pArena->flags & GA_DISCARDABLE) ||

View File

@ -115,13 +115,13 @@ static LOCALHEAPINFO *LOCAL_GetHeap( WORD ds )
/***********************************************************************
* LOCAL_AddFreeBlock
* LOCAL_MakeBlockFree
*
* Make a block free, inserting it in the free-list.
* 'block' is the handle of the block arena; 'baseptr' points to
* the beginning of the data segment containing the heap.
*/
static void LOCAL_AddFreeBlock( char *baseptr, WORD block )
static void LOCAL_MakeBlockFree( char *baseptr, WORD block )
{
LOCALARENA *pArena, *pNext;
WORD next;
@ -308,7 +308,6 @@ HLOCAL LocalInit( WORD selector, WORD start, WORD end )
if (debugging_local) LOCAL_PrintHeap(selector);
}
#if 1
if (start == 0) {
/* Check if the segment is the DGROUP of a module */
@ -316,6 +315,10 @@ HLOCAL LocalInit( WORD selector, WORD start, WORD end )
{
SEGTABLEENTRY *pSeg = NE_SEG_TABLE( pModule ) + pModule->dgroup - 1;
if (pModule->dgroup && (pSeg->selector == selector)) {
/* We can't just use the simple method of using the value
* of minsize + stacksize, since there are programs that
* resize the data segment before calling InitTask(). So,
* we must put it at the end of the segment */
start = GlobalSize( GlobalHandle( selector ) );
start -= end;
end += start;
@ -323,7 +326,6 @@ HLOCAL LocalInit( WORD selector, WORD start, WORD end )
}
}
}
#endif
ptr = PTR_SEG_OFF_TO_LIN( selector, 0 );
start = LALIGN( max( start, sizeof(INSTANCEDATA) ) );
@ -489,9 +491,10 @@ static HLOCAL LOCAL_FindFreeBlock( WORD ds, WORD size )
arena = pInfo->first;
pArena = ARENA_PTR( ptr, arena );
while (arena != pArena->free_next) {
for (;;) {
arena = pArena->free_next;
pArena = ARENA_PTR( ptr, arena );
if (arena == pArena->free_next) break;
if (pArena->size >= size) return arena;
}
dprintf_local( stddeb, "Local_FindFreeBlock: not enough space\n" );
@ -539,13 +542,14 @@ static HLOCAL LOCAL_GetBlock( WORD ds, WORD size, WORD flags )
return 0;
}
dprintf_local( stddeb, "LOCAL_GetBlock size = %04x\n", size );
/* Make a block out of the free arena */
pArena = ARENA_PTR( ptr, arena );
dprintf_local( stddeb, "LOCAL_GetBlock size = %04x, arena at %04x size %04x\n", size,
arena, pArena->size );
if (pArena->size > size + LALIGN(sizeof(LOCALARENA)))
{
LOCAL_AddBlock( ptr, arena, arena+size );
LOCAL_AddFreeBlock( ptr, arena+size );
LOCAL_MakeBlockFree( ptr, arena+size );
pInfo->items++;
}
LOCAL_RemoveFreeBlock( ptr, arena );
@ -618,7 +622,7 @@ static HLOCAL LOCAL_GetNewHandle( WORD ds )
/***********************************************************************
* LOCAL_FreeArena
*/
HLOCAL LOCAL_FreeArena( WORD ds, WORD arena )
static HLOCAL LOCAL_FreeArena( WORD ds, WORD arena )
{
char *ptr = PTR_SEG_OFF_TO_LIN( ds, 0 );
LOCALHEAPINFO *pInfo;
@ -648,7 +652,7 @@ HLOCAL LOCAL_FreeArena( WORD ds, WORD arena )
}
else /* Make a new free block */
{
LOCAL_AddFreeBlock( ptr, arena );
LOCAL_MakeBlockFree( ptr, arena );
}
/* Check if we can merge with the next block */
@ -769,7 +773,7 @@ HLOCAL LOCAL_ReAlloc( WORD ds, HLOCAL handle, WORD size, WORD flags )
dprintf_local( stddeb, "size reduction, making new free block\n");
/* It is worth making a new free block */
LOCAL_AddBlock( ptr, arena, nextarena );
LOCAL_AddFreeBlock( ptr, nextarena );
LOCAL_MakeBlockFree( ptr, nextarena );
pInfo->items++;
}
dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", handle );
@ -788,7 +792,7 @@ HLOCAL LOCAL_ReAlloc( WORD ds, HLOCAL handle, WORD size, WORD flags )
dprintf_local( stddeb, "size increase, making new free block\n");
/* It is worth making a new free block */
LOCAL_AddBlock( ptr, arena, nextarena );
LOCAL_AddFreeBlock( ptr, nextarena );
LOCAL_MakeBlockFree( ptr, nextarena );
pInfo->items++;
}
dprintf_local( stddeb, "LocalReAlloc: returning %04x\n", handle );

View File

@ -18,6 +18,7 @@ SRCS = \
lstr.c \
main.c \
ole2.c \
ole2disp.c \
ole2nls.c \
olecli.c \
olesvr.c \

View File

@ -45,7 +45,10 @@
#define GET_ATOM_TABLE(sel) ((ATOMTABLE*)PTR_SEG_OFF_TO_LIN(sel, \
((INSTANCEDATA*)PTR_SEG_OFF_TO_LIN(sel,0))->atomtable))
#ifdef WINELIB
#define USER_HeapSel 0
#endif
/***********************************************************************
* ATOM_InitTable

View File

@ -64,38 +64,45 @@ BOOL GetOpenFileName(LPOPENFILENAME lpofn)
BOOL bRet;
LPCSTR dlgTemplate;
if (!FileDlg_Init()) return FALSE;
if (lpofn == NULL) return FALSE;
if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE) {
dlgTemplate = GlobalLock(lpofn->hInstance);
if (!dlgTemplate) {
CommDlgLastError = CDERR_LOADRESFAILURE;
return FALSE;
if (lpofn == NULL)
return FALSE;
if (!FileDlg_Init())
return FALSE;
if (lpofn->Flags & OFN_ENABLETEMPLATEHANDLE)
{
dlgTemplate = GlobalLock(lpofn->hInstance);
if (!dlgTemplate)
{
CommDlgLastError = CDERR_LOADRESFAILURE;
return FALSE;
}
}
} else {
if (lpofn->Flags & OFN_ENABLETEMPLATE) {
hInst = lpofn->hInstance;
hResInfo = FindResource(hInst, lpofn->lpTemplateName, RT_DIALOG);
if (hResInfo == 0) {
CommDlgLastError = CDERR_FINDRESFAILURE;
return FALSE;
}
hDlgTmpl = LoadResource(hInst, hResInfo);
if (hDlgTmpl == 0) {
CommDlgLastError = CDERR_LOADRESFAILURE;
return FALSE;
}
dlgTemplate = GlobalLock(hDlgTmpl);
} else {
dlgTemplate = sysres_DIALOG_3;
else
{
if (lpofn->Flags & OFN_ENABLETEMPLATE)
{
hInst = lpofn->hInstance;
hResInfo = FindResource(hInst, lpofn->lpTemplateName, RT_DIALOG);
if (hResInfo == 0)
{
CommDlgLastError = CDERR_FINDRESFAILURE;
return FALSE;
}
hDlgTmpl = LoadResource(hInst, hResInfo);
if (hDlgTmpl == 0)
{
CommDlgLastError = CDERR_LOADRESFAILURE;
return FALSE;
}
dlgTemplate = GlobalLock(hDlgTmpl);
}
else
dlgTemplate = sysres_DIALOG_3;
}
}
hInst = GetWindowWord(lpofn->hwndOwner, GWW_HINSTANCE);
bRet = DialogBoxIndirectParamPtr(hInst, dlgTemplate, lpofn->hwndOwner,
GetWndProcEntry16("FileOpenDlgProc"),
(DWORD)lpofn);
printf("GetOpenFileName // return lpstrFile='%s' !\n",
(LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFile));
return bRet;
@ -187,21 +194,28 @@ static BOOL FILEDLG_ScanDir(HWND hWnd, LPSTR newPath)
/***********************************************************************
* FILEDLG_GetFileType [internal]
*/
static LPSTR FILEDLG_GetFileType(LPSTR ptr, WORD index)
static LPSTR FILEDLG_GetFileType(LPSTR cfptr, LPSTR fptr, WORD index)
{
int n, i;
if (ptr == NULL) return NULL;
for (i = 1;;i++) {
n = strlen(ptr);
if (n == 0) break;
ptr += n + 1;
if (i == index) return ptr;
n = strlen(ptr);
ptr += n + 1;
int n, i;
i = 0;
if (cfptr)
for ( ;(n = strlen(cfptr)) != 0; i++)
{
cfptr += n + 1;
if (i == index)
return cfptr;
cfptr += strlen(cfptr) + 1;
}
if (fptr)
for ( ;(n = strlen(fptr)) != 0; i++)
{
fptr += n + 1;
if (i == index)
return fptr;
fptr += strlen(fptr) + 1;
}
return NULL;
return NULL;
}
/***********************************************************************
@ -301,19 +315,33 @@ static LONG FILEDLG_WMMeasureItem(HWND hWnd, WORD wParam, LONG lParam)
/***********************************************************************
* FILEDLG_WMInitDialog [internal]
*/
static LONG FILEDLG_WMInitDialog(HWND hWnd, WORD wParam, LONG lParam)
{
int n;
LPOPENFILENAME lpofn;
char tmpstr[512];
LPSTR pstr;
SetWindowLong(hWnd, DWL_USER, lParam);
lpofn = (LPOPENFILENAME)lParam;
/* read filter information */
pstr = (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFilter);
while(*pstr) {
int n;
LPOPENFILENAME lpofn;
char tmpstr[512];
LPSTR pstr;
SetWindowLong(hWnd, DWL_USER, lParam);
lpofn = (LPOPENFILENAME)lParam;
/* read custom filter information */
if (lpofn->lpstrCustomFilter)
{
pstr = (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter);
while(*pstr)
{
n = strlen(pstr);
strcpy(tmpstr, pstr);
SendDlgItemMessage(hWnd, cmb1, CB_ADDSTRING, 0, MAKE_SEGPTR(tmpstr));
pstr += n + 1;
n = strlen(pstr);
pstr += n + 1;
}
}
/* read filter information */
pstr = (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFilter);
while(*pstr)
{
n = strlen(pstr);
strcpy(tmpstr, pstr);
SendDlgItemMessage(hWnd, cmb1, CB_ADDSTRING, 0, MAKE_SEGPTR(tmpstr));
@ -321,44 +349,34 @@ static LONG FILEDLG_WMInitDialog(HWND hWnd, WORD wParam, LONG lParam)
n = strlen(pstr);
pstr += n + 1;
}
/* set default filter */
SendDlgItemMessage(hWnd, cmb1, CB_SETCURSEL,
lpofn->nFilterIndex - 1, 0);
strcpy(tmpstr, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrFilter),
lpofn->nFilterIndex));
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr));
/* get drive list */
strcpy(tmpstr,"");
DlgDirListComboBox(hWnd, MAKE_SEGPTR(tmpstr), cmb2, 0, 0xC000);
/* read initial directory */
if (PTR_SEG_TO_LIN(lpofn->lpstrInitialDir) != NULL) {
strcpy(tmpstr, PTR_SEG_TO_LIN(lpofn->lpstrInitialDir));
if (strlen(tmpstr) > 0 && tmpstr[strlen(tmpstr)-1] != '\\'
&& tmpstr[strlen(tmpstr)-1] != ':')
{
strcat(tmpstr,"\\");
}
} else {
strcpy(tmpstr,"");
/* set default filter */
SendDlgItemMessage(hWnd, cmb1, CB_SETCURSEL, 0, 0);
strcpy(tmpstr, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
PTR_SEG_TO_LIN(lpofn->lpstrFilter), 0));
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr));
/* get drive list */
*tmpstr = 0;
DlgDirListComboBox(hWnd, MAKE_SEGPTR(tmpstr), cmb2, 0, 0xC000);
/* read initial directory */
if (PTR_SEG_TO_LIN(lpofn->lpstrInitialDir) != NULL)
{
strcpy(tmpstr, PTR_SEG_TO_LIN(lpofn->lpstrInitialDir));
if (strlen(tmpstr) > 0 && tmpstr[strlen(tmpstr)-1] != '\\'
&& tmpstr[strlen(tmpstr)-1] != ':')
strcat(tmpstr,"\\");
}
if (!FILEDLG_ScanDir(hWnd, tmpstr)) {
fprintf(stderr, "FileDlg: couldn't read initial directory!\n");
}
/* select current drive in combo 2 */
n = DOS_GetDefaultDrive();
SendDlgItemMessage(hWnd, cmb2, CB_SETCURSEL, n, 0);
if (!(lpofn->Flags & OFN_SHOWHELP)) {
ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
}
if (lpofn->Flags & OFN_HIDEREADONLY) {
ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
}
return TRUE;
else
*tmpstr = 0;
if (!FILEDLG_ScanDir(hWnd, tmpstr))
fprintf(stderr, "FileDlg: couldn't read initial directory!\n");
/* select current drive in combo 2 */
n = DOS_GetDefaultDrive();
SendDlgItemMessage(hWnd, cmb2, CB_SETCURSEL, n - 1, 0);
if (!(lpofn->Flags & OFN_SHOWHELP))
ShowWindow(GetDlgItem(hWnd, pshHelp), SW_HIDE);
if (lpofn->Flags & OFN_HIDEREADONLY)
ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE);
return TRUE;
}
/***********************************************************************
@ -366,167 +384,183 @@ static LONG FILEDLG_WMInitDialog(HWND hWnd, WORD wParam, LONG lParam)
*/
static LONG FILEDLG_WMCommand(HWND hWnd, WORD wParam, LONG lParam)
{
LONG lRet;
LPOPENFILENAME lpofn;
char tmpstr[512], tmpstr2[512];
LPSTR pstr, pstr2;
LONG lRet;
LPOPENFILENAME lpofn;
char tmpstr[512], tmpstr2[512];
LPSTR pstr, pstr2;
lpofn = (LPOPENFILENAME)GetWindowLong(hWnd, DWL_USER);
switch (wParam) {
case lst1:
FILEDLG_StripEditControl(hWnd);
if (HIWORD(lParam) == LBN_DBLCLK) {
lRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0);
if (lRet == LB_ERR) return TRUE;
SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, lRet, MAKE_SEGPTR(tmpstr));
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr));
return SendMessage(hWnd, WM_COMMAND, IDOK, 0);
}
return TRUE;
case lst2:
FILEDLG_StripEditControl(hWnd);
if (HIWORD(lParam) == LBN_DBLCLK) {
lRet = SendDlgItemMessage(hWnd, lst2, LB_GETCURSEL, 0, 0);
if (lRet == LB_ERR) return TRUE;
SendDlgItemMessage(hWnd, lst2, LB_GETTEXT, lRet, MAKE_SEGPTR(tmpstr));
if (tmpstr[0] == '[') {
tmpstr[strlen(tmpstr) - 1] = 0;
strcpy(tmpstr,tmpstr+1);
lpofn = (LPOPENFILENAME)GetWindowLong(hWnd, DWL_USER);
switch (wParam)
{
case lst1: /* file list */
FILEDLG_StripEditControl(hWnd);
if (HIWORD(lParam) == LBN_DBLCLK)
goto almost_ok;
lRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0);
if (lRet == LB_ERR) return TRUE;
SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, lRet,
MAKE_SEGPTR(tmpstr));
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr));
return TRUE;
case lst2: /* directory list */
FILEDLG_StripEditControl(hWnd);
if (HIWORD(lParam) == LBN_DBLCLK)
{
lRet = SendDlgItemMessage(hWnd, lst2, LB_GETCURSEL, 0, 0);
if (lRet == LB_ERR) return TRUE;
SendDlgItemMessage(hWnd, lst2, LB_GETTEXT, lRet,
MAKE_SEGPTR(tmpstr));
if (tmpstr[0] == '[')
{
tmpstr[strlen(tmpstr) - 1] = 0;
strcpy(tmpstr,tmpstr+1);
}
strcat(tmpstr, "\\");
FILEDLG_ScanDir(hWnd, tmpstr);
strcat(tmpstr, "\\");
goto reset_scan;
}
return TRUE;
case cmb1:
if (HIWORD(lParam) == CBN_SELCHANGE) {
lRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0);
if (lRet == LB_ERR) return TRUE;
strcpy(tmpstr, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrFilter),
lRet + 1));
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr));
FILEDLG_ScanDir(hWnd, "");
return TRUE;
case cmb1: /* file type drop list */
if (HIWORD(lParam) == CBN_SELCHANGE)
{
*tmpstr = 0;
goto reset_scan;
}
return TRUE;
case cmb2: /* disk drop list */
FILEDLG_StripEditControl(hWnd);
lRet = SendDlgItemMessage(hWnd, cmb2, CB_GETCURSEL, 0, 0L);
if (lRet == LB_ERR) return 0;
SendDlgItemMessage(hWnd, cmb2, CB_GETLBTEXT, lRet, MAKE_SEGPTR(tmpstr));
sprintf(tmpstr, "%c:", tmpstr[2]);
reset_scan:
lRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0);
if (lRet == LB_ERR)
return TRUE;
case cmb2:
FILEDLG_StripEditControl(hWnd);
lRet = SendDlgItemMessage(hWnd, cmb2, CB_GETCURSEL, 0, 0L);
if (lRet == LB_ERR) return 0;
SendDlgItemMessage(hWnd, cmb2, CB_GETLBTEXT, lRet, MAKE_SEGPTR(tmpstr));
sprintf(tmpstr, "%c:", tmpstr[2]);
FILEDLG_ScanDir(hWnd, tmpstr);
return TRUE;
case chx1:
return TRUE;
case pshHelp:
return TRUE;
case IDOK:
SendDlgItemMessage(hWnd, edt1, WM_GETTEXT, 511, MAKE_SEGPTR(tmpstr));
pstr = strrchr(tmpstr, '\\');
if (pstr == NULL) pstr = strrchr(tmpstr, ':');
if (strchr(tmpstr,'*') != NULL || strchr(tmpstr,'?') != NULL) {
/* edit control contains wildcards */
if (pstr != NULL) {
strcpy(tmpstr2, pstr+1);
*(pstr+1) = 0;
} else {
strcpy(tmpstr2, tmpstr);
strcpy(tmpstr, "");
pstr = FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
PTR_SEG_TO_LIN(lpofn->lpstrFilter),
lRet);
strcpy(tmpstr2, pstr);
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr2));
FILEDLG_ScanDir(hWnd, tmpstr);
return TRUE;
case chx1:
return TRUE;
case pshHelp:
return TRUE;
case IDOK:
almost_ok:
SendDlgItemMessage(hWnd, edt1, WM_GETTEXT, 511, MAKE_SEGPTR(tmpstr));
pstr = strrchr(tmpstr, '\\');
if (pstr == NULL)
pstr = strrchr(tmpstr, ':');
if (strchr(tmpstr,'*') != NULL || strchr(tmpstr,'?') != NULL)
{
/* edit control contains wildcards */
if (pstr != NULL)
{
strcpy(tmpstr2, pstr+1);
*(pstr+1) = 0;
}
printf("commdlg: %s, %s\n", tmpstr, tmpstr2);
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr2));
FILEDLG_ScanDir(hWnd, tmpstr);
return TRUE;
else
{
strcpy(tmpstr2, tmpstr);
strcpy(tmpstr, "");
}
printf("commdlg: %s, %s\n", tmpstr, tmpstr2);
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr2));
FILEDLG_ScanDir(hWnd, tmpstr);
return TRUE;
}
/* no wildcards, we might have a directory or a filename */
/* try appending a wildcard and reading the directory */
pstr2 = tmpstr + strlen(tmpstr);
if (pstr == NULL || *(pstr+1) != 0) {
strcat(tmpstr, "\\");
/* no wildcards, we might have a directory or a filename */
/* try appending a wildcard and reading the directory */
pstr2 = tmpstr + strlen(tmpstr);
if (pstr == NULL || *(pstr+1) != 0)
strcat(tmpstr, "\\");
lRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0);
if (lRet == LB_ERR) return TRUE;
strcpy(tmpstr2,
FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter),
PTR_SEG_TO_LIN(lpofn->lpstrFilter),
lRet));
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr2));
/* if ScanDir succeeds, we have changed the directory */
if (FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE;
/* if not, this must be a filename */
*pstr2 = 0;
if (pstr != NULL)
{
/* strip off the pathname */
*pstr = 0;
strcpy(tmpstr2, pstr+1);
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr2));
/* Should we MessageBox() if this fails? */
if (!FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE;
strcpy(tmpstr, tmpstr2);
}
lRet = SendDlgItemMessage(hWnd, cmb1, CB_GETCURSEL, 0, 0);
if (lRet == LB_ERR) return TRUE;
strcpy(tmpstr2, FILEDLG_GetFileType(PTR_SEG_TO_LIN(lpofn->lpstrFilter),
lRet + 1));
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr2));
/* if ScanDir succeeds, we have changed the directory */
if (FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE;
/* if not, this must be a filename */
*pstr2 = 0;
if (pstr != NULL) {
/* strip off the pathname */
*pstr = 0;
strcpy(tmpstr2, pstr+1);
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr2));
/* Should we MessageBox() if this fails? */
if (!FILEDLG_ScanDir(hWnd, tmpstr)) return TRUE;
strcpy(tmpstr, tmpstr2);
} else {
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr));
else
SendDlgItemMessage(hWnd, edt1, WM_SETTEXT, 0, MAKE_SEGPTR(tmpstr));
ShowWindow(hWnd, SW_HIDE);
{
int drive;
drive = DOS_GetDefaultDrive();
tmpstr2[0] = 'A'+ drive;
tmpstr2[1] = ':';
tmpstr2[2] = '\\';
strcpy(tmpstr2 + 3, DOS_GetCurrentDir(drive));
if (strlen(tmpstr2) > 3)
strcat(tmpstr2, "\\");
strcat(tmpstr2, tmpstr);
strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFile), tmpstr2);
}
lpofn->nFileOffset = 0;
lpofn->nFileExtension = strlen(PTR_SEG_TO_LIN(lpofn->lpstrFile)) - 3;
if (PTR_SEG_TO_LIN(lpofn->lpstrFileTitle) != NULL)
{
lRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0);
SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, lRet,
MAKE_SEGPTR(tmpstr));
strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFileTitle), tmpstr);
}
ShowWindow(hWnd, SW_HIDE);
strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFile), tmpstr);
lpofn->nFileOffset = 0;
lpofn->nFileExtension = strlen(PTR_SEG_TO_LIN(lpofn->lpstrFile)) - 3;
if (PTR_SEG_TO_LIN(lpofn->lpstrFileTitle) != NULL) {
lRet = SendDlgItemMessage(hWnd, lst1, LB_GETCURSEL, 0, 0);
SendDlgItemMessage(hWnd, lst1, LB_GETTEXT, lRet, MAKE_SEGPTR(tmpstr));
strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFileTitle), tmpstr);
}
EndDialog(hWnd, TRUE);
return TRUE;
case IDCANCEL:
EndDialog(hWnd, FALSE);
return TRUE;
EndDialog(hWnd, TRUE);
return TRUE;
case IDCANCEL:
EndDialog(hWnd, FALSE);
return TRUE;
}
return FALSE;
return FALSE;
}
/***********************************************************************
* FileOpenDlgProc [COMMDLG.6]
*/
BOOL FileOpenDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
{
switch (wMsg) {
case WM_INITDIALOG:
switch (wMsg)
{
case WM_INITDIALOG:
return FILEDLG_WMInitDialog(hWnd, wParam, lParam);
case WM_MEASUREITEM:
case WM_MEASUREITEM:
return FILEDLG_WMMeasureItem(hWnd, wParam, lParam);
case WM_DRAWITEM:
case WM_DRAWITEM:
return FILEDLG_WMDrawItem(hWnd, wParam, lParam);
case WM_COMMAND:
case WM_COMMAND:
return FILEDLG_WMCommand(hWnd, wParam, lParam);
}
/*
case WM_CTLCOLOR:
SetBkColor((HDC)wParam, 0x00C0C0C0);
switch (HIWORD(lParam))
{
case CTLCOLOR_BTN:
SetTextColor((HDC)wParam, 0x00000000);
return hGRAYBrush;
case CTLCOLOR_STATIC:
SetTextColor((HDC)wParam, 0x00000000);
return hGRAYBrush;
}
return FALSE;
*/
#if 0
case WM_CTLCOLOR:
SetBkColor((HDC)wParam, 0x00C0C0C0);
switch (HIWORD(lParam))
{
case CTLCOLOR_BTN:
SetTextColor((HDC)wParam, 0x00000000);
return hGRAYBrush;
case CTLCOLOR_STATIC:
SetTextColor((HDC)wParam, 0x00000000);
return hGRAYBrush;
}
break;
#endif
}
return FALSE;
}
@ -589,24 +623,25 @@ BOOL ChooseColor(LPCHOOSECOLOR lpChCol)
*/
BOOL ColorDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
{
switch (wMsg) {
case WM_INITDIALOG:
printf("ColorDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
ShowWindow(hWnd, SW_SHOWNORMAL);
return (TRUE);
case WM_COMMAND:
switch (wParam) {
case IDOK:
EndDialog(hWnd, TRUE);
return(TRUE);
case IDCANCEL:
EndDialog(hWnd, FALSE);
return(TRUE);
}
return(FALSE);
}
return FALSE;
switch (wMsg)
{
case WM_INITDIALOG:
printf("ColorDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
ShowWindow(hWnd, SW_SHOWNORMAL);
return (TRUE);
case WM_COMMAND:
switch (wParam)
{
case IDOK:
EndDialog(hWnd, TRUE);
return(TRUE);
case IDCANCEL:
EndDialog(hWnd, FALSE);
return(TRUE);
}
return(FALSE);
}
return FALSE;
}
@ -651,23 +686,24 @@ BOOL ReplaceText(LPFINDREPLACE lpFind)
*/
BOOL FindTextDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
{
switch (wMsg) {
case WM_INITDIALOG:
printf("FindTextDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
ShowWindow(hWnd, SW_SHOWNORMAL);
return (TRUE);
case WM_COMMAND:
switch (wParam) {
case IDOK:
EndDialog(hWnd, TRUE);
return(TRUE);
case IDCANCEL:
EndDialog(hWnd, FALSE);
return(TRUE);
switch (wMsg)
{
case WM_INITDIALOG:
printf("FindTextDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
ShowWindow(hWnd, SW_SHOWNORMAL);
return (TRUE);
case WM_COMMAND:
switch (wParam)
{
case IDOK:
EndDialog(hWnd, TRUE);
return(TRUE);
case IDCANCEL:
EndDialog(hWnd, FALSE);
return(TRUE);
}
return(FALSE);
}
return(FALSE);
}
return FALSE;
}
@ -677,23 +713,24 @@ BOOL FindTextDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
*/
BOOL ReplaceTextDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
{
switch (wMsg) {
case WM_INITDIALOG:
printf("ReplaceTextDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
ShowWindow(hWnd, SW_SHOWNORMAL);
return (TRUE);
case WM_COMMAND:
switch (wParam) {
case IDOK:
EndDialog(hWnd, TRUE);
return(TRUE);
case IDCANCEL:
EndDialog(hWnd, FALSE);
return(TRUE);
switch (wMsg)
{
case WM_INITDIALOG:
printf("ReplaceTextDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
ShowWindow(hWnd, SW_SHOWNORMAL);
return (TRUE);
case WM_COMMAND:
switch (wParam)
{
case IDOK:
EndDialog(hWnd, TRUE);
return(TRUE);
case IDCANCEL:
EndDialog(hWnd, FALSE);
return(TRUE);
}
return(FALSE);
}
return(FALSE);
}
return FALSE;
}
@ -731,23 +768,24 @@ BOOL PrintDlg(LPPRINTDLG lpPrint)
*/
BOOL PrintDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
{
switch (wMsg) {
case WM_INITDIALOG:
printf("PrintDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
ShowWindow(hWnd, SW_SHOWNORMAL);
return (TRUE);
case WM_COMMAND:
switch (wParam) {
case IDOK:
EndDialog(hWnd, TRUE);
return(TRUE);
case IDCANCEL:
EndDialog(hWnd, FALSE);
return(TRUE);
switch (wMsg)
{
case WM_INITDIALOG:
printf("PrintDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
ShowWindow(hWnd, SW_SHOWNORMAL);
return (TRUE);
case WM_COMMAND:
switch (wParam)
{
case IDOK:
EndDialog(hWnd, TRUE);
return(TRUE);
case IDCANCEL:
EndDialog(hWnd, FALSE);
return(TRUE);
}
return(FALSE);
}
return(FALSE);
}
return FALSE;
}
@ -757,23 +795,23 @@ BOOL PrintDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
*/
BOOL PrintSetupDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
{
switch (wMsg) {
case WM_INITDIALOG:
printf("PrintSetupDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
ShowWindow(hWnd, SW_SHOWNORMAL);
return (TRUE);
case WM_COMMAND:
switch (wParam) {
case IDOK:
EndDialog(hWnd, TRUE);
return(TRUE);
case IDCANCEL:
EndDialog(hWnd, FALSE);
return(TRUE);
switch (wMsg)
{
case WM_INITDIALOG:
printf("PrintSetupDlgProc // WM_INITDIALOG lParam=%08lX\n", lParam);
ShowWindow(hWnd, SW_SHOWNORMAL);
return (TRUE);
case WM_COMMAND:
switch (wParam) {
case IDOK:
EndDialog(hWnd, TRUE);
return(TRUE);
case IDCANCEL:
EndDialog(hWnd, FALSE);
return(TRUE);
}
return(FALSE);
}
return(FALSE);
}
return FALSE;
}
@ -783,7 +821,7 @@ BOOL PrintSetupDlgProc(HWND hWnd, WORD wMsg, WORD wParam, LONG lParam)
*/
DWORD CommDlgExtendError(void)
{
return CommDlgLastError;
return CommDlgLastError;
}
@ -792,27 +830,29 @@ DWORD CommDlgExtendError(void)
*/
int GetFileTitle(LPCSTR lpFile, LPSTR lpTitle, UINT cbBuf)
{
int i, len;
printf("GetFileTitle(%p %p %d); \n", lpFile, lpTitle, cbBuf);
if (lpFile == NULL || lpTitle == NULL) return -1;
len = strlen(lpFile);
if (len == 0) return -1;
if (strchr(lpFile, '*') != NULL) return -1;
if (strchr(lpFile, '[') != NULL) return -1;
if (strchr(lpFile, ']') != NULL) return -1;
len--;
if (lpFile[len] == '/' || lpFile[len] == '\\' || lpFile[len] == ':') return -1;
for (i = len; i >= 0; i--) {
if (lpFile[i] == '/' || lpFile[i] == '\\' || lpFile[i] == ':') {
i++;
break;
}
}
printf("\n---> '%s' ", &lpFile[i]);
len = min(cbBuf, strlen(&lpFile[i]) + 1);
strncpy(lpTitle, &lpFile[i], len + 1);
if (len != cbBuf)
return len;
else
return 0;
int i, len;
printf("GetFileTitle(%p %p %d); \n", lpFile, lpTitle, cbBuf);
if (lpFile == NULL || lpTitle == NULL)
return -1;
len = strlen(lpFile);
if (len == 0)
return -1;
if (strpbrk(lpFile, "*[]"))
return -1;
len--;
if (lpFile[len] == '/' || lpFile[len] == '\\' || lpFile[len] == ':')
return -1;
for (i = len; i >= 0; i--)
if (lpFile[i] == '/' || lpFile[i] == '\\' || lpFile[i] == ':')
{
i++;
break;
}
printf("\n---> '%s' ", &lpFile[i]);
len = min(cbBuf, strlen(&lpFile[i]) + 1);
strncpy(lpTitle, &lpFile[i], len + 1);
if (len != cbBuf)
return len;
else
return 0;
}

View File

@ -14,6 +14,8 @@
#include "stddebug.h"
#include "debug.h"
DWORD currentMalloc=0;
/***********************************************************************
* CoBuildVersion [COMPOBJ.1]
*/
@ -25,10 +27,13 @@ DWORD WINAPI CoBuildVersion()
/***********************************************************************
* CoInitialize [COMPOBJ.2]
* lpReserved is an IMalloc pointer in 16bit OLE. We just stored it as-is.
*/
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
HRESULT WINAPI CoInitialize(DWORD lpReserved)
{
dprintf_ole(stdnimp,"CoInitialize\n");
/* remember the LPMALLOC, maybe somebody wants to read it later on */
currentMalloc = lpReserved;
return S_OK;
}
@ -40,6 +45,21 @@ void CoUnitialize()
dprintf_ole(stdnimp,"CoUnitialize()\n");
}
/***********************************************************************
* CoGetMalloc [COMPOBJ.4]
*/
HRESULT WINAPI CoGetMalloc(DWORD dwMemContext, DWORD * lpMalloc)
{
if(currentMalloc)
{
*lpMalloc = currentMalloc;
return S_OK;
}
*lpMalloc = 0;
/* 16-bit E_NOTIMPL */
return 0x80000001L;
}
/***********************************************************************
* CoDisconnectObject
*/

View File

@ -35,13 +35,13 @@
#include "debug.h"
#define WINE_INI_USER "~/.winerc"
#define MAX_OPEN_DIRS 16
#define MAX_DOS_DRIVES 26
extern char WindowsDirectory[256], SystemDirectory[256],TempDirectory[256];
char WindowsPath[256];
static int max_open_dirs = 0;
static int CurrentDrive = 2;
struct DosDriveStruct { /* eg: */
@ -53,7 +53,7 @@ struct DosDriveStruct { /* eg: */
};
static struct DosDriveStruct DosDrives[MAX_DOS_DRIVES];
static struct dosdirent DosDirs[MAX_OPEN_DIRS];
static struct dosdirent *DosDirs=NULL;
static void ExpandTildeString(char *s)
{
@ -221,7 +221,7 @@ void DOS_InitFS(void)
}
}
for (x=0; x!=MAX_OPEN_DIRS ; x++)
for (x=0; x!=max_open_dirs ; x++)
DosDirs[x].inuse = 0;
dprintf_dosfs(stddeb,"wine.ini = %s\n",WINE_INI);
@ -869,6 +869,7 @@ struct dosdirent *DOS_opendir(char *dosdirname)
int x,y;
char *unixdirname;
char temp[256];
DIR *ds;
if ((unixdirname = DOS_GetUnixFileName(dosdirname)) == NULL)
return NULL;
@ -885,10 +886,15 @@ struct dosdirent *DOS_opendir(char *dosdirname)
}
}
for (x=0; x <= MAX_OPEN_DIRS; x++) {
if (x == MAX_OPEN_DIRS) {
fprintf( stderr, "DOS_opendir(): Too many open directories\n");
return NULL;
for (x=0; x <= max_open_dirs; x++) {
if (x == max_open_dirs) {
if (DosDirs) {
DosDirs=(struct dosdirent*)realloc(DosDirs,(++max_open_dirs)*sizeof(DosDirs[0]));
} else {
DosDirs=(struct dosdirent*)malloc(sizeof(DosDirs[0]));
max_open_dirs=1;
}
break; /* this one is definitely not in use */
}
if (!DosDirs[x].inuse) break;
if (strcmp(DosDirs[x].unixpath,temp) == 0) break;
@ -903,7 +909,13 @@ struct dosdirent *DOS_opendir(char *dosdirname)
strcpy(DosDirs[x].unixpath, temp);
DosDirs[x].entnum = 0;
if ((DosDirs[x].ds = opendir(temp)) == NULL)
if ((ds = opendir(temp)) == NULL)
return NULL;
if (-1==(DosDirs[x].telldirnum=telldir(ds))) {
closedir(ds);
return NULL;
}
if (-1==closedir(ds))
return NULL;
return &DosDirs[x];
@ -915,13 +927,19 @@ struct dosdirent *DOS_readdir(struct dosdirent *de)
char temp[256];
struct dirent *d;
struct stat st;
DIR *ds;
if (!de->inuse)
return NULL;
if (-1==(ds=opendir(de->unixpath)))
return NULL;
seekdir(ds,de->telldirnum); /* returns no error value. strange */
do {
if ((d = readdir(de->ds)) == NULL)
if ((d = readdir(ds)) == NULL) {
de->telldirnum=telldir(ds);
closedir(ds);
return NULL;
}
de->entnum++; /* Increment the directory entry number */
strcpy(de->filename, d->d_name);
@ -944,16 +962,15 @@ struct dosdirent *DOS_readdir(struct dosdirent *de)
de->filesize = st.st_size;
de->filetime = st.st_mtime;
de->telldirnum = telldir(ds);
closedir(ds);
return de;
}
void DOS_closedir(struct dosdirent *de)
{
if (de && de->inuse)
{
closedir(de->ds);
de->inuse = 0;
}
}
char *DOS_GetRedirectedDir(int drive)

View File

@ -75,7 +75,7 @@ INT _lread (INT hFile, LPSTR lpBuffer, WORD wBytes)
dprintf_file(stddeb, "_lread: handle %d, buffer = %ld, length = %d\n",
hFile, (long) lpBuffer, wBytes);
result = read (hFile, lpBuffer, wBytes);
result = wBytes == 0 ? 0 : read (hFile, lpBuffer, wBytes);
if (result == -1)
return HFILE_ERROR;
@ -93,7 +93,7 @@ INT _lwrite (INT hFile, LPCSTR lpBuffer, WORD wBytes)
dprintf_file(stddeb, "_lwrite: handle %d, buffer = %ld, length = %d\n",
hFile, (long) lpBuffer, wBytes);
result = write (hFile, lpBuffer, wBytes);
result = wBytes == 0 ? 0 : write (hFile, lpBuffer, wBytes);
if (result == -1)
return HFILE_ERROR;
@ -438,12 +438,12 @@ WORD SetErrorMode(WORD x)
***************************************************************************/
LONG _hread(INT hf, LPSTR hpvBuffer, LONG cbBuffer)
{
return read(hf, hpvBuffer, cbBuffer);
return cbBuffer == 0 ? 0 : read(hf, hpvBuffer, cbBuffer);
}
/***************************************************************************
_hwrite
***************************************************************************/
LONG _hwrite(INT hf, LPCSTR hpvBuffer, LONG cbBuffer)
{
return write(hf, hpvBuffer, cbBuffer);
return cbBuffer == 0 ? 0 : write(hf, hpvBuffer, cbBuffer);
}

View File

@ -224,6 +224,7 @@ BOOL ParseDebugOptions(char *options)
#endif
#ifndef WINELIB
/***********************************************************************
* MAIN_ParseDLLOptions
*
@ -258,6 +259,7 @@ static BOOL MAIN_ParseDLLOptions(char *options)
else
return TRUE;
}
#endif
@ -347,6 +349,7 @@ static void MAIN_ParseOptions( int *argc, char *argv[] )
}
if(MAIN_GetResource( db, ".dll", &value))
#ifndef WINELIB
if(MAIN_ParseDLLOptions((char*)value.addr)==FALSE)
{
int i;
@ -359,6 +362,9 @@ static void MAIN_ParseOptions( int *argc, char *argv[] )
fprintf(stderr,"\n\n");
exit(1);
}
#else
fprintf(stderr,"-dll not supported in libwine\n");
#endif
}
@ -559,7 +565,7 @@ LONG GetVersion(void)
LONG GetWinFlags(void)
{
if (Options.enhanced)
return (WF_STANDARD | WF_ENHANCED | WF_CPU286 | WF_PMODE | WF_80x87);
return (WF_STANDARD | WF_ENHANCED | WF_CPU386 | WF_PMODE | WF_80x87);
else
return (WF_STANDARD | WF_CPU286 | WF_PMODE | WF_80x87);
}

105
misc/ole2disp.c Normal file
View File

@ -0,0 +1,105 @@
/*
* OLE2DISP library
*
* Copyright 1995 Martin von Loewis
*/
#include "windows.h"
#include "ole2.h"
#include "global.h"
#include "local.h"
#include "ldt.h"
#include "stddebug.h"
#include "debug.h"
/* This implementation of the BSTR API is 16-bit only. It
represents BSTR as a 16:16 far pointer, and the strings
as ISO-8859 */
typedef DWORD BSTR;
HGLOBAL BSTRheapsel=0;
#define BSTR_HEAP_SIZE 65536
static BSTR BSTR_AllocBytes(int n)
{
HLOCAL mem;
if(!BSTRheapsel)
{
BSTRheapsel=GlobalAlloc(GMEM_FIXED,BSTR_HEAP_SIZE);
LocalInit(BSTRheapsel,0,BSTR_HEAP_SIZE-1);
}
if(!BSTRheapsel)
return 0;
mem=LOCAL_Alloc(BSTRheapsel,LMEM_FIXED,n);
return mem ? MAKELONG(mem,BSTRheapsel) : 0;
}
static void BSTR_Free(BSTR in)
{
LOCAL_Free(BSTRheapsel, LOWORD(in));
}
static void* BSTR_GetAddr(BSTR in)
{
return in ? PTR_SEG_TO_LIN(in) : 0;
}
/***********************************************************************
* SysAllocString [OLE2DISP.2]
*/
BSTR SysAllocString(char *in)
{
BSTR out=BSTR_AllocBytes(strlen(in)+1);
if(!out)return 0;
strcpy(BSTR_GetAddr(out),in);
return out;
}
/***********************************************************************
* SysReAllocString [OLE2DISP.3]
*/
int SysReAllocString(BSTR *old,char *in)
{
BSTR new=SysAllocString(in);
BSTR_Free(*old);
*old=new;
return 1;
}
/***********************************************************************
* SysAllocStringLen [OLE2DISP.4]
*/
BSTR SysAllocStringLen(char *in, int len)
{
BSTR out=BSTR_AllocBytes(len+1);
if(!out)return 0;
strcpy(BSTR_GetAddr(out),in);
return out;
}
/***********************************************************************
* SysReAllocStringLen [OLE2DISP.5]
*/
int SysReAllocStringLen(BSTR *old,char *in,int len)
{
BSTR new=SysAllocStringLen(in,len);
BSTR_Free(*old);
*old=new;
return 1;
}
/***********************************************************************
* SysFreeString [OLE2DISP.6]
*/
void SysFreeString(BSTR in)
{
BSTR_Free(in);
}
/***********************************************************************
* SysStringLen [OLE2DISP.7]
*/
int SysStringLen(BSTR str)
{
return strlen(BSTR_GetAddr(str));
}

View File

@ -237,7 +237,7 @@ LOCVAL(LOCALE_INEGCURR,"8")
LOCVAL(LOCALE_SDATE,".")
LOCVAL(LOCALE_STIME,":")
LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
LOCVAL(LOCALE_SLONGDATEi,"ddd, d. MMMM yyyy")
LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
/*
LOCVAL(LOCALE_STIMEFORMAT)
*/
@ -329,3 +329,35 @@ LOCVAL(LOCALE_INEGSEPBYSPACE)
strncpy(buf,retString,len);
return retLen;
}
/***********************************************************************
* CompareStringA (OLE2NLS.8)
* This implementation ignores the locale, and trusts in libc
*/
int CompareStringA(DWORD lcid, DWORD fdwStyle,
char *s1, int l1, char *s2,int l2)
{
int len,ret;
if(fdwStyle & NORM_IGNORENONSPACE)
{
fprintf(stdnimp, "CompareStringA: IGNORENONSPACE not supprted\n");
}
if(fdwStyle & NORM_IGNORESYMBOLS)
fprintf(stdnimp, "CompareStringA: IGNORESYMBOLS not supported\n");
/* Is strcmp defaulting to string sort or to word sort?? */
/* FIXME: Handle NORM_STRINGSORT */
l1 = (l1==-1)?strlen(s1):l1;
l2 = (l2==-1)?strlen(s2):l2;
len = l1<l2 ? l1:l2;
ret = (fdwStyle & NORM_IGNORECASE) ?
strncasecmp(s1,s2,len) :
strncmp(s1,s2,len);
/* not equal, return 1 or 3 */
if(ret!=0)return ret+2;
/* same len, return 2 */
if(l1==l2)return 2;
/* the longer one is lexically greater */
return (l1<l2)? 1 : 3;
}

View File

@ -184,6 +184,9 @@ static TSecHeader *load (char *filename, char **pfullname)
state = IgnoreToEOL;
break;
}
if (c == '\n')
break;
if (c == '=' || overflow){
TKeys *temp;
@ -197,8 +200,9 @@ static TSecHeader *load (char *filename, char **pfullname)
state = KeyValue;
next = CharBuffer;
dprintf_profile(stddeb,"%s: key %s\n", file, CharBuffer);
} else
} else {
*next++ = c;
}
break;
case KeyValue:
@ -293,6 +297,7 @@ static short GetSetProfile (int set, LPSTR AppName, LPSTR KeyName,
}
ReturnedString [Size-1] = 0;
strncpy (ReturnedString, key->Value, Size-1);
dprintf_profile(stddeb,"GetSetProfile // Return ``%s''\n", ReturnedString);
return 1;
}
/* If Getting the information, then don't write the information
@ -303,6 +308,7 @@ static short GetSetProfile (int set, LPSTR AppName, LPSTR KeyName,
else {
ReturnedString [Size-1] = 0;
strncpy (ReturnedString, Default, Size-1);
dprintf_profile(stddeb,"GetSetProfile // Key not found\n");
}
return 1;
}
@ -318,6 +324,7 @@ static short GetSetProfile (int set, LPSTR AppName, LPSTR KeyName,
} else {
ReturnedString [Size-1] = 0;
strncpy (ReturnedString, Default, Size-1);
dprintf_profile(stddeb,"GetSetProfile // Section not found\n");
}
return 1;
}

View File

@ -13,7 +13,6 @@
#include "dlgs.h"
#include "dialog.h"
#include "stddebug.h"
/* #define DEBUG_REG */
#include "debug.h"
LPKEYSTRUCT lphRootKey = NULL,lphTopKey = NULL;
@ -185,7 +184,7 @@ LONG RegCreateKey(HKEY hKey, LPCSTR lpSubKey, HKEY FAR *lphKey)
LONG RegCloseKey(HKEY hKey)
{
dprintf_reg(stdnimp, "EMPTY STUB !!! RegCloseKey(%08lX);\n", hKey);
return ERROR_INVALID_PARAMETER;
return ERROR_SUCCESS;
}
@ -196,7 +195,7 @@ LONG RegDeleteKey(HKEY hKey, LPCSTR lpSubKey)
{
dprintf_reg(stdnimp, "EMPTY STUB !!! RegDeleteKey(%08lX, '%s');\n",
hKey, lpSubKey);
return ERROR_INVALID_PARAMETER;
return ERROR_SUCCESS;
}
@ -204,29 +203,29 @@ LONG RegDeleteKey(HKEY hKey, LPCSTR lpSubKey)
* RegSetValue [SHELL.5]
*/
LONG RegSetValue(HKEY hKey, LPCSTR lpSubKey, DWORD dwType,
LPCSTR lpVal, DWORD dwIgnored)
LPCSTR lpVal, DWORD dwIgnored)
{
HKEY hRetKey;
LPKEYSTRUCT lpKey;
LONG dwRet;
dprintf_reg(stddeb, "RegSetValue(%08lX, '%s', %08lX, '%s', %08lX);\n",
hKey, lpSubKey, dwType, lpVal, dwIgnored);
if (lpSubKey == NULL) return ERROR_INVALID_PARAMETER;
if (lpVal == NULL) return ERROR_INVALID_PARAMETER;
if ((dwRet = RegOpenKey(hKey, lpSubKey, &hRetKey)) != ERROR_SUCCESS) {
dprintf_reg(stddeb, "RegSetValue // key not found ... so create it !\n");
if ((dwRet = RegCreateKey(hKey, lpSubKey, &hRetKey)) != ERROR_SUCCESS) {
fprintf(stderr, "RegSetValue // key creation error %08lX !\n", dwRet);
return dwRet;
}
}
lpKey = (LPKEYSTRUCT)GlobalLock(hRetKey);
if (lpKey == NULL) return ERROR_BADKEY;
if (lpKey->lpValue != NULL) free(lpKey->lpValue);
lpKey->lpValue = malloc(strlen(lpVal) + 1);
strcpy(lpKey->lpValue, lpVal);
dprintf_reg(stddeb,"RegSetValue // successful key='%s' val='%s' !\n", lpSubKey, lpKey->lpValue);
return ERROR_SUCCESS;
HKEY hRetKey;
LPKEYSTRUCT lpKey;
LONG dwRet;
dprintf_reg(stddeb, "RegSetValue(%08lX, '%s', %08lX, '%s', %08lX);\n",
hKey, lpSubKey, dwType, lpVal, dwIgnored);
if (lpSubKey == NULL) return ERROR_INVALID_PARAMETER;
if (lpVal == NULL) return ERROR_INVALID_PARAMETER;
if ((dwRet = RegOpenKey(hKey, lpSubKey, &hRetKey)) != ERROR_SUCCESS) {
dprintf_reg(stddeb, "RegSetValue // key not found ... so create it !\n");
if ((dwRet = RegCreateKey(hKey, lpSubKey, &hRetKey)) != ERROR_SUCCESS) {
fprintf(stderr, "RegSetValue // key creation error %08lX !\n", dwRet);
return dwRet;
}
}
lpKey = (LPKEYSTRUCT)GlobalLock(hRetKey);
if (lpKey == NULL) return ERROR_BADKEY;
if (lpKey->lpValue != NULL) free(lpKey->lpValue);
lpKey->lpValue = malloc(strlen(lpVal) + 1);
strcpy(lpKey->lpValue, lpVal);
dprintf_reg(stddeb,"RegSetValue // successful key='%s' val='%s' !\n", lpSubKey, lpKey->lpValue);
return ERROR_SUCCESS;
}
@ -249,7 +248,7 @@ LONG RegQueryValue(HKEY hKey, LPCSTR lpSubKey, LPSTR lpVal, LONG FAR *lpcb)
if ((dwRet = RegOpenKey(hKey, lpSubKey, &hRetKey)) != ERROR_SUCCESS) {
fprintf(stderr, "RegQueryValue // key not found !\n");
return dwRet;
}
}
lpKey = (LPKEYSTRUCT)GlobalLock(hRetKey);
if (lpKey == NULL) return ERROR_BADKEY;
if (lpKey->lpValue != NULL) {

View File

@ -24,6 +24,7 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993";
#define USER_HEAP_SIZE 0x10000
#ifndef WINELIB
LPSTR USER_Heap = NULL;
WORD USER_HeapSel = 0;
@ -73,7 +74,6 @@ BOOL SystemHeapInfo( SYSHEAPINFO *pHeapInfo )
}
#ifndef WINELIB
/***********************************************************************
* USER_HeapInit
*/

View File

@ -98,6 +98,10 @@ BOOL INSTR_EmulateInstruction( struct sigcontext_struct *context )
case 0x67:
long_addr = !long_addr; /* addr size prefix */
break;
case 0xf0: /* lock */
case 0xf2: /* repne */
case 0xf3: /* repe */
break;
default:
prefix = 0; /* no more prefixes */
break;
@ -115,6 +119,7 @@ BOOL INSTR_EmulateInstruction( struct sigcontext_struct *context )
{
case 0xcd: /* int <XX> */
instr++;
/* FIXME: should check if handler has been changed */
if (!do_int(*instr, context))
{
fprintf(stderr,"Unexpected Windows interrupt %x\n", *instr);

View File

@ -437,7 +437,8 @@ static void ioctlGenericBlkDevReq(struct sigcontext_struct *context)
drive = BL - 1;
if (!DOS_ValidDrive(drive)) {
AX = 0x02;
Error( FileNotFound, EC_NotFound, EL_Disk );
AX = FileNotFound;
SetCflag;
return;
}
@ -502,7 +503,7 @@ static void GetExtendedErrorInfo(struct sigcontext_struct *context)
{
AX = ExtendedError;
BX = (ErrorClass << 8) | Action;
CH = ErrorLocus << 8;
CH = ErrorLocus;
}
static void CreateFile(struct sigcontext_struct *context)
@ -656,15 +657,17 @@ static void MakeDir(struct sigcontext_struct *context)
dprintf_int(stddeb,"int21: makedir %s\n", (char *)PTR_SEG_OFF_TO_LIN(DS,DX) );
if ((dirname = DOS_GetUnixFileName( PTR_SEG_OFF_TO_LIN(DS,DX) ))== NULL) {
AX = CanNotMakeDir;
SetCflag;
return;
Error( CanNotMakeDir, EC_AccessDenied, EL_Disk );
AX = CanNotMakeDir;
SetCflag;
return;
}
if (mkdir(dirname,0) == -1) {
AX = CanNotMakeDir;
SetCflag;
return;
Error( CanNotMakeDir, EC_AccessDenied, EL_Disk );
AX = CanNotMakeDir;
SetCflag;
return;
}
ResetCflag;
}
@ -693,9 +696,10 @@ static void RemoveDir(struct sigcontext_struct *context)
dprintf_int(stddeb,"int21: removedir %s\n", (char *)PTR_SEG_OFF_TO_LIN(DS,DX) );
if ((dirname = DOS_GetUnixFileName( PTR_SEG_OFF_TO_LIN(DS,DX) ))== NULL) {
AX = PathNotFound;
SetCflag;
return;
Error( PathNotFound, EC_NotFound, EL_Disk );
AX = PathNotFound;
SetCflag;
return;
}
/*
@ -705,9 +709,10 @@ static void RemoveDir(struct sigcontext_struct *context)
}
*/
if (rmdir(dirname) == -1) {
AX = AccessDenied;
SetCflag;
return;
Error( AccessDenied, EC_AccessDenied, EL_Disk );
AX = AccessDenied;
SetCflag;
return;
}
ResetCflag;
}
@ -839,9 +844,10 @@ static void CreateTempFile(struct sigcontext_struct *context)
handle = open(DOS_GetUnixFileName(temp), O_CREAT | O_TRUNC | O_RDWR);
if (handle == -1) {
AX = WriteProtected;
SetCflag;
return;
Error( WriteProtected, EC_AccessDenied, EL_Disk );
AX = WriteProtected;
SetCflag;
return;
}
strcpy(PTR_SEG_OFF_TO_LIN(DS,DX), temp);
@ -855,9 +861,10 @@ static void CreateNewFile(struct sigcontext_struct *context)
int handle;
if ((handle = open(DOS_GetUnixFileName( PTR_SEG_OFF_TO_LIN(DS,DX) ), O_CREAT | O_EXCL | O_RDWR)) == -1) {
AX = WriteProtected;
SetCflag;
return;
Error( WriteProtected, EC_AccessDenied, EL_Disk );
AX = WriteProtected;
SetCflag;
return;
}
AX = handle;
@ -874,9 +881,10 @@ static void GetCurrentDirectory(struct sigcontext_struct *context)
drive = DL - 1;
if (!DOS_ValidDrive(drive)) {
AX = InvalidDrive;
SetCflag;
return;
Error( InvalidDrive, EC_NotFound, EL_Disk );
AX = InvalidDrive;
SetCflag;
return;
}
strcpy(PTR_SEG_OFF_TO_LIN(DS,SI), DOS_GetCurrentDir(drive) );
@ -895,9 +903,10 @@ static void GetDiskSerialNumber(struct sigcontext_struct *context)
drive = BL - 1;
if (!DOS_ValidDrive(drive)) {
AX =InvalidDrive;
SetCflag;
return;
Error( InvalidDrive, EC_NotFound, EL_Disk );
AX = InvalidDrive;
SetCflag;
return;
}
DOS_GetSerialNumber(drive, &serialnumber);
@ -923,9 +932,10 @@ static void SetDiskSerialNumber(struct sigcontext_struct *context)
drive = BL - 1;
if (!DOS_ValidDrive(drive)) {
AX = InvalidDrive;
SetCflag;
return;
Error( InvalidDrive, EC_NotFound, EL_Disk );
AX = InvalidDrive;
SetCflag;
return;
}
serialnumber = dataptr[1] + (dataptr[2] << 8) + (dataptr[3] << 16) +
@ -1477,8 +1487,9 @@ int do_int21(struct sigcontext_struct * context)
drive = BL ? (BL - 1) : DOS_GetDefaultDrive();
if(!DOS_ValidDrive(drive))
{
Error( InvalidDrive, EC_NotFound, EL_Disk );
AX = InvalidDrive;
SetCflag;
AX = 0x000F; /* Bad drive number */
}
else
{
@ -1494,8 +1505,9 @@ int do_int21(struct sigcontext_struct * context)
drive = BL ? (BL - 1) : DOS_GetDefaultDrive();
if(!DOS_ValidDrive(drive))
{
Error( InvalidDrive, EC_NotFound, EL_Disk );
AX = InvalidDrive;
SetCflag;
AX = 0x000F; /* Bad drive number */
}
else
{

View File

@ -4,12 +4,12 @@
* Copyright 1995 Alexandre Julliard
*/
#include "miscemu.h"
#include "registers.h"
#include "wine.h"
#include "miscemu.h"
#include "stddebug.h"
/* #define DEBUG_INT */
#include "debug.h"
#include "registers.h"
/***********************************************************************

View File

@ -1034,6 +1034,16 @@ BOOL BITBLT_InternalStretchBlt( DC *dcDst, short xDst, short yDst,
yDst = dcDst->w.DCOrgY + YLPTODP( dcDst, yDst );
widthDst = widthDst * dcDst->w.VportExtX / dcDst->w.WndExtX;
heightDst = heightDst * dcDst->w.VportExtY / dcDst->w.WndExtY;
dprintf_bitblt( stddeb, " vportdst=%d,%d-%d,%d wnddst=%d,%d-%d,%d\n",
dcDst->w.VportOrgX, dcDst->w.VportOrgY,
dcDst->w.VportExtX, dcDst->w.VportExtY,
dcDst->w.WndOrgX, dcDst->w.WndOrgY,
dcDst->w.WndExtX, dcDst->w.WndExtY );
dprintf_bitblt( stddeb, " rectdst=%d,%d-%d,%d orgdst=%d,%d\n",
xDst, yDst, widthDst, heightDst,
dcDst->w.DCOrgX, dcDst->w.DCOrgY );
if (useSrc)
{
xSrc = dcSrc->w.DCOrgX + XLPTODP( dcSrc, xSrc );
@ -1041,10 +1051,23 @@ BOOL BITBLT_InternalStretchBlt( DC *dcDst, short xDst, short yDst,
widthSrc = widthSrc * dcSrc->w.VportExtX / dcSrc->w.WndExtX;
heightSrc = heightSrc * dcSrc->w.VportExtY / dcSrc->w.WndExtY;
fStretch = (widthSrc != widthDst) || (heightSrc != heightDst);
dprintf_bitblt( stddeb," vportsrc=%d,%d-%d,%d wndsrc=%d,%d-%d,%d\n",
dcSrc->w.VportOrgX, dcSrc->w.VportOrgY,
dcSrc->w.VportExtX, dcSrc->w.VportExtY,
dcSrc->w.WndOrgX, dcSrc->w.WndOrgY,
dcSrc->w.WndExtX, dcSrc->w.WndExtY );
dprintf_bitblt( stddeb, " rectsrc=%d,%d-%d,%d orgsrc=%d,%d\n",
xSrc, ySrc, widthSrc, heightSrc,
dcSrc->w.DCOrgX, dcSrc->w.DCOrgY );
if (!BITBLT_GetVisRectangles( dcDst, xDst, yDst, widthDst, heightDst,
dcSrc, xSrc, ySrc, widthSrc, heightSrc,
&visRectSrc, &visRectDst ))
return TRUE;
dprintf_bitblt( stddeb, " vissrc=%d,%d-%d,%d visdst=%d,%d-%d,%d\n",
visRectSrc.left, visRectSrc.top,
visRectSrc.right, visRectSrc.bottom,
visRectDst.left, visRectDst.top,
visRectDst.right, visRectDst.bottom );
}
else
{
@ -1052,6 +1075,9 @@ BOOL BITBLT_InternalStretchBlt( DC *dcDst, short xDst, short yDst,
if (!BITBLT_GetVisRectangles( dcDst, xDst, yDst, widthDst, heightDst,
NULL, 0, 0, 0, 0, NULL, &visRectDst ))
return TRUE;
dprintf_bitblt( stddeb, " vissrc=none visdst=%d,%d-%d,%d\n",
visRectDst.left, visRectDst.top,
visRectDst.right, visRectDst.bottom );
}
width = visRectDst.right - visRectDst.left;
@ -1240,12 +1266,7 @@ BOOL BitBlt( HDC hdcDst, short xDst, short yDst, short width, short height,
"BitBlt: %04x %d,%d %d bpp -> %04x %d,%d %dx%dx%d rop=%06lx\n",
hdcSrc, xSrc, ySrc, dcSrc ? dcSrc->w.bitsPerPixel : 0,
hdcDst, xDst, yDst, width, height, dcDst->w.bitsPerPixel, rop);
if (dcSrc != NULL) {
dprintf_bitblt(stddeb," src org=%d,%d",
dcSrc->w.DCOrgX, dcSrc->w.DCOrgY);
}
dprintf_bitblt(stddeb," dst org=%d,%d\n", dcDst->w.DCOrgX,
dcDst->w.DCOrgY);
return CallTo32_LargeStack( (int(*)())BITBLT_InternalStretchBlt, 11,
dcDst, xDst, yDst, width, height,
dcSrc, xSrc, ySrc, width, height, rop );

View File

@ -541,9 +541,19 @@ int StretchDIBits( HDC hdc,
WORD xSrc, WORD ySrc, WORD wSrcWidth, WORD wSrcHeight,
LPSTR bits, LPBITMAPINFO info, WORD wUsage, DWORD dwRop )
{
printf("StretchDIBits // call SetDIBitsToDevice for now !!!!\n");
return SetDIBitsToDevice(hdc, xDest, yDest, wDestWidth, wDestHeight,
xSrc, ySrc, 1, 1, bits, info, wUsage);
HBITMAP hBitmap, hOldBitmap;
HDC hdcMem;
hBitmap = CreateDIBitmap( hdc, &info->bmiHeader, CBM_INIT,
bits, info, wUsage );
hdcMem = CreateCompatibleDC( hdc );
hOldBitmap = SelectObject( hdcMem, hBitmap );
StretchBlt( hdc, xDest, yDest, wDestWidth, wDestHeight,
hdcMem, xSrc, ySrc, wSrcWidth, wSrcHeight, dwRop );
SelectObject( hdcMem, hOldBitmap );
DeleteDC( hdcMem );
DeleteObject( hBitmap );
return wSrcHeight;
}
/***********************************************************************

View File

@ -259,6 +259,34 @@ void FONT_GetMetrics( LOGFONT * logfont, XFontStruct * xfont,
metrics->tmAveCharWidth = average;
}
/***********************************************************************
* GetGlyphOutLine (GDI.309)
*/
DWORD GetGlyphOutLine(
HDC hdc, UINT uChar, UINT fuFormat, LPGLYPHMETRICS lpgm,
DWORD cbBuffer, LPSTR lpBuffer, LPMAT2 lpmat2
) {
dprintf_font(stdnimp,"GetGlyphOutLine(0x%x, '%c', 0x%x, %p, %d, %p, %p) // - empty stub!\n",
hdc,uChar,fuFormat,lpgm,cbBuffer,lpBuffer,lpmat2
);
return (DWORD)-1; /* failure */
}
/***********************************************************************
* CreateScalableFontResource (GDI.310)
*/
BOOL CreateScalableFontResource(
UINT fHidden,LPSTR lpszResourceFile,
LPSTR lpszFontFile,LPSTR lpszCurrentPath
) {
/* fHidden=1 - only visible for the calling app, read-only, not
* enumbered with EnumFonts/EnumFontFamilies
* lpszCurrentPath can be NULL
*/
dprintf_font(stdnimp,"CreateScalableFontResource(%d,%s,%s,%x(%s)) // empty stub!\n",
fHidden,lpszResourceFile,lpszFontFile,lpszCurrentPath
);
return FALSE; /* create failed */
}
/***********************************************************************
* CreateFontIndirect (GDI.57)

View File

@ -11,6 +11,7 @@
#include <X11/xpm.h>
#include "gdi.h"
#include "bitmap.h"
#include "callback.h"
#include "color.h"
#include "icon.h"
#include "stddebug.h"
@ -280,9 +281,10 @@ HBITMAP OBM_LoadBitmap( WORD id )
if (!OBM_InitColorSymbols()) return 0;
if (!OBM_CreateBitmaps( OBM_Pixmaps_Data[id].data,
OBM_Pixmaps_Data[id].color,
FALSE, &hbitmap, &hbitmask ))
if (!CallTo32_LargeStack( (int(*)())OBM_CreateBitmaps, 5,
OBM_Pixmaps_Data[id].data,
OBM_Pixmaps_Data[id].color,
FALSE, &hbitmap, &hbitmask ))
{
fprintf( stderr, "Error creating OEM bitmap %d\n", OBM_FIRST+id );
return 0;
@ -308,8 +310,9 @@ HICON OBM_LoadIcon( WORD id )
if (!(hicon = GlobalAlloc( GMEM_MOVEABLE, sizeof(ICONALLOC) ))) return 0;
pIcon = (ICONALLOC *)GlobalLock( hicon );
if (!OBM_CreateBitmaps( OBM_Icons_Data[id], TRUE, TRUE,
&pIcon->hBitmap, &pIcon->hBitMask ))
if (!CallTo32_LargeStack( (int(*)())OBM_CreateBitmaps, 5,
OBM_Icons_Data[id], TRUE, TRUE,
&pIcon->hBitmap, &pIcon->hBitMask ))
{
fprintf( stderr, "Error creating OEM icon %d\n", OIC_FIRST+id );
GlobalFree( hicon );

View File

@ -49,6 +49,8 @@ LOCAL_LIBRARIES = -ll
NormalProgramTarget(winerc,$(OBJS),$(DEPLIBS),$(LOCAL_LIBRARIES),)
depend:: y.tab.c y.tab.h lex.yy.c
DependTarget()
clean::

View File

@ -16,7 +16,13 @@
#include "parser.h"
#include "y.tab.h"
char usage[]="winerc -dvc -p prefix -o outfile < infile \n";
char usage[]="winerc -bdvc -p prefix -o outfile < infile \n"
" -b Create a C array from a binary .res file\n"
" -d Output debugging information\n"
" -p prefix Give a prefix for the generated names\n"
" -v Show each resource as it is processed\n"
" -o file Output to file.c and file.h\n";
/*might be overwritten by command line*/
char *prefix="_Resource";
@ -29,16 +35,18 @@ int main(int argc,char *argv[])
{
extern int yydebug;
extern char* optarg;
int optc,lose,ret;
lose=0;
int optc,lose,ret,binary;
lose=binary=0;
#if defined(__NetBSD__) || defined(__FreeBSD__)
while((optc=getopt(argc,argv,"dp:vo:"))!=EOF)
while((optc=getopt(argc,argv,"bdp:vo:"))!=EOF)
#else
while((optc=getopt(argc,argv,"dp:vo:",0))!=EOF)
while((optc=getopt(argc,argv,"bdp:vo:",0))!=EOF)
#endif
switch(optc)
{
/* bison will print state transitions on stderr */
case 'b':binary=1;
break;
case 'd':yydebug=1;
setbuf(stdout,0);
setbuf(stderr,0);
@ -54,7 +62,10 @@ int main(int argc,char *argv[])
if(lose)return fprintf(stderr,usage),1;
if(!header)header=stdout;
if(!code)code=stdout;
ret=yyparse();
if(binary)
ret=transform_binary_file();
else
ret=yyparse();
fclose(header);
fclose(code);
return ret;
@ -68,6 +79,20 @@ void set_out_file(char *prefix)
header=fopen(hname,"w");
}
int transform_binary_file()
{
int i,c;
fprintf(header,"#define APPLICATION_HAS_RESOURCES 1\n");
fprintf(code,"char _Application_resources[]={");
for(i=0;;i++)
{
c=getchar();
if(c==-1)break;
if(i%16==0)fputc('\n',code);
fprintf(code,"%3d,",c);
}
fprintf(code,"\n0}\nint _Aplication_resources_size=%d;\n",i);
}
/* SunOS' memcpy is wrong for overlapping arrays */
char *save_memcpy(char *d,char* s,int l)

View File

@ -115,7 +115,7 @@ BOOL LocalInit (WORD segment, WORD start, WORD end)
return 1;
}
char *LocalLock (HANDLE hMem)
WORD LocalLock (HANDLE hMem)
{
void **m = HEAP_FindSlot (hMem);
#ifdef DEBUG_HEAP

View File

@ -4,6 +4,7 @@
#include "callback.h"
#include "wine.h"
#include "arch.h"
#include "neexe.h"
LONG CallWindowProc (WNDPROC func, HWND hwnd, WORD message,
WORD wParam, LONG lParam)
@ -24,9 +25,8 @@ LONG CallWindowProc (WNDPROC func, HWND hwnd, WORD message,
void load_mz_header (int fd, struct mz_header_s *mz_header)
{
#define TAB mz_header
LOAD (dont_care1);
LOAD (must_be_0x40);
LOAD (dont_care2);
LOAD (mz_magic);
LOAD (dont_care);
LOADSHORT (ne_offset);
}
@ -34,7 +34,7 @@ void load_ne_header (int fd, struct ne_header_s *ne_header)
{
#undef TAB
#define TAB ne_header
LOAD (header_type);
LOAD (ne_magic);
LOADSHORT (linker_version);
LOADSHORT (linker_revision);
LOADSHORT (entry_tab_offset);

View File

@ -10,6 +10,8 @@ _WinMain (int argc, char *argv [])
char filename [4096], *module_name, *resource_file;
HANDLE hTaskMain, hInstance;
/* The libwine resource DLL is temporarily disabled */
#if 0
if ((module_name = strchr (argv [0], '/')) == NULL){
printf ("Error: Can't determine base name for resource loading\n");
return 0;
@ -20,9 +22,12 @@ _WinMain (int argc, char *argv [])
strcat (resource_file, ".dll");
hInstance = LoadImage (resource_file, 0, 0);
#endif
USER_InitApp( hInstance );
#if 0
hTaskMain = CreateNewTask (1); /* This is not correct */
#endif
ret_val = WinMain (hInstance, /* hInstance */
0, /* hPrevInstance */
"", /* lpszCmdParam */

View File

@ -1544,7 +1544,9 @@ static void BuildCall16Func( char *profile )
{
/* Set ax equal to ds for window procedures */
printf( "\tmovw 16(%%ebx),%%ax\n" );
/* printf( "\tmovw %%ax,%%ds\n" ); */
/* This seems to be needed, although I still don't see why... */
printf( "\tmovw %%ax,%%ds\n" );
}
/* Jump to the called routine */

View File

@ -332,9 +332,8 @@ BOOL Rectangle( HDC hdc, int left, int top, int right, int bottom )
* RoundRect (GDI.28)
*/
BOOL RoundRect( HDC hDC, short left, short top, short right, short bottom,
short ell_width, short ell_height)
short ell_width, short ell_height )
{
int x1, y1, x2, y2;
DC * dc = (DC *) GDI_GetObjPtr(hDC, DC_MAGIC);
if (!dc)
{
@ -346,59 +345,103 @@ BOOL RoundRect( HDC hDC, short left, short top, short right, short bottom,
}
dprintf_graphics(stddeb, "RoundRect(%d %d %d %d %d %d\n",
left, top, right, bottom, ell_width, ell_height);
x1 = XLPTODP(dc, left);
y1 = YLPTODP(dc, top);
x2 = XLPTODP(dc, right - ell_width);
y2 = YLPTODP(dc, bottom - ell_height);
left = XLPTODP( dc, left );
top = YLPTODP( dc, top );
right = XLPTODP( dc, right );
bottom = YLPTODP( dc, bottom );
ell_width = abs( ell_width * dc->w.VportExtX / dc->w.WndExtX );
ell_height = abs( ell_height * dc->w.VportExtY / dc->w.WndExtY );
/* Fix the coordinates */
if (left > right) { short t = left; left = right; right = t; }
if (top > bottom) { short t = top; top = bottom; bottom = t; }
if (ell_width > right - left) ell_width = right - left;
if (ell_height > bottom - top) ell_height = bottom - top;
if (DC_SetupGCForBrush( dc ))
{
XFillArc(display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + x1, dc->w.DCOrgY + y1,
ell_width, ell_height, 90 * 64, 90 * 64);
XFillArc(display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + x1, dc->w.DCOrgY + y2,
ell_width, ell_height, 180 * 64, 90 * 64);
XFillArc(display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + x2, dc->w.DCOrgY + y2,
ell_width, ell_height, 270 * 64, 90 * 64);
XFillArc(display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + x2, dc->w.DCOrgY + y1,
ell_width, ell_height, 0, 90 * 64);
ell_width /= 2; ell_height /= 2;
XFillRectangle(display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + left + ell_width, dc->w.DCOrgY + top,
right - left - 2 * ell_width, bottom - top);
XFillRectangle(display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + left, dc->w.DCOrgY + top + ell_height,
ell_width, bottom - top - 2 * ell_height);
XFillRectangle(display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + right - ell_width, dc->w.DCOrgY + top + ell_height,
ell_width, bottom - top - 2 * ell_height);
ell_width *= 2; ell_height *= 2;
}
if (DC_SetupGCForPen(dc)) {
XDrawArc(display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + x1, dc->w.DCOrgY + y1,
ell_width, ell_height, 90 * 64, 90 * 64);
XDrawArc(display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + x1, dc->w.DCOrgY + y2,
ell_width, ell_height, 180 * 64, 90 * 64);
XDrawArc(display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + x2, dc->w.DCOrgY + y2,
ell_width, ell_height, 270 * 64, 90 * 64);
XDrawArc(display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + x2, dc->w.DCOrgY + y1,
ell_width, ell_height, 0, 90 * 64);
if (ell_width && ell_height)
{
XFillArc( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
ell_width, ell_height, 90 * 64, 90 * 64 );
XFillArc( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + left, dc->w.DCOrgY + bottom - ell_height,
ell_width, ell_height, 180 * 64, 90 * 64 );
XFillArc( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + right - ell_width,
dc->w.DCOrgY + bottom - ell_height,
ell_width, ell_height, 270 * 64, 90 * 64 );
XFillArc( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + right - ell_width, dc->w.DCOrgY + top,
ell_width, ell_height, 0, 90 * 64 );
}
if (ell_width < right - left)
{
XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + left + ell_width / 2,
dc->w.DCOrgY + top,
right - left - ell_width, ell_height / 2 );
XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + left + ell_width / 2,
dc->w.DCOrgY + bottom - (ell_height+1) / 2,
right - left - ell_width, (ell_height+1) / 2 );
}
if (ell_height < bottom - top)
{
XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + left,
dc->w.DCOrgY + top + ell_height / 2,
right - left, bottom - top - ell_height );
}
}
if (DC_SetupGCForPen(dc))
{
if (ell_width && ell_height)
{
XDrawArc( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
ell_width, ell_height, 90 * 64, 90 * 64 );
XDrawArc( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + left, dc->w.DCOrgY + bottom - ell_height,
ell_width, ell_height, 180 * 64, 90 * 64 );
XDrawArc( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + right - ell_width,
dc->w.DCOrgY + bottom - ell_height,
ell_width, ell_height, 270 * 64, 90 * 64 );
XDrawArc( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + right - ell_width, dc->w.DCOrgY + top,
ell_width, ell_height, 0, 90 * 64 );
}
ell_width /= 2; ell_height /= 2;
MoveTo(hDC, left, top + ell_height);
LineTo(hDC, left, bottom - ell_height);
MoveTo(hDC, left + ell_width, bottom);
LineTo(hDC, right - ell_width, bottom);
MoveTo(hDC, right, bottom - ell_height);
LineTo(hDC, right, top + ell_height);
MoveTo(hDC, right - ell_width, top);
LineTo(hDC, left + ell_width, top);
if (ell_width < right - left)
{
XDrawLine( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + left + ell_width / 2,
dc->w.DCOrgY + top,
dc->w.DCOrgX + right - ell_width / 2,
dc->w.DCOrgY + top );
XDrawLine( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + left + ell_width / 2,
dc->w.DCOrgY + bottom,
dc->w.DCOrgX + right - ell_width / 2,
dc->w.DCOrgY + bottom );
}
if (ell_height < bottom - top)
{
XDrawLine( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + right,
dc->w.DCOrgY + top + ell_height / 2,
dc->w.DCOrgX + right,
dc->w.DCOrgY + bottom - ell_height / 2 );
XDrawLine( display, dc->u.x.drawable, dc->u.x.gc,
dc->w.DCOrgX + left,
dc->w.DCOrgY + top + ell_height / 2,
dc->w.DCOrgX + left,
dc->w.DCOrgY + bottom - ell_height / 2 );
}
}
return TRUE;
}

View File

@ -152,6 +152,6 @@ BOOL UnhookWindowsHookEx( HHOOK hhook )
DWORD CallNextHookEx( HHOOK hhook, short code, WPARAM wParam, LPARAM lParam )
{
HOOKDATA *data = (HOOKDATA *)PTR_SEG_TO_LIN(hhook);
if (!data->next) return 0;
if (data == NULL || !data->next) return 0;
else return INTERNAL_CALL_HOOK( data->next, code, wParam, lParam );
}

View File

@ -182,6 +182,82 @@ static void MSG_RemoveMsg( MESSAGEQUEUE * msgQueue, int pos )
}
/***********************************************************************
* MSG_GetWindowForEvent
*
* Find the window and hittest for a mouse event.
*/
static INT MSG_GetWindowForEvent( POINT pt, HWND *phwnd )
{
WND *wndPtr;
HWND hwnd;
INT hittest, x, y;
*phwnd = hwnd = GetDesktopWindow();
x = pt.x;
y = pt.y;
while (hwnd)
{
/* If point is in window, and window is visible, and it */
/* is enabled (or it's a top-level window), then explore */
/* its children. Otherwise, go to the next window. */
wndPtr = WIN_FindWndPtr( hwnd );
if ((wndPtr->dwStyle & WS_VISIBLE) &&
(!(wndPtr->dwStyle & WS_DISABLED) ||
!(wndPtr->dwStyle & WS_CHILD)) &&
(x >= wndPtr->rectWindow.left) &&
(x < wndPtr->rectWindow.right) &&
(y >= wndPtr->rectWindow.top) &&
(y < wndPtr->rectWindow.bottom))
{
*phwnd = hwnd;
/* If window is minimized or disabled, ignore its children */
if ((wndPtr->dwStyle & WS_MINIMIZE) ||
(wndPtr->dwStyle & WS_DISABLED)) break;
x -= wndPtr->rectClient.left;
y -= wndPtr->rectClient.top;
hwnd = wndPtr->hwndChild;
}
else hwnd = wndPtr->hwndNext;
}
/* Send the WM_NCHITTEST message */
while (*phwnd)
{
wndPtr = WIN_FindWndPtr( *phwnd );
if (wndPtr->dwStyle & WS_DISABLED) hittest = HTERROR;
else hittest = (INT)SendMessage( *phwnd, WM_NCHITTEST, 0,
MAKELONG( pt.x, pt.y ) );
if (hittest != HTTRANSPARENT) break; /* Found the window */
hwnd = wndPtr->hwndNext;
while (hwnd)
{
wndPtr = WIN_FindWndPtr( hwnd );
if ((wndPtr->dwStyle & WS_VISIBLE) &&
(x >= wndPtr->rectWindow.left) &&
(x < wndPtr->rectWindow.right) &&
(y >= wndPtr->rectWindow.top) &&
(y < wndPtr->rectWindow.bottom)) break;
hwnd = wndPtr->hwndNext;
}
if (hwnd) *phwnd = hwnd; /* Found a suitable sibling */
else /* Go back to the parent */
{
*phwnd = WIN_FindWndPtr( *phwnd )->hwndParent;
wndPtr = WIN_FindWndPtr( *phwnd );
x += wndPtr->rectClient.left;
y += wndPtr->rectClient.top;
}
}
if (!*phwnd) *phwnd = GetDesktopWindow();
return hittest;
}
/***********************************************************************
* MSG_TranslateMouseMsg
*
@ -218,20 +294,7 @@ static BOOL MSG_TranslateMouseMsg( MSG *msg, BOOL remove )
ScreenToClient( msg->hwnd, (LPPOINT)&msg->lParam );
return TRUE; /* No need to further process the message */
}
else msg->hwnd = WindowFromPoint( msg->pt );
/* Send the WM_NCHITTEST message */
hittest_result = (INT)SendMessage( msg->hwnd, WM_NCHITTEST, 0,
MAKELONG( msg->pt.x, msg->pt.y ) );
while ((hittest_result == HTTRANSPARENT) && (msg->hwnd))
{
msg->hwnd = WINPOS_NextWindowFromPoint( msg->hwnd, msg->pt );
if (msg->hwnd)
hittest_result = (INT)SendMessage( msg->hwnd, WM_NCHITTEST, 0,
MAKELONG( msg->pt.x, msg->pt.y ));
}
if (!msg->hwnd) msg->hwnd = GetDesktopWindow();
else hittest_result = MSG_GetWindowForEvent( msg->pt, &msg->hwnd );
/* Send the WM_PARENTNOTIFY message */

View File

@ -39,8 +39,8 @@ HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lps )
if (wndPtr->flags & WIN_NEEDS_NCPAINT)
{
SendMessage( hwnd, WM_NCPAINT, 0, 0 );
wndPtr->flags &= ~WIN_NEEDS_NCPAINT;
SendMessage( hwnd, WM_NCPAINT, 0, 0 );
}
lps->hdc = GetDCEx( hwnd, hrgnUpdate, DCX_INTERSECTRGN | DCX_USESTYLE );
@ -56,8 +56,8 @@ HDC BeginPaint( HWND hwnd, LPPAINTSTRUCT lps )
if (wndPtr->flags & WIN_NEEDS_ERASEBKGND)
{
lps->fErase = !SendMessage( hwnd, WM_ERASEBKGND, lps->hdc, 0 );
wndPtr->flags &= ~WIN_NEEDS_ERASEBKGND;
lps->fErase = !SendMessage( hwnd, WM_ERASEBKGND, lps->hdc, 0 );
}
else lps->fErase = TRUE;
@ -225,8 +225,8 @@ BOOL RedrawWindow( HWND hwnd, LPRECT rectUpdate, HRGN hrgnUpdate, UINT flags )
{
if (wndPtr->flags & WIN_NEEDS_NCPAINT)
{
SendMessage( hwnd, WM_NCPAINT, 0, 0 );
wndPtr->flags &= ~WIN_NEEDS_NCPAINT;
SendMessage( hwnd, WM_NCPAINT, 0, 0 );
}
if (wndPtr->flags & WIN_NEEDS_ERASEBKGND)
{

View File

@ -892,11 +892,15 @@ BOOL IsChild( HWND parent, HWND child )
/***********************************************************************
* IsWindowVisible (USER.49)
*/
BOOL IsWindowVisible(HWND hWnd)
BOOL IsWindowVisible( HWND hwnd )
{
WND * wndPtr = WIN_FindWndPtr(hWnd);
if (wndPtr == 0) return(FALSE);
else return ((wndPtr->dwStyle & WS_VISIBLE) != 0);
WND *wndPtr = WIN_FindWndPtr( hwnd );
while (wndPtr && (wndPtr->dwStyle & WS_CHILD))
{
if (!(wndPtr->dwStyle & WS_VISIBLE)) return FALSE;
wndPtr = WIN_FindWndPtr( wndPtr->hwndParent );
}
return (wndPtr && (wndPtr->dwStyle & WS_VISIBLE));
}

View File

@ -530,32 +530,6 @@ BOOL SetWindowPlacement( HWND hwnd, WINDOWPLACEMENT *wndpl )
}
/*******************************************************************
* WINPOS_NextWindowFromPoint
*
* Looks for next enabled window that is
* a) sibling of hwnd, later in Z-order and encloses pt, or
* b) parent of hwnd
*/
HWND WINPOS_NextWindowFromPoint( HWND hwnd, POINT pt )
{
WND *wndPtr = WIN_FindWndPtr( hwnd );
if (!wndPtr->hwndParent) return hwnd; /* desktop window */
ScreenToClient( wndPtr->hwndParent, &pt ); /* make pt relative to parent */
for (;;)
{
if (!wndPtr->hwndNext) break; /* No more children */
hwnd = wndPtr->hwndNext;
wndPtr = WIN_FindWndPtr( hwnd );
if ((wndPtr->dwStyle & WS_VISIBLE) &&
!(wndPtr->dwStyle & WS_DISABLED) &&
PtInRect( &wndPtr->rectWindow, pt )) return hwnd;
}
return wndPtr->hwndParent;
}
/*******************************************************************
* WINPOS_ChangeActiveWindow
*