| \input texinfo @c -*-texinfo-*- | |
| @c %**start of header | |
| @setfilename wine.info | |
| @settitle Wine Reference Manual | |
| @iftex | |
| @afourpaper | |
| @end iftex | |
| @c %**end of header | |
| @ifinfo | |
| @format | |
| START-INFO-DIR-ENTRY | |
| * wine: (wine.info). Windows on Unix. | |
| END-INFO-DIR-ENTRY | |
| @end format | |
| @end ifinfo | |
| @iftex | |
| @c @finalout | |
| @end iftex | |
| @ifinfo | |
| This file documents Wine, a system providing Microsoft Windows compatibility | |
| to Unix. | |
| @c | |
| Copyright @copyright{} 1997,1998 The Wine authors. @* | |
| @xref{Authors, The Wine Authors, The Wine Authors}, | |
| for a list of the copyright holders. | |
| Permission is granted to make and distribute verbatim | |
| copies of this manual provided the copyright notice and | |
| this permission notice are preserved on all copies. | |
| @ignore | |
| Permission is granted to process this file through TeX | |
| and print the results, provided the printed document | |
| carries a copying permission notice identical to this | |
| one except for the removal of this paragraph (this | |
| paragraph not being relevant to the printed manual). | |
| @end ignore | |
| Permission is granted to copy and distribute modified | |
| versions of this manual under the conditions stated in | |
| the section entitled ``License, Warranty, and Authors of Wine''. | |
| @sp 4 | |
| FIXME: X11 and POSIX trademarks. @* | |
| UNIX is a registered trademark of the Open Group. | |
| Microsoft, Windows, MS-Windows, Windows-NT, Windows 95, and MS-DOS are | |
| registered trademarks of Microsoft Corporation. | |
| NT is a trademark of Northern Telecom Limited. | |
| C++Builder is a trademark of Borland International, Inc. | |
| Postscript is a registered trademark of Adobe Systems Inc. | |
| Other trademarks are the property of their respective owners, which may | |
| be registered in certain jurisdictions. | |
| @end ifinfo | |
| @c begin chapters on right pages | |
| @setchapternewpage odd | |
| @titlepage | |
| @title{The Wine Reference Manual} | |
| @subtitle{Edition 0.0.5, February 1998} | |
| @author{The Wine Team} | |
| @c The following two commands start the copyright page. | |
| @page | |
| @vskip 0pt plus 1filll | |
| Copyright @copyright{} 1997, 1998 The Wine authors. @* | |
| @xref{Authors, The Wine Authors, The Wine Authors}, | |
| for a list of the copyright holders. | |
| Permission is granted to make and distribute verbatim | |
| copies of this manual provided the copyright notice and | |
| this permission notice are preserved on all copies. | |
| Permission is granted to copy and distribute modified | |
| versions of this manual under the conditions stated in | |
| the section entitled ``License, Warranty, and Authors of Wine''. | |
| @sp 4 | |
| FIXME: UNIX and POSIX trademarks. @* | |
| X11 @* | |
| Microsoft, Windows, MS-Windows, Windows-NT, Windows 95, and MS-DOS are | |
| registered trademarks of Microsoft Corporation. | |
| NT is a trademark of Northern Telecom Limited. | |
| C++Builder is a trademark of Borland International, Inc. | |
| Postscript is a registered trademark of Adobe Systems Inc. | |
| Other trademarks are the property of their respective owners, which may | |
| be registered in certain jurisdictions. | |
| @end titlepage | |
| @c | |
| @c SETTINGS, DEFINES, MACROS | |
| @c | |
| @c Edit this macro manually in the above parts of the document | |
| @macro winemanualversion | |
| 0.0.4 | |
| @end macro | |
| @c Edit this macro manually in the above parts of the document | |
| @macro winemanualdate | |
| February 1998 | |
| @end macro | |
| @c Edit this macro manually into the TeX titlepage | |
| @macro winemanualtitle | |
| The Wine Reference Manual | |
| @end macro | |
| @c | |
| @macro winelib | |
| Winelib | |
| @end macro | |
| @c | |
| @c MICROSOFT | |
| @c | |
| @c FIXME: automatic trademark reference | |
| @macro mswindows | |
| MS-Windows | |
| @end macro | |
| @c FIXME: automatic trademark reference | |
| @c spell it always the same | |
| @macro WIN32 | |
| WIN32 | |
| @end macro | |
| @macro WIN16 | |
| WIN16 | |
| @end macro | |
| @c FIXME: automatic trademark reference | |
| @macro WINNT | |
| Windows NT | |
| @end macro | |
| @c FIXME: automatic trademark reference | |
| @macro WINNT40 | |
| Windows NT 4.0 | |
| @end macro | |
| @c FIXME: automatic trademark reference | |
| @macro WIN95 | |
| Windows 95 | |
| @end macro | |
| @c | |
| @c THE OTHERS | |
| @c | |
| @c FIXME: automatic trademark reference | |
| @macro unix | |
| UNIX | |
| @end macro | |
| @c FIXME: automatic trademark reference | |
| @macro posix | |
| POSIX | |
| @end macro | |
| @macro unicode | |
| Unicode | |
| @end macro | |
| @macro ascii | |
| ASCII | |
| @end macro | |
| @c | |
| @c THIS MANUAL | |
| @c | |
| @c flag out differences to MS-Windows | |
| @macro windiff | |
| @emph{Differences to @mswindows{}:} @* | |
| @end macro | |
| @macro windiffnone | |
| @windiff{} | |
| No differences known. | |
| @end macro | |
| @c tell whether function is present in Windows 95 and/or NT | |
| @macro winconf | |
| @emph{Conformance to @mswindows{}:} @* | |
| @end macro | |
| @macro winconfall | |
| @winconf{} | |
| Present in @WIN95{} and @WINNT{}. | |
| @end macro | |
| @c give information about completion | |
| @macro completion | |
| @emph{Completion status:} @* | |
| @end macro | |
| @macro completionnone | |
| @completion{} | |
| Not yet implemented. | |
| @end macro | |
| @c | |
| @c MACROS FOR FUNCTIONS, TYPES, CONSTANTS, VARIABLES | |
| @c | |
| @c Constants in the WIN32 API | |
| @macro defvr_cw32 {restofline} | |
| @defvr Constant \restofline\ | |
| @end macro | |
| @macro defvrx_cw32 {restofline} | |
| @defvrx Constant \restofline\ | |
| @end macro | |
| @c Functions in the WIN32 API | |
| @macro deftypefn_w32 {restofline} | |
| @deftypefn {WIN32 function} \restofline\ | |
| @end macro | |
| @macro deftypefnx_w32 {restofline} | |
| @deftypefnx {WIN32 function} \restofline\ | |
| @end macro | |
| @c Types in the WIN32 API | |
| @macro deftp_w32 {restofline} | |
| @deftp {Data type} \restofline\ | |
| @end macro | |
| @macro deftpx_w32 {restofline} | |
| @deftpx {Data type} \restofline\ | |
| @end macro | |
| @c Macros internal to Wine | |
| @macro deffn_winemacro {restofline} | |
| @deffn {Wine internal macro} \restofline\ | |
| @end macro | |
| @macro deffnx_winemacro {restofline} | |
| @deffn {Wine internal macro} \restofline\ | |
| @end macro | |
| @c Constants internal to Wine | |
| @macro defvr_cwine {restofline} | |
| @defvr {Wine internal constant} \restofline\ | |
| @end macro | |
| @macro defvrx_cwine {restofline} | |
| @defvrx {Wine internal constant} \restofline\ | |
| @end macro | |
| @c | |
| @c TOP NODE | |
| @c | |
| @ifinfo | |
| @node Top, Copying, (dir), (dir) | |
| @top Wine | |
| This is edition @winemanualversion{}, last updated @winemanualdate{}, | |
| of @winemanualtitle{}. | |
| Wine provides both source and binary compatibility with Microsoft Windows. | |
| The Wine API is designed to be as compatible as possible with various | |
| implementations of the Windows APIs. The Wine library allows porting | |
| Windows source to Unix, and a program loader allows unaltered Windows binaries | |
| to be run on Unix. | |
| Wine is free software. Wine is still under development. | |
| @end ifinfo | |
| @menu | |
| * Copying:: License, Warranty, and Authors of Wine. | |
| * Introduction:: A short overview. | |
| * Wine Design:: The design of Wine. | |
| * Reference Manual:: The Wine reference manual. | |
| * Installation:: Installing and configuring Wine. | |
| * The Wine Project:: How to contribute to Wine. | |
| * Concept Index:: Index of concepts and names. | |
| * Type Index:: Index of types and type qualifiers. | |
| * Function Index:: Index of functions and function-like | |
| macros. | |
| * Variable Index:: Index of variables, constants, and | |
| variable-like macros. | |
| * File Index:: Index of programs and files. | |
| @end menu | |
| @node Copying, Introduction, Top, Top | |
| @unnumbered License, Warranty, and Authors of Wine | |
| @cindex copying conditions for Wine | |
| @cindex conditions for copying Wine | |
| @cindex Wine copying conditions | |
| The Wine license, warranty, and list of authors together form the | |
| copyright for Wine. Read these sections carefully. | |
| @menu | |
| * License:: The Wine license. | |
| * Warranty:: Wine comes with no warranty. | |
| * Authors:: The persons that contributed to Wine. | |
| @end menu | |
| @node License, Warranty, , Copying | |
| @cindex Wine license | |
| @cindex license of Wine | |
| @unnumberedsec The Wine License | |
| Wine is distributed under the following copyright. | |
| @quotation | |
| @include LICENSE | |
| @end quotation | |
| @node Warranty, Authors, License, Copying | |
| @cindex Wine warranty | |
| @cindex warranty of Wine | |
| @unnumberedsec The Wine Warranty | |
| @quotation | |
| @include WARRANTY | |
| @end quotation | |
| @node Authors, , Warranty, Copying | |
| @cindex Wine authors | |
| @cindex authors of Wine | |
| @cindex copyright holders of Wine | |
| @cindex Wine copyright holders | |
| @unnumberedsec The Wine Authors | |
| @quotation | |
| @include AUTHORS | |
| @end quotation | |
| These persons also hold the copyright on Wine. | |
| The overall coordination is done by @* | |
| Alexandre Julliard @* | |
| @email{julliard@@winehq.com} | |
| @node Introduction, Wine Design, Copying, Top | |
| @chapter Introduction | |
| @strong{What is Wine?} | |
| Wine is a Windows-compatibility layer for Unix and X11. | |
| The Wine system consists of several thing: | |
| @enumerate | |
| @item | |
| An API, sometimes referred to as the Wine API, | |
| designed to be as compatible as possible with the | |
| @mswindows{} API | |
| @item | |
| A library, called @winelib{}, which implements this API | |
| @item | |
| A binary compatibility layer | |
| acts as a program loader for native Windows binaries. | |
| It works for both 16 and 32 bit Intel binaries, and | |
| provides all the appropriate translation between 16 and 32 bit code | |
| (thunking). Real mode interrupts are also supported, and their | |
| functionality is implemented in @winelib{}. | |
| @end enumerate | |
| @strong{System Requirements} | |
| Wine provides binary support for Intel code on Intel hardware only. | |
| Neither hardware emulation | |
| nor non-Intel binaries are supported. | |
| @winelib{} should be possible to port to just about any Unix system. | |
| Currently, you must have one of: | |
| @itemize @bullet | |
| @item | |
| Linux version 0.99.13 or above | |
| @item | |
| NetBSD-current | |
| @item | |
| FreeBSD-current or FreeBSD 1.1 | |
| @item | |
| OpenBSD/i386 2.1 or later | |
| @item | |
| Solaris x86 2.5 or later | |
| @end itemize | |
| You need X11, and you must have @file{libXpm} installed on your system. | |
| @strong{Availability} | |
| Wine is free software; the license is BSD-style. Basically, you can do | |
| anything with it, except claim that you wrote it. | |
| @xref{Copying}, for more information. | |
| @strong{Further information} | |
| You should consult the files @file{README}, @file{ANNOUNCE}, | |
| @file{RELEASE-NOTES}, @file{BUGS}, @file{LICENSE}, and @file{WARRANTY}, | |
| in the root directory of the Wine distribution. | |
| The Wine USENET newsgroup @url{news:comp.emulators.ms-windows.wine} | |
| is useful for both Wine developers and Wine users. The Wine home page | |
| is @url{http://www.winehq.com/}. | |
| @node Wine Design, Reference Manual, Introduction, Top | |
| @chapter Wine Design | |
| @subsection The Wine Graphics Driver Model | |
| Wine, like Windows, abstracts drawing code so that applications may access | |
| a wide variety of devices, from different kinds of graphics cards, | |
| X displays and printers, using a single unified graphics model. | |
| This model is referred to as GDI: _G_raphics _D_river _I_nterface. | |
| This section discusses the Wine implementation of GDI. | |
| There are 61 functions in the Wine graphics model, including Arc, BitBlt, | |
| Chord, etc. For a complete list and prototypes, see the definition | |
| of DC_FUNCTIONS in [include/gdi.h]. | |
| Wine, as of 2Q1998, has three native drivers: these provide support | |
| for rendering to X displays, metafiles, and Win16 native printer drivers. | |
| As far as Wine is concerned, a driver | |
| simply consists of a name and a table of function pointers | |
| (see [graphics/driver.c]). These functions | |
| are the driver's implementation of the various Wine graphics | |
| operations (the GDI). Wine maintains a linked list of all drivers which | |
| register themselves with Wine, as well as a ``generic'' | |
| driver. Currently, the X11 driver registers itself as DISPLAY, the | |
| win16 driver registers itself as the generic driver, and the metafile | |
| driver doesn't register itself at all. | |
| @subsubsection How a driver function gets invoked | |
| All drawing by Wine applications | |
| is done in terms of a Device Context (DC). | |
| Before an application can draw, it must create a DC, and all drawing calls | |
| must pass a handle to the DC they wish to draw to. | |
| [include/gdi.h] defines several structures relating to DCs, including | |
| DC, WIN_DC_INFO, and DeviceCaps. The DeviceCaps structure is at the lowest | |
| level: it holds | |
| information relating to specifics of the graphics display | |
| hardware and associated | |
| driver. | |
| WIN_DC_INFO holds information about several device independent | |
| modes the DC can be in, plus a pointer to DeviceCaps. | |
| Finally, | |
| the DC structure is the toplevel structure usually passed around. | |
| It holds viewport information, a pointer to WIN_DC_INFO, and a | |
| pointer to the function table to be used while rendering that DC. | |
| This function table is filled at the time of creating the DC. | |
| @c Modes | |
| @c Some discussion of the various modalities available to a DC would be nice. | |
| @c Coordinate Systems | |
| @c Some discussion of the maze of coordinate systems would also be nice. | |
| @c Device Coordinates | |
| @c Logical Coordinates | |
| @c World transforms | |
| @subsubsection The X11 driver | |
| As a part of the Wine loading process, | |
| X11DRV_Init in [graphics/x11drv/init.c] is called. | |
| This initializes various aspects of the X11 driver and | |
| registers it as DISPLAY. This function first | |
| calls initialization procedures for various parts of the X11 driver. | |
| It then | |
| creates and | |
| fills a static DeviceCaps | |
| structure to be used for every X11 DC. | |
| Finally, it fills the table of GDI functions to be used for X11 | |
| rendering and registers itself as ``DISPLAY''. | |
| @subsubsection The Metafile Driver | |
| The metafile driver is unusual, in that it is not a driver for any | |
| kind of display device, but rather a mechanism which allows using | |
| the Wine graphics model as a file format for saving graphics. | |
| The advantage of this is that it allows using identical formats for | |
| saving pictures as is actually used to display them; it is analogous | |
| to Display PostScript. | |
| The metafile driver is invoked explicitly by the application. The | |
| application calls CreateMetaFile() to create a special DC for recording | |
| graphics drawing operations in a metafile. Any drawing operations | |
| performed in this DC are not drawn physically anywhere, they are | |
| instead stored in the metafile. The DC is explicitly destroyed by a | |
| call to CloseMetaFile(), which also finishes writing the metafile. | |
| Metafiles may be written either to a file or to memory. Later, the | |
| metafile can be rendered (in a physical DC) by PlayMetaFile(). | |
| The way that this works is that device contexts contain a pointer | |
| to the function lookup table for drawing operations appropriate for | |
| that device. | |
| Not all functions in the Wine graphics model are relevant to metafiles, but | |
| some relevant but rarely used functions are unimplemented. | |
| @subsubsection The WIN16 Driver | |
| WIN16DRV_Init is called by MAIN_EmulatorInit, and registers the | |
| WIN16DRV function table WIN16DRV_Funcs [graphics/win16drv/init.c] | |
| for the generic driver. The WIN16 driver is designed to load | |
| specified native Windows printer drivers. I don't understand | |
| how the whole scheme works, | |
| start studying what happens when a printer DC is | |
| created via WIN16DRV_CreateDC. | |
| If a DC is created explicitly, via the | |
| CreateDC() call, the driver name is specified explicitly and Wine | |
| finds the appropriate driver by leafing through its table of registered | |
| drivers. Metafile DCs can only be created by the CreateMetaFile function. | |
| Alternatively, most of the time, the DISPLAY driver is invoked | |
| implicitly. | |
| The application creates a window with | |
| CreateWindow(). If the CS_CLASSDC or CS_OWNDC flag is passed, a new DC | |
| is created and saved for the window in a structure called DCE, which holds | |
| a DC, a clipping region, and flags. Whenever the application wants to | |
| paint in that window, it calls GetDC(hwnd), which returns the DC in the | |
| DCE saved in the window. | |
| If neither of those flags are used, the window gets a DCE assigned to it | |
| from a pool of DCEs created during Wine initialization and temporarily | |
| assigned during the GetDC() call. | |
| All DCEs, whether part of the Wine DC pool or created by request of a window, | |
| use the ``DISPLAY'' driver. | |
| @node Reference Manual, Installation, Wine Design, Top | |
| @menu | |
| * @WIN32{} Reference Manual:: The @WIN32{} function calls and data types. | |
| * Resources and INI files:: How to determine the appearance and | |
| behaviour of Wine programs. | |
| * Metafiles--Icons--Bitmaps:: FIXME missing. | |
| * Debugging:: Debugging Wine. | |
| * Programs:: Programs written to run in/with Wine. | |
| * Tools:: Programs to support Wine. | |
| @end menu | |
| @node @WIN32{} Reference Manual, Resources and INI files, , Reference Manual | |
| @chapter The @WIN32{} Reference Manual | |
| @menu | |
| * Kernel Objects:: How the Wine kernel keeps information. | |
| * Processes and Threads:: Job control and management in Wine. | |
| * Users and Groups:: Security in Wine. | |
| * Date and Time:: Functions for getting the date and time | |
| and for conversion between formats. | |
| * System Information:: Getting information about the hardware | |
| and software the system runs on. | |
| * Memory Management:: How your programs get memory from | |
| Wine. | |
| * I/O Facilities:: Input/Output in Wine. | |
| * Communication:: How processes can communicate. | |
| * Windows and Graphics:: GUI functions of @WIN32{}. | |
| * Errors and Exceptions:: How your program can report errors. | |
| (messaging) | |
| * Resources:: Functions for dealing with resources. | |
| * The Registry:: FIXME missing. | |
| * Dynamic Link Libraries:: Functions for dealing with DLL's. | |
| @end menu | |
| @node Kernel Objects, Processes and Threads, , @WIN32{} Reference Manual | |
| @section Kernel Objects | |
| @node Processes and Threads, Users and Groups, Kernel Objects, @WIN32{} Reference Manual | |
| @section Processes and Threads | |
| @node Users and Groups, Date and Time, Processes and Threads, @WIN32{} Reference Manual | |
| @section Users and Groups | |
| @node Date and Time, System Information, Users and Groups, @WIN32{} Reference Manual | |
| @section Date and Time | |
| This section describes functions for manipulating dates and times. This | |
| includes the current time, the creation or manipulation times of files | |
| and other objects, and conversion between different time | |
| representations. | |
| @menu | |
| * File Times:: Creation and manipulation times of files. | |
| @end menu | |
| @node File Times, , , Date and Time | |
| @subsection File Times | |
| @menu | |
| * Type FILETIME:: The data structure used for specifying | |
| file times. | |
| * Compare File Times:: Compare two file times. | |
| @end menu | |
| @c | |
| @c *** struct FILETIME *** | |
| @c | |
| @node Type FILETIME, Compare File Times, , File Times | |
| @subsubsection Type FILETIME | |
| @noindent | |
| File times in Wine are specified by the data type @code{FILETIME}, | |
| defined in @file{windows.h}. | |
| @deftp_w32 FILETIME | |
| @deftpx_w32 LPFILETIME | |
| This is the data type for specifying file times. The file times are | |
| stored with 64 bit precision. The actual data type is a structure with | |
| two 32-bit values which are interpreted as the low and high parts of a | |
| 64-bit value. This value gives a time measured in a granularity of 100 | |
| nanoseconds, so 1.5 seconds are specified by a value of 15,000,000. In | |
| Wine, this 64-bit value is signed, with the sign taken from the high | |
| part. The lower part is used as unsigned. | |
| The definition of @code{FILETIME} reads: | |
| @example | |
| typedef struct | |
| @{ | |
| INT32 dwLowDateTime; | |
| INT32 dwHighDateTime; | |
| @} FILETIME, *LPFILETIME; | |
| @end example | |
| @cindex epoch in file time | |
| The @code{FILETIME} structure may be used to hold absolute or relative | |
| times. Absolute times are given as the number of 100 nanoseconds | |
| intervals elapsed since 1 January 1601, 00:00:00 UTC (Coordinated | |
| Universal Time, which is GMT, Greenwich Mean Time). This might be | |
| called the @dfn{epoch} for file times. With a signed 64-bit value, this | |
| representation covers absolute times of 29247 years around the epoch. | |
| To convert this type to local time, use the function | |
| @code{FileTimeToLocalFileTime}. | |
| @windiff{} | |
| In @mswindows{}, the elements of the structure are apparently of type | |
| @code{DWORD}. Whether the full 64 bit value is interpreted as signed or | |
| unsigned I do not know. | |
| @end deftp | |
| @c | |
| @c *** CompareFileTime *** | |
| @c | |
| @node Compare File Times, , Type FILETIME, File Times | |
| @noindent | |
| The Wine function @code{CompareFileTime} compares two file times, and | |
| returns whether the first time is less than, equal to, or greater than | |
| the second file time. It is defined in @file{windows.h}. | |
| @deftypefn_w32 LONG CompareFileTime (@w{CONST FILETIME* @var{time_1},} @w{CONST FILETIME* @var{time_2})} | |
| This function returns @code{1}, if @var{time_1} is greater than | |
| @var{time_2}, @code{-1} if it is less, and @code{0} if both times are | |
| equal. | |
| @winconfall{} | |
| @windiffnone{} | |
| @completionnone{} | |
| @end deftypefn | |
| @node System Information, Memory Management, Date and Time, @WIN32{} Reference Manual | |
| @section System Information | |
| @node Memory Management, I/O Facilities, System Information, @WIN32{} Reference Manual | |
| @section Memory Management | |
| @node I/O Facilities, Communication, Memory Management, @WIN32{} Reference Manual | |
| @section I/O Facilities | |
| This section describes all input/output of a process, except for two | |
| topics: communication with other processes, and communication with the | |
| windowing system. | |
| @menu | |
| * I/O on Files:: Accessing the contents of files. | |
| * File System Interface:: Functions for manipulating files as a whole. | |
| @end menu | |
| @node I/O on Files, File System Interface, , I/O Facilities | |
| @subsection I/O on Files | |
| @node File System Interface, , I/O on Files, I/O Facilities | |
| @subsection File System Interface | |
| These functions are concerned with operating on files themselves, rather | |
| than on their contents. | |
| @menu | |
| * Type BY_HANDLE_FILE_INFORMATION:: The data structure used to | |
| specify file information. | |
| * File attributes:: The file attributes flags in | |
| a file information structure. | |
| * Getting file information:: These functions let you obtain | |
| information about a file. | |
| @end menu | |
| @node Type BY_HANDLE_FILE_INFORMATION, File attributes, , File System Interface | |
| @subsubsection The file information structure | |
| The file information structure of Wine is used to obtain information | |
| about files. It is declared in the header @file{winedows.h}. | |
| @deftp_w32 BY_HANDLE_FILE_INFORMATION | |
| This is the data type for specifying information about files as objects | |
| of the file system. It contains the following members: | |
| @table @code | |
| @item int dwFileAttributes | |
| @cindex file attributes in file information | |
| @cindex attributes of file in file information | |
| @xref{File attributes}, for details. | |
| @item FILETIME ftCreationTime | |
| @cindex creation time in file information | |
| @cindex time of file creation in file information | |
| The time when the file was created. | |
| @xref{Type FILETIME}, for details. | |
| @item FILETIME ftLastAccessTime | |
| @cindex access time in file information | |
| @cindex time of file access in file information | |
| The time when the file was last accessed. | |
| @xref{Type FILETIME}, for details. | |
| @item FILETIME ftLastWriteTime | |
| @cindex write time in file information | |
| @cindex time of last file write in file information | |
| The time when the file was last written to. | |
| @xref{Type FILETIME}, for details. | |
| @item int dwVolumeSerialNumber | |
| @cindex serial number of volume in file information | |
| @cindex volume number (serial) in file information | |
| The serial number of the volume containing the file. In Wine, | |
| currently 0. | |
| @item int nFileSizeHigh | |
| @cindex file size in file information | |
| @cindex size of file in file information | |
| A 32 bit value which contains the high part of the 64 bit file size. | |
| @item int nFileSizeLow | |
| A 32 bit value which contains the low part of the 64 bit file size. | |
| @item int nNumberOfLinks | |
| @cindex hard links number in file information | |
| @cindex links (number of hard) in file information | |
| This is the number of hard links to the file. In a file system which | |
| does not support hard links, this is 1. | |
| @item int nFileIndexHigh | |
| @cindex inode number in file information | |
| @cindex file index in file information | |
| @cindex index of file in file information | |
| A 32 bit value which contains the high part of the 64 bit file | |
| index. The file index is a unique number for a file on a volume. | |
| This identifier cannot change while the file is opened by a process. | |
| Together with the volume number, the file index is a unique | |
| identifier for the file. This can be used by an application to check | |
| whether two handles refer to the same file. Wine currently uses the | |
| inode number for the file index. | |
| @item int nFileIndexLow | |
| A 32 bit value which contains the low part of the 64 bit file index. | |
| @end table | |
| The definition of @code{BY_HANDLE_FILE_INFORMATION} reads: | |
| @example | |
| typedef struct | |
| @{ | |
| int dwFileAttributes; | |
| FILETIME ftCreationTime; | |
| FILETIME ftLastAccessTime; | |
| FILETIME ftLastWriteTime; | |
| int dwVolumeSerialNumber; | |
| int nFileSizeHigh; | |
| int nFileSizeLow; | |
| int nNumberOfLinks; | |
| int nFileIndexHigh; | |
| int nFileIndexLow; | |
| @} BY_HANDLE_FILE_INFORMATION ; | |
| @end example | |
| The @code{BY_HANDLE_FILE_INFORMATION} structure can be obtained by the | |
| @code{GetFileInformationByHandle} function (@pxref{Getting file information}, for | |
| details). | |
| @windiff{} | |
| In @mswindows{}, the @code{int} elements of the structure are apparently | |
| of type @code{DWORD}. | |
| @end deftp | |
| @node File attributes, Getting file information, Type BY_HANDLE_FILE_INFORMATION, File System Interface | |
| @subsubsection The file attributes in a file information structure | |
| The file attributes in a file information structure and in other structures | |
| are a logical @emph{or} of one or more of the following constants: | |
| @defvr_cw32 FILE_ATTRIBUTE_READONLY | |
| The file is a read-only file. (Wine value: 0x0001). | |
| @end defvr | |
| @defvr_cw32 FILE_ATTRIBUTE_HIDDEN | |
| The file is a hidden file. Files in Wine do not have this attribute. (Wine value: | |
| 0x0002). | |
| @end defvr | |
| @defvr_cw32 FILE_ATTRIBUTE_SYSTEM | |
| The file belongs to the operating system. Files in Wine do not have this | |
| attribute. (Wine value: 0x0004). | |
| @end defvr | |
| @defvr_cw32 FILE_ATTRIBUTE_LABEL | |
| This is not present in the @mswindows{} API. (Wine value: 0x0008). | |
| @end defvr | |
| @defvr_cw32 FILE_ATTRIBUTE_DIRECTORY | |
| The file is a directory. (Wine value: 0x0010). | |
| @end defvr | |
| @defvr_cw32 FILE_ATTRIBUTE_ARCHIVE | |
| The file is an archive file. Currently, all non-directory files are | |
| reported by Wine to have this attribute. This attribute is normally set | |
| by @mswindows{} to indicate that a file is to be archived; when the file | |
| is archived, the flag is cleared. (Wine value: 0x0020). | |
| @end defvr | |
| @defvr_cw32 FILE_ATTRIBUTE_NORMAL | |
| The file does not have any other attributes set. This value must be used | |
| alone. In Wine, normal files are reported as archive files. (Wine value: | |
| 0x0080). | |
| @end defvr | |
| @defvr_cw32 FILE_ATTRIBUTE_TEMPORARY | |
| The file is used as a temporary storage. Files in Wine do not have this | |
| attribute. (Wine value: 0x0100). | |
| @end defvr | |
| @defvr_cw32 FILE_ATTRIBUTE_ATOMIC_WRITE | |
| This is reserved for future use. Files in Wine do not have this | |
| attribute. (Wine value: 0x0200). | |
| @end defvr | |
| @defvr_cw32 FILE_ATTRIBUTE_XACTION_WRITE | |
| This is reserved for future use. Files in Wine do not have this | |
| attribute. (Wine value: 0x0400). | |
| @end defvr | |
| @defvr_cw32 FILE_ATTRIBUTE_COMPRESSED | |
| The file is compressed. Files in Wine do not have this attribute. (Wine | |
| value: 0x0800). | |
| @end defvr | |
| @node Getting file information, , File attributes, File System Interface | |
| @subsubsection Getting file information | |
| The functions in this section describe how to get information about | |
| files. | |
| @c | |
| @c *** GetFileInformationByHandle | |
| @c | |
| @noindent | |
| The Wine function @code{GetFileInformationByHandle} returns a file | |
| information structure. It is defined in @file{windows.h}. | |
| @deftypefn_w32 BOOL GetFileInformationByHandle (@w{HFILE32 @var{file},} @w{BY_HANDLE_FILE_INFORMATION *@var{info})} | |
| This function obtains for the specified @var{file} the file information, | |
| and stores it in @var{info}. The file information contains the file | |
| attributes, the file times, the volume serial number, the file size, the | |
| number of links, and a unique file identifier. The function returns | |
| @code{TRUE} on success, @code{FALSE} on failure. | |
| @winconfall{} | |
| @windiff{} | |
| The Wine function can of course only give back information that is | |
| accessible in the @unix{} file system. File times are produced in a | |
| granularity of full seconds. Most file attributes are not present in the | |
| @unix{} file system. @xref{File attributes}, for details. The volume | |
| serial number is set to 0. | |
| @end deftypefn | |
| @c | |
| @c *** GetFileTime *** | |
| @c | |
| @noindent | |
| The Wine function @code{GetFileTime} returns the creation time and | |
| the times of last the read and modification access to a file. It is | |
| defined in @file{windows.h}. | |
| @deftypefn_w32 BOOL GetFileTime (@w{HANDLE @var{file},} @w{LPFILETIME @var{ctime},} @w{LPFILETIME @var{atime},} @w{LPFILETIME @var{mtime})} | |
| This function obtains for the specified @var{file} the creation time | |
| @var{ctime}, the time of the last access to the file @var{atime}, and | |
| the time of the last modification (write) to the file, @var{mtime}. | |
| The file time arguments of this function are pointers to @code{FILETIME} | |
| variables, which are filled with a value that indicates an absolute time | |
| in UTC. @xref{Type FILETIME}, for details. If you do not need some of | |
| the times, you can pass a @code{NULL} pointer. | |
| The function returns @code{TRUE} on | |
| success, @code{FALSE} on failure. | |
| @winconfall{} | |
| @windiff{} | |
| The file times are produced in a granularity of full seconds, due to the | |
| underlying @unix{} file system. | |
| @end deftypefn | |
| @c | |
| @c *** GetFileAttributes *** | |
| @c | |
| @noindent | |
| The Wine function @code{GetFileAttributes} returns the file attributes | |
| for a file. It is defined in @file{windows.h}. | |
| @deftypefn_w32 DWORD GetFileAttributes (@w{LPCTSTR @var{name})} | |
| This function looks up the file with name @var{name}, and returns the | |
| attributes of the file. @xref{File attributes}, for details on the file | |
| attributes. If the function is not successful, it returns a word with | |
| all bits set (@samp{0xffffffff}). | |
| @winconfall{} | |
| @windiff{} | |
| Most file attributes are not present in the | |
| @unix{} file system. @xref{File attributes}, for details. | |
| @end deftypefn | |
| @node Communication, Windows and Graphics, I/O Facilities, @WIN32{} Reference Manual | |
| @section Communication | |
| @node Windows and Graphics, Errors and Exceptions, Communication, @WIN32{} Reference Manual | |
| @section Windows and Graphics | |
| @node Errors and Exceptions, Resources, Windows and Graphics, @WIN32{} Reference Manual | |
| @section Errors and Exceptions | |
| @node Resources, The Registry, Errors and Exceptions, @WIN32{} Reference Manual | |
| @section Resources | |
| @node The Registry, Dynamic Link Libraries, Resources, @WIN32{} Reference Manual | |
| @section The Registry | |
| @node Dynamic Link Libraries, , The Registry, @WIN32{} Reference Manual | |
| @section Dynamic Link Libraries (DLL's) | |
| This section deals with API functions for handling DLL's (dynamic link | |
| libraries). It does not describe DLL's themselves; nor does it give | |
| information on how Wine handles DLL's. @xref{The build program}, for | |
| information on how DLL's are integrated into Wine. | |
| @node Resources and INI files, Metafiles--Icons--Bitmaps, @WIN32{} Reference Manual, Reference Manual | |
| @chapter Resources and @file{INI} Files | |
| @node Metafiles--Icons--Bitmaps, Debugging, Resources and INI files, Reference Manual | |
| @chapter Metafiles --- Icons --- Bitmaps | |
| @node Debugging, Programs, Metafiles--Icons--Bitmaps, Reference Manual | |
| @chapter Debugging | |
| @node Programs, Tools, Debugging, Reference Manual | |
| @chapter Programs | |
| @node Tools, , Programs, Reference Manual | |
| @chapter Tools | |
| This chapter describes some of the tools that are used by Wine. These | |
| are not user-level programs which the user of Wine will | |
| run. @xref{Programs}, for such programs. | |
| Tools are internal programs that are used to help compile or configure | |
| Wine. | |
| @menu | |
| * The build program:: A program used to build the DLL entry | |
| points from specifications in @file{if1632/}. | |
| @end menu | |
| @node The build program, , , Tools | |
| @section The @file{build} program | |
| @cindex modules of Wine | |
| @cindex Wine modules | |
| @cindex DLL's built-in in Wine | |
| @cindex Wine DLL's built-in | |
| @cindex built-in DLL's in Wine | |
| Wine contains several modules that implement various DLL's which are | |
| required to run @mswindows{} programs. | |
| The @file{build} program, located in the @file{tools/} directory, is | |
| used to create the bindings for the DLL entry points of the API functions. | |
| This program reads a @file{.spec}-file in the @file{if1632} directory | |
| and creates the assembly code that translates the function arguments | |
| correctly. | |
| @menu | |
| * The spec files:: The format of the @file{.spec}-files. | |
| @end menu | |
| FIXME: where in Wine are the DLL's affixed? | |
| FIXME: write a description | |
| @xref{Implementing an API function}, for notes on using this program. | |
| @node The spec files, , , The build program | |
| @subsection The @file{.spec}-files | |
| @cindex DLL spec files | |
| @cindex spec files of DLL's | |
| @cindex entry points in DLL's | |
| This subsection describes the format of the @file{.spec}-files. | |
| A @file{.spec}-file contains the information about the functions, | |
| variables, and constants that are contained in a DLL (dynamic link | |
| library). | |
| To be able to interpret the contents of a @file{.spec}-file, you must | |
| know about the concept of ordinals. | |
| @menu | |
| * The general format:: General format conventions. | |
| * Ordinals:: Ordinals are indexes of entry | |
| points into DLL's. | |
| * Spec file header:: The header information. | |
| * Variable entry points:: Entries for DLL variables. | |
| * Function entry points:: Entries for DLL functions. | |
| * Special entries:: Entries for stubs, dummy | |
| functions, Wine symbols, and | |
| constant values. | |
| @end menu | |
| @node The general format, Ordinals, , The spec files | |
| @subsubsection The general format | |
| @cindex format of spec files | |
| @cindex spec files format | |
| The @file{.spec}-file contains a header and a sequence of declarations. | |
| Each declaration describes an ordinal. | |
| The header gives general information about the DLL and its properties. | |
| Ordinal declarations are optional. That means that there is a default | |
| behaviour assigned to ordinals which are not mentioned in the | |
| @file{.spec}-file. The default handler function of an ordinal will print | |
| an error message when called. | |
| Comments are indicated by hash marks (@samp{#}); everything between a | |
| hash mark and the end of the line is ignored. | |
| Empty lines are allowed. | |
| @* FIXME: is that so? | |
| @node Ordinals, Spec file header, The general format, The spec files | |
| @subsubsection Ordinals | |
| @cindex ordinals in DLL's | |
| @cindex DLL ordinals | |
| All references to DLL objects like functions or variables are indexed by | |
| unique nonnegative numbers. These numbers are called | |
| @dfn{ordinals}. Apparently, a program can refer to a DLL function or | |
| variable by specifying its name or its ordinal. Although reference by | |
| name is the common usage, some program parts (notably DLL's themselves) | |
| sometimes refer to DLL entries by ordinal. Therefore, the ordinals | |
| cannot be chosen arbitrarily. | |
| Regular programs that are compiled and linked against @mswindows{} DLL's | |
| will import DLL functions by name. This is therefore the default | |
| behaviour. Most DLL functions will be imported by name in all cases. | |
| Apparently, the @WIN32{} DLL's even show some difference in the mapping | |
| of functions and ordinals on @WINNT{} and @WIN95{}. For most DLL | |
| functions, the ordinal number will not matter. | |
| There are some exceptions to that. Notable the KERNEL32 ordinals below | |
| 100 are (presently) unnamed and undocumented functions which can only be | |
| imported by ordinal. These functions are called by some @mswindows{} | |
| programs. Also the @file{shell32.dll} functions are reported to be | |
| imported by ordinal in some other DLL's. | |
| @xref{Getting information on the API}, for sources of further information. | |
| @node Spec file header, Variable entry points, Ordinals, The spec files | |
| @subsubsection The header of a @file{.spec}-file | |
| The @file{.spec}-file starts with two mandatory definitions. The first | |
| line gives the name of the DLL which the @file{.spec}-file describes, | |
| @example | |
| name @var{NAME} | |
| @end example | |
| where @var{NAME} is the name of the DLL. The next line defines the type | |
| of the DLL, | |
| @example | |
| type @var{TYPE} | |
| @end example | |
| with @var{TYPE} being either @samp{win16} or @samp{win32}. | |
| An optional statement of the form | |
| @example | |
| base @var{ORDINAL} | |
| @end example | |
| can be used to define the offset of the first ordinal. @var{ORDINAL} | |
| must be an integer number. If no base is specified, the offset is zero. | |
| @* FIXME: is this the offset of the first or an offset that is added to all | |
| ordinals? | |
| what is the offset? Is it added to the ordinals, or is it an address, or | |
| xxx? | |
| An optional statement like | |
| @example | |
| heap @var{SIZE} | |
| @end example | |
| can be used to define the size of the module local heap. This is only | |
| used for @WIN16{} DLL's. The local heap is the place where the segments | |
| of 16 bit programs can locally allocate memory, without interfering with | |
| one another. The default size of the local heap, if not specified, is 0. | |
| @* FIXME: to my impression, a local heap in DLL's would only be required | |
| if DLL functions used it. As all DLL functions in Wine are truly 32 bit | |
| functions that are mapped from 16 bit on being called and back to 16 bit | |
| on returning, a local heap should never be necessary. | |
| If I receive a confirmation of that here, I will state so. Otherwise I | |
| am missing some information on local heaps. | |
| But why is a heap defined in user.spec and gdi.spec? | |
| @node Variable entry points, Function entry points, Spec file header, The spec files | |
| @subsubsection Variable entry points of @file{.spec}-files | |
| You can declare an ordinal that holds data. Data items may be of 8, 16, | |
| or 32 bit in size. | |
| @example | |
| @var{ORDINAL} @var{VARTYPE} @var{EXPORTNAME} (@var{DATA} @var{[DATA @dots{}]}) | |
| @end example | |
| @var{ORDINAL} is the ordinal number corresponding to the | |
| variable. @var{VARTYPE} must be @samp{byte}, @samp{word}, or | |
| @samp{long}, for 8, 16, or 32 bits respectively. @var{EXPORTNAME} will | |
| be the name available for dynamic linking. @var{DATA} can be a decimal | |
| number or a hex number preceded by @samp{0x}. Each @var{DATA} item defines | |
| a unit of storage. | |
| The following example defines the variable @samp{VariableA} at ordinal | |
| 2, containing 4 bytes: | |
| @example | |
| 2 byte VariableA(-1 0xff 0 0) | |
| @end example | |
| @node Function entry points, Special entries, Variable entry points, The spec files | |
| @subsubsection Function entry points of @file{.spec}-files | |
| @example | |
| @var{ORDINAL} @var{FUNCTYPE} @var{EXPORTNAME} (@var{[ARGTYPE} @dots{} @var{]}) @var{HANDLERNAME} | |
| @end example | |
| @var{ORDINAL} is the ordinal number corresponding to the | |
| function. @var{FUNCTYPE} must be chosen from this table: | |
| @table @samp | |
| @item pascal16 | |
| A @WIN16{} function that returns a 16 bit value. | |
| @item pascal | |
| A @WIN16{} function that returns a 32 bit value. | |
| @item register | |
| A function using CPU registers to pass arguments. | |
| @item stdcall | |
| A normal @WIN32{} function. @xref{Investigating the undocumented API}, | |
| for an explanation of the stdcall calling convention. | |
| @item cdecl | |
| A @WIN32{} function using the C calling conventions. (This is presently | |
| only used for the built-in functions of the C runtime system). | |
| @end table | |
| @var{EXPORTNAME} specifies the name (prototype) available for dynamic | |
| linking. | |
| @var{ARGTYPE} must be chosen from this table: | |
| @table @samp | |
| @item byte | |
| An 8 bit argument. Can be used in @WIN16{} functions only. | |
| @item word | |
| A 16 bit argument. Can be used in @WIN16{} functions only. | |
| @item long | |
| A 32 bit argument. Can be used in @WIN16{} or @WIN32{} functions. | |
| @item ptr | |
| A linear pointer, unsegmented. Can be used in @WIN16{} or @WIN32{} | |
| functions. | |
| @item str | |
| A linear pointer, unsegmented, pointing to a null-terminated string. | |
| Can be used in @WIN16{} or @WIN32{} functions. | |
| @item s_byte | |
| A signed 8 bit argument. Can be used in @WIN16{} functions only. | |
| @item s_word | |
| A signed 16 bit argument. Can be used in @WIN16{} functions only. | |
| @item s_long | |
| A signed 32 bit argument. Can be used in @WIN16{} or @WIN32{} | |
| functions. | |
| @item segptr | |
| A segmented pointer. Can be used in @WIN16{} functions only. | |
| @item segstr | |
| A segmented pointer to a null-terminated string. Can be used in | |
| @WIN16{} functions only. | |
| @end table | |
| @var{HANDLERNAME} is the name of the actual Wine function that will | |
| process the request in 32-bit mode. | |
| @sp 2 | |
| Here are some examples. The first example defines an entry point for the | |
| @code{CreateWindow()} call (the ordinal 100 is just an example): | |
| @example | |
| 100 pascal CreateWindow(ptr ptr long s_word s_word s_word s_word | |
| word word word ptr) WIN_CreateWindow | |
| @end example | |
| The second example defines an entry point for the @code{GetFocus()} call | |
| (again, the ordinal 100 is an example): | |
| @example | |
| 100 pascal GetFocus() WIN_GetFocus() | |
| @end example | |
| To declare a function that uses a variable number of arguments, specify | |
| the function as taking no arguments. In this special case, in @WIN32{} | |
| the called function will be passed a pointer to the first arg; in | |
| @WIN16{}, the args are available as @code{CURRENT_STACK16->args}. | |
| @* FIXME: create a reference here | |
| See the @code{wsprintf}* functions in @file{user.spec} and | |
| @file{user32.spec} for an example. | |
| Sometimes it is not known how many arguments an undocumented DLL | |
| function takes. @xref{Getting information on the API}, for some hints on | |
| how to proceed in such a case. | |
| @node Special entries, , Function entry points, The spec files | |
| @subsubsection Special entries of @file{.spec}-files | |
| The @file{.spec}-files offer the possibility to use some special | |
| entries. These entries are used for stubs (which allow linking for | |
| non-existing functions), dummy functions that do not perform any | |
| operations, Wine symbols that must be referenced directly, and constant | |
| values. | |
| @strong{Stub ordinals} | |
| This pseudo function type defines a stub function. It makes the name and | |
| ordinal available for dynamic linking, but will terminate execution with | |
| an error message if the function is ever called. | |
| @example | |
| @var{ORDINAL} stub @var{EXPORTNAME} | |
| @end example | |
| @var{ORDINAL} is the ordinal number corresponding to the | |
| function. @var{EXPORTNAME} specifies the name (prototype) available for dynamic | |
| linking. | |
| @strong{Return ordinals} | |
| This pseudo function type defines a function entry point whose handler | |
| should do nothing but return a value. | |
| @example | |
| @var{ORDINAL} return @var{EXPORTNAME} @var{ARGLENGTH} @var{RETVALUE} | |
| @end example | |
| @var{ORDINAL} is replaced by the ordinal number corresponding to the | |
| function. @var{ARGLENGTH} is the number of bytes that need to be removed | |
| from the stack before returning to the caller. @xref{Investigating the | |
| undocumented API}, for an explanation of the stdcall calling convention. | |
| @var{RETVALUE} is the return value which will be passed back to the | |
| caller. | |
| @strong{Extern ordinals} | |
| @example | |
| @var{ORDINAL} extern @var{EXPORTNAME} @var{SYMBOLNAME} | |
| @end example | |
| This type defines an entry that simply maps to a Wine symbol | |
| (variable or function); @var{EXPORTNAME} will point to the symbol | |
| @var{SYMBOLNAME} that must be defined in C code. This type only works with | |
| @WIN32{}. | |
| @strong{Equate ordinals} | |
| @example | |
| @var{ORDINAL} equate @var{EXPORTNAME} @var{DATA} | |
| @end example | |
| This type defines an ordinal as an absolute value. | |
| @var{ORDINAL} is replaced by the ordinal number corresponding to the | |
| entry. @var{EXPORTNAME} will be the name available for dynamic linking. | |
| @var{DATA} can be a decimal number or a hex number preceeded by @samp{0x}. | |
| @node Installation, The Wine Project, Reference Manual, Top | |
| @chapter Wine installation and configuration | |
| FIXME: write installation guide | |
| @menu | |
| * Applying patches:: How to update Wine to a newer version. | |
| @end menu | |
| @node Applying patches, , , Installation | |
| @section Applying patches | |
| @xref{Creating patches}, for instructions on creating patches. | |
| @kbd{cd} to the top source directory for Wine, and run | |
| @code{patch -p1 < @var{patchfile}}. | |
| What needs to be done next depends to some extent on what the | |
| patch touches. For small patches which only alter C source, it can be | |
| enough to rerun @code{make}. In general, the sequence @code{configure}, | |
| @code{make depend}, @code{make} is sufficient, unless the patch alters | |
| @code{[config.in]}, in which case you must regenerate @code{configure} | |
| via @code{make configure} (which just runs @code{autoconf}). | |
| @node The Wine Project, , Installation, Top | |
| @chapter The Wine project | |
| @cindex Wine project contributions | |
| @cindex project contributions to Wine | |
| If you are new to Wine and want to support this project, here are | |
| some suggestions. | |
| @menu | |
| * Getting information on the API:: Official and unofficial sources | |
| of information on the @WIN32{} API. | |
| * Investigating the undocumented API:: You can find out some API | |
| information on your own. | |
| * Implementing an API type:: How to implement a data type | |
| of the API (a checklist). | |
| * Implementing an API function:: How to implement one function | |
| of the API (a checklist). | |
| * API function and type naming:: How to name API functions in Wine. | |
| * Creating patches:: How to create patches for Wine. | |
| * Adding Documentation:: Templates for the documentation. | |
| * File names:: How Wine treats @mswindows{} and | |
| @unix{} file names. | |
| * Wide character strings:: How Wine treats wide character | |
| strings. | |
| @end menu | |
| @xref{Debugging}, for advice on how to debug Wine. | |
| @xref{Applying patches}, for instructions on applying patches. | |
| @node Getting information on the API, Investigating the undocumented API, , The Wine Project | |
| @section Official and unofficial documentation on the @mswindows{} API | |
| @cindex documentation of API functions | |
| @cindex undocumented API functions | |
| @strong{Official documentation} | |
| For documentation on @WIN32{} API functions, you might try one of these | |
| sources: | |
| @itemize @bullet | |
| @item | |
| There is a free online version of the MSDN library (including | |
| documentation for the @WIN32{} API) on | |
| @url{http://www.microsoft.com/msdn/}. | |
| @item | |
| The @WINNT{} DDK gives information about some kernel (``executive'') | |
| routines. Some of the function documentation might also apply to user | |
| accessible DLL's. | |
| @end itemize | |
| @strong{Unofficial documentation} | |
| Not all of the @WIN32{} API is well documented. Some functions are | |
| obscured, and undocumented. @xref{Ordinals}, for information about | |
| undocumented functions imported by ordinal. Getting to know what these | |
| functions do can be tiresome and tedious. Here is a quote from a | |
| news posting concerning two books that might help: | |
| @c From: vischne@ibm.net-nospam (root) | |
| @c Subject: Re: Functions | |
| @c Newsgroups: comp.emulators.ms-windows.wine | |
| @c Date: 24 Jul 97 16:45:11 GMT | |
| @c Organization: The Light | |
| @c NNTP-Posting-Host: 129.37.246.203 | |
| @c Message-ID: <33d78697.0@news3.ibm.net> | |
| @quotation | |
| Well actually, there are at least _two_ books that address these problems. | |
| One is by Matt Pietrek, ``Windows 95 System Programming Secrets'', which | |
| gives some auxiliary programs for helping ferret out the information, and | |
| the other is by Shulman, ``Undocumented Windows 95''. | |
| @end quotation | |
| @xref{Ordinals}, for some notes on undocumented kernel functions. | |
| @itemize @bullet | |
| @item | |
| @cindex book on undocumented API features by Pietrik | |
| ``Windows 95 System Programming Secrets'' @* | |
| by Matt Pietrek @* | |
| Book & Disk Edition @* | |
| Paperback, 778 pages @* | |
| Published by IDG Books Worldwide @* | |
| Publication date: November 1, 1995 @* | |
| Dimensions (in inches): 9.25 x 7.42 x 2.06 @* | |
| ISBN: 1568843186 @* | |
| @item | |
| @cindex book on undocumented API features by Schulman | |
| ``Undocumented Windows; A Programmers Guide | |
| to Reserved Microsoft Windows API Functions'' @* | |
| by Andrew Schulman @* | |
| Paperback, 715 pages @* | |
| Published by Addison-Wesley Pub Co @* | |
| Publication date: February 1, 1994 @* | |
| Dimensions (in inches): 9.11 x 7.37 x 1.53 @* | |
| ISBN: 0201608340 @* | |
| @item | |
| More books on these topics (including Schulman and Pietrik): @* | |
| @url{http://www.sonic.net/~undoc/bookstore.html} | |
| @item | |
| More details about calling undocumented functions can be found at | |
| @url{http://ftp.uni-mannheim.de/info/OReilly/windows/win95.update/dirty.html}. | |
| @item | |
| In 1993 Dr. Dobbs Journal published a column called ``Undocumented | |
| Corner''. | |
| @item | |
| You might want to check out BYTE from December 1983 as well. | |
| @* FIXME: is that to be taken seriously? | |
| @item | |
| And you might try to find out something on your own. @xref{Investigating | |
| the undocumented API}, for details. | |
| @end itemize | |
| But, all in all, @url{news:comp.emulators.ms-windows.wine} says | |
| @c From: dacut@henry.ece.cmu.edu (David A. Cuthbert) | |
| @c Subject: Re: Getting Internet Explorer to work | |
| @c Newsgroups: comp.emulators.ms-windows.wine | |
| @c Date: 24 Jul 1997 03:10:30 GMT | |
| @c Organization: Electrical & Computer Engineering, Carnegie Mellon University | |
| @c Reply-To: henry.ece.cmu.edu!dacut | |
| @c Message-ID: <5r6h36$86c@fs7.ece.cmu.edu> | |
| @c NNTP-Posting-Host: henry.ece.cmu.edu | |
| @quotation | |
| Unfortunately, short of getting something like NuMega's SoftIce, I | |
| don't think there's a ``good'' reference on the mystery <100 ordinals in | |
| KERNEL32.DLL. | |
| @end quotation | |
| @node Investigating the undocumented API, Implementing an API type, Getting information on the API, The Wine Project | |
| @section Investigating the undocumented API | |
| @cindex undocumented API investigation | |
| @cindex parameters of undocumented API functions | |
| @cindex stdcall calling convention | |
| @cindex C calling convention | |
| @cindex API function parameters investigation | |
| @cindex stack handling under stdcall calling | |
| Besides reading the documentation in @ref{Getting information on the API}, | |
| you can find out some properties of API functions on your own. | |
| Sometimes it is not known how many arguments an undocumented DLL | |
| function takes. Here is a text from a news posting that gives some | |
| hints on how you might proceed in this case. | |
| @c The following text is closely quoted from: | |
| @c From: dacut@henry.ece.cmu.edu (David A. Cuthbert) | |
| @c Subject: Win32 stub functions (Claus Fischer, please read) | |
| @c Newsgroups: comp.emulators.ms-windows.wine | |
| @c Date: 7 Aug 1997 22:33:09 GMT | |
| @c Organization: Electrical & Computer Engineering, Carnegie Mellon University | |
| @c Reply-To: henry.ece.cmu.edu!dacut | |
| @c Message-ID: <5sdif5$qt3@fs7.ece.cmu.edu> | |
| The problem with implementing stubs for @WIN32{} functions is that it is | |
| not sufficient to return a default value (usually 0) and leave the | |
| stack the way we found it. For most @WIN32{} functions -- those that use | |
| the @dfn{stdcall} calling convention -- the arguments sent to the function | |
| are removed from the stack. | |
| Some background: On the i386 class of machines, stack entries are | |
| usually dword (4 bytes) in size, little-endian. The stack grows | |
| downward in memory. The stack pointer, maintained in the @samp{esp} | |
| register, points to the last valid entry; thus, the operation of | |
| pushing a value onto the stack involves decrementing @samp{esp} and then | |
| moving the value into the memory pointed to by esp (i.e., @code{push p} | |
| in assembly resembles @code{*(--esp) = p;} in C). Removing (popping) | |
| values off the stack is the reverse (i.e., @code{pop p} corresponds to | |
| @code{p = *(esp++);}). | |
| In the @dfn{stdcall} calling convention, arguments are pushed onto the | |
| stack right-to-left. For example, the C call | |
| @example | |
| myfunction(40, 20, 70, 30); | |
| @end example | |
| is expressed in Intel assembly as: | |
| @example | |
| push 30 | |
| push 70 | |
| push 20 | |
| push 40 | |
| call myfunction | |
| @end example | |
| In addition, the called function is responsible for removing the | |
| arguments off the stack. Thus, before the call to myfunction, the | |
| stack would look like: | |
| @example | |
| [local variable or temporary] | |
| [local variable or temporary] | |
| 30 | |
| 70 | |
| 20 | |
| esp -> 40 | |
| @end example | |
| After the call returns, it should look like: | |
| @example | |
| [local variable or temporary] | |
| esp -> [local variable or temporary] | |
| @end example | |
| To restore the stack to this state, the called function must know how | |
| many arguments to remove (which is the number of arguments it takes). | |
| This is a problem if the function is undocumented. | |
| One way to attempt to document the number of arguments each function | |
| takes is to create a wrapper around that function that detects the | |
| stack offset. @file{WinRelay} (see below) was written to create such | |
| wrappers. Essentially, each wrapper assumes that the function will take | |
| a large number of arguments (by default, 64 in @file{WinRelay}). The | |
| wrapper copies each of these arguments into its stack, calls the actual | |
| function, and then calculates the number of arguments by checking esp | |
| before and after the call. | |
| @cindex bsod (blue screen of death) | |
| @cindex blue screen of death | |
| The main problem with this scheme is that the function must actually | |
| be called from another program. Many of these functions are seldom | |
| used. An attempt was made to aggressively query each function in a | |
| given library (@file{ntdll.dll}) by passing 64 arguments, all 0, to each | |
| function. Unfortunately, @WINNT40{} quickly goes to a blue screen | |
| of death (@dfn{bsod}), even if the program is run from a | |
| non-administrator account. | |
| Another method that has been much more successful is to attempt to | |
| figure out how many arguments each function is removing from the | |
| stack. This instruction, @code{ret hhll} (where @samp{hhll} is the | |
| number of bytes to remove, i.e. the number of arguments times 4), contains | |
| the bytes @samp{0xc2 ll hh} in memory. It is a reasonable assumption | |
| that few, if any, functions take more than 16 arguments; therefore, | |
| @samp{hh} is 0x0 and @samp{ll} is less than 0x40. This utility, | |
| @file{MakeSpec} (see below), simply queries the address of a function | |
| and looks for the first occurrence of the bytes @samp{0xc2 ll 0x0}, | |
| where @math{@samp{ll} <= 0x40}. | |
| Of course, this is not without errors. @code{ret 00ll} is not the only | |
| instruction that can have the byte sequence @samp{0xc2 ll 0x0}; for | |
| example, @code{push 0x000040c2} has the byte sequence | |
| @samp{0x68 0xc2 0x40 0x0 0x0}, which matches the above. Properly, the | |
| utility should look for this sequence only on an instruction boundary; | |
| unfortunately, finding instruction boundaries on an i386 requires | |
| implementing a full disassemble -- quite a daunting task. Besides, | |
| the probability of having such a byte sequence that is not the actual | |
| return instruction is fairly low. | |
| Much more troublesome is the non-linear flow of a function. For | |
| example, consider the following two functions: | |
| @example | |
| somefunction1: | |
| jmp somefunction1_impl | |
| somefunction2: | |
| ret 0004 | |
| somefunction1_impl: | |
| ret 0008 | |
| @end example | |
| @file{MakeSpec} would incorrectly list both @code{somefunction1} and | |
| @code{somefunction2} as taking only a single argument, whereas | |
| @code{somefunction1} really takes two arguments. | |
| With these limitations in mind, it is possible to implement more stubs | |
| in Wine and, eventually, the functions themselves. | |
| @c end of quote | |
| The program @file{WinRelay} can be downloaded from | |
| @url{http://www.ece.cmu.edu/afs/ece/usr/dacut/www/src}, | |
| and @file{MakeSpec} will be available from the same location. You can | |
| compile them with Borland's C++Builder; you should not optimize when | |
| compiling (@file{WinRelay} needs the stack frames). | |
| @node Implementing an API type, Implementing an API function, Investigating the undocumented API, The Wine Project | |
| @section Implementing an API type | |
| Here is a checklist that should help you writing your first API type. It | |
| will of course not tell you which elements to put into the type | |
| (assuming it is a structure), but it should help you along the way of | |
| integrating this type into Wine. | |
| @xref{Implementing an API function}, for comparison. | |
| @enumerate | |
| @item | |
| Find out how the type should be named in Wine and in the DLL's. | |
| @xref{API function and type naming}, for details. | |
| @item | |
| Find out where the type should go. Please try to keep the header files | |
| structure as similar to @mswindows{} as possible. | |
| @item | |
| Prepare for the later patch (by saving the original files before you | |
| work on them). @xref{Creating patches}, for details. | |
| @item | |
| Put the type declaration into the header file. | |
| @item | |
| Make sure the declaration is syntactically correct, i.e. it does not | |
| keep Wine from compiling. | |
| @item | |
| Make sure the declared type is layout-compatible with | |
| @mswindows{}-compiled types. Especially keep an eye on the packing of | |
| the structure. | |
| @* FIXME: a reference to packed structures here. | |
| @item | |
| Build Wine and test the type, if possible. If you cannot test the | |
| type by implementing a proper API function, write a small test program | |
| to test it on its own. Or rather stop here. | |
| @item | |
| Write the documentation of the type in the @file{wine.texinfo} | |
| file. @xref{Adding Documentation}, for details. | |
| With types, be especially careful and document all the details. Also | |
| document all constants or flags that are used in the type. | |
| @item | |
| Create an entry in the @file{ChangeLog} file. | |
| @item | |
| Collect some of these changes, and create a patch. @xref{Creating | |
| patches}, for details. | |
| @item | |
| Mail the patch to Alexandre Julliard, @email{julliard@@winehq.com}. | |
| @item | |
| Wait for the patch to appear in the official distribution. | |
| @end enumerate | |
| @node Implementing an API function, API function and type naming, Implementing an API type, The Wine Project | |
| @section Implementing an API function | |
| Here is a checklist that should help you writing your first API | |
| function. It will of course not tell you what to do in the function, | |
| but it should help you along the way of integrating this function into | |
| Wine. | |
| @enumerate | |
| @item | |
| Make sure all data types that appear in function arguments are properly | |
| declared in Wine. Otherwise, start with the data types. | |
| @item | |
| Find out how the function should be named in Wine and in the DLL's. | |
| @xref{API function and type naming}, for details. | |
| @item | |
| Find out what the function should do. This may be tricky for | |
| undocumented functions. @xref{Getting information on the API}, for some | |
| hints. | |
| @item | |
| Find out where the function should go: | |
| @enumerate | |
| @item | |
| Which header file for the prototype. | |
| @item | |
| Which C source file. | |
| @item | |
| Which DLL(s), and which ordinal the function will take there. Perhaps | |
| the function name is already present in one of the @file{.spec}-files in | |
| the @file{if1632} directory. | |
| @end enumerate | |
| @item | |
| Prepare for the later patch (by saving the original files before you | |
| work on them). @xref{Creating patches}, for details. | |
| @item | |
| Put the prototype into the header file, and the code into the C file. | |
| @item | |
| Make sure the code compiles. | |
| @item | |
| Create or change the information for the DLL entry points in the | |
| @file{.spec}-file in the @file{if1632} directory. | |
| @xref{The build program}, for details of the DLL spec files. | |
| @item | |
| Build Wine and test the function, if possible. If you cannot test the | |
| function in Wine, write a small test program to test it on its own. | |
| @item | |
| Write the documentation of the function in the @file{wine.texinfo} | |
| file. @xref{Adding Documentation}, for details. | |
| @item | |
| Create an entry in the @file{ChangeLog} file. | |
| @item | |
| Collect some of these changes, and create a patch. @xref{Creating | |
| patches}, for details. | |
| @item | |
| Mail the patch to Alexandre Julliard, @email{julliard@@winehq.com}. | |
| @item | |
| Wait for the patch to appear in the official distribution. | |
| @end enumerate | |
| @node API function and type naming, Creating patches, Implementing an API function, The Wine Project | |
| @section API function and data type naming conventions | |
| @cindex API function names | |
| @cindex API type names | |
| @cindex names of API functions and types | |
| @cindex naming scheme for API functions and types | |
| @cindex suffixes for API functions and types | |
| @cindex endings of API function and type names | |
| This section describes Wine's naming scheme for API functions and data | |
| types. | |
| The purpose of these naming conventions is to ensure that | |
| @itemize @bullet | |
| @item | |
| both the @WIN16{} and @WIN32{} API are supported within the same source | |
| code, | |
| @item | |
| both wide character functions (with @unicode{} strings) and 8 bit | |
| character functions (with @ascii{} or extended @ascii{} encoding) are | |
| supported, and | |
| @item | |
| the source code can be shared between the emulator and the library | |
| version of Wine. | |
| @end itemize | |
| A function or data type whose name in the @mswindows{} API is @var{xxx} | |
| will in the Wine code have the following name(s): | |
| @table @code | |
| @item @var{xxx}16 | |
| This is the version for the 16 bit API. You might call it the ``16 bit | |
| version'' except that the function itself of course runs in true 32 bit | |
| mode (being part of Wine). So, the correct meaning of the suffix is that | |
| this function is part of the 16 bit API. | |
| @item @var{xxx}32 | |
| This is the version for the 32 bit API. Use this suffix only if the | |
| function does not use character strings in its parameters or return | |
| values. Otherwise use the next two. | |
| @item @var{xxx}32A | |
| This is the version for the 32 bit API which uses @ascii{} strings (or | |
| rather, strings with 8 bit character encodings, i.e. the standard C | |
| @code{char} type). This version always goes together with another | |
| version, using the next suffix. | |
| @item @var{xxx}32W | |
| This is the version for the 32 bit API which uses @unicode{} strings, | |
| i.e. strings with wide characters. It goes together with the @ascii{} | |
| version. | |
| @end table | |
| So, where the @mswindows{} API offers one name, Wine actually has two or | |
| three different functions implemented (which will hopefully share a | |
| large part of the code). | |
| Wine allows to use its API functions in two ways. The emulator part of | |
| Wine provides DLL's for the @mswindows{} programs it can run. The | |
| library part of Wine provides a @unix{} programmer with the facility to | |
| use the Wine API's in a standard @unix{} program. | |
| @menu | |
| * Access from the emulator:: How to access API functions and types | |
| from applications that are run in the | |
| Wine emulator. | |
| * Access in the library:: How to access API functions and types | |
| from applications that are linked with | |
| the Wine library. | |
| * Access from inside Wine:: How to access API functions and types | |
| from inside the Wine code. | |
| @end menu | |
| @node Access from the emulator, Access in the library, , API function and type naming | |
| @subsection Accessing API functions and types from the emulator | |
| @cindex access to DLL API functions and types | |
| @cindex Wine emulator access to API functions and types | |
| @cindex emulator access to Wine API functions and types | |
| The emulator part of Wine provides the hooks for dynamically linking the | |
| API functions to the @mswindows{} executables (@file{.EXE}-files). The | |
| Wine emulator contains all versions (16 or 32 bit, @ascii{} or | |
| @unicode{}) of the API functions in one executable. The emulator | |
| performs a mapping from the @mswindows{} name of the function, | |
| by which the executable calls it, to one of the Wine internal names that | |
| have been used in coding it. | |
| This mapping is done by the built-in DLL handling code of Wine. A | |
| programmer of Wine has to declare the function in one of the virtual | |
| DLL's that are provided by Wine. The declarations are done in the | |
| @file{.spec}-files in the @file{if1632/} directory. @xref{The build | |
| program}, for details. | |
| The @mswindows{} application simply calls the API function by its | |
| standard @mswindows{} name. Wine will apply the correct mapping | |
| according to Wine's selected appearance (as a 16 bit or 32 bit emulator, | |
| which is a parameter on invocation of Wine). | |
| @node Access in the library, Access from inside Wine, Access from the emulator, API function and type naming | |
| @subsection Accessing API functions and types in the library | |
| @cindex Wine library API function and type access | |
| @cindex access to Wine library API functions and types | |
| If Wine is built as a library, and linked to a user-level main program, | |
| the user will also use the standard @mswindows{} names for the API | |
| functions. | |
| Some macros are defined in @file{include/wintypes.h} which perform the | |
| necessary name mappings. | |
| These macros are (see the examples below): | |
| @deffn_winemacro WINELIB_NAME (@var{xxx}) | |
| This macro replaces @var{xxx} by one of @var{xxx}16 or | |
| @var{xxx}32, depending on the definition of the symbols | |
| @code{WINELIB16} and @code{WINELIB32}. @var{xxx} should | |
| be the name of an API function that uses no string arguments. | |
| Use this macro with a @code{#define} to establish the API name @var{xxx}. | |
| @end deffn | |
| @deffn_winemacro WINELIB_NAME_AW (@var{xxx}) | |
| This macro replaces @var{xxx} by one of @var{xxx}16, @var{xxx}32A, or | |
| @var{xxx}32W, depending on the definition of the symbols | |
| @code{WINELIB16}, @code{WINELIB32}, and @code{UNICODE}. @var{xxx} should | |
| be the name of an API function that uses string arguments. | |
| Use this macro with a @code{#define} to establish the API name @var{xxx}. | |
| @end deffn | |
| @deffn_winemacro DECL_WINELIB_TYPE (@var{xxx}) | |
| This macro declares @var{xxx} to be an equivalent to @var{xxx}16 or | |
| @var{xxx}32, depending on the definition of the symbols | |
| @code{WINELIB16} and @code{WINELIB32}. @var{xxx} should | |
| be the name of an API data type that contains no string arguments. | |
| @end deffn | |
| @deffn_winemacro DECL_WINELIB_TYPE_AW (@var{xxx}) | |
| This macro declares the type @var{xxx} to be an equivalent to | |
| @var{xxx}16, @var{xxx}32A, or @var{xxx}32W, depending on the definition | |
| of the symbols @code{WINELIB16}, @code{WINELIB32}, and | |
| @code{UNICODE}. @var{xxx} should be the name of an API data type that | |
| contains string arguments. | |
| @end deffn | |
| If Wine is compiled as an emulator, these macros have no effect, for the | |
| mapping is then done by the DLL code. This means that within Wine the | |
| name @var{xxx} itself will not be defined. | |
| Note: If the definition of @var{xxx} is exactly the same in @WIN16{} and | |
| @WIN32{}, you can simply use the same name as @mswindows{}. | |
| Here are some examples: | |
| @example | |
| /* A simple type without strings */ | |
| typedef short INT16; | |
| typedef int INT32; | |
| DECL_WINELIB_TYPE(INT); | |
| /* A type with strings */ | |
| typedef struct @{ /* Win32 ASCII data structure */ @} WNDCLASS32A; | |
| typedef struct @{ /* Win32 Unicode data structure */ @} WNDCLASS32W; | |
| typedef struct @{ /* Win16 data structure */ @} WNDCLASS16; | |
| DECL_WINELIB_TYPE_AW(WNDCLASS); | |
| /* A function with strings */ | |
| ATOM RegisterClass16( WNDCLASS16 * ); | |
| ATOM RegisterClass32A( WNDCLASS32A * ); | |
| ATOM RegisterClass32W( WNDCLASS32W * ); | |
| #define RegisterClass WINELIB_NAME_AW(RegisterClass) | |
| @end example | |
| The Winelib user can then say (in the application program): | |
| @example | |
| INT i; | |
| WNDCLASS wc = @{ @dots{} @}; | |
| RegisterClass( &wc ); | |
| @end example | |
| and this will use the correct declaration depending on the definitions | |
| @code{WINELIB16}, @code{WINELIB32}, and @code{UNICODE}. | |
| Here are the primary defines that are used when Wine is compiled as a | |
| library: | |
| @defvr_cwine WINELIB16 | |
| If this @code{#define} is set, the Wine library is to be compiled in its | |
| 16 bit form. That means, the 16 bit variants of all functions will be | |
| used and the appearance of the application linked with the Wine library | |
| will be that of a 16 bit application. Of course, both the application | |
| and the Wine library function really run in 32 bit mode. The switch only | |
| selects the function with the name ending in @code{@dots{}16}, which | |
| will perhaps have a behaviour different from its 32 bit counterpart. | |
| @end defvr | |
| @defvr_cwine WINELIB32 | |
| If this @code{#define} is set, the Wine library is to be compiled in its | |
| 32 bit form. That means, the 32 bit variants of all functions will be | |
| used and the appearance of the application linked with the Wine library | |
| will be that of a 32 bit application. | |
| @end defvr | |
| @defvr_cwine UNICODE | |
| This @code{define} is used to select one of two possible 32 bit | |
| variants. Functions and data types of the 32 bit API come in two | |
| flavours: one handling @ascii{} strings (or rather strings with | |
| characters encoded in 8 bit), the other @unicode{} strings. This define | |
| selects the correct variant. As a user of the Wine library, you are | |
| responsible to use the correct character type in your part of the | |
| application which accesses the Wine API functions and data types. | |
| @end defvr | |
| These switches are automatically set when Wine is compiled as a library. | |
| @node Access from inside Wine, , Access in the library, API function and type naming | |
| @subsection Accessing API functions from within Wine | |
| @cindex explicit names of API functions and types | |
| Within Wine and during the compilation of Wine, you cannot rely on the | |
| @mswindows{} names of the API functions and data types. If Wine is | |
| compiled as a library, they will be defined; if Wine is compiled as an | |
| emulator, they won't. | |
| You therefore have to access all functions and data types by their full | |
| names, with the proper suffix explicitly appended. In Wine, the 16 bit | |
| and 32 bit versions of the functions are distinct entities, which might | |
| (theoretically) show a completely different behaviour. They may even | |
| call each other (and they will quite frequently). | |
| Therefore Wine is a conglomerate that contains all two or | |
| three flavours of each function at once, and exports to the | |
| application whichever of these is appropriate. Remember that inside | |
| Wine, there is no memory segmentation, so all functions are 32 bit. | |
| The 16-to-32 bit mapping is done on exporting the DLL functions. | |
| @node Creating patches, Adding Documentation, API function and type naming, The Wine Project | |
| @section Creating patches | |
| @xref{Applying patches}, for instructions on applying patches. | |
| Patches are created with the program @code{diff}. You need a copy | |
| of clean source tree to diff against. The @samp{-u} option, to create | |
| unified diffs, is popular but not obligatory. | |
| For changes to a single file, | |
| @code{diff -u wine990101/windows/win.c mywine/windows/win.c > win_patch} | |
| is sufficient. | |
| To generate a complete diff between your tree and the distribution, | |
| use @code{diff -uR wine990101 mywine}. | |
| This assumes that the original distribution and your personal tree | |
| have the same parent directory, from which you make the diff. | |
| This ensures a consistent format for the diffs, which in turn | |
| is necessary so that they can be applied consistently as described in | |
| @xref{Applying patches}. | |
| @node Adding Documentation, File names, Creating patches, The Wine Project | |
| @section Adding Documentation | |
| @ifinfo | |
| Here are some templates which should help you collaborate on this | |
| documentation. Read the text below before examining them. | |
| @end ifinfo | |
| @menu | |
| * Type Template:: How to document data types in Wine's | |
| include files. | |
| * Function Template:: How to document an (API) function of | |
| Wine. | |
| @end menu | |
| These are my tips for adding documentation. | |
| Do not simply copy documentation from @mswindows{} related | |
| material. Except from risking copyright violations, which you would not | |
| want to do, there is another aspect to that: | |
| As Wine is a product to run on @unix{} and @unix{}-like workstations, | |
| it seems a good idea to me to organize this documentation primarily for | |
| the well-trained @unix{} reader. Please keep that in mind when you add | |
| some documentation. | |
| Finally, read the info pages for @code{texinfo}. | |
| The rest of this section provides some templates which can serve as a | |
| start in writing documentation. | |
| @subsection Template introduction | |
| @iftex | |
| On the following pages you will find some @code{texinfo} templates, which | |
| should help you collaborate on this documentation. | |
| @end iftex | |
| These templates give hints on how to document data types, functions, | |
| variables, constants etc. in Wine. | |
| As documentation evolves, you will find common features of data types | |
| that should be described in a unified fashion. In such a case, please | |
| add a corresponding style guide-line here, in this very place, to help | |
| keeping documentation of data types unified. | |
| Start out the type or function with a new node. Write a comment before | |
| the node, listing all data types (and functions) described in the node, | |
| like this: | |
| @example | |
| @@c | |
| @@c *** struct FILETIME *** | |
| @@c | |
| @@node Type FILETIME, NextNodeName, PreviousNodeName, ParentNodeName | |
| @end example | |
| The node command describes the node name and the names of the next node, | |
| the previous node, and the parent node. The parent node should contain | |
| a menu entry for this node. The previous node is the node that appears | |
| before this node in the parent node menu. The next node is the node | |
| succeeding this one in the parent node menu. If there is no previous or | |
| next node, omit the name (putting just a single space between the two | |
| commata). | |
| The node name must be a unique sequence of words. Case is important, so | |
| @emph{Type} and @emph{type} are distinct. The node name must not contain | |
| special characters like @samp{@@, @{, @}} or the comma. If you need to | |
| give a node the same name as a function, data type, etc., use the words | |
| @samp{Type}, @samp{Function}, etc. before the identifier. | |
| Always put the names of the node and its links on the same line, even if | |
| it gets rather long. | |
| If there are two or more data types or functions described in the node, | |
| adapt the comment like this: | |
| @example | |
| @@c | |
| @@c *** int X *** | |
| @@c *** long Y() *** | |
| @@c | |
| @@node Ints and Longs, NextNodeName, PreviousNodeName, ParentNodeName | |
| @end example | |
| After the node name, put a sectioning command, such as @samp{@@chapter}, | |
| @samp{@@section}, @samp{@@subsection}, or @samp{@@subsubsection}. | |
| Without that command, cross references to the node will fail. | |
| @example | |
| @@subsubsection Type FILETIME | |
| @end example | |
| Start the description of the type(s) or function(s) with a single | |
| non-indented paragraph that gives a one-line description of the type(s) | |
| or function(s) and states the include files that are required. | |
| @example | |
| @@noindent | |
| File times in Wine are specified by the data type @@code@{FILETIME@}, | |
| defined in @@file@{windows.h@}. | |
| @end example | |
| If several types or functions are closely connected, use one paragraph | |
| as a common description. If more paragraphs are required for a proper | |
| description, indent all but the first of them. | |
| Then start the definition of the data type or function. Use the proper | |
| macro, which you will find defined in the beginning of the texinfo file. | |
| If appropriate, add your own macros. | |
| Again, put everything that belongs to the header into a single line. | |
| Use continuation lines for additional headers. | |
| @example | |
| @@deftp_w32 FILETIME | |
| @@deftpx_w32 LPFILETIME | |
| @end example | |
| In the definition, give a verbal explanation of the data type or | |
| function. The explanation should be rather complete, exact, and | |
| comprehensible, than well-structured. This is the point where you can | |
| tell everything you want. Do not be afraid of wasting space. | |
| Do not describe the @mswindows{} situation but only say what Wine | |
| does. That is important. (Sometimes they might even do the same.) | |
| @example | |
| This is the data type for specifying file times. The file times are | |
| stored with 64 bit precision. The actual data type is a structure with | |
| two 32 bit values which are interpreted as the low and high parts of a | |
| 64-bit value. This value gives a time measured in a granularity of 100 | |
| nanoseconds, so 1.5 seconds are specified by a value of 15,000,000. In | |
| Wine, this 64-bit value is signed, with the sign taken from the high | |
| part. The lower part is used as unsigned. | |
| @end example | |
| For data types, it is recommended to quote the definition from the | |
| header file. For a function, you might give a short example of its | |
| usage. You may also put one example in the end of a node that explains | |
| several of the functions in the node. Remember that cut-and-paste from a | |
| well prepared example will help the readers write their code. | |
| @example | |
| The definition of @@code@{FILETIME@} reads: | |
| @@example | |
| typedef struct | |
| @@@{ | |
| INT32 dwLowDateTime; | |
| INT32 dwHighDateTime; | |
| @@@} FILETIME, *LPFILETIME; | |
| @@end example | |
| @end example | |
| You could also use the @code{cindex} command which creates an entry in | |
| the concept index. The @code{texinfo} manual recommends to keep concept | |
| entries distinct, so that a single concept index entry puts to one | |
| well-defined place in the document. Use lower case letters for index | |
| entries, unless they are proper names or quotes from actual code. | |
| @example | |
| @@cindex epoch in file time | |
| The @@code@{FILETIME@} structure may be used to hold absolute or relative | |
| times. Absolute times are given as the number of 100 nanoseconds | |
| intervals elapsed since 1 January 1601, 00:00:00 UTC (Coordinated | |
| Universal Time, which is GMT, Greenwich Mean Time). This might be | |
| called the @@dfn@{epoch@} for file times. With a signed 64-bit value, this | |
| representation covers absolute times of 29247 years around the epoch. | |
| @end example | |
| After the verbal documentation, you can add some special fields | |
| describing bugs, implementation dependencies etc. Two of these are | |
| recommended to attach to all descriptions. One describes the | |
| conformance of the data type or function to @mswindows{} products, | |
| i.e. whether the item is also present in @WINNT{} and @WIN95{}. The | |
| other one describes known differences of the Wine item to its | |
| @mswindows{} counterpart. Both will greatly help in porting software | |
| from @mswindows{} to Wine and vice versa. | |
| @example | |
| @@winconfall@{@} | |
| @@windiff@{@} | |
| In @@mswindows@{@}, the elements of the structure are apparently of type | |
| @@code@{DWORD@}. Whether the full 64 bit value is interpreted as signed or | |
| unsigned I do not know. | |
| @end example | |
| If you find that more of these property attributes are necessary, feel | |
| free to create your own ones. But keep in mind that they should be | |
| applicable more or less to all described items. Very special properties | |
| will better be put into the verbal text. | |
| Finally end the definition of the data type or function: | |
| @example | |
| @@end deftp | |
| @end example | |
| Do not forget to enter the node in the menu of its top node, and do | |
| properly link the node to its successor and predecessor. | |
| @node Type Template, Function Template, , Adding Documentation | |
| @subsection Data type template | |
| Category: Data type | |
| @node Function Template, , Type Template, Adding Documentation | |
| @subsection API function template | |
| Functions should be given category names, to indicate which API they | |
| belong to. Please add items to the list of categories possible. | |
| Category: WIN32 function | |
| @example | |
| @@c | |
| @@c ***GetFileTime() *** | |
| @@c | |
| @@node Get File Times, , Compare File Times, File Times | |
| @@noindent | |
| The Wine function @@code@{GetFileTime@} returns the creation time and | |
| the times of last the read and modification access to a file. It is | |
| defined in @@file@{windows.h@}. | |
| @@deftypefn_w32 BOOL GetFileTime (@@w@{HANDLE @@var@{file@},@} @@w@{LPFILETIME @@var@{ctime@},@} @@w@{LPFILETIME @@var@{atime@},@} @@w@{LPFILETIME @@var@{mtime@})@} | |
| This function obtains for the specified @@var@{file@} the creation time | |
| @@var@{ctime@}, the time of the last access to the file @@var@{atime@}, and | |
| the time of the last modification (write) to the file, @@var@{mtime@}. | |
| The @@var@{file@} handle must have been obtained by opening the file with | |
| @@code@{GENERIC_READ@} access. The file time arguments of this function are | |
| pointers to @@code@{FILETIME@} variables, which are filled with a value that | |
| indicates an absolute time in UTC. To convert these values to local | |
| times, use the function @@code@{FileTimeToLocalFileTime@}. If you do not | |
| need some of the times, you can pass a @@code@{NULL@} pointer. | |
| The function returns @@code@{TRUE@} on success, @@code@{FALSE@} on failure. | |
| @@winconfall@{@} | |
| @@windiffnone@{@} | |
| @@end deftypefn | |
| @end example | |
| @node File names, Wide character strings, Adding Documentation, The Wine Project | |
| @section @mswindows{} and @unix{} file names in Wine | |
| @cindex file names in Wine | |
| @cindex Windows file names | |
| @cindex DOS file names in Wine | |
| @cindex UNIX file names in Wine | |
| @cindex POSIX file names in Wine | |
| FIXME: | |
| @node Wide character strings, , File names, The Wine Project | |
| @section Wide character strings in API functions | |
| @cindex unicode strings in API functions | |
| @cindex wide character strings in API functions | |
| @cindex strings in API functions | |
| @cindex ascii strings in API functions | |
| @cindex 16 bit characters in API functions | |
| @cindex wchar_t in API functions | |
| Presently, all wide character strings in API functions of Wine are | |
| internally converted to 8 bit representation. Thus, the @WIN32{} API | |
| with @unicode{} strings is not fully functional for the application | |
| programmer at present. | |
| Even so, application programmers might consider developing their | |
| applications in wide character format with Wine, as future versions | |
| might bring a change. This might come when a @unix{} filesystem can | |
| handle @unicode{} file names. | |
| Furthermore, the @unicode{} API is required to let Wine run @mswindows{} | |
| applications which have been compiled for wide character strings. | |
| In Wine, wide characters are strictly 16 bit; the @code{wchar_t} type of | |
| standard C can therefore not be used. | |
| @node Concept Index, , , Top | |
| @comment node-name, next, previous, up | |
| @unnumbered Concept Index | |
| @printindex cp | |
| @node Type Index, , , Top | |
| @comment node-name, next, previous, up | |
| @unnumbered Type Index | |
| @printindex tp | |
| @node Function Index, , , Top | |
| @comment node-name, next, previous, up | |
| @unnumbered Function Index | |
| @printindex fn | |
| @node Variable Index, , , Top | |
| @comment node-name, next, previous, up | |
| @unnumbered Variable, Constants, and Variable-like Macros Index | |
| @printindex vr | |
| @node File Index, , , Top | |
| @comment node-name, next, previous, up | |
| @unnumbered File and Program Index | |
| @printindex pg | |
| @contents | |
| @bye |