Updated.
[wine] / DEVELOPERS-HINTS
1 This document should help new developers get started. Like all of Wine, it
2 is a work in progress.
3
4
5 SOURCE TREE STRUCTURE
6 =====================
7
8 The Wine source tree is loosely based on the original Windows modules. 
9 Most of the source is concerned with implementing the Wine API, although
10 there are also various tools, documentation, sample Winelib code, and
11 code specific to the binary loader.  Note that several of the libraries
12 listed here are "stubbed out", meaning they still need to be implemented.
13
14 DLLs:
15 -----
16         dlls/                   - All the DLLs implemented by Wine
17
18                 advapi32/       - Crypto, systeminfo, security, eventlogging
19                 avicap32/       - AVI capture window class
20                 avifil32/       - COM object to play AVI files
21                 cabinet/        - Cabinet file interface
22                 capi2032/       - Wrapper library for CAPI4Linux access
23                 cfgmgr32/       - Config manager
24                 comcat/         - Component category manager
25                 comctl32/       - Common controls
26                 commdlg/        - Common dialog boxes (both 16 & 32 bit)
27                 crtdll/         - Old C runtime library
28                 crypt32/        - Cryptography
29                 ctl3d/          - 3D Effects for Common GUI Components
30                 d3d8/           - Direct3D (3D graphics)
31                 d3d9/           - Direct3D (3D graphics)
32                 d3dim/          - Direct3D Immediate Mode
33                 d3dx8/          - Direct3D (3D graphics)
34                 dciman32/       - DCI Manager (graphics)
35                 ddraw/          - DirectDraw (graphics)
36                 devenum/        - Device enumeration (part of DirectShow)
37                 dinput/         - DirectInput (device input)
38                 dinput8/        - DirectInput (device input)
39                 dmband/         - DirectMusic
40                 dmcompos/       - DirectMusic
41                 dmime/          - DirectMusic
42                 dmloader/       - DirectMusic
43                 dmscript/       - DirectMusic
44                 dmstyle/        - DirectMusic
45                 dmsynth/        - DirectMusic
46                 dmusic/         - DirectMusic
47                 dmusic32/       - DirectMusic
48                 dplay/          - DirectPlay (networking)
49                 dplayx/         - DirectPlay (networking)
50                 dpnhpast/       - DirectPlay NAT Helper
51                 dsound/         - DirectSound (audio)
52                 gdi/            - GDI (graphics)
53                 gdi/enhmfdrv/   - Enhanced metafile driver
54                 gdi/mfdrv/      - Metafile driver
55                 glu32/          - OpenGL Utility library (graphics)
56                 icmp/           - ICMP protocol (networking)
57                 imagehlp/       - PE (Portable Executable) Image Helper lib
58                 imm32/          - Input Method Manager
59                 iphlpapi/       - IP Helper API
60                 kernel/         - The Windows kernel
61                 lzexpand/       - Lempel-Ziv compression/decompression
62                 mapi32/         - Mail interface
63                 mpr/            - Multi-Protocol Router (networking)
64                 msacm/          - Audio Compression Manager (multimedia)
65                 msdmo/          - DirectX Media Objects
66                 msimg32/        - Gradient and transparency (graphics)
67                 msisys/         - System information
68                 msi/            - Microsoft Installer
69                 msnet32/        - Network interface
70                 msvcrt/         - C runtime library 
71                 msvcrt20/       - C runtime library version 2.0
72                 msvcrtd/        - C runtime library debugging
73                 msvideo/        - 16 bit video manager
74                 msvideo/msrle32/- Video codecs
75                 mswsock/        - Misc networking
76                 netapi32/       - Network interface
77                 ntdll/          - NT implementation of kernel calls
78                 odbc32/         - Open DataBase Connectivity driver manager
79                 ole32/          - 32 bit OLE 2.0 libraries
80                 oleaut32/       - 32 bit OLE 2.0 automation
81                 olecli/         - 16 bit OLE client
82                 oledlg/         - OLE 2.0 user interface support
83                 olepro32/       - 32 bit OLE 2.0 automation
84                 olesvr/         - 16 bit OLE server
85                 opengl32/       - OpenGL implementation (graphics)
86                 psapi/          - Process Status interface
87                 qcap/           - DirectShow runtime
88                 quartz/         - DirectShow runtime
89                 rasapi32/       - Remote Access Server interface
90                 richedit/       - Rich text editing control
91                 rpcrt4/         - Remote Procedure Call runtime
92                 serialui/       - Serial port property pages
93                 setupapi/       - Setup interface
94                 shdocvw/        - Shell document object and control
95                 shfolder/       - Shell folder service
96                 shell32/        - COM object implementing shell views
97                 shlwapi/        - Shell Light-Weight interface
98                 snmpapi/        - SNMP protocol interface (networking)
99                 sti/            - Still Image service
100                 tapi32/         - Telephone interface
101                 ttydrv/         - TTY display driver (Wine specific)
102                 twain/          - TWAIN Imaging device communications
103                 url/            - Internet shortcut shell extension
104                 urlmon/         - URL Moniker allows binding to a URL (like KIO/gnome-vfs)
105                 user/           - Window management, standard controls, etc.
106                 uxtheme/        - Theme library
107                 version/        - File installation library
108                 win32s/         - 32-bit function access for 16-bit systems
109                 winaspi/        - 16 bit Advanced SCSI Peripheral Interface
110                 winedos/        - DOS features and BIOS calls (interrupts) (wine specific)
111                 wineps/         - Postscript driver (Wine specific)
112                 wininet/        - Internet extensions
113                 winmm/          - Multimedia (16 & 32 bit)
114                 winmm/joystick/ - Joystick driver
115                 winmm/mcianim/  - MCI animation driver
116                 winmm/mciavi/   - MCI video driver
117                 winmm/mcicda/   - MCI audio CD driver
118                 winmm/mciseq/   - MCI MIDI driver
119                 winmm/mciwave/  - MCI wave driver
120                 winmm/midimap/  - MIDI mapper
121                 winmm/wavemap/  - Audio mapper
122                 winmm/winealsa/ - ALSA audio driver
123                 winmm/winearts/ - aRts audio driver
124                 winmm/wineaudioio/ - audioio audio driver
125                 winmm/winejack/ - JACK audio server driver
126                 winmm/winenas/  - NAS audio driver
127                 winmm/wineoss/  - OSS audio driver
128                 winnls/         - National Language Support
129                 winsock/        - Sockets 2.0 (networking)
130                 wsock32/        - Sockets 1.1 (networking)
131                 wintab32/       - Tablet device interface
132                 winspool/       - Printing & Print Spooler
133                 wintrust/       - Trust verification interface
134                 wow32/          - WOW subsystem
135                 x11drv/         - X11 display driver (Wine specific)
136
137 Winelib programs:
138 -----------------
139
140         programs/               - All the Winelib programs
141
142                 avitools/       - AVI information viewer and player
143                 clock/          - Graphical clock
144                 cmdlgtst/       - Common dialog tests
145                 control/        - Control panel
146                 expand/         - Decompress Lempel-Ziv compressed archive
147                 notepad/        - Notepad with RichEdit functionality
148                 osversioncheck/ - Check version of Windows being indicated
149                 progman/        - Program manager
150                 regapi/         - Command line Registry implementation
151                 regedit/        - Registry editor
152                 regsvr32/       - Register COM server
153                 regtest/        - Registry testing program
154                 rpcss/          - RPC services
155                 rundll32/       - Execute DLL functions directly
156                 uninstaller/    - Remove installed programs
157                 view/           - Metafile viewer
158                 wcmd/           - Command line interface
159                 wineconsole/    - Console
160                 winedbg/        - Debugger
161                 winefile/       - File manager
162                 winemine/       - Mine game
163                 winepath/       - Translate between Wine and Unix paths
164                 winhelp/        - Help viewer
165                 winver/         - Windows Version Program
166
167
168 Support programs, libraries, etc:
169 ---------------------------------
170
171         documentation/          - some documentation
172         include/                - Windows standard includes
173         libs/                   - the Wine libraries
174         libs/port/              - portability library
175         libs/unicode/           - Unicode support shared
176         libs/uuid/              - Windows-compatible UUID numbers
177         libs/wine/              - Wine bootstrap library
178         libs/wpp/               - C preprocessor
179         loader/                 - the main Wine loader
180         server/                 - the Wine server
181         tools/                  - relay code builder, resource compiler, etc.
182
183
184 Miscellaneous:
185 --------------
186
187 Note: these directories will ultimately get moved into their
188 respective dlls.
189
190         files/                  - KERNEL file I/O
191         misc/                   - KERNEL shell, registry, winsock, etc.
192
193         graphics/               - GDI graphics drivers
194         objects/                - GDI logical objects
195
196         controls/               - USER built-in widgets
197         windows/                - USER window management
198
199
200
201 IMPLEMENTING NEW API CALLS
202 ==========================
203
204 This is the simple version, and covers only Win32. Win16 is slightly
205 uglier, because of the Pascal heritage and the segmented memory model.
206
207 All of the Win32 APIs known to Wine are listed in the .spec file of
208 their corresponding dll. An unimplemented call will look like (from
209 gdi32.spec)
210   269 stub PolyBezierTo
211 To implement this call, you need to do the following four things.
212
213 1. Find the appropriate parameters for the call, and add a prototype to
214 the correct header file. In this case, that means [include/wingdi.h],
215 and it might look like
216   BOOL WINAPI PolyBezierTo(HDC, LPCVOID, DWORD);
217 If the function has both an ASCII and a Unicode version, you need to
218 define both and add a #define WINELIB_NAME_AW declaration. See below
219 for discussion of function naming conventions.
220   
221 2. Modify the .spec file to tell Wine that the function has an
222 implementation, what the parameters look like and what Wine function
223 to use for the implementation. In Win32, things are simple--everything
224 is 32-bits. However, the relay code handles pointers and pointers to
225 strings slightly differently, so you should use 'str' and 'wstr' for
226 strings, 'ptr' for other pointer types, and 'long' for everything else.
227   269 stdcall PolyBezierTo(long ptr long) PolyBezierTo
228 The 'PolyBezierTo' at the end of the line is which Wine function to use
229 for the implementation.
230
231 3. Implement the function as a stub. Once you add the function to the .spec
232 file, you must add the function to the Wine source before it will link.
233 Add a function called 'PolyBezierTo' somewhere. Good things to put
234 into a stub:
235   o a correct prototype, including the WINAPI
236   o header comments, including full documentation for the function and
237     arguments (see documentation/README.documentation)
238   o A FIXME message and an appropriate return value are good things to
239     put in a stub.
240
241   /************************************************************
242    *                    PolyBezierTo   (GDI32.269)  
243    *  
244    * Draw many Bezier curves.
245    *
246    * RETURNS
247    *   Success: Non-zero.
248    *   Failure: FALSE. Use GetLastError() to find the error cause.
249    *
250    * BUGS
251    *   Unimplemented
252    */
253    BOOL WINAPI PolyBezierTo(HDC hdc,     /* [In] Device context to draw to */
254                             LPCVOID p,   /* [In] Array of POINT structs */
255                             DWORD count  /* [In] Number of points in p */
256    ) 
257    {
258       /* tell the user they've got a substandard implementation */
259       FIXME(gdi, ":(%x,%p,%d): stub\n", hdc, p, count);
260
261       /* some programs may be able to compensate, 
262        * if they know what happened 
263        */
264       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);  
265       return FALSE;    /* error value */
266    }
267
268 4. Implement and test the rest of the function.
269
270
271 IMPLEMENTING A NEW DLL
272 ======================
273
274 Generic directions
275 ------------------
276
277 Apart from writing the set of needed .c files, you also need to do the 
278 following:
279
280 1.  Create a directory <MyDll> where to store the implementation of
281     the DLL. This directory has to be put under the dlls/ directory.
282     If the DLL exists under Windows as both 16 and 32 bit DLL, you
283     should have a single directory with both implementations.
284
285 2.  Create the Makefile.in in the ./dlls/<MyDll>/ directory. You can
286     copy an existing Makefile.in from another ./dlls/ subdirectory.
287     You need at least to change the MODULE and C_SRCS macros. 
288
289 3.  Add the directory in ./configure.ac (in AC_OUTPUT macro at the end
290     of the file to trigger the Makefile generation)
291
292 4.  Run ./make_dlls in the dlls directory to update Makefile.in in
293     that directory.
294
295 5.  You can now regenerate ./configure file (with 'make configure')
296     and the various Makefiles (with 'configure; make depend') (run
297     from the top of Wine's tree).
298     You should now have a Makefile file in ./dlls/<MyDll>/
299
300 6.  Create the .spec file for the DLL exported functions in your
301     directory. Refer to 'Implementation of new API calls' earlier in
302     this document for more information on this part.
303
304 7.  You can now start adding .c files. For the .h files, if they are
305     standard Windows one, put them in include/. If they are linked to
306     *your* implementation of the dll, put them in your newly created
307     directory.
308
309 Debug channels
310 --------------
311
312 If you need to create a new debug channel, just add the
313 WINE_DEFAULT_DEBUG_CHANNEL to your .c file(s), and use them. 
314 All the housekeeping will happen automatically.
315
316 Resources
317 ---------
318
319 If you also need to add resources to your DLL, then create the .rc
320 file. Add to your ./dlls/<MyDll>/Makefile.in, in the RC_SRCS macro,
321 the list of .rc files to add to the DLL. See dlls/comctl32/ for an
322 example of this.
323
324 Thunking
325 --------
326
327 If you're building a 16 & 32 bit DLLs pair, then from the 32 bit code
328 you might need to call 16 bit routine. The way to do it to add in the
329 code, fragments like:
330 /* ### Start build ### */
331 extern WORD CALLBACK <PREFIX>_CallTo16_word_wwlll(FARPROC16,WORD,WORD,LONG,LONG,LONG);
332 /* ### stop build ### */
333 Where <PREFIX>_ is an internal prefix for your module. The first
334 parameter is always of type FARPROC16. Then, you can get the regular
335 list of parameters. The _word_wwlll indicates the type of return (long
336 or word) and the size of the parameters (here l=>long, w=>word; which
337 maps to WORD,WORD,LONG,LONG,LONG.
338 You can put several functions between the Start/Stop build pair.
339
340 You can also read the winebuild manpage for more details on this.
341
342 Then, add to ./dlls/<MyDll>/Makefile.in a line like:
343
344 EXTRA_OBJS = $(MODULE).glue.o
345
346 See dlls/winmm/ for an example of this.
347
348 MEMORY AND SEGMENTS
349 ===================
350
351 NE (Win16) executables consist of multiple segments.  The Wine loader
352 loads each segment into a unique location in the Wine processes memory
353 and assigns a selector to that segment.  Because of this, it's not
354 possible to exchange addresses freely between 16-bit and 32-bit code.
355 Addresses used by 16-bit code are segmented addresses (16:16), formed
356 by a 16-bit selector and a 16-bit offset.  Those used by the Wine code
357 are regular 32-bit linear addresses.
358
359 There are four ways to obtain a segmented pointer:
360   - Using the MapLS function (recommended).
361   - Allocate a block of memory from the global heap and use
362     WIN16_GlobalLock to get its segmented address.
363   - Declare the argument as 'segptr' instead of 'ptr' in the spec file
364     for a given API function.
365
366 Once you have a segmented pointer, it must be converted to a linear
367 pointer before you can use it from 32-bit code.  This can be done with
368 the MapSL function.  The linear pointer can then be used freely with
369 standard Unix functions like memcpy() etc. without worrying about 64k
370 boundaries.  Note: there's no easy way to convert back from a linear
371 to a segmented address.
372
373 In most cases, you don't need to worry about segmented address, as the
374 conversion is made automatically by the callback code and the API
375 functions only see linear addresses. However, in some cases it is
376 necessary to manipulate segmented addresses; the most frequent cases
377 are:
378   - API functions that return a pointer
379   - lParam of Windows messages that point to a structure
380   - Pointers contained inside structures accessed by 16-bit code.
381
382 It is usually a good practice to used the type 'SEGPTR' for segmented
383 pointers, instead of something like 'LPSTR' or 'char *'.  As SEGPTR is
384 defined as a DWORD, you'll get a compilation warning if you mistakenly
385 use it as a regular 32-bit pointer.
386
387
388 STRUCTURE PACKING
389 =================
390
391 Under Windows, data structures are tightly packed, i.e. there is no
392 padding between structure members. On the other hand, by default gcc
393 aligns structure members (e.g. WORDs are on a WORD boundary, etc.).
394 This means that a structure like
395
396 struct { BYTE x; WORD y; };
397
398 will take 3 bytes under Windows, but 4 with gcc, because gcc will add a
399 dummy byte between x and y. To have the correct layout for structures
400 used by Windows code, you need to embed the struct within two special
401 #include's which will take care of the packing for you:
402
403 #include "pshpack1.h"
404 struct { BYTE x; WORD y; };
405 #include "poppack1.h"
406
407 For alignment on a 2-byte boundary, there is a "pshpack2.h", etc.
408
409 The use of the WINE_PACKED attribute is obsolete. Please remove these 
410 in favour of the above solution. 
411 Using WINE_PACKED, you would declare the above structure like this:
412
413 struct { BYTE x; WORD y WINE_PACKED; };
414
415 You had to do this every time a structure member is not aligned
416 correctly under Windows (i.e. a WORD not on an even address, or a
417 DWORD on a address that was not a multiple of 4).
418
419
420 NAMING CONVENTIONS FOR API FUNCTIONS AND TYPES
421 ==============================================
422
423 In order to support both Win16 and Win32 APIs within the same source
424 code, the following convention must be used in naming all API
425 functions and types. If the Windows API uses the name 'xxx', the Wine
426 code must use:
427
428  - 'xxx16' for the Win16 version,
429  - 'xxx'   for the Win32 version when no ASCII/Unicode strings are
430    involved,
431  - 'xxxA'  for the Win32 version with ASCII strings,
432  - 'xxxW'  for the Win32 version with Unicode strings.
433
434 If the function has both ASCII and Unicode version, you should then
435 use the macros WINELIB_NAME_AW(xxx) or DECL_WINELIB_TYPE_AW(xxx)
436 (defined in include/windef.h) to define the correct 'xxx' function
437 or type for Winelib. When compiling Wine itself, 'xxx' is _not_
438 defined, meaning that code inside of Wine must always specify
439 explicitly the ASCII or Unicode version.
440
441 If 'xxx' is the same in Win16 and Win32, you can simply use the same
442 name as Windows, i.e. just 'xxx'.  If 'xxx' is Win16 only, you could
443 use the name as is, but it's preferable to use 'xxx16' to make it
444 clear it is a Win16 function.
445
446 Examples:
447
448 typedef struct { /* Win32 ASCII data structure */ } WNDCLASSA;
449 typedef struct { /* Win32 Unicode data structure */ } WNDCLASSW;
450 typedef struct { /* Win16 data structure */ } WNDCLASS16;
451 DECL_WINELIB_TYPE_AW(WNDCLASS);
452
453 ATOM RegisterClass16( WNDCLASS16 * );
454 ATOM RegisterClassA( WNDCLASSA * );
455 ATOM RegisterClassW( WNDCLASSW * );
456 #define RegisterClass WINELIB_NAME_AW(RegisterClass)
457
458 The Winelib user can then say:
459
460     WNDCLASS wc = { ... };
461     RegisterClass( &wc );
462
463 and this will use the correct declaration depending on the definition
464 of the UNICODE symbol.
465
466
467 NAMING CONVENTIONS FOR NON-API FUNCTIONS AND TYPES
468 ==================================================
469
470 Functions and data which are internal to your code (or at least shouldn't be
471 visible to any Winelib or Windows program) should be preceded by
472 an identifier to the module:
473
474 Examples:
475
476 ENUMPRINTERS_GetDWORDFromRegistryA()    (in dlls/winspool/info.c)
477 IAVIFile_fnRelease()                    (in dlls/avifil32/avifile.c)
478 X11DRV_CreateDC()                       (in graphics/x11drv/init.c)
479
480 if you need prototypes for these, there are a few possibilities:
481 - within same source file only:
482   put the prototypes at the top of your file and mark them as prototypes.
483 - within the same module:
484   create a header file within the subdirectory where that module resides,
485   e.g.  graphics/ddraw_private.h
486 - from a totally different module, or for use in winelib:
487   you should never do that. Only exported APIs can be called across
488   module boundaries.
489
490
491 DEBUG MESSAGES
492 ==============
493
494 To display a message only during debugging, you normally write something
495 like this:
496
497         TRACE("abc...");  or
498         FIXME("abc...");  or
499         WARN("abc...");   or
500         ERR("abc...");
501
502 depending on the seriousness of the problem. (documentation/debugging.sgml
503 explains when it is appropriate to use each of them). You need to declare
504 the debug channel name at the top of the file (after the includes) using
505 the WINE_DEFAULT_DEBUG_CHANNEL macro, like so:
506
507         WINE_DEFAULT_DEBUG_CHANNEL(win);
508
509 If your debugging code is more complex than just printf, you can use 
510 the macros:
511
512         TRACE_ON(xxx), WARN_ON(xxx), ERR_ON(xxx) and FIXME_ON(xxx) 
513
514 to test if the given channel is enabled. Thus, you can write:
515
516         if (TRACE_ON(win)) DumpSomeStructure(&str);
517
518 Don't worry about the inefficiency of the test. If it is permanently 
519 disabled (that is TRACE_ON(win) is 0 at compile time), the compiler will 
520 eliminate the dead code.
521
522 For more info about debugging messages, read:
523
524 http://www.winehq.org/site/docs/wine-devel/debugging
525
526
527 MORE INFO
528 =========
529
530 1. There is a FREE online version of the MSDN library (including
531    documentation for the Win32 API) on http://msdn.microsoft.com/
532    or http://www.msdn.com/
533
534 2. Windows apilist:  http://www.mentalis.org/apilist/apilist.php
535
536 3. http://www.sonic.net/~undoc/bookstore.html
537
538 4. In 1993 Dr. Dobbs Journal published a column called "Undocumented Corner".
539
540 5. www.geocities.com/SiliconValley/4942/