Converted Wine documentation to SGML format.
This commit is contained in:
parent
c4fac7867e
commit
1e8e5ba829
|
@ -238,7 +238,7 @@ Makefile: Makefile.in $(TOPSRCDIR)/configure
|
||||||
man: $(C_SRCS)
|
man: $(C_SRCS)
|
||||||
for i in $(C_SRCS); do $(C2MAN) -L -o $(TOPOBJDIR)/documentation/man3w -S3w $(DIVINCL) -D__WINE__ $(MANSPECS) $$i; done
|
for i in $(C_SRCS); do $(C2MAN) -L -o $(TOPOBJDIR)/documentation/man3w -S3w $(DIVINCL) -D__WINE__ $(MANSPECS) $$i; done
|
||||||
|
|
||||||
html: $(C_SRCS)
|
doc-html: $(C_SRCS)
|
||||||
for i in $(C_SRCS); do $(C2MAN) -L -o $(TOPOBJDIR)/documentation/html -Th -iwindows.h $(DIVINCL) -D__WINE__ $(MANSPECS) $$i; done
|
for i in $(C_SRCS); do $(C2MAN) -L -o $(TOPOBJDIR)/documentation/html -Th -iwindows.h $(DIVINCL) -D__WINE__ $(MANSPECS) $$i; done
|
||||||
|
|
||||||
# Rule for linting
|
# Rule for linting
|
||||||
|
|
|
@ -1,23 +1,13 @@
|
||||||
|
*.aux
|
||||||
|
*.dvi
|
||||||
|
*.junk
|
||||||
|
*.log
|
||||||
|
*.tex
|
||||||
|
DBTOHTML_OUTPUT_DIR*
|
||||||
Makefile
|
Makefile
|
||||||
wine.aux
|
wine-doc
|
||||||
|
wine-doc.pdf
|
||||||
|
wine-doc.ps
|
||||||
|
wine-doc.rtf
|
||||||
wine.conf.man
|
wine.conf.man
|
||||||
wine.cp
|
|
||||||
wine.cps
|
|
||||||
wine.dvi
|
|
||||||
wine.fn
|
|
||||||
wine.fns
|
|
||||||
wine.html
|
|
||||||
wine.info
|
|
||||||
wine.info-1
|
|
||||||
wine.info-2
|
|
||||||
wine.ky
|
|
||||||
wine.log
|
|
||||||
wine.man
|
wine.man
|
||||||
wine.pg
|
|
||||||
wine.texi
|
|
||||||
wine.toc
|
|
||||||
wine.tp
|
|
||||||
wine.tps
|
|
||||||
wine.vr
|
|
||||||
wine.vrs
|
|
||||||
wine_toc.html
|
|
||||||
|
|
|
@ -3,52 +3,52 @@ TOPOBJDIR = ..
|
||||||
SRCDIR = @srcdir@
|
SRCDIR = @srcdir@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
MODULE = none
|
MODULE = none
|
||||||
|
BOOKNAME = wine-doc
|
||||||
INCLUDES = \
|
|
||||||
AUTHORS \
|
|
||||||
LICENSE \
|
|
||||||
WARRANTY
|
|
||||||
|
|
||||||
SOURCES = \
|
|
||||||
wine.texinfo \
|
|
||||||
$(INCLUDES)
|
|
||||||
|
|
||||||
INFOFILES = \
|
|
||||||
wine.info \
|
|
||||||
wine.info-1 \
|
|
||||||
wine.info-2
|
|
||||||
|
|
||||||
HTMLFILES = \
|
|
||||||
wine_toc.html \
|
|
||||||
wine.html
|
|
||||||
|
|
||||||
DVIFILES = wine.dvi
|
|
||||||
|
|
||||||
EXTRASUBDIRS = samples status
|
EXTRASUBDIRS = samples status
|
||||||
|
|
||||||
all: $(INFOFILES) $(DVIFILES) $(HTMLFILES)
|
BOOK_SRCS = \
|
||||||
|
architecture.sgml \
|
||||||
|
bugs.sgml \
|
||||||
|
build.sgml \
|
||||||
|
compiling.sgml \
|
||||||
|
configuring.sgml \
|
||||||
|
consoles.sgml \
|
||||||
|
debugger.sgml \
|
||||||
|
debugging.sgml \
|
||||||
|
dlls.sgml \
|
||||||
|
documentation.sgml \
|
||||||
|
fonts.sgml \
|
||||||
|
i18n.sgml \
|
||||||
|
implementation.sgml \
|
||||||
|
installing.sgml \
|
||||||
|
opengl.sgml \
|
||||||
|
packaging.sgml \
|
||||||
|
patches.sgml \
|
||||||
|
porting.sgml \
|
||||||
|
printing.sgml \
|
||||||
|
registry.sgml \
|
||||||
|
running.sgml \
|
||||||
|
tools.sgml \
|
||||||
|
wine-doc.sgml
|
||||||
|
|
||||||
info: $(INFOFILES)
|
BOOK_TARGETS = \
|
||||||
|
$(BOOKNAME)/index.html \
|
||||||
|
$(BOOKNAME).pdf \
|
||||||
|
$(BOOKNAME).ps
|
||||||
|
|
||||||
dvi: $(DVIFILES)
|
all: $(BOOK_TARGETS)
|
||||||
|
|
||||||
html: $(HTMLFILES)
|
|
||||||
|
|
||||||
@MAKE_RULES@
|
@MAKE_RULES@
|
||||||
|
|
||||||
$(INFOFILES): $(SOURCES)
|
$(BOOKNAME)/index.html: $(BOOK_SRCS)
|
||||||
makeinfo $(SRCDIR)/wine.texinfo
|
db2html $(BOOKNAME).sgml
|
||||||
|
|
||||||
$(DVIFILES): $(SOURCES)
|
$(BOOKNAME).pdf: $(BOOK_SRCS)
|
||||||
texi2dvi $(SRCDIR)/wine.texinfo
|
db2pdf $(BOOKNAME).sgml
|
||||||
|
|
||||||
$(HTMLFILES): $(SOURCES)
|
$(BOOKNAME).ps: $(BOOK_SRCS)
|
||||||
makeinfo -E wine.texi $(SRCDIR)/wine.texinfo
|
db2ps $(BOOKNAME).sgml
|
||||||
texi2html wine.texi
|
|
||||||
|
|
||||||
$(INCLUDES):
|
|
||||||
$(RM) $(INCLUDES)
|
|
||||||
for i in $(INCLUDES); do $(LN_S) $(TOPSRCDIR)/$$i $$i || exit 1; done
|
|
||||||
|
|
||||||
install::
|
install::
|
||||||
$(INSTALL) -d $(mandir)/man$(prog_manext)
|
$(INSTALL) -d $(mandir)/man$(prog_manext)
|
||||||
|
@ -62,19 +62,8 @@ uninstall::
|
||||||
$(RM) $(mandir)/man$(prog_manext)/wine.$(prog_manext)
|
$(RM) $(mandir)/man$(prog_manext)/wine.$(prog_manext)
|
||||||
$(RM) $(mandir)/man$(conf_manext)/wine.conf.$(conf_manext)
|
$(RM) $(mandir)/man$(conf_manext)/wine.conf.$(conf_manext)
|
||||||
|
|
||||||
# Not done by default because of makeinfo bugs
|
|
||||||
install_info: $(INFOFILES)
|
|
||||||
[ -d $(infodir) ] || mkdir -p $(infodir)
|
|
||||||
for i in $(INFOFILES); do $(INSTALL_DATA) $$i $(infodir)/$$i; done
|
|
||||||
|
|
||||||
uninstall_info:
|
|
||||||
for i in $(INFOFILES); do $(RM) $(infodir)/$$i; done
|
|
||||||
|
|
||||||
clean::
|
clean::
|
||||||
$(RM) $(INFOFILES) $(DVIFILES) $(INCLUDES)
|
$(RM) *.aux *.dvi *.tex *.log $(BOOKNAME).pdf $(BOOKNAME).ps
|
||||||
$(RM) wine.aux wine.cp wine.cps wine.fn wine.fns wine.ky wine.log \
|
$(RM) -r $(BOOKNAME) html man3w *.junk DBTOHTML_OUTPUT_DIR*
|
||||||
wine.pg wine.toc wine.tp wine.tps wine.vr wine.vrs \
|
|
||||||
wine.texi
|
|
||||||
$(RM) -r man3w
|
|
||||||
|
|
||||||
### Dependencies:
|
### Dependencies:
|
||||||
|
|
|
@ -1,105 +0,0 @@
|
||||||
|
|
||||||
Wine Documentation README
|
|
||||||
|
|
||||||
|
|
||||||
Wine Man Page
|
|
||||||
|
|
||||||
The man page for Wine is in this directory. It is installed by 'make
|
|
||||||
install'.
|
|
||||||
|
|
||||||
Wine Reference Manual
|
|
||||||
|
|
||||||
Texinfo source for preliminary comprehensive documentation is in
|
|
||||||
this directory. Use 'make info' in this directory to generate the GNU
|
|
||||||
info version, 'make dvi' to generate the DVI version (hit 'r' to
|
|
||||||
ignore errors), or 'make all' for both. It is not installed by
|
|
||||||
default.
|
|
||||||
|
|
||||||
Wine API documentation
|
|
||||||
|
|
||||||
Do a 'make manpages' in the Wine toplevel directory to generate the
|
|
||||||
API manpages from the Wine source, or 'make man' in any source
|
|
||||||
subdirectory to generate manpages from only that directory. Only
|
|
||||||
functions mentioned in Wine spec files will be documented; the
|
|
||||||
specific .spec files checked are set by the MANSPECS variable in
|
|
||||||
Make.rules. The manpages will be generated into
|
|
||||||
[documentation/man3w]. For HTML formatted manpages, do 'make
|
|
||||||
htmlpages' from the toplevel, or 'make html' from any
|
|
||||||
subdirectory. HTML formatted pages are generated into
|
|
||||||
[documentation/html]. You will need c2man as modified for Wine,
|
|
||||||
available as source or binary from ftp://ftp.winehq.com/pub/wine/.
|
|
||||||
The man pages are not installed by 'make install'.
|
|
||||||
|
|
||||||
Other READMEs
|
|
||||||
|
|
||||||
Other informational files are in this directory as well as scattered
|
|
||||||
through the source tree.
|
|
||||||
|
|
||||||
Other resources:
|
|
||||||
|
|
||||||
Usenet: news:comp.emulators.ms-windows.wine
|
|
||||||
WWW: http://www.winehq.com/
|
|
||||||
|
|
||||||
|
|
||||||
Writing Wine API Documentation
|
|
||||||
|
|
||||||
To improve the documentation of the Wine API, just add comments to the
|
|
||||||
existing source. For example,
|
|
||||||
|
|
||||||
/******************************************************************
|
|
||||||
* CopyMetaFile32A (GDI32.23)
|
|
||||||
*
|
|
||||||
* Copies the metafile corresponding to hSrcMetaFile to either
|
|
||||||
* a disk file, if a filename is given, or to a new memory based
|
|
||||||
* metafile, if lpFileName is NULL.
|
|
||||||
*
|
|
||||||
* RETURNS
|
|
||||||
*
|
|
||||||
* Handle to metafile copy on success, NULL on failure.
|
|
||||||
*
|
|
||||||
* BUGS
|
|
||||||
*
|
|
||||||
* Copying to disk returns NULL even if successful.
|
|
||||||
*/
|
|
||||||
HMETAFILE32 WINAPI CopyMetaFile32A(
|
|
||||||
HMETAFILE32 hSrcMetaFile, /* handle of metafile to copy */
|
|
||||||
LPCSTR lpFilename /* filename if copying to a file */
|
|
||||||
) { ... }
|
|
||||||
|
|
||||||
becomes, after processing with c2man and nroff -man,
|
|
||||||
|
|
||||||
CopyMetaFileA(3w) CopyMetaFileA(3w)
|
|
||||||
|
|
||||||
|
|
||||||
NAME
|
|
||||||
CopyMetaFileA - CopyMetaFile32A (GDI32.23)
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
HMETAFILE32 CopyMetaFileA
|
|
||||||
(
|
|
||||||
HMETAFILE32 hSrcMetaFile,
|
|
||||||
LPCSTR lpFilename
|
|
||||||
);
|
|
||||||
|
|
||||||
PARAMETERS
|
|
||||||
HMETAFILE32 hSrcMetaFile
|
|
||||||
Handle of metafile to copy.
|
|
||||||
|
|
||||||
LPCSTR lpFilename
|
|
||||||
Filename if copying to a file.
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
Copies the metafile corresponding to hSrcMetaFile to
|
|
||||||
either a disk file, if a filename is given, or to a new
|
|
||||||
memory based metafile, if lpFileName is NULL.
|
|
||||||
|
|
||||||
RETURNS
|
|
||||||
Handle to metafile copy on success, NULL on failure.
|
|
||||||
|
|
||||||
BUGS
|
|
||||||
Copying to disk returns NULL even if successful.
|
|
||||||
|
|
||||||
SEE ALSO
|
|
||||||
GetMetaFileA(3w), GetMetaFileW(3w), CopyMetaFileW(3w),
|
|
||||||
PlayMetaFile(3w), SetMetaFileBitsEx(3w), GetMetaFileBit-
|
|
||||||
sEx(3w)
|
|
|
@ -1,38 +0,0 @@
|
||||||
Some notes concerning accelerators.
|
|
||||||
|
|
||||||
There are _three_ differently sized accelerator structures exposed to the
|
|
||||||
user. The general layout is:
|
|
||||||
|
|
||||||
BYTE fVirt;
|
|
||||||
WORD key;
|
|
||||||
WORD cmd;
|
|
||||||
|
|
||||||
We now have three different appearances:
|
|
||||||
|
|
||||||
- Accelerators in NE resources. These have a size of 5 byte and do not have
|
|
||||||
any padding. This is also the internal layout of the global handle HACCEL
|
|
||||||
(16 and 32) in Windows 95 and WINE. Exposed to the user as Win16 global
|
|
||||||
handles HACCEL16 and HACCEL32 by the Win16/Win32 API.
|
|
||||||
|
|
||||||
- Accelerators in PE resources. These have a size of 8 byte. Layout is:
|
|
||||||
BYTE fVirt;
|
|
||||||
BYTE pad0;
|
|
||||||
WORD key;
|
|
||||||
WORD cmd;
|
|
||||||
WORD pad1;
|
|
||||||
They are exposed to the user only by direct accessing PE resources.
|
|
||||||
|
|
||||||
- Accelerators in the Win32 API. These have a size of 6 byte. Layout is:
|
|
||||||
BYTE fVirt;
|
|
||||||
BYTE pad0;
|
|
||||||
WORD key;
|
|
||||||
WORD cmd;
|
|
||||||
These are exposed to the user by the CopyAcceleratorTable and
|
|
||||||
CreateAcceleratorTable in the Win32 API.
|
|
||||||
|
|
||||||
Why two types of accelerators in the Win32 API? We can only guess, but
|
|
||||||
my best bet is that the Win32 resource compiler can/does not handle struct
|
|
||||||
packing. Win32 ACCEL is defined using #pragma(2) for the compiler but without
|
|
||||||
any packing for RC, so it will assume #pragma(4).
|
|
||||||
|
|
||||||
Findings researched by Uwe Bonnes, Ulrich Weigand and Marcus Meissner.
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,92 +0,0 @@
|
||||||
This file describes setting up the Windows ASPI interface.
|
|
||||||
|
|
||||||
Warning/Warning/Warning!!!!!!
|
|
||||||
=============================
|
|
||||||
THIS MAY TRASH YOUR SYSTEM IF USED INCORRECTLY
|
|
||||||
THIS MAY TRASH YOUR SYSTEM IF USED CORRECTLY
|
|
||||||
|
|
||||||
Now that I have said that. ASPI is a direct link to SCSI devices from
|
|
||||||
windows programs. ASPI just forwards the SCSI commands that programs send
|
|
||||||
to it to the SCSI bus.
|
|
||||||
|
|
||||||
If you use the wrong scsi device in your setup file, you can send
|
|
||||||
completely bogus commands to the wrong device - An example would be
|
|
||||||
formatting your hard drives (assuming the device gave you permission -
|
|
||||||
if you're running as root, all bets are off).
|
|
||||||
|
|
||||||
So please make sure that **all** SCSI devices that the program won't need
|
|
||||||
have their permissions set as restricted as possible !
|
|
||||||
|
|
||||||
Cookbook for setting up scanner: (At least how mine is to work)
|
|
||||||
================================
|
|
||||||
|
|
||||||
Windows requirements:
|
|
||||||
=====================
|
|
||||||
0) The scanner software needs to use the "Adaptec" compatible drivers
|
|
||||||
(ASPI). At least with Mustek, they allow you the choice of using
|
|
||||||
the builtin card or the "Adaptec (AHA)" compatible drivers. This will not
|
|
||||||
work any other way.
|
|
||||||
Software that accesses the scanner via a DOS ASPI driver (e.g. ASPI2DOS)
|
|
||||||
is supported, too. [AM]
|
|
||||||
|
|
||||||
1) You probably need a real windows install of the software to set the
|
|
||||||
LUN's/SCSI id's up correctly. I'm not exactly sure.
|
|
||||||
|
|
||||||
LINUX requirements:
|
|
||||||
============================================================
|
|
||||||
0) Your scsi card must be supported under linux. This will not work with
|
|
||||||
an unknown scsi card.
|
|
||||||
Even for cheap'n crappy "scanner only" controllers some special Linux drivers
|
|
||||||
exist on the net.
|
|
||||||
|
|
||||||
1) Compile generic scsi drivers into your kernel.
|
|
||||||
|
|
||||||
2) Linux by default uses smaller scsi buffers than Windows. There is a
|
|
||||||
kernel build define SG_BIG_BUFF (in sg.h) that is by default set too low.
|
|
||||||
The SANE project recommends 130560 and this seems to work just fine. This
|
|
||||||
does require a kernel rebuild.
|
|
||||||
|
|
||||||
3) Make the devices for the scanner (generic scsi devices) - look at the scsi
|
|
||||||
programming how-to for device numbering.
|
|
||||||
|
|
||||||
4) I would recommend making the scanner device writable by a group.
|
|
||||||
I made a group called "scanner" and added myself to it. Running as root
|
|
||||||
increases your risk of sending bad scsi commands to the wrong device. With
|
|
||||||
a regular user, you are better protected.
|
|
||||||
|
|
||||||
5) Add a scsi device entry for your particular scanner to wine.conf.
|
|
||||||
The format is [scsi cCtTdD] where C=controller, T=target, D=LUN
|
|
||||||
|
|
||||||
ex. I set mine up as controller 0, Target 6, LUN 0.
|
|
||||||
[scsi c0t6d0]
|
|
||||||
Device=/dev/sgi
|
|
||||||
|
|
||||||
Yours will vary with your particular SCSI setup.
|
|
||||||
|
|
||||||
|
|
||||||
General Information:
|
|
||||||
====================
|
|
||||||
The mustek scanner I have was shipped with a package "ipplus". This
|
|
||||||
program uses the TWAIN driver specification to access scanners.
|
|
||||||
|
|
||||||
(TWAIN MANAGER)
|
|
||||||
ipplus.exe <---> (TWAIN INTERFACE) <---> (TWAIN DATA SOURCE . ASPI) -> WINASPI
|
|
||||||
|
|
||||||
NOTES/BUGS:
|
|
||||||
===========
|
|
||||||
The biggest is that it only works under linux at the moment.
|
|
||||||
The ASPI code has only been tested with:
|
|
||||||
- a Mustek 800SP with a Buslogic controller under Linux [BM]
|
|
||||||
- a Siemens Nixdorf 9036 with Adaptec AVA-1505 under Linux
|
|
||||||
accessed via DOSASPI.
|
|
||||||
Note that I had color problems, though (barely readable result) [AM]
|
|
||||||
- a Fujitsu M2513A MO drive (640MB) using generic scsi drivers.
|
|
||||||
Formatting and ejecting worked perfectly.
|
|
||||||
Thanks to Uwe Bonnes for access to the hardware ! [AM]
|
|
||||||
|
|
||||||
I make no warranty to the aspi code. It makes my scanner work. Your devices
|
|
||||||
may explode. I have no way of determining this. I take zero responsibility!
|
|
||||||
|
|
||||||
|
|
||||||
Bruce Milner
|
|
||||||
Additions by Andreas Mohr
|
|
|
@ -1,210 +0,0 @@
|
||||||
How To Report A Bug
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
There are two ways for you to make a bug report. One uses a simple perl
|
|
||||||
script, and is recommended if you don't want to spend a lot of time
|
|
||||||
producing the report. It is designed for use by just about anyone, from
|
|
||||||
the newest of newbies to advanced developers. You can also make a bug
|
|
||||||
report the hard way -- advanced developers will probably prefer this.
|
|
||||||
|
|
||||||
A. The Easy Way
|
|
||||||
1) Your computer *must* have perl on it for this method to work. To
|
|
||||||
find out if you have perl, run:
|
|
||||||
which perl
|
|
||||||
If it returns something like "/usr/bin/perl", you're in business.
|
|
||||||
Otherwise, skip on down to "The Hard Way".
|
|
||||||
If you aren't sure, just keep on going. When you try to run the script, it
|
|
||||||
will become *very* apparent if you don't have perl.
|
|
||||||
|
|
||||||
2) Change directory to <dirs to wine>/tools
|
|
||||||
|
|
||||||
3) Type in "./bug_report.pl" and follow the directions.
|
|
||||||
|
|
||||||
4) Post a message to the comp.emulators.ms-windows.wine newsgroup with the
|
|
||||||
"Nice Formatted Report" attatched. If possible, upload the full debug
|
|
||||||
output to a web/ftp server and provide the address in your message.
|
|
||||||
|
|
||||||
|
|
||||||
B. The Hard Way:
|
|
||||||
|
|
||||||
Some simple advice on making your bug report more useful (and thus more
|
|
||||||
likely to get answered and fixed):
|
|
||||||
|
|
||||||
1) Post as much information as possible.
|
|
||||||
|
|
||||||
This means we need more information than a simple
|
|
||||||
"MS Word crashes whenever I run it. Do you know why?"
|
|
||||||
Include at least the following information:
|
|
||||||
|
|
||||||
- Version of Wine you're using (run 'wine -v')
|
|
||||||
- Operating system you're using, what distribution (if any), and what
|
|
||||||
version
|
|
||||||
- Compiler and version (run 'gcc -v')
|
|
||||||
- Windows version, if installed
|
|
||||||
- Program you're trying to run, its version number, and a URL for
|
|
||||||
where the program can be obtained (if available)
|
|
||||||
- Command line you used to start wine
|
|
||||||
- Any other information you think may be relevant or helpful, such as
|
|
||||||
X server version in case of X problems, libc version etc.
|
|
||||||
|
|
||||||
2) Re-run the program with the -debugmsg +relay option
|
|
||||||
(i.e., 'wine -debugmsg +relay sol.exe').
|
|
||||||
|
|
||||||
If Wine crashes while running your program, it is important that we
|
|
||||||
have this information to have a chance at figuring out what is causing
|
|
||||||
the crash. This can put out quite a lot (several MB) of information,
|
|
||||||
though, so it's best to output it to a file. When the Wine-dbg> prompt
|
|
||||||
appears, type 'quit'.
|
|
||||||
|
|
||||||
You might want to try +relay,+snoop instead of +relay, but please note
|
|
||||||
that +snoop is pretty unstable and often will crash earlier than a
|
|
||||||
simple +relay !
|
|
||||||
If this is the case, then please use *only* +relay !!
|
|
||||||
A bug report with a crash in +snoop code is useless in most cases !
|
|
||||||
|
|
||||||
To get the trace output, use the following commands:
|
|
||||||
|
|
||||||
all shells:
|
|
||||||
echo quit|wine -debugmsg +relay [other_options] program_name >& filename.out; tail -n 100 filename.out > report_file
|
|
||||||
(This will print wine's debug msgs only to the file and then
|
|
||||||
auto-quit. It's probably a good idea to use this command, since wine
|
|
||||||
prints out so many debug msgs that they flood the terminal, eating CPU.)
|
|
||||||
|
|
||||||
tcsh and other csh-like shells:
|
|
||||||
|
|
||||||
wine -debugmsg +relay [other_options] program_name |& tee filename.out
|
|
||||||
tail -100 filename.out > report_file
|
|
||||||
|
|
||||||
bash and other sh-like shells:
|
|
||||||
|
|
||||||
wine -debugmsg +relay [other_options] program_name 2>&1 | tee filename.out
|
|
||||||
tail -100 filename.out > report_file
|
|
||||||
|
|
||||||
'report_file' will now contain the last hundred lines of the debugging
|
|
||||||
output, including the register dump and backtrace, which are the most
|
|
||||||
important pieces of information. Please do not delete this part, even
|
|
||||||
if you don't understand what it means.
|
|
||||||
|
|
||||||
3) Post your report to the newsgroup comp.emulators.ms-windows.wine
|
|
||||||
|
|
||||||
In your post, include all of the information from part 1), and insert
|
|
||||||
the text from the output file in part 2). If you do this, your chances
|
|
||||||
of receiving some sort of helpful response should be very good.
|
|
||||||
|
|
||||||
4) Questions and comments
|
|
||||||
|
|
||||||
If after reading this document there is something you couldn't figure
|
|
||||||
out, or think could be explained better, or that should have been
|
|
||||||
included, please post to comp.emulators.ms-windows.wine to let us know
|
|
||||||
how this document can be improved.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
How to do regression testing using Cvs
|
|
||||||
-------------------------------------
|
|
||||||
|
|
||||||
A problem that can happen sometimes is 'it used to work before,
|
|
||||||
now it doesn't anymore...'. Here is a step by step procedure to
|
|
||||||
try to pinpoint when the problem occured. This is *NOT* for casual
|
|
||||||
users.
|
|
||||||
|
|
||||||
1) get the 'full cvs' archive from winehq.
|
|
||||||
This archive is the cvs tree but with the tags controling the versioning
|
|
||||||
system. It's a big file (> 15 meg) with a name like full-cvs-<last update date>
|
|
||||||
(it's more than 100mb when uncompressed, you can't very well do this
|
|
||||||
with small, old computers or slow Internet connections)
|
|
||||||
|
|
||||||
2) untar it into a repository directory :
|
|
||||||
|
|
||||||
cd /home/gerard
|
|
||||||
tar -zxffull-cvs-2000-05-20.tar.gz
|
|
||||||
mv wine repository
|
|
||||||
|
|
||||||
3) extract a new destination directory
|
|
||||||
This directory must not be in a subdirectory of the repository else
|
|
||||||
cvs will think it's part of the repository and deny you an extraction
|
|
||||||
in the repository :
|
|
||||||
|
|
||||||
cd /home/gerard
|
|
||||||
mv wine wine_current (-> this protects your current wine sandbox, if any)
|
|
||||||
export CVSROOT=/home/gerard/repository
|
|
||||||
cd /home/gerard
|
|
||||||
cvs -d $CVSROOT checkout wine
|
|
||||||
|
|
||||||
Note that it's not possible to do a checkout at a given date; you
|
|
||||||
always do the checkout for the last date where the full-cvs-xxx snapshot
|
|
||||||
was generated.
|
|
||||||
|
|
||||||
4) you will have now in the ~/wine directory an image of the cvs tree,
|
|
||||||
on the client side.
|
|
||||||
Now update this image to the date you want :
|
|
||||||
|
|
||||||
cd /home/gerard/wine
|
|
||||||
cvs -d $CVSROOT update -D "1999-06-01"
|
|
||||||
|
|
||||||
The date format is YYYY-MM-DD.
|
|
||||||
|
|
||||||
Many messages will inform you that more recent files have been
|
|
||||||
deleted to set back the client cvs tree to the date you asked,
|
|
||||||
for example :
|
|
||||||
|
|
||||||
cvs update: tsx11/ts_xf86dga2.c is no longer in the repository
|
|
||||||
|
|
||||||
Cvs update is not limited to upgrade to a *newer* version as
|
|
||||||
I have believed for far too long :-(
|
|
||||||
|
|
||||||
5) Now proceed as for a normal update :
|
|
||||||
|
|
||||||
./configure
|
|
||||||
make depend && make
|
|
||||||
|
|
||||||
When you have found the exact date when a bug was
|
|
||||||
added to Cvs, use something like :
|
|
||||||
|
|
||||||
cvs -d $CVSROOT diff -D "1999-07-10" -D "1999-07-12"
|
|
||||||
|
|
||||||
to get all the differences between the last cvs version
|
|
||||||
known to work and code that first displayed the misbehavior.
|
|
||||||
|
|
||||||
[ I did not include flags for diff since they are in my .cvsrc file :
|
|
||||||
cvs -z 3
|
|
||||||
update -dPA
|
|
||||||
diff -u
|
|
||||||
]
|
|
||||||
|
|
||||||
From this diff file, particularly the file names, and the
|
|
||||||
ChangeLog, it's usually possible to find the different individual
|
|
||||||
patches that were done at this time.
|
|
||||||
|
|
||||||
If any non-programmer reads this, the fasted method to get
|
|
||||||
at the point where the problem occured is to use a binary
|
|
||||||
search, that is, if the problem occured in 1999, start at mid-year,
|
|
||||||
then is the problem is already here, back to 1st avril, if not,
|
|
||||||
to 1st october, and so on.
|
|
||||||
|
|
||||||
6) The next step is to start from the last working version
|
|
||||||
and to dig the individual contributions from
|
|
||||||
http://www.integrita.com/cgi-local/lwgate.pl/WINE-PATCHES/
|
|
||||||
(where the Wine patches mailing list is archived)
|
|
||||||
|
|
||||||
If the patch was done by the Wine maintainer or if it was
|
|
||||||
sent directly to his mail address without going first through
|
|
||||||
wine-patches, you are out of luck as you will never find the
|
|
||||||
patch in the archive.
|
|
||||||
If it is, it's often possible to apply the patches one by
|
|
||||||
one to last working Cvs, compile and test. If you have saved
|
|
||||||
the next candidate as /home/gerard/buggedpatch1.txt :
|
|
||||||
|
|
||||||
cd /home/gerard/wine
|
|
||||||
patch -p 0 </home/gerard/buggedpatch1.txt
|
|
||||||
|
|
||||||
Beware that the committed patch is not always identical to
|
|
||||||
the patch that the author sent to wine-patches, as sometimes
|
|
||||||
the Wine maintainer changes things a bit.
|
|
||||||
|
|
||||||
If you find one patch that is getting the Cvs to reproduce the problem,
|
|
||||||
you have almost won; post the problem on
|
|
||||||
comp.emulators.windows.wine
|
|
||||||
and there is a chance that the author will jump in to suggest a fix;
|
|
||||||
or there is always the possibility to look hard at the patch until it
|
|
||||||
is coerced to reveal where is the bug :-)
|
|
|
@ -0,0 +1,216 @@
|
||||||
|
<chapter id="bugs">
|
||||||
|
<title>Finding and Reporting Bugs</title>
|
||||||
|
|
||||||
|
<sect1 id="bug-reporting">
|
||||||
|
<title>How To Report A Bug</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by Gerard Patel (???)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/bugreports</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
There are two ways for you to make a bug report. One uses a
|
||||||
|
simple perl script, and is recommended if you don't want to
|
||||||
|
spend a lot of time producing the report. It is designed for
|
||||||
|
use by just about anyone, from the newest of newbies to
|
||||||
|
advanced developers. You can also make a bug report the hard
|
||||||
|
way -- advanced developers will probably prefer this.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>The Easy Way</title>
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Your computer *must* have perl on it for this method to
|
||||||
|
work. To find out if you have perl, run <command>which
|
||||||
|
perl</command>. If it returns something like
|
||||||
|
<filename>/usr/bin/perl</filename>, you're in business.
|
||||||
|
Otherwise, skip on down to "The Hard Way". If you aren't
|
||||||
|
sure, just keep on going. When you try to run the
|
||||||
|
script, it will become *very* apparent if you don't have
|
||||||
|
perl.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Change directory to <filename><dirs to
|
||||||
|
wine>/tools</filename>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Type in <command>./bug_report.pl</command> and follow
|
||||||
|
the directions.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Post a message to the
|
||||||
|
<systemitem>comp.emulators.ms-windows.wine</systemitem>
|
||||||
|
newsgroup with the "Nice Formatted Report" attatched. If
|
||||||
|
possible, upload the full debug output to a web/ftp
|
||||||
|
server and provide the address in your message.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>The Hard Way</title>
|
||||||
|
<para>
|
||||||
|
Some simple advice on making your bug report more useful
|
||||||
|
(and thus more likely to get answered and fixed):
|
||||||
|
</para>
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>Post as much information as possible.</para>
|
||||||
|
<para>
|
||||||
|
This means we need more information than a simple "MS
|
||||||
|
Word crashes whenever I run it. Do you know why?"
|
||||||
|
Include at least the following information:
|
||||||
|
</para>
|
||||||
|
<itemizedlist spacing="compact">
|
||||||
|
<listitem>
|
||||||
|
<para>Version of Wine you're using (run <command>wine
|
||||||
|
-v</command>)</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Operating system you're using, what distribution (if
|
||||||
|
any), and what version
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Compiler and version (run <command>gcc -v</command>)</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Windows version, if installed</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Program you're trying to run, its version number,
|
||||||
|
and a URL for where the program can be obtained (if
|
||||||
|
available)
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Command line you used to start wine</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Any other information you think may be relevant or
|
||||||
|
helpful, such as X server version in case of X
|
||||||
|
problems, libc version etc.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Re-run the program with the <parameter>--debugmsg
|
||||||
|
+relay</parameter> option (i.e., <command>wine
|
||||||
|
--debugmsg +relay sol.exe</command>).
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
If Wine crashes while running your program, it is
|
||||||
|
important that we have this information to have a chance
|
||||||
|
at figuring out what is causing the crash. This can put
|
||||||
|
out quite a lot (several MB) of information, though, so
|
||||||
|
it's best to output it to a file. When the <prompt>Wine-dbg></prompt>
|
||||||
|
prompt appears, type <userinput>quit</userinput>.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You might want to try
|
||||||
|
<parameter>+relay,+snoop</parameter> instead of
|
||||||
|
<parameter>+relay</parameter>, but please note that
|
||||||
|
<parameter>+snoop</parameter> is pretty unstable and
|
||||||
|
often will crash earlier than a simple
|
||||||
|
<parameter>+relay</parameter>! If this is the case, then
|
||||||
|
please use *only* <parameter>+relay</parameter>!! A bug
|
||||||
|
report with a crash in <parameter>+snoop</parameter>
|
||||||
|
code is useless in most cases!
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
To get the trace output, use the following commands:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>all shells:</term>
|
||||||
|
<listitem>
|
||||||
|
<screen>
|
||||||
|
<prompt>$ </prompt>echo quit | wine -debugmsg +relay [other_options] program_name >& filename.out;
|
||||||
|
<prompt>$ </prompt>tail -n 100 filename.out > report_file
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
(This will print wine's debug messages only to the file and then
|
||||||
|
auto-quit. It's probably a good idea to use this command, since wine
|
||||||
|
prints out so many debug msgs that they flood the terminal, eating CPU.)
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>tcsh and other csh-like shells:</term>
|
||||||
|
<listitem>
|
||||||
|
<screen>
|
||||||
|
<prompt>$ </prompt>wine -debugmsg +relay [other_options] program_name |& tee filename.out;
|
||||||
|
<prompt>$ </prompt>tail -100 filename.out > report_file
|
||||||
|
</screen>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>bash and other sh-like shells:</term>
|
||||||
|
<listitem>
|
||||||
|
<screen>
|
||||||
|
<prompt>$ </prompt>wine -debugmsg +relay [other_options] program_name 2>&1 | tee filename.out;
|
||||||
|
<prompt>$ </prompt>tail -100 filename.out > report_file
|
||||||
|
</screen>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
<para>
|
||||||
|
<filename>report_file</filename> will now contain the
|
||||||
|
last hundred lines of the debugging output, including
|
||||||
|
the register dump and backtrace, which are the most
|
||||||
|
important pieces of information. Please do not delete
|
||||||
|
this part, even if you don't understand what it means.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Post your report to the newsgroup
|
||||||
|
<systemitem>comp.emulators.ms-windows.wine</systemitem>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
In your post, include all of the information from part
|
||||||
|
1), and insert the text from the output file in part 2).
|
||||||
|
If you do this, your chances of receiving some sort of
|
||||||
|
helpful response should be very good.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Questions and comments</title>
|
||||||
|
<para>
|
||||||
|
If after reading this document there is something you
|
||||||
|
couldn't figure out, or think could be explained better, or
|
||||||
|
that should have been included, please post to
|
||||||
|
<systemitem>comp.emulators.ms-windows.wine</systemitem> to
|
||||||
|
let us know how this document can be improved.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -0,0 +1,11 @@
|
||||||
|
<chapter id="build">
|
||||||
|
<title>The Wine Build System</title>
|
||||||
|
<para>How the Wine build system works, and how to tweak it...</para>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -1,70 +0,0 @@
|
||||||
Drive labels and serial numbers with wine
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
Until now, your only possibility of specifying drive volume labels
|
|
||||||
and serial numbers was to set them manually in the wine config file.
|
|
||||||
By now, wine can read them directly from the device as well. This may be
|
|
||||||
useful for many Win 9x games or for setup programs distributed on CD-ROMs
|
|
||||||
that check for volume label.
|
|
||||||
|
|
||||||
WHAT'S SUPPORTED ?
|
|
||||||
|
|
||||||
* FAT systems (types 'hd' and 'floppy'): reads labels and serial num's.
|
|
||||||
* Iso9660 ('cdrom'): reads labels only.
|
|
||||||
|
|
||||||
HOW TO SET UP ?
|
|
||||||
|
|
||||||
Reading labels and serial numbers just works automagically if
|
|
||||||
you specify a 'Device=' line in the [Drive X] section in your wine.conf.
|
|
||||||
Note that the device has to exist and must be accessible if you do this,
|
|
||||||
though.
|
|
||||||
If you don't do that, then you should give fixed 'Label=' or 'Serial=' entries
|
|
||||||
in wine.conf, as Wine returns these entries instead if no device is given.
|
|
||||||
If they don't exist, then Wine will return default values (label "Drive X"
|
|
||||||
and serial 12345678).
|
|
||||||
|
|
||||||
Now a seldom needed one:
|
|
||||||
If you want to give a 'Device=' entry *only* for drive raw sector accesses, but
|
|
||||||
not for reading the volume info from the device (i.e. you want a *fixed*,
|
|
||||||
preconfigured label), you need to specify 'ReadVolInfo=0' to tell Wine to skip
|
|
||||||
the volume reading.
|
|
||||||
|
|
||||||
EXAMPLES
|
|
||||||
|
|
||||||
*** Simple example of cdrom and floppy; labels will be read from the device on
|
|
||||||
both cdrom and floppy; serial numbers on floppy only:
|
|
||||||
|
|
||||||
[Drive A]
|
|
||||||
Path=/mnt/floppy
|
|
||||||
Type=floppy
|
|
||||||
Device=/dev/fd0
|
|
||||||
Filesystem=msdos
|
|
||||||
|
|
||||||
[Drive R]
|
|
||||||
Path=/mnt/cdrom
|
|
||||||
Type=cdrom
|
|
||||||
Device=/dev/hda1
|
|
||||||
Filesystem=win95
|
|
||||||
|
|
||||||
*** CD-ROM. We want to override the label:
|
|
||||||
|
|
||||||
[Drive J]
|
|
||||||
Path=/mnt/cdrom
|
|
||||||
Type=cdrom
|
|
||||||
Label=X234GCDSE
|
|
||||||
; note that the device isn't really needed here as we have a fixed label
|
|
||||||
Device=/dev/cdrom
|
|
||||||
Filesystem=msdos
|
|
||||||
|
|
||||||
TODO / OPEN ISSUES
|
|
||||||
|
|
||||||
- The cdrom label can be read only if the data track of the disk resides in
|
|
||||||
the first track and the cdrom is iso9660.
|
|
||||||
- Better checking for FAT superblock (it now check's only one byte).
|
|
||||||
- Support for labels/serial num's WRITING.
|
|
||||||
- Can the label be longer than 11 chars? (iso9660 has 32 chars).
|
|
||||||
- What about reading ext2 volume label? ....
|
|
||||||
|
|
||||||
Petr Tomasek changes by: Andreas Mohr
|
|
||||||
<tomasek@etf.cuni.cz> <a.mohr@mailto.de>
|
|
||||||
Nov 14 1999 Jan 25 2000
|
|
|
@ -1,439 +0,0 @@
|
||||||
|
|
||||||
COMMON CONTROLS
|
|
||||||
their development status
|
|
||||||
and their UNDOCUMENTED features and functions
|
|
||||||
-----------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
1. Introduction
|
|
||||||
---------------
|
|
||||||
The information provided herein is based on the dll version 4.72 which
|
|
||||||
is included in MS Internet Explorer 4.01.
|
|
||||||
|
|
||||||
All information about common controls should be collected in this document.
|
|
||||||
|
|
||||||
All Wine programmers are encouraged to add their knowledge to this document.
|
|
||||||
|
|
||||||
|
|
||||||
2. General Information
|
|
||||||
----------------------
|
|
||||||
Further information about common controls can be found in the MS Platform SDK
|
|
||||||
and the MS Internet Client SDK (most recent). Information from these SDK's
|
|
||||||
will NOT be repeated here. Only information which can NOT be found in these
|
|
||||||
SDK's will be collected here. Some information in the SDK's mentioned above
|
|
||||||
is (intentionally???) WRONG. Corrections to wrong information will be
|
|
||||||
collected here too.
|
|
||||||
|
|
||||||
|
|
||||||
2.1 Structure sizes of different common control versions
|
|
||||||
--------------------------------------------------------
|
|
||||||
The common controls have been continously improved in the past. Some of the
|
|
||||||
orignal structures had to be extended and their size changed. Most of the
|
|
||||||
common control structures include their size as the first parameter. If
|
|
||||||
a control gets the wrong size in a message or function a failure is very
|
|
||||||
likely to occur. To avoid this, MS defined new constants that reflect the
|
|
||||||
structure size of older COMCTL32.DLL versions. The following list shows the
|
|
||||||
structure size constants that are currently defined in the original
|
|
||||||
COMCTL32.DLL.
|
|
||||||
NOTE: Some stuctures are NOT defined in wine's COMCTL32 yet.
|
|
||||||
|
|
||||||
HDITEM_V1_SIZE:
|
|
||||||
The size of the HDITEM structure in version 4.00.
|
|
||||||
|
|
||||||
LVCOLUMN_V1_SIZE:
|
|
||||||
The size of the LVCOLUMN structure in version 4.00.
|
|
||||||
|
|
||||||
LVHITTESTINFO_V1_SIZE:
|
|
||||||
The size of the LVHITTESTINFO structure in version 4.00.
|
|
||||||
|
|
||||||
LVITEM_V1_SIZE:
|
|
||||||
The size of the LVITEM structure in version 4.00.
|
|
||||||
|
|
||||||
NMLVCUSTOMDRAW_V3_SIZE:
|
|
||||||
The size of the NMLVCUSTOMDRAW structure in version 4.70.
|
|
||||||
|
|
||||||
NMTTDISPINFO_V1_SIZE:
|
|
||||||
The size of the NMTTDISPINFO structure in version 4.00.
|
|
||||||
|
|
||||||
NMTVCUSTOMDRAW_V3_SIZE:
|
|
||||||
The size of the NMTVCUSTOMDRAW structure in version 4.70.
|
|
||||||
|
|
||||||
PROPSHEETHEADER_V1_SIZE:
|
|
||||||
The size of the PROPSHEETHEADER structure in version 4.00.
|
|
||||||
|
|
||||||
PROPSHEETPAGE_V1_SIZE:
|
|
||||||
The size of the PROPSHEETPAGE structure in version 4.00.
|
|
||||||
|
|
||||||
REBARBANDINFO_V3_SIZE:
|
|
||||||
The size of the REBARBANDINFO structure in version 4.70.
|
|
||||||
|
|
||||||
TTTOOLINFO_V1_SIZE:
|
|
||||||
The size of the TOOLINFO structure in version 4.00.
|
|
||||||
|
|
||||||
TVINSERTSTRUCT_V1_SIZE:
|
|
||||||
The size of the TVINSERTSTRUCT structure in version 4.00.
|
|
||||||
|
|
||||||
|
|
||||||
3. Controls
|
|
||||||
-----------
|
|
||||||
This paragraph describes the development status of the common controls.
|
|
||||||
|
|
||||||
|
|
||||||
3.1 Animation Control
|
|
||||||
---------------------
|
|
||||||
Author:
|
|
||||||
Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Dummy control. No functionality.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Author needed!! Any volunteers??
|
|
||||||
|
|
||||||
|
|
||||||
3.2 Combo Box Ex Control
|
|
||||||
------------------------
|
|
||||||
Author:
|
|
||||||
Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Dummy control. No functionality.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Author needed!! Any volunteers??
|
|
||||||
|
|
||||||
|
|
||||||
3.3 Date and Time Picker Control
|
|
||||||
--------------------------------
|
|
||||||
Author:
|
|
||||||
Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Dummy control. No functionality.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Author needed!! Any volunteers??
|
|
||||||
|
|
||||||
|
|
||||||
3.4 Drag List Box Control
|
|
||||||
-------------------------
|
|
||||||
Author:
|
|
||||||
Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Dummy control. No functionality.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Author needed!! Any volunteers??
|
|
||||||
|
|
||||||
|
|
||||||
3.5 Flat Scroll Bar Control
|
|
||||||
---------------------------
|
|
||||||
Author:
|
|
||||||
Dummy written by Alex Priem. <alexp@sci.kun.nl>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Dummy control. No functionality.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Author needed!! Any volunteers??
|
|
||||||
|
|
||||||
|
|
||||||
3.6 Header Control
|
|
||||||
------------------
|
|
||||||
Author:
|
|
||||||
Eric Kohl <ekohl@abo.rhein-zeitung.de>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Almost finished.
|
|
||||||
Unicode notifications are not supported (WM_NOTIFYFORMAT).
|
|
||||||
Order array not supported.
|
|
||||||
|
|
||||||
|
|
||||||
3.7 Hot Key Control
|
|
||||||
-------------------
|
|
||||||
Author:
|
|
||||||
Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Dummy control. No functionality.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Author needed!! Any volunteers??
|
|
||||||
|
|
||||||
|
|
||||||
3.8 Image List (no control)
|
|
||||||
---------------------------
|
|
||||||
Author:
|
|
||||||
Eric Kohl <ekohl@abo.rhein-zeitung.de>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Almost finished.
|
|
||||||
|
|
||||||
|
|
||||||
3.9 IP Address Control
|
|
||||||
----------------------
|
|
||||||
Author:
|
|
||||||
Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>
|
|
||||||
Alex Priem <alexp@sci.kun.nl>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Under construction.
|
|
||||||
|
|
||||||
|
|
||||||
3.10 List View Control
|
|
||||||
----------------------
|
|
||||||
Author:
|
|
||||||
Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>
|
|
||||||
Luc Tourangeau <luc@macadamian.com>
|
|
||||||
Koen Deforche <jozef@kotnet.org>
|
|
||||||
Francis Beaudet <francis@macadamian.com> and the "Corel-Team"
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Under construction.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Basic data structure with related messages are supported.
|
|
||||||
No painting supported yet.
|
|
||||||
|
|
||||||
|
|
||||||
3.11 Month Calendar Control
|
|
||||||
---------------------------
|
|
||||||
Author:
|
|
||||||
Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Dummy control. No functionality.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Author needed!! Any volunteers??
|
|
||||||
|
|
||||||
|
|
||||||
3.12 Native font control
|
|
||||||
------------------------
|
|
||||||
Author:
|
|
||||||
Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Dummy control. No functionality.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Author needed!! Any volunteers??
|
|
||||||
|
|
||||||
|
|
||||||
3.13 Pager Control
|
|
||||||
------------------
|
|
||||||
Author:
|
|
||||||
Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Under construction.
|
|
||||||
Many missing features.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Author needed!! Any volunteers??
|
|
||||||
|
|
||||||
|
|
||||||
3.14 Progress Bar Control
|
|
||||||
-------------------------
|
|
||||||
Author:
|
|
||||||
Original implementation by Dimitrie O. Paun.
|
|
||||||
Fixes and improvements by Eric Kohl.
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Finished!
|
|
||||||
|
|
||||||
|
|
||||||
3.15 Property Sheet
|
|
||||||
-------------------
|
|
||||||
Author:
|
|
||||||
Anders Carlsson <anders.carlsson@linux.nu>
|
|
||||||
Francis Beaudet <francis@macadamian.com>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Development in progress.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Tab control must be implemented first.
|
|
||||||
|
|
||||||
|
|
||||||
3.16 Rebar Control (Cool Bar)
|
|
||||||
-----------------------------
|
|
||||||
Author:
|
|
||||||
Eric Kohl <ekohl@abo.rhein-zeitung.de>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Development in progress.
|
|
||||||
Many bugs and missing features.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Author needed!! Any volunteers??
|
|
||||||
|
|
||||||
|
|
||||||
3.17 Status Bar Control
|
|
||||||
-----------------------
|
|
||||||
Author:
|
|
||||||
Original implementation by Bruce Milner.
|
|
||||||
Fixes and improvements by Eric Kohl.
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Almost finished.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Tooltip integration is almost complete.
|
|
||||||
|
|
||||||
|
|
||||||
3.18 Tab Control
|
|
||||||
----------------
|
|
||||||
Author:
|
|
||||||
Anders Carlsson <anders.carlsson@linux.nu>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Development in progress.
|
|
||||||
|
|
||||||
|
|
||||||
3.19 Toolbar Control
|
|
||||||
--------------------
|
|
||||||
Author:
|
|
||||||
Eric Kohl <ekohl@abo.rhein-zeitung.de>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Development in progress.
|
|
||||||
Basic functionality is almost done. (dll version 4.0)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3.20 Tooltip Control
|
|
||||||
--------------------
|
|
||||||
Author:
|
|
||||||
Eric Kohl <ekohl@abo.rhein-zeitung.de>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Almost finished.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Unicode support is incomplete (WM_NOTIFYFORMAT).
|
|
||||||
|
|
||||||
|
|
||||||
3.21 Trackbar Control
|
|
||||||
---------------------
|
|
||||||
Author:
|
|
||||||
Dummy written by Eric Kohl <ekohl@abo.rhein-zeitung.de>
|
|
||||||
Alex Priem <alexp@sci.kun.nl>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Under construction.
|
|
||||||
|
|
||||||
|
|
||||||
3.22 Tree View Control
|
|
||||||
----------------------
|
|
||||||
Author:
|
|
||||||
Dummy written by Eric Kohl.
|
|
||||||
Alex Priem <alexp@sci.kun.nl>
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Under construction.
|
|
||||||
|
|
||||||
|
|
||||||
3.23 Updown Control
|
|
||||||
-------------------
|
|
||||||
Author:
|
|
||||||
Original implementation by Dimitrie O. Paun.
|
|
||||||
Some minor changes by Eric Kohl <ekohl@abo.rhein-zeitung.de>.
|
|
||||||
|
|
||||||
Status:
|
|
||||||
Unknown.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
Have a look at controls/updown.c for a list of bugs and missing
|
|
||||||
features.
|
|
||||||
|
|
||||||
The status is unknown, because I did not have a close look at this
|
|
||||||
control. One test-program looked quite good, but in Win95's
|
|
||||||
cdplayer.exe the control does not show at all.
|
|
||||||
|
|
||||||
Any volunteers??
|
|
||||||
|
|
||||||
|
|
||||||
4. Additional Information
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
Has to be written...
|
|
||||||
|
|
||||||
|
|
||||||
5. Undocumented features
|
|
||||||
------------------------
|
|
||||||
|
|
||||||
There are quite a lot of undocumented functions like:
|
|
||||||
- DSA (Dynamic Storage Array) functions.
|
|
||||||
- DPA (Dynamic Pointer Array) functions.
|
|
||||||
- MRU ("Most Recently Used" List) functions.
|
|
||||||
- other unknown functions.
|
|
||||||
|
|
||||||
Have a look at relay32/comctl32.spec.
|
|
||||||
|
|
||||||
|
|
||||||
5.1 Dymnamic Storage Array (DSA)
|
|
||||||
---------------------------------
|
|
||||||
The DSA functions are used to store and manage dynamic arrays of fixed size
|
|
||||||
memory blocks. They are used by TASKMAN.EXE, Explorer, IE4 and other
|
|
||||||
Programs and DLL's that are "parts of the Windows Operating System".
|
|
||||||
The implementation should be complete.
|
|
||||||
|
|
||||||
Have a look at the source code to get more information.
|
|
||||||
|
|
||||||
|
|
||||||
5.2 Dynamic Pointer Array (DPA)
|
|
||||||
------------------------------------
|
|
||||||
Similar to the DSA functions, but they just store pointers. They are used by
|
|
||||||
Explorer, IE4 and other Programs and DLL's that are "parts of the Windows
|
|
||||||
Operating System". The implementation should be complete.
|
|
||||||
|
|
||||||
Have a look at the source code to get more information.
|
|
||||||
|
|
||||||
|
|
||||||
5.3 "Most Recently Used" - List (MRU)
|
|
||||||
-------------------------------------
|
|
||||||
Only stubs are implemented to keep Explorer from bailing out.
|
|
||||||
|
|
||||||
No more information available at this time!
|
|
||||||
|
|
||||||
|
|
||||||
5.4 MenuHelp
|
|
||||||
------------
|
|
||||||
Has to be written...
|
|
||||||
|
|
||||||
|
|
||||||
5.5 GetEffectiveClientRect
|
|
||||||
--------------------------
|
|
||||||
Has to be written...
|
|
||||||
|
|
||||||
|
|
||||||
5.6 ShowHideMenuCtl
|
|
||||||
-------------------
|
|
||||||
The official documentation provided by MS is incomplete.
|
|
||||||
|
|
||||||
lpInfo:
|
|
||||||
...
|
|
||||||
Both values of the first pair must be the handle to the applications main
|
|
||||||
menu.
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
5.7 Other undocumented functions
|
|
||||||
--------------------------------
|
|
||||||
Several other undocumented functions are used by IE4.
|
|
||||||
|
|
||||||
String functions:
|
|
||||||
(will be written...)
|
|
||||||
|
|
||||||
|
|
||||||
6. Epilogue
|
|
||||||
-----------
|
|
||||||
You see, much work has still to be done. If you are interested in writing
|
|
||||||
a control send me an e-mail. If you like to fix bugs or add some
|
|
||||||
functionality send an e-mail to the author of the control.
|
|
||||||
|
|
||||||
|
|
||||||
Eric Kohl <ekohl@abo.rhein-zeitung.de>
|
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
<chapter id="compiling">
|
||||||
|
<title>Compiling Wine</title>
|
||||||
|
<para>How to compile wine, and problems that may arise...</para>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -1,463 +0,0 @@
|
||||||
Copyright 1999 Adam Sacarny (magicbox@bestweb.net)
|
|
||||||
1. WHAT IS THE WINE CONFIG FILE?
|
|
||||||
|
|
||||||
The Wine config file stores various settings for Wine. These include:
|
|
||||||
Drives and Information about them
|
|
||||||
Directory Settings
|
|
||||||
Port Settings
|
|
||||||
The Wine look and feel
|
|
||||||
Wine's DLL Usage
|
|
||||||
|
|
||||||
2. HOW DO I MAKE ONE?
|
|
||||||
|
|
||||||
This section will guide you through the process of making a config file. Take a
|
|
||||||
look at the file <dirs to wine>/wine.ini
|
|
||||||
It is organized by section.
|
|
||||||
|
|
||||||
|
|
||||||
Name | Needed? | What it does
|
|
||||||
----------------------------------------------------------------
|
|
||||||
[Drive X] | yes | Sets up drives recognized by wine
|
|
||||||
[wine] | yes | Settings for wine directories
|
|
||||||
[DllDefaults] | recmd | Defaults for loading DLL's
|
|
||||||
[DllPairs] | recmd | Sanity checkers for DLL's
|
|
||||||
[DllOverrides] | recmd | Overides defaults for DLL loading
|
|
||||||
[options] | no | No one seems to know
|
|
||||||
[fonts] | yes | Font appearance and recognition
|
|
||||||
[serialports] | no | COM ports seen by wine
|
|
||||||
[parallelports] | no | LPT ports seen by wine
|
|
||||||
[spooler] | no | Print spooling
|
|
||||||
[ports] | no | Direct port access
|
|
||||||
[spy] | no | What to do with certain debug messages
|
|
||||||
[Registry] | no | Specifies locations of windows registry files
|
|
||||||
[tweak.layout] | recmd | Appearance of wine
|
|
||||||
[programs] | no | Programs to be run automatically
|
|
||||||
[Console] | no | Console settings
|
|
||||||
Recmd-Recommended
|
|
||||||
2.1 THE [Drive X] SECTION
|
|
||||||
It should be pretty self explanatory, but here is an in-depth tutorial about
|
|
||||||
them.
|
|
||||||
There are up to 6 lines for each drive in Wine.
|
|
||||||
|
|
||||||
[Drive X]
|
|
||||||
|
|
||||||
The above line begins the section for a drive whose letter is X.
|
|
||||||
|
|
||||||
Path=/dir/to/path
|
|
||||||
|
|
||||||
This path is where the drive will begin. When Wine is browsing in drive X, it
|
|
||||||
will see the files that are in the directory "/dir/to/path". Don't forget to
|
|
||||||
leave off the trailing slash!
|
|
||||||
|
|
||||||
Type=floppy|hd|cdrom|network <--- the |'s mean Type=<one of the options>
|
|
||||||
|
|
||||||
Sets up the type of drive Wine will see it as. Type must equal one of the four
|
|
||||||
"floppy", "hd", "cdrom", or "network". They are self-explanatory.
|
|
||||||
|
|
||||||
Label=blah
|
|
||||||
|
|
||||||
Defines the drive label. Generally only needed for programs that look for a
|
|
||||||
special CD-ROM. Info on finding the lable is in <dirs to
|
|
||||||
wine>/documentation/cdrom-labels. The label may be up to 11 characters.
|
|
||||||
|
|
||||||
Serial=deadbeef
|
|
||||||
|
|
||||||
Tells Wine the serial number of the drive. A few programs with intense
|
|
||||||
protection for pirating might need this, but otherwise don't use it. Up to 8
|
|
||||||
characters and hexadecimal.
|
|
||||||
|
|
||||||
Filesystem=msdos|win95|unix
|
|
||||||
|
|
||||||
Sets up the way Wine looks at files on the drive.
|
|
||||||
|
|
||||||
msdos -> Case insensitive filesystem. Alike to DOS and Windows 3.x.
|
|
||||||
8.3 is the maximum length of files (eightdot.123) - longer ones will be
|
|
||||||
truncated. (NOTE: this is a very bad choice if you plan on running apps
|
|
||||||
that use long filenames. win95 should work fine with apps that were
|
|
||||||
designed to run under the msdos system. In other words, you might not
|
|
||||||
want to use this.)
|
|
||||||
|
|
||||||
win95 -> Case insensitive. Alike to Windows 9x/NT 4. This is the long
|
|
||||||
filename filesystem you are probably used to working with. The
|
|
||||||
filesystem of choice for most applications to be run under wine.
|
|
||||||
PROBABLY THE ONE YOU WANT
|
|
||||||
|
|
||||||
unix -> Case sensitive. This filesystem has almost no use (Windows apps
|
|
||||||
expect case insensitive filenames). Try it if you dare, but win95 is a
|
|
||||||
much better choice.
|
|
||||||
|
|
||||||
Device=/dev/xx
|
|
||||||
|
|
||||||
Use this ONLY for floppy and cdrom devices. Using it on Extended2 partitions can
|
|
||||||
have dire results (When a windows app tries to do a lowlevel write, they do it
|
|
||||||
in a FAT way -- FAT does not mix with Extended2).
|
|
||||||
NOTE: This setting is not really important, almost all apps will have no
|
|
||||||
problem if it remains unspecified. For CD-ROMs you might want to add it to get
|
|
||||||
automatic label detection, though. If you are unsure about specifying device
|
|
||||||
names, just leave out this setting for your drives.
|
|
||||||
|
|
||||||
Here is a setup for Drive X, a generic hard drive:
|
|
||||||
[Drive X]
|
|
||||||
Path=/dos-a
|
|
||||||
Type=hd
|
|
||||||
Label=Hard Drive
|
|
||||||
Filesystem=win95
|
|
||||||
This is a setup for Drive X, a generic CD-ROM drive:
|
|
||||||
[Drive X]
|
|
||||||
Path=/dos-d
|
|
||||||
Type=cdrom
|
|
||||||
Label=Total Annihilation
|
|
||||||
Filesystem=win95
|
|
||||||
Device=/dev/hdc
|
|
||||||
And here is a setup for Drive X, a generic floppy drive:
|
|
||||||
[Drive X]
|
|
||||||
Type=floppy
|
|
||||||
Path=/mnt/floppy
|
|
||||||
Label=Floppy Drive
|
|
||||||
Serial=87654321
|
|
||||||
Filesystem=win95
|
|
||||||
Device=/dev/fd0
|
|
||||||
|
|
||||||
2.2 THE [wine] SECTION
|
|
||||||
|
|
||||||
The [wine] section of the configuration file contains information wine uses for
|
|
||||||
directories. When specifying the directories for the settings, make them as they
|
|
||||||
would appear in wine. If your drive C has a Path of /dos, and your windows
|
|
||||||
directory is located in /dos/windows, Windows=c:\windows.
|
|
||||||
|
|
||||||
Windows=c:\windows
|
|
||||||
|
|
||||||
Sets up the windows directory. Make one if you don't have windows. NO TRAILING
|
|
||||||
SLASH (NOT C:\windows\)!
|
|
||||||
|
|
||||||
System=c:\windows\system
|
|
||||||
|
|
||||||
Sets up where the windows system files are. Should reside in the directory used
|
|
||||||
for the "Windows" setting. If you don't have windows then this is where the
|
|
||||||
system files will go. NO TRAILING SLASH!
|
|
||||||
|
|
||||||
Temp=c:\temp
|
|
||||||
|
|
||||||
This should be the directory you want your temp files stored in. YOU MUST HAVE
|
|
||||||
WRITE ACCESS TO IT.
|
|
||||||
|
|
||||||
Path=c:\windows;c:\windows\system;c:\blanco
|
|
||||||
|
|
||||||
Behaves like the PATH setting on unix boxes. When wine is run like "wine
|
|
||||||
sol.exe", if sol.exe resides in a directory specified in the "Path" setting,
|
|
||||||
wine will run it (Of course, if sol.exe resides in the current directory, wine
|
|
||||||
will run that one). Make sure it always has your windows directory and system
|
|
||||||
directory (For this setup, it must have c:\windows;c:\windows\system).
|
|
||||||
|
|
||||||
SymbolTableFile=wine.sym
|
|
||||||
|
|
||||||
Sets up the symbol table file for the wine debugger. You probably don't need to
|
|
||||||
fiddle with this. May be useful if your wine is stripped.
|
|
||||||
|
|
||||||
printer=off|on
|
|
||||||
|
|
||||||
Tells wine whether to allow printer drivers and printing to work. Using these
|
|
||||||
things are pretty alpha, so you might want to watch out. Some people might find
|
|
||||||
it useful, however. If you're not planning on working on printing, don't even
|
|
||||||
add this to your wine.ini (It probably isn't already in it). Check out the
|
|
||||||
[spooler] and [parallelports] sections too.
|
|
||||||
|
|
||||||
2.3 INTRODUCTION TO DLL SECTIONS
|
|
||||||
|
|
||||||
There are a few things you will need to know before configuring the DLL sections
|
|
||||||
in your wine configuration file.
|
|
||||||
|
|
||||||
2.3.1 WINDOWS DLL PAIRS
|
|
||||||
|
|
||||||
Most windows DLL's have a win16 (Windows 3.x) and win32 (Windows 9x/NT)
|
|
||||||
form. The combination of the win16 and win32 DLL versions are called
|
|
||||||
the "DLL pair". This is a list of the most common pairs:
|
|
||||||
Win16 | Win32 | Native*
|
|
||||||
-----------------------------
|
|
||||||
KERNEL | KERNEL32 | No!
|
|
||||||
USER | USER32 | No!
|
|
||||||
SHELL | SHELL32 | Yes
|
|
||||||
GDI | GDI32 | No!
|
|
||||||
COMMDLG | COMDLG32 | Yes
|
|
||||||
VER | VERSION | Yes
|
|
||||||
*-Is it possible to use native dll with wine?(See next section)
|
|
||||||
|
|
||||||
2.3.2 DIFFERENT FORMS OF DLL'S
|
|
||||||
|
|
||||||
There are a few different forms of DLL's wine can load:
|
|
||||||
native -> The DLL's that are included with windows. Many windows
|
|
||||||
DLL's can be loaded in their native form. Many times these
|
|
||||||
native versions work better than their non-Microsoft equivalent
|
|
||||||
-- other times they don't.
|
|
||||||
elfdll -> ELF encapsulated windows DLL's. This is currently
|
|
||||||
experimental (Not working yet).
|
|
||||||
so -> Native ELF libraries. Will not work yet.
|
|
||||||
builtin -> The most common form of DLL loading. This is what you
|
|
||||||
will use if the DLL is error-prone in native form (KERNEL for
|
|
||||||
example), you don't have the native DLL, or you just want to be
|
|
||||||
Microsoft-free.
|
|
||||||
|
|
||||||
2.4 THE [DllDefaults] SECTION
|
|
||||||
|
|
||||||
These settings provide wine's default handling of DLL loading.
|
|
||||||
|
|
||||||
EXTRA_LD_LIBRARY_PATH=/dirs
|
|
||||||
|
|
||||||
The directory specified here is appended to the normal search path for certain
|
|
||||||
forms of DLL's (elfdll and .so).
|
|
||||||
|
|
||||||
DefaultLoadOrder = native, elfdll, so, builtin
|
|
||||||
|
|
||||||
This setting is a comma-delimited list of which order to attempt loading DLL's.
|
|
||||||
If the first option fails, it will try the second, and so on. The order
|
|
||||||
specified above is probably the best in most conditions.
|
|
||||||
|
|
||||||
2.5 THE [DllPairs] SECTION
|
|
||||||
|
|
||||||
This section is optional, but strongly recommended. If you try to use native
|
|
||||||
SHELL32, but builtin SHELL, you could have some big problems (native and
|
|
||||||
builtin/so/elfdll do certain things in different ways). Using different forms of
|
|
||||||
a pair is a *very*, **very** bad idea. By specifying DLL pairs here, wine will
|
|
||||||
print out a message if you use different forms of a pair.
|
|
||||||
You shouldn't need to change anything in this section, the following should work
|
|
||||||
fine in all cases:
|
|
||||||
|
|
||||||
[DllPairs]
|
|
||||||
kernel = kernel32
|
|
||||||
gdi = gdi32
|
|
||||||
user = user32
|
|
||||||
commdlg = comdlg32
|
|
||||||
commctrl= comctl32
|
|
||||||
ver = version
|
|
||||||
shell = shell32
|
|
||||||
lzexpand= lz32
|
|
||||||
winsock = wsock32
|
|
||||||
|
|
||||||
2.6 THE [DllOverrides] SECTION
|
|
||||||
|
|
||||||
The format for this section is the same for each line:
|
|
||||||
|
|
||||||
<DLL>{,<DLL>,<DLL>...} = <FORM>{,<FORM>,<FORM>...}
|
|
||||||
|
|
||||||
For example, to load builtin KERNEL pair (Case doesn't matter here):
|
|
||||||
|
|
||||||
kernel,kernel32 = builtin
|
|
||||||
|
|
||||||
To load the native COMMDLG pair, but if that doesn't work try builtin:
|
|
||||||
|
|
||||||
commdlg,comdlg32 = native,builtin
|
|
||||||
|
|
||||||
To load the native COMCTL32:
|
|
||||||
|
|
||||||
comctl32 = native
|
|
||||||
|
|
||||||
Here is a good generic setup (As it is defined in wine.ini that was included
|
|
||||||
with your wine package):
|
|
||||||
|
|
||||||
[DllOverrides]
|
|
||||||
kernel32, gdi32, user32 = builtin
|
|
||||||
kernel, gdi, user = builtin
|
|
||||||
toolhelp = builtin
|
|
||||||
comdlg32, commdlg = elfdll, builtin, native
|
|
||||||
version, ver = elfdll, builtin, native
|
|
||||||
shell32, shell = builtin, native
|
|
||||||
lz32, lzexpand = builtin, native
|
|
||||||
commctrl, comctl32 = builtin, native
|
|
||||||
wsock32, winsock = builtin
|
|
||||||
advapi32, crtdll, ntdll = builtin, native
|
|
||||||
mpr, winspool = builtin, native
|
|
||||||
ddraw, dinput, dsound = builtin, native
|
|
||||||
winmm, w32skrnl, msvfw32= builtin
|
|
||||||
wnaspi32, wow32 = builtin
|
|
||||||
system, display, wprocs = builtin
|
|
||||||
wineps = builtin
|
|
||||||
|
|
||||||
NOTE: You see that elfdll or so is the first option for a few of these dll's.
|
|
||||||
This will fail for you, but you won't notice it as wine will just use the second
|
|
||||||
or third option.
|
|
||||||
|
|
||||||
2.7 THE [options] SECTION
|
|
||||||
|
|
||||||
No one seems to know what this section is...
|
|
||||||
|
|
||||||
AllocSystemColors=100
|
|
||||||
|
|
||||||
System colors to allocate? Just leave it at 100.
|
|
||||||
|
|
||||||
2.8 THE [fonts] SECTION
|
|
||||||
|
|
||||||
This section sets up wine's font handling.
|
|
||||||
|
|
||||||
Resolution = 96
|
|
||||||
|
|
||||||
Since the way X handles fonts is different from the way Windows does, wine uses
|
|
||||||
a special mechanism to deal with them. It must scale them using the number
|
|
||||||
defined in the "Resolution" setting. 60-120 are reasonable values, 96 is a nice
|
|
||||||
in the middle one. If you have the real windows fonts available (<dirs to
|
|
||||||
wine>/documentation/ttfserver and fonts), this parameter will not be as
|
|
||||||
important. Of course, it's always good to get your X fonts working acceptably in
|
|
||||||
wine.
|
|
||||||
|
|
||||||
Default = -adobe-times-
|
|
||||||
|
|
||||||
The default font wine uses. Fool around with it if you'd like.
|
|
||||||
|
|
||||||
OPTIONAL:
|
|
||||||
|
|
||||||
The "Alias" setting allows you to map an X font to a font used in wine. This is
|
|
||||||
good for apps that need a special font you don't have, but a good replacement
|
|
||||||
exists. The syntax is like so:
|
|
||||||
|
|
||||||
AliasX = [Fake windows name],[Real X name]<,optional "masking" section>
|
|
||||||
|
|
||||||
Pretty straightforward. Replace "AliasX" with "Alias0", then "Alias1" and so on.
|
|
||||||
The fake windows name is the name that the font will be under a windows app in
|
|
||||||
wine. The real X name is the font name as seen by X (Run "xfontsel").
|
|
||||||
The optional "masking" section allows you to utilize the fake windows name you
|
|
||||||
define. If it is not used, then wine will just try to extract the fake windows
|
|
||||||
name itself and not use the value you enter.
|
|
||||||
|
|
||||||
Here is an example of an alias without masking. The font will show up in windows
|
|
||||||
apps as "Google". When defining an alias in a config file, forget about my
|
|
||||||
comment text (The "<-- blah" stuff)
|
|
||||||
|
|
||||||
Alias0 = Foo,--google- <-- Note the no spaces after the " = ". Important!
|
|
||||||
|
|
||||||
Here is an example with masking enabled. The font will show up as "Foo" in
|
|
||||||
windows apps.
|
|
||||||
|
|
||||||
Alias1 = Foo,--google-,subst
|
|
||||||
|
|
||||||
For more info check out <dirs to wine>/documentation/fonts
|
|
||||||
|
|
||||||
2.9 THE [serialports], [parallelports], [spooler], AND [ports] SECTIONS
|
|
||||||
|
|
||||||
Even though it sounds like a lot of sections, these are all closely related.
|
|
||||||
They all are for communications and parallel ports.
|
|
||||||
|
|
||||||
The [serialports] section tells wine what serial ports it is allowed to use.
|
|
||||||
|
|
||||||
ComX=/dev/cuaY
|
|
||||||
|
|
||||||
Replace X with the number of the COM port in Windows (1-8) and Y with the
|
|
||||||
number of it in X (Usually the number of the port in Windows minus 1). ComX can
|
|
||||||
actually equal any device (/dev/modem is acceptable). It is not always necessary
|
|
||||||
to define any COM ports (An optional setting). Here is an example:
|
|
||||||
|
|
||||||
Com1=/dev/cua0
|
|
||||||
|
|
||||||
Use as many of these as you like in the section to define all of the COM ports
|
|
||||||
you need.
|
|
||||||
|
|
||||||
The [parallelports] section sets up any parallel ports that will be allowed
|
|
||||||
access under wine.
|
|
||||||
|
|
||||||
LptX=/dev/lpY
|
|
||||||
|
|
||||||
Seem farmiliar? Syntax is just like the COM port setting. Replace X with a value
|
|
||||||
from 1-4 as it is in Windows and Y with a value from 0-3 (Y is usually the value
|
|
||||||
in windows minus 1, just like for COM ports). You don't always need to define a
|
|
||||||
parallel port (AKA, it's optional). As with the other section, LptX can equal
|
|
||||||
any device (Maybe /dev/printer). Here is an example:
|
|
||||||
|
|
||||||
Lpt1=/dev/lp0
|
|
||||||
|
|
||||||
The [spooler] section will inform wine where to spool print jobs. Use this if
|
|
||||||
you want to try printing. Wine docs claim that spooling is "rather primitive" at
|
|
||||||
this time, so it won't work perfectly. IT IS OPTIONAL
|
|
||||||
The only setting you use in this section works to map a port (LPT1, for example)
|
|
||||||
to a file or a command. Here is an example, mapping LPT1 to the file "out.ps":
|
|
||||||
|
|
||||||
LPT1:=out.ps
|
|
||||||
|
|
||||||
The following command maps printing jobs to LPT1 to the command "lpr". Notice
|
|
||||||
the |:
|
|
||||||
|
|
||||||
LPT1:=|lpr
|
|
||||||
|
|
||||||
The [ports] section is usually useful only for people who need direct port
|
|
||||||
access for programs requiring dongles or scanners. IF YOU DON'T NEED IT, DON'T
|
|
||||||
USE IT!
|
|
||||||
|
|
||||||
read=0x779,0x379,0x280-0x2a0
|
|
||||||
|
|
||||||
Gives direct read access to those IO's.
|
|
||||||
|
|
||||||
write=0x779,0x379,0x280-0x2a0
|
|
||||||
|
|
||||||
Gives direct write access to those IO's. It probably a good idea to keep the
|
|
||||||
values of the "read" and "write" settings the same. This stuff will only work
|
|
||||||
when you're root.
|
|
||||||
|
|
||||||
2.10 THE [spy], [Registry], [tweak.layout], and [programs] SECTIONS
|
|
||||||
|
|
||||||
[spy] is used to Include or exclude debug messages, and to output them to a
|
|
||||||
file. The latter is rarely used. THESE ARE ALL OPTIONAL AND YOU PROBABLY DON'T
|
|
||||||
NEED TO ADD OR REMOVE ANYTHING IN THIS SECTION TO YOUR CONFIG.
|
|
||||||
|
|
||||||
File=/blanco
|
|
||||||
|
|
||||||
Sets the logfile for wine. Set to CON to log to standard out. THIS IS RARELY
|
|
||||||
USED
|
|
||||||
|
|
||||||
Exclude=WM_SIZE;WM_TIMER;
|
|
||||||
|
|
||||||
Excludes debug messages about WM_SIZE and WM_TIMER in the logfile.
|
|
||||||
|
|
||||||
Include=WM_SIZE;WM_TIMER;
|
|
||||||
|
|
||||||
Includes debug messages about WM_SIZE and WM_TIMER in the logfile.
|
|
||||||
|
|
||||||
[Registry] can be used to tell wine where your old windows registry files exist. This
|
|
||||||
section is completely optional and useless to people using wine without an existing
|
|
||||||
windows installation.
|
|
||||||
|
|
||||||
UserFileName=/dirs/to/user.reg
|
|
||||||
|
|
||||||
The location of your old user.reg file.
|
|
||||||
|
|
||||||
LocalMachineFileName=/dirs/to/system.reg
|
|
||||||
|
|
||||||
The location of your old system.reg file.
|
|
||||||
|
|
||||||
[tweak.layout] is devoted to wine's look. There is only one setting for it.
|
|
||||||
|
|
||||||
WineLook=win31|win95|win98
|
|
||||||
|
|
||||||
Will change the look of wine from Windows 3.1 to Windows 95. "win98" behaves
|
|
||||||
just like "win95" most of the time.
|
|
||||||
|
|
||||||
[programs] can be used to say what programs run under special conditions.
|
|
||||||
|
|
||||||
Default=/program/to/execute.exe
|
|
||||||
|
|
||||||
Sets the program to be run if wine is started without specifying a program.
|
|
||||||
|
|
||||||
Startup=/program/to/execute.exe
|
|
||||||
|
|
||||||
Sets the program to automatically be run at startup every time.
|
|
||||||
|
|
||||||
3. WHERE DO I PUT IT?
|
|
||||||
|
|
||||||
The wine config file can go in two places.
|
|
||||||
|
|
||||||
/usr/local/etc/wine.conf <--- A systemwide config file, used for anyone
|
|
||||||
who doesn't have their own.
|
|
||||||
$HOME/.winerc <--- Your own config file, that only is used for your
|
|
||||||
user.
|
|
||||||
|
|
||||||
So copy the file you made to be the wine.conf to /usr/local/etc/wine.conf or
|
|
||||||
$HOME/.winerc for wine to recognize it.
|
|
||||||
|
|
||||||
4. WHAT IF IT DOESN'T WORK?
|
|
||||||
|
|
||||||
There is always a chance that things will go wrong. If the unthinkable happens,
|
|
||||||
try the newsgroup, comp.emulators.ms-windows.wine
|
|
||||||
Make sure that you have looked over this document thoroughly, and have also
|
|
||||||
read:
|
|
||||||
README
|
|
||||||
documentation/bugreports
|
|
||||||
http://www.westfalen.de/witch/wine-HOWTO.txt (Optional but recommended)
|
|
||||||
If indeed it looks like you've done your research, be prepared for helpful
|
|
||||||
suggestions. If you haven't, brace yourself for heaving flaming.
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,177 +0,0 @@
|
||||||
|
|
||||||
Console - First Pass
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
Consoles are just xterms created with the -Sxxn switch.
|
|
||||||
A pty is opened and the master goes to the xterm side
|
|
||||||
and the slave is held by the wine side. The console
|
|
||||||
itself it turned into a few HANDLE32s and is set
|
|
||||||
to the STD_*_HANDLES.
|
|
||||||
|
|
||||||
It is possible to use the WriteFile and ReadFile commands
|
|
||||||
to write to a win32 console. To accomplish this, all K32OBJs
|
|
||||||
that support I/O have a read and write function pointer.
|
|
||||||
So, WriteFile calls K32OBJ_WriteFile which calls the K32OBJ's
|
|
||||||
write function pointer, which then finally calls write.
|
|
||||||
|
|
||||||
[this paragraph is now out of date]
|
|
||||||
If the command line console is to be inheirited or
|
|
||||||
a process inherits its parent's console (-- can that happen???),
|
|
||||||
the console is created at process init time via PROCESS_InheritConsole.
|
|
||||||
The 0, 1, and 2 file descriptors are duped to be the
|
|
||||||
STD_*_HANDLES in this case. Also in this case a flag is set
|
|
||||||
to indicate that the console comes from the parent process or
|
|
||||||
command line.
|
|
||||||
|
|
||||||
If a process doesn't have a console at all, its
|
|
||||||
pdb->console is set to NULL. This helps indicate when
|
|
||||||
it is possible to create a new console (via AllocConsole).
|
|
||||||
|
|
||||||
|
|
||||||
When FreeConsole is called, all handles that the process has
|
|
||||||
open to the console are closed. Like most k32objs, if the
|
|
||||||
console's refcount reaches zero, its k32obj destroy function
|
|
||||||
is called. The destroy kills the xterm if one was open.
|
|
||||||
|
|
||||||
Also like most k32 objects, we assume that (K32OBJ) header is the
|
|
||||||
first field so the casting (from K32OBJ *to CONSOLE *)
|
|
||||||
works correctly.
|
|
||||||
|
|
||||||
FreeConsole is called on process exit (in ExitProcess) if
|
|
||||||
pdb->console is not NULL.
|
|
||||||
|
|
||||||
|
|
||||||
BUGS
|
|
||||||
----
|
|
||||||
Console processes do not inherit their parent's handles. I think
|
|
||||||
there needs to be two cases, one where they have to inherit
|
|
||||||
the stdin/stdout/stderr from unix, and one where they have to
|
|
||||||
inherit from another windows app.
|
|
||||||
|
|
||||||
SetConsoleMode -- UNIX only has ICANON and various ECHOs
|
|
||||||
to play around with for processing input. Win32 has
|
|
||||||
line-at-a-time processing, character processing, and
|
|
||||||
echo. I'm putting together an intermediate driver
|
|
||||||
that will handle this (and hopefully won't be any more
|
|
||||||
buggy then the NT4 console implementation).
|
|
||||||
|
|
||||||
|
|
||||||
================================================================
|
|
||||||
|
|
||||||
experimentation with NT4 yields that:
|
|
||||||
|
|
||||||
WriteFile
|
|
||||||
---------
|
|
||||||
o does not truncate file on 0 length write
|
|
||||||
o 0 length write or error on write changes numcharswritten to 0
|
|
||||||
o 0 length write returns TRUE
|
|
||||||
o works with console handles
|
|
||||||
|
|
||||||
_lwrite
|
|
||||||
-------
|
|
||||||
o does truncate/expand file at current position on 0 length write
|
|
||||||
o returns 0 on a zero length write
|
|
||||||
o works with console handles (typecasted)
|
|
||||||
|
|
||||||
WriteConsole
|
|
||||||
------------
|
|
||||||
o expects only console handles
|
|
||||||
|
|
||||||
|
|
||||||
SetFilePointer
|
|
||||||
--------------
|
|
||||||
o returns -1 (err 6) when used with a console handle
|
|
||||||
|
|
||||||
|
|
||||||
FreeConsole
|
|
||||||
-----------
|
|
||||||
o even when all the handles to it are freed, the win32 console
|
|
||||||
stays visible, the only way I could find to free it
|
|
||||||
was via the FreeConsole
|
|
||||||
|
|
||||||
|
|
||||||
Is it possible to interrupt win32's FileWrite? I'm not sure.
|
|
||||||
It may not be possible to interrupt any system calls.
|
|
||||||
|
|
||||||
|
|
||||||
DOS (Generic) Console Support
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
I. Command Line Configuration
|
|
||||||
|
|
||||||
DOS consoles must be configured either on the command line or in a dot
|
|
||||||
resource file (.console). A typical configuration consists of a string
|
|
||||||
of driver keywords separated by plus ('+') signs. To change the
|
|
||||||
configuration on the command-line, use the -console switch.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
wine -console ncurses+xterm <apllication>
|
|
||||||
|
|
||||||
Possible drivers:
|
|
||||||
|
|
||||||
tty - Generic text-only support. Supports redirection.
|
|
||||||
ncurses - Full-screen graphical support with color.
|
|
||||||
xterm - Load a new window to display the console in. Also
|
|
||||||
supports resizing windows.
|
|
||||||
|
|
||||||
|
|
||||||
II. Wine.conf Configuration
|
|
||||||
|
|
||||||
In the wine.conf file, you can create a section called [console] that
|
|
||||||
contains configuration options that are respected by the assorted
|
|
||||||
console drivers.
|
|
||||||
|
|
||||||
Current Options:
|
|
||||||
|
|
||||||
XtermProg=<program>
|
|
||||||
|
|
||||||
Use this program instead of xterm. This eliminates the need for a
|
|
||||||
recompile. See the table below for a comparison of various
|
|
||||||
terminals.
|
|
||||||
|
|
||||||
InitialRows=<number>
|
|
||||||
|
|
||||||
Attempt to start all drivers with this number of rows. This
|
|
||||||
causes xterms to be resized, for instance.
|
|
||||||
|
|
||||||
Note: This information is passed on the command-line with the
|
|
||||||
-g switch.
|
|
||||||
|
|
||||||
InitialColumns=<number>
|
|
||||||
|
|
||||||
Attempt to start all drivers with this number of columns. This
|
|
||||||
causes xterms to be resized, for instance.
|
|
||||||
|
|
||||||
Note: This information is passed on the command-line with the
|
|
||||||
-g switch.
|
|
||||||
|
|
||||||
TerminalType=<name>
|
|
||||||
|
|
||||||
Tell any driver that is interested (ncurses) which termcap
|
|
||||||
and/or terminfo type to use. The default is xterm which is
|
|
||||||
appropiate for most uses. "nxterm" may give you better support
|
|
||||||
if you use that terminal. This can also be changed to
|
|
||||||
"linux" (or "console" on older systems) if you manage to hack
|
|
||||||
the ability to write to the console into this driver.
|
|
||||||
|
|
||||||
III. Terminal Types
|
|
||||||
|
|
||||||
There are a large number of potential terminals that can be used with
|
|
||||||
Wine, depending on what you are trying to do. Unfortunately, I am still
|
|
||||||
looking for the "best" driver combination.
|
|
||||||
|
|
||||||
Note that 'slave' is required for use in Wine, currently.
|
|
||||||
|
|
||||||
Program | Color? | Resizing? | Slave?
|
|
||||||
-----------------------------------------
|
|
||||||
xterm N Y Y
|
|
||||||
nxterm Y N Y
|
|
||||||
rxvt Y ? N
|
|
||||||
|
|
||||||
(linux console) Y N ?
|
|
||||||
|
|
||||||
As X terminals typically use a 24x80 screen resolution rather than the
|
|
||||||
typical 25x80 one, it is necessary to resize the screen to allow a DOS
|
|
||||||
program to work full-screen. There is a wine.conf option to work
|
|
||||||
around this in some cases but run-time resizing will be disabled.
|
|
|
@ -0,0 +1,386 @@
|
||||||
|
<chapter id="consoles">
|
||||||
|
<title>Consoles in Wine</title>
|
||||||
|
|
||||||
|
<sect1 id="wine-consoles">
|
||||||
|
<title>Consoles</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by (???)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/console</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Console - First Pass</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Consoles are just xterms created with the
|
||||||
|
<parameter>-Sxxn</parameter> switch. A
|
||||||
|
<systemitem>pty</systemitem> is opened and the master goes
|
||||||
|
to the <filename>xterm</filename> side and the slave is held
|
||||||
|
by the wine side. The console itself it turned into a few
|
||||||
|
<type>HANDLE32</type>s and is set to the
|
||||||
|
<varname>STD_*_HANDLES</varname>.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
It is possible to use the <function>WriteFile</function> and
|
||||||
|
<function>ReadFile</function> commands to write to a win32
|
||||||
|
console. To accomplish this, all <type>K32OBJ</type>s that
|
||||||
|
support I/O have a read and write function pointer. So,
|
||||||
|
<function>WriteFile</function> calls
|
||||||
|
<function>K32OBJ_WriteFile</function> which calls the
|
||||||
|
<type>K32OBJ</type>'s write function pointer, which then
|
||||||
|
finally calls <function>write</function>.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
<emphasis>[this paragraph is now out of date]</emphasis> If
|
||||||
|
the command line console is to be inheirited or a process
|
||||||
|
inherits its parent's console (-- can that happen???), the
|
||||||
|
console is created at process init time via
|
||||||
|
<function>PROCESS_InheritConsole</function>. The
|
||||||
|
<literal>0</literal>, <literal>1</literal>, and
|
||||||
|
<literal>2</literal> file descriptors are duped to be the
|
||||||
|
<varname>STD_*_HANDLES</varname> in this case. Also in this
|
||||||
|
case a flag is set to indicate that the console comes from
|
||||||
|
the parent process or command line.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
If a process doesn't have a console at all, its
|
||||||
|
<varname>pdb->console</varname> is set to
|
||||||
|
<constant>NULL</constant>. This helps indicate when it is
|
||||||
|
possible to create a new console (via
|
||||||
|
<function>AllocConsole</function>).
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When <function>FreeConsole</function> is called, all handles that the process has
|
||||||
|
open to the console are closed. Like most <type>K32OBJ</type>s, if the
|
||||||
|
console's refcount reaches zero, its <type>K32OBJ</type> destroy function
|
||||||
|
is called. The destroy kills the xterm if one was open.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Also like most k32 objects, we assume that
|
||||||
|
(<type>K32OBJ</type>) header is the first field so the
|
||||||
|
casting (from <type>K32OBJ*</type>to <type>CONSOLE*</type>)
|
||||||
|
works correctly.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
<function>FreeConsole</function> is called on process exit
|
||||||
|
(in <function>ExitProcess</function>) if
|
||||||
|
<varname>pdb->console</varname> is not
|
||||||
|
<constant>NULL</constant>.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>BUGS</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Console processes do not inherit their parent's handles. I
|
||||||
|
think there needs to be two cases, one where they have to
|
||||||
|
inherit the <filename>stdin</filename> /
|
||||||
|
<filename>stdout</filename> / <filename>stderr</filename>
|
||||||
|
from unix, and one where they have to inherit from another
|
||||||
|
windows app.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
<function>SetConsoleMode</function> -- UNIX only has
|
||||||
|
<constant>ICANON</constant> and various
|
||||||
|
<constant>ECHO</constant>s to play around with for
|
||||||
|
processing input. Win32 has line-at-a-time processing,
|
||||||
|
character processing, and echo. I'm putting together an
|
||||||
|
intermediate driver that will handle this (and hopefully
|
||||||
|
won't be any more buggy then the NT4 console
|
||||||
|
implementation).
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Experimentation</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
experimentation with NT4 yields that:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><function>WriteFile</function></term>
|
||||||
|
<listitem>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>does not truncate file on 0 length write</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
0 length write or error on write changes
|
||||||
|
<varname>numcharswritten</varname> to
|
||||||
|
<literal>0</literal>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>0 length write returns <constant>TRUE</constant></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>works with console handles</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><function>_lwrite</function></term>
|
||||||
|
<listitem>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>does truncate/expand file at current position on 0 length write</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>returns 0 on a zero length write</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>works with console handles (typecasted)</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><function>WriteConsole</function></term>
|
||||||
|
<listitem>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>expects only console handles</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><function>SetFilePointer</function></term>
|
||||||
|
<listitem>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>returns -1 (err 6) when used with a console handle</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><function>FreeConsole</function></term>
|
||||||
|
<listitem>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
even when all the handles to it are freed, the
|
||||||
|
win32 console stays visible, the only way I could
|
||||||
|
find to free it was via the <function>FreeConsole</function>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Is it possible to interrupt win32's
|
||||||
|
<function>FileWrite</function>? I'm not sure. It may not be
|
||||||
|
possible to interrupt any system calls.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>DOS (Generic) Console Support</title>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>I. Command Line Configuration</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
DOS consoles must be configured either on the command line
|
||||||
|
or in a dot resource file (<filename>.console</filename>).
|
||||||
|
A typical configuration consists of a string of driver
|
||||||
|
keywords separated by plus ('+') signs. To change the
|
||||||
|
configuration on the command-line, use the
|
||||||
|
<parameter>-console</parameter> switch.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
For example:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
wine -console ncurses+xterm <application>
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
Possible drivers:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>tty:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Generic text-only support. Supports redirection.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>ncurses:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Full-screen graphical support with color.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>xterm:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Load a new window to display the console in. Also
|
||||||
|
supports resizing windows.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>II. <filename>wine.conf</filename> Configuration</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
In the <filename>wine.conf</filename> file, you can create
|
||||||
|
a section called [console] that contains configuration
|
||||||
|
options that are respected by the assorted console
|
||||||
|
drivers.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Current Options:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>XtermProg=<program></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Use this program instead of
|
||||||
|
<command>xterm</command>. This eliminates the need
|
||||||
|
for a recompile. See the table below for a
|
||||||
|
comparison of various terminals.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>InitialRows=<number></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Attempt to start all drivers with this number of
|
||||||
|
rows. This causes xterms to be resized, for
|
||||||
|
instance.
|
||||||
|
</para>
|
||||||
|
<note>
|
||||||
|
<para>
|
||||||
|
This information is passed on the command-line
|
||||||
|
with the <parameter>-g</parameter> switch.
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>InitialColumns=<number></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Attempt to start all drivers with this number of
|
||||||
|
columns. This causes xterms to be resized, for
|
||||||
|
instance.
|
||||||
|
</para>
|
||||||
|
<note>
|
||||||
|
<para>
|
||||||
|
This information is passed on the command-line
|
||||||
|
with the <parameter>-g</parameter> switch.
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>TerminalType=<name></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Tell any driver that is interested (ncurses) which
|
||||||
|
termcap and/or terminfo type to use. The default is
|
||||||
|
xterm which is appropiate for most uses.
|
||||||
|
<command>nxterm</command> may give you better
|
||||||
|
support if you use that terminal. This can also be
|
||||||
|
changed to "linux" (or "console" on older systems)
|
||||||
|
if you manage to hack the ability to write to the
|
||||||
|
console into this driver.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>III. Terminal Types</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
There are a large number of potential terminals that can
|
||||||
|
be used with Wine, depending on what you are trying to do.
|
||||||
|
Unfortunately, I am still looking for the "best" driver
|
||||||
|
combination.
|
||||||
|
</para>
|
||||||
|
<note>
|
||||||
|
<para>
|
||||||
|
'slave' is required for use in Wine, currently.
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
|
||||||
|
<informaltable>
|
||||||
|
<tgroup cols="4">
|
||||||
|
<thead>
|
||||||
|
<row>
|
||||||
|
<entry>Program</entry>
|
||||||
|
<entry>Color?</entry>
|
||||||
|
<entry>Resizing?</entry>
|
||||||
|
<entry>Slave?</entry>
|
||||||
|
</row>
|
||||||
|
</thead>
|
||||||
|
<tfoot>
|
||||||
|
<row>
|
||||||
|
<entry>(linux console)</entry>
|
||||||
|
<entry>Y</entry>
|
||||||
|
<entry>N</entry>
|
||||||
|
<entry>?</entry>
|
||||||
|
</row>
|
||||||
|
</tfoot>
|
||||||
|
<tbody>
|
||||||
|
<row>
|
||||||
|
<entry>xterm</entry>
|
||||||
|
<entry>N</entry>
|
||||||
|
<entry>Y</entry>
|
||||||
|
<entry>Y</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>nxterm</entry>
|
||||||
|
<entry>Y</entry>
|
||||||
|
<entry>N</entry>
|
||||||
|
<entry>Y</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>rxvt</entry>
|
||||||
|
<entry>Y</entry>
|
||||||
|
<entry>?</entry>
|
||||||
|
<entry>N</entry>
|
||||||
|
</row>
|
||||||
|
</tbody>
|
||||||
|
</tgroup>
|
||||||
|
</informaltable>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
As X terminals typically use a 24x80 screen resolution
|
||||||
|
rather than the typical 25x80 one, it is necessary to
|
||||||
|
resize the screen to allow a DOS program to work
|
||||||
|
full-screen. There is a <filename>wine.conf</filename>
|
||||||
|
option to work around this in some cases but run-time
|
||||||
|
resizing will be disabled.
|
||||||
|
</para>
|
||||||
|
</sect3>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -1,470 +0,0 @@
|
||||||
Note: The new debugging interface can be considered to be stable,
|
|
||||||
with the exception of the in-memory message construction functions.
|
|
||||||
However, there is still a lot of work to be done to polish
|
|
||||||
things up. To make my life easier, please follow the guidelines
|
|
||||||
described in this document.
|
|
||||||
|
|
||||||
Read this document before writing new code. DO NOT USE fprintf
|
|
||||||
(or printf) to output things. Also, instead of writing
|
|
||||||
FIXMEs in the source, output a FIXME message if you can.
|
|
||||||
|
|
||||||
IMPORTANT: at the end of the document, there is a "Style Guide"
|
|
||||||
for debugging messages. Please read it.
|
|
||||||
|
|
||||||
28 Mar 1998, Dimitrie O. Paun <dimi@cs.toronto.edu>
|
|
||||||
|
|
||||||
|
|
||||||
Debugging classes
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
There are 4 types (or classes) of debugging messages:
|
|
||||||
|
|
||||||
FIXME -- Messages in this class relate to behavior of Wine that does
|
|
||||||
not correspond to standard Windows behavior and that should
|
|
||||||
be fixed.
|
|
||||||
Examples: stubs, semi-implemented features, etc.
|
|
||||||
|
|
||||||
ERR -- Messages in this class relate to serious errors in Wine.
|
|
||||||
This sort of messages are close to asserts -- that is,
|
|
||||||
you should output an error message when the code detects a
|
|
||||||
condition which should not happen. In other words, important
|
|
||||||
things that are not warnings (see below), are errors.
|
|
||||||
Examples: unexpected change in internal state, etc.
|
|
||||||
|
|
||||||
WARN -- These are warning messages. You should report a warning when
|
|
||||||
something unwanted happen but the function behaves properly.
|
|
||||||
That is, output a warning when you encounter something
|
|
||||||
unexpected (ex: could not open a file) but the function deals
|
|
||||||
correctly with the situation (that is, according to the docs).
|
|
||||||
If you do not deal correctly with it, output a fixme.
|
|
||||||
Examples: fail to access a resource required by the app, etc.
|
|
||||||
|
|
||||||
TRACE -- These are detailed debugging messages that are mainly useful
|
|
||||||
to debug a component. These are usually turned off.
|
|
||||||
Examples: everything else that does not fall in one of the
|
|
||||||
above mentioned categories and the user does not
|
|
||||||
need to know about it.
|
|
||||||
|
|
||||||
|
|
||||||
The user has the capability to turn on or off messages of a particular
|
|
||||||
type. You can expect the following patterns of usage (but note that
|
|
||||||
any combination is possible):
|
|
||||||
-- when you debug a component, all types (TRACE,WARN,ERR,FIXME)
|
|
||||||
will be enabled.
|
|
||||||
-- during the pre-alpha (maybe alpha) stage of Wine, most likely
|
|
||||||
the TRACE class will be disabled by default, but all others
|
|
||||||
(WARN,ERR,FIXME) will be enabled by default.
|
|
||||||
-- when Wine will become stable, most likely the TRACE and WARN
|
|
||||||
classes will be disabled by default, but all ERRs and FIXMEs
|
|
||||||
will be enabled.
|
|
||||||
-- in some installations that want the smallest footprint
|
|
||||||
and where the debug information is of no interest,
|
|
||||||
all classes may be disabled by default.
|
|
||||||
|
|
||||||
Of course, the user will have the runtime ability to override these
|
|
||||||
defaults. However, this ability may be turned off and certain classes
|
|
||||||
of messages may be completely disabled at compile time to reduce the
|
|
||||||
size of Wine.
|
|
||||||
|
|
||||||
Debugging channels
|
|
||||||
------------------
|
|
||||||
|
|
||||||
Also, we divide the debugging messages on a component basis. Each
|
|
||||||
component is assigned a debugging channel. The identifier of the
|
|
||||||
channel must be a valid C identifier but note that it may also be a
|
|
||||||
reserved word like int or static.
|
|
||||||
|
|
||||||
Examples of debugging channels:
|
|
||||||
reg, updown, string
|
|
||||||
|
|
||||||
We will refer to a generic channel as xxx.
|
|
||||||
|
|
||||||
Note: for those who know the old interface, the channel/type is
|
|
||||||
what followed the _ in the dprintf_xxx statements.
|
|
||||||
For example, to output a message on the debugging channel
|
|
||||||
reg in the old interface you would had to write:
|
|
||||||
|
|
||||||
dprintf_reg(stddeb, "Could not access key!\n");
|
|
||||||
|
|
||||||
In the new interface, we drop the stddeb as it is implicit.
|
|
||||||
However, we add an orthogonal piece of information to the
|
|
||||||
message: its class. This is very important as it will allow
|
|
||||||
us to selectively turn on or off certain messages based on the
|
|
||||||
type of information they report. For this reason it is essential
|
|
||||||
to choose the right class for the message.
|
|
||||||
Anyhow, suppose we figured that this message should belong
|
|
||||||
in the WARN class, so in the new interface, you write:
|
|
||||||
|
|
||||||
WARN(reg, "Could not access key!\n");
|
|
||||||
---
|
|
||||||
|
|
||||||
How to use it
|
|
||||||
-------------
|
|
||||||
|
|
||||||
So, to output a message (class YYY) on channel xxx, do:
|
|
||||||
|
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
....
|
|
||||||
|
|
||||||
YYY(xxx, "<message>", ...);
|
|
||||||
|
|
||||||
|
|
||||||
Some examples from the code:
|
|
||||||
|
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
TRACE(crtdll, "CRTDLL_setbuf(file %p buf %p)", file, buf);
|
|
||||||
|
|
||||||
WARN(aspi, "Error opening device errno=%d", save_error);
|
|
||||||
|
|
||||||
|
|
||||||
If you need to declare a new debugging channel, use it in your code
|
|
||||||
and then do:
|
|
||||||
%tools/make_debug
|
|
||||||
in the root directory of Wine.
|
|
||||||
|
|
||||||
Note that this will result in almost complete recompilation of Wine.
|
|
||||||
|
|
||||||
Notes:
|
|
||||||
1. Please pay attention to which class you assign the message.
|
|
||||||
There are only 4 classes, so it is not hard. The reason
|
|
||||||
it is important to get it right is that too much information
|
|
||||||
is no information. For example, if you put things into the
|
|
||||||
WARN class that should really be in the TRACE class, the
|
|
||||||
output will be too big and this will force the user to
|
|
||||||
turn warnings off. But this way he will fail to see the important
|
|
||||||
ones. Also, if you put warnings into the TRACE class lets say,
|
|
||||||
he will most likely miss those because usually the TRACE class
|
|
||||||
is turned off. A similar argument can be made if you mix any
|
|
||||||
other two classes.
|
|
||||||
2. All lines should end with a newline.If you can NOT output
|
|
||||||
everything that you want in the line with only one statement,
|
|
||||||
then you need to build the string in memory.
|
|
||||||
Please read the section below "In-memory messages" on the
|
|
||||||
preferred way to do it. PLEASE USE THAT INTERFACE TO BUILD
|
|
||||||
MESSAGES IN MEMORY. The reason is that we are not sure that
|
|
||||||
we like it and having everything in one format will facilitate
|
|
||||||
the (automatic) translation to a better interface.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Are we debugging?
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
To test whether the debugging output of class yyy on channel xxx is
|
|
||||||
enabled, use:
|
|
||||||
|
|
||||||
TRACE_ON to test if TRACE is enabled
|
|
||||||
WARN_ON to test if WARN is enabled
|
|
||||||
FIXME_ON to test if FIXME is enabled
|
|
||||||
ERR_ON to test if ERR is enabled
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
if(TRACE_ON(atom)){
|
|
||||||
...blah...
|
|
||||||
}
|
|
||||||
|
|
||||||
Note that you should normally need to test only if TRACE_ON. At present,
|
|
||||||
none of the other 3 tests (except for ERR_ON which is used only once!)
|
|
||||||
are used in Wine.
|
|
||||||
|
|
||||||
In-memory messages
|
|
||||||
------------------
|
|
||||||
|
|
||||||
If you NEED to build the message from multiple calls, you need to
|
|
||||||
build it in memory. To do that, you should use the following
|
|
||||||
interface:
|
|
||||||
|
|
||||||
- declare a string (where you are allowed to declare C variables)
|
|
||||||
as follows:
|
|
||||||
dbg_decl_str(name, len);
|
|
||||||
where name is the name of the string (you should use the channel
|
|
||||||
name on which you are going to output it)
|
|
||||||
|
|
||||||
- print in it with:
|
|
||||||
dsprintf(name, "<message>", ...);
|
|
||||||
which is just like a sprintf function but instead of a C string as
|
|
||||||
first parameter it takes the name you used to declare it.
|
|
||||||
|
|
||||||
- obtain a pointer to the string with:
|
|
||||||
dbg_str(name)
|
|
||||||
|
|
||||||
- reset the string (if you want to reuse it with):
|
|
||||||
dbg_reset_str(name);
|
|
||||||
|
|
||||||
Example (modified from the code):
|
|
||||||
|
|
||||||
void some_func(tabs)
|
|
||||||
{
|
|
||||||
INT32 i;
|
|
||||||
LPINT16 p = (LPINT16)tabs;
|
|
||||||
dbg_decl_str(listbox, 256); /* declare the string */
|
|
||||||
|
|
||||||
for (i = 0; i < descr->nb_tabs; i++) {
|
|
||||||
descr->tabs[i] = *p++<<1;
|
|
||||||
if(TRACING(listbox)) /* write in it only if
|
|
||||||
dsprintf(listbox, "%hd ", descr->tabs[i]); /* we are gonna output it */
|
|
||||||
}
|
|
||||||
TRACE(listbox, "Listbox %04x: settabstops %s",
|
|
||||||
wnd->hwndSelf, dbg_str(listbox)); /* output the whole thing */
|
|
||||||
}
|
|
||||||
|
|
||||||
If you need to use it two times in the same scope do like this:
|
|
||||||
|
|
||||||
void some_func(tabs)
|
|
||||||
{
|
|
||||||
INT32 i;
|
|
||||||
LPINT16 p = (LPINT16)tabs;
|
|
||||||
dbg_decl_str(listbox, 256); /* declare the string */
|
|
||||||
|
|
||||||
for (i = 0; i < descr->nb_tabs; i++) {
|
|
||||||
descr->tabs[i] = *p++<<1;
|
|
||||||
if(TRACING(listbox)) /* write in it only if
|
|
||||||
dsprintf(listbox, "%hd ", descr->tabs[i]); /* we are gonna output it */
|
|
||||||
}
|
|
||||||
TRACE(listbox, "Listbox %04x: settabstops %s\n",
|
|
||||||
wnd->hwndSelf, dbg_str(listbox)); /* output the whole thing */
|
|
||||||
|
|
||||||
dbg_reset_str(listbox); /* !!!reset the string!!! */
|
|
||||||
for (i = 0; i < descr->extrainfo_nr; i++) {
|
|
||||||
descr->extrainfo = *p+1;
|
|
||||||
if(TRACING(listbox)) /* write in it only if
|
|
||||||
dsprintf(listbox,"%3d ",descr->extrainfo); /* we are gonna output it */
|
|
||||||
}
|
|
||||||
|
|
||||||
TRACE(listbox, "Listbox %04x: extrainfo %s\n",
|
|
||||||
wnd->hwndSelf, dbg_str(listbox)); /* output the whole thing */
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
IMPORTANT NOTE:
|
|
||||||
As I already stated, I do not think this will be the ultimate interface
|
|
||||||
for building in-memory debugging messages. In fact, I do have better ideas
|
|
||||||
which I hope to have time to implement for the next release. For this
|
|
||||||
reason, please try not to use it. However, if you need to output a line
|
|
||||||
in more than one dprintf_xxx calls, then USE THIS INTERFACE. DO NOT use
|
|
||||||
other methods. This way, I will easily translate everything to the new
|
|
||||||
interface (when it will become available). So, if you need to use it,
|
|
||||||
then follow the following guidelines:
|
|
||||||
-- wrap calls to dsprintf with a
|
|
||||||
if(YYY(xxx))
|
|
||||||
dsprintf(xxx,...);
|
|
||||||
Of course, if the call to dsprintf is made from within a function
|
|
||||||
which you know is called only if YYY(xxx) is true
|
|
||||||
(say you call it only like this:
|
|
||||||
if(YYY(xxx))
|
|
||||||
print_some_debug_info();
|
|
||||||
)
|
|
||||||
then you need not (and should not) wrap calls to dsprintf with
|
|
||||||
the before mentioned if.
|
|
||||||
-- name the string EXACTLY like the debugging channel on which
|
|
||||||
is going to be output. Please see the above example.
|
|
||||||
|
|
||||||
|
|
||||||
Resource identifiers
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
Resource identifiers can be either strings or numbers. To make life a bit
|
|
||||||
easier for outputting this beasts (and to help you avoid the need to build
|
|
||||||
the message in memory), I introduced a new function called:
|
|
||||||
|
|
||||||
debugres
|
|
||||||
|
|
||||||
The function is defined in debugstr.h
|
|
||||||
and has the following prototype:
|
|
||||||
|
|
||||||
LPSTR debugres(const void *id);
|
|
||||||
|
|
||||||
It takes a pointer to the resource id and returns a nicely formatted
|
|
||||||
string of the identifier.
|
|
||||||
|
|
||||||
It the high word of the pointer is 0, then it assumes that the
|
|
||||||
identifier is a number and thus returns a string of the form:
|
|
||||||
|
|
||||||
#xxxx
|
|
||||||
|
|
||||||
where xxxx are 4 hex-digits representing the low word of id.
|
|
||||||
|
|
||||||
It the high word of the pointer is not 0, then it assumes that the
|
|
||||||
identifier is a string and thus returns a string of the form:
|
|
||||||
|
|
||||||
'<identifier>'
|
|
||||||
|
|
||||||
Thus, to use it, do something on the following lines:
|
|
||||||
|
|
||||||
#include "debug.h"
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
YYY(xxx, "resource is %s", debugres(myresource));
|
|
||||||
|
|
||||||
|
|
||||||
The -debugmsg command line option
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
So, the -debugmsg command line option has been changed as follows:
|
|
||||||
- the new syntax is: -debugmsg [yyy]#xxx[,[yyy1]#xxx1]*
|
|
||||||
where # is either + or -
|
|
||||||
|
|
||||||
- when the optional class argument (yyy) is not present,
|
|
||||||
then the statement will enable(+)/disable(-) all messages for
|
|
||||||
the given channel (xxx) on all classes. For example:
|
|
||||||
|
|
||||||
-debugmsg +reg,-file
|
|
||||||
|
|
||||||
enables all messages on the reg channel and disables all
|
|
||||||
messages on the file channel.
|
|
||||||
This is same as the old semantics.
|
|
||||||
|
|
||||||
- when the optional class argument (yyy) is present,
|
|
||||||
then the statement will enable(+)/disable(-) messages for
|
|
||||||
the given channel (xxx) only on the given class. For example:
|
|
||||||
|
|
||||||
-debugmsg trace+reg,warn-file
|
|
||||||
|
|
||||||
enables trace messages on the reg channel and disables warning
|
|
||||||
messages on the file channel.
|
|
||||||
|
|
||||||
- also, the pseudo-channel all is also supported and it has the
|
|
||||||
intuitive semantics:
|
|
||||||
|
|
||||||
-debugmsg +all -- enables all debug messages
|
|
||||||
-debugmsg -all -- disables all debug messages
|
|
||||||
-debugmsg yyy+all -- enables debug messages for class yyy on all
|
|
||||||
channels.
|
|
||||||
-debugmsg yyy-all -- disables debug messages for class yyy on all
|
|
||||||
channels.
|
|
||||||
|
|
||||||
So, for example:
|
|
||||||
|
|
||||||
-debugmsg warn-all -- disables all warning messages.
|
|
||||||
|
|
||||||
|
|
||||||
Also, note that at the moment:
|
|
||||||
- the fixme and err classes are enabled by default
|
|
||||||
- the trace and warn classes are disabled by default
|
|
||||||
|
|
||||||
|
|
||||||
Compiling Out Debugging Messages
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
To compile out the debugging messages, provide configure with the
|
|
||||||
following options:
|
|
||||||
|
|
||||||
--disable-debug -- turns off TRACE, WARN, and FIXME (and DUMP).
|
|
||||||
|
|
||||||
--disable-trace -- turns off TRACE only.
|
|
||||||
|
|
||||||
This will result in an executable that, when stripped, is about 15%-20%
|
|
||||||
smaller. Note, however, that you will not be able to effectively debug
|
|
||||||
Wine without these messages.
|
|
||||||
|
|
||||||
This feature has not been extensively tested--it may subtly break some
|
|
||||||
things.
|
|
||||||
|
|
||||||
|
|
||||||
A Few Notes on Style
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
This new scheme makes certain things more consistent but there is still
|
|
||||||
room for improvement by using a common style of debug messages. Before
|
|
||||||
I continue, let me note that the output format is the following:
|
|
||||||
|
|
||||||
yyy:xxx:fff <message>
|
|
||||||
|
|
||||||
where:
|
|
||||||
yyy = the class (fixme, err, warn, trace)
|
|
||||||
xxx = the channel (atom, win, font, etc)
|
|
||||||
fff = the function name
|
|
||||||
these fields are output automatically. All you have to provide is
|
|
||||||
the <message> part.
|
|
||||||
|
|
||||||
So here are some ideas:
|
|
||||||
|
|
||||||
* do NOT include the name of the function: it is included automatically
|
|
||||||
|
|
||||||
* if you want to output the parameters of the function, do it as the first
|
|
||||||
thing and include them in parenthesis, like this:
|
|
||||||
|
|
||||||
YYY(xxx, "(%d,%p,etc)...\n", par1, par2, ...);
|
|
||||||
|
|
||||||
* for stubs, you should output a FIXME message. I suggest this style:
|
|
||||||
|
|
||||||
FIXME(xxx, "(%x,%d...): stub\n", par1, par2, ...);
|
|
||||||
|
|
||||||
That is, you output the parameters, then a : and then a string
|
|
||||||
containing the word "stub". I've seen "empty stub", and others, but I
|
|
||||||
think that just "stub" suffices.
|
|
||||||
|
|
||||||
* output 1 and ONLY 1 line per message. That is, the format string should
|
|
||||||
contain only 1 \n and it should always appear at the end of the string.
|
|
||||||
(there are many reasons for this requirement, one of them is that each
|
|
||||||
debug macro adds things to the beginning of the line)
|
|
||||||
|
|
||||||
* if you want to name a value, use = and NOT :. That is, instead of
|
|
||||||
saying:
|
|
||||||
FIXME(xxx, "(fd: %d, file: %s): stub\n", fd, name);
|
|
||||||
say:
|
|
||||||
FIXME(xxx, "(fd=%d, file=%s): stub\n", fd, name);
|
|
||||||
|
|
||||||
use : to separate categories.
|
|
||||||
|
|
||||||
* try to avoid the style:
|
|
||||||
|
|
||||||
FIXME(xxx,
|
|
||||||
"(fd=%d, file=%s): stub\n", fd, name);
|
|
||||||
but use:
|
|
||||||
|
|
||||||
FIXME(xxx, "(fd=%d, file=%s): stub\n", fd, name);
|
|
||||||
|
|
||||||
The reason is that if you want to grep for things, you would search for
|
|
||||||
FIXME but in the first case there is no additional information available,
|
|
||||||
where in the second one, there is (e.g. the word stub)
|
|
||||||
|
|
||||||
* if you output a string s that might contain control characters,
|
|
||||||
or if s may be null, use debugstr_a (for ASCII strings, or
|
|
||||||
debugstr_w for Unicode strings) to convert s to a C string, like
|
|
||||||
this:
|
|
||||||
|
|
||||||
HANDLE32 WINAPI YourFunc(LPCSTR s)
|
|
||||||
{
|
|
||||||
FIXME(xxx, "(%s): stub\n", debugstr_a(s));
|
|
||||||
}
|
|
||||||
|
|
||||||
* if you want to output a resource identifier, use debugres to
|
|
||||||
convert it to a string first, like this:
|
|
||||||
|
|
||||||
HANDLE32 WINAPI YourFunc(LPCSTR res)
|
|
||||||
{
|
|
||||||
FIXME(xxx, "(res=%s): stub\n", debugres(s));
|
|
||||||
}
|
|
||||||
|
|
||||||
if the resource identifier is a SEGPTR, use PTR_SEG_TO_LIN to get a
|
|
||||||
liner pointer first:
|
|
||||||
|
|
||||||
HRSRC16 WINAPI FindResource16( HMODULE16 hModule, SEGPTR name, SEGPTR type )
|
|
||||||
{
|
|
||||||
[...]
|
|
||||||
TRACE(resource, "module=%04x name=%s type=%s\n",
|
|
||||||
hModule, debugres(PTR_SEG_TO_LIN(name)),
|
|
||||||
debugres(PTR_SEG_TO_LIN(type)) );
|
|
||||||
[...]
|
|
||||||
}
|
|
||||||
|
|
||||||
* for messages intended for the user (specifically those that report
|
|
||||||
errors in wine.conf), use the MSG macro. Use it like a printf:
|
|
||||||
|
|
||||||
MSG( "Definition of drive %d is incorrect!\n", drive );
|
|
||||||
|
|
||||||
However, note that there are _very_ few valid uses of this macro.
|
|
||||||
Most messages are debugging messages, so chances are you will not
|
|
||||||
need to use this macro. Grep the source to get an idea where it
|
|
||||||
is appropriate to use it.
|
|
||||||
|
|
||||||
* for structure dumps, use the DUMP macro. Use it like a printf,
|
|
||||||
just like the MSG macro. Similarly, there are only a few valid
|
|
||||||
uses of this macro. Grep the source to see when to use it.
|
|
|
@ -0,0 +1,847 @@
|
||||||
|
<chapter id="debugger">
|
||||||
|
<title>The Wine Debugger</title>
|
||||||
|
|
||||||
|
<sect1 id="dbg-intro">
|
||||||
|
<title>I Introduction</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by Eric Pouech (???) (Last updated: 6/14/2000)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/winedbg</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>I.1 Processes and threads: in underlying OS and in Windows</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Before going into the depths of debugging in Wine, here's
|
||||||
|
a small overview of process and thread handling in Wine.
|
||||||
|
It has to be clear that there are two different beasts:
|
||||||
|
processes/threads from the Unix point of view and
|
||||||
|
processes/threads from a Windows point of view.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Each Windows' thread is implemented as a Unix process (under
|
||||||
|
Linux using the <function>clone</function> syscall), meaning
|
||||||
|
that all threads of a same Windows' process share the same
|
||||||
|
(unix) address space.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
In the following:
|
||||||
|
</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para><varname>W-process</varname> means a process in Windows' terminology</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para><varname>U-process</varname> means a process in Unix' terminology</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para><varname>W-thread</varname> means a thread in Windows' terminology</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
<para>
|
||||||
|
A <varname>W-process</varname> is made of one or several
|
||||||
|
<varname>W-threads</varname>. Each
|
||||||
|
<varname>W-thread</varname> is mapped to one and only one
|
||||||
|
<varname>U-process</varname>. All
|
||||||
|
<varname>U-processes</varname> of a same
|
||||||
|
<varname>W-process</varname> share the same address space.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Each Unix process can be identified by two values:
|
||||||
|
</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>the Unix process id (<varname>upid</varname> in the following)</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>the Windows's thread id (<varname>tid</varname>)</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
<para>
|
||||||
|
Each Windows' process has also a Windows' process id
|
||||||
|
(<varname>wpid</varname> in the following). It must be clear
|
||||||
|
that <varname>upid</varname> and <varname>wpid</varname> are
|
||||||
|
different and shall not be used instead of the other.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
<varname>Wpid</varname> and <varname>tid</varname> are
|
||||||
|
defined (Windows) system wide. They must not be confused
|
||||||
|
with process or thread handles which, as any handle, is an
|
||||||
|
indirection to a system object (in this case process or
|
||||||
|
thread). A same process can have several different handles
|
||||||
|
on the same kernel object. The handles can be defined as
|
||||||
|
local (the values is only valid in a process), or system
|
||||||
|
wide (the same handle can be used by any
|
||||||
|
<varname>W-process</varname>).
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>I.2 Wine, debugging and WineDbg</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
When talking of debugging in Wine, there are at least two
|
||||||
|
levels to think of:
|
||||||
|
</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>the Windows' debugging API.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>the Wine integrated debugger, dubbed
|
||||||
|
<command>WineDbg</command>.</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
<para>
|
||||||
|
Wine implements most the the Windows' debugging API (the
|
||||||
|
part in KERNEL32, not the one in
|
||||||
|
<filename>IMAGEHLP.DLL</filename>), and allows any program
|
||||||
|
(emulated or WineLib) using that API to debug a
|
||||||
|
<varname>W-process</varname>.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
<command>WineDbg</command> is a WineLib application making
|
||||||
|
use of this API to allow debugging both any Wine or WineLib
|
||||||
|
applications as well as Wine itself (kernel and all DLLs).
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="dbg-modes">
|
||||||
|
<title>II WineDbg's modes of invocation</title>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>II.1 Starting a process</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Any application (either a Windows' native executable, or a
|
||||||
|
WineLib application) can be run through
|
||||||
|
<command>WineDbg</command>. Command line options and tricks
|
||||||
|
are the same as for wine:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
winedbg telnet.exe
|
||||||
|
winedbg "hl.exe -windowed"
|
||||||
|
</screen>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>II.2 Attaching</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
<command>WineDbg</command> can also be launched without any
|
||||||
|
command line argument: <command>WineDbg</command> is started
|
||||||
|
without any attached process. You can get a list of running
|
||||||
|
<varname>W-processes</varname> (and their
|
||||||
|
<varname>wpid</varname>'s) using the <command>walk
|
||||||
|
process</command> command, and then, with the
|
||||||
|
<command>attach</command> command, pick up the
|
||||||
|
<varname>wpid</varname> of the <varname>W-process</varname>
|
||||||
|
you want to debug. This is (for now) a neat feature for the
|
||||||
|
following reasons:
|
||||||
|
</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>you can debug an already started application</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>II.3 On exception</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
When something goes wrong, Windows tracks this as an
|
||||||
|
exception. Exceptions exist for segmentation violation,
|
||||||
|
stack overflow, division by zero...
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When an exception occurs, Wine checks if the <varname>W-process</varname> is
|
||||||
|
debugged. If so, the exception event is sent to the
|
||||||
|
debugger, which takes care of it: end of the story. This
|
||||||
|
mechanism is part of the standard Windows' debugging API.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
If the <varname>W-process</varname> is not debugged, Wine
|
||||||
|
tries to launch a debugger. This debugger (normally
|
||||||
|
<command>WineDbg</command>, see III Configuration for more
|
||||||
|
details), at startup, attaches to the
|
||||||
|
<varname>W-process</varname> which generated the exception
|
||||||
|
event. In this case, you are able to look at the causes of
|
||||||
|
the exception, and either fix the causes (and continue
|
||||||
|
further the execution) or dig deeper to understand what went
|
||||||
|
wrong.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
If <command>WineDbg</command> is the standard debugger, the
|
||||||
|
<command>pass</command> and <command>cont</command> commands
|
||||||
|
are the two ways to let the process go further for the
|
||||||
|
handling of the exception event.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
To be more precise on the way Wine (and Windows) generates
|
||||||
|
exception events, when a fault occurs (segmentation
|
||||||
|
violation, stack overflow...), the event is first sent to
|
||||||
|
the debugger (this is known as a first chance exception).
|
||||||
|
The debugger can give two answers:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>continue:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
the debugger had the ability to correct what's
|
||||||
|
generated the exception, and is now able to continue
|
||||||
|
process execution.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>pass:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
the debugger couldn't correct the cause of the
|
||||||
|
first chance exception. Wine will now try to walk
|
||||||
|
the list of exception handlers to see if one of them
|
||||||
|
can handle the exception. If no exception handler is
|
||||||
|
found, the exception is sent once again to the
|
||||||
|
debugger to indicate the failure of the exception
|
||||||
|
handling.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
<note>
|
||||||
|
<para>
|
||||||
|
since some of Wine's code uses exceptions and
|
||||||
|
<function>try/catch</function> blocks to provide some
|
||||||
|
functionality, <command>WineDbg</command> can be entered
|
||||||
|
in such cases with segv exceptions. This happens, for
|
||||||
|
example, with <function>IsBadReadPtr</function> function.
|
||||||
|
In that case, the <command>pass</command> command shall be
|
||||||
|
used, to let the handling of the exception to be done by
|
||||||
|
the <function>catch</function> block in
|
||||||
|
<function>IsBadReadPtr</function>.
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>II.4 Quitting</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Unfortunately, Windows doesn't provide a detach kind of API,
|
||||||
|
meaning that once you started debugging a process, you must
|
||||||
|
do so until the process dies. Killing (or stopping/aborting)
|
||||||
|
the debugger will also kill the debugged process. This will
|
||||||
|
be true for any Windows' debugging API compliant debugger,
|
||||||
|
starting with <command>WineDbg</command>.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="dbg-config">
|
||||||
|
<title>III Configuration</title>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>III.1 Registry configuration</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The Windows' debugging API uses a registry entry to know
|
||||||
|
with debugger to invoke when an unhandled exception
|
||||||
|
occurs (see II.3 for some details). Two values in key
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
"MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug"
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
Determine the behavior:
|
||||||
|
</para>
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Debugger:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
this is the command line used to launch the debugger
|
||||||
|
(it uses two <function>printf</function> formats
|
||||||
|
(<literal>%ld</literal>) to pass context dependent
|
||||||
|
information to the debugger). You should put here a
|
||||||
|
complete path to your debugger
|
||||||
|
(<command>WineDbg</command> can of course be used, but
|
||||||
|
any other Windows' debugging API aware debugger will
|
||||||
|
do).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Auto:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
if this value is zero, a message box will ask the
|
||||||
|
user if he/she wishes to launch the debugger when an
|
||||||
|
unhandled exception occurs. Otherwise, the debugger
|
||||||
|
is automatically started.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
A regular Wine registry looks like:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
[MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug] 957636538
|
||||||
|
"Auto"=dword:00000001
|
||||||
|
"Debugger"="/usr/local/bin/winedbg %ld %ld"
|
||||||
|
</programlisting>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<title>Note 1</title>
|
||||||
|
<para>
|
||||||
|
creating this key is mandatory. Not doing so will not
|
||||||
|
fire the debugger when an exception occurs.
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
<note>
|
||||||
|
<title>Note 2</title>
|
||||||
|
<para>
|
||||||
|
<command>wineinstall</command> sets up this correctly.
|
||||||
|
However, due to some limitation of the registry installed,
|
||||||
|
if a previous Wine installation exists, it's safer to
|
||||||
|
remove the whole
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
[MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug]
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
key before running again <command>wineinstall</command> to
|
||||||
|
regenerate this key.
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>III.2 WineDbg configuration</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
<command>WineDbg</command> can be configured thru a number
|
||||||
|
of options. Those options are stored in the registry, on a
|
||||||
|
per user basis. The key is (in *my* registry)
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
[eric\\Software\\Wine\\WineDbg]
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
Those options can be read/written while inside
|
||||||
|
<command>WineDbg</command>, as part of the debugger
|
||||||
|
expressions. To refer to one of this option, its name must
|
||||||
|
be prefixed by a <literal>$</literal> sign. For example,
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
set $BreakAllThreadsStartup = 1
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
sets the option <varname>BreakAllThreadsStartup</varname> to
|
||||||
|
<literal>TRUE</literal>.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
All the options are read from the registry when
|
||||||
|
<command>WineDbg</command> starts (if no corresponding value
|
||||||
|
is found, a default value is used), and are written back to
|
||||||
|
the registry when <command>WineDbg</command> exits (hence,
|
||||||
|
all modifications to those options are automatically saved
|
||||||
|
when <command>WineDbg</command> terminates).
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Here's the list of all options:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>III.2.1 Controling when the debugger is entered</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>BreakAllThreadsStartup</varname></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Set to <literal>TRUE</literal> if at all threads
|
||||||
|
start-up the debugger stops set to
|
||||||
|
<literal>FALSE</literal> if only at the first thread
|
||||||
|
startup of a given process the debugger stops.
|
||||||
|
<literal>FALSE</literal> by default.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>BreakOnCritSectTimeOut</varname></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Set to <literal>TRUE</literal> if the debugger stops
|
||||||
|
when a critical section times out (5 minutes);
|
||||||
|
<literal>TRUE</literal> by default.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>BreakOnAttach</varname></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Set to <literal>TRUE</literal> if when
|
||||||
|
<command>WineDbg</command> attaches to an existing
|
||||||
|
process after an unhandled exception,
|
||||||
|
<command>WineDbg</command> shall be entered on the
|
||||||
|
first attach event. Since the attach event is
|
||||||
|
meaningless in the context of an exception event
|
||||||
|
(the next event which is the exception event is of
|
||||||
|
course relevant), that option is likely to be
|
||||||
|
<literal>FALSE</literal>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>BreakOnFirstChance</varname></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
An exception can generate two debug events. The
|
||||||
|
first one is passed to the debugger (known as a
|
||||||
|
first chance) just after the exception. The debugger
|
||||||
|
can then decides either to resume execution (see
|
||||||
|
<command>WineDbg</command>'s <command>cont</command>
|
||||||
|
command) or pass the exception up to the exception
|
||||||
|
handler chain in the program (if it exists)
|
||||||
|
(<command>WineDbg</command> implements this thru the
|
||||||
|
<command>pass</command> command). If none of the
|
||||||
|
exception handlers takes care of the exception, the
|
||||||
|
exception event is sent again to the debugger (known
|
||||||
|
as last chance exception). You cannot pass on a last
|
||||||
|
exception. When the
|
||||||
|
<varname>BreakOnFirstChance</varname> exception is
|
||||||
|
<literal>TRUE</literal>, then winedbg is entered for
|
||||||
|
both first and last chance execptions (to
|
||||||
|
<literal>FALSE</literal>, it's only entered for last
|
||||||
|
chance exceptions).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>III.2.2 Output handling</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>ConChannelMask</varname></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Mask of active debugger output channels on console
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>StdChannelMask</varname></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Mask of active debugger output channels on <filename>stderr</filename>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>UseXTerm</varname></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Set to <literal>TRUE</literal> if the debugger uses
|
||||||
|
its own <command>xterm</command> window for console
|
||||||
|
input/output. Set to <literal>FALSE</literal> if
|
||||||
|
the debugger uses the current Unix console for
|
||||||
|
input/output
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Those last 3 variables are jointly used in two generic ways:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>default</para>
|
||||||
|
<programlisting>
|
||||||
|
ConChannelMask = DBG_CHN_MESG (1)
|
||||||
|
StdChannelMask = 0
|
||||||
|
UseXTerm = 1
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
In this case, all input/output goes into a specific
|
||||||
|
<command>xterm</command> window (but all debug
|
||||||
|
messages <function>TRACE</function>,
|
||||||
|
<function>WARN</function>... still goes to tty where
|
||||||
|
wine is run from).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
to have all input/output go into the tty where Wine
|
||||||
|
was started from (to be used in a X11-free
|
||||||
|
environment)
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
ConChannelMask = 0
|
||||||
|
StdChannelMask = DBG_CHN_MESG (1)
|
||||||
|
UseXTerm = 1
|
||||||
|
</screen>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
<para>
|
||||||
|
Those variables also allow, for example for debugging
|
||||||
|
purposes, to use:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
ConChannelMask = 0xfff
|
||||||
|
StdChannelMask = 0xfff
|
||||||
|
UseXTerm = 1
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
This allows to redirect all <function>WineDbg</function>
|
||||||
|
output to both tty Wine was started from, and
|
||||||
|
<command>xterm</command> debugging window. If Wine (or
|
||||||
|
<command>WineDbg</command>) was started with a redirection
|
||||||
|
of <filename>stdout</filename> and/or
|
||||||
|
<filename>stderr</filename> to a file (with for
|
||||||
|
example >& shell redirect command), you'll get in that
|
||||||
|
file both outputs. It may be interesting to look in the
|
||||||
|
relay trace for specific values which the process segv'ed
|
||||||
|
on.
|
||||||
|
</para>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>III.2.2 Context information</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>ThreadId</varname></term>
|
||||||
|
<listitem>
|
||||||
|
<para>ID of the <varname>W-thread</varname> currently
|
||||||
|
examined by the debugger</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>ProcessId</varname></term>
|
||||||
|
<listitem>
|
||||||
|
<para>ID of the <varname>W-thread</varname> currently
|
||||||
|
examined by the debugger</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><registers></term>
|
||||||
|
<listitem>
|
||||||
|
<para>All CPU registers are also available</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The <varname>ThreadId</varname> and
|
||||||
|
<varname>ProcessId</varname> variables can be handy to set
|
||||||
|
conditional breakpoints on a given thread or process.
|
||||||
|
</para>
|
||||||
|
</sect3>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="dbg-commands">
|
||||||
|
<title>IV WineDbg commands</title>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>IV.1 Misc</title>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
abort aborts the debugger
|
||||||
|
quit exits the debugger
|
||||||
|
|
||||||
|
attach N attach to a W-process (N is its ID). IDs can be
|
||||||
|
obtained thru walk process command
|
||||||
|
</screen>
|
||||||
|
<screen>
|
||||||
|
help prints some help on the commands
|
||||||
|
help info prints some help on info commands
|
||||||
|
</screen>
|
||||||
|
<screen>
|
||||||
|
mode 16 switch to 16 bit mode
|
||||||
|
mode 32 switch to 32 bit mode
|
||||||
|
</screen>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>IV.2 Flow control</title>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
cont continue execution until next breakpoint or exception.
|
||||||
|
pass pass the exception event up to the filter chain.
|
||||||
|
step continue execution until next C line of code (enters
|
||||||
|
function call)
|
||||||
|
next continue execution until next C line of code (doesn't
|
||||||
|
enter function call)
|
||||||
|
stepi execute next assembly instruction (enters function
|
||||||
|
call)
|
||||||
|
nexti execute next assembly instruction (doesn't enter
|
||||||
|
function call)
|
||||||
|
finish do nexti commands until current function is exited
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
cont, step, next, stepi, nexti can be postfixed by a
|
||||||
|
number (N), meaning that the command must be executed N
|
||||||
|
times.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>IV.3 Breakpoints, watch points</title>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
enable N enables (break|watch)point #N
|
||||||
|
disable N disables (break|watch)point #N
|
||||||
|
delete N deletes (break|watch)point #N
|
||||||
|
cond N removes any a existing condition to (break|watch)point N
|
||||||
|
cond N <expr> adds condition <expr> to (break|watch)point N. <expr>
|
||||||
|
will be evaluated each time the breakpoint is hit. If
|
||||||
|
the result is a zero value, the breakpoint isn't
|
||||||
|
triggered
|
||||||
|
break * N adds a breakpoint at address N
|
||||||
|
break <id> adds a breakpoint at the address of symbol <id>
|
||||||
|
break <id> N adds a breakpoint at the address of symbol <id> (N ?)
|
||||||
|
break N adds a breakpoint at line N of current source file
|
||||||
|
break adds a breakpoint at current $pc address
|
||||||
|
watch * N adds a watch command (on write) at address N (on 4 bytes)
|
||||||
|
watch <id> adds a watch command (on write) at the address of
|
||||||
|
symbol <id>
|
||||||
|
info break lists all (break|watch)points (with state)
|
||||||
|
</screen>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>IV.4 Stack manipulation</title>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
bt print calling stack of current thread
|
||||||
|
up goes up one frame in current thread's stack
|
||||||
|
up N goes up N frames in current thread's stack
|
||||||
|
dn goes down one frame in current thread's stack
|
||||||
|
dn N goes down N frames in current thread's stack
|
||||||
|
frame N set N as the current frame
|
||||||
|
info local prints information on local variables for current
|
||||||
|
function
|
||||||
|
</screen>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>IV.5 Directory & source file manipulation</title>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
show dir
|
||||||
|
dir <pathname>
|
||||||
|
dir
|
||||||
|
symbolfile <pathname>
|
||||||
|
</screen>
|
||||||
|
<screen>
|
||||||
|
list lists 10 source lines from current position
|
||||||
|
list - lists 10 source lines before current position
|
||||||
|
list N lists 10 source lines from line N in current file
|
||||||
|
list <path>:N lists 10 source lines from line N in file <path>
|
||||||
|
list <id> lists 10 source lines of function <id>
|
||||||
|
list * N lists 10 source lines from address N
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
You can specify the end target (to change the 10 lines
|
||||||
|
value) using the ','. For example:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
list 123, 234 lists source lines from line 123 up to line 234 in
|
||||||
|
current file
|
||||||
|
list foo.c:1,56 lists source lines from line 1 up to 56 in file foo.c
|
||||||
|
</screen>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>IV.6 Displaying</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
A display is an expression that's evaluated and printed
|
||||||
|
after the execution of any <command>WineDbg</command>
|
||||||
|
command.
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
display lists the active displays
|
||||||
|
info display (same as above command)
|
||||||
|
display <expr> adds a display for expression <expr>
|
||||||
|
display /fmt <expr> adds a display for expression <expr>. Printing
|
||||||
|
evaluated <expr> is done using the given format (see
|
||||||
|
print command for more on formats)
|
||||||
|
del display N deletes display #N
|
||||||
|
undisplay N (same as del display)
|
||||||
|
</screen>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>IV.7 Disassembly</title>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
disas disassemble from current position
|
||||||
|
disas <expr> disassemble from address <expr>
|
||||||
|
disas <expr>,<expr>disassembles code between addresses specified by
|
||||||
|
the two <expr>
|
||||||
|
</screen>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>IV.8 Information on Wine's internals</title>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
info class <id> prints information on Windows's class <id>
|
||||||
|
walk class lists all Windows' class registered in Wine
|
||||||
|
info share lists all the dynamic libraries loaded the debugged
|
||||||
|
program (including .so files, NE and PE DLLs)
|
||||||
|
info module N prints information on module of handle N
|
||||||
|
walk module lists all modules loaded by debugged program
|
||||||
|
info queue N prints information on Wine's queue N
|
||||||
|
walk queue lists all queues allocated in Wine
|
||||||
|
info regs prints the value of CPU register
|
||||||
|
info segment N prints information on segment N
|
||||||
|
info segment lists all allocated segments
|
||||||
|
info stack prints the values on top of the stack
|
||||||
|
info map lists all virtual mappings used by the debugged
|
||||||
|
program
|
||||||
|
info wnd N prints information of Window of handle N
|
||||||
|
walk wnd lists all the window hierarchy starting from the
|
||||||
|
desktop window
|
||||||
|
walk wnd N lists all the window hierarchy starting from the
|
||||||
|
window of handle N
|
||||||
|
walk process lists all w-processes in Wine session
|
||||||
|
walk thread lists all w-threads in Wine session
|
||||||
|
walk modref (no longer avail)
|
||||||
|
</screen>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>IV.9 Memory (reading, writing, typing)</title>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
x <expr> examines memory at <expr> address
|
||||||
|
x /fmt <expr> examines memory at <expr> address using format /fmt
|
||||||
|
print <expr> prints the value of <expr> (possibly using its type)
|
||||||
|
print /fmt <expr> prints the value of <expr> (possibly using its
|
||||||
|
type)
|
||||||
|
set <lval>=<expr> writes the value of <expr> in <lval>
|
||||||
|
whatis <expr> prints the C type of expression <expr>
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
<filename>/fmt</filename> is either <filename>/<letter></filename> or
|
||||||
|
<filename>/<count><letter></filename> letter can be
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
s => an ASCII string
|
||||||
|
u => an Unicode UTF16 string
|
||||||
|
i => instructions (disassemble)
|
||||||
|
x => 32 bit unsigned hexadecimal integer
|
||||||
|
d => 32 bit signed decimal integer
|
||||||
|
w => 16 bit unsigned hexadecimal integer
|
||||||
|
c => character (only printable 0x20-0x7f are actually
|
||||||
|
printed)
|
||||||
|
b => 8 bit unsigned hexadecimal integer
|
||||||
|
</screen>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="dbg-others">
|
||||||
|
<title>V Other debuggers</title>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>V.1 Using other Unix debuggers</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
You can also use other debuggers (like
|
||||||
|
<command>gdb</command>), but you must be aware of a few
|
||||||
|
items:
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You need to attach the unix debugger to the correct unix
|
||||||
|
process (representing the correct windows thread) (you can
|
||||||
|
"guess" it from a <command>ps fax</command> for example:
|
||||||
|
When running the emulator, usually the first two
|
||||||
|
<varname>upids</varname> are for the Windows' application
|
||||||
|
running the desktop, the first thread of the application is
|
||||||
|
generally the third <varname>upid</varname>; when running a
|
||||||
|
WineLib program, the first thread of the application is
|
||||||
|
generally the first <varname>upid</varname>)
|
||||||
|
</para>
|
||||||
|
<note>
|
||||||
|
<para>
|
||||||
|
Even if latest <command>gdb</command> implements the
|
||||||
|
notion of threads, it won't work with Wine because the
|
||||||
|
thread abstraction used for implementing Windows' thread
|
||||||
|
is not 100% mapped onto the linux posix threads
|
||||||
|
implementation. It means that you'll have to spawn a
|
||||||
|
different <command>gdb</command> session for each Windows'
|
||||||
|
thread you wish to debug.
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>V.2 Using other Windows debuggers</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
You can use any Windows' debugging API compliant debugger
|
||||||
|
with Wine. Some reports have been made of success with
|
||||||
|
VisualStudio debugger (in remote mode, only the hub runs
|
||||||
|
in Wine). GoVest fully runs in Wine.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>V.3 Main differences between winedbg and regular Unix debuggers</title>
|
||||||
|
|
||||||
|
<!-- FIXME: convert this into a table -->
|
||||||
|
<screen>
|
||||||
|
+----------------------------------+---------------------------------+
|
||||||
|
| WineDbg | gdb |
|
||||||
|
+----------------------------------+---------------------------------+
|
||||||
|
|WineDbg debugs a Windows' process:|gdb debugs a Windows' thread: |
|
||||||
|
|+ the various threads will be |+ a separate gdb session is |
|
||||||
|
| handled by the same WineDbg | needed for each thread of |
|
||||||
|
| session | Windows' process |
|
||||||
|
|+ a breakpoint will be triggered |+ a breakpoint will be triggered |
|
||||||
|
| for any thread of the w-process | only for the w-thread debugged |
|
||||||
|
+----------------------------------+---------------------------------+
|
||||||
|
|WineDbg supports debug information|gdb supports debug information |
|
||||||
|
|from: |from: |
|
||||||
|
|+ stabs (standard Unix format) |+ stabs (standard Unix format) |
|
||||||
|
|+ Microsoft's C, CodeView, .DBG | |
|
||||||
|
+----------------------------------+---------------------------------+
|
||||||
|
</screen>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="dbg-limits">
|
||||||
|
<title>VI Limitations</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
16 bit processes are not supported (but calls to 16 bit code
|
||||||
|
in 32 bit applications are).
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -1,381 +0,0 @@
|
||||||
This file describes where to start debugging Wine. If at any point
|
|
||||||
you get stuck and want to ask for help, please read the file
|
|
||||||
documentation/bugreports for information on how to write useful bug
|
|
||||||
reports.
|
|
||||||
|
|
||||||
Crashes
|
|
||||||
=======
|
|
||||||
|
|
||||||
These usually show up like this:
|
|
||||||
|
|
||||||
|Unexpected Windows program segfault - opcode = 8b
|
|
||||||
|Segmentation fault in Windows program 1b7:c41.
|
|
||||||
|Loading symbols from ELF file /root/wine/wine...
|
|
||||||
|....more Loading symbols from ...
|
|
||||||
|In 16 bit mode.
|
|
||||||
|Register dump:
|
|
||||||
| CS:01b7 SS:016f DS:0287 ES:0000
|
|
||||||
| IP:0c41 SP:878a BP:8796 FLAGS:0246
|
|
||||||
| AX:811e BX:0000 CX:0000 DX:0000 SI:0001 DI:ffff
|
|
||||||
|Stack dump:
|
|
||||||
|0x016f:0x878a: 0001 016f ffed 0000 0000 0287 890b 1e5b
|
|
||||||
|0x016f:0x879a: 01b7 0001 000d 1050 08b7 016f 0001 000d
|
|
||||||
|0x016f:0x87aa: 000a 0003 0004 0000 0007 0007 0190 0000
|
|
||||||
|0x016f:0x87ba:
|
|
||||||
|
|
|
||||||
|0050: sel=0287 base=40211d30 limit=0b93f (bytes) 16-bit rw-
|
|
||||||
|Backtrace:
|
|
||||||
|0 0x01b7:0x0c41 (PXSRV_FONGETFACENAME+0x7c)
|
|
||||||
|1 0x01b7:0x1e5b (PXSRV_FONPUTCATFONT+0x2cd)
|
|
||||||
|2 0x01a7:0x05aa
|
|
||||||
|3 0x01b7:0x0768 (PXSRV_FONINITFONTS+0x81)
|
|
||||||
|4 0x014f:0x03ed (PDOXWIN_@SQLCURCB$Q6CBTYPEULN8CBSCTYPE+0x1b1)
|
|
||||||
|5 0x013f:0x00ac
|
|
||||||
|
|
|
||||||
|0x01b7:0x0c41 (PXSRV_FONGETFACENAME+0x7c): movw %es:0x38(%bx),%dx
|
|
||||||
|
|
||||||
Steps to debug a crash. You may stop at any step, but please report the bug
|
|
||||||
and provide as much of the information gathered to the newsgroup or the
|
|
||||||
relevant developer as feasonable.
|
|
||||||
|
|
||||||
1. Get the reason for the crash. This is usually an access to an invalid
|
|
||||||
selector, an access to an out of range address in a valid selector,
|
|
||||||
popping a segmentregister from the stack or the like. When reporting a
|
|
||||||
crash, report this WHOLE crashdump even if it doesn't make sense to you.
|
|
||||||
|
|
||||||
(In this case it is access to an invalid selector, for %es is 0000, as
|
|
||||||
seen in the register dump).
|
|
||||||
|
|
||||||
2. Determine where the reason came from.
|
|
||||||
Since this is usually a primary/secondary reaction to a failed or
|
|
||||||
misbehaving Wine function, rerun Wine with "-debugmsg +relay" (without ")
|
|
||||||
added to the commandline. This will get rather much output, but usually
|
|
||||||
the reason is located in the last call(s). Those lines usually look like
|
|
||||||
this:
|
|
||||||
|
|
||||||
|Call KERNEL.90: LSTRLEN(0227:0692 "text") ret=01e7:2ce7 ds=0227
|
|
||||||
^^^^^^^^^ ^ ^^^^^^^^^ ^^^^^^ ^^^^^^^^^ ^^^^
|
|
||||||
| | | | | |Datasegment
|
|
||||||
| | | | |Return address
|
|
||||||
| | | |textual parameter
|
|
||||||
| | |
|
|
||||||
| | |Argument(s). This one is a win16 segmented pointer.
|
|
||||||
| |Function called.
|
|
||||||
|The module, the function is called in. In this case it is KERNEL.
|
|
||||||
|
|
||||||
|Ret KERNEL.90: LSTRLEN() retval=0x0004 ret=01e7:2ce7 ds=0227
|
|
||||||
^^^^^^
|
|
||||||
|Returnvalue is 16 bit and has the value 4.
|
|
||||||
|
|
||||||
|
|
||||||
3. If you have found a misbehaving function, try to find out why it
|
|
||||||
misbehaves. Find the function in the source code. Try to make sense of
|
|
||||||
the arguments passed. Usually there is a 'TRACE(<channel>,"(...)\n");'
|
|
||||||
at the beginning of the function. Rerun wine with
|
|
||||||
"-debugmsg +xyz,+relay" added to the commandline.
|
|
||||||
|
|
||||||
4. Additional information on how to debug using the internal debugger can be
|
|
||||||
found in debugger/README.
|
|
||||||
|
|
||||||
5. If those information isn't clear enough or if you want to know more about
|
|
||||||
what's happening in the function itself, try running wine with "-debugmsg
|
|
||||||
+all", which dumps ALL included debug information in wine.
|
|
||||||
|
|
||||||
6. If that isn't enough add more debug output for yourself into the
|
|
||||||
functions you find relevant. See documentation/debug-msgs.
|
|
||||||
You might also try to run the program in gdb instead of using the
|
|
||||||
WINE-debugger. If you do that, use "handle SIGSEGV nostop noprint"
|
|
||||||
to disable the handling of seg faults inside gdb (needed for Win16).
|
|
||||||
If you don't use the "-desktop" or "-managed" option,
|
|
||||||
start the WINE process with "-sync", or chances are good to get X into
|
|
||||||
an unusable state.
|
|
||||||
|
|
||||||
7. You can also set a breakpoint for that function. Start wine with the
|
|
||||||
"-debug" option added to the commandline. After loading the executable
|
|
||||||
wine will enter the internal debugger. Use "break KERNEL_LSTRLEN"
|
|
||||||
(replace by function you want to debug, CASE IS RELEVANT.) to set a
|
|
||||||
breakpoint. Then use "continue" to start normal program-execution. Wine
|
|
||||||
will stop if it reaches the breakpoint. If the program isn't yet at the
|
|
||||||
crashing call of that function, use "continue" again until you are about
|
|
||||||
to enter that function. You may now proceed with single-stepping the
|
|
||||||
function until you reach the point of crash. Use the other debugger
|
|
||||||
commands to print registers and the like.
|
|
||||||
|
|
||||||
|
|
||||||
Program hangs, nothing happens
|
|
||||||
==============================
|
|
||||||
|
|
||||||
Switch to UNIX shell, get the process-ID using "ps -a|grep wine", and do a
|
|
||||||
"kill -HUP <pid>" (without " and <>). Wine will then enter its internal
|
|
||||||
debugger and you can proceed as explained above. Also, you can use -debug
|
|
||||||
switch and then you can get into internal debugger by pressing Ctrl-C in
|
|
||||||
the terminal where you run Wine.
|
|
||||||
|
|
||||||
Program reports an error with a Messagebox
|
|
||||||
==========================================
|
|
||||||
|
|
||||||
Sometimes programs are reporting failure using a more or less nondescript
|
|
||||||
messageboxes. We can debug this using the same method as Crashes, but there
|
|
||||||
is one problem... For setting up a message box the program also calls Wine
|
|
||||||
producing huge chunks of debug code.
|
|
||||||
|
|
||||||
Since the failure happens usually directly before setting up the Messagebox
|
|
||||||
you can start wine with "-debug" added to the commandline, set a breakpoint
|
|
||||||
at "MessageBoxA" (called by win16 and win32 programs) and proceed with
|
|
||||||
"continue". With "-debugmsg +all" Wine will now stop directly before
|
|
||||||
setting up the Messagebox. Proceed as explained above.
|
|
||||||
|
|
||||||
You can also run wine using "wine -debugmsg +relay program.exe 2>&1|less -i"
|
|
||||||
and in less search for messagebox.
|
|
||||||
|
|
||||||
Disassembling programs:
|
|
||||||
=======================
|
|
||||||
You may also try to disassemble the offending program to check for
|
|
||||||
undocumented features and/or use of them.
|
|
||||||
|
|
||||||
The best, freely available, disassembler for Win16 programs is
|
|
||||||
Windows Codeback, archivename wcbxxx.zip, which usually can be found
|
|
||||||
in the Cica-Mirror subdirectory on the WINE ftpsites. (See ANNOUNCE).
|
|
||||||
|
|
||||||
Disassembling win32 programs is possible using the Windows Disassembler 32,
|
|
||||||
archivename something like w32dsm87.zip (or similar) on ftp.winsite.com
|
|
||||||
and mirrors. The shareware version does not allow saving of disassembly
|
|
||||||
listings.
|
|
||||||
You can also use the newer (and in the full version better) Interactive
|
|
||||||
Disassembler (IDA) from the ftp sites mentioned at the end of the document.
|
|
||||||
|
|
||||||
Understanding disassembled code is mostly a question of exercise.
|
|
||||||
|
|
||||||
Most code out there uses standard C function entries (for it is usually
|
|
||||||
written in C). Win16 function entries usually look like that:
|
|
||||||
| push bp
|
|
||||||
| mov bp, sp
|
|
||||||
| ... function code ..
|
|
||||||
| retf XXXX <--------- XXXX is number of bytes of arguments
|
|
||||||
|
|
||||||
This is a FAR function with no local storage. The arguments usually start
|
|
||||||
at [bp+6] with increasing offsets. Note, that [bp+6] belongs to the RIGHTMOST
|
|
||||||
argument, for exported win16 functions use the PASCAL calling convention.
|
|
||||||
So, if we use strcmp(a,b) with a and b both 32 bit variables b would be at
|
|
||||||
[bp+6] and a at [bp+10].
|
|
||||||
Most functions make also use of local storage in the stackframe:
|
|
||||||
| enter 0086, 00
|
|
||||||
| ... function code ...
|
|
||||||
| leave
|
|
||||||
| retf XXXX
|
|
||||||
This does mostly the same as above, but also adds 0x86 bytes of
|
|
||||||
stackstorage, which is accessed using [bp-xx].
|
|
||||||
Before calling a function, arguments are pushed on the stack using something
|
|
||||||
like this:
|
|
||||||
| push word ptr [bp-02] <- will be at [bp+8]
|
|
||||||
| push di <- will be at [bp+6]
|
|
||||||
| call KERNEL.LSTRLEN
|
|
||||||
Here first the selector and then the offset to the passed string are pushed.
|
|
||||||
|
|
||||||
Sample debugging session:
|
|
||||||
=========================
|
|
||||||
|
|
||||||
Let's debug the infamous Word SHARE.EXE messagebox:
|
|
||||||
|
|
||||||
|marcus@jet $ wine winword.exe
|
|
||||||
| +---------------------------------------------+
|
|
||||||
| | ! You must leave Windows and load SHARE.EXE|
|
|
||||||
| | before starting Word. |
|
|
||||||
| +---------------------------------------------+
|
|
||||||
|
|
||||||
|
|
||||||
|marcus@jet $ wine winword.exe -debugmsg +relay -debug
|
|
||||||
|CallTo32(wndproc=0x40065bc0,hwnd=000001ac,msg=00000081,wp=00000000,lp=00000000)
|
|
||||||
|Win16 task 'winword': Breakpoint 1 at 0x01d7:0x001a
|
|
||||||
|CallTo16(func=0127:0070,ds=0927)
|
|
||||||
|Call WPROCS.24: TASK_RESCHEDULE() ret=00b7:1456 ds=0927
|
|
||||||
|Ret WPROCS.24: TASK_RESCHEDULE() retval=0x8672 ret=00b7:1456 ds=0927
|
|
||||||
|CallTo16(func=01d7:001a,ds=0927)
|
|
||||||
| AX=0000 BX=3cb4 CX=1f40 DX=0000 SI=0000 DI=0927 BP=0000 ES=11f7
|
|
||||||
|Loading symbols: /home/marcus/wine/wine...
|
|
||||||
|Stopped on breakpoint 1 at 0x01d7:0x001a
|
|
||||||
|In 16 bit mode.
|
|
||||||
|Wine-dbg>break MessageBoxA <---- Set Breakpoint
|
|
||||||
|Breakpoint 2 at 0x40189100 (MessageBoxA [msgbox.c:190])
|
|
||||||
|Wine-dbg>c <---- Continue
|
|
||||||
|Call KERNEL.91: INITTASK() ret=0157:0022 ds=08a7
|
|
||||||
| AX=0000 BX=3cb4 CX=1f40 DX=0000 SI=0000 DI=08a7 ES=11d7 EFL=00000286
|
|
||||||
|CallTo16(func=090f:085c,ds=0dcf,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0dcf)
|
|
||||||
|... <----- Much debugoutput
|
|
||||||
|Call KERNEL.136: GETDRIVETYPE(0x0000) ret=060f:097b ds=0927
|
|
||||||
^^^^^^ Drive 0 (A:)
|
|
||||||
|Ret KERNEL.136: GETDRIVETYPE() retval=0x0002 ret=060f:097b ds=0927
|
|
||||||
^^^^^^ DRIVE_REMOVEABLE
|
|
||||||
(It is a floppy diskdrive.)
|
|
||||||
|
|
||||||
|Call KERNEL.136: GETDRIVETYPE(0x0001) ret=060f:097b ds=0927
|
|
||||||
^^^^^^ Drive 1 (B:)
|
|
||||||
|Ret KERNEL.136: GETDRIVETYPE() retval=0x0000 ret=060f:097b ds=0927
|
|
||||||
^^^^^^ DRIVE_CANNOTDETERMINE
|
|
||||||
(I don't have drive B: assigned)
|
|
||||||
|
|
||||||
|Call KERNEL.136: GETDRIVETYPE(0x0002) ret=060f:097b ds=0927
|
|
||||||
^^^^^^^ Drive 2 (C:)
|
|
||||||
|Ret KERNEL.136: GETDRIVETYPE() retval=0x0003 ret=060f:097b ds=0927
|
|
||||||
^^^^^^ DRIVE_FIXED
|
|
||||||
(specified as a harddisk)
|
|
||||||
|
|
||||||
|Call KERNEL.97: GETTEMPFILENAME(0x00c3,0x09278364"doc",0x0000,0927:8248) ret=060f:09b1 ds=0927
|
|
||||||
^^^^^^ ^^^^^ ^^^^^^^^^
|
|
||||||
| | |buffer for fname
|
|
||||||
| |temporary name ~docXXXX.tmp
|
|
||||||
|Force use of Drive C:.
|
|
||||||
|
|
||||||
|Warning: GetTempFileName returns 'C:~doc9281.tmp', which doesn't seem to be writeable.
|
|
||||||
|Please check your configuration file if this generates a failure.
|
|
||||||
|
|
||||||
Whoops, it even detects that something is wrong!
|
|
||||||
|
|
||||||
|Ret KERNEL.97: GETTEMPFILENAME() retval=0x9281 ret=060f:09b1 ds=0927
|
|
||||||
^^^^^^ Temporary storage ID
|
|
||||||
|
|
||||||
|Call KERNEL.74: OPENFILE(0x09278248"C:~doc9281.tmp",0927:82da,0x1012) ret=060f:09d8 ds=0927
|
|
||||||
^^^^^^^^^^^^^^^^ ^^^^^^^^^ ^^^^^^^
|
|
||||||
|filename |OFSTRUCT |open mode:
|
|
||||||
|
|
||||||
OF_CREATE|OF_SHARE_EXCLUSIVE|OF_READWRITE
|
|
||||||
|
|
||||||
This fails, since my C: drive is in this case mounted readonly.
|
|
||||||
|
|
||||||
|Ret KERNEL.74: OPENFILE() retval=0xffff ret=060f:09d8 ds=0927
|
|
||||||
^^^^^^ HFILE_ERROR16, yes, it failed.
|
|
||||||
|
|
||||||
|Call USER.1: MESSAGEBOX(0x0000,0x09278376"Sie müssen Windows verlassen und SHARE.EXE laden bevor Sie Word starten.",0x00000000,0x1030) ret=060f:084f ds=0927
|
|
||||||
|
|
||||||
And MessageBox'ed.
|
|
||||||
|
|
||||||
|Stopped on breakpoint 2 at 0x40189100 (MessageBoxA [msgbox.c:190])
|
|
||||||
|190 { <- the sourceline
|
|
||||||
In 32 bit mode.
|
|
||||||
Wine-dbg>
|
|
||||||
|
|
||||||
The code seems to find a writeable harddisk and tries to create a file
|
|
||||||
there. To work around this bug, you can define C: as a networkdrive,
|
|
||||||
which is ignored by the code above.
|
|
||||||
|
|
||||||
Written by Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>,
|
|
||||||
additions welcome.
|
|
||||||
-------
|
|
||||||
|
|
||||||
Here are some useful debugging tips, added by Andreas Mohr:
|
|
||||||
|
|
||||||
|
|
||||||
a) If you have a program crashing at such an early loader phase that you can't
|
|
||||||
use the Wine debugger normally, but Wine already executes the program's
|
|
||||||
start code, then you may use a special trick:
|
|
||||||
You should do a
|
|
||||||
wine -debugmsg +relay program
|
|
||||||
to get a listing of the functions the program calls in its start function.
|
|
||||||
Now you do a
|
|
||||||
wine -debug winfile.exe
|
|
||||||
This way, you get into Wine-dbg. Now you can set a breakpoint on any
|
|
||||||
function the program calls in the start function and just type "c" to bypass
|
|
||||||
the eventual calls of Winfile to this function until you are finally at the
|
|
||||||
place where this function gets called by the crashing start function.
|
|
||||||
Now you can proceed with your debugging as usual.
|
|
||||||
|
|
||||||
|
|
||||||
b) If you try to run a program and it quits after showing an error messagebox,
|
|
||||||
the problem can usually be identified in the return value of one of the
|
|
||||||
functions executed before MessageBox().
|
|
||||||
That's why you should re-run the program with e.g.
|
|
||||||
wine -debugmsg +relay <program name> &>relmsg
|
|
||||||
Then do a "more relmsg" and search for the last occurrence of a call to the string "MESSAGEBOX".
|
|
||||||
This is a line like
|
|
||||||
Call USER.1: MESSAGEBOX(0x0000,0x01ff1246 "Runtime error 219 at 0004:1056.",0x00000000,0x1010) ret=01f7:2160 ds=01ff
|
|
||||||
|
|
||||||
In my example the lines before the call to MessageBox() look like that:
|
|
||||||
|
|
||||||
Call KERNEL.96: FREELIBRARY(0x0347) ret=01cf:1033 ds=01ff
|
|
||||||
CallTo16(func=033f:0072,ds=01ff,0x0000)
|
|
||||||
Ret KERNEL.96: FREELIBRARY() retval=0x0001 ret=01cf:1033 ds=01ff
|
|
||||||
Call KERNEL.96: FREELIBRARY(0x036f) ret=01cf:1043 ds=01ff
|
|
||||||
CallTo16(func=0367:0072,ds=01ff,0x0000)
|
|
||||||
Ret KERNEL.96: FREELIBRARY() retval=0x0001 ret=01cf:1043 ds=01ff
|
|
||||||
Call KERNEL.96: FREELIBRARY(0x031f) ret=01cf:105c ds=01ff
|
|
||||||
CallTo16(func=0317:0072,ds=01ff,0x0000)
|
|
||||||
Ret KERNEL.96: FREELIBRARY() retval=0x0001 ret=01cf:105c ds=01ff
|
|
||||||
Call USER.171: WINHELP(0x02ac,0x01ff05b4 "COMET.HLP",0x0002,0x00000000) ret=01cf:1070 ds=01ff
|
|
||||||
CallTo16(func=0117:0080,ds=01ff)
|
|
||||||
Call WPROCS.24: TASK_RESCHEDULE() ret=00a7:0a2d ds=002b
|
|
||||||
Ret WPROCS.24: TASK_RESCHEDULE() retval=0x0000 ret=00a7:0a2d ds=002b
|
|
||||||
Ret USER.171: WINHELP() retval=0x0001 ret=01cf:1070 ds=01ff
|
|
||||||
Call KERNEL.96: FREELIBRARY(0x01be) ret=01df:3e29 ds=01ff
|
|
||||||
Ret KERNEL.96: FREELIBRARY() retval=0x0000 ret=01df:3e29 ds=01ff
|
|
||||||
Call KERNEL.52: FREEPROCINSTANCE(0x02cf00ba) ret=01f7:1460 ds=01ff
|
|
||||||
Ret KERNEL.52: FREEPROCINSTANCE() retval=0x0001 ret=01f7:1460 ds=01ff
|
|
||||||
Call USER.1: MESSAGEBOX(0x0000,0x01ff1246 "Runtime error 219 at 0004:1056.",0x00000000,0x1010) ret=01f7:2160 ds=01ff
|
|
||||||
|
|
||||||
I think that the call to MessageBox() in this example is _not_ caused
|
|
||||||
by a wrong result value of some previously executed function (it's
|
|
||||||
happening quite often like that), but instead the messagebox complains
|
|
||||||
about a runtime error at 0x0004:0x1056.
|
|
||||||
|
|
||||||
As the segment value of the address is only "4", I think that that is
|
|
||||||
only an internal program value. But the offset address reveals something
|
|
||||||
quite interesting:
|
|
||||||
|
|
||||||
Offset 1056 is _very_ close to the return address of FREELIBRARY():
|
|
||||||
|
|
||||||
Call KERNEL.96: FREELIBRARY(0x031f) ret=01cf:105c ds=01ff
|
|
||||||
^^^^
|
|
||||||
Provided that segment 0x0004 is indeed
|
|
||||||
segment 0x1cf, we now we can use IDA (available at
|
|
||||||
ftp://ftp.uni-koeln.de/pc/msdos/programming/assembler/ida35bx.zip)
|
|
||||||
to disassemble the part that caused the error. We just have to find
|
|
||||||
the address of the call to FreeLibrary(). Some lines before that the
|
|
||||||
runtime error occurred. But be careful ! In some cases you don't have
|
|
||||||
to disassemble the main program, but instead some DLL called by it in
|
|
||||||
order to find the correct place where the runtime error occurred. That
|
|
||||||
can be determined by finding the origin of the segment value (in this
|
|
||||||
case 0x1cf).
|
|
||||||
|
|
||||||
c) If you have created a relay file of some crashing program and want to set a
|
|
||||||
breakpoint at a certain location which is not yet available as the
|
|
||||||
program loads the breakpoint's segment during execution,
|
|
||||||
you may set a breakpoint to GetVersion16/32 as those functions are called
|
|
||||||
very often.
|
|
||||||
Then do a "c" until you are able to set this breakpoint without error message.
|
|
||||||
|
|
||||||
d) Some useful programs:
|
|
||||||
IDA: ftp://ftp.uni-koeln.de/pc/msdos/programming/assembler/ida35bx.zip
|
|
||||||
*Very* good DOS disassembler ! It's badly needed for debugging Wine sometimes.
|
|
||||||
|
|
||||||
XRAY: ftp://ftp.th-darmstadt.de/pub/machines/ms-dos/SimTel/msdos/asmutil/xray15.zip
|
|
||||||
Traces DOS calls (Int 21h, DPMI, ...). Use it with Windows to correct
|
|
||||||
file management problems etc.
|
|
||||||
|
|
||||||
pedump: http://oak.oakland.edu/pub/simtelnet/win95/prog/pedump.zip
|
|
||||||
Dumps the imports and exports of a PE (Portable Executable) DLL.
|
|
||||||
|
|
||||||
|
|
||||||
Some basic debugger usages:
|
|
||||||
===========================
|
|
||||||
|
|
||||||
After starting you program with
|
|
||||||
wine -debug myprog.exe
|
|
||||||
the program loads and you get a prompt at the program starting point.
|
|
||||||
Then you can set breakpoints:
|
|
||||||
b RoutineName (by outine name) OR
|
|
||||||
b *0x812575 (by address)
|
|
||||||
Then you hit 'c' (continue) to run the program. It stops at
|
|
||||||
the breakpoint. You can type
|
|
||||||
step (to step one line) OR
|
|
||||||
stepi (to step one machine instruction at a time;
|
|
||||||
here, it helps to know the basic 386
|
|
||||||
instruction set)
|
|
||||||
info reg (to see registers)
|
|
||||||
info stack (to see hex values in the stack)
|
|
||||||
info local (to see local variables)
|
|
||||||
list <line number> (to list source code)
|
|
||||||
x <variable name> (to examine a variable; only works if code
|
|
||||||
is not compiled with optimization)
|
|
||||||
x 0x4269978 (to examine a memory location)
|
|
||||||
? (help)
|
|
||||||
q (quit)
|
|
||||||
By hitting Enter, you repeat the last command.
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,501 +0,0 @@
|
||||||
A small WINE distribution guide.
|
|
||||||
|
|
||||||
While packaging WINE for one of the Linux distributions I came across
|
|
||||||
several points which have not been clarified yet. Particularly a how-to
|
|
||||||
for WINE packaging distributors is missing. This document tries to give
|
|
||||||
a brief overview over the rationales I thought up and how I tried to
|
|
||||||
implement it.
|
|
||||||
(While the examples use "rpm" most of this stuff can be applied to other
|
|
||||||
packagers too.)
|
|
||||||
|
|
||||||
NOTE THAT YOU SHOULD RECHECK THIS FILE EVERY TWO MONTHS OR SO
|
|
||||||
(diff -uN comes to my mind here...).
|
|
||||||
We'll be adding stuff constantly here in order to improve the Wine
|
|
||||||
environment !
|
|
||||||
|
|
||||||
1. Rationales
|
|
||||||
|
|
||||||
A WINE install should:
|
|
||||||
a. Not have a world writeable directory (-tree).
|
|
||||||
b. Require only as much user input as needed. It would be very good if it
|
|
||||||
would not require any at all. Just let the system administrator do "rpm
|
|
||||||
-i wine.rpm" and let any user be able to run "wine sol.exe" instantly.
|
|
||||||
c. Give the user as much flexibility as possible to install his own
|
|
||||||
applications, do his own configuring etc.
|
|
||||||
d. Come as preconfigured as possible, so the user does not need to change
|
|
||||||
any configuration files.
|
|
||||||
e. Use only as much diskspace as needed per user.
|
|
||||||
|
|
||||||
A WINE install needs:
|
|
||||||
f. A writeable C:\ directory structure on a per user basis. Applications do
|
|
||||||
dump .ini files into c:\windows, installers dump .exe, .dll and more into
|
|
||||||
c:\windows\ and subdirectories or into C:\Program Files\.
|
|
||||||
g. The .exe and .dll from a global read-only Windows installation to be
|
|
||||||
found by applications.
|
|
||||||
h. Some special .dll and .exe files in the windows\system directory, since
|
|
||||||
applications directly check for their presence.
|
|
||||||
i. Some special program environment.
|
|
||||||
|
|
||||||
|
|
||||||
2. Implementation
|
|
||||||
|
|
||||||
2.1 Building the package
|
|
||||||
|
|
||||||
WINE is configured the usual way (depending on your buildenvironment).
|
|
||||||
The "prefix" is chosen using your application placement policy
|
|
||||||
(/usr/,/usr/X11R6/, /opt/wine/ or similar). The configuration files
|
|
||||||
(wine.conf, wine.userreg, wine.systemreg) are targeted for /etc/wine/
|
|
||||||
(rationale: FHS 2.0, multiple readonly configuration files of a package).
|
|
||||||
|
|
||||||
Example (split this into %build and %install section for rpm):
|
|
||||||
CFLAGS=$RPM_OPT_FLAGS \
|
|
||||||
./configure --prefix=/usr/X11R6 --sysconfdir=/etc/wine/ --enable-dll
|
|
||||||
make
|
|
||||||
BR=$RPM_BUILD_ROOT
|
|
||||||
make install prefix=$BR/usr/X11R6/ sysconfdir=$BR/etc/wine/
|
|
||||||
install -d $BR/etc/wine/
|
|
||||||
install -m 644 wine.ini $BR/etc/wine/wine.conf
|
|
||||||
|
|
||||||
# Put all our dlls in a seperate directory. (this works only if
|
|
||||||
# you have a buildroot)
|
|
||||||
install -d $BR/usr/X11R6/lib/wine
|
|
||||||
mv $BR/usr/X11R6/lib/lib* $BR/usr/X11R6/lib/wine/
|
|
||||||
|
|
||||||
# the clipboard server is started on demand.
|
|
||||||
install -m 755 windows/x11drv/wineclipsrv $BR/usr/X11R6/bin/
|
|
||||||
|
|
||||||
# The WINE server is needed.
|
|
||||||
install -m 755 server/wineserver $BR/usr/X11R6/bin/
|
|
||||||
|
|
||||||
Here we unfortunately do need to create wineuser.reg and winesystem.reg
|
|
||||||
from the WINE distributed winedefault.reg. This can be done using
|
|
||||||
./regapi once for one example user and then reusing his .wine/user.reg
|
|
||||||
and .wine/system.reg files. [FIXME: this needs to be done better]
|
|
||||||
|
|
||||||
install -m 644 wine.systemreg $BR/etc/wine/
|
|
||||||
install -m 644 wine.userreg $BR/etc/wine/
|
|
||||||
|
|
||||||
There are now a lot of libraries generated by the build process, so a
|
|
||||||
seperate library directory should be used.
|
|
||||||
|
|
||||||
install -d 755 $BR/usr/X11R6/lib/
|
|
||||||
mv $BR/
|
|
||||||
|
|
||||||
You will need to package the files:
|
|
||||||
$prefix/bin/wine, $prefix/bin/dosmod, $prefix/lib/wine/*
|
|
||||||
$prefix/man/man1/wine.1, $prefix/include/wine/*,
|
|
||||||
$prefix/bin/wineserver, $prefix/bin/wineclipsrv
|
|
||||||
|
|
||||||
%config /etc/wine/*
|
|
||||||
%doc ... choose from the toplevel directory and documentation/
|
|
||||||
|
|
||||||
The Post install script:
|
|
||||||
if ! grep -q /usr/X11R6/lib/wine /etc/ld.so.conf; then
|
|
||||||
echo "/usr/X11R6/lib/wine" >> /etc/ld.so.conf
|
|
||||||
fi
|
|
||||||
/sbin/ldconfig
|
|
||||||
|
|
||||||
The post uninstall script:
|
|
||||||
if [ "$1" = 0 ]; then
|
|
||||||
perl -ni -e 'print unless m:/usr/X11R6/lib/wine:;' /etc/ld.so.conf
|
|
||||||
fi
|
|
||||||
/sbin/ldconfig
|
|
||||||
|
|
||||||
|
|
||||||
2.2 Creating a good default configuration file
|
|
||||||
|
|
||||||
For the rationales of needing as less input from the user as possible
|
|
||||||
arises the need for a very good configuration file. The one supplied
|
|
||||||
with WINE is currently lacking. We need:
|
|
||||||
|
|
||||||
- [Drive X]:
|
|
||||||
+ A for the floppy. Specify your distributions default floppy mountpoint
|
|
||||||
here. (Path=/auto/floppy)
|
|
||||||
+ C for the C:\ directory. Here we use the users homedirectory, for most
|
|
||||||
applications do see C:\ as root-writeable directory of every windows
|
|
||||||
installation and this basically is it in the UNIX-user context.
|
|
||||||
(Path=${HOME})
|
|
||||||
+ R for the CD-Rom drive. Specify your distributions default CD-ROM drives
|
|
||||||
mountpoint here. (Path=/auto/cdrom)
|
|
||||||
+ T for temporary storage. We do use /tmp/ (rationale: between process
|
|
||||||
temporary data belongs to /tmp/, FHS 2.0)
|
|
||||||
+ W for the original Windows installation. This drive points to the
|
|
||||||
windows\ subdirectory of the original windows installation. This avoids
|
|
||||||
problems with renamed 'windows' directories (as for instance 'lose95',
|
|
||||||
'win' or 'sys\win95'). During compile/package/install we leave this
|
|
||||||
to be '/', it has to be configured after the package install.
|
|
||||||
+ Z for the UNIX Root directory (Path=/). This avoids any problems with
|
|
||||||
"could not find drive for current directory" users occasionaly complain
|
|
||||||
about in the newsgroup and the ircchannel. It also makes the whole
|
|
||||||
directory structure browseable. The type of Z should be network, so
|
|
||||||
applications expect it to be readonly.
|
|
||||||
|
|
||||||
- [wine]:
|
|
||||||
Windows=c:\windows\ (the windows/ subdirectory in the users
|
|
||||||
homedirectory)
|
|
||||||
System=c:\windows\system\ (the windows/system subdirectory in the users
|
|
||||||
homedirectory)
|
|
||||||
Path=c:\windows;c:\windows\system;c:\windows\system32;w:\;w:\system;w:\system32;
|
|
||||||
; Using this trick we have in fact two windows installations in one, we
|
|
||||||
; get the stuff from the readonly installation and can write to our own.
|
|
||||||
Temp=t:\ (the TEMP directory)
|
|
||||||
- [Tweak.Layout]
|
|
||||||
WineLook=win95 (just the coolest look ;)
|
|
||||||
- Possibly modify the [spooler], [serialports] and [parallelports] sections.
|
|
||||||
(FIXME: possibly more, including printer stuff)
|
|
||||||
|
|
||||||
Add this prepared configuration file to the package.
|
|
||||||
|
|
||||||
2.3 Installing WINE for the system administrator
|
|
||||||
|
|
||||||
Install the package using the usual packager "rpm -i wine.rpm".
|
|
||||||
You may edit /etc/wine/wine.conf, [Drive W], to point to a possible windows
|
|
||||||
installation right after the install. Thats it.
|
|
||||||
|
|
||||||
Note that on Linux you should somehow try to add the "unhide" mount option
|
|
||||||
(-> "man mount") to the CD-ROM entry in /etc/fstab during package install,
|
|
||||||
as several stupid Windows programs mark some setup (!) files
|
|
||||||
as hidden (ISO9660) on CD-ROMs, which will greatly confuse users
|
|
||||||
as they won't find their setup files on the CD-ROMs as they were
|
|
||||||
used on Windows systems when "unhide" is not set ;-\
|
|
||||||
And of course the setup program will complain that "setup.ins" or some other
|
|
||||||
mess is missing...
|
|
||||||
If you choose to do so, then please make this change verbose to the admin.
|
|
||||||
|
|
||||||
2.4 Installing WINE for the user
|
|
||||||
|
|
||||||
The user will need to run a setup script before the first invocation of
|
|
||||||
WINE. This script should:
|
|
||||||
- Copy /etc/wine/wine.conf for user modification.
|
|
||||||
- Allow specification of the original windows installation to use (which
|
|
||||||
modifies the copied wine.conf file).
|
|
||||||
- Create the windows directory structure (c:\windows,c:\windows\system,
|
|
||||||
c:\windows\Start Menu\Programs,c:\Program Files,c:\Desktop,...)
|
|
||||||
|
|
||||||
(FIXME: Not sure this is needed for all files:)
|
|
||||||
|
|
||||||
- Symlink all .dll and .exe files from the original windows installation to
|
|
||||||
the windows directory. Why? Some program reference "%windowsdir%/file.dll"
|
|
||||||
or "%systemdir%/file.dll" directly and fail if they are not present.
|
|
||||||
|
|
||||||
This will give a huge number of symlinks, yes. However, if an installer
|
|
||||||
later overwrites on of those files, it will overwrite the symlink (so
|
|
||||||
that the file now lies in the windows/ subdirectory).
|
|
||||||
|
|
||||||
- On later invocation the script might want to compare regular files in
|
|
||||||
the users windows directories and in the global windows directories and
|
|
||||||
replace same files by symlinks (to avoid diskspace problems).
|
|
||||||
|
|
||||||
Done.
|
|
||||||
|
|
||||||
This procedure requires:
|
|
||||||
- Much thought and work from the packager (1x)
|
|
||||||
- No work for the sysadmin. Well except one "rpm -i" and possible one edit
|
|
||||||
of the configuration file.
|
|
||||||
- Some or no work from the user, except running the per-user setup script
|
|
||||||
once.
|
|
||||||
=> It scales well and suffices most of the rationales.
|
|
||||||
|
|
||||||
Marcus Meissner <Marcus.Meissner@caldera.de>
|
|
||||||
|
|
||||||
----------------------------------------------------------------
|
|
||||||
Sample wine.ini for OpenLinux 2.x:
|
|
||||||
|
|
||||||
;;
|
|
||||||
;; MS-DOS drives configuration
|
|
||||||
;;
|
|
||||||
;; Each section has the following format:
|
|
||||||
;; [Drive X]
|
|
||||||
;; Path=xxx (Unix path for drive root)
|
|
||||||
;; Type=xxx (supported types are 'floppy', 'hd', 'cdrom' and 'network')
|
|
||||||
;; Label=xxx (drive label, at most 11 characters)
|
|
||||||
;; Serial=xxx (serial number, 8 characters hexadecimal number)
|
|
||||||
;; Filesystem=xxx (supported types are 'msdos'/'dos'/'fat', 'win95'/'vfat', 'unix')
|
|
||||||
;; This is the FS Wine is supposed to emulate on a certain
|
|
||||||
;; directory structure.
|
|
||||||
;; Recommended:
|
|
||||||
;; - "win95" for ext2fs, VFAT and FAT32
|
|
||||||
;; - "msdos" for FAT16 (ugly, upgrading to VFAT driver strongly recommended)
|
|
||||||
;; DON'T use "unix" unless you intend to port programs using Winelib !
|
|
||||||
;; Device=/dev/xx (only if you want to allow raw device access)
|
|
||||||
;;
|
|
||||||
|
|
||||||
;
|
|
||||||
;
|
|
||||||
; Floppy 'A' and 'B'
|
|
||||||
;
|
|
||||||
; OpenLinux uses an automounter under /auto/, so we use that too.
|
|
||||||
;
|
|
||||||
[Drive A]
|
|
||||||
Path=/auto/floppy/
|
|
||||||
Type=floppy
|
|
||||||
Label=Floppy
|
|
||||||
Serial=87654321
|
|
||||||
Device=/dev/fd0
|
|
||||||
Filesystem=win95
|
|
||||||
|
|
||||||
;
|
|
||||||
; Comment in ONLY if you have a second floppy or the automounter hangs
|
|
||||||
; for 5 minutes.
|
|
||||||
;
|
|
||||||
;[Drive B]
|
|
||||||
;Path=/auto/floppy2/
|
|
||||||
;Type=floppy
|
|
||||||
;Label=Floppy
|
|
||||||
;Serial=87654321
|
|
||||||
;Device=/dev/fd1
|
|
||||||
;Filesystem=win95
|
|
||||||
|
|
||||||
|
|
||||||
;
|
|
||||||
; Drive 'C' links to the users homedirectory.
|
|
||||||
;
|
|
||||||
; This must point to a writeable directory structure (not your readonly
|
|
||||||
; mounted DOS partitions!) since programs want to dump stuff into
|
|
||||||
; "Program Files/" "Programme/", "windows/", "windows/system/" etc.
|
|
||||||
;
|
|
||||||
; The basic structure is set up using the config script.
|
|
||||||
;
|
|
||||||
[Drive C]
|
|
||||||
Path=${HOME}
|
|
||||||
Type=hd
|
|
||||||
Label=MS-DOS
|
|
||||||
Filesystem=win95
|
|
||||||
|
|
||||||
;
|
|
||||||
; /tmp/ directory
|
|
||||||
;
|
|
||||||
; The temp drive (and directory) points to /tmp/. Windows programs fill it
|
|
||||||
; with junk, so it is approbiate.
|
|
||||||
;
|
|
||||||
[Drive T]
|
|
||||||
Path=/tmp
|
|
||||||
Type=hd
|
|
||||||
Label=Tmp Drive
|
|
||||||
Filesystem=win95
|
|
||||||
|
|
||||||
;
|
|
||||||
; 'U'ser homedirectory
|
|
||||||
;
|
|
||||||
; Just in case you want C:\ elsewhere.
|
|
||||||
;
|
|
||||||
[Drive U]
|
|
||||||
Path=${HOME}
|
|
||||||
Type=hd
|
|
||||||
Label=Home
|
|
||||||
Filesystem=win95
|
|
||||||
|
|
||||||
;
|
|
||||||
; CD-'R'OM drive (automounted)
|
|
||||||
;
|
|
||||||
; The default cdrom drive.
|
|
||||||
;
|
|
||||||
; If an application (or game) wants a specific CD-ROM you might have to
|
|
||||||
; temporary change the Label to the one of the CD itself.
|
|
||||||
;
|
|
||||||
; How to read them is described in /usr/doc/wine-cvs-xxxxx/cdrom-labels.
|
|
||||||
;
|
|
||||||
[Drive R]
|
|
||||||
Path=/auto/cdrom
|
|
||||||
Type=cdrom
|
|
||||||
Label=CD-Rom
|
|
||||||
Filesystem=win95
|
|
||||||
|
|
||||||
;
|
|
||||||
; The drive where the old windows installation resides (it points to the
|
|
||||||
; windows/ subdirectory).
|
|
||||||
;
|
|
||||||
; The Path is modified by the winesetup script.
|
|
||||||
;
|
|
||||||
[Drive W]
|
|
||||||
Path=/
|
|
||||||
Type=network
|
|
||||||
Label=Windows
|
|
||||||
Filesystem=win95
|
|
||||||
;
|
|
||||||
; The UNIX Root directory, so all other programs and directories are reachable.
|
|
||||||
;
|
|
||||||
; type network is used to tell programs to not write here.
|
|
||||||
;
|
|
||||||
[Drive Z]
|
|
||||||
Path=/
|
|
||||||
Type=network
|
|
||||||
Label=ROOT
|
|
||||||
Filesystem=win95
|
|
||||||
|
|
||||||
;
|
|
||||||
; Standard Windows path entries. WINE will not work if they are incorrect.
|
|
||||||
;
|
|
||||||
[wine]
|
|
||||||
;
|
|
||||||
; The windows/ directory. It must be writeable, for programs write into it.
|
|
||||||
;
|
|
||||||
Windows=c:\windows
|
|
||||||
;
|
|
||||||
; The windows/system/ directory. It must be writeable, for especially setup
|
|
||||||
; programs install dlls in there.
|
|
||||||
;
|
|
||||||
System=c:\windows\system
|
|
||||||
;
|
|
||||||
; The temp directory. Should be cleaned regulary, since install programs leave
|
|
||||||
; junk without end in there.
|
|
||||||
;
|
|
||||||
Temp=t:\
|
|
||||||
;
|
|
||||||
; The dll search path. It should contain at least:
|
|
||||||
; - the windows and the windows/system directory of the user.
|
|
||||||
; - the global windows and windows/system directory (from a possible readonly
|
|
||||||
; windows installation either on msdos filesystems or somewhere in the UNIX
|
|
||||||
; directory tree)
|
|
||||||
; - any other windows style directories you want to add.
|
|
||||||
;
|
|
||||||
Path=c:\windows;c:\windows\system;c:\windows\system32;t:\;w:\;w:\system;w:\system32
|
|
||||||
;
|
|
||||||
; Outdated and no longer used. (but needs to be present).
|
|
||||||
;
|
|
||||||
SymbolTableFile=./wine.sym
|
|
||||||
|
|
||||||
# <wineconf>
|
|
||||||
|
|
||||||
;
|
|
||||||
; Dll loadorder defaults. No need to modify.
|
|
||||||
;
|
|
||||||
[DllDefaults]
|
|
||||||
EXTRA_LD_LIBRARY_PATH=${HOME}/wine/cvs/lib
|
|
||||||
DefaultLoadOrder = native, elfdll, so, builtin
|
|
||||||
|
|
||||||
;
|
|
||||||
; What 32/16 dlls belong to each other (context wise). No need to modify.
|
|
||||||
;
|
|
||||||
[DllPairs]
|
|
||||||
kernel = kernel32
|
|
||||||
gdi = gdi32
|
|
||||||
user = user32
|
|
||||||
commdlg = comdlg32
|
|
||||||
commctrl= comctl32
|
|
||||||
ver = version
|
|
||||||
shell = shell32
|
|
||||||
lzexpand= lz32
|
|
||||||
mmsystem= winmm
|
|
||||||
msvideo = msvfw32
|
|
||||||
winsock = wsock32
|
|
||||||
|
|
||||||
;
|
|
||||||
; What type of dll to use in their respective loadorder.
|
|
||||||
;
|
|
||||||
[DllOverrides]
|
|
||||||
kernel32, gdi32, user32 = builtin
|
|
||||||
kernel, gdi, user = builtin
|
|
||||||
toolhelp = builtin
|
|
||||||
comdlg32, commdlg = elfdll, builtin, native
|
|
||||||
version, ver = elfdll, builtin, native
|
|
||||||
shell32, shell = builtin, native
|
|
||||||
lz32, lzexpand = builtin, native
|
|
||||||
commctrl, comctl32 = builtin, native
|
|
||||||
wsock32, winsock = builtin
|
|
||||||
advapi32, crtdll, ntdll = builtin, native
|
|
||||||
mpr, winspool = builtin, native
|
|
||||||
ddraw, dinput, dsound = builtin, native
|
|
||||||
winmm, mmsystem = builtin
|
|
||||||
msvideo, msvfw32 = builtin, native
|
|
||||||
mcicda.drv, mciseq.drv = builtin, native
|
|
||||||
mciwave.drv = builtin, native
|
|
||||||
mciavi.drv, mcianim.drv = native, builtin
|
|
||||||
w32skrnl = builtin
|
|
||||||
wnaspi32, wow32 = builtin
|
|
||||||
system, display, wprocs = builtin
|
|
||||||
wineps = builtin
|
|
||||||
|
|
||||||
;
|
|
||||||
; Options section. Does not need to be edited.
|
|
||||||
;
|
|
||||||
[options]
|
|
||||||
; allocate how much system colors on startup. No need to modify.
|
|
||||||
AllocSystemColors=100
|
|
||||||
|
|
||||||
;;
|
|
||||||
; Font specification. You usually do not need to edit this section.
|
|
||||||
;
|
|
||||||
; Read documentation/fonts before adding aliases
|
|
||||||
;
|
|
||||||
[fonts]
|
|
||||||
; The resolution defines what fonts to use (usually either 75 or 100 dpi fonts,
|
|
||||||
; or nearest match).
|
|
||||||
Resolution = 96
|
|
||||||
; Default font
|
|
||||||
Default = -adobe-times-
|
|
||||||
|
|
||||||
;
|
|
||||||
; serial ports used by "COM1" "COM2" "COM3" "COM4". Useful for applications
|
|
||||||
; that try to access serial ports.
|
|
||||||
;
|
|
||||||
[serialports]
|
|
||||||
Com1=/dev/ttyS0
|
|
||||||
Com2=/dev/ttyS1
|
|
||||||
Com3=/dev/modem,38400
|
|
||||||
Com4=/dev/modem
|
|
||||||
|
|
||||||
;
|
|
||||||
; parallel port(s) used by "LPT1" etc. Useful for applications that try to
|
|
||||||
; access these ports.
|
|
||||||
;
|
|
||||||
[parallelports]
|
|
||||||
Lpt1=/dev/lp0
|
|
||||||
|
|
||||||
;
|
|
||||||
; What spooling program to use on printing.
|
|
||||||
; Use "|program" or "filename", where the output will be dumped into.
|
|
||||||
;
|
|
||||||
[spooler]
|
|
||||||
LPT1:=|lpr
|
|
||||||
LPT2:=|gs -sDEVICE=bj200 -sOutputFile=/tmp/fred -q -
|
|
||||||
LPT3:=/dev/lp3
|
|
||||||
|
|
||||||
;
|
|
||||||
; Allow port access to WINE started by the root user. Useful for some
|
|
||||||
; supported devices, but it can make the system unstable.
|
|
||||||
; Read /usr/doc/wine-cvs-xxxxx/ioport-trace-hints.
|
|
||||||
;
|
|
||||||
[ports]
|
|
||||||
;read=0x779,0x379,0x280-0x2a0
|
|
||||||
;write=0x779,0x379,0x280-0x2a0
|
|
||||||
|
|
||||||
; debugging, not need to be modified.
|
|
||||||
[spy]
|
|
||||||
Exclude=WM_SIZE;WM_TIMER;
|
|
||||||
|
|
||||||
;
|
|
||||||
; What names for the registry datafiles, no need to modify.
|
|
||||||
;
|
|
||||||
[Registry]
|
|
||||||
; Paths must be given in /dir/dir/file.reg format.
|
|
||||||
; Wine will not understand dos file names here...
|
|
||||||
;UserFileName=xxx ; alternate registry file name (user.reg)
|
|
||||||
;LocalMachineFileName=xxx ; (system.reg)
|
|
||||||
|
|
||||||
;
|
|
||||||
; Layout/Look modifications. Here you can switch with a single line between
|
|
||||||
; windows 3.1 and windows 95 style.
|
|
||||||
; This does not change WINE behaviour or reported versions, just the look!
|
|
||||||
;
|
|
||||||
[Tweak.Layout]
|
|
||||||
;; WineLook=xxx (supported styles are 'Win31'(default), 'Win95', 'Win98')
|
|
||||||
WineLook=Win95
|
|
||||||
|
|
||||||
;
|
|
||||||
; What programs to start on WINE startup. (you should probably leave it empty)
|
|
||||||
;
|
|
||||||
[programs]
|
|
||||||
Default=
|
|
||||||
Startup=
|
|
||||||
|
|
||||||
; defunct section.
|
|
||||||
[Console]
|
|
||||||
;XtermProg=nxterm
|
|
||||||
;InitialRows=25
|
|
||||||
;InitialColumns=80
|
|
||||||
;TerminalType=nxterm
|
|
||||||
|
|
||||||
# </wineconf>
|
|
||||||
|
|
||||||
|
|
|
@ -1,216 +0,0 @@
|
||||||
DLL overrides
|
|
||||||
-------------
|
|
||||||
|
|
||||||
The wine.conf directives [DllDefaults] and [DllOverrides] are the
|
|
||||||
subject of some confusion. The overall purpose of most of these
|
|
||||||
directives are clear enough, though - given a choice, should Wine use
|
|
||||||
its own built-in DLLs, or should it use .DLL files found in an
|
|
||||||
existing Windows installation? This document explains how this feature
|
|
||||||
works.
|
|
||||||
|
|
||||||
DLL types
|
|
||||||
|
|
||||||
native
|
|
||||||
A "native" DLL is a .DLL file written for the real Microsoft
|
|
||||||
Windows.
|
|
||||||
|
|
||||||
builtin
|
|
||||||
A "builtin" DLL is a Wine DLL. These can either be a part of
|
|
||||||
libwine.so, or more recently, in a special .so file that Wine
|
|
||||||
is able to load on demand.
|
|
||||||
|
|
||||||
elfdll
|
|
||||||
An "elfdll" is a Wine .so file with a special Windows-like file
|
|
||||||
structure that is as close to Windows as possible, and that can
|
|
||||||
also seamlessly link dynamically with "native" DLLs, by using
|
|
||||||
special ELF loader and linker tricks. Bertho Stultiens did some
|
|
||||||
work on this, but this feature has not yet been merged back
|
|
||||||
into Wine (because of political reasons and lack of time), so
|
|
||||||
this DLL type does not exist in the official Wine at this time.
|
|
||||||
In the meantime, the "builtin" DLL type gained some of the
|
|
||||||
features of elfdlls (such as dynamic loading), so it's possible
|
|
||||||
that "elfdll" functionality will be folded into "builtin" at
|
|
||||||
some point.
|
|
||||||
|
|
||||||
so
|
|
||||||
A native Unix .so file, with calling convention conversion
|
|
||||||
thunks generated on the fly as the library is loaded. This is
|
|
||||||
mostly useful for libraries such as "glide" that has exactly
|
|
||||||
the same API on both Windows and Unix.
|
|
||||||
|
|
||||||
The [DllDefaults] section
|
|
||||||
|
|
||||||
EXTRA_LD_LIBRARY_PATH
|
|
||||||
This specifies the location of the Wine's DLL .so files. Wine
|
|
||||||
will search this path when trying to locate a DLL of the type
|
|
||||||
"builtin" or "elfdll". (This does not apply to libwine.so,
|
|
||||||
since libwine.so is not a DLL in this sense.)
|
|
||||||
|
|
||||||
DefaultLoadOrder
|
|
||||||
This specifies in what order Wine should search for available
|
|
||||||
DLL types, if the DLL in question was not found in the
|
|
||||||
[DllOverrides] section.
|
|
||||||
|
|
||||||
The [DllPairs] section
|
|
||||||
|
|
||||||
At one time, there was a section called [DllPairs] in the default
|
|
||||||
configuration file, but this has been obsoleted because the pairing
|
|
||||||
information has now been embedded into Wine itself. (The purpose of
|
|
||||||
this section was merely to be able to issue warnings if the user
|
|
||||||
attempted to pair codependent 16-bit/32-bit DLLs of different types.)
|
|
||||||
If you still have this in your wine.conf or .winerc, you may safely
|
|
||||||
delete it.
|
|
||||||
|
|
||||||
The [DllOverrides] section
|
|
||||||
|
|
||||||
This section specifies how you want specific DLLs to be handled, in
|
|
||||||
particular whether you want to use "native" DLLs or not, if you have
|
|
||||||
some from a real Windows configuration. Because builtins do not mix
|
|
||||||
seamlessly with native DLLs yet, certain DLL dependencies may be
|
|
||||||
problematic, but workarounds exist in Wine for many popular DLL
|
|
||||||
configurations. Also see WWN's [16]Status Page to figure out how well
|
|
||||||
your favorite DLL is implemented in Wine.
|
|
||||||
|
|
||||||
It is of course also possible to override these settings by explictly
|
|
||||||
using Wine's --dll command-line option (see the man page for details).
|
|
||||||
|
|
||||||
Some hints for choosing your optimal configuration (listed by
|
|
||||||
16/32-bit DLL pair):
|
|
||||||
|
|
||||||
krnl386, kernel32
|
|
||||||
Native versions of these will never work, so don't try. Leave
|
|
||||||
at builtin.
|
|
||||||
|
|
||||||
gdi, gdi32
|
|
||||||
Graphics Device Interface. No effort has been made at trying to
|
|
||||||
run native GDI. Leave at builtin.
|
|
||||||
|
|
||||||
user, user32
|
|
||||||
Window management and standard controls. It was possible to use
|
|
||||||
Win95's native versions at some point (if all other DLLs that
|
|
||||||
depend on it, such as comctl32 and comdlg32, were also run
|
|
||||||
native). However, this is no longer possible after the Address
|
|
||||||
Space Separation, so leave at builtin.
|
|
||||||
|
|
||||||
ntdll
|
|
||||||
NT kernel API. Although badly documented, the native version of
|
|
||||||
this will never work. Leave at builtin.
|
|
||||||
|
|
||||||
w32skrnl
|
|
||||||
Win32s (for Win3.x). Native version will probably never work.
|
|
||||||
Leave at builtin.
|
|
||||||
|
|
||||||
wow32
|
|
||||||
Win16 support library for NT. Native version will probably
|
|
||||||
never work. Leave at builtin.
|
|
||||||
|
|
||||||
system
|
|
||||||
Win16 kernel stuff. Will never work native. Leave at builtin.
|
|
||||||
|
|
||||||
display
|
|
||||||
Display driver. Definitely leave at builtin.
|
|
||||||
|
|
||||||
toolhelp
|
|
||||||
Tool helper routines. This is rarely a source of problems.
|
|
||||||
Leave at builtin.
|
|
||||||
|
|
||||||
ver, version
|
|
||||||
Versioning. Seldom useful to mess with.
|
|
||||||
|
|
||||||
advapi32
|
|
||||||
Registry and security features. Trying the native version of
|
|
||||||
this may or may not work.
|
|
||||||
|
|
||||||
commdlg, comdlg32
|
|
||||||
Common Dialogs, such as color picker, font dialog, print
|
|
||||||
dialog, open/save dialog, etc. It is safe to try native.
|
|
||||||
|
|
||||||
commctrl, comctl32
|
|
||||||
Common Controls. This is toolbars, status bars, list controls,
|
|
||||||
the works. It is safe to try native.
|
|
||||||
|
|
||||||
shell, shell32
|
|
||||||
Shell interface (desktop, filesystem, etc). Being one of the
|
|
||||||
most undocumented pieces of Windows, you may have luck with the
|
|
||||||
native version, should you need it.
|
|
||||||
|
|
||||||
winsock, wsock32
|
|
||||||
Windows Sockets. The native version will not work under Wine,
|
|
||||||
so leave at builtin.
|
|
||||||
|
|
||||||
icmp
|
|
||||||
ICMP routines for wsock32. As with wsock32, leave at builtin.
|
|
||||||
|
|
||||||
mpr
|
|
||||||
The native version may not work due to thunking issues. Leave
|
|
||||||
at builtin.
|
|
||||||
|
|
||||||
lzexpand, lz32
|
|
||||||
Lempel-Ziv decompression. Wine's builtin version ought to work
|
|
||||||
fine.
|
|
||||||
|
|
||||||
winaspi, wnaspi32
|
|
||||||
Advanced SCSI Peripheral Interface. The native version will
|
|
||||||
probably never work. Leave at builtin.
|
|
||||||
|
|
||||||
crtdll
|
|
||||||
C Runtime library. The native version will easily work better
|
|
||||||
than Wine's on this one.
|
|
||||||
|
|
||||||
winspool.drv
|
|
||||||
Printer spooler. You are not likely to have more luck with the
|
|
||||||
native version.
|
|
||||||
|
|
||||||
ddraw
|
|
||||||
DirectDraw/Direct3D. Since Wine does not implement the DirectX
|
|
||||||
HAL, the native version will not work at this time.
|
|
||||||
|
|
||||||
dinput
|
|
||||||
DirectInput. Running this native may or may not work.
|
|
||||||
|
|
||||||
dsound
|
|
||||||
DirectSound. It may be possible to run this native, but don't
|
|
||||||
count on it.
|
|
||||||
|
|
||||||
dplay/dplayx
|
|
||||||
DirectPlay. Native ought to work best on this, if at all.
|
|
||||||
|
|
||||||
mmsystem, winmm
|
|
||||||
Multimedia system. The native version is not likely to work.
|
|
||||||
Leave at builtin.
|
|
||||||
|
|
||||||
msacm, msacm32
|
|
||||||
Audio Compression Manager. Builtin works best, if you set
|
|
||||||
msacm.drv to the same.
|
|
||||||
|
|
||||||
msvideo, msvfw32
|
|
||||||
Video for Windows. It is safe (and recommended) to try native.
|
|
||||||
|
|
||||||
mcicda.drv
|
|
||||||
CD Audio MCI driver.
|
|
||||||
|
|
||||||
mciseq.drv
|
|
||||||
MIDI Sequencer MCI driver (.MID playback).
|
|
||||||
|
|
||||||
mciwave.drv
|
|
||||||
Wave audio MCI driver (.WAV playback).
|
|
||||||
|
|
||||||
mciavi.drv
|
|
||||||
AVI MCI driver (.AVI video playback). Best to use native.
|
|
||||||
|
|
||||||
mcianim.drv
|
|
||||||
Animation MCI driver.
|
|
||||||
|
|
||||||
msacm.drv
|
|
||||||
Audio Compression Manager. Set to same as msacm32.
|
|
||||||
|
|
||||||
midimap.drv
|
|
||||||
MIDI Mapper.
|
|
||||||
|
|
||||||
wprocs
|
|
||||||
This is a pseudo-DLL used by Wine for thunking purposes. A
|
|
||||||
native version of this doesn't exist.
|
|
||||||
|
|
||||||
Have fun...
|
|
||||||
|
|
||||||
- Ove Kåven
|
|
|
@ -1,175 +0,0 @@
|
||||||
WINE/WINDOWS DLLS
|
|
||||||
|
|
||||||
|
|
||||||
This document mainly deals with the status of current DLL support by
|
|
||||||
Wine. The Wine ini file currently supports settings to change the
|
|
||||||
load order of DLLs. The load order depends on several issues, which
|
|
||||||
results in different settings for various DLLs.
|
|
||||||
|
|
||||||
|
|
||||||
Pros of Native DLLs
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
Native DLLs of course guarantee 100% compatibility for routines they
|
|
||||||
implement. For example, using the native USER DLL would maintain a
|
|
||||||
virtually perfect and Windows 95-like look for window borders, dialog
|
|
||||||
controls, and so on. Using the built-in WINE version of this library,
|
|
||||||
on the other hand, would produce a display that does not precisely
|
|
||||||
mimic that of Windows 95. Such subtle differences can be engendered
|
|
||||||
in other important DLLs, such as the common controls library COMMCTRL
|
|
||||||
or the common dialogs library COMMDLG, when built-in WINE DLLs outrank
|
|
||||||
other types in load order.
|
|
||||||
|
|
||||||
More significant, less aesthetically-oriented problems can result if
|
|
||||||
the built-in WINE version of the SHELL DLL is loaded before the native
|
|
||||||
version of this library. SHELL contains routines such as those used by
|
|
||||||
installer utilities to create desktop shortcuts. Some installers might
|
|
||||||
fail when using WINE's built-in SHELL.
|
|
||||||
|
|
||||||
Cons of Native DLLs
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
Not every application performs better under native DLLs. If a library
|
|
||||||
tries to access features of the rest of the system that are not fully
|
|
||||||
implemented in Wine, the native DLL might work much worse than the
|
|
||||||
corresponding built-in one, if at all. For example, the native Windows
|
|
||||||
GDI library must be paired with a Windows display driver, which of
|
|
||||||
course is not present under Intel Unix and WINE.
|
|
||||||
|
|
||||||
Finally, occassionally built-in WINE DLLs implement more features than
|
|
||||||
the corresponding native Windows DLLs. Probably the most important
|
|
||||||
example of such behavior is the integration of Wine with X provided by
|
|
||||||
WINE's built-in USER DLL. Should the native Windows USER library take
|
|
||||||
load-order precedence, such features as the ability to use the
|
|
||||||
clipboard or drag-and- drop between Wine windows and X windows will be
|
|
||||||
lost.
|
|
||||||
|
|
||||||
Deciding Between Native and Built-In DLLs
|
|
||||||
-----------------------------------------
|
|
||||||
|
|
||||||
Clearly, there is no one rule-of-thumb regarding which load-order to
|
|
||||||
use. So, you must become familiar with:
|
|
||||||
* what specific DLLs do
|
|
||||||
* which other DLLs or features a given library interacts with
|
|
||||||
and use this information to make a case-by-case decision.
|
|
||||||
|
|
||||||
Load Order for DLLs
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
Using the DLL sections from the wine configuration file, the load
|
|
||||||
order can be tweaked to a high degree. In general it is advised not to
|
|
||||||
change the settings of the configuration file. The default
|
|
||||||
configuration specifies the right load order for the most important
|
|
||||||
DLLs.
|
|
||||||
|
|
||||||
The default load order follows this algorithm: for all DLLs which have
|
|
||||||
a fully-functional Wine implementation, or where the native DLL is
|
|
||||||
known not to work, the built-in library will be loaded first. In all
|
|
||||||
other cases, the native DLL takes load-order precedence.
|
|
||||||
|
|
||||||
The DefaultLoadOrder from the [DllDefaults] section specifies for all
|
|
||||||
DLLs which version to try first. See manpage for explanation of the
|
|
||||||
arguments.
|
|
||||||
|
|
||||||
The [DllOverrides] section deals with DLLs, which need a
|
|
||||||
different-from-default treatment.
|
|
||||||
|
|
||||||
The [DllPairs] section is for DLLs, which must be loaded in pairs. In
|
|
||||||
general, these are DLLs for either 16-bit or 32-bit applications. In
|
|
||||||
most cases in Windows, the 32-bit version cannot be used without its
|
|
||||||
16-bit counterpart. For WINE, it is customary that the 16-bit
|
|
||||||
implementations rely on the 32-bit implementations and cast the
|
|
||||||
results back to 16-bit arguments. Changing anything in this section is
|
|
||||||
bound to result in errors.
|
|
||||||
|
|
||||||
For the future, Wine implemetation of Windows DLL seems to head
|
|
||||||
towards unifying the 16 and 32 bit DLLs wherever possible, resulting
|
|
||||||
in larger DLLs. They are stored in the dlls/ subdirectory using the
|
|
||||||
16-bit name. For large DLLs, a split might be discussed.
|
|
||||||
|
|
||||||
|
|
||||||
Understanding What DLLs Do
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
The following list briefly describes each of the DLLs commonly found
|
|
||||||
in Windows whose load order may be modified during the configuration
|
|
||||||
and compilation of WINE.
|
|
||||||
|
|
||||||
(See also ./DEVELOPER-HINTS or the dlls/ subdirectory to see which
|
|
||||||
DLLs are currently being rewritten for wine)
|
|
||||||
|
|
||||||
ADVAPI32.DLL: 32-bit application advanced programming interfaces
|
|
||||||
like crypto, systeminfo, security and eventlogging
|
|
||||||
AVIFILE.DLL: 32-bit application programming interfaces for the
|
|
||||||
Audio Video Interleave (AVI) Windows-specific
|
|
||||||
Microsoft audio-video standard
|
|
||||||
COMMCTRL.DLL: 16-bit common controls
|
|
||||||
COMCTL32.DLL: 32-bit common controls
|
|
||||||
COMDLG32.DLL: 32-bit common dialogs
|
|
||||||
COMMDLG.DLL: 16-bit common dialogs
|
|
||||||
COMPOBJ.DLL: OLE 16- and 32-bit compatibility libraries
|
|
||||||
CRTDLL.DLL: Microsoft C runtime
|
|
||||||
DCIMAN.DLL: 16-bit
|
|
||||||
DCIMAN32.DLL: 32-bit display controls
|
|
||||||
DDEML.DLL: DDE messaging
|
|
||||||
D3D*.DLL DirectX/Direct3D drawing libraries
|
|
||||||
DDRAW.DLL: DirectX drawing libraries
|
|
||||||
DINPUT.DLL: DirectX input libraries
|
|
||||||
DISPLAY.DLL: Display libraries
|
|
||||||
DPLAY.DLL, DPLAYX.DLL: DirectX playback libraries
|
|
||||||
DSOUND.DLL: DirectX audio libraries
|
|
||||||
GDI.DLL: 16-bit graphics driver interface
|
|
||||||
GDI32.DLL: 32-bit graphics driver interface
|
|
||||||
IMAGEHLP.DLL: 32-bit IMM API helper libraries (for PE-executables)
|
|
||||||
IMM32.DLL: 32-bit IMM API
|
|
||||||
IMGUTIL.DLL:
|
|
||||||
KERNEL32.DLL 32-bit kernel DLL
|
|
||||||
KEYBOARD.DLL: Keyboard drivers
|
|
||||||
LZ32.DLL: 32-bit Lempel-Ziv or LZ file compression
|
|
||||||
used by the installshields (???).
|
|
||||||
LZEXPAND.DLL: LZ file expansion; needed for Windows Setup
|
|
||||||
MMSYSTEM.DLL: Core of the Windows multimedia system
|
|
||||||
MOUSE.DLL: Mouse drivers
|
|
||||||
MPR.DLL: 32-bit Windows network interface
|
|
||||||
MSACM.DLL: Core of the Addressed Call Mode or ACM system
|
|
||||||
MSACM32.DLL: Core of the 32-bit ACM system
|
|
||||||
Audio Compression Manager ???
|
|
||||||
MSNET32.DLL 32-bit network APIs
|
|
||||||
MSVFW32.DLL: 32-bit Windows video system
|
|
||||||
MSVIDEO.DLL: 16-bit Windows video system
|
|
||||||
OLE2.DLL: OLE 2.0 libraries
|
|
||||||
OLE32.DLL: 32-bit OLE 2.0 components
|
|
||||||
OLE2CONV.DLL: Import filter for graphics files
|
|
||||||
OLE2DISP.DLL, OLE2NLS.DLL: OLE 2.1 16- and 32-bit interoperability
|
|
||||||
OLE2PROX.DLL: Proxy server for OLE 2.0
|
|
||||||
OLE2THK.DLL: Thunking for OLE 2.0
|
|
||||||
OLEAUT32.DLL 32-bit OLE 2.0 automation
|
|
||||||
OLECLI.DLL: 16-bit OLE client
|
|
||||||
OLECLI32.DLL: 32-bit OLE client
|
|
||||||
OLEDLG.DLL: OLE 2.0 user interface support
|
|
||||||
OLESVR.DLL: 16-bit OLE server libraries
|
|
||||||
OLESVR32.DLL: 32-bit OLE server libraries
|
|
||||||
PSAPI.DLL: Proces Status API libraries
|
|
||||||
RASAPI16.DLL: 16-bit Remote Access Services libraries
|
|
||||||
RASAPI32.DLL: 32-bit Remote Access Services libraries
|
|
||||||
SHELL.DLL: 16-bit Windows shell used by Setup
|
|
||||||
SHELL32.DLL: 32-bit Windows shell (COM object?)
|
|
||||||
TAPI/TAPI32/TAPIADDR: Telephone API (for Modems)
|
|
||||||
W32SKRNL: Win32s Kernel ? (not in use for Win95 and up!)
|
|
||||||
WIN32S16.DLL: Application compatibility for Win32s
|
|
||||||
WIN87EM.DLL: 80387 math-emulation libraries
|
|
||||||
WINASPI.DLL: Advanced SCSI Peripheral Interface or ASPI libraries
|
|
||||||
WINDEBUG.DLL Windows debugger
|
|
||||||
WINMM.DLL: Libraries for multimedia thunking
|
|
||||||
WING.DLL: Libraries required to "draw" graphics
|
|
||||||
WINSOCK.DLL: Sockets APIs
|
|
||||||
WINSPOOL.DLL: Print spooler libraries
|
|
||||||
WNASPI32.DLL: 32-bit ASPI libraries
|
|
||||||
WSOCK32.DLL: 32-bit sockets APIs
|
|
||||||
|
|
||||||
|
|
||||||
Credits
|
|
||||||
-------
|
|
||||||
|
|
||||||
Based upon various messages on wine-devel especially by Ulrich Weigand.
|
|
||||||
Adapted by Michele Petrovski and Klaas van Gend.
|
|
|
@ -0,0 +1,908 @@
|
||||||
|
<chapter id="dlls">
|
||||||
|
<title>Wine Builtin DLLs</title>
|
||||||
|
<para>A more detailed look at Wine's builtin DLLs...</para>
|
||||||
|
|
||||||
|
<sect1 id="common-controls">
|
||||||
|
<title>Common Controls</title>
|
||||||
|
|
||||||
|
<!-- FIXME: Huh? Subtitle element not available here?!? -->
|
||||||
|
<bridgehead renderas="sect3">
|
||||||
|
Their development status and their UNDOCUMENTED features and functions
|
||||||
|
</bridgehead>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by Eric Kohl <ekohl@abo.rhein-zeitung.de>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/common_controls</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>1. Introduction</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The information provided herein is based on the dll version
|
||||||
|
4.72 which is included in MS Internet Explorer 4.01.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
All information about common controls should be collected in this document.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
All Wine programmers are encouraged to add their knowledge to this document.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>2. General Information</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Further information about common controls can be found in
|
||||||
|
the MS Platform SDK and the MS Internet Client SDK (most
|
||||||
|
recent). Information from these SDK's will NOT be repeated
|
||||||
|
here. Only information which can NOT be found in these SDK's
|
||||||
|
will be collected here. Some information in the SDK's
|
||||||
|
mentioned above is (intentionally???) WRONG. Corrections to
|
||||||
|
wrong information will be collected here too.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>2.1 Structure sizes of different common control versions</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The common controls have been continously improved in the
|
||||||
|
past. Some of the orignal structures had to be extended
|
||||||
|
and their size changed. Most of the common control
|
||||||
|
structures include their size as the first parameter. If a
|
||||||
|
control gets the wrong size in a message or function a
|
||||||
|
failure is very likely to occur. To avoid this, MS defined
|
||||||
|
new constants that reflect the structure size of older
|
||||||
|
<filename>COMCTL32.DLL</filename> versions. The following
|
||||||
|
list shows the structure size constants that are currently
|
||||||
|
defined in the original <filename>COMCTL32.DLL</filename>.
|
||||||
|
</para>
|
||||||
|
<note>
|
||||||
|
<para>
|
||||||
|
Some stuctures are NOT defined in wine's COMCTL32 yet.
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>HDITEM_V1_SIZE</varname>:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>The size of the <structname>HDITEM</structname>
|
||||||
|
structure in version 4.00.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>LVCOLUMN_V1_SIZE</varname>:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>The size of the
|
||||||
|
<structname>LVCOLUMN</structname> structure in
|
||||||
|
version 4.00.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>LVHITTESTINFO_V1_SIZE</varname>:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>The size of the
|
||||||
|
<structname>LVHITTESTINFO</structname> structure in
|
||||||
|
version 4.00.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>LVITEM_V1_SIZE</varname>:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>The size of the <structname>LVITEM</structname>
|
||||||
|
structure in version 4.00.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>NMLVCUSTOMDRAW_V3_SIZE</varname>:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>The size of the
|
||||||
|
<structname>NMLVCUSTOMDRAW</structname> structure in
|
||||||
|
version 4.70.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>NMTTDISPINFO_V1_SIZE</varname>:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>The size of the
|
||||||
|
<structname>NMTTDISPINFO</structname> structure in
|
||||||
|
version 4.00.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>NMTVCUSTOMDRAW_V3_SIZE</varname>:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>The size of the
|
||||||
|
<structname>NMTVCUSTOMDRAW</structname> structure in
|
||||||
|
version 4.70.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>PROPSHEETHEADER_V1_SIZE</varname>:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>The size of the
|
||||||
|
<structname>PROPSHEETHEADER</structname> structure
|
||||||
|
in version 4.00.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>PROPSHEETPAGE_V1_SIZE</varname>:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>The size of the
|
||||||
|
<structname>PROPSHEETPAGE</structname> structure in
|
||||||
|
version 4.00.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>REBARBANDINFO_V3_SIZE</varname>:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>The size of the
|
||||||
|
<structname>REBARBANDINFO</structname> structure in
|
||||||
|
version 4.70.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>TTTOOLINFO_V1_SIZE</varname>:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>The size of the
|
||||||
|
<structname>TOOLINFO</structname> structure in
|
||||||
|
version 4.00.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>TVINSERTSTRUCT_V1_SIZE</varname>:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>The size of the
|
||||||
|
<structname>TVINSERTSTRUCT</structname> structure in
|
||||||
|
version 4.00.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>3. Controls</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This section describes the development status of the common controls.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.1 Animation Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy control. No functionality.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term> Notes:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Author needed!! Any volunteers??</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.2 Combo Box Ex Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy control. No functionality.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Notes:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Author needed!! Any volunteers??</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.3 Date and Time Picker Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy control. No functionality.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Notes:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Author needed!! Any volunteers??</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.4 Drag List Box Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy control. No functionality.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Notes:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Author needed!! Any volunteers??</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.5 Flat Scroll Bar Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy written by Alex Priem. <alexp@sci.kun.nl></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy control. No functionality.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Notes:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Author needed!! Any volunteers??</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.6 Header Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Eric Kohl <ekohl@abo.rhein-zeitung.de></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>Almost finished.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Unicode notifications are not supported (WM_NOTIFYFORMAT).</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Order array not supported.</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.7 Hot Key Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy control. No functionality.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Notes:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Author needed!! Any volunteers??</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.8 Image List (no control)</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Eric Kohl <ekohl@abo.rhein-zeitung.de></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Almost finished.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.9 IP Address Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de>,
|
||||||
|
Alex Priem <alexp@sci.kun.nl>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Under construction.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.10 List View Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy written by: </para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>Eric Kohl. <ekohl@abo.rhein-zeitung.de></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Luc Tourangeau <luc@macadamian.com></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Koen Deforche <jozef@kotnet.org></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Francis Beaudet <francis@macadamian.com> and the "Corel-Team"</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Under construction.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Notes:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Basic data structure with related messages are
|
||||||
|
supported. No painting supported yet.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.11 Month Calendar Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy control. No functionality.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Notes:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Author needed!! Any volunteers??</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.12 Native font control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy control. No functionality.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Notes:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Author needed!! Any volunteers??</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.13 Pager Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy written by Eric Kohl. <ekohl@abo.rhein-zeitung.de></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Under construction. Many missing features.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Notes:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Author needed!! Any volunteers??</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.14 Progress Bar Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Original implementation by Dimitrie O. Paun. Fixes
|
||||||
|
and improvements by Eric Kohl.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Finished!</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.15 Property Sheet</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Anders Carlsson <anders.carlsson@linux.nu> and
|
||||||
|
Francis Beaudet <francis@macadamian.com>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Development in progress.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Notes:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Tab control must be implemented first.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.16 Rebar Control (Cool Bar)</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Eric Kohl <ekohl@abo.rhein-zeitung.de></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Development in progress. Many bugs and missing features.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Notes:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Author needed!! Any volunteers??</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.17 Status Bar Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Original implementation by Bruce Milner. Fixes and
|
||||||
|
improvements by Eric Kohl.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Almost finished.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Notes:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Tooltip integration is almost complete.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.18 Tab Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Anders Carlsson <anders.carlsson@linux.nu></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Development in progress.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.19 Toolbar Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Eric Kohl <ekohl@abo.rhein-zeitung.de></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Development in progress. Basic functionality is
|
||||||
|
almost done. (dll version 4.0)
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.20 Tooltip Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Eric Kohl <ekohl@abo.rhein-zeitung.de></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Almost finished.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Notes:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Unicode support is incomplete
|
||||||
|
(<constant>WM_NOTIFYFORMAT</constant>).</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.21 Trackbar Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Dummy written by Eric Kohl <ekohl@abo.rhein-zeitung.de>,
|
||||||
|
Alex Priem <alexp@sci.kun.nl>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Under construction.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.22 Tree View Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Dummy written by Eric Kohl., Alex Priem <alexp@sci.kun.nl></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Under construction.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>3.23 Updown Control</title>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Author:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Original implementation by Dimitrie O. Paun.
|
||||||
|
Some minor changes by Eric Kohl <ekohl@abo.rhein-zeitung.de>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Status:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>Unknown.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<title>Notes</title>
|
||||||
|
<para>
|
||||||
|
Have a look at <filename>controls/updown.c</filename>
|
||||||
|
for a list of bugs and missing features.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The status is unknown, because I did not have a close
|
||||||
|
look at this control. One test-program looked quite
|
||||||
|
good, but in Win95's <filename>cdplayer.exe</filename>
|
||||||
|
the control does not show at all.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Any volunteers??
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
</sect3>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>4. Additional Information</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Has to be written...
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>5. Undocumented features</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
There are quite a lot of undocumented functions like:
|
||||||
|
</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>DSA (Dynamic Storage Array) functions.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>DPA (Dynamic Pointer Array) functions.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>MRU ("Most Recently Used" List) functions.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>other unknown functions.</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Have a look at <filename>relay32/comctl32.spec</filename>.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>5.1 Dymnamic Storage Array (DSA)</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The DSA functions are used to store and manage dynamic
|
||||||
|
arrays of fixed size memory blocks. They are used by
|
||||||
|
<filename>TASKMAN.EXE</filename>, Explorer, IE4 and other
|
||||||
|
Programs and DLL's that are "parts of the Windows
|
||||||
|
Operating System". The implementation should be complete.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Have a look at the source code to get more information.
|
||||||
|
</para>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>5.2 Dynamic Pointer Array (DPA)</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Similar to the DSA functions, but they just store
|
||||||
|
pointers. They are used by Explorer, IE4 and other
|
||||||
|
Programs and DLL's that are "parts of the Windows
|
||||||
|
Operating System". The implementation should be complete.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Have a look at the source code to get more information.
|
||||||
|
</para>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>5.3 "Most Recently Used" - List (MRU)</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Only stubs are implemented to keep Explorer from bailing out.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
No more information available at this time!
|
||||||
|
</para>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>5.4 MenuHelp</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Has to be written...
|
||||||
|
</para>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>5.5 GetEffectiveClientRect</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Has to be written...
|
||||||
|
</para>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>5.6 ShowHideMenuCtl</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The official documentation provided by MS is incomplete.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>lpInfo</varname>:</term>
|
||||||
|
<listitem>
|
||||||
|
<blockquote>
|
||||||
|
<para>
|
||||||
|
Both values of the first pair must be the handle
|
||||||
|
to the applications main menu.
|
||||||
|
</para>
|
||||||
|
</blockquote>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect3>
|
||||||
|
|
||||||
|
<sect3>
|
||||||
|
<title>5.7 Other undocumented functions</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Several other undocumented functions are used by IE4.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
String functions: (will be written...)
|
||||||
|
</para>
|
||||||
|
</sect3>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>6. Epilogue</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
You see, much work has still to be done. If you are
|
||||||
|
interested in writing a control send me an e-mail. If you
|
||||||
|
like to fix bugs or add some functionality send an e-mail to
|
||||||
|
the author of the control.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -0,0 +1,89 @@
|
||||||
|
<chapter id="documentation">
|
||||||
|
<title>Documenting Wine</title>
|
||||||
|
<para>How to help out with the Wine documentation effort...</para>
|
||||||
|
|
||||||
|
<sect1 id="api-docs">
|
||||||
|
<title>Writing Wine API Documentation</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by (???)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/README.documentation</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
To improve the documentation of the Wine API, just add
|
||||||
|
comments to the existing source. For example,
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
/******************************************************************
|
||||||
|
* CopyMetaFile32A (GDI32.23)
|
||||||
|
*
|
||||||
|
* Copies the metafile corresponding to hSrcMetaFile to either
|
||||||
|
* a disk file, if a filename is given, or to a new memory based
|
||||||
|
* metafile, if lpFileName is NULL.
|
||||||
|
*
|
||||||
|
* RETURNS
|
||||||
|
*
|
||||||
|
* Handle to metafile copy on success, NULL on failure.
|
||||||
|
*
|
||||||
|
* BUGS
|
||||||
|
*
|
||||||
|
* Copying to disk returns NULL even if successful.
|
||||||
|
*/
|
||||||
|
HMETAFILE32 WINAPI CopyMetaFile32A(
|
||||||
|
HMETAFILE32 hSrcMetaFile, /* handle of metafile to copy */
|
||||||
|
LPCSTR lpFilename /* filename if copying to a file */
|
||||||
|
) { ... }
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
becomes, after processing with <command>c2man</command> and
|
||||||
|
<command>nroff -man</command>,
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
CopyMetaFileA(3w) CopyMetaFileA(3w)
|
||||||
|
|
||||||
|
|
||||||
|
NAME
|
||||||
|
CopyMetaFileA - CopyMetaFile32A (GDI32.23)
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
HMETAFILE32 CopyMetaFileA
|
||||||
|
(
|
||||||
|
HMETAFILE32 hSrcMetaFile,
|
||||||
|
LPCSTR lpFilename
|
||||||
|
);
|
||||||
|
|
||||||
|
PARAMETERS
|
||||||
|
HMETAFILE32 hSrcMetaFile
|
||||||
|
Handle of metafile to copy.
|
||||||
|
|
||||||
|
LPCSTR lpFilename
|
||||||
|
Filename if copying to a file.
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
Copies the metafile corresponding to hSrcMetaFile to
|
||||||
|
either a disk file, if a filename is given, or to a new
|
||||||
|
memory based metafile, if lpFileName is NULL.
|
||||||
|
|
||||||
|
RETURNS
|
||||||
|
Handle to metafile copy on success, NULL on failure.
|
||||||
|
|
||||||
|
BUGS
|
||||||
|
Copying to disk returns NULL even if successful.
|
||||||
|
|
||||||
|
SEE ALSO
|
||||||
|
GetMetaFileA(3w), GetMetaFileW(3w), CopyMetaFileW(3w),
|
||||||
|
PlayMetaFile(3w), SetMetaFileBitsEx(3w), GetMetaFileBit-
|
||||||
|
sEx(3w)
|
||||||
|
</screen>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -1,31 +0,0 @@
|
||||||
DOS treats the first 5 file handles as special cases. They map directly
|
|
||||||
to stdin, stdout, stderr, stdaux and stdprn. Windows 16 inherits this
|
|
||||||
behavoir, and in fact, win16 handles are interchangable with DOS handles.
|
|
||||||
Some nasty windows programs even do this!
|
|
||||||
|
|
||||||
Windows32 issues file handles starting from 1, on the grounds that
|
|
||||||
most GUI processes don't need a stdin, out, etc.
|
|
||||||
|
|
||||||
The wine handle code is implemented in the Win32 style, and the Win16
|
|
||||||
functions use two macros to convert to and from the two types.
|
|
||||||
|
|
||||||
The macros are defined in file.h as follows.:
|
|
||||||
#define HFILE16_TO_HFILE32(handle) \
|
|
||||||
(((handle)==0) ? GetStdHandle(STD_INPUT_HANDLE) : \
|
|
||||||
((handle)==1) ? GetStdHandle(STD_OUTPUT_HANDLE) : \
|
|
||||||
((handle)==2) ? GetStdHandle(STD_ERROR_HANDLE) : \
|
|
||||||
((handle)>0x400) ? handle : \
|
|
||||||
(handle)-5)
|
|
||||||
|
|
||||||
#define HFILE32_TO_HFILE16(handle) ({ HFILE32 hnd=handle; \
|
|
||||||
((hnd==HFILE_ERROR32) ? HFILE_ERROR16 : \
|
|
||||||
((handle>0x400) ? handle : \
|
|
||||||
(HFILE16)hnd+5); })
|
|
||||||
|
|
||||||
WARNING: be careful not to use the macro HFILE16_TO_HFILE32 on
|
|
||||||
functions with side-effects, as it will cause them to be evaluated
|
|
||||||
several times. This could be considered a bug, but the use of this
|
|
||||||
macro is limited enough not to need a rewrite.
|
|
||||||
|
|
||||||
NOTE: The 0x400 special case above deals with LZW filehandles (see
|
|
||||||
misc/lzexpand.c).
|
|
|
@ -1,184 +0,0 @@
|
||||||
Note:
|
|
||||||
=====
|
|
||||||
The fnt2bdf utility is included with Wine. It can be found in the tools
|
|
||||||
directory.
|
|
||||||
Links to the other tools mentioned in this document can be found on wine
|
|
||||||
headquarters: http://www.winehq.com/tools.html
|
|
||||||
|
|
||||||
|
|
||||||
How To Convert Windows Fonts
|
|
||||||
============================
|
|
||||||
|
|
||||||
If you have access to a Windows installation you should use
|
|
||||||
fnt2bdf utility (found in the 'tools)' directory to convert
|
|
||||||
bitmap fonts (VGASYS.FON, SSERIFE.FON, and SERIFE.FON) into
|
|
||||||
the format that the X Window System can recognize.
|
|
||||||
|
|
||||||
Step 1. Extract bitmap fonts with 'fnt2bdf'.
|
|
||||||
|
|
||||||
Step 2. Convert .bdf files produced by Step 1 into
|
|
||||||
.pcf files with 'bdftopcf'.
|
|
||||||
|
|
||||||
Step 3. Copy .pcf files to the font server directory which
|
|
||||||
is usually /usr/lib/X11/fonts/misc (you will probably
|
|
||||||
need superuser privileges). If you want to create a new
|
|
||||||
font directory you will need to add it to the font path.
|
|
||||||
|
|
||||||
Step 4. Run 'mkfontdir' for the directory you copied fonts to.
|
|
||||||
If you are already in X you should run 'xset fp rehash'
|
|
||||||
to make X server aware of the new fonts.
|
|
||||||
|
|
||||||
Step 5. Edit WINE.CONF file to remove aliases for the fonts
|
|
||||||
you've just installed.
|
|
||||||
|
|
||||||
WINE can get by without these fonts but 'the look and feel'
|
|
||||||
may be quite different. Also, some applications try to load
|
|
||||||
their custom fonts on the fly (WinWord 6.0) and since WINE does
|
|
||||||
not implement this yet it instead prints out something like;
|
|
||||||
|
|
||||||
STUB: AddFontResource( SOMEFILE.FON )
|
|
||||||
|
|
||||||
You can convert this file too. Note that .FON file may not hold
|
|
||||||
any bitmap fonts and fnt2bdf will fail if this is the case. Also
|
|
||||||
note that although the above message will not disappear WINE will
|
|
||||||
work around the problem by using the font you extracted from the
|
|
||||||
SOMEFILE.FON. fnt2bdf will only work for Windows 3.1 fonts. It
|
|
||||||
will not work for TrueType fonts.
|
|
||||||
|
|
||||||
What to do with TrueType fonts? There are several commercial
|
|
||||||
font tools that can convert them to the Type1 format but the
|
|
||||||
quality of the resulting fonts is far from stellar. The other
|
|
||||||
way to use them is to get a font server capable of rendering
|
|
||||||
TrueType (Caldera has one, there also is the free Xfstt in
|
|
||||||
Linux/X11/fonts on sunsite and mirrors, if you're on FreeBSD you
|
|
||||||
can use the port in /usr/ports/x11-servers/Xfstt. And there is
|
|
||||||
xfsft which uses the freetype library, see documentation/ttfserver).
|
|
||||||
|
|
||||||
However, there is a possibility of the native TrueType support
|
|
||||||
via FreeType renderer in the future (hint, hint :-)
|
|
||||||
|
|
||||||
|
|
||||||
How To Add Font Aliases To WINE.CONF
|
|
||||||
====================================
|
|
||||||
|
|
||||||
Many Windows applications assume that fonts included in original Windows 3.1
|
|
||||||
distribution are always present. By default Wine creates a number of aliases
|
|
||||||
that map them on the existing X fonts:
|
|
||||||
|
|
||||||
Windows font ...is mapped to... X font
|
|
||||||
|
|
||||||
"MS Sans Serif" -> "-adobe-helvetica-"
|
|
||||||
"MS Serif" -> "-bitstream-charter-"
|
|
||||||
"Times New Roman" -> "-adobe-times-"
|
|
||||||
"Arial" -> "-adobe-helvetica-"
|
|
||||||
|
|
||||||
There is no default alias for the "System" font. Also, no aliases are
|
|
||||||
created for the fonts that applications install at runtime. The recommended
|
|
||||||
way to deal with this problem is to convert the missing font (see above).
|
|
||||||
If it proves impossible, like in the case with TrueType fonts, you can force
|
|
||||||
the font mapper to choose a closely related X font by adding an alias to the
|
|
||||||
[fonts] section. Make sure that the X font actually exists (with xfontsel
|
|
||||||
tool).
|
|
||||||
|
|
||||||
AliasN = [Windows font], [X font] <, optional "mask X font" flag>
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
Alias0 = System, --international-, subst
|
|
||||||
Alias1 = ...
|
|
||||||
...
|
|
||||||
|
|
||||||
Comments:
|
|
||||||
* There must be no gaps in the sequence {0, ..., N} otherwise all aliases
|
|
||||||
after the first gap won't be read.
|
|
||||||
|
|
||||||
* Usually font mapper translates X font names into font names visible to
|
|
||||||
Windows programs in the following fashion:
|
|
||||||
|
|
||||||
X font ...will show up as... Extracted name
|
|
||||||
|
|
||||||
--international-... -> "International"
|
|
||||||
-adobe-helvetica-... -> "Helvetica"
|
|
||||||
-adobe-utopia-... -> "Utopia"
|
|
||||||
-misc-fixed-... -> "Fixed"
|
|
||||||
-...
|
|
||||||
-sony-fixed-... -> "Sony Fixed"
|
|
||||||
-...
|
|
||||||
|
|
||||||
Note that since -misc-fixed- and -sony-fixed- are different fonts
|
|
||||||
Wine modified the second extracted name to make sure Windows programs
|
|
||||||
can distinguish them because only extracted names appear in the font
|
|
||||||
selection dialogs.
|
|
||||||
|
|
||||||
* "Masking" alias replaces the original extracted name so that in the
|
|
||||||
example case we will have the following mapping:
|
|
||||||
|
|
||||||
--international- -> "System"
|
|
||||||
|
|
||||||
"Nonmasking" aliases are transparent to the user and they do not
|
|
||||||
replace extracted names.
|
|
||||||
|
|
||||||
Wine discards an alias when it sees that the native X font is
|
|
||||||
available.
|
|
||||||
|
|
||||||
* If you do not have access to Windows fonts mentioned in the first
|
|
||||||
paragraph you should try to substitute the "System" font with
|
|
||||||
nonmasking alias. 'xfontsel' will show you the fonts available to
|
|
||||||
X.
|
|
||||||
|
|
||||||
Alias.. = System, ...bold font without serifs
|
|
||||||
|
|
||||||
Also, some Windows applications request fonts without specifying the
|
|
||||||
typeface name of the font. Font table starts with Arial in most Windows
|
|
||||||
installations, however X font table starts with whatever is the first line
|
|
||||||
in the fonts.dir. Therefore WINE uses the following entry to determine
|
|
||||||
which font to check first.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
Default = -adobe-times-
|
|
||||||
|
|
||||||
Comments:
|
|
||||||
It is better to have a scalable font family (bolds and italics included)
|
|
||||||
as the default choice because mapper checks all available fonts until
|
|
||||||
requested height and other attributes match perfectly or the end of the
|
|
||||||
font table is reached. Typical X installations have scalable fonts in
|
|
||||||
the ../fonts/Type1 and ../fonts/Speedo directories.
|
|
||||||
|
|
||||||
|
|
||||||
How To Manage Cached Font Metrics
|
|
||||||
=================================
|
|
||||||
|
|
||||||
WINE stores detailed information about available fonts in the ~/.wine/.cachedmetrics
|
|
||||||
file. You can copy it elsewhere and add this entry to the [fonts] section
|
|
||||||
in your WINE.CONF:
|
|
||||||
|
|
||||||
FontMetrics = <file with metrics>
|
|
||||||
|
|
||||||
If WINE detects changes in the X font configuration it will rebuild font
|
|
||||||
metrics from scratch and then it will overwrite ~/.wine/.cachedmetrics with
|
|
||||||
the new information. This process can take a while.
|
|
||||||
|
|
||||||
|
|
||||||
Too Small Or Too Large Fonts
|
|
||||||
============================
|
|
||||||
|
|
||||||
Windows programs may ask WINE to render a font with the height specified
|
|
||||||
in points. However, point-to-pixel ratio depends on the real physical size
|
|
||||||
of your display (15", 17", etc...). X tries to provide an estimate of that
|
|
||||||
but it can be quite different from the actual size. You can change this
|
|
||||||
ratio by adding the following entry to the [fonts] section:
|
|
||||||
|
|
||||||
Resolution = <integer value>
|
|
||||||
|
|
||||||
In general, higher numbers give you larger fonts. Try to experiment with
|
|
||||||
values in the 60 - 120 range. 96 is a good starting point.
|
|
||||||
|
|
||||||
|
|
||||||
"FONT_Init: failed to load ..." Messages On Startup
|
|
||||||
===================================================
|
|
||||||
|
|
||||||
The most likely cause is a broken fonts.dir file in one of your font
|
|
||||||
directories. You need to rerun 'mkfontdir' to rebuild this file. Read
|
|
||||||
its manpage for more information. If you can't run mkfontdir on this machine
|
|
||||||
as you are not root, use "xset -fp xxx" to remove the broken font path.
|
|
|
@ -0,0 +1,498 @@
|
||||||
|
<chapter id="fonts">
|
||||||
|
<title>Dealing with Fonts</title>
|
||||||
|
|
||||||
|
<sect1 id="windows-fonts">
|
||||||
|
<title>Fonts</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by ???
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/fonts</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
<note>
|
||||||
|
<para>
|
||||||
|
The <command>fnt2bdf</command> utility is included with
|
||||||
|
Wine. It can be found in the <filename>tools</filename>
|
||||||
|
directory. Links to the other tools mentioned in this
|
||||||
|
document can be found on wine headquarters:
|
||||||
|
<ulink url="http://www.winehq.com/tools.html">http://www.winehq.com/tools.html</ulink>
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>How To Convert Windows Fonts</title>
|
||||||
|
<para>
|
||||||
|
If you have access to a Windows installation you should use
|
||||||
|
<command>fnt2bdf</command> utility (found in the
|
||||||
|
<filename>tools</filename> directory) to convert bitmap
|
||||||
|
fonts (<filename>VGASYS.FON</filename>,
|
||||||
|
<filename>SSERIFE.FON</filename>, and
|
||||||
|
<filename>SERIFE.FON</filename>) into the format that the X
|
||||||
|
Window System can recognize.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>Extract bitmap fonts with <command>fnt2bdf</command>.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Convert <filename>.bdf</filename> files produced by Step
|
||||||
|
1 into <filename>.pcf</filename> files with
|
||||||
|
<command>bdftopcf</command>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Copy <filename>.pcf</filename> files to the font server
|
||||||
|
directory which is usually
|
||||||
|
<filename>/usr/lib/X11/fonts/misc</filename> (you will
|
||||||
|
probably need superuser privileges). If you want to
|
||||||
|
create a new font directory you will need to add it to
|
||||||
|
the font path.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Run <command>mkfontdir</command> for the directory you
|
||||||
|
copied fonts to. If you are already in X you should run
|
||||||
|
<command>xset fp rehash</command> to make X server aware
|
||||||
|
of the new fonts.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Edit the <filename>wine.conf</filename> file to remove
|
||||||
|
aliases for the fonts you've just installed.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
<para>
|
||||||
|
WINE can get by without these fonts but 'the look and feel'
|
||||||
|
may be quite different. Also, some applications try to load
|
||||||
|
their custom fonts on the fly (WinWord 6.0) and since WINE
|
||||||
|
does not implement this yet it instead prints out something
|
||||||
|
like;
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
STUB: AddFontResource( SOMEFILE.FON )
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
You can convert this file too. Note that
|
||||||
|
<filename>.FON</filename> file may not hold any bitmap
|
||||||
|
fonts and <command>fnt2bdf</command> will fail if this is
|
||||||
|
the case. Also note that although the above message will not
|
||||||
|
disappear WINE will work around the problem by using the
|
||||||
|
font you extracted from the
|
||||||
|
<filename>SOMEFILE.FON</filename>.
|
||||||
|
<command>fnt2bdf</command> will only work for Windows 3.1
|
||||||
|
fonts. It will not work for TrueType fonts.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
What to do with TrueType fonts? There are several commercial
|
||||||
|
font tools that can convert them to the Type1 format but the
|
||||||
|
quality of the resulting fonts is far from stellar. The
|
||||||
|
other way to use them is to get a font server capable of
|
||||||
|
rendering TrueType (Caldera has one, there also is the free
|
||||||
|
<command>xfstt</command> in
|
||||||
|
<filename>Linux/X11/fonts</filename> on sunsite and mirrors,
|
||||||
|
if you're on FreeBSD you can use the port in
|
||||||
|
<filename>/usr/ports/x11-servers/Xfstt</filename>. And
|
||||||
|
there is <command>xfsft</command> which uses the freetype
|
||||||
|
library, see <filename>documentation/ttfserver</filename>).
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
However, there is a possibility of the native TrueType
|
||||||
|
support via FreeType renderer in the future (hint, hint :-)
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>How To Add Font Aliases To <filename>wine.conf</filename></title>
|
||||||
|
<para>
|
||||||
|
Many Windows applications assume that fonts included in
|
||||||
|
original Windows 3.1 distribution are always present. By
|
||||||
|
default Wine creates a number of aliases that map them on
|
||||||
|
the existing X fonts:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<informaltable>
|
||||||
|
<tgroup cols="3">
|
||||||
|
<thead>
|
||||||
|
<row>
|
||||||
|
<entry>Windows font</entry>
|
||||||
|
<entry>...is mapped to...</entry>
|
||||||
|
<entry>X font</entry>
|
||||||
|
</row>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<row>
|
||||||
|
<entry>"MS Sans Serif"</entry>
|
||||||
|
<entry align="center">-></entry>
|
||||||
|
<entry>"-adobe-helvetica-"</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>"MS Serif"</entry>
|
||||||
|
<entry align="center">-></entry>
|
||||||
|
<entry>"-bitstream-charter-"</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>"Times New Roman"</entry>
|
||||||
|
<entry align="center">-></entry>
|
||||||
|
<entry>"-adobe-times-"</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>"Arial"</entry>
|
||||||
|
<entry align="center">-></entry>
|
||||||
|
<entry>"-adobe-helvetica-"</entry>
|
||||||
|
</row>
|
||||||
|
</tbody>
|
||||||
|
</tgroup>
|
||||||
|
</informaltable>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
There is no default alias for the "System" font. Also, no
|
||||||
|
aliases are created for the fonts that applications install
|
||||||
|
at runtime. The recommended way to deal with this problem
|
||||||
|
is to convert the missing font (see above). If it proves
|
||||||
|
impossible, like in the case with TrueType fonts, you can
|
||||||
|
force the font mapper to choose a closely related X font by
|
||||||
|
adding an alias to the [fonts] section. Make sure that the
|
||||||
|
X font actually exists (with <command>xfontsel</command>
|
||||||
|
tool).
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
AliasN = [Windows font], [X font] <, optional "mask X font" flag>
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
Example:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
Alias0 = System, --international-, subst
|
||||||
|
Alias1 = ...
|
||||||
|
...
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
Comments:
|
||||||
|
</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
There must be no gaps in the sequence <literal>{0, ...,
|
||||||
|
N}</literal> otherwise all aliases after the first gap
|
||||||
|
won't be read.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Usually font mapper translates X font names into font
|
||||||
|
names visible to Windows programs in the following
|
||||||
|
fashion:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<informaltable>
|
||||||
|
<tgroup cols="3">
|
||||||
|
<thead>
|
||||||
|
<row>
|
||||||
|
<entry>X font</entry>
|
||||||
|
<entry>...will show up as...</entry>
|
||||||
|
<entry>Extracted name</entry>
|
||||||
|
</row>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<row>
|
||||||
|
<entry>--international-...</entry>
|
||||||
|
<entry align="center">-></entry>
|
||||||
|
<entry>"International"</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>-adobe-helvetica-...</entry>
|
||||||
|
<entry align="center">-></entry>
|
||||||
|
<entry>"Helvetica"</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>-adobe-utopia-...</entry>
|
||||||
|
<entry align="center">-></entry>
|
||||||
|
<entry>"Utopia"</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>-misc-fixed-...</entry>
|
||||||
|
<entry align="center">-></entry>
|
||||||
|
<entry>"Fixed"</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>-...</entry>
|
||||||
|
<entry align="center">-></entry>
|
||||||
|
<entry></entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>-sony-fixed-...</entry>
|
||||||
|
<entry align="center">-></entry>
|
||||||
|
<entry>"Sony Fixed"</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry>-...</entry>
|
||||||
|
<entry align="center">-></entry>
|
||||||
|
<entry></entry>
|
||||||
|
</row>
|
||||||
|
</tbody>
|
||||||
|
</tgroup>
|
||||||
|
</informaltable>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Note that since <literal>-misc-fixed-</literal> and
|
||||||
|
<literal>-sony-fixed-</literal> are different fonts Wine
|
||||||
|
modified the second extracted name to make sure Windows
|
||||||
|
programs can distinguish them because only extracted
|
||||||
|
names appear in the font selection dialogs.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
"Masking" alias replaces the original extracted name so
|
||||||
|
that in the example case we will have the following
|
||||||
|
mapping:
|
||||||
|
</para>
|
||||||
|
<informaltable>
|
||||||
|
<tgroup cols="3">
|
||||||
|
<thead>
|
||||||
|
<row>
|
||||||
|
<entry>X font</entry>
|
||||||
|
<entry>...is masked to...</entry>
|
||||||
|
<entry>Extracted name</entry>
|
||||||
|
</row>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<row>
|
||||||
|
<entry>--international-...</entry>
|
||||||
|
<entry align="center">-></entry>
|
||||||
|
<entry>"System"</entry>
|
||||||
|
</row>
|
||||||
|
</tbody>
|
||||||
|
</tgroup>
|
||||||
|
</informaltable>
|
||||||
|
<para>
|
||||||
|
"Nonmasking" aliases are transparent to the user and
|
||||||
|
they do not replace extracted names.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Wine discards an alias when it sees that the native X
|
||||||
|
font is available.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
If you do not have access to Windows fonts mentioned in
|
||||||
|
the first paragraph you should try to substitute the
|
||||||
|
"System" font with nonmasking alias. The
|
||||||
|
<command>xfontsel</command> application will show you
|
||||||
|
the fonts available to X.
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
Alias.. = System, ...bold font without serifs
|
||||||
|
</screen>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
<para>
|
||||||
|
Also, some Windows applications request fonts without
|
||||||
|
specifying the typeface name of the font. Font table starts
|
||||||
|
with Arial in most Windows installations, however X font
|
||||||
|
table starts with whatever is the first line in the
|
||||||
|
<filename>fonts.dir</filename>. Therefore WINE uses the
|
||||||
|
following entry to determine which font to check first.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Example:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
Default = -adobe-times-
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
Comments:
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
It is better to have a scalable font family (bolds and
|
||||||
|
italics included) as the default choice because mapper
|
||||||
|
checks all available fonts until requested height and other
|
||||||
|
attributes match perfectly or the end of the font table is
|
||||||
|
reached. Typical X installations have scalable fonts in the
|
||||||
|
<filename>../fonts/Type1</filename> and
|
||||||
|
<filename>../fonts/Speedo</filename> directories.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>How To Manage Cached Font Metrics</title>
|
||||||
|
<para>
|
||||||
|
WINE stores detailed information about available fonts in
|
||||||
|
the <filename>~/.wine/.cachedmetrics</filename> file. You
|
||||||
|
can copy it elsewhere and add this entry to the [fonts]
|
||||||
|
section in your <filename>wine.conf</filename>:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
FontMetrics = <file with metrics>
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
If WINE detects changes in the X font configuration it will
|
||||||
|
rebuild font metrics from scratch and then it will overwrite
|
||||||
|
<filename>~/.wine/.cachedmetrics</filename> with the new
|
||||||
|
information. This process can take a while.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Too Small Or Too Large Fonts</title>
|
||||||
|
<para>
|
||||||
|
Windows programs may ask WINE to render a font with the
|
||||||
|
height specified in points. However, point-to-pixel ratio
|
||||||
|
depends on the real physical size of your display (15",
|
||||||
|
17", etc...). X tries to provide an estimate of that but it
|
||||||
|
can be quite different from the actual size. You can change
|
||||||
|
this ratio by adding the following entry to the [fonts]
|
||||||
|
section:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
Resolution = <integer value>
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
In general, higher numbers give you larger fonts. Try to
|
||||||
|
experiment with values in the 60 - 120 range. 96 is a good
|
||||||
|
starting point.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>"FONT_Init: failed to load ..." Messages On Startup</title>
|
||||||
|
<para>
|
||||||
|
The most likely cause is a broken
|
||||||
|
<filename>fonts.dir</filename> file in one of your font
|
||||||
|
directories. You need to rerun <command>mkfontdir</command>
|
||||||
|
to rebuild this file. Read its manpage for more information.
|
||||||
|
If you can't run <command>mkfontdir</command> on this
|
||||||
|
machine as you are not root, use <command>xset -fp
|
||||||
|
xxx</command> to remove the broken font path.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="ttfont-server">
|
||||||
|
<title>Setting up a TrueType Font Server</title>
|
||||||
|
<para>
|
||||||
|
written by ???
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/ttfserver</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Follow these instructions to set up a TrueType font server on your system.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>Get <filename>freetype-1.0.full.tar.gz</filename></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Read docs, unpack, configure and install</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Test the library, e.g. <command>ftview 20 /dosc/win95/fonts/times</command></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Get <filename>xfsft-beta1e.linux-i586</filename></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Install it and start it when booting, e.g. in an
|
||||||
|
rc-script. The manpage for <command>xfs</command>
|
||||||
|
applies.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Follow the hints given by <email>williamc@dai.ed.ac.uk</email></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
I got <command>xfsft</command> from
|
||||||
|
<ulink url="http://www.dcs.ed.ac.uk/home/jec/progindex.html">http://www.dcs.ed.ac.uk/home/jec/progindex.html</ulink>.
|
||||||
|
I have it running all the time. Here is
|
||||||
|
<filename>/usr/X11R6/lib/X11/fs/config</filename>:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
clone-self = on
|
||||||
|
use-syslog = off
|
||||||
|
catalogue = /c/windows/fonts
|
||||||
|
error-file = /usr/X11R6/lib/X11/fs/fs-errors
|
||||||
|
default-point-size = 120
|
||||||
|
default-resolutions = 75,75,100,100
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
Obviously <filename>/c/windows/fonts</filename> is where
|
||||||
|
my Windows fonts on my Win95 <medialabel>C:</medialabel>
|
||||||
|
drive live; could be e.g.
|
||||||
|
<filename>/mnt/dosC/windows/system</filename> for Win31.
|
||||||
|
In <filename>/c/windows/fonts/fonts.scale</filename> I
|
||||||
|
have
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
14
|
||||||
|
arial.ttf -monotype-arial-medium-r-normal--0-0-0-0-p-0-iso8859-1
|
||||||
|
arialbd.ttf -monotype-arial-bold-r-normal--0-0-0-0-p-0-iso8859-1
|
||||||
|
arialbi.ttf -monotype-arial-bold-o-normal--0-0-0-0-p-0-iso8859-1
|
||||||
|
ariali.ttf -monotype-arial-medium-o-normal--0-0-0-0-p-0-iso8859-1
|
||||||
|
cour.ttf -monotype-courier-medium-r-normal--0-0-0-0-p-0-iso8859-1
|
||||||
|
courbd.ttf -monotype-courier-bold-r-normal--0-0-0-0-p-0-iso8859-1
|
||||||
|
courbi.ttf -monotype-courier-bold-o-normal--0-0-0-0-p-0-iso8859-1
|
||||||
|
couri.ttf -monotype-courier-medium-o-normal--0-0-0-0-p-0-iso8859-1
|
||||||
|
times.ttf -monotype-times-medium-r-normal--0-0-0-0-p-0-iso8859-1
|
||||||
|
timesbd.ttf -monotype-times-bold-r-normal--0-0-0-0-p-0-iso8859-1
|
||||||
|
timesbi.ttf -monotype-times-bold-i-normal--0-0-0-0-p-0-iso8859-1
|
||||||
|
timesi.ttf -monotype-times-medium-i-normal--0-0-0-0-p-0-iso8859-1
|
||||||
|
symbol.ttf -monotype-symbol-medium-r-normal--0-0-0-0-p-0-microsoft-symbol
|
||||||
|
wingding.ttf -microsoft-wingdings-medium-r-normal--0-0-0-0-p-0-microsoft-symbol
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
In <filename>/c/windows/fonts/fonts.dir</filename> I have
|
||||||
|
exactly the same.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
In <filename>/usr/X11R6/lib/X11/XF86Config</filename> I have
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
FontPath "tcp/localhost:7100"
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
in front of the other <literal>FontPath</literal> lines.
|
||||||
|
That's it! As an interesting by-product of course, all
|
||||||
|
those web pages which specify Arial come up in Arial in
|
||||||
|
Netscape ...
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Shut down X and restart (and debug errors you did while
|
||||||
|
setting up everything).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Test with e.g <command>xlsfont | grep arial</command></para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Hope this helps...
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -1,135 +0,0 @@
|
||||||
What is this?
|
|
||||||
------------
|
|
||||||
|
|
||||||
This note is a short description of
|
|
||||||
|
|
||||||
* How to port Wine to your favourite operating system
|
|
||||||
* Why you probably shouldn't use "#ifdef MyOS"
|
|
||||||
* What to do instead.
|
|
||||||
|
|
||||||
This document does not say a thing about how to port Wine to non-386
|
|
||||||
operating systems, though. You would need a CPU emulator. Let's get
|
|
||||||
Wine into a better shape on 386 first, OK?
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Why "#ifdef MyOS" is probably a mistake.
|
|
||||||
---------------------------------------
|
|
||||||
|
|
||||||
Operating systems change. Maybe yours doesn't have the "foo.h"
|
|
||||||
header, but maybe a future version will have it. If you want
|
|
||||||
to "#include <foo.h>", it doesn't matter what operating system
|
|
||||||
you are using; it only matters whether "foo.h" is there.
|
|
||||||
|
|
||||||
Furthermore, operating systems change names or "fork" into
|
|
||||||
several ones. An "#ifdef MyOs" will break over time.
|
|
||||||
|
|
||||||
If you use the feature of Autoconf, the Gnu auto-configuration
|
|
||||||
utility wisely, you will help future porters automatically
|
|
||||||
because your changes will test for _features_, not names of
|
|
||||||
operating systems. A feature can be many things:
|
|
||||||
|
|
||||||
* existance of a header file
|
|
||||||
* existance of a library function
|
|
||||||
* existance of libraries
|
|
||||||
* bugs in header files, library functions, the compiler, ...
|
|
||||||
* (you name it)
|
|
||||||
|
|
||||||
You will need Gnu Autoconf, which you can get from your
|
|
||||||
friendly Gnu mirror. This program takes Wine's "configure.in"
|
|
||||||
file and produces a "configure" shell script that users use to
|
|
||||||
configure Wine to their system.
|
|
||||||
|
|
||||||
There _are_ exceptions to the "avoid #ifdef MyOS" rule. Wine,
|
|
||||||
for example, needs the internals of the signal stack -- that
|
|
||||||
cannot easily be described in terms of features.
|
|
||||||
|
|
||||||
Let's now turn to specific porting problems and how to solve
|
|
||||||
them.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
MyOS doesn't have the `foo.h' header!
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
This first step is to make Autoconf check for this header.
|
|
||||||
In configure.in you add a segment like this in the section
|
|
||||||
that checks for header files (search for "header files"):
|
|
||||||
|
|
||||||
AC_CHECK_HEADER(foo.h, AC_DEFINE(HAVE_FOO_H))
|
|
||||||
|
|
||||||
If your operating system supports a header file with the
|
|
||||||
same contents but a different name, say bar.h, add a check
|
|
||||||
for that also.
|
|
||||||
|
|
||||||
Now you can change
|
|
||||||
|
|
||||||
#include <foo.h>
|
|
||||||
|
|
||||||
to
|
|
||||||
|
|
||||||
#ifdef HAVE_FOO_H
|
|
||||||
#include <foo.h>
|
|
||||||
#elif defined (HAVE_BAR_H)
|
|
||||||
#include <bar.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
If your system doesn't have a corresponding header file even
|
|
||||||
though it has the library functions being used, you might
|
|
||||||
have to add an "#else" section to the conditional. Avoid
|
|
||||||
this if you can.
|
|
||||||
|
|
||||||
You will also need to add "#undef HAVE_FOO_H" (etc.) to
|
|
||||||
include/config.h.in
|
|
||||||
|
|
||||||
Finish up with "make configure" and "./configure".
|
|
||||||
|
|
||||||
|
|
||||||
MyOS doesn't have the `bar' function!
|
|
||||||
------------------------------------
|
|
||||||
|
|
||||||
A typical example of this is the `memmove'. To solve this
|
|
||||||
problem you would add `memmove' to the list of functions
|
|
||||||
that Autoconf checks for. In configure.in you search for
|
|
||||||
AC_CHECK_FUNCS and add `memmove'. (You will notice that
|
|
||||||
someone already did this for this particular function.)
|
|
||||||
|
|
||||||
Secondly, you will also need to add "#undef HAVE_BAR"
|
|
||||||
to include/config.h.in
|
|
||||||
|
|
||||||
The next step depends on the nature of the missing function.
|
|
||||||
|
|
||||||
Case 1: It's easy to write a complete implementation of the
|
|
||||||
function. (`memmove' belongs to this case.)
|
|
||||||
|
|
||||||
You add your implementation in misc/port.c surrounded by
|
|
||||||
"#ifndef HAVE_MEMMOVE" and "#endif".
|
|
||||||
|
|
||||||
You might have to add a prototype for your function. If so,
|
|
||||||
include/miscemu.h might be the place. Don't forget to protect
|
|
||||||
that definition by "#ifndef HAVE_MEMMOVE" and "#endif" also!
|
|
||||||
|
|
||||||
Case 2: A general implementation is hard, but Wine is only using
|
|
||||||
a special case.
|
|
||||||
|
|
||||||
An example is the various "wait" calls used in SIGNAL_child
|
|
||||||
from loader/signal.c. Here we have a multi-branch case on
|
|
||||||
features:
|
|
||||||
|
|
||||||
#ifdef HAVE_THIS
|
|
||||||
...
|
|
||||||
#elif defined (HAVE_THAT)
|
|
||||||
...
|
|
||||||
#elif defined (HAVE_SOMETHING_ELSE)
|
|
||||||
...
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Note that this is very different from testing on operating
|
|
||||||
systems. If a new version of your operating systems comes
|
|
||||||
out and adds a new function, this code will magically start
|
|
||||||
using it.
|
|
||||||
|
|
||||||
Finish up with "make configure" and "./configure".
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,202 @@
|
||||||
|
<chapter id="i18n">
|
||||||
|
<title>Internationalization</title>
|
||||||
|
|
||||||
|
<sect1 id="adding-languages">
|
||||||
|
<title>Adding New Languages</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by Morten Welinder, January 1996.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>Thereafter revised Februari 1999 by Klaas van Gend</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Revised again May 23, 1999, Klaas van Gend</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Updated May 26, 2000, Zoran Dzelajlija</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/languages</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This file documents the necessary procedure for adding a new
|
||||||
|
language to the list of languages that Wine can display system
|
||||||
|
menus and forms in. Currently at least the following languages
|
||||||
|
are still missing:
|
||||||
|
<simplelist columns="5" type="horiz">
|
||||||
|
<member>Bulgarian</member>
|
||||||
|
<member>Chinese</member>
|
||||||
|
<member>Greek</member>
|
||||||
|
<member>Icelandic</member>
|
||||||
|
<member>Japanese</member>
|
||||||
|
<member>Romanian</member>
|
||||||
|
<member>Croatian</member>
|
||||||
|
<member>Slovak</member>
|
||||||
|
<member>Turkish</member>
|
||||||
|
<member>Slovanian</member>
|
||||||
|
</simplelist>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<para>
|
||||||
|
<emphasis>I hope I got all the places where changes are
|
||||||
|
needed. If you see any place missing from the list,
|
||||||
|
submit a patch to this file please. Also note that
|
||||||
|
re-organization of the source code might change the list of
|
||||||
|
places.</emphasis>
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
To add a new language you need to be able to translate the
|
||||||
|
relatively few texts, of course. You will need very little
|
||||||
|
knowledge of programming, so you have almost no excuses for
|
||||||
|
not adding your language, right? We should easily be able to
|
||||||
|
support 20 languages within a few months, get going! Apart
|
||||||
|
from re-compilation it'll take you about an hour or two.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
To add a new language to the list of languages that Wine can
|
||||||
|
handle you must...
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>Find the language ID in
|
||||||
|
<filename>include/winnls.h</filename>.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Look in <filename>ole/ole2nls.c</filename> if your
|
||||||
|
language is already incorporated in the <varname>static
|
||||||
|
const struct NLS_langlocale</varname>. If not: find the
|
||||||
|
appropriate entries in
|
||||||
|
<filename>include/winnls.h</filename> and add them to the
|
||||||
|
list.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Edit the parameters defined in
|
||||||
|
<filename>ole/nls/*.nls</filename> to fit your local
|
||||||
|
habits and language.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Edit <filename>documentation/wine.man.in</filename>
|
||||||
|
(search for <parameter>-language</parameter>) to show the
|
||||||
|
new language abbreviation.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Edit <filename>misc/main.c</filename> variable
|
||||||
|
<varname>Languages</varname> to contain the new language
|
||||||
|
abbreviation and language ID. Also edit
|
||||||
|
<structname>struct option_table</structname> in
|
||||||
|
<filename>misc/options.c</filename> to show the new
|
||||||
|
abbreviation.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Edit <filename>include/options.h</filename>
|
||||||
|
<type>enum</type> <varname>WINE_LANGUAGE</varname> to have
|
||||||
|
a member called <literal>LANG_XX</literal> where
|
||||||
|
<literal>XX</literal> is the new abbreviation.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Create a new file
|
||||||
|
<filename>dlls/commdlg/cdlg_XX.rc</filename> (where
|
||||||
|
<literal>XX</literal> is your language abbreviation)
|
||||||
|
containing all menus. Your best bet is to copy
|
||||||
|
<filename>cdlg_En.rc</filename> and start translating.
|
||||||
|
There is no real need to know how the internal structure
|
||||||
|
of the file, as you only need to translate the text within
|
||||||
|
quotes.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
In menus, the character "&" means that the next
|
||||||
|
character will be highlighted and that pressing that
|
||||||
|
letter will select the item. You should place these
|
||||||
|
"&" characters suitably for your language, not just
|
||||||
|
copy the positions from (say) English. In particular,
|
||||||
|
items within one menu should have different highlighted
|
||||||
|
letters.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Edit <filename>dlls/commdlg/rsrc.rc</filename> to contain
|
||||||
|
an <symbol>#include</symbol> statement for your
|
||||||
|
<filename>cdlg_XX.rc</filename> file.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Repeat steps 6 and 7 again for:
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<filename>dlls/shell32/shell32_XX.rc</filename> and
|
||||||
|
<filename>shres.rc</filename>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<filename>resources/sysres_XX.rc</filename> and
|
||||||
|
<filename>user32.rc</filename>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Re-configure, re-make dependencies, and re-make Wine.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Check your new menus and forms; when they're not ok, go
|
||||||
|
back to 6) and adapt the sizes, etc.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Several of the winelib based programs in the subdirectory
|
||||||
|
programs also have internationalisation support. See the
|
||||||
|
appropriate files there for reference.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Edit
|
||||||
|
<filename>documentation/internationalisation</filename> to
|
||||||
|
show the new status.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Submit patches for inclusion in the next Wine release, see
|
||||||
|
file <filename>./ANNOUNCE</filename> for details about
|
||||||
|
where to submit.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -0,0 +1,535 @@
|
||||||
|
<chapter id="implementation">
|
||||||
|
<title>Low-level Implementation</title>
|
||||||
|
<para>Details of Wine's Low-level Implementation...</para>
|
||||||
|
|
||||||
|
<sect1 id="builtin-dlls">
|
||||||
|
<title>Builtin DLLs</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by <juergen.schmied@metronet.de>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/internal-dll</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This document describes some points you should know before
|
||||||
|
implementing the internal counterparts to external DLL's.
|
||||||
|
Only 32 bit DLL's are considered.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>1. The LibMain function</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This is the way to do some initializing when a process or
|
||||||
|
thread is attached to the dll. The function name is taken
|
||||||
|
from a <filename>*.spec</filename> file line:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
init YourFunctionName
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
Then, you have to implement the function:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
BOOL32 WINAPI YourLibMain(HINSTANCE32 hinstDLL,
|
||||||
|
DWORD fdwReason, LPVOID lpvReserved)
|
||||||
|
{ if (fdwReason==DLL_PROCESS_ATTACH)
|
||||||
|
{ ...
|
||||||
|
}
|
||||||
|
....
|
||||||
|
}
|
||||||
|
</programlisting>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>2. Using functions from other built-in DLL's</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The problem here is, that you can't know if you have to call
|
||||||
|
the function from the internal or the external DLL. If you
|
||||||
|
just call the function you will get the internal
|
||||||
|
implementation. If the external DLL is loaded the executed
|
||||||
|
program will use the external DLL and you the internal one.
|
||||||
|
When you -as an example- fill an iconlist placed in the
|
||||||
|
internal DLL the application won't get the icons from the
|
||||||
|
external DLL.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
To work around this, you should always use a pointer to call
|
||||||
|
such functions:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
/* definition of the pointer type*/
|
||||||
|
void (CALLBACK* pDLLInitComctl)();
|
||||||
|
|
||||||
|
/* getting the function address this should be done in the
|
||||||
|
LibMain function when called with DLL_PROCESS_ATTACH*/
|
||||||
|
|
||||||
|
BOOL32 WINAPI Shell32LibMain(HINSTANCE32 hinstDLL, DWORD fdwReason,
|
||||||
|
LPVOID lpvReserved)
|
||||||
|
{ HINSTANCE32 hComctl32;
|
||||||
|
if (fdwReason==DLL_PROCESS_ATTACH)
|
||||||
|
{ /* load the external / internal DLL*/
|
||||||
|
hComctl32 = LoadLibrary32A("COMCTL32.DLL");
|
||||||
|
if (hComctl32)
|
||||||
|
{ /* get the function pointer */
|
||||||
|
pDLLInitComctl=GetProcAddress32(hComctl32,"InitCommonControlsEx");
|
||||||
|
|
||||||
|
/* check it */
|
||||||
|
if (pDLLInitComctl)
|
||||||
|
{ /* use it */
|
||||||
|
pDLLInitComctl();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* free the DLL / decrease the ref count */
|
||||||
|
FreeLibrary32(hComctl32);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ /* do some panic*/
|
||||||
|
ERR(shell,"P A N I C error getting functionpointers\n");
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
....
|
||||||
|
</programlisting>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>3. Getting resources from a <filename>*.rc</filename> file linked to the DLL</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
< If you know how, write some lines>
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="accel-impl">
|
||||||
|
<title>Accelerators</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Findings researched by Uwe Bonnes, Ulrich Weigand and Marcus Meissner.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/accelerators</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Some notes concerning accelerators.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
There are <emphasis>three</emphasis> differently sized
|
||||||
|
accelerator structures exposed to the user. The general layout
|
||||||
|
is:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
BYTE fVirt;
|
||||||
|
WORD key;
|
||||||
|
WORD cmd;
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
We now have three different appearances:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Accelerators in NE resources. These have a size of 5 byte
|
||||||
|
and do not have any padding. This is also the internal
|
||||||
|
layout of the global handle <type>HACCEL</type> (16 and
|
||||||
|
32) in Windows 95 and WINE. Exposed to the user as Win16
|
||||||
|
global handles <type>HACCEL16</type> and
|
||||||
|
<type>HACCEL32</type> by the Win16/Win32 API.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Accelerators in PE resources. These have a size of 8 byte.
|
||||||
|
Layout is:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
BYTE fVirt;
|
||||||
|
BYTE pad0;
|
||||||
|
WORD key;
|
||||||
|
WORD cmd;
|
||||||
|
WORD pad1;
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
They are exposed to the user only by direct accessing PE
|
||||||
|
resources.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Accelerators in the Win32 API. These have a size of 6
|
||||||
|
bytes. Layout is:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
BYTE fVirt;
|
||||||
|
BYTE pad0;
|
||||||
|
WORD key;
|
||||||
|
WORD cmd;
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
These are exposed to the user by the
|
||||||
|
<function>CopyAcceleratorTable</function> and
|
||||||
|
<function>CreateAcceleratorTable</function> functions in
|
||||||
|
the Win32 API.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Why two types of accelerators in the Win32 API? We can only
|
||||||
|
guess, but my best bet is that the Win32 resource compiler
|
||||||
|
can/does not handle struct packing. Win32 <type>ACCEL</type>
|
||||||
|
is defined using <function>#pragma(2)</function> for the
|
||||||
|
compiler but without any packing for RC, so it will assume
|
||||||
|
<function>#pragma(4)</function>.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="file-handles">
|
||||||
|
<title>File Handles</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by (???)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/filehandles</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
DOS treats the first 5 file handles as special cases. They
|
||||||
|
map directly to <filename>stdin</filename>,
|
||||||
|
<filename>stdout</filename>, <filename>stderr</filename>,
|
||||||
|
<filename>stdaux</filename> and <filename>stdprn</filename>.
|
||||||
|
Windows 16 inherits this behavior, and in fact, win16 handles
|
||||||
|
are interchangable with DOS handles. Some nasty windows
|
||||||
|
programs even do this!
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Windows32 issues file handles starting from
|
||||||
|
<literal>1</literal>, on the grounds that most GUI processes
|
||||||
|
don't need a <filename>stdin</filename>,
|
||||||
|
<filename>stdout</filename>, etc.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The Wine handle code is implemented in the Win32 style, and
|
||||||
|
the Win16 functions use two macros to convert to and from the
|
||||||
|
two types.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The macros are defined in <filename>file.h</filename> as follows:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
#define HFILE16_TO_HFILE32(handle) \
|
||||||
|
(((handle)==0) ? GetStdHandle(STD_INPUT_HANDLE) : \
|
||||||
|
((handle)==1) ? GetStdHandle(STD_OUTPUT_HANDLE) : \
|
||||||
|
((handle)==2) ? GetStdHandle(STD_ERROR_HANDLE) : \
|
||||||
|
((handle)>0x400) ? handle : \
|
||||||
|
(handle)-5)
|
||||||
|
|
||||||
|
#define HFILE32_TO_HFILE16(handle) ({ HFILE32 hnd=handle; \
|
||||||
|
((hnd==HFILE_ERROR32) ? HFILE_ERROR16 : \
|
||||||
|
((handle>0x400) ? handle : \
|
||||||
|
(HFILE16)hnd+5); })
|
||||||
|
</programlisting>
|
||||||
|
|
||||||
|
<warning>
|
||||||
|
<para>
|
||||||
|
Be careful not to use the macro
|
||||||
|
<function>HFILE16_TO_HFILE32</function> on functions with
|
||||||
|
side-effects, as it will cause them to be evaluated several
|
||||||
|
times. This could be considered a bug, but the use of this
|
||||||
|
macro is limited enough not to need a rewrite.
|
||||||
|
</para>
|
||||||
|
</warning>
|
||||||
|
<note>
|
||||||
|
<para>
|
||||||
|
The <literal>0x400</literal> special case above deals with
|
||||||
|
LZW filehandles (see <filename>misc/lzexpand.c</filename>).
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="hardware-trace">
|
||||||
|
<title>Doing A Hardware Trace In Wine</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by Jonathan Buzzard <jab@hex.prestel.co.uk>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/ioport-trace-hints</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The primary reason to do this is to reverse engineer a
|
||||||
|
hardware device for which you don't have documentation, but
|
||||||
|
can get to work under Wine.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
This lot is aimed at parallel port devices, and in particular
|
||||||
|
parallel port scanners which are now so cheap they are
|
||||||
|
virtually being given away. The problem is that few
|
||||||
|
manufactures will release any programming information which
|
||||||
|
prevents drivers being written for Sane, and the traditional
|
||||||
|
technique of using DOSemu to produce the traces does not work
|
||||||
|
as the scanners invariably only have drivers for Windows.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Please note that I have not been able to get my scanner
|
||||||
|
working properly (a UMAX Astra 600P), but a couple of people
|
||||||
|
have reported success with at least the Artec AS6e scanner. I
|
||||||
|
am not in the process of developing any driver nor do I intend
|
||||||
|
to, so don't bug me about it. My time is now spent writing
|
||||||
|
programs to set things like battery save options under Linux
|
||||||
|
on Toshiba laptops, and as such I don't have any spare time
|
||||||
|
for writing a driver for a parallel port scanner etc.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Presuming that you have compiled and installed wine the first
|
||||||
|
thing to do is is to enable direct hardware access to your
|
||||||
|
parallel port. To do this edit <filename>wine.conf</filename>
|
||||||
|
(usually in <filename>/usr/local/etc</filename>) and in the
|
||||||
|
ports section add the following two lines
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
read=0x378,0x379,0x37a,0x37c,0x77a
|
||||||
|
write=0x378,x379,0x37a,0x37c,0x77a
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
This adds the necessary access required for SPP/PS2/EPP/ECP
|
||||||
|
parallel port on LPT1. You will need to adjust these number
|
||||||
|
accordingly if your parallel port is on LPT2 or LPT0.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
When starting wine use the following command line, where
|
||||||
|
<literal>XXXX</literal> is the program you need to run in
|
||||||
|
order to access your scanner, and <literal>YYYY</literal> is
|
||||||
|
the file your trace will be stored in:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
wine -debugmsg +io XXXX 2> >(sed 's/^[^:]*:io:[^ ]* //' > YYYY)
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
You will need large amounts of hard disk space (read hundreds
|
||||||
|
of megabytes if you do a full page scan), and for reasonable
|
||||||
|
performance a really fast processor and lots of RAM.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You might well find the log compression program that <email>David
|
||||||
|
Campbell campbell@torque.net</email> wrote helpful in
|
||||||
|
reducing the size of the log files. This can be obtained by
|
||||||
|
the following command:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
sh ioport-trace-hints
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
This should extract <filename>shrink.c</filename> (which is
|
||||||
|
located at the end of this file. Compile the log compression
|
||||||
|
program by:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
cc shrink.c -o shrink
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
Use the <command>shrink</command> program to reduce the
|
||||||
|
physical size of the raw log as follows:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
cat log | shrink > log2
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
The trace has the basic form of
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
XXXX > YY @ ZZZZ:ZZZZ
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
where <literal>XXXX</literal> is the port in hexidecimal being
|
||||||
|
accessed, <literal>YY</literal> is the data written (or read)
|
||||||
|
from the port, and <literal>ZZZZ:ZZZZ</literal> is the address
|
||||||
|
in memory of the instruction that accessed the port. The
|
||||||
|
direction of the arrow indicates whether the data was written
|
||||||
|
or read from the port.
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
> data was written to the port
|
||||||
|
< data was read from the port
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
My basic tip for interperating these logs is to pay close
|
||||||
|
attention to the addresses of the IO instructions. Their
|
||||||
|
grouping and sometimes proximity should reveal the presence of
|
||||||
|
subroutines in the driver. By studying the different versions
|
||||||
|
you should be able to work them out. For example consider the
|
||||||
|
following section of trace from my UMAX Astra 600P
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
0x378 > 55 @ 0297:01ec
|
||||||
|
0x37a > 05 @ 0297:01f5
|
||||||
|
0x379 < 8f @ 0297:01fa
|
||||||
|
0x37a > 04 @ 0297:0211
|
||||||
|
0x378 > aa @ 0297:01ec
|
||||||
|
0x37a > 05 @ 0297:01f5
|
||||||
|
0x379 < 8f @ 0297:01fa
|
||||||
|
0x37a > 04 @ 0297:0211
|
||||||
|
0x378 > 00 @ 0297:01ec
|
||||||
|
0x37a > 05 @ 0297:01f5
|
||||||
|
0x379 < 8f @ 0297:01fa
|
||||||
|
0x37a > 04 @ 0297:0211
|
||||||
|
0x378 > 00 @ 0297:01ec
|
||||||
|
0x37a > 05 @ 0297:01f5
|
||||||
|
0x379 < 8f @ 0297:01fa
|
||||||
|
0x37a > 04 @ 0297:0211
|
||||||
|
0x378 > 00 @ 0297:01ec
|
||||||
|
0x37a > 05 @ 0297:01f5
|
||||||
|
0x379 < 8f @ 0297:01fa
|
||||||
|
0x37a > 04 @ 0297:0211
|
||||||
|
0x378 > 00 @ 0297:01ec
|
||||||
|
0x37a > 05 @ 0297:01f5
|
||||||
|
0x379 < 8f @ 0297:01fa
|
||||||
|
0x37a > 04 @ 0297:0211
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
As you can see their is a repeating structure starting at
|
||||||
|
address <literal>0297:01ec</literal> that consists of four io
|
||||||
|
accesses on the parallel port. Looking at it the first io
|
||||||
|
access writes a changing byte to the data port the second
|
||||||
|
always writes the byte <literal>0x05</literal> to the control
|
||||||
|
port, then a value which always seems to
|
||||||
|
<literal>0x8f</literal> is read from the status port at which
|
||||||
|
point a byte <literal>0x04</literal> is written to the control
|
||||||
|
port. By studying this and other sections of the trace we can
|
||||||
|
write a C routine that emulates this, shown below with some
|
||||||
|
macros to make reading/writing on the parallel port easier to
|
||||||
|
read.
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
#define r_dtr(x) inb(x)
|
||||||
|
#define r_str(x) inb(x+1)
|
||||||
|
#define r_ctr(x) inb(x+2)
|
||||||
|
#define w_dtr(x,y) outb(y, x)
|
||||||
|
#define w_str(x,y) outb(y, x+1)
|
||||||
|
#define w_ctr(x,y) outb(y, x+2)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Seems to be sending a command byte to the scanner
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int udpp_put(int udpp_base, unsigned char command)
|
||||||
|
{
|
||||||
|
int loop,value;
|
||||||
|
|
||||||
|
w_dtr(udpp_base, command);
|
||||||
|
w_ctr(udpp_base, 0x05);
|
||||||
|
|
||||||
|
for (loop=0;loop<10;loop++)
|
||||||
|
if (((value=r_str(udpp_base)) & 0x80)!=0x00) {
|
||||||
|
w_ctr(udpp_base, 0x04);
|
||||||
|
return value & 0xf8;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (value & 0xf8) | 0x01;
|
||||||
|
}
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
For the UMAX Astra 600P only seven such routines exist (well
|
||||||
|
14 really, seven for SPP and seven for EPP). Whether you
|
||||||
|
choose to disassemble the driver at this point to verify the
|
||||||
|
routines is your own choice. If you do, the address from the
|
||||||
|
trace should help in locating them in the disassembly.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You will probably then find it useful to write a script/perl/C
|
||||||
|
program to analyse the logfile and decode them futher as this
|
||||||
|
can reveal higher level grouping of the low level routines.
|
||||||
|
For example from the logs from my UMAX Astra 600P when decoded
|
||||||
|
futher reveal (this is a small snippet)
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
start:
|
||||||
|
put: 55 8f
|
||||||
|
put: aa 8f
|
||||||
|
put: 00 8f
|
||||||
|
put: 00 8f
|
||||||
|
put: 00 8f
|
||||||
|
put: c2 8f
|
||||||
|
wait: ff
|
||||||
|
get: af,87
|
||||||
|
wait: ff
|
||||||
|
get: af,87
|
||||||
|
end: cc
|
||||||
|
start:
|
||||||
|
put: 55 8f
|
||||||
|
put: aa 8f
|
||||||
|
put: 00 8f
|
||||||
|
put: 03 8f
|
||||||
|
put: 05 8f
|
||||||
|
put: 84 8f
|
||||||
|
wait: ff
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
From this it is easy to see that <varname>put</varname>
|
||||||
|
routine is often grouped together in five successive calls
|
||||||
|
sending information to the scanner. Once these are understood
|
||||||
|
it should be possible to process the logs further to show the
|
||||||
|
higher level routines in an easy to see format. Once the
|
||||||
|
highest level format that you can derive from this process is
|
||||||
|
understood, you then need to produce a series of scans varying
|
||||||
|
only one parameter between them, so you can discover how to
|
||||||
|
set the various parameters for the scanner.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The following is the <filename>shrink.c</filename> program.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<programlisting>
|
||||||
|
cat > shrink.c <<EOF
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
main (void)
|
||||||
|
{
|
||||||
|
char buff[256], lastline[256];
|
||||||
|
int count;
|
||||||
|
|
||||||
|
count = 0;
|
||||||
|
lastline[0] = 0;
|
||||||
|
|
||||||
|
while (!feof (stdin))
|
||||||
|
{
|
||||||
|
fgets (buff, sizeof (buff), stdin);
|
||||||
|
if (strcmp (buff, lastline) == 0)
|
||||||
|
{
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (count > 1)
|
||||||
|
fprintf (stdout, "# Last line repeated %i times #\n", count);
|
||||||
|
fprintf (stdout, "%s", buff);
|
||||||
|
strcpy (lastline, buff);
|
||||||
|
count = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
</programlisting>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -0,0 +1,751 @@
|
||||||
|
<chapter id="installing">
|
||||||
|
<title>Installing Wine</title>
|
||||||
|
<para>How to install Wine...</para>
|
||||||
|
|
||||||
|
<sect1 id="replace-windows">
|
||||||
|
<title>WWN #52 Feature: Replacing Windows</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Written by Ove Kåven <email>ovek@winehq.com</email>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Installation Overview</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
A Windows installation consists of many different parts.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Registry. Many keys are supposed to exist and contain
|
||||||
|
meaningful data, even in a newly-installed Windows.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Directory structure. Applications expect to find and/or
|
||||||
|
install things in specific predetermined locations. Most
|
||||||
|
of these directories are expected to exist. But unlike
|
||||||
|
Unix directory structures, most of these locations are
|
||||||
|
not hardcoded, and can be queried via the Windows API
|
||||||
|
and the registry. This places additional requirements on
|
||||||
|
a Wine installation.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
System DLLs. In Windows, these usually reside in the
|
||||||
|
<filename>system</filename> (or
|
||||||
|
<filename>system32</filename>) directories. Some Windows
|
||||||
|
applications check for their existence in these
|
||||||
|
directories before attempting to load them. While Wine
|
||||||
|
is able to load its own internal DLLs
|
||||||
|
(<filename>.so</filename> files) when the application
|
||||||
|
asks for a DLL, Wine does not simulate the existence of
|
||||||
|
nonexisting files.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
While the users are of course free to set up everything
|
||||||
|
themselves, the Wine team will make the automated Wine
|
||||||
|
installation script, <filename>tools/wineinstall</filename>,
|
||||||
|
do everything we find necessary to do; running the
|
||||||
|
conventional <command>configure && make depend && make && make
|
||||||
|
install</command> cycle is thus not recommended, unless
|
||||||
|
you know what you're doing. At the moment,
|
||||||
|
<filename>tools/wineinstall</filename> is able to create a
|
||||||
|
configuration file, install the registry, and create the
|
||||||
|
directory structure itself.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>The Registry</title>
|
||||||
|
<para>
|
||||||
|
The default registry is in the file
|
||||||
|
<filename>winedefault.reg</filename>. It contains directory
|
||||||
|
paths, class IDs, and more; it must be installed before most
|
||||||
|
<filename>INSTALL.EXE</filename> or
|
||||||
|
<filename>SETUP.EXE</filename> applications will work. The
|
||||||
|
registry is covered in more detail in an earlier article.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Directory Structure</title>
|
||||||
|
<para>
|
||||||
|
Here's the fundamental layout that Windows applications and
|
||||||
|
installers expect. Without it, they seldom operate
|
||||||
|
correctly.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<informaltable frame="none">
|
||||||
|
<tgroup cols="5">
|
||||||
|
<tbody>
|
||||||
|
<row>
|
||||||
|
<entry>C:\</entry>
|
||||||
|
<entry></entry><entry></entry><entry></entry>
|
||||||
|
<entry>Root directory of primary disk drive</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry></entry>
|
||||||
|
<entry>Windows\</entry>
|
||||||
|
<entry></entry><entry></entry>
|
||||||
|
<entry>Windows directory, containing .INI files, accessories, etc</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry></entry><entry></entry>
|
||||||
|
<entry valign="middle">System\</entry>
|
||||||
|
<entry></entry>
|
||||||
|
<entry><literallayout>Win3.x/95/98/ME directory for common DLLs
|
||||||
|
WinNT/2000 directory for common 16-bit DLLs</literallayout></entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry></entry><entry></entry>
|
||||||
|
<entry>System32\</entry>
|
||||||
|
<entry></entry>
|
||||||
|
<entry>WinNT/2000 directory for common 32-bit DLLs</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry></entry><entry></entry>
|
||||||
|
<entry>Start Menu\</entry>
|
||||||
|
<entry></entry>
|
||||||
|
<entry>Program launcher directory structure</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry></entry><entry></entry><entry></entry>
|
||||||
|
<entry>Programs\</entry>
|
||||||
|
<entry>Program launcher links (.LNK files) to applications</entry>
|
||||||
|
</row>
|
||||||
|
<row>
|
||||||
|
<entry></entry>
|
||||||
|
<entry>Program Files\</entry>
|
||||||
|
<entry></entry><entry></entry>
|
||||||
|
<entry>Application binaries (.EXE and .DLL files)</entry>
|
||||||
|
</row>
|
||||||
|
</tbody>
|
||||||
|
</tgroup>
|
||||||
|
</informaltable>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Wine emulates drives by placing their virtual drive roots to
|
||||||
|
user-configurable points in the Unix filesystem, so it's
|
||||||
|
your choice where <medialabel>C:</medialabel>'s root should
|
||||||
|
be (<filename>tools/wineinstall</filename> will even ask
|
||||||
|
you). If you choose, say, <filename>/var/wine</filename>, as
|
||||||
|
the root of your virtual drive <medialabel>C</medialabel>,
|
||||||
|
then you'd put this in your <filename>wine.conf</filename>:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<programlisting>
|
||||||
|
[Drive C]
|
||||||
|
Path=/var/wine
|
||||||
|
Type=hd
|
||||||
|
Label=MS-DOS
|
||||||
|
Filesystem=win95
|
||||||
|
</programlisting>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
With this configuration, what windows apps think of as
|
||||||
|
"c:\windows\system" would map to
|
||||||
|
<filename>/var/wine/windows/system</filename> in the UNIX
|
||||||
|
filesystem. Note that you need to specify
|
||||||
|
<literal>Filesystem=win95</literal>, NOT
|
||||||
|
<literal>Filesystem=unix</literal>, to make Wine simulate a
|
||||||
|
Windows-compatible (case-insensitive) filesystem, otherwise
|
||||||
|
most apps won't work.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>System DLLs</title>
|
||||||
|
<para>
|
||||||
|
The Wine team has determined that it is necessary to create
|
||||||
|
fake DLL files to trick many applications that check for
|
||||||
|
file existence to determine whether a particular feature
|
||||||
|
(such as Winsock and its TCP/IP networking) is available. If
|
||||||
|
this is a problem for you, you can create empty files in the
|
||||||
|
<filename>system</filename> directory to make the
|
||||||
|
application think it's there, and Wine's built-in DLL will
|
||||||
|
be loaded when the application actually asks for it.
|
||||||
|
(Unfortunately, <filename>tools/wineinstall</filename> does
|
||||||
|
not create such empty files itself.)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Applications sometimes also try to inspect the version
|
||||||
|
resources from the physical files (for example, to determine
|
||||||
|
the DirectX version). Empty files will not do in this case,
|
||||||
|
it is rather necessary to install files with complete
|
||||||
|
version resources. This problem is currently being worked
|
||||||
|
on. In the meantime, you may still need to grab some real
|
||||||
|
DLL files to fool these apps with.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
And there are of course DLLs that wine does not currently
|
||||||
|
implement very well (or at all). If you do not have a real
|
||||||
|
Windows you can steal necessary DLLs from, you can always
|
||||||
|
get some from a DLL archive such as
|
||||||
|
<ulink url="http://solo.abac.com/dllarchive/">http://solo.abac.com/dllarchive/</ulink>.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="no-windows">
|
||||||
|
<title>Installing Wine Without Windows</title>
|
||||||
|
<para>
|
||||||
|
written by ???
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/no-windows</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
A major goal of Wine is to allow users to run Windows programs
|
||||||
|
without having to install Windows on their machine. Wine
|
||||||
|
implements the functionality of the main DLL's usually
|
||||||
|
provided with Windows. Therefore, once Wine is finished, you
|
||||||
|
will not need to have windows installed to use Wine.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Wine has already made enough progress that it may be possible
|
||||||
|
to run your target applications without Windows installed. If
|
||||||
|
you want to try it, follow these steps:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Create empty <filename>C:\windows</filename>,
|
||||||
|
<filename>C:\windows\system</filename>,
|
||||||
|
<filename>C:\windows\Start Menu</filename>, and
|
||||||
|
<filename>C:\windows\Start Menu\Programs</filename>
|
||||||
|
directories. Do not point Wine to a
|
||||||
|
<filename>Windows</filename> directory full of old
|
||||||
|
installations and a messy registry. (Wine creates a
|
||||||
|
special registry in your <filename >home</filename>
|
||||||
|
directory, in <filename>$HOME/.wine/*.reg</filename>.
|
||||||
|
Perhaps you have to remove these files).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Point <medialabel>[Drive C]</medialabel> in
|
||||||
|
<filename>wine.conf</filename> or
|
||||||
|
<filename>.winerc</filename> to where you want
|
||||||
|
<filename>C:</filename> to be. Refer to the Wine man page
|
||||||
|
for more information. Remember to use
|
||||||
|
<userinput>filesystem=win95</userinput>!
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Use <filename>tools/wineinstall</filename> to compile Wine
|
||||||
|
and install the default registry. Or if you prefer to do
|
||||||
|
it yourself, compile <filename>programs/regapi</filename>,
|
||||||
|
and run: <command>programs/regapi/regapi setValue <
|
||||||
|
winedefault.reg</command>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Run and/or install your applications.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Because Wine is not yet complete, some programs will work
|
||||||
|
better with native Windows DLL's than with Wine's
|
||||||
|
replacements. Wine has been designed to make this possible.
|
||||||
|
Here are some tips by Juergen Schmied (and others) on how to
|
||||||
|
proceed. This assumes that your
|
||||||
|
<filename>C:\windows</filename> directory in the configuration
|
||||||
|
file does not point to a native Windows installation but is in
|
||||||
|
a separate Unix file system. (For instance, <quote>C:\windows</quote> is
|
||||||
|
really subdirectory <quote>windows</quote> located in
|
||||||
|
<quote>/home/ego/wine/drives/c</quote>).
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Run the application with <parameter>--debugmsg
|
||||||
|
+module,+file</parameter> to find out which files are
|
||||||
|
needed. Copy the required DLL's one by one to the
|
||||||
|
<filename>C:\windows\system</filename> directory. Do not
|
||||||
|
copy KERNEL/KERNEL32, GDI/GDI32, or USER/USER32. These
|
||||||
|
implement the core functionality of the Windows API, and
|
||||||
|
the Wine internal versions must be used.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Edit the <quote>[DllOverrides]</quote> section of
|
||||||
|
<filename>wine.conf</filename> or
|
||||||
|
<filename>.winerc</filename> to specify
|
||||||
|
<quote>native</quote> before <quote>builtin</quote> for
|
||||||
|
the Windows DLL's you want to use. For more information
|
||||||
|
about this, see the Wine manpage.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Note that some network DLL's are not needed even though
|
||||||
|
Wine is looking for them. The Windows
|
||||||
|
<filename>MPR.DLL</filename> currently does not work; you
|
||||||
|
must use the internal implementation.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Copy SHELL/SHELL32 and COMDLG/COMDLG32 COMMCTRL/COMCTL32
|
||||||
|
only as pairs to your Wine directory (these DLL's are
|
||||||
|
<quote>clean</quote> to use). Make sure you have these
|
||||||
|
specified in the <quote>[DllPairs]</quote> section of
|
||||||
|
<filename>wine.conf</filename> or .winerc.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Be consistent: Use only DLL's from the same Windows version
|
||||||
|
together.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Put <filename>regedit.exe</filename> in the
|
||||||
|
<filename>C:\windows</filename> directory
|
||||||
|
(<application>office95</application> imports a
|
||||||
|
<filename>*.reg</filename> file when it runs with a empty
|
||||||
|
registry, don't know about
|
||||||
|
<application>office97</application>).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Also add <filename>winhelp.exe</filename> and
|
||||||
|
<filename>winhlp32.exe</filename> if you want to be able
|
||||||
|
to browse through your programs' help function.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="vfat">
|
||||||
|
<title>Dealing With FAT/VFAT Partitions</title>
|
||||||
|
<para>
|
||||||
|
written by Steven Elliott (elliotsl@mindspring.com)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/linux-fat-permissions</filename>)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
This document describes how FAT and
|
||||||
|
VFAT file system permissions work in Linux
|
||||||
|
with a focus on configuring them for Wine.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Introduction</title>
|
||||||
|
<para>
|
||||||
|
Linux is able to access DOS and Windows file systems using
|
||||||
|
either the FAT (older 8.3 DOS filesystems) or VFAT (newer
|
||||||
|
Windows 95 or later long filename filesystems) modules.
|
||||||
|
Mounted FAT or VFAT filesystems provide the primary means
|
||||||
|
for which existing applications and their data are accessed
|
||||||
|
through Wine for dual boot (Linux + Windows) systems.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Wine maps mounted FAT filesystems, such as
|
||||||
|
<filename>/c</filename>, to driver letters, such as
|
||||||
|
<quote>c:</quote>, as indicated by the
|
||||||
|
<filename>wine.conf</filename> file. The following excerpt
|
||||||
|
from a <filename>wine.conf</filename> file does this:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
[Drive C]
|
||||||
|
Path=/c
|
||||||
|
Type=hd
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
Although VFAT filesystems are preferable to FAT filesystems
|
||||||
|
for their long filename support the term <quote>FAT</quote>
|
||||||
|
will be used throughout the remainder of this document to
|
||||||
|
refer to FAT filesystems and their derivatives. Also,
|
||||||
|
<quote>/c</quote> will be used as the FAT mount point in
|
||||||
|
examples throughout this document.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Most modern Linux distributions either detect or allow
|
||||||
|
existing FAT file systems to be configured so that can be
|
||||||
|
mounted, in a location such as <filename>/c</filename>,
|
||||||
|
either persistently (on bootup) or on an as needed basis. In
|
||||||
|
either case, by default, the permissions will probably be
|
||||||
|
configured so that they look something like:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
<prompt>~></prompt><userinput>cd /c</userinput>
|
||||||
|
<prompt>/c></prompt><userinput>ls -l</userinput>
|
||||||
|
<computeroutput>-rwxr-xr-x 1 root root 91 Oct 10 17:58 autoexec.bat
|
||||||
|
-rwxr-xr-x 1 root root 245 Oct 10 17:58 config.sys
|
||||||
|
drwxr-xr-x 41 root root 16384 Dec 30 1998 windows</computeroutput>
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
where all the files are owned by "root", are in the "root"
|
||||||
|
group and are only writable by "root"
|
||||||
|
(<literal>755</literal> permissions). This is restrictive in
|
||||||
|
that it requires that Wine be run as root in order for
|
||||||
|
applications to be able to write to any part of the
|
||||||
|
filesystem.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
There three major approaches to overcoming the restrictive
|
||||||
|
permissions mentioned in the previous paragraph:
|
||||||
|
</para>
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Run <application>Wine</application> as root
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Mount the FAT filesystem with less restrictive
|
||||||
|
permissions
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Shadow the FAT filesystem by completely or partially
|
||||||
|
copying it
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
<para>
|
||||||
|
Each approach will be discussed in the following sections.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Running Wine as root</title>
|
||||||
|
<para>
|
||||||
|
Running Wine as root is the easiest and most thorough way of giving
|
||||||
|
applications that Wine runs unrestricted access to FAT files systems.
|
||||||
|
Running wine as root also allows applications to do things unrelated
|
||||||
|
to FAT filesystems, such as listening to ports that are less than
|
||||||
|
1024. Running Wine as root is dangerous since there is no limit to
|
||||||
|
what the application can do to the system.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Mounting FAT filesystems</title>
|
||||||
|
<para>
|
||||||
|
The FAT filesystem can be mounted with permissions less restrictive
|
||||||
|
than the default. This can be done by either changing the user that
|
||||||
|
mounts the FAT filesystem or by explicitly changing the permissions
|
||||||
|
that the FAT filesystem is mounted with. The permissions are
|
||||||
|
inherited from the process that mounts the FAT filesystem. Since the
|
||||||
|
process that mounts the FAT filesystem is usually a startup script
|
||||||
|
running as root the FAT filesystem inherits root's permissions. This
|
||||||
|
results in the files on the FAT filesystem having permissions similar
|
||||||
|
to files created by root. For example:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
<prompt>~></prompt><userinput>whoami</userinput>
|
||||||
|
<computeroutput>root</computeroutput>
|
||||||
|
<prompt>~></prompt><userinput>touch root_file</userinput>
|
||||||
|
<prompt>~></prompt><userinput>ls -l root_file</userinput>
|
||||||
|
<computeroutput></computeroutput>-rw-r--r-- 1 root root 0 Dec 10 00:20 root_file
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
which matches the owner, group and permissions of files seen
|
||||||
|
on the FAT filesystem except for the missing 'x's. The
|
||||||
|
permissions on the FAT filesystem can be changed by changing
|
||||||
|
root's umask (unset permissions bits). For example:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
<prompt>~></prompt><userinput>umount /c</userinput>
|
||||||
|
<prompt>~></prompt><userinput>umask</userinput>
|
||||||
|
<computeroutput>022</computeroutput>
|
||||||
|
<prompt>~></prompt><userinput>umask 073</userinput>
|
||||||
|
<prompt>~></prompt><userinput>mount /c</userinput>
|
||||||
|
<prompt>~></prompt><userinput>cd /c</userinput>
|
||||||
|
<prompt>/c></prompt><userinput>ls -l</userinput>
|
||||||
|
<computeroutput>-rwx---r-- 1 root root 91 Oct 10 17:58 autoexec.bat
|
||||||
|
-rwx---r-- 1 root root 245 Oct 10 17:58 config.sys
|
||||||
|
drwx---r-- 41 root root 16384 Dec 30 1998 windows</computeroutput>
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
Mounting the FAT filesystem with a umask of
|
||||||
|
<literal>000</literal> gives all users complete control over
|
||||||
|
it. Explicitly specifying the permissions of the FAT
|
||||||
|
filesystem when it is mounted provides additional control.
|
||||||
|
There are three mount options that are relevant to FAT
|
||||||
|
permissions: <literal>uid</literal>, <literal>gid</literal>
|
||||||
|
and <literal>umask</literal>. They can each be specified
|
||||||
|
when the filesystem is manually mounted. For example:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
<prompt>~></prompt><userinput>umount /c</userinput>
|
||||||
|
<prompt>~></prompt><userinput>mount -o uid=500 -o gid=500 -o umask=002 /c</userinput>
|
||||||
|
<prompt>~></prompt><userinput>cd /c</userinput>
|
||||||
|
<prompt>/c></prompt><userinput>ls -l</userinput>
|
||||||
|
<computeroutput>-rwxrwxr-x 1 sle sle 91 Oct 10 17:58 autoexec.bat
|
||||||
|
-rwxrwxr-x 1 sle sle 245 Oct 10 17:58 config.sys
|
||||||
|
drwxrwxr-x 41 sle sle 16384 Dec 30 1998 windows</computeroutput>
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
which gives "sle" complete control over
|
||||||
|
<filename>/c</filename>. The options listed above can be
|
||||||
|
made permanent by adding them to the
|
||||||
|
<filename>/etc/fstab</filename> file:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
<prompt>~></prompt><userinput>grep /c /etc/fstab</userinput>
|
||||||
|
<computeroutput>/dev/hda1 /c vfat uid=500,gid=500,umask=002,exec,dev,suid,rw 1 1</computeroutput>
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
Note that the umask of <literal>002</literal> is common in
|
||||||
|
the user private group file permission scheme. On FAT file
|
||||||
|
systems this umask assures that all files are fully
|
||||||
|
accessible by all users in the specified group
|
||||||
|
(<literal>gid</literal>).
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Shadowing FAT filesystems</title>
|
||||||
|
<para>
|
||||||
|
Shadowing provides a finer granularity of control. Parts of
|
||||||
|
the original FAT filesystem can be copied so that the
|
||||||
|
application can safely work with those copied parts while
|
||||||
|
the application continue to directly read the remaining
|
||||||
|
parts. This is done with symbolic links. For example,
|
||||||
|
consider a system where an application named
|
||||||
|
<application>AnApp</application> must be able to read and
|
||||||
|
write to the <filename>c:\windows</filename> and
|
||||||
|
<filename>c:\AnApp</filename> directories as well as have
|
||||||
|
read access to the entire FAT filesystem. On this system
|
||||||
|
the FAT filesystem has default permissions which should not
|
||||||
|
be changed for security reasons or can not be changed due to
|
||||||
|
lack of root access. On this system a shadow directory
|
||||||
|
might be set up in the following manner:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
<prompt>~></prompt><userinput>cd /</userinput>
|
||||||
|
<prompt>/></prompt><userinput>mkdir c_shadow</userinput>
|
||||||
|
<prompt>/></prompt><userinput>cd c_shadow</userinput>
|
||||||
|
<prompt>/c_shadow></prompt><userinput>ln -s /c_/* .</userinput>
|
||||||
|
<prompt>/c_shadow></prompt><userinput>rm windows AnApp</userinput>
|
||||||
|
<prompt>/c_shadow></prompt><userinput>cp -R /c_/{windows,AnApp} .</userinput>
|
||||||
|
<prompt>/c_shadow></prompt><userinput>chmod -R 777 windows AnApp</userinput>
|
||||||
|
<prompt>/c_shadow></prompt><userinput>perl -p -i -e 's|/c$|/c_shadow|g' /usr/local/etc/wine.conf</userinput>
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
The above gives everyone complete read and write access to
|
||||||
|
the <filename>windows</filename> and
|
||||||
|
<filename>AnApp</filename> directories while only root has
|
||||||
|
write access to all other directories.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="scsi-support">
|
||||||
|
<title>SCSI Support</title>
|
||||||
|
<para>
|
||||||
|
written by Bruce Milner; Additions by Andreas Mohr
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/aspi</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This file describes setting up the Windows ASPI interface.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
<warning>
|
||||||
|
<title>Warning/Warning/Warning!!!!!!</title>
|
||||||
|
<para>
|
||||||
|
<screen>
|
||||||
|
THIS MAY TRASH YOUR SYSTEM IF USED INCORRECTLY
|
||||||
|
THIS MAY TRASH YOUR SYSTEM IF USED CORRECTLY
|
||||||
|
</screen>
|
||||||
|
</para>
|
||||||
|
</warning>
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Now that I have said that. ASPI is a direct link to SCSI devices from
|
||||||
|
windows programs. ASPI just forwards the SCSI commands that programs send
|
||||||
|
to it to the SCSI bus.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
If you use the wrong scsi device in your setup file, you can send
|
||||||
|
completely bogus commands to the wrong device - An example would be
|
||||||
|
formatting your hard drives (assuming the device gave you permission -
|
||||||
|
if you're running as root, all bets are off).
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
So please make sure that **all** SCSI devices not needed by the program
|
||||||
|
have their permissions set as restricted as possible !
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Cookbook for setting up scanner: (At least how mine is to work)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Windows requirements</title>
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
The scanner software needs to use the "Adaptec"
|
||||||
|
compatible drivers (ASPI). At least with Mustek, they
|
||||||
|
allow you the choice of using the builtin card or the
|
||||||
|
"Adaptec (AHA)" compatible drivers. This will not work
|
||||||
|
any other way. Software that accesses the scanner via a
|
||||||
|
DOS ASPI driver (e.g. ASPI2DOS) is supported, too. [AM]
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
You probably need a real windows install of the software
|
||||||
|
to set the LUN's/SCSI id's up correctly. I'm not exactly
|
||||||
|
sure.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>LINUX requirements:</title>
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Your scsi card must be supported under linux. This will
|
||||||
|
not work with an unknown scsi card. Even for cheap'n
|
||||||
|
crappy "scanner only" controllers some special Linux
|
||||||
|
drivers exist on the net.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Compile generic scsi drivers into your kernel.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Linux by default uses smaller scsi buffers than Windows.
|
||||||
|
There is a kernel build define <literal>SG_BIG_BUFF</literal> (in
|
||||||
|
<filename>sg.h</filename>) that is by default set too
|
||||||
|
low. The SANE project recommends
|
||||||
|
<literal>130560</literal> and this seems to work just
|
||||||
|
fine. This does require a kernel rebuild.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Make the devices for the scanner (generic scsi devices)
|
||||||
|
- look at the scsi programming how-to for device
|
||||||
|
numbering.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
I would recommend making the scanner device writable by
|
||||||
|
a group. I made a group called
|
||||||
|
<literal>scanner</literal> and added myself to it.
|
||||||
|
Running as root increases your risk of sending bad scsi
|
||||||
|
commands to the wrong device. With a regular user, you
|
||||||
|
are better protected.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Add a scsi device entry for your particular scanner to
|
||||||
|
wine.conf. The format is <literal>[scsi
|
||||||
|
cCtTdD]</literal> where
|
||||||
|
<literal>C=controller</literal>,
|
||||||
|
<literal>T=target</literal>, <literal>D=LUN</literal>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
For example, I set mine up as controller <literal>0</literal>,
|
||||||
|
Target <literal>6</literal>, LUN <literal>0</literal>.
|
||||||
|
<programlisting>
|
||||||
|
[scsi c0t6d0]
|
||||||
|
Device=/dev/sgi
|
||||||
|
</programlisting>
|
||||||
|
Yours will vary with your particular SCSI setup.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>General Information</title>
|
||||||
|
<para>
|
||||||
|
The mustek scanner I have was shipped with a package
|
||||||
|
"ipplus". This program uses the TWAIN driver specification
|
||||||
|
to access scanners.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(TWAIN MANAGER)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
<programlisting>
|
||||||
|
ipplus.exe <---> (TWAIN INTERFACE) <---> (TWAIN DATA SOURCE . ASPI) -> WINASPI
|
||||||
|
</programlisting>
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>NOTES/BUGS</title>
|
||||||
|
<para>
|
||||||
|
The biggest is that it only works under linux at the moment.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The ASPI code has only been tested with:
|
||||||
|
</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
a Mustek 800SP with a Buslogic controller under Linux [BM]
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
a Siemens Nixdorf 9036 with Adaptec AVA-1505 under Linux
|
||||||
|
accessed via DOSASPI. Note that I had color problems,
|
||||||
|
though (barely readable result) [AM]
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
a Fujitsu M2513A MO drive (640MB) using generic scsi
|
||||||
|
drivers. Formatting and ejecting worked perfectly.
|
||||||
|
Thanks to Uwe Bonnes for access to the hardware ! [AM]
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
<para>
|
||||||
|
I make no warranty to the aspi code. It makes my scanner
|
||||||
|
work. Your devices may explode. I have no way of determining
|
||||||
|
this. I take zero responsibility!
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -1,75 +0,0 @@
|
||||||
This document describes some points you should know before implementing
|
|
||||||
the internal counterparts to external DLL's. Only 32 bit DLL's
|
|
||||||
are considered.
|
|
||||||
|
|
||||||
1. The LibMain function
|
|
||||||
-----------------------
|
|
||||||
This is the way to do some initializing when a process or thread is attached
|
|
||||||
to the dll. The function name is taken from a *.spec file line:
|
|
||||||
|
|
||||||
init YourFunctionName
|
|
||||||
|
|
||||||
then, you have to implement the function:
|
|
||||||
|
|
||||||
|
|
||||||
BOOL32 WINAPI YourLibMain(HINSTANCE32 hinstDLL,
|
|
||||||
DWORD fdwReason, LPVOID lpvReserved)
|
|
||||||
{ if (fdwReason==DLL_PROCESS_ATTACH)
|
|
||||||
{ ...
|
|
||||||
}
|
|
||||||
....
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
2. Using functions from other built-in DLL's
|
|
||||||
--------------------------------------------
|
|
||||||
The problem here is, that you can't know if you have to call the function from
|
|
||||||
the internal or the external DLL. If you just call the function you will get
|
|
||||||
the internal implementation. If the external DLL is loaded the executed program
|
|
||||||
will use the external DLL and you the internal one.
|
|
||||||
When you -as an example- fill an iconlist placed in the internal DLL the
|
|
||||||
application won't get the icons from the external DLL.
|
|
||||||
|
|
||||||
To work around this, you should always use a pointer to call such functions:
|
|
||||||
|
|
||||||
/* definition of the pointer type*/
|
|
||||||
void (CALLBACK* pDLLInitComctl)();
|
|
||||||
|
|
||||||
/* getting the function address this should be done in the
|
|
||||||
LibMain function when called with DLL_PROCESS_ATTACH*/
|
|
||||||
|
|
||||||
BOOL32 WINAPI Shell32LibMain(HINSTANCE32 hinstDLL, DWORD fdwReason,
|
|
||||||
LPVOID lpvReserved)
|
|
||||||
{ HINSTANCE32 hComctl32;
|
|
||||||
if (fdwReason==DLL_PROCESS_ATTACH)
|
|
||||||
{ /* load the external / internal DLL*/
|
|
||||||
hComctl32 = LoadLibrary32A("COMCTL32.DLL");
|
|
||||||
if (hComctl32)
|
|
||||||
{ /* get the function pointer */
|
|
||||||
pDLLInitComctl=GetProcAddress32(hComctl32,"InitCommonControlsEx");
|
|
||||||
|
|
||||||
/* check it */
|
|
||||||
if (pDLLInitComctl)
|
|
||||||
{ /* use it */
|
|
||||||
pDLLInitComctl();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* free the DLL / decrease the ref count */
|
|
||||||
FreeLibrary32(hComctl32);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{ /* do some panic*/
|
|
||||||
ERR(shell,"P A N I C error getting functionpointers\n");
|
|
||||||
exit (1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
....
|
|
||||||
|
|
||||||
3. Getting resources from a *.rc file linked to the DLL
|
|
||||||
-------------------------------------------------------
|
|
||||||
< If you know how, write some lines>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
----------
|
|
||||||
<juergen.schmied@metronet.de>
|
|
|
@ -1,350 +0,0 @@
|
||||||
KERNEL MODULE
|
|
||||||
=============
|
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
GDI MODULE
|
|
||||||
==========
|
|
||||||
|
|
||||||
1. X Windows System interface
|
|
||||||
-----------------------------
|
|
||||||
|
|
||||||
The X libraries used to implement X clients (such as Wine) do not work
|
|
||||||
properly if multiple threads access the same display concurrently. It is
|
|
||||||
possible to compile the X libraries to perform their own synchronization
|
|
||||||
(initiated by calling XInitThreads()). However, Wine does not use this
|
|
||||||
approach. Instead Wine performs its own synchronization py putting a
|
|
||||||
wrapper around every X call that is used. This wrapper protects library
|
|
||||||
access with a critical section, and also arranges things so that X
|
|
||||||
libraries compiled without -D_REENTRANT (eg. with global errno variable)
|
|
||||||
will work with Wine.
|
|
||||||
|
|
||||||
To make this scheme work, all calls to X must use the proper wrapper
|
|
||||||
functions (or do their own synchronization that is compatible with the
|
|
||||||
wrappers). The wrapper for a function X...() is calles TSX...() (for
|
|
||||||
"Thread Safe X ..."). So for example, instead of calling XOpenDisplay()
|
|
||||||
in the code, TSXOpenDisplay() must be used. Likewise, X include files
|
|
||||||
that contain function prototypes are wrapped, so that eg. "ts_xutil.h"
|
|
||||||
must be included rather than <X11/Xutil.h>. It is important that this
|
|
||||||
scheme is used everywhere to avoid the introduction of nondeterministic
|
|
||||||
and hard-to-find errors in Wine.
|
|
||||||
|
|
||||||
The code for the thread safe X wrappers is contained in the tsx11/
|
|
||||||
directory and in include/ts*.h. To use a new (ie. not previously used) X
|
|
||||||
function in Wine, a new wrapper must be created. The wrappers are
|
|
||||||
generated (semi-)automatically from the X11R6 includes using the
|
|
||||||
tools/make_X11wrappers perl script. In simple cases it should be enough
|
|
||||||
to add the name of the new function to the list in tsx11/X11_calls; if
|
|
||||||
this does not work the wrapper must be added manually to the
|
|
||||||
make_X11wrappers script. See comments in tsx11/X11_calls and
|
|
||||||
tools/make_X11wrappers for further details.
|
|
||||||
|
|
||||||
|
|
||||||
USER MODULE
|
|
||||||
===========
|
|
||||||
|
|
||||||
USER implements windowing and messaging subsystems. It also
|
|
||||||
contains code for common controls and for other miscellaneous
|
|
||||||
stuff (rectangles, clipboard, WNet, etc). Wine USER code is
|
|
||||||
located in windows/, controls/, and misc/ directories.
|
|
||||||
|
|
||||||
1. Windowing subsystem
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
windows/win.c
|
|
||||||
windows/winpos.c
|
|
||||||
|
|
||||||
Windows are arranged into parent/child hierarchy with one
|
|
||||||
common ancestor for all windows (desktop window). Each window
|
|
||||||
structure contains a pointer to the immediate ancestor (parent
|
|
||||||
window if WS_CHILD style bit is set), a pointer to the sibling
|
|
||||||
(returned by GetWindow(..., GW_NEXT)), a pointer to the owner
|
|
||||||
window (set only for popup window if it was created with valid
|
|
||||||
hwndParent parameter), and a pointer to the first child
|
|
||||||
window (GetWindow(.., GW_CHILD)). All popup and non-child windows
|
|
||||||
are therefore placed in the first level of this hierarchy and their
|
|
||||||
ancestor link (wnd->parent) points to the desktop window.
|
|
||||||
|
|
||||||
Desktop window - root window
|
|
||||||
| \ `-.
|
|
||||||
| \ `-.
|
|
||||||
popup -> wnd1 -> wnd2 - top level windows
|
|
||||||
| \ `-. `-.
|
|
||||||
| \ `-. `-.
|
|
||||||
child1 child2 -> child3 child4 - child windows
|
|
||||||
|
|
||||||
Horizontal arrows denote sibling relationship, vertical lines
|
|
||||||
- ancestor/child. To summarize, all windows with the same immediate
|
|
||||||
ancestor are sibling windows, all windows which do not have desktop
|
|
||||||
as their immediate ancestor are child windows. Popup windows behave
|
|
||||||
as topmost top-level windows unless they are owned. In this case the
|
|
||||||
only requirement is that they must precede their owners in the top-level
|
|
||||||
sibling list (they are not topmost). Child windows are confined to the
|
|
||||||
client area of their parent windows (client area is where window gets
|
|
||||||
to do its own drawing, non-client area consists of caption, menu, borders,
|
|
||||||
intrinsic scrollbars, and minimize/maximize/close/help buttons).
|
|
||||||
|
|
||||||
Another fairly important concept is "z-order". It is derived from
|
|
||||||
the ancestor/child hierarchy and is used to determine "above/below"
|
|
||||||
relationship. For instance, in the example above, z-order is
|
|
||||||
child1->popup->child2->child3->wnd1->child4->wnd2->desktop. Current
|
|
||||||
active window ("foreground window" in Win32) is moved to the front
|
|
||||||
of z-order unless its top-level ancestor owns popup windows.
|
|
||||||
|
|
||||||
All these issues are dealt with (or supposed to be) in windows/winpos.c
|
|
||||||
with SetWindowPos() being the primary interface to the window manager.
|
|
||||||
|
|
||||||
Wine specifics: in default and managed mode each top-level window
|
|
||||||
gets its own X counterpart with desktop window being basically a
|
|
||||||
fake stub. In desktop mode, however, only desktop window has an X
|
|
||||||
window associated with it. Also, SetWindowPos() should eventually be
|
|
||||||
implemented via Begin/End/DeferWindowPos() calls and not the other way
|
|
||||||
around.
|
|
||||||
|
|
||||||
1.1 Visible region, clipping region and update region
|
|
||||||
|
|
||||||
windows/dce.c
|
|
||||||
windows/winpos.c
|
|
||||||
windows/painting.c
|
|
||||||
|
|
||||||
________________________
|
|
||||||
|_________ | A and B are child windows of C
|
|
||||||
| A |______ |
|
|
||||||
| | | |
|
|
||||||
|---------' | |
|
|
||||||
| | B | |
|
|
||||||
| | | |
|
|
||||||
| `------------' |
|
|
||||||
| C |
|
|
||||||
`------------------------'
|
|
||||||
|
|
||||||
Visible region determines which part of the window is not obscured
|
|
||||||
by other windows. If a window has the WS_CLIPCHILDREN style then all
|
|
||||||
areas below its children are considered invisible. Similarily, if
|
|
||||||
the WS_CLIPSIBLINGS bit is in effect then all areas obscured by its
|
|
||||||
siblings are invisible. Child windows are always clipped by the
|
|
||||||
boundaries of their parent windows.
|
|
||||||
|
|
||||||
B has a WS_CLIPSIBLINGS style:
|
|
||||||
. ______
|
|
||||||
: | |
|
|
||||||
| ,-----' |
|
|
||||||
| | B | - visible region of B
|
|
||||||
| | |
|
|
||||||
: `------------'
|
|
||||||
|
|
||||||
When the program requests a display context (DC) for a window it
|
|
||||||
can specify an optional clipping region that further restricts the
|
|
||||||
area where the graphics output can appear. This area is calculated
|
|
||||||
as an intersection of the visible region and a clipping region.
|
|
||||||
|
|
||||||
Program asked for a DC with a clipping region:
|
|
||||||
______
|
|
||||||
,--|--. | . ,--.
|
|
||||||
,--+--' | | : _: |
|
|
||||||
| | B | | => | | | - DC region where the painting will
|
|
||||||
| | | | | | | be visible
|
|
||||||
`--|-----|---' : `----'
|
|
||||||
`-----'
|
|
||||||
|
|
||||||
When the window manager detects that some part of the window
|
|
||||||
became visible it adds this area to the update region of this
|
|
||||||
window and then generates WM_ERASEBKGND and WM_PAINT messages.
|
|
||||||
In addition, WM_NCPAINT message is sent when the uncovered area
|
|
||||||
intersects a nonclient part of the window. Application must reply
|
|
||||||
to the WM_PAINT message by calling BeginPaint()/EndPaint() pair of
|
|
||||||
functions. BeginPaint() returns a DC that uses accumulated update
|
|
||||||
region as a clipping region. This operation cleans up invalidated
|
|
||||||
area and the window will not receive another WM_PAINT until the
|
|
||||||
window manager creates a new update region.
|
|
||||||
|
|
||||||
A was moved to the left:
|
|
||||||
________________________ ... / C update region
|
|
||||||
|______ | : .___ /
|
|
||||||
| A |_________ | => | ...|___|..
|
|
||||||
| | | | | : | |
|
|
||||||
|------' | | | : '---'
|
|
||||||
| | B | | | : \
|
|
||||||
| | | | : \
|
|
||||||
| `------------' | B update region
|
|
||||||
| C |
|
|
||||||
`------------------------'
|
|
||||||
|
|
||||||
|
|
||||||
Windows maintains a display context cache consisting of entries that
|
|
||||||
include DC itself, window to which it belongs, and an optional clipping
|
|
||||||
region (visible region is stored in the DC itself). When an API call
|
|
||||||
changes the state of the window tree, window manager has to go through
|
|
||||||
the DC cache to recalculate visible regions for entries whose windows
|
|
||||||
were involved in the operation. DC entries (DCE) can be either private
|
|
||||||
to the window, or private to the window class, or shared between all
|
|
||||||
windows (Windows 3.1 limits the number of shared DCEs to 5).
|
|
||||||
|
|
||||||
1.2
|
|
||||||
|
|
||||||
2. Messaging subsystem
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
windows/queue.c
|
|
||||||
windows/message.c
|
|
||||||
|
|
||||||
Each Windows task/thread has its own message queue - this is where
|
|
||||||
it gets messages from. Messages can be generated on the fly
|
|
||||||
(WM_PAINT, WM_NCPAINT, WM_TIMER), they can be created by the system
|
|
||||||
(hardware messages), they can be posted by other tasks/threads
|
|
||||||
(PostMessage), or they can be sent by other tasks/threads (SendMessage).
|
|
||||||
|
|
||||||
Message priority:
|
|
||||||
|
|
||||||
First the system looks for sent messages, then for posted messages,
|
|
||||||
then for hardware messages, then it checks if the queue has the
|
|
||||||
"dirty window" bit set, and, finally, it checks for expired
|
|
||||||
timers. See windows/message.c.
|
|
||||||
|
|
||||||
From all these different types of messages, only posted messages go
|
|
||||||
directly into the private message queue. System messages (even in
|
|
||||||
Win95) are first collected in the system message queue and then
|
|
||||||
they either sit there until Get/PeekMessage gets to process them
|
|
||||||
or, as in Win95, if system queue is getting clobbered, a special
|
|
||||||
thread ("raw input thread") assigns them to the private
|
|
||||||
queues. Sent messages are queued separately and the sender sleeps
|
|
||||||
until it gets a reply. Special messages are generated on the fly
|
|
||||||
depending on the window/queue state. If the window update region is
|
|
||||||
not empty, the system sets the QS_PAINT bit in the owning queue and
|
|
||||||
eventually this window receives a WM_PAINT message (WM_NCPAINT too
|
|
||||||
if the update region intersects with the non-client area). A timer
|
|
||||||
event is raised when one of the queue timers expire. Depending on
|
|
||||||
the timer parameters DispatchMessage either calls the callback
|
|
||||||
function or the window procedure. If there are no messages pending
|
|
||||||
the task/thread sleeps until messages appear.
|
|
||||||
|
|
||||||
There are several tricky moments (open for discussion) -
|
|
||||||
|
|
||||||
a) System message order has to be honored and messages should be
|
|
||||||
processed within correct task/thread context. Therefore when
|
|
||||||
Get/PeekMessage encounters unassigned system message and this
|
|
||||||
message appears not to be for the current task/thread it should
|
|
||||||
either skip it (or get rid of it by moving it into the private
|
|
||||||
message queue of the target task/thread - Win95, AFAIK) and
|
|
||||||
look further or roll back and then yield until this message
|
|
||||||
gets processed when system switches to the correct context
|
|
||||||
(Win16). In the first case we lose correct message ordering, in
|
|
||||||
the second case we have the infamous synchronous system message
|
|
||||||
queue. Here is a post to one of the OS/2 newsgroup I found to
|
|
||||||
be relevant:
|
|
||||||
|
|
||||||
" Here's the problem in a nutshell, and there is no good solution.
|
|
||||||
Every possible solution creates a different problem.
|
|
||||||
|
|
||||||
With a windowing system, events can go to many different windows.
|
|
||||||
Most are sent by applications or by the OS when things relating to
|
|
||||||
that window happen (like repainting, timers, etc.)
|
|
||||||
|
|
||||||
Mouse input events go to the window you click on (unless some window
|
|
||||||
captures the mouse).
|
|
||||||
|
|
||||||
So far, no problem. Whenever an event happens, you put a message on
|
|
||||||
the target window's message queue. Every process has a message
|
|
||||||
queue. If the process queue fills up, the messages back up onto the
|
|
||||||
system queue.
|
|
||||||
|
|
||||||
This is the first cause of apps hanging the GUI. If an app doesn't
|
|
||||||
handle messages and they back up into the system queue, other apps
|
|
||||||
can't get any more messages. The reason is that the next message in
|
|
||||||
line can't go anywhere, and the system won't skip over it.
|
|
||||||
|
|
||||||
This can be fixed by making apps have bigger private message queues.
|
|
||||||
The SIQ fix does this. PMQSIZE does this for systems without the SIQ
|
|
||||||
fix. Applications can also request large queues on their own.
|
|
||||||
|
|
||||||
Another source of the problem, however, happens when you include
|
|
||||||
keyboard events. When you press a key, there's no easy way to know
|
|
||||||
what window the keystroke message should be delivered to.
|
|
||||||
|
|
||||||
Most windowing systems use a concept known as "focus". The window
|
|
||||||
with focus gets all incoming keyboard messages. Focus can be changed
|
|
||||||
from window to window by apps or by users clicking on winodws.
|
|
||||||
|
|
||||||
This is the second source of the problem. Suppose window A has focus.
|
|
||||||
You click on window B and start typing before the window gets focus.
|
|
||||||
Where should the keystrokes go? On the one hand, they should go to A
|
|
||||||
until the focus actually changes to B. On the other hand, you
|
|
||||||
probably want the keystrokes to go to B, since you clicked there
|
|
||||||
first.
|
|
||||||
|
|
||||||
OS/2's solution is that when a focus-changing event happens (like
|
|
||||||
clicking on a window), OS/2 holds all messages in the system queue
|
|
||||||
until the focus change actually happens. This way, subsequent
|
|
||||||
keystrokes go to the window you clicked on, even if it takes a while
|
|
||||||
for that window to get focus.
|
|
||||||
|
|
||||||
The downside is that if the window takes a real long time to get focus
|
|
||||||
(maybe it's not handling events, or maybe the window losing focus
|
|
||||||
isn't handling events), everything backs up in the system queue and
|
|
||||||
the system appears hung.
|
|
||||||
|
|
||||||
There are a few solutions to this problem.
|
|
||||||
|
|
||||||
One is to make focus policy asynchronous. That is, focus changing has
|
|
||||||
absolutely nothing to do with the keyboard. If you click on a window
|
|
||||||
and start typing before the focus actually changes, the keystrokes go
|
|
||||||
to the first window until focus changes, then they go to the second.
|
|
||||||
This is what X-windows does.
|
|
||||||
|
|
||||||
Another is what NT does. When focus changes, keyboard events are held
|
|
||||||
in the system message queue, but other events are allowed through.
|
|
||||||
This is "asynchronous" because the messages in the system queue are
|
|
||||||
delivered to the application queues in a different order from that
|
|
||||||
with which they were posted. If a bad app won't handle the "lose
|
|
||||||
focus" message, it's of no consequence - the app receiving focus will
|
|
||||||
get its "gain focus" message, and the keystrokes will go to it.
|
|
||||||
|
|
||||||
The NT solution also takes care of the application queue filling up
|
|
||||||
problem. Since the system delivers messages asynchronously, messages
|
|
||||||
waiting in the system queue will just sit there and the rest of the
|
|
||||||
messages will be delivered to their apps.
|
|
||||||
|
|
||||||
The OS/2 SIQ solution is this: When a focus-changing event happens,
|
|
||||||
in addition to blocking further messages from the application queues,
|
|
||||||
a timer is started. When the timer goes off, if the focus change has
|
|
||||||
not yet happened, the bad app has its focus taken away and all
|
|
||||||
messages targetted at that window are skipped. When the bad app
|
|
||||||
finally handles the focus change message, OS/2 will detect this and
|
|
||||||
stop skipping its messages.
|
|
||||||
|
|
||||||
|
|
||||||
As for the pros and cons:
|
|
||||||
|
|
||||||
The X-windows solution is probably the easiest. The problem is that
|
|
||||||
users generally don't like having to wait for the focus to change
|
|
||||||
before they start typing. On many occasions, you can type and the
|
|
||||||
characters end up in the wrong window because something (usually heavy
|
|
||||||
system load) is preventing the focus change from happening in a timely
|
|
||||||
manner.
|
|
||||||
|
|
||||||
The NT solution seems pretty nice, but making the system message queue
|
|
||||||
asynchronous can cause similar problems to the X-windows problem.
|
|
||||||
Since messages can be delivered out of order, programs must not assume
|
|
||||||
that two messages posted in a particular order will be delivered in
|
|
||||||
that same order. This can break legacy apps, but since Win32 always
|
|
||||||
had an asynchronous queue, it is fair to simply tell app designers
|
|
||||||
"don't do that". It's harder to tell app designers something like
|
|
||||||
that on OS/2 - they'll complain "you changed the rules and our apps
|
|
||||||
are breaking."
|
|
||||||
|
|
||||||
The OS/2 solution's problem is that nothing happens until you try to
|
|
||||||
change window focus, and then wait for the timeout. Until then, the
|
|
||||||
bad app is not detected and nothing is done." (by David Charlap)
|
|
||||||
|
|
||||||
|
|
||||||
b) Intertask/interthread SendMessage. The system has to inform the
|
|
||||||
target queue about the forthcoming message, then it has to carry
|
|
||||||
out the context switch and wait until the result is available.
|
|
||||||
Win16 stores necessary parameters in the queue structure and then
|
|
||||||
calls DirectedYield() function. However, in Win32 there could be
|
|
||||||
several messages pending sent by preemptively executing threads,
|
|
||||||
and in this case SendMessage has to build some sort of message
|
|
||||||
queue for sent messages. Another issue is what to do with messages
|
|
||||||
sent to the sender when it is blocked inside its own SendMessage.
|
|
||||||
|
|
||||||
|
|
|
@ -1,223 +0,0 @@
|
||||||
cat > /dev/null <<EOF
|
|
||||||
The above line is necessary, leave it alone!!
|
|
||||||
--------------------------------------------------------------------
|
|
||||||
|
|
||||||
DOING A HARDWARE TRACE IN WINE
|
|
||||||
------------------------------
|
|
||||||
|
|
||||||
The primary reason to do this is to reverse engineer a hardware device
|
|
||||||
for which you don't have documentation, but can get to work under Wine.
|
|
||||||
|
|
||||||
This lot is aimed at parallel port devices, and in particular parallel port
|
|
||||||
scanners which are now so cheap they are virtually being given away. The
|
|
||||||
problem is that few manufactures will release any programming information which
|
|
||||||
prevents drivers being written for Sane, and the traditional technique of using
|
|
||||||
DOSemu to produce the traces does not work as the scanners invariably only have
|
|
||||||
drivers for Windows.
|
|
||||||
|
|
||||||
Please note that I have not been able to get my scanner working properly (a
|
|
||||||
UMAX Astra 600P), but a couple of people have reported success with at least
|
|
||||||
the Artec AS6e scanner. I am not in the process of developing any driver nor do
|
|
||||||
I intend to, so don't bug me about it. My time is now spent writting programs
|
|
||||||
to set things like battery save options under Linux on Toshiba laptops, ans as
|
|
||||||
such I don't have any spare time for writting a driver for a parallel port
|
|
||||||
scanner etc.
|
|
||||||
|
|
||||||
Presuming that you have compiled and installed wine the first thing to do is is
|
|
||||||
to enable direct hardware access to your parallel port. To do this edit
|
|
||||||
wine.conf (usually in /usr/local/etc) and in the ports section add the
|
|
||||||
following two lines
|
|
||||||
|
|
||||||
read=0x378,0x379,0x37a,0x37c,0x77a
|
|
||||||
write=0x378,x379,0x37a,0x37c,0x77a
|
|
||||||
|
|
||||||
This adds the necessary access required for SPP/PS2/EPP/ECP parallel port on
|
|
||||||
LPT1. You will need to adjust these number accordingly if your parallel port is
|
|
||||||
on LPT2 or LPT0.
|
|
||||||
|
|
||||||
When starting wine use the following command line, where XXXX is the program
|
|
||||||
you need to run in order to access your scanner, and YYYY is the file your
|
|
||||||
trace will be stored in:
|
|
||||||
|
|
||||||
wine -debugmsg +io XXXX 2> >(sed 's/^[^:]*:io:[^ ]* //' > YYYY)
|
|
||||||
|
|
||||||
You will need large amounts of hard disk space (read hundreds of megabytes if
|
|
||||||
you do a full page scan), and for reasonable performance a really fast
|
|
||||||
processor and lots of RAM.
|
|
||||||
|
|
||||||
You might well find the log compression program that David Campbell
|
|
||||||
<campbell@torque.net> wrote helpfull in reducing the size of the log files.
|
|
||||||
This can be obtained by the following command:
|
|
||||||
|
|
||||||
sh ioport-trace-hints
|
|
||||||
|
|
||||||
This should extract shrink.c (which is located at the end of this file. Compile
|
|
||||||
the log compression program by:
|
|
||||||
|
|
||||||
cc shrink.c -o shrink
|
|
||||||
|
|
||||||
Use the shrink program to reduce the physical size of the raw log as follows:
|
|
||||||
|
|
||||||
cat log | shrink > log2
|
|
||||||
|
|
||||||
The trace has the basic form of
|
|
||||||
|
|
||||||
XXXX > YY @ ZZZZ:ZZZZ
|
|
||||||
|
|
||||||
where XXXX is the port in hexidecimal being accessed, YY is the data written
|
|
||||||
(or read) from the port, and ZZZZ:ZZZZ is the address in memory of the
|
|
||||||
instruction that accessed the port. The direction of the arrow indicates
|
|
||||||
whether the data was written or read from the port.
|
|
||||||
|
|
||||||
> data was written to the port
|
|
||||||
< data was read from the port
|
|
||||||
|
|
||||||
|
|
||||||
My basic tip for interperating these logs is to pay close attention to the
|
|
||||||
addresses of the IO instructions. There grouping and sometimes proximity should
|
|
||||||
reveal the presence of subroutines in the driver. By studying the different
|
|
||||||
versions you should be able to work them out. For example consider the
|
|
||||||
following section of trace from my UMAX Astra 600P
|
|
||||||
|
|
||||||
0x378 > 55 @ 0297:01ec
|
|
||||||
0x37a > 05 @ 0297:01f5
|
|
||||||
0x379 < 8f @ 0297:01fa
|
|
||||||
0x37a > 04 @ 0297:0211
|
|
||||||
0x378 > aa @ 0297:01ec
|
|
||||||
0x37a > 05 @ 0297:01f5
|
|
||||||
0x379 < 8f @ 0297:01fa
|
|
||||||
0x37a > 04 @ 0297:0211
|
|
||||||
0x378 > 00 @ 0297:01ec
|
|
||||||
0x37a > 05 @ 0297:01f5
|
|
||||||
0x379 < 8f @ 0297:01fa
|
|
||||||
0x37a > 04 @ 0297:0211
|
|
||||||
0x378 > 00 @ 0297:01ec
|
|
||||||
0x37a > 05 @ 0297:01f5
|
|
||||||
0x379 < 8f @ 0297:01fa
|
|
||||||
0x37a > 04 @ 0297:0211
|
|
||||||
0x378 > 00 @ 0297:01ec
|
|
||||||
0x37a > 05 @ 0297:01f5
|
|
||||||
0x379 < 8f @ 0297:01fa
|
|
||||||
0x37a > 04 @ 0297:0211
|
|
||||||
0x378 > 00 @ 0297:01ec
|
|
||||||
0x37a > 05 @ 0297:01f5
|
|
||||||
0x379 < 8f @ 0297:01fa
|
|
||||||
0x37a > 04 @ 0297:0211
|
|
||||||
|
|
||||||
As you can see their is a repeating structure starting at address 0297:01ec
|
|
||||||
that consists of four io access on the parallel port. Looking at it the first
|
|
||||||
io access writes a changing byte to the data port the second always writes the
|
|
||||||
byte 0x05 to the control port, then a value which always seems to 0x8f is read
|
|
||||||
from the status port at which point a byte 0x04 is written to the control port.
|
|
||||||
By studying this and other sections of the trace we can write a C routine that
|
|
||||||
emulates this, shown below with some macros to make reading/writing on the
|
|
||||||
parallel port easier to read.
|
|
||||||
|
|
||||||
|
|
||||||
#define r_dtr(x) inb(x)
|
|
||||||
#define r_str(x) inb(x+1)
|
|
||||||
#define r_ctr(x) inb(x+2)
|
|
||||||
#define w_dtr(x,y) outb(y, x)
|
|
||||||
#define w_str(x,y) outb(y, x+1)
|
|
||||||
#define w_ctr(x,y) outb(y, x+2)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Seems to be sending a command byte to the scanner
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
int udpp_put(int udpp_base, unsigned char command)
|
|
||||||
{
|
|
||||||
int loop,value;
|
|
||||||
|
|
||||||
w_dtr(udpp_base, command);
|
|
||||||
w_ctr(udpp_base, 0x05);
|
|
||||||
|
|
||||||
for (loop=0;loop<10;loop++)
|
|
||||||
if (((value=r_str(udpp_base)) & 0x80)!=0x00) {
|
|
||||||
w_ctr(udpp_base, 0x04);
|
|
||||||
return value & 0xf8;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (value & 0xf8) | 0x01;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
For the UMAX Astra 600P only seven such routines exist (well 14 really, seven
|
|
||||||
for SPP and seven for EPP). Whether you choose to disassemble the driver at
|
|
||||||
this point to verify the routines is your own choice. If you do, the address
|
|
||||||
from the trace should help in locating them in the disassembly.
|
|
||||||
|
|
||||||
You will probably then find it useful to write a script/perl/C program to
|
|
||||||
analyse the logfile and decode them futher as this can reveal higher level
|
|
||||||
grouping of the low level routines. For example from the logs from my UMAX
|
|
||||||
Astra 600P when decoded futher reveal (this is a small snippet)
|
|
||||||
|
|
||||||
|
|
||||||
start:
|
|
||||||
put: 55 8f
|
|
||||||
put: aa 8f
|
|
||||||
put: 00 8f
|
|
||||||
put: 00 8f
|
|
||||||
put: 00 8f
|
|
||||||
put: c2 8f
|
|
||||||
wait: ff
|
|
||||||
get: af,87
|
|
||||||
wait: ff
|
|
||||||
get: af,87
|
|
||||||
end: cc
|
|
||||||
start:
|
|
||||||
put: 55 8f
|
|
||||||
put: aa 8f
|
|
||||||
put: 00 8f
|
|
||||||
put: 03 8f
|
|
||||||
put: 05 8f
|
|
||||||
put: 84 8f
|
|
||||||
wait: ff
|
|
||||||
|
|
||||||
From this it is easy to see that put routine is often grouped together in five
|
|
||||||
successive calls sending information to the scanner. Once these are understood
|
|
||||||
it should be possible to process the logs further to show the higher level
|
|
||||||
routines in an easy to see format. Once the highest level format that you
|
|
||||||
can derive from this process is understood, you then need to produce a
|
|
||||||
series of scans varying only one parameter between them, so you can
|
|
||||||
discover how to set the various parameters for the scanner.
|
|
||||||
|
|
||||||
|
|
||||||
Jonathan Buzzard
|
|
||||||
<jab@hex.prestel.co.uk>
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------
|
|
||||||
The following is the shrink.c program.
|
|
||||||
EOF
|
|
||||||
cat > shrink.c <<EOF
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
void
|
|
||||||
main (void)
|
|
||||||
{
|
|
||||||
char buff[256], lastline[256];
|
|
||||||
int count;
|
|
||||||
|
|
||||||
count = 0;
|
|
||||||
lastline[0] = 0;
|
|
||||||
|
|
||||||
while (!feof (stdin))
|
|
||||||
{
|
|
||||||
fgets (buff, sizeof (buff), stdin);
|
|
||||||
if (strcmp (buff, lastline) == 0)
|
|
||||||
{
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (count > 1)
|
|
||||||
fprintf (stdout, "# Last line repeated %i times #\n", count);
|
|
||||||
fprintf (stdout, "%s", buff);
|
|
||||||
strcpy (lastline, buff);
|
|
||||||
count = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EOF
|
|
|
@ -1,123 +0,0 @@
|
||||||
Wine now needs to know about your keyboard layout. This requirement comes from
|
|
||||||
a need from many apps to have the correct scancodes available, since they read
|
|
||||||
these directly, instead of just taking the characters returned by the X server.
|
|
||||||
This means that Wine now needs to have a mapping from X keys to the scancodes
|
|
||||||
these applications expect.
|
|
||||||
|
|
||||||
On startup, Wine will try to recognize the active X layout by seeing if it
|
|
||||||
matches any of the defined tables. If it does, everything is allright. If not,
|
|
||||||
you need to define it.
|
|
||||||
|
|
||||||
To do this, open the file windows/x11drv/keyboard.c and take a look at the
|
|
||||||
existing tables. Make a backup copy of it, especially if you don't use CVS.
|
|
||||||
|
|
||||||
What you really would need to do, is to find out which scancode each key needs
|
|
||||||
to generate, find it in the main_key_scan table, which looks like this
|
|
||||||
|
|
||||||
static const int main_key_scan[MAIN_LEN] =
|
|
||||||
{
|
|
||||||
/* this is my (102-key) keyboard layout, sorry if it doesn't quite match yours */
|
|
||||||
0x29,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,
|
|
||||||
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,
|
|
||||||
0x1E,0x1F,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x2B,
|
|
||||||
0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,0x33,0x34,0x35,
|
|
||||||
0x56 /* the 102nd key (actually to the right of l-shift) */
|
|
||||||
};
|
|
||||||
|
|
||||||
and then assign each scancode the characters imprinted on the keycaps. This
|
|
||||||
was done (sort of) for the US 101-key keyboard, which you can find near the
|
|
||||||
top in keyboard.c. It also shows that if there is no 102nd key, you can skip
|
|
||||||
that.
|
|
||||||
|
|
||||||
However, for most international 102-key keyboards, we have done it easy for you.
|
|
||||||
The scancode layout for these already pretty much matches the physical layout
|
|
||||||
in the main_key_scan, so all you need to do is to go through all the keys that
|
|
||||||
generate characters on your main keyboard (except spacebar), and stuff those
|
|
||||||
into an appropriate table. The only exception is that the 102nd key, which is
|
|
||||||
usually to the left of the first key of the last line (usually Z), must be
|
|
||||||
placed on a separate line after the last line.
|
|
||||||
|
|
||||||
For example, my Norwegian keyboard looks like this
|
|
||||||
|
|
||||||
§ ! " # ¤ % & / ( ) = ? ` Back-
|
|
||||||
| 1 2@ 3£ 4$ 5 6 7{ 8[ 9] 0} + \´ space
|
|
||||||
|
|
||||||
Tab Q W E R T Y U I O P Å ^
|
|
||||||
¨~
|
|
||||||
Enter
|
|
||||||
Caps A S D F G H J K L Ø Æ *
|
|
||||||
Lock '
|
|
||||||
|
|
||||||
Sh- > Z X C V B N M ; : _ Shift
|
|
||||||
ift < , . -
|
|
||||||
|
|
||||||
Ctrl Alt Spacebar AltGr Ctrl
|
|
||||||
|
|
||||||
|
|
||||||
Note the 102nd key, which is the "<>" key, to the left of Z. The character
|
|
||||||
to the right of the main character is the character generated by AltGr.
|
|
||||||
|
|
||||||
This keyboard is defined as follows:
|
|
||||||
|
|
||||||
static const char main_key_NO[MAIN_LEN][4] =
|
|
||||||
{
|
|
||||||
"|§","1!","2\"@","3#£","4¤$","5%","6&","7/{","8([","9)]","0=}","+?","\\´",
|
|
||||||
"qQ","wW","eE","rR","tT","yY","uU","iI","oO","pP","åÅ","¨^~",
|
|
||||||
"aA","sS","dD","fF","gG","hH","jJ","kK","lL","øØ","æÆ","'*",
|
|
||||||
"zZ","xX","cC","vV","bB","nN","mM",",;",".:","-_",
|
|
||||||
"<>"
|
|
||||||
};
|
|
||||||
|
|
||||||
Except that " and \ needs to be quoted with a backslash, and that the 102nd
|
|
||||||
key is on a separate line, it's pretty straightforward.
|
|
||||||
|
|
||||||
After you have written such a table, you need to add it to the main_key_tab[]
|
|
||||||
layout index table. This will look like this:
|
|
||||||
|
|
||||||
static struct {
|
|
||||||
WORD lang, ansi_codepage, oem_codepage;
|
|
||||||
const char (*key)[MAIN_LEN][4];
|
|
||||||
} main_key_tab[]={
|
|
||||||
...
|
|
||||||
...
|
|
||||||
{MAKELANGID(LANG_NORWEGIAN,SUBLANG_DEFAULT), 1252, 865, &main_key_NO},
|
|
||||||
...
|
|
||||||
|
|
||||||
After you have added your table, recompile Wine and test that it works.
|
|
||||||
If it fails to detect your table, try running
|
|
||||||
|
|
||||||
wine -debugmsg +key,+keyboard >& key.log
|
|
||||||
|
|
||||||
and look in the resulting key.log file to find the error messages it
|
|
||||||
gives for your layout.
|
|
||||||
|
|
||||||
Note that the LANG_* and SUBLANG_* definitions are in include/winnls.h,
|
|
||||||
which you might need to know to find out which numbers your language
|
|
||||||
is assigned, and find it in the debugmsg output. The numbers will
|
|
||||||
be SUBLANG * 0x400 + LANG, so, for example the combination
|
|
||||||
LANG_NORWEGIAN (0x14) and SUBLANG_DEFAULT (0x1) will be (in hex)
|
|
||||||
14 + 1*400 = 414, so since I'm Norwegian, I could look for 0414 in
|
|
||||||
the debugmsg output to find out why my keyboard won't detect.
|
|
||||||
|
|
||||||
Once it works, submit it to the Wine project. If you use CVS, you
|
|
||||||
will just have to do
|
|
||||||
|
|
||||||
cvs -z3 diff -u windows/x11drv/keyboard.c > layout.diff
|
|
||||||
|
|
||||||
from your main Wine directory, then submit layout.diff to
|
|
||||||
wine-patches@winehq.com along with a brief note of what it is.
|
|
||||||
|
|
||||||
If you don't use CVS, you need to do
|
|
||||||
|
|
||||||
diff -u the_backup_file_you_made windows/x11drv/keyboard.c > layout.diff
|
|
||||||
|
|
||||||
and submit it as explained above.
|
|
||||||
|
|
||||||
If you did it right, it will be included in the next Wine release, and all
|
|
||||||
the troublesome applications (especially remote-control applications) and
|
|
||||||
games that use scancodes will be happily using your keyboard layout, and you
|
|
||||||
won't get those annoying fixme messages either.
|
|
||||||
|
|
||||||
Good luck.
|
|
||||||
|
|
||||||
-Ove Kåven <ovek@arcticnet.no>
|
|
|
@ -1,82 +0,0 @@
|
||||||
ADDING LANGUAGES TO WINE
|
|
||||||
|
|
||||||
This file documents the necessary procedure for adding a new language
|
|
||||||
to the list of languages that Wine can display system menus and forms
|
|
||||||
in. Currently at least the following languages are still missing:
|
|
||||||
Bulgarian, Chinese, Greek, Icelandic, Japanese, Romanian,
|
|
||||||
Croatian, Slovak, Turkish, and Slovanian.
|
|
||||||
|
|
||||||
To add a new language you need to be able to translate the relatively
|
|
||||||
few texts, of course. You will need very little knowledge of
|
|
||||||
programming, so you have almost no excuses for not adding your language,
|
|
||||||
right? We should easily be able to support 20 languages within a few
|
|
||||||
months, get going! Apart from re-compilation it'll take you about an
|
|
||||||
hour or two.
|
|
||||||
|
|
||||||
To add a new language to the list of languages that Wine can handle
|
|
||||||
you must...
|
|
||||||
|
|
||||||
0. Find the language ID in include/winnls.h .
|
|
||||||
|
|
||||||
1. Look in ole/ole2nls.c if your language is already incorporated in
|
|
||||||
the "static const struct NLS_langlocale". If not: find the
|
|
||||||
appropriate entries in include/winnls.h and add them to the list.
|
|
||||||
|
|
||||||
2. Edit the parameters defined in ole/nls/*.nls to fit your local
|
|
||||||
habits and language.
|
|
||||||
|
|
||||||
3. Edit documentation/wine.man.in (search for -language) to show the new
|
|
||||||
language abbreviation.
|
|
||||||
|
|
||||||
4. Edit misc/main.c variable "Languages" to contain the new language
|
|
||||||
abbreviation and language ID. Also edit struct "option_table" in
|
|
||||||
misc/options.c to show the new abbreviation.
|
|
||||||
|
|
||||||
5. Edit include/options.h enum "WINE_LANGUAGE" to have a member called
|
|
||||||
LANG_XX where XX is the new abbreviation.
|
|
||||||
|
|
||||||
6. Create a new file dlls/commdlg/cdlg_XX.rc (where XX is your language
|
|
||||||
abbreviation) containing all menus.
|
|
||||||
Your best bet is to copy cdlg_En.rc and start translating.
|
|
||||||
There is no real need to know how the internal structure of the file,
|
|
||||||
as you only need to translate the text within quotes.
|
|
||||||
|
|
||||||
In menus, the character "&" means that the next character will
|
|
||||||
be highlighted and that pressing that letter will select the item.
|
|
||||||
You should place these "&"s suitably for your language, not just
|
|
||||||
copy the positions from (say) English. In particular, items within
|
|
||||||
one menu should have different highlighted letters.
|
|
||||||
|
|
||||||
7. Edit dlls/commdlg/rsrc.rc to contain an include statement for your
|
|
||||||
cdlg_XX.rc file.
|
|
||||||
|
|
||||||
8. Repeat steps 6 and 7 again for:
|
|
||||||
- dlls/shell32/shell32_XX.rc and shres.rc
|
|
||||||
- resources/sysres_XX.rc and user32.rc
|
|
||||||
|
|
||||||
9. Re-configure, re-make dependencies, and re-make Wine.
|
|
||||||
|
|
||||||
10. Check your new menus and forms; when they're not ok,
|
|
||||||
go back to 6) and adapt the sizes, etc.
|
|
||||||
|
|
||||||
11. Several of the winelib based programs in the subdirectory programs
|
|
||||||
also have internationalisation support. See the appropriate files
|
|
||||||
there for reference.
|
|
||||||
|
|
||||||
12. Edit /documentation/internationalisation to show the new status.
|
|
||||||
|
|
||||||
13. Submit patches for inclusion in the next Wine release,
|
|
||||||
see file ./ANNOUNCE for details about where to submit.
|
|
||||||
|
|
||||||
|
|
||||||
January 1996
|
|
||||||
Morten Welinder
|
|
||||||
|
|
||||||
[I hope I got all the places where changes are needed. If you see any
|
|
||||||
place missing from the above list, submit a patch to this file please.
|
|
||||||
Also note that re-organization of the source code might change the list
|
|
||||||
of places.]
|
|
||||||
|
|
||||||
Therefore revised Februari 1999 by Klaas van Gend
|
|
||||||
Revised again May 23, 1999, Klaas van Gend
|
|
||||||
Updated May 26, 2000, Zoran Dzelajlija
|
|
|
@ -1,137 +0,0 @@
|
||||||
This document describes how FAT and VFAT file system permissions work
|
|
||||||
in Linux with a focus on configuring them for Wine.
|
|
||||||
|
|
||||||
Introduction
|
|
||||||
------------
|
|
||||||
Linux is able to access DOS and Windows file systems using either the
|
|
||||||
FAT (older 8.3 DOS filesystems) or VFAT (newer Windows 95 or later
|
|
||||||
long filename filesystems) modules. Mounted FAT or VFAT filesystems
|
|
||||||
provide the primary means for which existing applications and their
|
|
||||||
data are accessed through Wine for dual boot (Linux + Windows)
|
|
||||||
systems.
|
|
||||||
|
|
||||||
Wine maps mounted FAT filesystems, such as "/c", to driver letters,
|
|
||||||
such as "c:", as indicated by the wine.conf file. The following
|
|
||||||
excerpt from a wine.conf file does this:
|
|
||||||
[Drive C]
|
|
||||||
Path=/c
|
|
||||||
Type=hd
|
|
||||||
|
|
||||||
Although VFAT filesystems are preferable to FAT filesystems for their
|
|
||||||
long filename support the term "FAT" will be used throughout the
|
|
||||||
remainder of this document to refer to FAT filesystems and their
|
|
||||||
derivatives. Also, "/c" will be used as the FAT mount point in
|
|
||||||
examples throughout this document.
|
|
||||||
|
|
||||||
Most modern Linux distributions either detect or allow existing FAT
|
|
||||||
file systems to be configured so that can be mounted, in a location
|
|
||||||
such as /c, either persistently (on bootup) or on an as needed basis.
|
|
||||||
In either case, by default, the permissions will probably be configured
|
|
||||||
so that they look something like:
|
|
||||||
~>cd /c
|
|
||||||
/c>ls -l
|
|
||||||
-rwxr-xr-x 1 root root 91 Oct 10 17:58 autoexec.bat
|
|
||||||
-rwxr-xr-x 1 root root 245 Oct 10 17:58 config.sys
|
|
||||||
drwxr-xr-x 41 root root 16384 Dec 30 1998 windows
|
|
||||||
where all the files are owned by "root", are in the "root" group and
|
|
||||||
are only writable by "root" (755 permissions). This is restrictive in
|
|
||||||
that it requires that Wine be run as root in order for applications to
|
|
||||||
be able to write to any part of the filesystem.
|
|
||||||
|
|
||||||
There three major approaches to overcoming the restrictive permissions
|
|
||||||
mentioned in the previous paragraph:
|
|
||||||
1) Run Wine as root
|
|
||||||
2) Mount the FAT filesystem with less restrictive permissions
|
|
||||||
3) Shadow the FAT filesystem by completely or partially copying it
|
|
||||||
Each approach will be discusses in the following "Running Wine as
|
|
||||||
root", "Mounting FAT filesystems" and "Shadowing FAT filesystems"
|
|
||||||
sections.
|
|
||||||
|
|
||||||
Running Wine as root
|
|
||||||
--------------------
|
|
||||||
Running Wine as root is the easiest and most thorough way of giving
|
|
||||||
applications that Wine runs unrestricted access to FAT files systems.
|
|
||||||
Running wine as root also allows applications to do things unrelated
|
|
||||||
to FAT filesystems, such as listening to ports that are less than
|
|
||||||
1024. Running Wine as root is dangerous since there is no limit to
|
|
||||||
what the application can do to the system.
|
|
||||||
|
|
||||||
Mounting FAT filesystems
|
|
||||||
------------------------
|
|
||||||
The FAT filesystem can be mounted with permissions less restrictive
|
|
||||||
than the default. This can be done by either changing the user that
|
|
||||||
mounts the FAT filesystem or by explicitly changing the permissions
|
|
||||||
that the FAT filesystem is mounted with. The permissions are
|
|
||||||
inherited from the process that mounts the FAT filesystem. Since the
|
|
||||||
process that mounts the FAT filesystem is usually a startup script
|
|
||||||
running as root the FAT filesystem inherits root's permissions. This
|
|
||||||
results in the files on the FAT filesystem having permissions similar
|
|
||||||
to files created by root. For example:
|
|
||||||
~>whoami
|
|
||||||
root
|
|
||||||
~>touch root_file
|
|
||||||
~>ls -l root_file
|
|
||||||
-rw-r--r-- 1 root root 0 Dec 10 00:20 root_file
|
|
||||||
|
|
||||||
which matches the owner, group and permissions of files seen on the
|
|
||||||
FAT filesystem except for the missing 'x's. The permissions on the
|
|
||||||
FAT filesystem can be changed by changing root's umask (unset
|
|
||||||
permissions bits). For example:
|
|
||||||
~>umount /c
|
|
||||||
~>umask
|
|
||||||
022
|
|
||||||
~>umask 073
|
|
||||||
~>mount /c
|
|
||||||
~>cd /c
|
|
||||||
/c>ls -l
|
|
||||||
-rwx---r-- 1 root root 91 Oct 10 17:58 autoexec.bat
|
|
||||||
-rwx---r-- 1 root root 245 Oct 10 17:58 config.sys
|
|
||||||
drwx---r-- 41 root root 16384 Dec 30 1998 windows
|
|
||||||
Mounting the FAT filesystem with a umask of 000 gives all users
|
|
||||||
complete control over the it.
|
|
||||||
Explicitly specifying the permissions of the FAT filesystem when it is
|
|
||||||
mounted provides additional control. There are three mount options
|
|
||||||
that are relevant to FAT permissions: "uid", "gid" and "umask". They
|
|
||||||
can each be specified when the filesystem is manually mounted. For
|
|
||||||
example:
|
|
||||||
~>umount /c
|
|
||||||
~>mount -o uid=500 -o gid=500 -o umask=002 /c
|
|
||||||
~>cd /c
|
|
||||||
/c>ls -l
|
|
||||||
-rwxrwxr-x 1 sle sle 91 Oct 10 17:58 autoexec.bat
|
|
||||||
-rwxrwxr-x 1 sle sle 245 Oct 10 17:58 config.sys
|
|
||||||
drwxrwxr-x 41 sle sle 16384 Dec 30 1998 windows
|
|
||||||
which gives "sle" complete control over /c. The options listed above
|
|
||||||
can be made permanent by adding them to the /etc/fstab file:
|
|
||||||
~>grep /c /etc/fstab
|
|
||||||
/dev/hda1 /c vfat uid=500,gid=500,umask=002,exec,dev,suid,rw 1 1
|
|
||||||
Note that the umask of 002 is common in the user private group file
|
|
||||||
permission scheme. On FAT file systems this umask assures that all
|
|
||||||
files are fully accessible by all users in the specified group (gid).
|
|
||||||
|
|
||||||
Shadowing FAT filesystems
|
|
||||||
-------------------------
|
|
||||||
Shadowing provides a finer granularity of control. Parts of the
|
|
||||||
original FAT filesystem can be copied so that the application can
|
|
||||||
safely work with those copied parts while the application continue to
|
|
||||||
directly read the remaining parts. This is done with symbolic links.
|
|
||||||
For example, consider a system where an application named "AnApp" must
|
|
||||||
be able to read and write to the c:\windows and c:\AnApp directories
|
|
||||||
as well as have read access to the entire FAT filesystem. On this
|
|
||||||
system the FAT filesystem has default permissions which should not be
|
|
||||||
changed for security reasons or can not be changed due to lack of root
|
|
||||||
access. On this system a shadow directory might be set up in the
|
|
||||||
following manner:
|
|
||||||
~>cd /
|
|
||||||
/>mkdir c_shadow
|
|
||||||
/>cd c_shadow
|
|
||||||
/c_shadow>ln -s /c_/* .
|
|
||||||
/c_shadow>rm windows AnApp
|
|
||||||
/c_shadow>cp -R /c_/{windows,AnApp} .
|
|
||||||
/c_shadow>chmod -R 777 windows AnApp
|
|
||||||
/c_shadow>perl -p -i -e 's|/c$|/c_shadow|g' /usr/local/etc/wine.conf
|
|
||||||
The above gives everyone complete read and write access to the
|
|
||||||
"windows" and "AnApp" directories while only root has write access to
|
|
||||||
all other directories.
|
|
||||||
---
|
|
||||||
Steven Elliott (elliotsl@mindspring.com)
|
|
|
@ -1,68 +0,0 @@
|
||||||
Wine without Windows
|
|
||||||
====================
|
|
||||||
|
|
||||||
A major goal of Wine is to allow users to run Windows programs without
|
|
||||||
having to install Windows on their machine. Wine implements the
|
|
||||||
functionality of the main DLL's usually provided with Windows.
|
|
||||||
Therefore, once Wine is finished, you will not need to have windows
|
|
||||||
installed to use Wine.
|
|
||||||
|
|
||||||
Wine has already made enough progress that it may be possible to run
|
|
||||||
your target applications without Windows installed. If you want to try
|
|
||||||
it, follow these steps:
|
|
||||||
|
|
||||||
1. Create empty C:\windows, C:\windows\system, C:\windows\Start Menu,
|
|
||||||
and C:\windows\Start Menu\Programs directories.
|
|
||||||
Do not point Wine to a Windows directory full of old installations
|
|
||||||
and a messy registry. (Wine creates a special registry in your home
|
|
||||||
directory, in $HOME/.wine/*.reg. Perhaps you have to remove these
|
|
||||||
files).
|
|
||||||
|
|
||||||
2. Point [Drive C] in wine.conf or .winerc to where you want C: to be.
|
|
||||||
Refer to the Wine man page for more information. Remember to use
|
|
||||||
filesystem=win95 !
|
|
||||||
|
|
||||||
3. Use tools/wineinstall to compile Wine and install the default
|
|
||||||
registry. Or if you prefer to do it yourself, compile programs/regapi,
|
|
||||||
and run: programs/regapi/regapi setValue < winedefault.reg
|
|
||||||
|
|
||||||
4. Run and/or install your applications.
|
|
||||||
|
|
||||||
|
|
||||||
Because Wine is not yet complete, some programs will work better
|
|
||||||
with native Windows DLL's than with Wine's replacements. Wine has been
|
|
||||||
designed to make this possible. Here are some tips by Juergen Schmied
|
|
||||||
(and others) on how to proceed. This assumes that your C:\windows
|
|
||||||
directory in the configuration file does not point to a native Windows
|
|
||||||
installation but is in a separate Unix file system. (For instance,
|
|
||||||
"C:\windows" is really subdirectory "windows" located in
|
|
||||||
"/home/ego/wine/drives/c").
|
|
||||||
|
|
||||||
- Run the application with --debugmsg +module,+file to find out
|
|
||||||
which files are needed. Copy the required DLL's one by one to the
|
|
||||||
C:\windows\system directory. Do not copy KERNEL/KERNEL32, GDI/GDI32,
|
|
||||||
or USER/USER32. These implement the core functionality of the
|
|
||||||
Windows API, and the Wine internal versions must be used.
|
|
||||||
|
|
||||||
- Edit the [DllOverrides] section of wine.conf or .winerc to specify
|
|
||||||
'native' before 'builtin' for the Windows DLL's you want to use.
|
|
||||||
For more information about this, see the Wine manpage.
|
|
||||||
|
|
||||||
- Note that some network DLL's are not needed even though Wine is
|
|
||||||
looking for them. The Windows MPR.DLL currently does not work; you
|
|
||||||
must use the internal implementation.
|
|
||||||
|
|
||||||
- Copy SHELL/SHELL32 and COMDLG/COMDLG32 COMMCTRL/COMCTL32
|
|
||||||
only as pairs to your Wine directory (these DLL's are
|
|
||||||
"clean" to use). Make sure you have these specified in the
|
|
||||||
[DllPairs] section of wine.conf or .winerc.
|
|
||||||
|
|
||||||
- Be consistent: Use only DLL's from the same Windows version
|
|
||||||
together.
|
|
||||||
|
|
||||||
- Put regedit.exe in the C:\windows directory (office95 imports
|
|
||||||
a *.reg file when it runs with a empty registry, don't know
|
|
||||||
about office97).
|
|
||||||
|
|
||||||
- Also add winhelp.exe and winhlp32.exe if you want to be able to browse
|
|
||||||
through your programs' help function.
|
|
|
@ -1,270 +0,0 @@
|
||||||
I What is needed to have OpenGL support in Wine
|
|
||||||
===============================================
|
|
||||||
|
|
||||||
Basically, if you have a Linux OpenGL ABI compliant libGL
|
|
||||||
(http://oss.sgi.com/projects/ogl-sample/ABI/) installed on your
|
|
||||||
computer, you should everything that is needed.
|
|
||||||
|
|
||||||
To be more clear, I will detail one step after another what the
|
|
||||||
configure script checks.
|
|
||||||
|
|
||||||
If, after Wine compiles, OpenGL support is not compiled in, you can
|
|
||||||
always check 'config.log' to see which of the following points failed.
|
|
||||||
|
|
||||||
I.1 Header files
|
|
||||||
----------------
|
|
||||||
|
|
||||||
The needed header files to build OpenGL support in Wine are :
|
|
||||||
|
|
||||||
- gl.h : the definition of all OpenGL core functions, types and
|
|
||||||
enumerants
|
|
||||||
|
|
||||||
- glx.h : how OpenGL integrates in the X Window environment
|
|
||||||
|
|
||||||
- glext.h : the list of all registered OpenGL extensions
|
|
||||||
|
|
||||||
The latter file (glext.h) is, as of now, not necessary to build
|
|
||||||
Wine. But as this file can be easily obtained from SGI
|
|
||||||
(http://oss.sgi.com/projects/ogl-sample/ABI/glext.h), and that all
|
|
||||||
OpenGL should provide one, I decided to keep it here.
|
|
||||||
|
|
||||||
|
|
||||||
I.2 OpenGL library thread-safety
|
|
||||||
--------------------------------
|
|
||||||
|
|
||||||
After that, the script checks if the OpenGL library relies or not on
|
|
||||||
the pthread library to provide thread safety (most 'modern' OpenGL
|
|
||||||
libraries do).
|
|
||||||
|
|
||||||
If the OpenGL library explicitely links in libpthread (you can check
|
|
||||||
it with a 'ldd libGL.so'), you need to force OpenGL support by
|
|
||||||
starting configure with the '--enable-opengl' flag.
|
|
||||||
|
|
||||||
The reason to this is that Wine contains some hacks done by Ove to
|
|
||||||
cohabit with pthread that are known to work well in most of the cases
|
|
||||||
(glibc 2.1.x). On the other hand, we never got Wine to work with glibc
|
|
||||||
2.0.6. Thus, I deemed preferable to play it safe : by default, I
|
|
||||||
suppose that the hack won't work and that it's the user's
|
|
||||||
responsability to enable it.
|
|
||||||
|
|
||||||
Anyway, it should be pretty safe to build with '--enable-opengl'.
|
|
||||||
|
|
||||||
|
|
||||||
I.3 OpenGL library itself
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
To check for the presence of 'libGL' on the system, the script checks
|
|
||||||
if it defines the 'glXCreateContext' function. There should be no
|
|
||||||
problem here.
|
|
||||||
|
|
||||||
|
|
||||||
I.4 glXGetProcAddressARB function
|
|
||||||
---------------------------------
|
|
||||||
|
|
||||||
The core of Wine's OpenGL implementation (at least for all extensions)
|
|
||||||
is the glXGetProcAddressARB function. Your OpenGL library needs to
|
|
||||||
have this function defined for Wine to be able to support OpenGL.
|
|
||||||
|
|
||||||
If your library does not provide it, you are out of luck.
|
|
||||||
|
|
||||||
(Note: this is not completely true as one could rewrite a
|
|
||||||
glXGetProcAddressARB replacement using 'dlopen' and friends,
|
|
||||||
but well, telling people to upgrade is easier :-) ).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
II How to configure
|
|
||||||
===================
|
|
||||||
|
|
||||||
Configuration is quite easy : once OpenGL support has been built in
|
|
||||||
Wine, this internal OpenGL driver will be used each time an
|
|
||||||
application tries to load 'opengl32.dll'.
|
|
||||||
|
|
||||||
Due to restrictions (that do not exist in Windows) on OpenGL contexts,
|
|
||||||
if you want to prevent the screen to flicker when using OpenGL
|
|
||||||
applications (all games are using double-buffered contexts), you need
|
|
||||||
to set the following option in your .winerc / wine.ini in the [x11drv]
|
|
||||||
section :
|
|
||||||
|
|
||||||
DesktopDoubleBuffered = Y
|
|
||||||
|
|
||||||
and to run Wine with the '--desktop' option.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
III How it all works
|
|
||||||
====================
|
|
||||||
|
|
||||||
The core OpenGL function calls are the same between Windows and
|
|
||||||
Linux. So what is the difficulty to support it in Wine ? Well, there
|
|
||||||
is two different problems :
|
|
||||||
|
|
||||||
- the interface to the windowing system is different for each
|
|
||||||
OS. It's called 'GLX' for Linux (well, for X Window) and 'wgl' for
|
|
||||||
Windows. Thus, one need first to emulate one (wgl) with the other
|
|
||||||
(GLX).
|
|
||||||
|
|
||||||
- the calling convention between Windows (the 'Pascal' convention or
|
|
||||||
'stdcall') is different from the one used on Linux (the 'C'
|
|
||||||
convention or 'cdecl'). This means that each call to an OpenGL
|
|
||||||
function must be 'translated' and cannot be used directly by the
|
|
||||||
Windows program.
|
|
||||||
|
|
||||||
Add to this some braindead programs (using GL calls without setting-up
|
|
||||||
a context or deleting three time the same context) and you have still
|
|
||||||
some work to do :-)
|
|
||||||
|
|
||||||
|
|
||||||
III.1 The Windowing system integration
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
This integration is done at two levels :
|
|
||||||
|
|
||||||
- at GDI level for all pixel format selection routines (ie choosing
|
|
||||||
if one wants a depth / alpha buffer, the size of these buffers,
|
|
||||||
...) and to do the 'page flipping' in double buffer mode. This is
|
|
||||||
implemented in 'graphics/x11drv/opengl.c' (all these functions are
|
|
||||||
part of Wine's graphic driver function pointer table and thus could
|
|
||||||
be reimplented if ever Wine works on another Windowing system than
|
|
||||||
X).
|
|
||||||
|
|
||||||
- in the OpenGL32.DLL itself for all other functionalities (context
|
|
||||||
creation / deletion, querying of extension functions, ...). This is
|
|
||||||
done in 'dlls/opengl32/wgl.c'.
|
|
||||||
|
|
||||||
|
|
||||||
III.2 The thunks
|
|
||||||
----------------
|
|
||||||
|
|
||||||
The thunks are the Wine code that does the calling convention
|
|
||||||
translation and they are auto-generated by a Perl script. In Wine's
|
|
||||||
CVS tree, these thunks are already generated for you. Now, if you want
|
|
||||||
to do it yourself, there is how it all works....
|
|
||||||
|
|
||||||
The script is located in dlls/opengl32 and is called 'make_opengl'. It
|
|
||||||
requires Perl5 to work and takes two arguments :
|
|
||||||
|
|
||||||
- the first is the path to the OpenGL registry. Now, you will all ask
|
|
||||||
'but what is the OpenGL registry ?' :-) Well, it's part of the
|
|
||||||
OpenGL sample implementation source tree from SGI (more
|
|
||||||
informations at this URL : http://oss.sgi.com/projects/ogl-sample/).
|
|
||||||
|
|
||||||
To summarize, these files contains human-readable but easily parsed
|
|
||||||
informations on ALL OpenGL core functions and ALL registered
|
|
||||||
extensions (for example the prototype, the OpenGL version, ...).
|
|
||||||
|
|
||||||
- the second is the OpenGL version to 'simulate'. This fixes the list
|
|
||||||
of functions that the Windows application can link directly to
|
|
||||||
without having to query them from the OpenGL driver. Windows is
|
|
||||||
based, for now, on OpenGL 1.1, but the thunks that are in the CVS
|
|
||||||
tree are generated for OpenGL 1.2.
|
|
||||||
|
|
||||||
This option can have three values '1.0', '1.1' and '1.2'.
|
|
||||||
|
|
||||||
This script generates three files :
|
|
||||||
|
|
||||||
- opengl32.spec gives Wine's linker the signature of all function in
|
|
||||||
the OpenGL32.DLL library so that the application can link
|
|
||||||
them. Only 'core' functions are listed here.
|
|
||||||
|
|
||||||
- opengl_norm.c contains all the thunks for the 'core'
|
|
||||||
functions. Your OpenGL library must provide ALL the function used
|
|
||||||
in this file as these are not queried at run time.
|
|
||||||
|
|
||||||
- opengl_ext.c contains all the functions that are not part of the
|
|
||||||
'core' functions. Contrary to the thunks in opengl_norm.c, these
|
|
||||||
functions do not depend at all on what your libGL provides.
|
|
||||||
|
|
||||||
In fact, before using one of these thunks, the Windows program
|
|
||||||
first needs to 'query' the function pointer. At this point, the
|
|
||||||
corresponding thunk is useless. But as we first query the same
|
|
||||||
function in libGL and store the returned function pointer in the
|
|
||||||
thunk, the latter becomes functional.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
IV Known problems - shortcomings
|
|
||||||
=================================
|
|
||||||
|
|
||||||
IV.1 Missing GLU32.DLL
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
GLU is a library that is layered upon OpenGL. There is a 100 %
|
|
||||||
corespondance between the libGLU.so that is used on Linux and
|
|
||||||
GLU32.DLL.
|
|
||||||
|
|
||||||
As for the moment, I did not create a set of thunks to support this
|
|
||||||
library natively in Wine (it would easy to do, but I am waiting for a
|
|
||||||
better solution than adding another autogenerated thunk file), you can
|
|
||||||
always download anywhere on the net (it's free) a GLU32.DLL file (by
|
|
||||||
browsing, for example, http://ftpsearch.lycos.com/).
|
|
||||||
|
|
||||||
|
|
||||||
IV.2 OpenGL not detected at configure time
|
|
||||||
------------------------------------------
|
|
||||||
|
|
||||||
See section (I) for a detailed explanation of the configure
|
|
||||||
requirements.
|
|
||||||
|
|
||||||
|
|
||||||
IV.3 When running an OpenGL application, the screen flickers
|
|
||||||
------------------------------------------------------------
|
|
||||||
|
|
||||||
See section (II) for how to create the context double-buffered and
|
|
||||||
thus preventing this flicker effect.
|
|
||||||
|
|
||||||
|
|
||||||
IV.4 Wine gives me the following error message :
|
|
||||||
------------------------------------------------
|
|
||||||
Extension defined in the OpenGL library but NOT in opengl_ext.c... Please report
|
|
||||||
(lionel.ulmer@free.fr) !
|
|
||||||
|
|
||||||
This means that the extension requested by the application is found in
|
|
||||||
the libGL used by Linux (ie the call to glXGetProcAddressARB returns a
|
|
||||||
non NULL pointer) but that this string was NOT found in Wine's
|
|
||||||
extension registry.
|
|
||||||
|
|
||||||
This can come from two causes :
|
|
||||||
|
|
||||||
- the opengl_ext.c file is too old and need to be generated again.
|
|
||||||
|
|
||||||
- use of obsolete extensions that are not supported anymore by SGI or
|
|
||||||
of 'private' extensions that are not registered. An example of the
|
|
||||||
former are 'glMTexCoord2fSGIS' and 'glSelectTextureSGIS' as used by
|
|
||||||
Quake 2 (and apparently also by old versions of Half Life). If
|
|
||||||
documentation can be found on these functions, they can be added to
|
|
||||||
Wine's extension set.
|
|
||||||
|
|
||||||
If you have this, run with --debugmsg +opengl and send me
|
|
||||||
(lionel.ulmer@free.fr) the TRACE.
|
|
||||||
|
|
||||||
|
|
||||||
IV.5 libopengl32.so is built but it is still not working
|
|
||||||
--------------------------------------------------------
|
|
||||||
|
|
||||||
This may be caused by some missing functions required by opengl_norm.c
|
|
||||||
but that your Linux OpenGL library does not provide.
|
|
||||||
|
|
||||||
To check for this, do the following steps :
|
|
||||||
|
|
||||||
- create a dummy .c file :
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
- try to compile it by linking both libwine and libopengl32 (this
|
|
||||||
command line supposes that you installed the Wine libraries in
|
|
||||||
/usr/local/lib, YMMV) :
|
|
||||||
|
|
||||||
gcc dummy.c -L/usr/local/lib -lwine -lopengl32
|
|
||||||
|
|
||||||
- if it works, the problem is somewhere else (and you can send me an
|
|
||||||
email). If not, you could re-generate the thunk files for OpenGL
|
|
||||||
1.1 for example (and send me your OpenGL version so that this
|
|
||||||
problem can be detected at configure time).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Lionel Ulmer (lionel.ulmer@free.fr)
|
|
||||||
last modification : 2000/06/13
|
|
|
@ -0,0 +1,458 @@
|
||||||
|
<chapter id="opengl">
|
||||||
|
<title>Wine and OpenGL</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by Lionel Ulmer <lionel.ulmer@free.fr>, last modification : 2000/06/13
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/opengl</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect1 id="opengl-required">
|
||||||
|
<title>I What is needed to have OpenGL support in Wine</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Basically, if you have a Linux OpenGL ABI compliant libGL
|
||||||
|
(<ulink url="http://oss.sgi.com/projects/ogl-sample/ABI/">
|
||||||
|
http://oss.sgi.com/projects/ogl-sample/ABI/</ulink>)
|
||||||
|
installed on your computer, you should everything that is
|
||||||
|
needed.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
To be more clear, I will detail one step after another what
|
||||||
|
the <command>configure</command> script checks.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
If, after Wine compiles, OpenGL support is not compiled in,
|
||||||
|
you can always check <filename>config.log</filename> to see
|
||||||
|
which of the following points failed.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>I.1 Header files</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The needed header files to build OpenGL support in Wine are :
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>gl.h:</filename></term>
|
||||||
|
<listitem>
|
||||||
|
<para>the definition of all OpenGL core functions, types and enumerants</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>glx.h:</filename></term>
|
||||||
|
<listitem>
|
||||||
|
<para>how OpenGL integrates in the X Window environment</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>glext.h:</filename></term>
|
||||||
|
<listitem>
|
||||||
|
<para>the list of all registered OpenGL extensions</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The latter file (<filename>glext.h</filename>) is, as of
|
||||||
|
now, not necessary to build Wine. But as this file can be
|
||||||
|
easily obtained from SGI
|
||||||
|
(<ulink url="http://oss.sgi.com/projects/ogl-sample/ABI/glext.h">
|
||||||
|
http://oss.sgi.com/projects/ogl-sample/ABI/glext.h</ulink>),
|
||||||
|
and that all OpenGL should provide one, I decided to keep it here.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>I.2 OpenGL library thread-safety</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
After that, the script checks if the OpenGL library relies
|
||||||
|
or not on the pthread library to provide thread safety (most
|
||||||
|
'modern' OpenGL libraries do).
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
If the OpenGL library explicitely links in libpthread (you
|
||||||
|
can check it with a <command>ldd libGL.so</command>), you
|
||||||
|
need to force OpenGL support by starting
|
||||||
|
<command>configure</command> with the
|
||||||
|
<parameter>--enable-opengl</parameter> flag.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The reason to this is that Wine contains some hacks done by
|
||||||
|
Ove to cohabit with pthread that are known to work well in
|
||||||
|
most of the cases (glibc 2.1.x). On the other hand, we never
|
||||||
|
got Wine to work with glibc 2.0.6. Thus, I deemed preferable
|
||||||
|
to play it safe : by default, I suppose that the hack won't
|
||||||
|
work and that it's the user's responsability to enable it.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Anyway, it should be pretty safe to build with
|
||||||
|
<parameter>--enable-opengl</parameter>.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>I.3 OpenGL library itself</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
To check for the presence of 'libGL' on the system, the
|
||||||
|
script checks if it defines the
|
||||||
|
<function>glXCreateContext</function> function. There should
|
||||||
|
be no problem here.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>I.4 glXGetProcAddressARB function</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The core of Wine's OpenGL implementation (at least for all
|
||||||
|
extensions) is the <function>glXGetProcAddressARB</function>
|
||||||
|
function. Your OpenGL library needs to have this function
|
||||||
|
defined for Wine to be able to support OpenGL.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
If your library does not provide it, you are out of luck.
|
||||||
|
</para>
|
||||||
|
<note>
|
||||||
|
<para>
|
||||||
|
this is not completely true as one could rewrite a
|
||||||
|
<function>glXGetProcAddressARB</function> replacement
|
||||||
|
using <function>dlopen</function> and friends, but well,
|
||||||
|
telling people to upgrade is easier :-).
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="opengl-configure">
|
||||||
|
<title>II How to configure</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Configuration is quite easy : once OpenGL support has been
|
||||||
|
built in Wine, this internal OpenGL driver will be used each
|
||||||
|
time an application tries to load
|
||||||
|
<filename>opengl32.dll</filename>.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Due to restrictions (that do not exist in Windows) on OpenGL
|
||||||
|
contexts, if you want to prevent the screen to flicker when
|
||||||
|
using OpenGL applications (all games are using double-buffered
|
||||||
|
contexts), you need to set the following option in your
|
||||||
|
<filename>.winerc</filename> / <filename>wine.ini</filename>
|
||||||
|
in the [x11drv] section :
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
DesktopDoubleBuffered = Y
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
and to run Wine with the <parameter>--desktop</parameter>
|
||||||
|
option.
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="opengl-works">
|
||||||
|
<title>III How it all works</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The core OpenGL function calls are the same between Windows
|
||||||
|
and Linux. So what is the difficulty to support it in Wine ?
|
||||||
|
Well, there are two different problems :
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
the interface to the windowing system is different for
|
||||||
|
each OS. It's called 'GLX' for Linux (well, for X Window)
|
||||||
|
and 'wgl' for Windows. Thus, one need first to emulate one
|
||||||
|
(wgl) with the other (GLX).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
the calling convention between Windows (the 'Pascal'
|
||||||
|
convention or 'stdcall') is different from the one used on
|
||||||
|
Linux (the 'C' convention or 'cdecl'). This means that
|
||||||
|
each call to an OpenGL function must be 'translated' and
|
||||||
|
cannot be used directly by the Windows program.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Add to this some braindead programs (using GL calls without
|
||||||
|
setting-up a context or deleting three time the same context)
|
||||||
|
and you have still some work to do :-)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>III.1 The Windowing system integration</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This integration is done at two levels :
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
At GDI level for all pixel format selection routines (ie
|
||||||
|
choosing if one wants a depth / alpha buffer, the size
|
||||||
|
of these buffers, ...) and to do the 'page flipping' in
|
||||||
|
double buffer mode. This is implemented in
|
||||||
|
<filename>graphics/x11drv/opengl.c</filename> (all these
|
||||||
|
functions are part of Wine's graphic driver function
|
||||||
|
pointer table and thus could be reimplented if ever Wine
|
||||||
|
works on another Windowing system than X).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
In the <filename>OpenGL32.DLL</filename> itself for all
|
||||||
|
other functionalities (context creation / deletion,
|
||||||
|
querying of extension functions, ...). This is done in
|
||||||
|
<filename>dlls/opengl32/wgl.c</filename>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>III.2 The thunks</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The thunks are the Wine code that does the calling
|
||||||
|
convention translation and they are auto-generated by a Perl
|
||||||
|
script. In Wine's CVS tree, these thunks are already
|
||||||
|
generated for you. Now, if you want to do it yourself, there
|
||||||
|
is how it all works....
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The script is located in <filename>dlls/opengl32</filename>
|
||||||
|
and is called <command>make_opengl</command>. It requires
|
||||||
|
Perl5 to work and takes two arguments :
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
The first is the path to the OpenGL registry. Now, you
|
||||||
|
will all ask 'but what is the OpenGL registry ?' :-)
|
||||||
|
Well, it's part of the OpenGL sample implementation
|
||||||
|
source tree from SGI (more informations at this URL :
|
||||||
|
<ulink url="http://oss.sgi.com/projects/ogl-sample/">
|
||||||
|
http://oss.sgi.com/projects/ogl-sample/</ulink>.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
To summarize, these files contain human-readable but
|
||||||
|
easily parsed information on ALL OpenGL core functions
|
||||||
|
and ALL registered extensions (for example the
|
||||||
|
prototype, the OpenGL version, ...).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
the second is the OpenGL version to 'simulate'. This
|
||||||
|
fixes the list of functions that the Windows application
|
||||||
|
can link directly to without having to query them from
|
||||||
|
the OpenGL driver. Windows is based, for now, on OpenGL
|
||||||
|
1.1, but the thunks that are in the CVS tree are
|
||||||
|
generated for OpenGL 1.2.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
This option can have three values:
|
||||||
|
<literal>1.0</literal>, <literal>1.1</literal> and
|
||||||
|
<literal>1.2</literal>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This script generates three files :
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<filename>opengl32.spec</filename> gives Wine's linker
|
||||||
|
the signature of all function in the
|
||||||
|
<filename>OpenGL32.DLL</filename> library so that the
|
||||||
|
application can link them. Only 'core' functions are
|
||||||
|
listed here.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<filename>opengl_norm.c</filename> contains all the
|
||||||
|
thunks for the 'core' functions. Your OpenGL library
|
||||||
|
must provide ALL the function used in this file as these
|
||||||
|
are not queried at run time.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<filename>opengl_ext.c</filename> contains all the
|
||||||
|
functions that are not part of the 'core' functions.
|
||||||
|
Contrary to the thunks in
|
||||||
|
<filename>opengl_norm.c</filename>, these functions do
|
||||||
|
not depend at all on what your libGL provides.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
In fact, before using one of these thunks, the Windows
|
||||||
|
program first needs to 'query' the function pointer. At
|
||||||
|
this point, the corresponding thunk is useless. But as
|
||||||
|
we first query the same function in libGL and store the
|
||||||
|
returned function pointer in the thunk, the latter
|
||||||
|
becomes functional.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="opengl-problems">
|
||||||
|
<title>IV Known problems - shortcomings</title>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>IV.1 Missing GLU32.DLL</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
GLU is a library that is layered upon OpenGL. There is a
|
||||||
|
100% correspondence between the
|
||||||
|
<filename>libGLU.so</filename> that is used on Linux and
|
||||||
|
<filename>GLU32.DLL</filename>.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
As for the moment, I did not create a set of thunks to support this
|
||||||
|
library natively in Wine (it would easy to do, but I am waiting for
|
||||||
|
a better solution than adding another autogenerated thunk file), you
|
||||||
|
can always download anywhere on the net (it's free) a
|
||||||
|
<filename>GLU32.DLL</filename> file (by browsing, for example,
|
||||||
|
<ulink url="http://ftpsearch.lycos.com/">
|
||||||
|
http://ftpsearch.lycos.com/</ulink>).
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>IV.2 OpenGL not detected at configure time</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
See section (I) for a detailed explanation of the
|
||||||
|
<filename>configure</filename> requirements.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>IV.3 When running an OpenGL application, the screen flickers</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
See section (II) for how to create the context
|
||||||
|
double-buffered and thus preventing this flicker effect.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>IV.4 Wine gives me the following error message : </title>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
Extension defined in the OpenGL library but NOT in opengl_ext.c...
|
||||||
|
Please report (lionel.ulmer@free.fr) !
|
||||||
|
</screen>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This means that the extension requested by the application
|
||||||
|
is found in the libGL used by Linux (ie the call to
|
||||||
|
<function>glXGetProcAddressARB</function> returns a
|
||||||
|
non-<constant>NULL</constant> pointer) but that this string
|
||||||
|
was NOT found in Wine's extension registry.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
This can come from two causes :
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
The <filename>opengl_ext.c</filename> file is too old
|
||||||
|
and needs to be generated again.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Use of obsolete extensions that are not supported
|
||||||
|
anymore by SGI or of 'private' extensions that are not
|
||||||
|
registered. An example of the former are
|
||||||
|
<function>glMTexCoord2fSGIS</function> and
|
||||||
|
<function>glSelectTextureSGIS</function> as used by
|
||||||
|
Quake 2 (and apparently also by old versions of Half
|
||||||
|
Life). If documentation can be found on these functions,
|
||||||
|
they can be added to Wine's extension set.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
If you have this, run with <parameter>--debugmsg
|
||||||
|
+opengl</parameter> and send me
|
||||||
|
<email>lionel.ulmer@free.fr</email> the TRACE.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>IV.5 <filename>libopengl32.so</filename> is built but it is still not working</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This may be caused by some missing functions required by
|
||||||
|
<filename>opengl_norm.c</filename> but that your Linux
|
||||||
|
OpenGL library does not provide.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
To check for this, do the following steps :
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
create a dummy <filename>.c</filename> file :
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
int main(void) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
</programlisting>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
try to compile it by linking both libwine and
|
||||||
|
libopengl32 (this command line supposes that you
|
||||||
|
installed the Wine libraries in
|
||||||
|
<filename>/usr/local/lib</filename>, YMMV) :
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
gcc dummy.c -L/usr/local/lib -lwine -lopengl32
|
||||||
|
</programlisting>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
if it works, the problem is somewhere else (and you can
|
||||||
|
send me an email). If not, you could re-generate the
|
||||||
|
thunk files for OpenGL 1.1 for example (and send me your
|
||||||
|
OpenGL version so that this problem can be detected at
|
||||||
|
configure time).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -0,0 +1,760 @@
|
||||||
|
<chapter id="packaging">
|
||||||
|
<title>Packaging Wine</title>
|
||||||
|
|
||||||
|
<sect1 id="distributing">
|
||||||
|
<title>A Small WINE Distribution Guide</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by Marcus Meissner <Marcus.Meissner@caldera.de>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/distributors</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
While packaging WINE for one of the Linux distributions I came
|
||||||
|
across several points which have not been clarified yet.
|
||||||
|
Particularly a how-to for WINE packaging distributors is
|
||||||
|
missing. This document tries to give a brief overview over the
|
||||||
|
rationales I thought up and how I tried to implement it.
|
||||||
|
(While the examples use <command>rpm</command> most of this
|
||||||
|
stuff can be applied to other packagers too.)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<note>
|
||||||
|
<para>
|
||||||
|
YOU SHOULD RECHECK THIS FILE EVERY TWO MONTHS OR SO
|
||||||
|
(<command>diff -uN</command> comes to my mind here...).
|
||||||
|
We'll be adding stuff constantly here in order to improve
|
||||||
|
the Wine environment !
|
||||||
|
</para>
|
||||||
|
</note>
|
||||||
|
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
|
||||||
|
<para>Rationales</para>
|
||||||
|
<para>
|
||||||
|
A WINE install should:
|
||||||
|
</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>Not have a world writeable directory (-tree).</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Require only as much user input as needed. It would be
|
||||||
|
very good if it would not require any at all. Just let
|
||||||
|
the system administrator do <command>rpm -i
|
||||||
|
wine.rpm</command> and let any user be able to run
|
||||||
|
<command>wine sol.exe</command> instantly.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Give the user as much flexibility as possible to
|
||||||
|
install his own applications, do his own configuring
|
||||||
|
etc.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Come as preconfigured as possible, so the user does
|
||||||
|
not need to change any configuration files.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Use only as much diskspace as needed per user.</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
A WINE install needs:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
A writeable <filename>C:\</filename> directory
|
||||||
|
structure on a per user basis. Applications do dump
|
||||||
|
<filename>.ini</filename> files into
|
||||||
|
<filename>c:\windows</filename>, installers dump
|
||||||
|
<filename>.exe</filename>, <filename>.dll</filename>
|
||||||
|
and more into <filename>c:\windows\</filename> and
|
||||||
|
subdirectories or into <filename>C:\Program
|
||||||
|
Files\</filename>.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
The <filename>.exe</filename> and
|
||||||
|
<filename>.dll</filename> from a global read-only
|
||||||
|
Windows installation to be found by applications.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Some special <filename>.dll</filename> and
|
||||||
|
<filename>.exe</filename> files in the
|
||||||
|
<filename>windows\system</filename> directory, since
|
||||||
|
applications directly check for their presence.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Some special program environment.</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</listitem>
|
||||||
|
|
||||||
|
<listitem>
|
||||||
|
<para>Implementation</para>
|
||||||
|
|
||||||
|
<orderedlist inheritnum="inherit">
|
||||||
|
<listitem>
|
||||||
|
<para>Building the package</para>
|
||||||
|
<para>
|
||||||
|
WINE is configured the usual way (depending on your
|
||||||
|
build environment). The "prefix" is chosen using your
|
||||||
|
application placement policy
|
||||||
|
(<filename>/usr/</filename>,
|
||||||
|
<filename>/usr/X11R6/</filename>,
|
||||||
|
<filename>/opt/wine/</filename> or similar). The
|
||||||
|
configuration files (<filename>wine.conf</filename>,
|
||||||
|
<filename>wine.userreg</filename>,
|
||||||
|
<filename>wine.systemreg</filename>) are targeted for
|
||||||
|
<filename>/etc/wine/</filename> (rationale: FHS 2.0,
|
||||||
|
multiple readonly configuration files of a package).
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Example (split this into <literal>%build</literal> and
|
||||||
|
<literal>%install</literal> section for
|
||||||
|
<command>rpm</command>):
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
CFLAGS=$RPM_OPT_FLAGS \
|
||||||
|
./configure --prefix=/usr/X11R6 --sysconfdir=/etc/wine/ --enable-dll
|
||||||
|
make
|
||||||
|
BR=$RPM_BUILD_ROOT
|
||||||
|
make install prefix=$BR/usr/X11R6/ sysconfdir=$BR/etc/wine/
|
||||||
|
install -d $BR/etc/wine/
|
||||||
|
install -m 644 wine.ini $BR/etc/wine/wine.conf
|
||||||
|
|
||||||
|
# Put all our dlls in a seperate directory. (this works only if
|
||||||
|
# you have a buildroot)
|
||||||
|
install -d $BR/usr/X11R6/lib/wine
|
||||||
|
mv $BR/usr/X11R6/lib/lib* $BR/usr/X11R6/lib/wine/
|
||||||
|
|
||||||
|
# the clipboard server is started on demand.
|
||||||
|
install -m 755 windows/x11drv/wineclipsrv $BR/usr/X11R6/bin/
|
||||||
|
|
||||||
|
# The WINE server is needed.
|
||||||
|
install -m 755 server/wineserver $BR/usr/X11R6/bin/
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
Here we unfortunately do need to create
|
||||||
|
<filename>wineuser.reg</filename> and
|
||||||
|
<filename>winesystem.reg</filename> from the WINE
|
||||||
|
distributed <filename>winedefault.reg</filename>. This
|
||||||
|
can be done using <command>./regapi</command> once for
|
||||||
|
one example user and then reusing his
|
||||||
|
<filename>.wine/user.reg</filename> and
|
||||||
|
<filename>.wine/system.reg</filename> files.
|
||||||
|
<note>
|
||||||
|
<title>FIXME</title>
|
||||||
|
<para>this needs to be done better</para>
|
||||||
|
</note>
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
install -m 644 wine.sytemreg $BR/etc/wine/
|
||||||
|
install -m 644 wine.userreg $BR/etc/wine/
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
There are now a lot of libraries generated by the
|
||||||
|
build process, so a seperate library directory should
|
||||||
|
be used.
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
install -d 755 $BR/usr/X11R6/lib/
|
||||||
|
mv $BR/
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
You will need to package the files:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
$prefix/bin/wine, $prefix/bin/dosmod, $prefix/lib/wine/*
|
||||||
|
$prefix/man/man1/wine.1, $prefix/include/wine/*,
|
||||||
|
$prefix/bin/wineserver, $prefix/bin/wineclipsrv
|
||||||
|
|
||||||
|
%config /etc/wine/*
|
||||||
|
%doc ... choose from the toplevel directory and documentation/
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
The post-install script:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
if ! grep -q /usr/X11R6/lib/wine /etc/ld.so.conf; then
|
||||||
|
echo "/usr/X11R6/lib/wine" >> /etc/ld.so.conf
|
||||||
|
fi
|
||||||
|
/sbin/ldconfig
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
The post-uninstall script:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
if [ "$1" = 0 ]; then
|
||||||
|
perl -ni -e 'print unless m:/usr/X11R6/lib/wine:;' /etc/ld.so.conf
|
||||||
|
fi
|
||||||
|
/sbin/ldconfig
|
||||||
|
</screen>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Creating a good default configuration file</para>
|
||||||
|
<para>
|
||||||
|
For the rationales of needing as less input from the
|
||||||
|
user as possible arises the need for a very good
|
||||||
|
configuration file. The one supplied with WINE is
|
||||||
|
currently lacking. We need:
|
||||||
|
</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
[Drive X]:
|
||||||
|
</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
A for the floppy. Specify your distributions
|
||||||
|
default floppy mountpoint here.
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
Path=/auto/floppy
|
||||||
|
</programlisting>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
C for the <filename>C:\</filename> directory.
|
||||||
|
Here we use the users homedirectory, for most
|
||||||
|
applications do see <filename>C:\</filename>
|
||||||
|
as root-writeable directory of every windows
|
||||||
|
installation and this basically is it in the
|
||||||
|
UNIX-user context.
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
Path=${HOME}
|
||||||
|
</programlisting>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
R for the CD-Rom drive. Specify your
|
||||||
|
distributions default CD-ROM drives mountpoint
|
||||||
|
here.
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
Path=/auto/cdrom
|
||||||
|
</programlisting>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
T for temporary storage. We do use
|
||||||
|
<filename>/tmp/</filename> (rationale: between
|
||||||
|
process temporary data belongs to
|
||||||
|
<filename>/tmp/</filename>, FHS 2.0)
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
W for the original Windows installation. This
|
||||||
|
drive points to the
|
||||||
|
<filename>windows\</filename> subdirectory of
|
||||||
|
the original windows installation. This avoids
|
||||||
|
problems with renamed
|
||||||
|
<filename>windows</filename> directories (as
|
||||||
|
for instance <filename>lose95</filename>,
|
||||||
|
<filename>win</filename> or
|
||||||
|
<filename>sys\win95</filename>). During
|
||||||
|
compile/package/install we leave this to be
|
||||||
|
<filename>/</filename>, it has to be
|
||||||
|
configured after the package install.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Z for the UNIX Root directory. This avoids any
|
||||||
|
problems with "could not find drive for
|
||||||
|
current directory" users occasionaly complain
|
||||||
|
about in the newsgroup and the ircchannel. It
|
||||||
|
also makes the whole directory structure
|
||||||
|
browseable. The type of Z should be network,
|
||||||
|
so applications expect it to be readonly.
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
Path=/
|
||||||
|
</programlisting>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
[wine]:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
Windows=c:\windows\ (the windows/ subdirectory in the users
|
||||||
|
homedirectory)
|
||||||
|
System=c:\windows\system\ (the windows/system subdirectory in the users
|
||||||
|
homedirectory)
|
||||||
|
Path=c:\windows;c:\windows\system;c:\windows\system32;w:\;w:\system;w:\system32;
|
||||||
|
; Using this trick we have in fact two windows installations in one, we
|
||||||
|
; get the stuff from the readonly installation and can write to our own.
|
||||||
|
Temp=t:\ (the TEMP directory)
|
||||||
|
</screen>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>[Tweak.Layout]</para>
|
||||||
|
<screen>
|
||||||
|
WineLook=win95 (just the coolest look ;)
|
||||||
|
</screen>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Possibly modify the [spooler], [serialports] and
|
||||||
|
[parallelports] sections.
|
||||||
|
</para>
|
||||||
|
<note>
|
||||||
|
<title>FIXME</title>
|
||||||
|
<para>possibly more, including printer stuff.</para>
|
||||||
|
</note>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
<para>Add this prepared configuration file to the package.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Installing WINE for the system administrator</para>
|
||||||
|
<para>
|
||||||
|
Install the package using the usual packager
|
||||||
|
<command>rpm -i wine.rpm</command>. You may edit
|
||||||
|
<filename>/etc/wine/wine.conf</filename>, [Drive W],
|
||||||
|
to point to a possible windows installation right
|
||||||
|
after the install. That's it.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Note that on Linux you should somehow try to add the
|
||||||
|
<option>unhide</option> mount option (see <command>man
|
||||||
|
mount</command>) to the CD-ROM entry in
|
||||||
|
<filename>/etc/fstab</filename> during package
|
||||||
|
install, as several stupid Windows programs mark some
|
||||||
|
setup (!) files as hidden (ISO9660) on CD-ROMs, which
|
||||||
|
will greatly confuse users as they won't find their
|
||||||
|
setup files on the CD-ROMs as they were used on
|
||||||
|
Windows systems when <option>unhide</option> is not
|
||||||
|
set ;-\ And of course the setup program will complain
|
||||||
|
that <filename>setup.ins</filename> or some other mess
|
||||||
|
is missing... If you choose to do so, then please make
|
||||||
|
this change verbose to the admin.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Installing WINE for the user</para>
|
||||||
|
<para>
|
||||||
|
The user will need to run a setup script before the
|
||||||
|
first invocation of WINE. This script should:
|
||||||
|
</para>
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Copy <filename>/etc/wine/wine.conf</filename> for
|
||||||
|
user modification.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Allow specification of the original windows
|
||||||
|
installation to use (which modifies the copied
|
||||||
|
<filename>wine.conf</filename> file).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Create the windows directory structure
|
||||||
|
(<filename>c:\windows</filename>,
|
||||||
|
<filename>c:\windows\system</filename>,
|
||||||
|
<filename>c:\windows\Start Menu\Programs</filename>,
|
||||||
|
<filename>c:\Program Files</filename>,
|
||||||
|
<filename>c:\Desktop</filename>, etc.)
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Symlink all <filename>.dll</filename> and
|
||||||
|
<filename>.exe</filename> files from the original
|
||||||
|
windows installation to the
|
||||||
|
<filename>windows</filename> directory. Why? Some
|
||||||
|
programs reference "%windowsdir%/file.dll" or
|
||||||
|
"%systemdir%/file.dll" directly and fail if they
|
||||||
|
are not present.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
This will give a huge number of symlinks, yes.
|
||||||
|
However, if an installer later overwrites on of
|
||||||
|
those files, it will overwrite the symlink (so
|
||||||
|
that the file now lies in the
|
||||||
|
<filename>windows/</filename> subdirectory).
|
||||||
|
</para>
|
||||||
|
<note>
|
||||||
|
<title>FIXME</title>
|
||||||
|
<para>Not sure this is needed for all files.</para>
|
||||||
|
</note>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
On later invocation the script might want to
|
||||||
|
compare regular files in the users windows
|
||||||
|
directories and in the global windows directories
|
||||||
|
and replace same files by symlinks (to avoid
|
||||||
|
diskspace problems).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
|
||||||
|
<para>Done.</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This procedure requires:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>Much thought and work from the packager (1x)</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
No work for the sysadmin. Well except one <command>rpm
|
||||||
|
-i</command> and possible one edit of the configuration
|
||||||
|
file.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Some or no work from the user, except running the per-user
|
||||||
|
setup script once.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>It scales well and suffices most of the rationales.</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
|
||||||
|
<bridgehead>Sample <filename>wine.ini</filename> for OpenLinux 2.x:</bridgehead>
|
||||||
|
|
||||||
|
<programlisting>
|
||||||
|
;;
|
||||||
|
;; MS-DOS drives configuration
|
||||||
|
;;
|
||||||
|
;; Each section has the following format:
|
||||||
|
;; [Drive X]
|
||||||
|
;; Path=xxx (Unix path for drive root)
|
||||||
|
;; Type=xxx (supported types are 'floppy', 'hd', 'cdrom' and 'network')
|
||||||
|
;; Label=xxx (drive label, at most 11 characters)
|
||||||
|
;; Serial=xxx (serial number, 8 characters hexadecimal number)
|
||||||
|
;; Filesystem=xxx (supported types are 'msdos'/'dos'/'fat', 'win95'/'vfat', 'unix')
|
||||||
|
;; This is the FS Wine is supposed to emulate on a certain
|
||||||
|
;; directory structure.
|
||||||
|
;; Recommended:
|
||||||
|
;; - "win95" for ext2fs, VFAT and FAT32
|
||||||
|
;; - "msdos" for FAT16 (ugly, upgrading to VFAT driver strongly recommended)
|
||||||
|
;; DON'T use "unix" unless you intend to port programs using Winelib !
|
||||||
|
;; Device=/dev/xx (only if you want to allow raw device access)
|
||||||
|
;;
|
||||||
|
|
||||||
|
;
|
||||||
|
;
|
||||||
|
; Floppy 'A' and 'B'
|
||||||
|
;
|
||||||
|
; OpenLinux uses an automounter under /auto/, so we use that too.
|
||||||
|
;
|
||||||
|
[Drive A]
|
||||||
|
Path=/auto/floppy/
|
||||||
|
Type=floppy
|
||||||
|
Label=Floppy
|
||||||
|
Serial=87654321
|
||||||
|
Device=/dev/fd0
|
||||||
|
Filesystem=win95
|
||||||
|
|
||||||
|
;
|
||||||
|
; Comment in ONLY if you have a second floppy or the automounter hangs
|
||||||
|
; for 5 minutes.
|
||||||
|
;
|
||||||
|
;[Drive B]
|
||||||
|
;Path=/auto/floppy2/
|
||||||
|
;Type=floppy
|
||||||
|
;Label=Floppy
|
||||||
|
;Serial=87654321
|
||||||
|
;Device=/dev/fd1
|
||||||
|
;Filesystem=win95
|
||||||
|
|
||||||
|
|
||||||
|
;
|
||||||
|
; Drive 'C' links to the users homedirectory.
|
||||||
|
;
|
||||||
|
; This must point to a writeable directory structure (not your readonly
|
||||||
|
; mounted DOS partitions!) since programs want to dump stuff into
|
||||||
|
; "Program Files/" "Programme/", "windows/", "windows/system/" etc.
|
||||||
|
;
|
||||||
|
; The basic structure is set up using the config script.
|
||||||
|
;
|
||||||
|
[Drive C]
|
||||||
|
Path=${HOME}
|
||||||
|
Type=hd
|
||||||
|
Label=MS-DOS
|
||||||
|
Filesystem=win95
|
||||||
|
|
||||||
|
;
|
||||||
|
; /tmp/ directory
|
||||||
|
;
|
||||||
|
; The temp drive (and directory) points to /tmp/. Windows programs fill it
|
||||||
|
; with junk, so it is approbiate.
|
||||||
|
;
|
||||||
|
[Drive T]
|
||||||
|
Path=/tmp
|
||||||
|
Type=hd
|
||||||
|
Label=Tmp Drive
|
||||||
|
Filesystem=win95
|
||||||
|
|
||||||
|
;
|
||||||
|
; 'U'ser homedirectory
|
||||||
|
;
|
||||||
|
; Just in case you want C:\ elsewhere.
|
||||||
|
;
|
||||||
|
[Drive U]
|
||||||
|
Path=${HOME}
|
||||||
|
Type=hd
|
||||||
|
Label=Home
|
||||||
|
Filesystem=win95
|
||||||
|
|
||||||
|
;
|
||||||
|
; CD-'R'OM drive (automounted)
|
||||||
|
;
|
||||||
|
; The default cdrom drive.
|
||||||
|
;
|
||||||
|
; If an application (or game) wants a specific CD-ROM you might have to
|
||||||
|
; temporary change the Label to the one of the CD itself.
|
||||||
|
;
|
||||||
|
; How to read them is described in /usr/doc/wine-cvs-xxxxx/cdrom-labels.
|
||||||
|
;
|
||||||
|
[Drive R]
|
||||||
|
Path=/auto/cdrom
|
||||||
|
Type=cdrom
|
||||||
|
Label=CD-Rom
|
||||||
|
Filesystem=win95
|
||||||
|
|
||||||
|
;
|
||||||
|
; The drive where the old windows installation resides (it points to the
|
||||||
|
; windows/ subdirectory).
|
||||||
|
;
|
||||||
|
; The Path is modified by the winesetup script.
|
||||||
|
;
|
||||||
|
[Drive W]
|
||||||
|
Path=/
|
||||||
|
Type=network
|
||||||
|
Label=Windows
|
||||||
|
Filesystem=win95
|
||||||
|
;
|
||||||
|
; The UNIX Root directory, so all other programs and directories are reachable.
|
||||||
|
;
|
||||||
|
; type network is used to tell programs to not write here.
|
||||||
|
;
|
||||||
|
[Drive Z]
|
||||||
|
Path=/
|
||||||
|
Type=network
|
||||||
|
Label=ROOT
|
||||||
|
Filesystem=win95
|
||||||
|
|
||||||
|
;
|
||||||
|
; Standard Windows path entries. WINE will not work if they are incorrect.
|
||||||
|
;
|
||||||
|
[wine]
|
||||||
|
;
|
||||||
|
; The windows/ directory. It must be writeable, for programs write into it.
|
||||||
|
;
|
||||||
|
Windows=c:\windows
|
||||||
|
;
|
||||||
|
; The windows/system/ directory. It must be writeable, for especially setup
|
||||||
|
; programs install dlls in there.
|
||||||
|
;
|
||||||
|
System=c:\windows\system
|
||||||
|
;
|
||||||
|
; The temp directory. Should be cleaned regulary, since install programs leave
|
||||||
|
; junk without end in there.
|
||||||
|
;
|
||||||
|
Temp=t:\
|
||||||
|
;
|
||||||
|
; The dll search path. It should contain at least:
|
||||||
|
; - the windows and the windows/system directory of the user.
|
||||||
|
; - the global windows and windows/system directory (from a possible readonly
|
||||||
|
; windows installation either on msdos filesystems or somewhere in the UNIX
|
||||||
|
; directory tree)
|
||||||
|
; - any other windows style directories you want to add.
|
||||||
|
;
|
||||||
|
Path=c:\windows;c:\windows\system;c:\windows\system32;t:\;w:\;w:\system;w:\system32
|
||||||
|
;
|
||||||
|
; Outdated and no longer used. (but needs to be present).
|
||||||
|
;
|
||||||
|
SymbolTableFile=./wine.sym
|
||||||
|
|
||||||
|
# <wineconf>
|
||||||
|
|
||||||
|
;
|
||||||
|
; Dll loadorder defaults. No need to modify.
|
||||||
|
;
|
||||||
|
[DllDefaults]
|
||||||
|
EXTRA_LD_LIBRARY_PATH=${HOME}/wine/cvs/lib
|
||||||
|
DefaultLoadOrder = native, elfdll, so, builtin
|
||||||
|
|
||||||
|
;
|
||||||
|
; What 32/16 dlls belong to each other (context wise). No need to modify.
|
||||||
|
;
|
||||||
|
[DllPairs]
|
||||||
|
kernel = kernel32
|
||||||
|
gdi = gdi32
|
||||||
|
user = user32
|
||||||
|
commdlg = comdlg32
|
||||||
|
commctrl= comctl32
|
||||||
|
ver = version
|
||||||
|
shell = shell32
|
||||||
|
lzexpand= lz32
|
||||||
|
mmsystem= winmm
|
||||||
|
msvideo = msvfw32
|
||||||
|
winsock = wsock32
|
||||||
|
|
||||||
|
;
|
||||||
|
; What type of dll to use in their respective loadorder.
|
||||||
|
;
|
||||||
|
[DllOverrides]
|
||||||
|
kernel32, gdi32, user32 = builtin
|
||||||
|
kernel, gdi, user = builtin
|
||||||
|
toolhelp = builtin
|
||||||
|
comdlg32, commdlg = elfdll, builtin, native
|
||||||
|
version, ver = elfdll, builtin, native
|
||||||
|
shell32, shell = builtin, native
|
||||||
|
lz32, lzexpand = builtin, native
|
||||||
|
commctrl, comctl32 = builtin, native
|
||||||
|
wsock32, winsock = builtin
|
||||||
|
advapi32, crtdll, ntdll = builtin, native
|
||||||
|
mpr, winspool = builtin, native
|
||||||
|
ddraw, dinput, dsound = builtin, native
|
||||||
|
winmm, mmsystem = builtin
|
||||||
|
msvideo, msvfw32 = builtin, native
|
||||||
|
mcicda.drv, mciseq.drv = builtin, native
|
||||||
|
mciwave.drv = builtin, native
|
||||||
|
mciavi.drv, mcianim.drv = native, builtin
|
||||||
|
w32skrnl = builtin
|
||||||
|
wnaspi32, wow32 = builtin
|
||||||
|
system, display, wprocs = builtin
|
||||||
|
wineps = builtin
|
||||||
|
|
||||||
|
;
|
||||||
|
; Options section. Does not need to be edited.
|
||||||
|
;
|
||||||
|
[options]
|
||||||
|
; allocate how much system colors on startup. No need to modify.
|
||||||
|
AllocSystemColors=100
|
||||||
|
|
||||||
|
;;
|
||||||
|
; Font specification. You usually do not need to edit this section.
|
||||||
|
;
|
||||||
|
; Read documentation/fonts before adding aliases
|
||||||
|
;
|
||||||
|
[fonts]
|
||||||
|
; The resolution defines what fonts to use (usually either 75 or 100 dpi fonts,
|
||||||
|
; or nearest match).
|
||||||
|
Resolution = 96
|
||||||
|
; Default font
|
||||||
|
Default = -adobe-times-
|
||||||
|
|
||||||
|
;
|
||||||
|
; serial ports used by "COM1" "COM2" "COM3" "COM4". Useful for applications
|
||||||
|
; that try to access serial ports.
|
||||||
|
;
|
||||||
|
[serialports]
|
||||||
|
Com1=/dev/ttyS0
|
||||||
|
Com2=/dev/ttyS1
|
||||||
|
Com3=/dev/modem,38400
|
||||||
|
Com4=/dev/modem
|
||||||
|
|
||||||
|
;
|
||||||
|
; parallel port(s) used by "LPT1" etc. Useful for applications that try to
|
||||||
|
; access these ports.
|
||||||
|
;
|
||||||
|
[parallelports]
|
||||||
|
Lpt1=/dev/lp0
|
||||||
|
|
||||||
|
;
|
||||||
|
; What spooling program to use on printing.
|
||||||
|
; Use "|program" or "filename", where the output will be dumped into.
|
||||||
|
;
|
||||||
|
[spooler]
|
||||||
|
LPT1:=|lpr
|
||||||
|
LPT2:=|gs -sDEVICE=bj200 -sOutputFile=/tmp/fred -q -
|
||||||
|
LPT3:=/dev/lp3
|
||||||
|
|
||||||
|
;
|
||||||
|
; Allow port access to WINE started by the root user. Useful for some
|
||||||
|
; supported devices, but it can make the system unstable.
|
||||||
|
; Read /usr/doc/wine-cvs-xxxxx/ioport-trace-hints.
|
||||||
|
;
|
||||||
|
[ports]
|
||||||
|
;read=0x779,0x379,0x280-0x2a0
|
||||||
|
;write=0x779,0x379,0x280-0x2a0
|
||||||
|
|
||||||
|
; debugging, not need to be modified.
|
||||||
|
[spy]
|
||||||
|
Exclude=WM_SIZE;WM_TIMER;
|
||||||
|
|
||||||
|
;
|
||||||
|
; What names for the registry datafiles, no need to modify.
|
||||||
|
;
|
||||||
|
[Registry]
|
||||||
|
; Paths must be given in /dir/dir/file.reg format.
|
||||||
|
; Wine will not understand dos file names here...
|
||||||
|
;UserFileName=xxx ; alternate registry file name (user.reg)
|
||||||
|
;LocalMachineFileName=xxx ; (system.reg)
|
||||||
|
|
||||||
|
;
|
||||||
|
; Layout/Look modifications. Here you can switch with a single line between
|
||||||
|
; windows 3.1 and windows 95 style.
|
||||||
|
; This does not change WINE behaviour or reported versions, just the look!
|
||||||
|
;
|
||||||
|
[Tweak.Layout]
|
||||||
|
;; WineLook=xxx (supported styles are 'Win31'(default), 'Win95', 'Win98')
|
||||||
|
WineLook=Win95
|
||||||
|
|
||||||
|
;
|
||||||
|
; What programs to start on WINE startup. (you should probably leave it empty)
|
||||||
|
;
|
||||||
|
[programs]
|
||||||
|
Default=
|
||||||
|
Startup=
|
||||||
|
|
||||||
|
; defunct section.
|
||||||
|
[Console]
|
||||||
|
;XtermProg=nxterm
|
||||||
|
;InitialRows=25
|
||||||
|
;InitialColumns=80
|
||||||
|
;TerminalType=nxterm
|
||||||
|
|
||||||
|
# </wineconf>
|
||||||
|
</programlisting>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -0,0 +1,11 @@
|
||||||
|
<chapter id="patches">
|
||||||
|
<title>Submitting Patches</title>
|
||||||
|
<para>How to create patches, and where to send them...</para>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -0,0 +1,395 @@
|
||||||
|
<chapter id="porting">
|
||||||
|
<title>Porting Wine to new Platforms</title>
|
||||||
|
<para>Porting Wine to different (UNIX-based) operating systems...</para>
|
||||||
|
|
||||||
|
<sect1 id="wine-porting">
|
||||||
|
<title>Porting</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by ???
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/how-to-port</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>What is this?</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This note is a short description of:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>How to port Wine to your favourite operating system</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Why you probably shouldn't use <symbol>#ifdef MyOS</symbol></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>What to do instead.</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This document does not say a thing about how to port Wine to
|
||||||
|
non-386 operating systems, though. You would need a CPU
|
||||||
|
emulator. Let's get Wine into a better shape on 386 first,
|
||||||
|
OK?
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Why <symbol>#ifdef MyOS</symbol> is probably a mistake.</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Operating systems change. Maybe yours doesn't have the
|
||||||
|
<filename>foo.h</filename> header, but maybe a future
|
||||||
|
version will have it. If you want to <symbol>#include
|
||||||
|
<foo.h></symbol>, it doesn't matter what operating
|
||||||
|
system you are using; it only matters whether
|
||||||
|
<filename>foo.h</filename> is there.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Furthermore, operating systems change names or "fork" into
|
||||||
|
several ones. An <symbol>#ifdef MyOs</symbol> will break
|
||||||
|
over time.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
If you use the feature of <command>autoconf</command> -- the
|
||||||
|
Gnu auto-configuration utility -- wisely, you will help
|
||||||
|
future porters automatically because your changes will test
|
||||||
|
for <emphasis>features</emphasis>, not names of operating
|
||||||
|
systems. A feature can be many things:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>existance of a header file</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>existance of a library function</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>existance of libraries</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>bugs in header files, library functions, the compiler, ...</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>(you name it)</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
<para>
|
||||||
|
You will need Gnu Autoconf, which you can get from your
|
||||||
|
friendly Gnu mirror. This program takes Wine's
|
||||||
|
<filename>configure.in</filename> file and produces a
|
||||||
|
<filename>configure</filename> shell script that users use
|
||||||
|
to configure Wine to their system.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
There <emphasis>are</emphasis> exceptions to the "avoid
|
||||||
|
<symbol>#ifdef MyOS</symbol>" rule. Wine, for example, needs
|
||||||
|
the internals of the signal stack -- that cannot easily be
|
||||||
|
described in terms of features.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Let's now turn to specific porting problems and how to solve
|
||||||
|
them.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>MyOS doesn't have the <filename>foo.h</filename> header!</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This first step is to make <command>autoconf</command> check
|
||||||
|
for this header. In <filename>configure.in</filename> you
|
||||||
|
add a segment like this in the section that checks for
|
||||||
|
header files (search for "header files"):
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
AC_CHECK_HEADER(foo.h, AC_DEFINE(HAVE_FOO_H))
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
If your operating system supports a header file with the
|
||||||
|
same contents but a different name, say
|
||||||
|
<filename>bar.h</filename>, add a check for that also.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Now you can change
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
#include <foo.h>
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
to
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
#ifdef HAVE_FOO_H
|
||||||
|
#include <foo.h>
|
||||||
|
#elif defined (HAVE_BAR_H)
|
||||||
|
#include <bar.h>
|
||||||
|
#endif
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
If your system doesn't have a corresponding header file even
|
||||||
|
though it has the library functions being used, you might
|
||||||
|
have to add an <symbol>#else</symbol> section to the
|
||||||
|
conditional. Avoid this if you can.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You will also need to add <symbol>#undef HAVE_FOO_H</symbol>
|
||||||
|
(etc.) to <filename>include/config.h.in</filename>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Finish up with <command>make configure</command> and
|
||||||
|
<command>./configure</command>.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>MyOS doesn't have the <function>bar</function> function!</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
A typical example of this is the
|
||||||
|
<function>memmove</function> function. To solve this
|
||||||
|
problem you would add <function>memmove</function> to the
|
||||||
|
list of functions that <command>autoconf</command> checks
|
||||||
|
for. In <filename>configure.in</filename> you search for
|
||||||
|
<function>AC_CHECK_FUNCS</function> and add
|
||||||
|
<function>memmove</function>. (You will notice that someone
|
||||||
|
already did this for this particular function.)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Secondly, you will also need to add <symbol>#undef
|
||||||
|
HAVE_BAR</symbol> to
|
||||||
|
<filename>include/config.h.in</filename>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The next step depends on the nature of the missing function.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Case 1:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
It's easy to write a complete implementation of the
|
||||||
|
function. (<function>memmove</function> belongs to
|
||||||
|
this case.)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You add your implementation in
|
||||||
|
<filename>misc/port.c</filename> surrounded by
|
||||||
|
<symbol>#ifndef HAVE_MEMMOVE</symbol> and
|
||||||
|
<symbol>#endif</symbol>.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You might have to add a prototype for your function.
|
||||||
|
If so, <filename>include/miscemu.h</filename> might be the place. Don't
|
||||||
|
forget to protect that definition by <symbol>#ifndef
|
||||||
|
HAVE_MEMMOVE</symbol> and <symbol>#endif</symbol> also!
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>Case 2:</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
A general implementation is hard, but Wine is only
|
||||||
|
using a special case.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
An example is the various <function>wait</function>
|
||||||
|
calls used in <function>SIGNAL_child</function> from
|
||||||
|
<filename>loader/signal.c</filename>. Here we have a
|
||||||
|
multi-branch case on features:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
#ifdef HAVE_THIS
|
||||||
|
...
|
||||||
|
#elif defined (HAVE_THAT)
|
||||||
|
...
|
||||||
|
#elif defined (HAVE_SOMETHING_ELSE)
|
||||||
|
...
|
||||||
|
#endif
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
Note that this is very different from testing on
|
||||||
|
operating systems. If a new version of your operating
|
||||||
|
systems comes out and adds a new function, this code
|
||||||
|
will magically start using it.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
<para>
|
||||||
|
Finish up with <command>make configure</command> and
|
||||||
|
<command>./configure</command>.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="os2-wine">
|
||||||
|
<title>Running & Compiling WINE in OS/2</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by Robert Pouliot <krynos@clic.net>, January 9, 1997
|
||||||
|
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/wine_os2</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
If you want to help the port of WINE to OS/2, send me a
|
||||||
|
message at <email>krynos@clic.net</email> I currently don't
|
||||||
|
want beta testers. It must work before we can test it.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Here is what you need to (try to) compile Wine for OS/2:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>EMX 0.9c (fix 2)</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>XFree86 3.2 OS/2 (with development libraries)</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<command>bash</command>, gnu <command>make</command>,
|
||||||
|
<command>grep</command>, <command>tar</command>,
|
||||||
|
<command>bison</command>, <command>flex</command>
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para><command>sed</command> (a working copy of)</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>xpm</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para><command>diff</command> and <command>patch</command>
|
||||||
|
are recommended</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Lots of disk space (about 40-50 megs after EMX and XFree installed)</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
To compile:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<screen>
|
||||||
|
<prompt>$ </prompt><userinput>sh</userinput>
|
||||||
|
<prompt>$ </prompt><userinput>tools/make_os2.sh</userinput>
|
||||||
|
<prompt>$ </prompt><userinput>make depend</userinput>
|
||||||
|
<prompt>$ </prompt><userinput>make</userinput>
|
||||||
|
<prompt>$ </prompt><userinput>emxbind wine</userinput>
|
||||||
|
</screen>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Currently:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para><command>configure</command> and <command>make depend</command> work...</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para><command>make</command> compiles (with a modified
|
||||||
|
Linux <filename>mman.h</filename>), but doesn't
|
||||||
|
link.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>signal handling is horrible... (if any)</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>EMX doesn't support <function>mmap</function> (and
|
||||||
|
related), SysV IPC and <function>stafs()</function></para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
XFree86/OS2 3.2 doesn't support
|
||||||
|
<function>XShmQueryExtension()</function> and
|
||||||
|
<function>XShmPixmapFormat()</function> due to the same
|
||||||
|
lack in EMX...
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
What needs to be redone:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>LDT (using <function>DosAllocSeg</function> in
|
||||||
|
<filename>memory/ldt.c</filename>) *</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Implement <function>mmap()</function> and SysV IPC in EMX *</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>File functions, </para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>I/O access (do it!),</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Communication (modem),</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Interrupt (if int unknown, call current RealMode one...), </para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Verify that everything is thread safe (how does Win95/NT handle multi-thread?),
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Move X functions in some files (and make a wrapper, to use PM instead latter),
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Return right CPU type, </para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Make winsock work</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The good things:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>OS/2 have DOS interrupts</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>OS/2 have I/O port access</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>OS/2 have multi-thread</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Merlin have Open32 (to be used later...)</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -1,57 +0,0 @@
|
||||||
Printing in Wine
|
|
||||||
================
|
|
||||||
|
|
||||||
Printing in Wine can be done in one of two ways. Both of which are very alpha.
|
|
||||||
|
|
||||||
1. Use a windows 3.1 printer driver.
|
|
||||||
|
|
||||||
2. Use the builtin Wine Postscript driver (+ ghostscript to produce output for
|
|
||||||
non-postscript printers).
|
|
||||||
|
|
||||||
|
|
||||||
Note that at the moment WinPrinters (cheap, dumb printers that require the host
|
|
||||||
computer to explicitly control the head) will not work. It is unclear whether
|
|
||||||
they ever will.
|
|
||||||
|
|
||||||
|
|
||||||
1. External printer drivers
|
|
||||||
---------------------------
|
|
||||||
At present only 16 bit drivers will work (note that these include win9x
|
|
||||||
drivers).
|
|
||||||
|
|
||||||
Add
|
|
||||||
|
|
||||||
printer=on
|
|
||||||
|
|
||||||
to the [wine] section of wine.conf (or ~/.winerc). This lets CreateDC proceed
|
|
||||||
if its driver argument is a 16 bit driver.
|
|
||||||
|
|
||||||
You will probably also need to add
|
|
||||||
|
|
||||||
TTEnable=0
|
|
||||||
TTOnly=0
|
|
||||||
|
|
||||||
to the [TrueType] section of win.ini .
|
|
||||||
|
|
||||||
The code for the driver interface is in graphics/win16drv .
|
|
||||||
|
|
||||||
|
|
||||||
2. Builtin Wine PostScript driver
|
|
||||||
---------------------------------
|
|
||||||
Enables printing of PostScript files via a driver built into Wine. See
|
|
||||||
documentation/psdriver for installation instructions. The code for the
|
|
||||||
PostScript driver is in graphics/psdrv .
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Spooling
|
|
||||||
========
|
|
||||||
Spooling is rather primitive. The [spooler] section of wine.conf maps a port
|
|
||||||
(e.g. LPT1:) to a file or a command via a pipe. For example the following lines
|
|
||||||
|
|
||||||
LPT1:=foo.ps
|
|
||||||
LPT2:=|lpr
|
|
||||||
|
|
||||||
map LPT1: to file foo.ps and LPT2: to the lpr command. If a job is sent to an
|
|
||||||
unlisted port then a file is created with that port's name e.g. for LPT3: a
|
|
||||||
file called LPT3: would be created.
|
|
|
@ -0,0 +1,265 @@
|
||||||
|
<chapter id="printing">
|
||||||
|
<title>Printing in Wine</title>
|
||||||
|
<para>How to print documents in Wine...</para>
|
||||||
|
|
||||||
|
<sect1 id="wine-printing">
|
||||||
|
<title>Printing</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by (???)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/printing</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Printing in Wine can be done in one of two ways. Both of which are very
|
||||||
|
alpha.
|
||||||
|
</para>
|
||||||
|
<orderedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>Use an external windows 3.1 printer driver.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Use the builtin Wine Postscript driver (+ ghostscript to produce
|
||||||
|
output for non-postscript printers).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</orderedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Note that at the moment WinPrinters (cheap, dumb printers that require
|
||||||
|
the host computer to explicitly control the head) will not work. It is
|
||||||
|
unclear whether they ever will.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>External printer drivers</title>
|
||||||
|
<para>
|
||||||
|
At present only 16 bit drivers will work (note that these include win9x
|
||||||
|
drivers). To use them, add
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
printer=on
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
to the [wine] section of <filename>wine.conf</filename> (or
|
||||||
|
<filename>~/.winerc</filename>). This lets
|
||||||
|
<function>CreateDC</function> proceed if its driver argument is a 16
|
||||||
|
bit driver. You will probably also need to add
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
TTEnable=0 TTOnly=0
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
to the [TrueType] section of <filename>win.ini</filename>. The code for
|
||||||
|
the driver interface is in <filename>graphics/win16drv</filename>.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Builtin Wine PostScript driver</title>
|
||||||
|
<para>
|
||||||
|
Enables printing of PostScript files via a driver built into Wine. See
|
||||||
|
<filename>documentation/psdriver</filename> for installation
|
||||||
|
instructions. The code for the PostScript driver is in
|
||||||
|
<filename>graphics/psdrv</filename>.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Spooling</title>
|
||||||
|
<para>
|
||||||
|
Spooling is rather primitive. The [spooler] section of
|
||||||
|
<filename>wine.conf</filename> maps a port (e.g.
|
||||||
|
<systemitem>LPT1:</systemitem>) to a file or a command via a pipe. For
|
||||||
|
example the following lines
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
LPT1:=foo.ps LPT2:=|lpr
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
map <systemitem>LPT1:</systemitem> to file <filename>foo.ps</filename>
|
||||||
|
and <systemitem>LPT2:</systemitem> to the <command>lpr</command>
|
||||||
|
command. If a job is sent to an unlisted port then a file is created
|
||||||
|
with that port's name e.g. for <systemitem>LPT3:</systemitem> a file
|
||||||
|
called <systemitem>LPT3:</systemitem> would be created.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="psdriver">
|
||||||
|
<title>The Wine PostScript Driver</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by Huw Davies <email>h.davies1@physics.ox.ac.uk</email>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/psdriver</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
When complete this will allow Wine to generate PostScript files without
|
||||||
|
needing an external printer driver. It should be possible to print to a
|
||||||
|
non PostScript printer by filtering the output through ghostscript.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Installation</title>
|
||||||
|
<para>
|
||||||
|
The driver behaves as if it were a DRV file called
|
||||||
|
<filename>wineps.drv</filename> which at the moment is built into Wine.
|
||||||
|
Although it mimics a 16 bit driver it will work with both 16 and 32 bit
|
||||||
|
apps, just as win9x drivers do.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
To install it add
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
Wine PostScript Driver=WINEPS,LPT1:
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
to the [devices] section of <filename>win.ini</filename> and to set it
|
||||||
|
as the default printer also add
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
device=Wine PostScript Driver,WINEPS,LPT1:
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
to the [windows] section of <filename>win.ini</filename> and ???
|
||||||
|
<emphasis>[sic]</emphasis>
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
To run 32 bit apps (and 16 bit apps using the
|
||||||
|
<literal>builtin</literal> commdlg) you also need to add certain
|
||||||
|
entries to the registry. The easiest way to do that at the moment is
|
||||||
|
to use the winelib program <command>programs/regapi/regapi</command>
|
||||||
|
with the file <filename>documentation/psdrv.reg</filename>. To do this
|
||||||
|
<command>cd</command> to <filename>programs/regapi/regapi</filename>
|
||||||
|
and type <userinput>make</userinput> to actually make the program, then
|
||||||
|
type <userinput>./regapi setValue
|
||||||
|
<../../documentation/psdrv.reg</userinput>. You can obviously
|
||||||
|
edit <filename>psdrv.reg</filename> to suit your requirements.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You will need Adobe Font Metric (AFM) files for the (type 1 PostScript)
|
||||||
|
fonts that you wish to use. You can get these from
|
||||||
|
<ulink url="ftp://ftp.adobe.com/pub/adobe/type/win/all/afmfiles">
|
||||||
|
ftp://ftp.adobe.com/pub/adobe/type/win/all/afmfiles </ulink>. The
|
||||||
|
directories <filename>base17</filename> or <filename>base35</filename>
|
||||||
|
are good places to start. Note that these are only the font metrics and
|
||||||
|
not the fonts themselves. At the moment the driver does not download
|
||||||
|
additional fonts, so you can only use fonts that are already present on
|
||||||
|
the printer.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Then create a [afmfiles] section in your
|
||||||
|
<filename>wine.conf</filename> (or
|
||||||
|
<filename>~/.winerc</filename>) and add a line of the form
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
file<n>=/unix/path/name/filename.afm
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
for each AFM file that you wish to use. [This might change in the future]
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You also require a PPD file for your printer. This describes certain
|
||||||
|
characteristics of the printer such as which fonts are installed, how
|
||||||
|
to select manual feed etc. Adobe also has many of these on its website,
|
||||||
|
have a look in <ulink url="ftp://ftp.adobe.com/pub/adobe/printerdrivers/win/all/">
|
||||||
|
ftp://ftp.adobe.com/pub/adobe/printerdrivers/win/all/</ulink>. Create
|
||||||
|
a [psdrv] section in your <filename>wine.conf</filename> (or
|
||||||
|
<filename>~/.winerc</filename>) and add the following entry:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
ppdfile=/somewhere/file.ppd
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
By default, the driver will look for a file named
|
||||||
|
<filename>default.ppd</filename> in the directory from which
|
||||||
|
you started wine.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
To enable colour printing you need to have the
|
||||||
|
<literal>*ColorDevice</literal> entry in the PPD set to
|
||||||
|
<literal>true</literal>, otherwise the driver will generate
|
||||||
|
greyscale.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Note that you need not set <literal>printer=on</literal> in
|
||||||
|
the [wine] section of <filename>wine.conf</filename>, this
|
||||||
|
enables printing via external printer drivers and does not
|
||||||
|
affect wineps.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
If you're lucky you should now be able to produce PS files
|
||||||
|
from Wine!
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
I've tested it with win3.1 notepad/write, Winword6 and
|
||||||
|
Origin4.0 and 32 bit apps such as win98 wordpad, Winword97,
|
||||||
|
Powerpoint2000 with some degree of success - you should be
|
||||||
|
able to get something out, it may not be in the right place.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>TODO / Bugs</title>
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Driver does read PPD files, but ignores all constraints
|
||||||
|
and doesn't let you specify whether you have optional
|
||||||
|
extras such as envelope feeders. You will therefore find
|
||||||
|
a larger than normal selection of input bins in the
|
||||||
|
print setup dialog box. I've only really tested ppd
|
||||||
|
parsing on the <filename>hp4m6_v1.ppd</filename> file.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>No TrueType download.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>StretchDIBits uses level 2 PostScript.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>AdvancedSetup dialog box.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Many partially implemented functions.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>ps.c is becoming messy.</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Notepad often starts text too far to the left depending
|
||||||
|
on the margin settings. However the win3.1
|
||||||
|
<filename>pscript.drv</filename> (under wine) also does
|
||||||
|
this.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
<listitem>
|
||||||
|
<para>Probably many more...</para>
|
||||||
|
</listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Please contact me if you want to help so that we can avoid duplication.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Huw Davies <email>h.davies1@physics.ox.ac.uk</email>
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -1,134 +0,0 @@
|
||||||
Wine PostScript Driver
|
|
||||||
======================
|
|
||||||
|
|
||||||
When complete this will allow Wine to generate PostScript files without needing
|
|
||||||
an external printer driver. It should be possible to print to a non PostScript
|
|
||||||
printer by filtering the output through ghostscript.
|
|
||||||
|
|
||||||
|
|
||||||
Installation
|
|
||||||
------------
|
|
||||||
|
|
||||||
The driver behaves as if it were a DRV file called WINEPS.DRV which at the
|
|
||||||
moment is built into Wine. Although it mimics a 16 bit driver it will work
|
|
||||||
with both 16 and 32 bit apps, just as win9x drivers do.
|
|
||||||
|
|
||||||
To install it add
|
|
||||||
|
|
||||||
Wine PostScript Driver=WINEPS,LPT1:
|
|
||||||
|
|
||||||
to the [devices] section of win.ini and to set it as the default printer also
|
|
||||||
add
|
|
||||||
|
|
||||||
device=Wine PostScript Driver,WINEPS,LPT1:
|
|
||||||
|
|
||||||
to the [windows] section of win.ini and
|
|
||||||
|
|
||||||
|
|
||||||
To run 32 bit apps (and 16 bit apps using the builtin commdlg) you also need to
|
|
||||||
add certain entries to the registry. The easiest way to do that at the moment
|
|
||||||
is to use the winelib program programs/regapi/regapi with the file
|
|
||||||
documentation/psdrv.reg . To do this cd to programs/regapi/regapi and type
|
|
||||||
`make' to actually make the program, then type
|
|
||||||
`./regapi setValue <../../documentation/psdrv.reg' . You can obviously edit
|
|
||||||
psdrv.reg to suit your requirements.
|
|
||||||
|
|
||||||
You will need Adobe Font Metric (AFM) files for the (type 1 PostScript) fonts
|
|
||||||
that you wish to use. You can get these from
|
|
||||||
ftp://ftp.adobe.com/pub/adobe/type/win/all/afmfiles . The directories base17
|
|
||||||
or base35 are good places to start. Note that these are only the font metrics
|
|
||||||
and not the fonts themselves. At the moment the driver does not download
|
|
||||||
additional fonts, so you can only use fonts that are already present on the
|
|
||||||
printer.
|
|
||||||
|
|
||||||
Then create a [afmfiles] section in your wine.conf (or ~/.winerc) and add a
|
|
||||||
line of the form
|
|
||||||
|
|
||||||
file<n>=/unix/path/name/filename.afm
|
|
||||||
|
|
||||||
for each AFM file that you wish to use. [This might change in the future]
|
|
||||||
|
|
||||||
You also require a PPD file for your printer. This describes certain
|
|
||||||
characteristics of the printer such as which fonts are installed, how to select
|
|
||||||
manual feed etc. Adobe also has many of these on its website, have a look in
|
|
||||||
ftp://ftp.adobe.com/pub/adobe/printerdrivers/win/all/
|
|
||||||
Create a [psdrv] section in your wine.conf (or ~/.winerc) and add the
|
|
||||||
following entry:
|
|
||||||
|
|
||||||
ppdfile=/somewhere/file.ppd
|
|
||||||
|
|
||||||
By default, the driver will look for a file named default.ppd in the directory
|
|
||||||
from which you started wine.
|
|
||||||
|
|
||||||
To enable colour printing you need to have the *ColorDevice entry in the PPD
|
|
||||||
set to true, otherwise the driver will generate greyscale.
|
|
||||||
|
|
||||||
Note that you need not set printer=on in the [wine] section of wine.conf, this
|
|
||||||
enables printing via external printer drivers and does not affect wineps.
|
|
||||||
|
|
||||||
If you're lucky you should now be able to produce PS files from Wine!
|
|
||||||
|
|
||||||
I've tested it with win3.1 notepad/write, Winword6 and Origin4.0 and 32 bit
|
|
||||||
apps such as win98 wordpad, Winword97, Powerpoint2000 with some degree of
|
|
||||||
success - you should be able to get something out, it may not be in the right
|
|
||||||
place.
|
|
||||||
|
|
||||||
If you don't have a PostScript printer here is a short additional description
|
|
||||||
how to get the Wine PostScript Driver running with ghostscript. I had some
|
|
||||||
success with ghostscript 5.10 from the SuSE 6.2 distribution. My ghostscript
|
|
||||||
package contains some AFM files in the directory /usr/share/ghostscript/fonts.
|
|
||||||
I have used these for the [afmfiles] section in my wine.conf (or ~/.winerc)
|
|
||||||
file.
|
|
||||||
|
|
||||||
There are also two PPD file in my ghostscript package. They are located in the
|
|
||||||
directory /usr/share/ghostscript/5.10. I have used the file cbjc600.ppd because
|
|
||||||
of the supported papersize. Because my PPD file needed some changes i have
|
|
||||||
copyed it to /usr/local/etc/gs.ppd and enterd it into the [psdrv] section in
|
|
||||||
my wine.conf (or ~/.winerc) file.
|
|
||||||
|
|
||||||
When i started wine after this settings i got an error when wine tried to pars
|
|
||||||
the PPD file. There was the ':' missing in the line:
|
|
||||||
|
|
||||||
*CloseUI: *PrintColors
|
|
||||||
|
|
||||||
After this fix the PPD file was successfull parsed, but printing was still not
|
|
||||||
possible. The reason is that the PPD file contains no font information. To
|
|
||||||
create the font information I run wine with -debugmsg +font and redirected the
|
|
||||||
output into a file. Than I filterd the file for lines containing 'FontName'
|
|
||||||
using the grep command and extracted the names of the fonts with the cut
|
|
||||||
command into a new file.
|
|
||||||
|
|
||||||
grep FontName LOGFILE | cut -f 2 -d\' | sort -u > add.ppd
|
|
||||||
|
|
||||||
Now '*Font ' needs to be inserted at the beginning of each line of the new
|
|
||||||
file. The end of each line needs to become ': Standard'. The last step is to
|
|
||||||
add these line to the PPD file. After this I was able to print some text using
|
|
||||||
wines buildin PostScript driver and ghostscript.
|
|
||||||
|
|
||||||
|
|
||||||
TODO / Bugs
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Driver does read PPD files, but ignores all constraints and doesn't let you
|
|
||||||
specify whether you have optional extras such as envelope feeders. You will
|
|
||||||
therefore find a larger than normal selection of input bins in the print setup
|
|
||||||
dialog box. I've only really tested ppd parsing on the hp4m6_v1.ppd file.
|
|
||||||
|
|
||||||
No TrueType download.
|
|
||||||
|
|
||||||
StretchDIBits uses level 2 PostScript.
|
|
||||||
|
|
||||||
AdvancedSetup dialog box.
|
|
||||||
|
|
||||||
Many partially implemented functions.
|
|
||||||
|
|
||||||
ps.c is becoming messy.
|
|
||||||
|
|
||||||
Notepad often starts text too far to the left depending on the margin
|
|
||||||
settings. However the win3.1 pscript.drv (under wine) also does this.
|
|
||||||
|
|
||||||
Probably many more...
|
|
||||||
|
|
||||||
Please contact me if you want to help so that we can avoid duplication.
|
|
||||||
|
|
||||||
Huw Davies <h.davies1@physics.ox.ac.uk>
|
|
|
@ -1,178 +0,0 @@
|
||||||
The Registry
|
|
||||||
------------
|
|
||||||
|
|
||||||
After Win3.x, the registry became a fundamental part of Windows. It is
|
|
||||||
the place where both Windows itself, and all
|
|
||||||
Win95/98/NT/2000/whatever-compliant applications, store configuration
|
|
||||||
and state data. While most sane system administrators (and Wine
|
|
||||||
developers) curse badly at the twisted nature of the Windows registry,
|
|
||||||
it is still necessary for Wine to support it somehow.
|
|
||||||
|
|
||||||
Registry structure
|
|
||||||
|
|
||||||
The Windows registry is an elaborate tree structure, and not even most
|
|
||||||
Windows programmers are fully aware of how the registry is laid out,
|
|
||||||
with its different "hives" and numerous links between them; a full
|
|
||||||
coverage is out of the scope of this document. But here are the basic
|
|
||||||
registry keys you might need to know about for now.
|
|
||||||
|
|
||||||
HKEY_LOCAL_MACHINE
|
|
||||||
This fundamental root key (in win9x, stored in the hidden file
|
|
||||||
system.dat) contains everything pertaining to the current
|
|
||||||
Windows installation.
|
|
||||||
|
|
||||||
HKEY_USERS
|
|
||||||
This fundamental root key (in win9x, stored in the hidden file
|
|
||||||
user.dat) contains configuration data for every user of the
|
|
||||||
installation.
|
|
||||||
|
|
||||||
HKEY_CLASSES_ROOT
|
|
||||||
This is a link to HKEY_LOCAL_MACHINE\Software\Classes. It
|
|
||||||
contains data describing things like file associations, OLE
|
|
||||||
document handlers, and COM classes.
|
|
||||||
|
|
||||||
HKEY_CURRENT_USER
|
|
||||||
This is a link to HKEY_USERS\your_username, i.e., your personal
|
|
||||||
configuration.
|
|
||||||
|
|
||||||
Using a Windows registry
|
|
||||||
|
|
||||||
If you point Wine at an existing MS Windows installation (by setting
|
|
||||||
the appropriate directories in wine.conf/.winerc), then Wine is able
|
|
||||||
to load registry data from it. However, Wine will not save anything to
|
|
||||||
the real Windows registry, but rather to its own registry files (see
|
|
||||||
below). Of course, if a particular registry value exists in both the
|
|
||||||
Windows registry and in the Wine registry, then Wine will use the
|
|
||||||
latter.
|
|
||||||
|
|
||||||
Occasionally, Wine may have trouble loading the Windows registry.
|
|
||||||
Usually, this is because the registry is inconsistent or damaged in
|
|
||||||
some way. If that becomes a problem, you may want to download the
|
|
||||||
regclean.exe from the MS website and use it to clean up the registry.
|
|
||||||
Alternatively, you can always use regedit.exe to export the registry
|
|
||||||
data you want into a text file, and then import it in Wine.
|
|
||||||
|
|
||||||
Wine registry data files
|
|
||||||
|
|
||||||
In the user's home directory, there is a subdirectory named .wine,
|
|
||||||
where Wine will try to save its registry by default. It saves into
|
|
||||||
four files, which are:
|
|
||||||
|
|
||||||
system.reg
|
|
||||||
This file contains HKEY_LOCAL_MACHINE.
|
|
||||||
|
|
||||||
user.reg
|
|
||||||
This file contains HKEY_CURRENT_USER.
|
|
||||||
|
|
||||||
userdef.reg
|
|
||||||
This file contains HKEY_USERS\.Default (i.e. the default user
|
|
||||||
settings).
|
|
||||||
|
|
||||||
wine.userreg
|
|
||||||
Wine saves HKEY_USERS to this file (both current and default
|
|
||||||
user), but does not load from it, unless userdef.reg is
|
|
||||||
missing.
|
|
||||||
|
|
||||||
All of these files are human-readable text files, so unlike Windows,
|
|
||||||
you can actually use an ordinary text editor on them if you must.
|
|
||||||
|
|
||||||
In addition to these files, Wine can also optionally load from global
|
|
||||||
registry files residing in the same directory as the global wine.conf
|
|
||||||
(i.e. /usr/local/etc if you compiled from source). These are:
|
|
||||||
|
|
||||||
wine.systemreg
|
|
||||||
Contains HKEY_LOCAL_MACHINE.
|
|
||||||
|
|
||||||
wine.userreg
|
|
||||||
Contains HKEY_USERS.
|
|
||||||
|
|
||||||
System administration
|
|
||||||
|
|
||||||
With the above file structure, it is possible for a system
|
|
||||||
administrator to configure the system so that a system Wine
|
|
||||||
installation (and applications) can be shared by all the users, and
|
|
||||||
still let the users all have their own personalized configuration. An
|
|
||||||
administrator can, after having installed Wine and any Windows
|
|
||||||
application software he wants the users to have access to, copy the
|
|
||||||
resulting system.reg and wine.userreg over to the global registry
|
|
||||||
files (which we assume will reside in /usr/local/etc here), with:
|
|
||||||
|
|
||||||
cd ~/.wine
|
|
||||||
cp system.reg /usr/local/etc/wine.systemreg
|
|
||||||
cp wine.userreg /usr/local/etc/wine.userreg
|
|
||||||
|
|
||||||
and perhaps even symlink these back to the administrator's account, to
|
|
||||||
make it easier to install apps system-wide later:
|
|
||||||
|
|
||||||
ln -sf /usr/local/etc/wine.systemreg system.reg
|
|
||||||
ln -sf /usr/local/etc/wine.userreg wine.userreg
|
|
||||||
|
|
||||||
Note that the tools/wineinstall script already does all of this for
|
|
||||||
you, if you install Wine as root. If you then install Windows
|
|
||||||
applications while logged in as root, all your users will
|
|
||||||
automatically be able to use them. While the application setup will be
|
|
||||||
taken from the global registry, the users' personalized configurations
|
|
||||||
will be saved in their own home directories.
|
|
||||||
|
|
||||||
But be careful with what you do with the administrator account - if
|
|
||||||
you do copy or link the administrator's registry to the global
|
|
||||||
registry, any user might be able to read the administrator's
|
|
||||||
preferences, which might not be good if sensitive information
|
|
||||||
(passwords, personal information, etc) is stored there. Only use the
|
|
||||||
administrator account to install software, not for daily work; use an
|
|
||||||
ordinary user account for that.
|
|
||||||
|
|
||||||
The default registry
|
|
||||||
|
|
||||||
A Windows registry contains many keys by default, and some of them are
|
|
||||||
necessary for even installers to operate correctly. The keys that the
|
|
||||||
Wine developers have found necessary to install applications are
|
|
||||||
distributed in a file called "winedefault.reg". It is automatically
|
|
||||||
installed for you if you use the tools/wineinstall script, but if you
|
|
||||||
want to install it manually, you can do so by using the regapi tool.
|
|
||||||
You can find more information about this in the
|
|
||||||
documentation/no-windows document in the Wine distribution.
|
|
||||||
|
|
||||||
The [registry] section
|
|
||||||
|
|
||||||
With the above information fresh in mind, let's look at the
|
|
||||||
wine.conf/.winerc options for handling the registry.
|
|
||||||
|
|
||||||
LoadGlobalRegistryFiles
|
|
||||||
Controls whether to try to load the global registry files, if
|
|
||||||
they exist.
|
|
||||||
|
|
||||||
LoadHomeRegistryFiles
|
|
||||||
Controls whether to try to load the user's registry files (in
|
|
||||||
the .wine subdirectory of the user's home directory).
|
|
||||||
|
|
||||||
LoadWindowsRegistryFiles
|
|
||||||
Controls whether Wine will attempt to load registry data from a
|
|
||||||
real Windows registry in an existing MS Windows installation.
|
|
||||||
|
|
||||||
WritetoHomeRegistryFiles
|
|
||||||
Controls whether registry data will be written to the user's
|
|
||||||
registry files. (Currently, there is no alternative, so if you
|
|
||||||
turn this off, Wine cannot save the registry on disk at all;
|
|
||||||
after you exit Wine, your changes will be lost.)
|
|
||||||
|
|
||||||
UseNewFormat
|
|
||||||
This option is obsolete. Wine now always use the new format;
|
|
||||||
support for the old format was removed a while ago.
|
|
||||||
|
|
||||||
PeriodicSave
|
|
||||||
If this option is set to a nonzero value, it specifies that you
|
|
||||||
want the registry to be saved to disk at the given interval. If
|
|
||||||
it is not set, the registry will only be saved to disk when the
|
|
||||||
wineserver terminates.
|
|
||||||
|
|
||||||
SaveOnlyUpdatedKeys
|
|
||||||
Controls whether the entire registry is saved to the user's
|
|
||||||
registry files, or only subkeys the user have actually changed.
|
|
||||||
Considering that the user's registry will override any global
|
|
||||||
registry files and Windows registry files, it usually makes
|
|
||||||
sense to only save user-modified subkeys; that way, changes to
|
|
||||||
the rest of the global or Windows registries will still affect
|
|
||||||
the user.
|
|
||||||
|
|
||||||
- Ove Kåven
|
|
|
@ -0,0 +1,344 @@
|
||||||
|
<sect1 id="registry">
|
||||||
|
<title>The Registry</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by Ove Kåven
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/registry</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
After Win3.x, the registry became a fundamental part of Windows.
|
||||||
|
It is the place where both Windows itself, and all
|
||||||
|
Win95/98/NT/2000/whatever-compliant applications, store
|
||||||
|
configuration and state data. While most sane system
|
||||||
|
administrators (and Wine developers) curse badly at the twisted
|
||||||
|
nature of the Windows registry, it is still necessary for Wine
|
||||||
|
to support it somehow.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Registry structure</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The Windows registry is an elaborate tree structure, and not
|
||||||
|
even most Windows programmers are fully aware of how the
|
||||||
|
registry is laid out, with its different "hives" and numerous
|
||||||
|
links between them; a full coverage is out of the scope of
|
||||||
|
this document. But here are the basic registry keys you might
|
||||||
|
need to know about for now.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>HKEY_LOCAL_MACHINE</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
This fundamental root key (in win9x, stored in the
|
||||||
|
hidden file <filename>system.dat</filename>) contains
|
||||||
|
everything pertaining to the current Windows
|
||||||
|
installation.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>HKEY_USERS</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
This fundamental root key (in win9x, stored in the
|
||||||
|
hidden file <filename>user.dat</filename>) contains
|
||||||
|
configuration data for every user of the installation.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>HKEY_CLASSES_ROOT</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
This is a link to HKEY_LOCAL_MACHINE\Software\Classes.
|
||||||
|
It contains data describing things like file
|
||||||
|
associations, OLE document handlers, and COM classes.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>HKEY_CURRENT_USER</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
This is a link to HKEY_USERS\your_username, i.e., your
|
||||||
|
personal configuration.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Using a Windows registry</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
If you point Wine at an existing MS Windows installation (by
|
||||||
|
setting the appropriate directories in
|
||||||
|
<filename>wine.conf</filename> or
|
||||||
|
<filename>.winerc</filename>), then Wine is able to load
|
||||||
|
registry data from it. However, Wine will not save anything to
|
||||||
|
the real Windows registry, but rather to its own registry
|
||||||
|
files (see below). Of course, if a particular registry value
|
||||||
|
exists in both the Windows registry and in the Wine registry,
|
||||||
|
then Wine will use the latter.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Occasionally, Wine may have trouble loading the Windows
|
||||||
|
registry. Usually, this is because the registry is
|
||||||
|
inconsistent or damaged in some way. If that becomes a
|
||||||
|
problem, you may want to download the
|
||||||
|
<filename>regclean.exe</filename> from the MS website and use
|
||||||
|
it to clean up the registry. Alternatively, you can always use
|
||||||
|
<filename>regedit.exe</filename> to export the registry data
|
||||||
|
you want into a text file, and then import it in Wine.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Wine registry data filesr</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
In the user's home directory, there is a subdirectory named
|
||||||
|
<filename>.wine</filename>, where Wine will try to save its
|
||||||
|
registry by default. It saves into four files, which are:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>system.reg</filename></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
This file contains HKEY_LOCAL_MACHINE.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>user.reg</filename></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
This file contains HKEY_CURRENT_USER.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>userdef.reg</filename></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
This file contains HKEY_USERS\.Default (i.e. the default
|
||||||
|
user settings).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>wine.userreg</filename></term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Wine saves HKEY_USERS to this file (both current and
|
||||||
|
default user), but does not load from it, unless
|
||||||
|
<filename>userdef.reg</filename> is missing.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
<para>
|
||||||
|
All of these files are human-readable text files, so unlike
|
||||||
|
Windows, you can actually use an ordinary text editor on them
|
||||||
|
if you must.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
In addition to these files, Wine can also optionally load from
|
||||||
|
global registry files residing in the same directory as the
|
||||||
|
global <filename>wine.conf</filename> (i.e.
|
||||||
|
<filename>/usr/local/etc</filename> if you compiled from
|
||||||
|
source). These are:
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>wine.systemreg</filename></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Contains HKEY_LOCAL_MACHINE.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>wine.userreg</filename></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Contains HKEY_USERS.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>System administration</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
With the above file structure, it is possible for a system
|
||||||
|
administrator to configure the system so that a system Wine
|
||||||
|
installation (and applications) can be shared by all the
|
||||||
|
users, and still let the users all have their own personalized
|
||||||
|
configuration. An administrator can, after having installed
|
||||||
|
Wine and any Windows application software he wants the users
|
||||||
|
to have access to, copy the resulting
|
||||||
|
<filename>system.reg</filename> and
|
||||||
|
<filename>wine.userreg</filename> over to the global registry
|
||||||
|
files (which we assume will reside in
|
||||||
|
<filename>/usr/local/etc</filename> here), with:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
cd ~/.wine
|
||||||
|
cp system.reg /usr/local/etc/wine.systemreg
|
||||||
|
cp wine.userreg /usr/local/etc/wine.userreg
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
and perhaps even symlink these back to the administrator's
|
||||||
|
account, to make it easier to install apps system-wide later:
|
||||||
|
</para>
|
||||||
|
<screen>
|
||||||
|
ln -sf /usr/local/etc/wine.systemreg system.reg
|
||||||
|
ln -sf /usr/local/etc/wine.userreg wine.userreg
|
||||||
|
</screen>
|
||||||
|
<para>
|
||||||
|
Note that the <filename>tools/wineinstall</filename> script
|
||||||
|
already does all of this for you, if you install Wine as root.
|
||||||
|
If you then install Windows applications while logged in as
|
||||||
|
root, all your users will automatically be able to use them.
|
||||||
|
While the application setup will be taken from the global
|
||||||
|
registry, the users' personalized configurations will be saved
|
||||||
|
in their own home directories.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
But be careful with what you do with the administrator account
|
||||||
|
- if you do copy or link the administrator's registry to the
|
||||||
|
global registry, any user might be able to read the
|
||||||
|
administrator's preferences, which might not be good if
|
||||||
|
sensitive information (passwords, personal information, etc)
|
||||||
|
is stored there. Only use the administrator account to install
|
||||||
|
software, not for daily work; use an ordinary user account for
|
||||||
|
that.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>The default registry</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
A Windows registry contains many keys by default, and some of
|
||||||
|
them are necessary for even installers to operate correctly.
|
||||||
|
The keys that the Wine developers have found necessary to
|
||||||
|
install applications are distributed in a file called
|
||||||
|
<filename>winedefault.reg</filename>. It is automatically
|
||||||
|
installed for you if you use the
|
||||||
|
<filename>tools/wineinstall</filename> script, but if you want
|
||||||
|
to install it manually, you can do so by using the
|
||||||
|
<command>regapi</command> tool. You can find more information
|
||||||
|
about this in the
|
||||||
|
<filename>documentation/no-windows</filename> document in the
|
||||||
|
Wine distribution.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>The [registry] section</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
With the above information fresh in mind, let's look at the
|
||||||
|
<filename>wine.conf</filename>/<filename>.winerc</filename>
|
||||||
|
options for handling the registry.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term>LoadGlobalRegistryFiles</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Controls whether to try to load the global registry
|
||||||
|
files, if they exist.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>LoadHomeRegistryFiles</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Controls whether to try to load the user's registry
|
||||||
|
files (in the <filename>.wine</filename> subdirectory of
|
||||||
|
the user's home directory).
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>LoadWindowsRegistryFiles</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Controls whether Wine will attempt to load registry data
|
||||||
|
from a real Windows registry in an existing MS Windows
|
||||||
|
installation.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>WritetoHomeRegistryFiles</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Controls whether registry data will be written to the
|
||||||
|
user's registry files. (Currently, there is no
|
||||||
|
alternative, so if you turn this off, Wine cannot save
|
||||||
|
the registry on disk at all; after you exit Wine, your
|
||||||
|
changes will be lost.)
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>UseNewFormat</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
This option is obsolete. Wine now always use the new
|
||||||
|
format; support for the old format was removed a while
|
||||||
|
ago.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>PeriodicSave</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
If this option is set to a nonzero value, it specifies
|
||||||
|
that you want the registry to be saved to disk at the
|
||||||
|
given interval. If it is not set, the registry will only
|
||||||
|
be saved to disk when the wineserver terminates.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term>SaveOnlyUpdatedKeys</term>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
Controls whether the entire registry is saved to the
|
||||||
|
user's registry files, or only subkeys the user have
|
||||||
|
actually changed. Considering that the user's registry
|
||||||
|
will override any global registry files and Windows
|
||||||
|
registry files, it usually makes sense to only save
|
||||||
|
user-modified subkeys; that way, changes to the rest of
|
||||||
|
the global or Windows registries will still affect the
|
||||||
|
user.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("configuring.sgml" "chapter" "sect1" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -1,45 +0,0 @@
|
||||||
This document desribes tools for handling resources within wine
|
|
||||||
|
|
||||||
### bin2res ###
|
|
||||||
|
|
||||||
This tool allows the editing of embedded binary resources within
|
|
||||||
*.rc files. These resources are stored as hex dump so they can be
|
|
||||||
stored within the cvs. This makes the editing of the embedded
|
|
||||||
bitmaps and icons harder.
|
|
||||||
|
|
||||||
### Create binary files from.rc ###
|
|
||||||
|
|
||||||
the resources in the .rc file have to be marked by a header:
|
|
||||||
|
|
||||||
/* BINRES idb_std_small.bmp */
|
|
||||||
IDB_STD_SMALL BITMAP LOADONCALL DISCARDABLE
|
|
||||||
{
|
|
||||||
'42 4D 20 07 00 00 00 00 00 00 76 00 00 00 28 00'
|
|
||||||
|
|
||||||
BINRES is the keyword followed by a filename.
|
|
||||||
"bin2res -d bin rsrc.rc" generates binary files from all marked
|
|
||||||
resources. If the binary file is newer it gets not overwritten.
|
|
||||||
To force overwriting use the -f switch.
|
|
||||||
|
|
||||||
### Create a .rc file from binaries ###
|
|
||||||
|
|
||||||
Put a header followed by empty brackets in the.rc file.
|
|
||||||
|
|
||||||
/* BINRES idb_std_small.bmp */
|
|
||||||
{}
|
|
||||||
|
|
||||||
Then run "bin2res rsrc.rc". It will merge the resources into the
|
|
||||||
.rc file if the binary resources are newer than the.rc file.
|
|
||||||
To force the resources into the.rc file use the -f switch.
|
|
||||||
If there is already a resource with the same filename in the.rc
|
|
||||||
file it gets overwritten.
|
|
||||||
|
|
||||||
### output of bin2res ###
|
|
||||||
|
|
||||||
bash-2.03# ../../tools/bin2res -d bin shres.rc
|
|
||||||
[000.ico:c][003.ico:c][008.ico:s][015.ico:s][034.ico:s]
|
|
||||||
|
|
||||||
s means skiped, c means changed
|
|
||||||
---
|
|
||||||
|
|
||||||
juergen.schmied@debitel.net (11/99)
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
<chapter id="running">
|
||||||
|
<title>Running Wine</title>
|
||||||
|
<para>Explain the command-line options you can use to run Wine</para>
|
||||||
|
|
||||||
|
<sect1 id="running-wine">
|
||||||
|
<title>How to run Wine</title>
|
||||||
|
<para>
|
||||||
|
The first thing you need to do is...
|
||||||
|
</para>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -0,0 +1,94 @@
|
||||||
|
<chapter id="tools">
|
||||||
|
<title>Tools</title>
|
||||||
|
|
||||||
|
<sect1 id="bin2res">
|
||||||
|
<title>bin2res</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
written by juergen.schmied@debitel.net (11/99)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
(Extracted from <filename>wine/documentation/resources</filename>)
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This document desribes tools for handling resources within wine
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>bin2res</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
This tool allows the editing of embedded binary resources
|
||||||
|
within <filename>*.rc</filename> files. These resources are
|
||||||
|
stored as hex dump so they can be stored within the cvs
|
||||||
|
tree. This makes the editing of the embedded bitmaps and
|
||||||
|
icons harder.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Create binary files from an <filename>.rc</filename> file</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
The resources in the <filename>.rc</filename> file have to
|
||||||
|
be marked by a header:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
/* BINRES idb_std_small.bmp */
|
||||||
|
IDB_STD_SMALL BITMAP LOADONCALL DISCARDABLE
|
||||||
|
{
|
||||||
|
'42 4D 20 07 00 00 00 00 00 00 76 00 00 00 28 00'
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
<constant>BINRES</constant> is the keyword followed by a
|
||||||
|
filename. <command>bin2res -d bin rsrc.rc</command>
|
||||||
|
generates binary files from all marked resources. If the
|
||||||
|
binary file is newer it gets not overwritten. To force
|
||||||
|
overwriting use the <parameter>-f</parameter> switch.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>Create a <filename>.rc</filename> file from binaries</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
Put a header followed by empty brackets in the
|
||||||
|
<filename>.rc</filename> file.
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
/* BINRES idb_std_small.bmp */
|
||||||
|
{}
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
Then run <command>bin2res rsrc.rc</command>. It will merge
|
||||||
|
the resources into the <filename>.rc</filename> file if the
|
||||||
|
binary resources are newer than the.rc file. To force the
|
||||||
|
resources into the <filename>.rc</filename> file use the
|
||||||
|
<parameter>-f</parameter> switch. If there is already a
|
||||||
|
resource with the same filename in the
|
||||||
|
<filename>.rc</filename> file it gets overwritten.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
|
||||||
|
<sect2>
|
||||||
|
<title>output of <command>bin2res</command></title>
|
||||||
|
|
||||||
|
<programlisting>
|
||||||
|
bash-2.03# ../../tools/bin2res -d bin shres.rc
|
||||||
|
[000.ico:c][003.ico:c][008.ico:s][015.ico:s][034.ico:s]
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
<literal>s</literal> means skipped, <literal>c</literal>
|
||||||
|
means changed.
|
||||||
|
</para>
|
||||||
|
</sect2>
|
||||||
|
</sect1>
|
||||||
|
</chapter>
|
||||||
|
|
||||||
|
<!-- Keep this comment at the end of the file
|
||||||
|
Local variables:
|
||||||
|
mode: sgml
|
||||||
|
sgml-parent-document:("wine-doc.sgml" "book" "part" "chapter" "")
|
||||||
|
End:
|
||||||
|
-->
|
|
@ -1,50 +0,0 @@
|
||||||
1. Get freetype-1.0.full.tar.gz
|
|
||||||
2. Read docus, unpack, configure and install
|
|
||||||
3. Test the library, e.g. "ftview 20 /dosc/win95/fonts/times "
|
|
||||||
4. Get xfsft-beta1e.linux-i586
|
|
||||||
5. Install it and start it when booting, e.g. in an rc-script.
|
|
||||||
The manpage for xfs applies.
|
|
||||||
6. Follow the hints given by williamc@dai.ed.ac.uk
|
|
||||||
==========
|
|
||||||
I got xfsft from http://www.dcs.ed.ac.uk/home/jec/progindex.html.
|
|
||||||
I have it running all the time. Here is /usr/X11R6/lib/X11/fs/config:
|
|
||||||
clone-self = on
|
|
||||||
use-syslog = off
|
|
||||||
catalogue = /c/windows/fonts
|
|
||||||
error-file = /usr/X11R6/lib/X11/fs/fs-errors
|
|
||||||
default-point-size = 120
|
|
||||||
default-resolutions = 75,75,100,100
|
|
||||||
Obviously /c/windows/fonts is where my Windows fonts on my
|
|
||||||
Win95 C: drive live; could be e.g. /mnt/dosC/windows/system
|
|
||||||
for Win31.
|
|
||||||
In /c/windows/fonts/fonts.scale I have
|
|
||||||
14
|
|
||||||
arial.ttf -monotype-arial-medium-r-normal--0-0-0-0-p-0-iso8859-1
|
|
||||||
arialbd.ttf -monotype-arial-bold-r-normal--0-0-0-0-p-0-iso8859-1
|
|
||||||
arialbi.ttf -monotype-arial-bold-o-normal--0-0-0-0-p-0-iso8859-1
|
|
||||||
ariali.ttf -monotype-arial-medium-o-normal--0-0-0-0-p-0-iso8859-1
|
|
||||||
cour.ttf -monotype-courier-medium-r-normal--0-0-0-0-p-0-iso8859-1
|
|
||||||
courbd.ttf -monotype-courier-bold-r-normal--0-0-0-0-p-0-iso8859-1
|
|
||||||
courbi.ttf -monotype-courier-bold-o-normal--0-0-0-0-p-0-iso8859-1
|
|
||||||
couri.ttf -monotype-courier-medium-o-normal--0-0-0-0-p-0-iso8859-1
|
|
||||||
times.ttf -monotype-times-medium-r-normal--0-0-0-0-p-0-iso8859-1
|
|
||||||
timesbd.ttf -monotype-times-bold-r-normal--0-0-0-0-p-0-iso8859-1
|
|
||||||
timesbi.ttf -monotype-times-bold-i-normal--0-0-0-0-p-0-iso8859-1
|
|
||||||
timesi.ttf -monotype-times-medium-i-normal--0-0-0-0-p-0-iso8859-1
|
|
||||||
symbol.ttf -monotype-symbol-medium-r-normal--0-0-0-0-p-0-microsoft-symbol
|
|
||||||
wingding.ttf -microsoft-wingdings-medium-r-normal--0-0-0-0-p-0-microsoft-symbol
|
|
||||||
|
|
||||||
In /c/windows/fonts/fonts.dir I have exactly the same.
|
|
||||||
|
|
||||||
In /usr/X11R6/lib/X11/XF86Config I have
|
|
||||||
FontPath "tcp/localhost:7100"
|
|
||||||
in front of the other FontPath lines.
|
|
||||||
That's it! As an interesting by-product of course, all those web
|
|
||||||
pages which specify Arial come up in Arial in Netscape ...
|
|
||||||
=======
|
|
||||||
7. Shut down X and restart ( and debug errors you did while setting
|
|
||||||
up everything.
|
|
||||||
|
|
||||||
8. Test with e.g "xlsfont |grep arial"
|
|
||||||
|
|
||||||
Hope this helps
|
|
|
@ -1,24 +0,0 @@
|
||||||
Win95/Win98 interface code is being introduced.
|
|
||||||
|
|
||||||
Instead of compiling Wine for Win3.1 vs. Win95 using #define switches,
|
|
||||||
the code now looks in a special [Tweak.Layout] section of wine.conf
|
|
||||||
for a "WineLook=Win95" or "WineLook=Win98" entry.
|
|
||||||
|
|
||||||
A few new sections and a number of entries have been added to the
|
|
||||||
wine.conf file -- these are for debugging the Win95 tweaks only and may
|
|
||||||
be removed in a future release! These entries/sections are:
|
|
||||||
|
|
||||||
[Tweak.Fonts]
|
|
||||||
System.Height=<point size> # Sets the height of the system typeface
|
|
||||||
System.Bold=[true|false] # Whether the system font should be boldfaced
|
|
||||||
System.Italic=[true|false] # Whether the system font should be italicized
|
|
||||||
System.Underline=[true|false] # Whether the system font should be underlined
|
|
||||||
System.StrikeOut=[true|false] # Whether the system font should be struck out
|
|
||||||
OEMFixed.xxx # Same parameters for the OEM fixed typeface
|
|
||||||
AnsiFixed.xxx # Same parameters for the Ansi fixed typeface
|
|
||||||
AnsiVar.xxx # Same parameters for the Ansi variable typeface
|
|
||||||
SystemFixed.xxx # Same parameters for the System fixed typeface
|
|
||||||
|
|
||||||
[Tweak.Layout]
|
|
||||||
WineLook=[Win31|Win95|Win98] # Changes Wine's look and feel
|
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
<!doctype book PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [
|
||||||
|
|
||||||
|
<!entity running SYSTEM "running.sgml">
|
||||||
|
<!entity installing SYSTEM "installing.sgml">
|
||||||
|
<!entity configuring SYSTEM "configuring.sgml">
|
||||||
|
<!entity registry SYSTEM "registry.sgml">
|
||||||
|
<!entity bugs SYSTEM "bugs.sgml">
|
||||||
|
<!entity fonts SYSTEM "fonts.sgml">
|
||||||
|
<!entity printing SYSTEM "printing.sgml">
|
||||||
|
|
||||||
|
<!entity compiling SYSTEM "compiling.sgml">
|
||||||
|
<!entity debugging SYSTEM "debugging.sgml">
|
||||||
|
<!entity documentation SYSTEM "documentation.sgml">
|
||||||
|
<!entity patches SYSTEM "patches.sgml">
|
||||||
|
<!entity i18n SYSTEM "i18n.sgml">
|
||||||
|
<!entity porting SYSTEM "porting.sgml">
|
||||||
|
|
||||||
|
<!entity packaging SYSTEM "packaging.sgml">
|
||||||
|
|
||||||
|
<!entity architecture SYSTEM "architecture.sgml">
|
||||||
|
<!entity debugger SYSTEM "debugger.sgml">
|
||||||
|
<!entity consoles SYSTEM "consoles.sgml">
|
||||||
|
<!entity implementation SYSTEM "implementation.sgml">
|
||||||
|
<!entity opengl SYSTEM "opengl.sgml">
|
||||||
|
<!entity build SYSTEM "build.sgml">
|
||||||
|
<!entity tools SYSTEM "tools.sgml">
|
||||||
|
<!entity dlls SYSTEM "dlls.sgml">
|
||||||
|
<!entity status SYSTEM "status.sgml">
|
||||||
|
]>
|
||||||
|
|
||||||
|
<book id="index">
|
||||||
|
<bookinfo>
|
||||||
|
<title>Wine Documentation</title>
|
||||||
|
</bookinfo>
|
||||||
|
|
||||||
|
<preface id="preface">
|
||||||
|
<title>Notes About this Document</title>
|
||||||
|
<para>
|
||||||
|
The following documentation has been extracted from the Wine
|
||||||
|
source tree, from the <filename>wine/documentation</filename>
|
||||||
|
directory. So far, no new content has been added aside from
|
||||||
|
marking it up for DocBook and a few minor tweaks to smooth
|
||||||
|
that process. All credit should go to the original authors,
|
||||||
|
who are attributed according the the "written by" comments
|
||||||
|
in those files. If I've missed anyone, please contact
|
||||||
|
<email>John R. Sheets <jsheets@codeweavers.com></email>
|
||||||
|
</para>
|
||||||
|
</preface>
|
||||||
|
|
||||||
|
<part id="part-one">
|
||||||
|
<title>Using Wine</title>
|
||||||
|
|
||||||
|
&running;
|
||||||
|
&installing;
|
||||||
|
&configuring;
|
||||||
|
&bugs;
|
||||||
|
&fonts;
|
||||||
|
&printing;
|
||||||
|
|
||||||
|
</part>
|
||||||
|
|
||||||
|
<part id="part-two">
|
||||||
|
<title>Developing Wine</title>
|
||||||
|
|
||||||
|
&compiling;
|
||||||
|
&debugging;
|
||||||
|
&documentation;
|
||||||
|
&patches;
|
||||||
|
&i18n;
|
||||||
|
&porting;
|
||||||
|
|
||||||
|
</part>
|
||||||
|
|
||||||
|
<part id="part-three">
|
||||||
|
<title>Distributing Wine</title>
|
||||||
|
|
||||||
|
&packaging;
|
||||||
|
|
||||||
|
</part>
|
||||||
|
|
||||||
|
<part id="part-four">
|
||||||
|
<title>Wine Architecture</title>
|
||||||
|
|
||||||
|
&architecture;
|
||||||
|
&debugger;
|
||||||
|
&consoles;
|
||||||
|
&implementation;
|
||||||
|
&opengl;
|
||||||
|
&build;
|
||||||
|
&tools;
|
||||||
|
&dlls;
|
||||||
|
|
||||||
|
</part>
|
||||||
|
</book>
|
|
@ -1,52 +0,0 @@
|
||||||
Running & Compiling WINE in OS/2
|
|
||||||
|
|
||||||
If you want to help for the port of WINE to OS/2,
|
|
||||||
send me a message at krynos@clic.net
|
|
||||||
I currently don't want beta testers. It must work before we can test it.
|
|
||||||
|
|
||||||
Here is what you need to (try to) compile Wine for OS/2:
|
|
||||||
EMX 0.9c (fix 2)
|
|
||||||
XFree86 3.2 OS/2 (with development libraries)
|
|
||||||
bash, gnu make, grep, tar, bison, flex
|
|
||||||
sed (a working copy of)
|
|
||||||
xpm
|
|
||||||
diff and patch are recommended
|
|
||||||
Lots of disk space (about 40-50 megs after EMX and XFree installed)
|
|
||||||
|
|
||||||
To compile:
|
|
||||||
sh
|
|
||||||
tools/make_os2.sh
|
|
||||||
make depend
|
|
||||||
make
|
|
||||||
emxbind wine
|
|
||||||
|
|
||||||
Currently:
|
|
||||||
- configure and make depend work...
|
|
||||||
- make compiles (with a modified Linux mman.h), but doesn't link.
|
|
||||||
- signal handling is horrible... (if any)
|
|
||||||
- EMX doesn't support mmap (and related), SysV IPC and stafs()
|
|
||||||
- XFree86/OS2 3.2 doesn't support XShmQueryExtension() and XShmPixmapFormat()
|
|
||||||
due to the same lack in EMX...
|
|
||||||
|
|
||||||
What needs to be redone:
|
|
||||||
- LDT (using DosAllocSeg in memory/ldt.c) *
|
|
||||||
- implement mmap() and SysV IPC in EMX *
|
|
||||||
- File functions,
|
|
||||||
- I/O access (do it!),
|
|
||||||
- Communication (modem),
|
|
||||||
- Interrupt (if int unknown, call current RealMode one...),
|
|
||||||
- verify that everything is thread safe (how does Win95/NT handle multi-thread?),
|
|
||||||
- move X functions in some files (and make a wrapper, to use PM instead latter),
|
|
||||||
- return right CPU type,
|
|
||||||
- make winsock work
|
|
||||||
* Top priority
|
|
||||||
|
|
||||||
The good things:
|
|
||||||
- OS/2 have DOS interrupts
|
|
||||||
- OS/2 have I/O port access
|
|
||||||
- OS/2 have multi-thread
|
|
||||||
- Merlin have Open32 (to be used later...)
|
|
||||||
|
|
||||||
Robert Pouliot <krynos@clic.net>
|
|
||||||
January 9, 1997
|
|
||||||
|
|
|
@ -1,476 +0,0 @@
|
||||||
I Introduction
|
|
||||||
==============
|
|
||||||
|
|
||||||
I.1 Processes and threads: in underlying OS and in Windows
|
|
||||||
----------------------------------------------------------
|
|
||||||
Before going into the depths of debugging in Wine, here's a small
|
|
||||||
overview of process and thread handling in Wine. It has to be clear
|
|
||||||
that there are two different beasts: processes/threads from the Unix
|
|
||||||
point of view and processes/threads from a Windows point of view.
|
|
||||||
|
|
||||||
Each Windows' thread is implemented as a Unix process (under Linux
|
|
||||||
using the clone syscall), meaning that all threads of a same Windows'
|
|
||||||
process share the same (unix) address space.
|
|
||||||
|
|
||||||
In the following:
|
|
||||||
+ W-process means a process in Windows' terminology
|
|
||||||
+ U-process means a process in Unix' terminology
|
|
||||||
+ W-thread means a thread in Windows' terminology
|
|
||||||
|
|
||||||
A W-process is made of one or several W-threads.
|
|
||||||
Each W-thread is mapped to one and only one U-process. All U-processes
|
|
||||||
of a same W-process share the same address space.
|
|
||||||
|
|
||||||
Each Unix process can be identified by two values:
|
|
||||||
- the Unix process id (upid in the following)
|
|
||||||
- the Windows's thread id (tid)
|
|
||||||
Each Windows' process has also a Windows' process (wpid in the
|
|
||||||
following). It must be clear that upid and wpid are different and
|
|
||||||
shall not be used instead of the other.
|
|
||||||
|
|
||||||
Wpid and tid are defined (Windows) system wide. They must not be
|
|
||||||
confused with process or thread handles which, as any handle, is an
|
|
||||||
indirection to a system object (in this case process or thread). A
|
|
||||||
same process can have several different handles on the same kernel
|
|
||||||
object. The handles can be defined as local (the values is only valid
|
|
||||||
in a process), or system wide (the same handle can be used by any
|
|
||||||
W-process).
|
|
||||||
|
|
||||||
|
|
||||||
I.2 Wine, debugging and WineDbg
|
|
||||||
-------------------------------
|
|
||||||
When talking of debugging in Wine, there are at least two levels to
|
|
||||||
think of:
|
|
||||||
+ the Windows' debugging API.
|
|
||||||
+ the Wine integrated debugger, dubbed WineDbg.
|
|
||||||
|
|
||||||
Wine implements most the the Windows' debugging API (the part in
|
|
||||||
KERNEL32, not the one in IMAGEHLP.DLL), and allows any program
|
|
||||||
(emulated or WineLib) using that API to debug a W-process.
|
|
||||||
|
|
||||||
WineDbg is a WineLib application making use of this API to allow
|
|
||||||
debugging both any Wine or WineLib applications as well as Wine itself
|
|
||||||
(kernel and all DLLs).
|
|
||||||
|
|
||||||
II WineDbg's modes of invocation
|
|
||||||
================================
|
|
||||||
|
|
||||||
II.1 Starting a process
|
|
||||||
-----------------------
|
|
||||||
Any application (either a Windows' native executable, or a WineLib
|
|
||||||
application) can be run through WineDbg. Command line options and
|
|
||||||
tricks are the same than for wine:
|
|
||||||
|
|
||||||
winedbg telnet.exe
|
|
||||||
winedbg "hl.exe -windowed"
|
|
||||||
|
|
||||||
II.2 Attaching
|
|
||||||
--------------
|
|
||||||
WineDbg can also launched without any command line argument:
|
|
||||||
- WineDbg is started without any attached process. You can get a list
|
|
||||||
of running W-processes (and their wpid:s) using 'walk process'
|
|
||||||
command, and then, with the attach command, pick up the wpid of the
|
|
||||||
W-process you want to debug.
|
|
||||||
|
|
||||||
This is (for now) a neat feature for the following reasons:
|
|
||||||
* debug an already started application
|
|
||||||
|
|
||||||
II.3 On exception
|
|
||||||
-----------------
|
|
||||||
When something goes wrong, Windows track this as an
|
|
||||||
exception. Exceptions exist for segmentation violation, stack
|
|
||||||
overflow, division by zero...
|
|
||||||
|
|
||||||
When an exception occurs, Wine checks if the W-process is debugged. If
|
|
||||||
so, the exception event is sent to the debugger, which takes care of
|
|
||||||
it: end of the story. This mechanism is part of the standard Windows'
|
|
||||||
debugging API.
|
|
||||||
|
|
||||||
If the W-process is not debugged, Wine tries to launch a
|
|
||||||
debugger. This debugger (normally WineDbg, see III Configuration for
|
|
||||||
more details), at startup, attaches to the W-process which generated
|
|
||||||
the exception event. In this case, you are able to look at the causes
|
|
||||||
of the exception, and either fix the causes (and continue further the
|
|
||||||
execution) or dig deeper to understand what went wrong.
|
|
||||||
|
|
||||||
If WineDbg is the standard debugger, the 'pass' and 'cont' commands
|
|
||||||
are the two ways to let the process go further for the handling of the
|
|
||||||
exception event.
|
|
||||||
|
|
||||||
To be more precise on the way Wine (and Windows) generates exception
|
|
||||||
events, when a fault occurs (segmentation violation, stack
|
|
||||||
overflow...), the event is first sent to the debugger (this is know as
|
|
||||||
a first chance exception). The debugger can give two answers:
|
|
||||||
- continue: the debugger had the ability to correct what's generated
|
|
||||||
the exception, and is now able to continue process execution.
|
|
||||||
- pass: the debugger couldn't correct the cause of the (first chance
|
|
||||||
exception). Wine will now try to walk the list of exception handlers
|
|
||||||
to see if one of them can handle the exception. If no exception
|
|
||||||
handler is found, the exception is sent once again to the debugger to
|
|
||||||
indicate the failure of the exception handling.
|
|
||||||
|
|
||||||
Note: since some of Wine's code uses exceptions and try/catch blocks
|
|
||||||
to provide some functionality, WineDbg can be entered in such cases
|
|
||||||
with segv exceptions. This happens, for example, with IsBadReadPtr
|
|
||||||
function. In that case, the pass command shall be used, to let the
|
|
||||||
handling of the exception to be done by the catch block in
|
|
||||||
IsBadReadPtr.
|
|
||||||
|
|
||||||
II.4 Quitting
|
|
||||||
-------------
|
|
||||||
Unfortunately, Windows' don't provide a detach kind of API, meaning
|
|
||||||
that once you started debugging a process, you must do so until the
|
|
||||||
process dies. Killing (or stopping/aborting) the debugger will also
|
|
||||||
kill the debugged process.
|
|
||||||
This will be true for any Windows' debugging API compliant debugger,
|
|
||||||
starting with WineDbg.
|
|
||||||
|
|
||||||
III Configuration
|
|
||||||
=================
|
|
||||||
|
|
||||||
III.1 Registry configuration
|
|
||||||
----------------------------
|
|
||||||
The Windows' debugging API uses a registry entry to know with debugger
|
|
||||||
to invoke when an unhandled exception occurs (see II.3 for some
|
|
||||||
details).
|
|
||||||
Two values in key
|
|
||||||
"MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug"
|
|
||||||
determine the behavior:
|
|
||||||
+ Debugger: this is the command line used to launch the debugger (it
|
|
||||||
uses two printf formats (%ld) to pass context dependent information to
|
|
||||||
the debugger). You should put here a complete path to your debugger
|
|
||||||
(WineDbg can of course be used, but any other Windows' debugging API
|
|
||||||
aware debugger will do).
|
|
||||||
+ Auto: if this value is zero, a message box will ask the user if
|
|
||||||
he/she wishes to launch the debugger when an unhandled exception
|
|
||||||
occurs. Otherwise, the debugger is automatically started.
|
|
||||||
|
|
||||||
A regular Wine registry looks like:
|
|
||||||
[MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug] 957636538
|
|
||||||
"Auto"=dword:00000001
|
|
||||||
"Debugger"="/usr/local/bin/winedbg %ld %ld"
|
|
||||||
|
|
||||||
Note 1: creating this key is mandatory. Not doing so will not fire the
|
|
||||||
debugger when an exception occurs.
|
|
||||||
|
|
||||||
Note 2: wineinstall sets up this correctly. However, due to some
|
|
||||||
limitation of the registry installed, if a previous Wine installation
|
|
||||||
exists, it's safer to remove the whole
|
|
||||||
[MACHINE\\Software\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug]
|
|
||||||
key before running again wineinstall to regenerate this key.
|
|
||||||
|
|
||||||
III.2 WineDbg configuration
|
|
||||||
---------------------------
|
|
||||||
WineDbg can be configured thru a number of options. Those options are
|
|
||||||
stored in the registry, on a per user basis. The key is (in *my*
|
|
||||||
registry) [eric\\Software\\Wine\\WineDbg]
|
|
||||||
Those options can be read/written while inside WineDbg, as part of the
|
|
||||||
debugger expressions. To refer to one of this option, its name must be
|
|
||||||
prefixed by a $ sign.
|
|
||||||
For example,
|
|
||||||
set $BreakAllThreadsStartup = 1
|
|
||||||
sets the option 'BreakAllThreadsStartup' to TRUE.
|
|
||||||
All the options are read from the registry when WineDbg starts (if no
|
|
||||||
corresponding value is found, a default value is used), and are
|
|
||||||
written back to the registry when WineDbg exits (hence, all
|
|
||||||
modifications to those options are automatically saved when WineDbg
|
|
||||||
terminates).
|
|
||||||
|
|
||||||
Here's the list of all options:
|
|
||||||
|
|
||||||
III.2.1 Controling when the debugger is entered
|
|
||||||
|
|
||||||
BreakAllThreadsStartup set to TRUE if at all threads start-up the
|
|
||||||
debugger stops
|
|
||||||
set to FALSE if only at the first thread
|
|
||||||
startup of a given process the debugger stops.
|
|
||||||
FALSE by default.
|
|
||||||
BreakOnCritSectTimeOut set to TRUE if the debugger stops when a
|
|
||||||
critical section times out (5 minutes);
|
|
||||||
TRUE by default.
|
|
||||||
BreakOnAttach, set to TRUE if when WineDbg attaches to an
|
|
||||||
existing process after an unhandled exception,
|
|
||||||
WineDbg shall be entered on the first attach
|
|
||||||
event.
|
|
||||||
Since the attach event is meaningless in the
|
|
||||||
context of an exception event (the next event
|
|
||||||
which is the exception event is of course
|
|
||||||
relevant), that option is likely to be FALSE.
|
|
||||||
BreakOnDllLoad When set to TRUE, allows the debugger to be
|
|
||||||
entered when a new DLL is loaded into the system.
|
|
||||||
FALSE by default.
|
|
||||||
BreakOnFirstChance an exception can generate two debug events.
|
|
||||||
The first one is passed to the debugger (known
|
|
||||||
as a first chance) just after the
|
|
||||||
exception. The debugger can then decides
|
|
||||||
either to resume execution (see winedbg's cont
|
|
||||||
command) or pass the exception up to the
|
|
||||||
exception handler chain in the program (if it
|
|
||||||
exists) (winedbg implements this thru the pass
|
|
||||||
command). If none of the exception handlers
|
|
||||||
takes care of the exception, the exception
|
|
||||||
event is sent again to the debugger (known as
|
|
||||||
last chance exception). You cannot pass on a
|
|
||||||
last exception. When the BreakOnFirstChance
|
|
||||||
exception is TRUE, then winedbg is entered for
|
|
||||||
both first and last chance execptions (to
|
|
||||||
FALSE, it's only entered for last chance exceptions).
|
|
||||||
|
|
||||||
III.2.1 Output handling
|
|
||||||
|
|
||||||
ConChannelMask mask of active debugger output channels on
|
|
||||||
console
|
|
||||||
StdChannelMask mask of active debugger output channels on
|
|
||||||
stderr
|
|
||||||
|
|
||||||
UseXTerm set to TRUE if the debugger uses its own xterm
|
|
||||||
window for console input/output
|
|
||||||
set to FALSE is the debugger uses the current
|
|
||||||
Unix console for input/output
|
|
||||||
|
|
||||||
Those last 3 variables are jointly used in two generic ways:
|
|
||||||
1/ default
|
|
||||||
ConChannelMask = DBG_CHN_MESG (1)
|
|
||||||
StdChannelMask = 0
|
|
||||||
UseXTerm = 1
|
|
||||||
In this case, all input/output goes into a specific xterm window (but
|
|
||||||
all debug messages TRACE/WARN... still goes to tty where wine is run
|
|
||||||
from).
|
|
||||||
|
|
||||||
2/ to have all input/output go into the tty where Wine was started
|
|
||||||
from (to be used in a X11-free environment)
|
|
||||||
ConChannelMask = 0
|
|
||||||
StdChannelMask = DBG_CHN_MESG (1)
|
|
||||||
UseXTerm = 1
|
|
||||||
|
|
||||||
Those variables also allow, for example for debugging purposes, to
|
|
||||||
use:
|
|
||||||
ConChannelMask = 0xfff
|
|
||||||
StdChannelMask = 0xfff
|
|
||||||
UseXTerm = 1
|
|
||||||
This allows to redirect all WineDbg output to both tty Wine was
|
|
||||||
started from, and xterm debugging window. If Wine (or WineDbg) was
|
|
||||||
started with a redirection of stdout and/or stderr to a file (with for
|
|
||||||
example >& shell redirect command), you'll get in that file both
|
|
||||||
outputs. It may be interesting to look in the relay trace for specific
|
|
||||||
values which the process segv:ed on.
|
|
||||||
|
|
||||||
III.2.3 Context information
|
|
||||||
|
|
||||||
ThreadId ID of the W-thread currently examined by the
|
|
||||||
debugger
|
|
||||||
ProcessId ID of the W-thread currently examined by the
|
|
||||||
debugger
|
|
||||||
<registers> All CPU registers are also available
|
|
||||||
|
|
||||||
The ThreadId and ProcessId variables can be handy to set conditional
|
|
||||||
breakpoints on a given thread or process.
|
|
||||||
|
|
||||||
IV WineDbg commands
|
|
||||||
===================
|
|
||||||
|
|
||||||
IV.1 Misc
|
|
||||||
---------
|
|
||||||
abort aborts the debugger
|
|
||||||
quit exits the debugger
|
|
||||||
|
|
||||||
attach N attach to a W-process (N is its ID). IDs can be
|
|
||||||
obtained thru walk process command
|
|
||||||
|
|
||||||
help prints some help on the commands
|
|
||||||
help info prints some help on info commands
|
|
||||||
|
|
||||||
mode 16 switch to 16 bit mode
|
|
||||||
mode 32 switch to 32 bit mode
|
|
||||||
|
|
||||||
IV.2 Flow control
|
|
||||||
-----------------
|
|
||||||
cont continue execution until next breakpoint or exception.
|
|
||||||
pass pass the exception event up to the filter chain.
|
|
||||||
step continue execution until next C line of code (enters
|
|
||||||
function call)
|
|
||||||
next continue execution until next C line of code (doesn't
|
|
||||||
enter function call)
|
|
||||||
stepi execute next assembly instruction (enters function
|
|
||||||
call)
|
|
||||||
nexti execute next assembly instruction (doesn't enter
|
|
||||||
function call)
|
|
||||||
finish do nexti commands until current function is exited
|
|
||||||
|
|
||||||
cont, step, next, stepi, nexti can be postfixed by a number (N),
|
|
||||||
meaning that the command must be executed N times.
|
|
||||||
|
|
||||||
IV.3 Breakpoints, watch points
|
|
||||||
------------------------------
|
|
||||||
enable N enables (break|watch)point #N
|
|
||||||
disable N disables (break|watch)point #N
|
|
||||||
delete N deletes (break|watch)point #N
|
|
||||||
cond N removes any a existing condition to (break|watch)point N
|
|
||||||
cond N <expr> adds condition <expr> to (break|watch)point N. <expr>
|
|
||||||
will be evaluated each time the breakpoint is hit. If
|
|
||||||
the result is a zero value, the breakpoint isn't
|
|
||||||
triggered
|
|
||||||
break * N adds a breakpoint at address N
|
|
||||||
break <id> adds a breakpoint at the address of symbol <id>
|
|
||||||
break <id> N adds a breakpoint at the address of symbol <id> (N ?)
|
|
||||||
break N adds a breakpoint at line N of current source file
|
|
||||||
break adds a breakpoint at current $pc address
|
|
||||||
watch * N adds a watch command (on write) at address N (on 4 bytes)
|
|
||||||
watch <id> adds a watch command (on write) at the address of
|
|
||||||
symbol <id>
|
|
||||||
info break lists all (break|watch)points (with state)
|
|
||||||
|
|
||||||
IV.4 Stack manipulation
|
|
||||||
-----------------------
|
|
||||||
bt print calling stack of current thread
|
|
||||||
up goes up one frame in current thread's stack
|
|
||||||
up N goes up N frames in current thread's stack
|
|
||||||
dn goes down one frame in current thread's stack
|
|
||||||
dn N goes down N frames in current thread's stack
|
|
||||||
frame N set N as the current frame
|
|
||||||
info local prints information on local variables for current
|
|
||||||
function
|
|
||||||
|
|
||||||
IV.5 Directory & source file manipulation
|
|
||||||
-----------------------------------------
|
|
||||||
show dir
|
|
||||||
dir <pathname>
|
|
||||||
dir
|
|
||||||
symbolfile <pathname>
|
|
||||||
|
|
||||||
list lists 10 source lines from current position
|
|
||||||
list - lists 10 source lines before current position
|
|
||||||
list N lists 10 source lines from line N in current file
|
|
||||||
list <path>:N lists 10 source lines from line N in file <path>
|
|
||||||
list <id> lists 10 source lines of function <id>
|
|
||||||
list * N lists 10 source lines from address N
|
|
||||||
|
|
||||||
You can specify the end target (to change the 10 lines value) using
|
|
||||||
the ','. For example:
|
|
||||||
list 123, 234 lists source lines from line 123 up to line 234 in
|
|
||||||
current file
|
|
||||||
list foo.c:1,56 lists source lines from line 1 up to 56 in file foo.c
|
|
||||||
|
|
||||||
IV.6 Displaying
|
|
||||||
---------------
|
|
||||||
a display is an expression that's evaluated and printed after the
|
|
||||||
execution of any WineDbg command
|
|
||||||
|
|
||||||
display lists the active displays
|
|
||||||
info display (same as above command)
|
|
||||||
display <expr> adds a display for expression <expr>
|
|
||||||
display /fmt <expr> adds a display for expression <expr>. Printing
|
|
||||||
evaluated <expr> is done using the given format (see
|
|
||||||
print command for more on formats)
|
|
||||||
del display N deletes display #N
|
|
||||||
undisplay N (same as del display)
|
|
||||||
|
|
||||||
IV.7 Disassembly
|
|
||||||
----------------
|
|
||||||
disas disassemble from current position
|
|
||||||
disas <expr> disassemble from address <expr>
|
|
||||||
disas <expr>,<expr>disassembles code between addresses specified by
|
|
||||||
the two <expr>
|
|
||||||
|
|
||||||
IV.8 Information on Wine's internals
|
|
||||||
------------------------------------
|
|
||||||
info class <id> prints information on Windows's class <id>
|
|
||||||
walk class lists all Windows' class registered in Wine
|
|
||||||
info share lists all the dynamic libraries loaded the debugged
|
|
||||||
program (including .so files, NE and PE DLLs)
|
|
||||||
info module N prints information on module of handle N
|
|
||||||
walk module lists all modules loaded by debugged program
|
|
||||||
info queue N prints information on Wine's queue N
|
|
||||||
walk queue lists all queues allocated in Wine
|
|
||||||
info regs prints the value of CPU register
|
|
||||||
info segment N prints information on segment N
|
|
||||||
info segment lists all allocated segments
|
|
||||||
info stack prints the values on top of the stack
|
|
||||||
info map lists all virtual mappings used by the debugged
|
|
||||||
program
|
|
||||||
info wnd N prints information of Window of handle N
|
|
||||||
walk wnd lists all the window hierarchy starting from the
|
|
||||||
desktop window
|
|
||||||
walk wnd N lists all the window hierarchy starting from the
|
|
||||||
window of handle N
|
|
||||||
walk process lists all w-processes in Wine session
|
|
||||||
walk thread lists all w-threads in Wine session
|
|
||||||
walk modref (no longer avail)
|
|
||||||
|
|
||||||
IV.9 Memory (reading, writing, typing)
|
|
||||||
|
|
||||||
x <expr> examines memory at <expr> address
|
|
||||||
x /fmt <expr> examines memory at <expr> address using format /fmt
|
|
||||||
print <expr> prints the value of <expr> (possibly using its type)
|
|
||||||
print /fmt <expr> prints the value of <expr> (possibly using its
|
|
||||||
type)
|
|
||||||
set <lval>=<expr> writes the value of <expr> in <lval>
|
|
||||||
whatis <expr> prints the C type of expression <expr>
|
|
||||||
|
|
||||||
/fmt is either /<letter> or /<count><letter>
|
|
||||||
letter can be
|
|
||||||
s => an ASCII string
|
|
||||||
u => an Unicode UTF16 string
|
|
||||||
i => instructions (disassemble)
|
|
||||||
x => 32 bit unsigned hexadecimal integer
|
|
||||||
d => 32 bit signed decimal integer
|
|
||||||
w => 16 bit unsigned hexadecimal integer
|
|
||||||
c => character (only printable 0x20-0x7f are actually
|
|
||||||
printed)
|
|
||||||
b => 8 bit unsigned hexadecimal integer
|
|
||||||
|
|
||||||
V Other debuggers
|
|
||||||
=================
|
|
||||||
|
|
||||||
V.1 Using other Unix debuggers
|
|
||||||
------------------------------
|
|
||||||
You can also use other debuggers (like gdb), but you must be aware of
|
|
||||||
a few items:
|
|
||||||
- you need to attach the unix debugger to the correct unix process
|
|
||||||
(representing the correct windows thread) (you can "guess" it from a
|
|
||||||
'ps fax' for example: When running the emulator, usually the first
|
|
||||||
two upids are for the Windows' application running the desktop, the
|
|
||||||
first thread of the application is generally the third upid; when
|
|
||||||
running a WineLib program, the first thread of the application is
|
|
||||||
generally the first upid)
|
|
||||||
|
|
||||||
Note: even if latest gdb implements the notion of threads, it won't
|
|
||||||
work with Wine because the thread abstraction used for implementing
|
|
||||||
Windows' thread is not 100% mapped onto the linux posix threads
|
|
||||||
implementation. It means that you'll have to spawn a different gdb
|
|
||||||
session for each Windows' thread you wish to debug.
|
|
||||||
|
|
||||||
V.2 Using other Windows debuggers
|
|
||||||
---------------------------------
|
|
||||||
You can use any Windows' debugging API compliant debugger with
|
|
||||||
Wine. Some reports have been made of success with VisualStudio
|
|
||||||
debugger (in remote mode, only the hub runs in Wine).
|
|
||||||
GoVest fully runs in Wine.
|
|
||||||
|
|
||||||
V.3 Main differences between winedbg and regular Unix debuggers
|
|
||||||
---------------------------------------------------------------
|
|
||||||
|
|
||||||
+----------------------------------+---------------------------------+
|
|
||||||
| WineDbg | gdb |
|
|
||||||
+----------------------------------+---------------------------------+
|
|
||||||
|WineDbg debugs a Windows' process:|gdb debugs a Windows' thread: |
|
|
||||||
|+ the various threads will be |+ a separate gdb session is |
|
|
||||||
| handled by the same WineDbg | needed for each thread of |
|
|
||||||
| session | Windows' process |
|
|
||||||
|+ a breakpoint will be triggered |+ a breakpoint will be triggered |
|
|
||||||
| for any thread of the w-process | only for the w-thread debugged |
|
|
||||||
+----------------------------------+---------------------------------+
|
|
||||||
|WineDbg supports debug information|gdb supports debug information |
|
|
||||||
|from: |from: |
|
|
||||||
|+ stabs (standard Unix format) |+ stabs (standard Unix format) |
|
|
||||||
|+ Microsoft's C, CodeView, .DBG | |
|
|
||||||
+----------------------------------+---------------------------------+
|
|
||||||
|
|
||||||
VI Limitations
|
|
||||||
==============
|
|
||||||
|
|
||||||
+ 16 bit processes are not supported (but calls to 16 bit code in 32
|
|
||||||
bit applications is).
|
|
||||||
+ there are reports of debugger's freeze when loading large PDB files
|
|
||||||
|
|
||||||
Last updated: 6/14/2000 by ericP
|
|
|
@ -1,129 +0,0 @@
|
||||||
The X11 driver
|
|
||||||
--------------
|
|
||||||
|
|
||||||
Most Wine users run Wine under the windowing system known as X11.
|
|
||||||
During most of Wine's history, this was the only display driver
|
|
||||||
available, but in recent years, parts of Wine has been reorganized to
|
|
||||||
allow for other display drivers (although the only alternative
|
|
||||||
currently available is Patrik Stridvall's ncurses-based ttydrv, which
|
|
||||||
he claims works for displaying calc.exe). The display driver is chosen
|
|
||||||
with the "GraphicsDriver" option in the [wine] section of
|
|
||||||
wine.conf/.winerc, but I will only cover the x11drv in this document.
|
|
||||||
|
|
||||||
x11drv modes of operation
|
|
||||||
|
|
||||||
The x11drv consists of two conceptually distinct pieces, the graphics
|
|
||||||
driver (GDI part), and the windowing driver (USER part). Both of these
|
|
||||||
are linked into the libx11drv.so module, though (which you load with
|
|
||||||
the "GraphicsDriver" option). In Wine, running on X11, the graphics
|
|
||||||
driver must draw on drawables (window interiors) provided by the
|
|
||||||
windowing driver. This differs a bit from the Windows model, where the
|
|
||||||
windowing system creates and configures device contexts controlled by
|
|
||||||
the graphics driver, and applications are allowed to hook into this
|
|
||||||
relationship anywhere they like. Thus, to provide any reasonable
|
|
||||||
tradeoff between compatibility and usability, the x11drv has three
|
|
||||||
different modes of operation.
|
|
||||||
|
|
||||||
Unmanaged/Normal
|
|
||||||
The default. Window-manager-independent (any running window
|
|
||||||
manager is ignored completely). Window decorations (title bars,
|
|
||||||
borders, etc) are drawn by Wine to look and feel like the real
|
|
||||||
Windows. This is compatible with applications that depend on
|
|
||||||
being able to compute the exact sizes of any such decorations,
|
|
||||||
or that want to draw their own.
|
|
||||||
|
|
||||||
Managed
|
|
||||||
Specified by using the --managed command-line option or the
|
|
||||||
Managed wine.conf option (see below). Ordinary top-level frame
|
|
||||||
windows with thick borders, title bars, and system menus will
|
|
||||||
be managed by your window manager. This lets these applications
|
|
||||||
integrate better with the rest of your desktop, but may not
|
|
||||||
always work perfectly. (A rewrite of this mode of operation, to
|
|
||||||
make it more robust and less patchy, is highly desirable,
|
|
||||||
though, and is planned to be done before the Wine 1.0 release.)
|
|
||||||
|
|
||||||
Desktop-in-a-Box
|
|
||||||
Specified by using the --desktop command-line option (with a
|
|
||||||
geometry, e.g. --desktop 800x600 for a such-sized desktop, or
|
|
||||||
even --desktop 800x600+0+0 to automatically position the
|
|
||||||
desktop at the upper-left corner of the display). This is the
|
|
||||||
mode most compatible with the Windows model. All application
|
|
||||||
windows will just be Wine-drawn windows inside the
|
|
||||||
Wine-provided desktop window (which will itself be managed by
|
|
||||||
your window manager), and Windows applications can roam freely
|
|
||||||
within this virtual workspace and think they own it all,
|
|
||||||
without disturbing your other X apps.
|
|
||||||
|
|
||||||
The [x11drv] section
|
|
||||||
|
|
||||||
AllocSystemColors
|
|
||||||
Applies only if you have a palette-based display, i.e. if your
|
|
||||||
X server is set to a depth of 8bpp, and if you haven't
|
|
||||||
requested a private color map. It specifies the maximum number
|
|
||||||
of shared colormap cells (palette entries) Wine should occupy.
|
|
||||||
The higher this value, the less colors will be available to
|
|
||||||
other applications.
|
|
||||||
|
|
||||||
PrivateColorMap
|
|
||||||
Applies only if you have a palette-based display, i.e. if your
|
|
||||||
X server is set to a depth of 8bpp. It specifies that you don't
|
|
||||||
want to use the shared color map, but a private color map,
|
|
||||||
where all 256 colors are available. The disadvantage is that
|
|
||||||
Wine's private color map is only seen while the mouse pointer
|
|
||||||
is inside a Wine window, so psychedelic flashing and funky
|
|
||||||
colors will become routine if you use the mouse a lot.
|
|
||||||
|
|
||||||
PerfectGraphics
|
|
||||||
This option only determines whether fast X11 routines or exact
|
|
||||||
Wine routines will be used for certain ROP codes in blit
|
|
||||||
operations. Most users won't notice any difference.
|
|
||||||
|
|
||||||
ScreenDepth
|
|
||||||
Applies only to multi-depth displays. It specifies which of the
|
|
||||||
available depths Wine should use (and tell Windows apps about).
|
|
||||||
|
|
||||||
Display
|
|
||||||
This specifies which X11 display to use, and if specified, will
|
|
||||||
override both the DISPLAY environment variable and the
|
|
||||||
--display command-line option.
|
|
||||||
|
|
||||||
Managed
|
|
||||||
Wine can let frame windows be managed by your window manager.
|
|
||||||
This option specifies whether you want that by default.
|
|
||||||
|
|
||||||
UseDGA
|
|
||||||
This specifies whether you want DirectDraw to use XFree86's
|
|
||||||
Direct Graphics Architecture (DGA), which is able to take over
|
|
||||||
the entire display and run the game full-screen at maximum
|
|
||||||
speed. (With DGA1 (XFree86 3.x), you still have to configure
|
|
||||||
the X server to the game's requested bpp first, but with DGA2
|
|
||||||
(XFree86 4.x), runtime depth-switching may be possible,
|
|
||||||
depending on your driver's capabilities.) But be aware that if
|
|
||||||
Wine crashes while in DGA mode, it may not be possible to
|
|
||||||
regain control over your computer without rebooting. DGA
|
|
||||||
normally requires either root privileges or read/write access
|
|
||||||
to /dev/mem.
|
|
||||||
|
|
||||||
UseXShm
|
|
||||||
If you don't want DirectX to use DGA, you can at least use X
|
|
||||||
Shared Memory extensions (XShm). It is much slower than DGA,
|
|
||||||
since the app doesn't have direct access to the physical frame
|
|
||||||
buffer, but using shared memory to draw the frame is at least
|
|
||||||
faster than sending the data through the standard X11 socket,
|
|
||||||
even though Wine's XShm support is still known to crash
|
|
||||||
sometimes.
|
|
||||||
|
|
||||||
DXGrab
|
|
||||||
If you don't use DGA, you may want an alternative means to
|
|
||||||
convince the mouse cursor to stay within the game window. This
|
|
||||||
option does that. Of course, as with DGA, if Wine crashes,
|
|
||||||
you're in trouble (although not as badly as in the DGA case,
|
|
||||||
since you can still use the keyboard to get out of X).
|
|
||||||
|
|
||||||
DesktopDoubleBuffered
|
|
||||||
Applies only if you use the --desktop command-line option to
|
|
||||||
run in a desktop window. Specifies whether to create the
|
|
||||||
desktop window with a double-buffered visual, something most
|
|
||||||
OpenGL games need to run correctly.
|
|
||||||
|
|
||||||
- Ove Kåven
|
|
Loading…
Reference in New Issue