blob: be0fc3c531c138c0c7787ddb11bf50abe9564922 [file] [log] [blame]
Douglas Ridgway692389d1998-11-22 16:56:44 +00001This document should help new developers get started. Like all of Wine, it
2is a work in progress.
Alexandre Julliarddba420a1994-02-02 06:48:31 +00003
Klaas van Gend0a7aa161999-06-05 11:52:46 +00004
Alexandre Julliard889f7421997-04-15 17:19:52 +00005SOURCE TREE STRUCTURE
6=====================
7
Douglas Ridgway692389d1998-11-22 16:56:44 +00008The Wine source tree is loosely based on the original Windows modules.
9Most of the source is concerned with implementing the Wine API, although
10there are also various tools, documentation, sample Winelib code, and
11code specific to the binary loader.
Alexandre Julliard889f7421997-04-15 17:19:52 +000012
Douglas Ridgway692389d1998-11-22 16:56:44 +000013Wine API directories:
14---------------------
Alexandre Julliard889f7421997-04-15 17:19:52 +000015
16KERNEL:
17
18 files/ - file I/O
Alexandre Julliard889f7421997-04-15 17:19:52 +000019 memory/ - memory management
Alexandre Julliard889f7421997-04-15 17:19:52 +000020 scheduler/ - process and thread management
Sylvain Petreolle20281102002-05-06 20:08:43 +000021 winnls/ - National Language Support configuration files
Alexandre Julliard889f7421997-04-15 17:19:52 +000022
23GDI:
24
25 graphics/ - graphics drivers
Klaas van Gend0a7aa161999-06-05 11:52:46 +000026 x11drv/ - X11 display driver
27 win16drv/ -> see below
28 ttydrv/ - tty display driver
29 psdrv/ - PostScript graphics driver
Eric Pouech19dc2081999-10-31 22:15:58 +000030 metafiledrv/ - metafile driver
Klaas van Gend0a7aa161999-06-05 11:52:46 +000031 enhmetafiledrv/ - enhanced metafile driver
Sylvain Petreolle20281102002-05-06 20:08:43 +000032 wing/ - WinG (for games) internface
Alexandre Julliard889f7421997-04-15 17:19:52 +000033 objects/ - logical objects
34
35USER:
36
37 controls/ - built-in widgets
Klaas van Gend0a7aa161999-06-05 11:52:46 +000038 resources/ - built-in menu and message box resources
Alexandre Julliard889f7421997-04-15 17:19:52 +000039 windows/ - window management
40
Douglas Ridgway692389d1998-11-22 16:56:44 +000041Other DLLs:
42
Klaas van Gend0a7aa161999-06-05 11:52:46 +000043 dlls/ - Other system DLLs implemented by Wine
44 advapi32/ - crypto, systeminfo, security, eventlogging
Sylvain Petreolle20281102002-05-06 20:08:43 +000045 avicap32/
Klaas van Gend0a7aa161999-06-05 11:52:46 +000046 avifil32/ - COM object to play AVI files
47 comctl32/ - common controls
48 commdlg/ - common dialog boxes (both 16 & 32 bit)
Jon Griffiths1db20bf2001-01-10 23:59:25 +000049 crtdll/ - Old C runtime library
Sylvain Petreolle20281102002-05-06 20:08:43 +000050 crypt32/
51 dciman32/
52 ddraw/ - DirectX ddraw
53 dinput/ - DirectX dinput
54 dplay/ - DirectX dplay
Eric Pouech19dc2081999-10-31 22:15:58 +000055 dplayx/ - DirectX dplayx
56 dsound/ - DirectX dsound
Sylvain Petreolle20281102002-05-06 20:08:43 +000057 glu32/
58 icmp/
Klaas van Gend0a7aa161999-06-05 11:52:46 +000059 imagehlp/ - PE (Portable Executable) Image Helper lib
Eric Pouech19dc2081999-10-31 22:15:58 +000060 imm32/
61 lzexpand/ - Liv-Zempel compression/decompression
62 mpr/ - Multi-Protocol Router (interface to various
63 network transport protocols)
64 msacm/ - audio compression manager (multimedia) (16 bit)
65 msacm32/ - audio compression manager (multimedia) (32 bit)
Sylvain Petreolle20281102002-05-06 20:08:43 +000066 msdmo/
67 msimg32/
68 msisys/
Eric Pouech19dc2081999-10-31 22:15:58 +000069 msnet/
Sylvain Petreolle20281102002-05-06 20:08:43 +000070 msrle32
71 msvcrt/ - 16 bit C runtime library
72 msvcrt20/ - 32 bit C runtime library
Eric Pouech19dc2081999-10-31 22:15:58 +000073 msvideo/ - 16 bit video manager
Sylvain Petreolle20281102002-05-06 20:08:43 +000074 netapi32/
75 ntdll/ - NT implementation of kernel calls
76 odbc32/
Andreas Mohr7bed6962001-09-19 22:34:38 +000077 ole32/ - 32 bit OLE 2.0 libraries
Eric Pouech19dc2081999-10-31 22:15:58 +000078 oleaut32/ - 32 bit OLE 2.0 automation
79 olecli/ - 16 bit OLE client
80 oledlg/ - OLE 2.0 user interface support
Sylvain Petreolle20281102002-05-06 20:08:43 +000081 olepro32/ - 32 bit OLE 2.0 automation
Eric Pouech19dc2081999-10-31 22:15:58 +000082 olesvr/ - 16 bit OLE server
Sylvain Petreolle20281102002-05-06 20:08:43 +000083 opengl32/ - OpenGL implementation
Klaas van Gend0a7aa161999-06-05 11:52:46 +000084 psapi/ - process status API
Sylvain Petreolle20281102002-05-06 20:08:43 +000085 qcap/
86 quartz/
Klaas van Gend0a7aa161999-06-05 11:52:46 +000087 rasapi32/ - remote access server API
Sylvain Petreolle20281102002-05-06 20:08:43 +000088 richedit/
89 rpcrt4/
90 serialui/
91 setupapi/
92 shdocvw/
93 shfolder/
Klaas van Gend0a7aa161999-06-05 11:52:46 +000094 shell32/ - COM object implementing shell views
Sylvain Petreolle20281102002-05-06 20:08:43 +000095 shlwapi/
96 sti/
Klaas van Gend0a7aa161999-06-05 11:52:46 +000097 tapi32/ - telephone API
Sylvain Petreolle20281102002-05-06 20:08:43 +000098 url
99 urlmon
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000100 ver/ - File Installation Library (16 bit)
101 version/ - File Installation Library (32 bit)
Sylvain Petreolle20281102002-05-06 20:08:43 +0000102 win32s/
103 win87em/ - 80387 math-emulation
Eric Pouech19dc2081999-10-31 22:15:58 +0000104 winaspi/ - 16 bit Advanced SCSI Peripheral Interface
Sylvain Petreolle20281102002-05-06 20:08:43 +0000105 winedos/ - DOS features and BIOS calls (interrupts)
Eric Pouech19dc2081999-10-31 22:15:58 +0000106 winmm/ - multimedia (16 & 32 bit)
107 mciXXX/ - various MCI drivers
Sylvain Petreolle20281102002-05-06 20:08:43 +0000108 midimap/- midi mapper
109 wavemap/- audio mapper
Chris Morgan9b0ba7c2002-03-21 01:38:19 +0000110 winearts/ - ARTS audio driver
Eric Pouech19dc2081999-10-31 22:15:58 +0000111 wineoss/- MM driver for OSS systems
Sylvain Petreolle20281102002-05-06 20:08:43 +0000112 winnls/ - National Language Support
113 winsock/
114 wsock32/
115 winspool/ - Printing & Print Spooler
116 wintrust/
Eric Pouech19dc2081999-10-31 22:15:58 +0000117 wnaspi32/ - 32 bit ASPI
Douglas Ridgway692389d1998-11-22 16:56:44 +0000118
Alexandre Julliard889f7421997-04-15 17:19:52 +0000119Miscellaneous:
120
Douglas Ridgway692389d1998-11-22 16:56:44 +0000121 misc/ - shell, registry, winsock, etc.
Douglas Ridgway692389d1998-11-22 16:56:44 +0000122 ipc/ - SysV IPC based interprocess communication
Alexandre Julliard889f7421997-04-15 17:19:52 +0000123 win32/ - misc Win32 functions
124
125Tools:
Douglas Ridgway692389d1998-11-22 16:56:44 +0000126------
Alexandre Julliard889f7421997-04-15 17:19:52 +0000127
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000128 tools/ - relay code builder, new rc, bugreport
129 generator, wineconfigurator, etc.
Alexandre Julliard889f7421997-04-15 17:19:52 +0000130 documentation/ - some documentation
131
132
Douglas Ridgway692389d1998-11-22 16:56:44 +0000133Binary loader specific directories:
134-----------------------------------
Alexandre Julliard889f7421997-04-15 17:19:52 +0000135
136 debugger/ - built-in debugger
137 if1632/ - relay code
138 miscemu/ - hardware instruction emulation
139 graphics/win16drv/ - Win16 printer driver
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000140 server/ - the main, controlling thread of wine
141 tsx11/ - thread-safe X11 wrappers (auto generated)
Alexandre Julliard889f7421997-04-15 17:19:52 +0000142
Douglas Ridgway692389d1998-11-22 16:56:44 +0000143Winelib specific directories:
Alexandre Julliard889f7421997-04-15 17:19:52 +0000144-----------------------------
145
Douglas Ridgway692389d1998-11-22 16:56:44 +0000146 library/ - Required code for programs using Winelib
147 libtest/ - Small samples and tests
148 programs/ - Extended samples / system utilities
Alexandre Julliard889f7421997-04-15 17:19:52 +0000149
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000150
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000151IMPLEMENTING NEW API CALLS
152==========================
153
154This is the simple version, and covers only Win32. Win16 is slightly uglier,
155because of the Pascal heritage and the segmented memory model.
156
157All of the Win32 APIs known to Wine are listed in [relay32/*.spec]. An
158unimplemented call will look like (from gdi32.spec)
159 269 stub PolyBezierTo
160To implement this call, you need to do the following four things.
161
1621. Find the appropriate parameters for the call, and add a prototype to
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000163the correct header file. In this case, that means [include/wingdi.h],
164and it might look like
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000165 BOOL WINAPI PolyBezierTo(HDC, LPCVOID, DWORD);
166If the function has both an ASCII and a Unicode version, you need to
167define both and add a #define WINELIB_NAME_AW declaration. See below
168for discussion of function naming conventions.
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000169
1702. Modify the .spec file to tell Wine that the function has an
171implementation, what the parameters look like and what Wine function
172to use for the implementation. In Win32, things are simple--everything
173is 32-bits. However, the relay code handles pointers and pointers to
174strings slightly differently, so you should use 'str' and 'wstr' for
175strings, 'ptr' for other pointer types, and 'long' for everything else.
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000176 269 stdcall PolyBezierTo(long ptr long) PolyBezierTo
177The 'PolyBezierTo' at the end of the line is which Wine function to use
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000178for the implementation.
179
1803. Implement the function as a stub. Once you add the function to the .spec
181file, you must add the function to the Wine source before it will link.
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000182Add a function called 'PolyBezierTo' somewhere. Good things to put
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000183into a stub:
184 o a correct prototype, including the WINAPI
185 o header comments, including full documentation for the function and
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000186 arguments (see documentation/README.documentation)
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000187 o A FIXME message and an appropriate return value are good things to
188 put in a stub.
189
190 /************************************************************
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000191 * PolyBezierTo (GDI32.269)
192 *
193 * Draw many Bezier curves
194 *
195 * RETURNS
196 * nonzero on success or zero on faillure
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000197 *
198 * BUGS
199 * Unimplemented
200 */
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000201 BOOL WINAPI PolyBezierTo(HDC hdc, /* handle to device context */
202 LPCVOID p, /* ptr to array of Point structs */
203 DWORD count /* nr of points in array */
204 )
205 {
206 /* tell the user they've got a substandard implementation */
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000207 FIXME(gdi, ":(%x,%p,%d): stub\n", hdc, p, count);
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000208
209 /* some programs may be able to compensate,
210 * if they know what happened
211 */
Alexandre Julliardc7c217b1998-04-13 12:21:30 +0000212 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
213 return FALSE; /* error value */
214 }
215
Klaas van Gend0a7aa161999-06-05 11:52:46 +00002164. Implement and test the rest of the function.
217
Alexandre Julliard889f7421997-04-15 17:19:52 +0000218
Eric Pouech19dc2081999-10-31 22:15:58 +0000219IMPLEMENTING A NEW DLL
220======================
221
Eric Pouech31b41cf1999-12-05 02:16:24 +0000222Generic directions
223------------------
224
Eric Pouech19dc2081999-10-31 22:15:58 +0000225Apart from writing the set of needed .c files, you also need to do the
226following:
227
2281. Create a directory <MyDll> where to store the implementation of
229 the DLL.
230
231 If the DLL exists under Windows as both 16 and 32 bit DLL, you can
232 either create one directory for each, or have a single directory
233 with both implementations.
234
235 This (those) directory(ies) have to be put under the dlls/
236 directory in Wine tree structure.
237
2382. Create the Makefile.in in the ./dlls/<MyDll>/ directory. You can
239 copy an existing Makefile.in from another ./dlls/ subdirectory.
240
241 You need at least to change the MODULE, SPEC_SRCS, and C_SRCS
242 macros.
243
2443. Add the directory (and the generated .o file for the module) in:
245 + ./configure.in (in AC_OUTPUT macro at the end of the file to
246 trigger the Makefile generation),
247 + ./Makefile.in (in LIBSUBDIRS and LIBOBJS macros)
Eric Pouech31b41cf1999-12-05 02:16:24 +0000248 + ./dlls/Makefile.in (in SUBDIRS macro)
Eric Pouech19dc2081999-10-31 22:15:58 +0000249
2504. You can now regenerate ./configure file (with 'make configure')
251 and the various Makefiles (with 'configure; make depend') (run
252 from the top of Wine's tree).
253
254 You shall now have a Makefile file in ./dlls/<MyDll>/
255
2565. You now need to declare the DLL in the module lists. This is done
257 by adding the corresponding descriptor in ./if1632/builtin.c if
258 your DLL is 16 bit (resp. ./relay32/builtin.c for a 32 bit DLL)
259 (or both if your directory contains the dual 16/32
260 implementations).
261
262 Note: the name of the descriptor is based on the module name, not
263 on the file name (they are the same in most of the case, but for
264 some DLLs it's not the case).
265
2666. You also need to define the loadorder for the created DLL
Eric Pouech31b41cf1999-12-05 02:16:24 +0000267 (./wine.ini and ./loader/loadorder.c). Usually, "native,builtin"
Eric Pouech19dc2081999-10-31 22:15:58 +0000268 is ok. If you have written a paired 16/32 bit implementation, don't
269 forget to define it also in those files.
270
2717. Create the .spec file for the DLL export points in your
272 directory. Refer to 'Implementation of new API calls' earlier in
273 this document for more information on this part.
274
Eric Pouech31b41cf1999-12-05 02:16:24 +00002758. Don't forget the .cvsignore file. The .cvsignore contain (on a per
276 directory basis) all the files generated by the compilation
277 process, why cvs shall ignore when processing the dir.
278 *.o is in there by default, but in Wine case you will find:
279 - Makefile (generated from Makefile.in)
280 - *.spec.c: those c files are generated by tools/build from the
281 .spec file
282 - when thunking down to 16 bit DLLs, you'll get some others (.glue.c)
283 - result of .y => .c translation (by yacc or bison)
284 - result of .rc compilation
285 - ...
286 For a simple DLL, listing in .cvsignore Makefile and
287 <MyDll>.spec.c will do.
Eric Pouech19dc2081999-10-31 22:15:58 +0000288
2899. You can now start adding .c files.
290
29110. For the .h files, if they are standard Windows one, put them in
292 include/. If they are linked to *your* implementation of the DLL,
293 put them in your newly created directory.
294
Eric Pouech31b41cf1999-12-05 02:16:24 +0000295Debug channels
296--------------
297
Eric Pouech19dc2081999-10-31 22:15:58 +0000298If you need to create a new debug channel, just add the
299DECLARE_DEBUG_CHANNEL to your .c file(s) and rerun
300tools/make_debug. When sending out your patch, you don't need to
Andreas Mohr7bed6962001-09-19 22:34:38 +0000301provide neither ./configure nor the ./include/debugdefs.h diffs. Just
Eric Pouech19dc2081999-10-31 22:15:58 +0000302indicate that those files need to be regenerated.
303
Eric Pouech31b41cf1999-12-05 02:16:24 +0000304Resources
305---------
306
307If you also need to add resources to your DLL, the create the .rc
308file. Since, the .rc file will be translated into a .s file, and then
309compiled as a .o file, its basename must be different from the
310basename of any .c file.
311Add to your ./dlls/<MyDll>/Makefile.in, in the RC_SRCS macro, the list
312of .rc files to add to the DLL. You may also have to add the following
313directives
3141/ to tell gnumake to translate .rc into .s files,
315 $(RC_SRCS:.rc=.s): $(WRC)
3162/ to give some parameters to wrc for helping the translation.
317 WRCEXTRA = -s -p$(MODULE)
318
319See dlls/comctl32/ for an example of this.
320
321Thunking
322--------
323
324If you're building a 16 & 32 bit DLLs pair, then from the 32 bit code
325you might need to call 16 bit routine. The way to do it to add in the
326code, fragments like:
327/* ### Start build ### */
328extern WORD CALLBACK <PREFIX>_CallTo16_word_wwlll(FARPROC16,WORD,WORD,LONG,LONG,LONG);
329/* ### stop build ### */
330Where <PREFIX>_ is an internal prefix for your module. The first
331parameter is always of type FARPROC16. Then, you can get the regular
332list of parameters. The _word_wwlll indicates the type of return (long
333or word) and the size of the parameters (here l=>long, w=>word; which
334maps to WORD,WORD,LONG,LONG,LONG.
335You can put several functions between the Start/Stop build pair.
336
337You can also read tools/build.txt for more details on this.
338
339Then, add to ./dlls/<MyDll>/Makefile.in to the macro GLUE the list of
340.c files containing the /* ### Start build ### */ directives.
341
342See dlls/winmm/ for an example of this.
343
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000344MEMORY AND SEGMENTS
345===================
Alexandre Julliarddba420a1994-02-02 06:48:31 +0000346
347NE (Win16) executables consist of multiple segments. The Wine loader
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000348loads each segment into a unique location in the Wine processes memory
349and assigns a selector to that segment. Because of this, it's not
350possible to exchange addresses freely between 16-bit and 32-bit code.
351Addresses used by 16-bit code are segmented addresses (16:16), formed
352by a 16-bit selector and a 16-bit offset. Those used by the Wine code
353are regular 32-bit linear addresses.
Alexandre Julliarddba420a1994-02-02 06:48:31 +0000354
Alexandre Julliard1e37a181996-08-18 16:21:52 +0000355There are four ways to obtain a segmented pointer:
356 - Use the SEGPTR_* macros in include/heap.h (recommended).
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000357 - Allocate a block of memory from the global heap and use
358 WIN16_GlobalLock to get its segmented address.
359 - Allocate a block of memory from a local heap, and build the
360 segmented address from the local heap selector (see the
361 USER_HEAP_* macros for an example of this).
362 - Declare the argument as 'segptr' instead of 'ptr' in the spec file
363 for a given API function.
Alexandre Julliarddba420a1994-02-02 06:48:31 +0000364
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000365Once you have a segmented pointer, it must be converted to a linear
366pointer before you can use it from 32-bit code. This can be done with
367the PTR_SEG_TO_LIN() and PTR_SEG_OFF_TO_LIN() macros. The linear
368pointer can then be used freely with standard Unix functions like
369memcpy() etc. without worrying about 64k boundaries. Note: there's no
370easy way to convert back from a linear to a segmented address.
Alexandre Julliarddba420a1994-02-02 06:48:31 +0000371
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000372In most cases, you don't need to worry about segmented address, as the
373conversion is made automatically by the callback code and the API
374functions only see linear addresses. However, in some cases it is
375necessary to manipulate segmented addresses; the most frequent cases
376are:
377 - API functions that return a pointer
378 - lParam of Windows messages that point to a structure
379 - Pointers contained inside structures accessed by 16-bit code.
Alexandre Julliarddba420a1994-02-02 06:48:31 +0000380
Alexandre Julliarde2abbb11995-03-19 17:39:39 +0000381It is usually a good practice to used the type 'SEGPTR' for segmented
382pointers, instead of something like 'LPSTR' or 'char *'. As SEGPTR is
383defined as a DWORD, you'll get a compilation warning if you mistakenly
384use it as a regular 32-bit pointer.
Alexandre Julliarddba420a1994-02-02 06:48:31 +0000385
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000386
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000387STRUCTURE PACKING
388=================
389
390Under Windows, data structures are tightly packed, i.e. there is no
391padding between structure members. On the other hand, by default gcc
392aligns structure members (e.g. WORDs are on a WORD boundary, etc.).
393This means that a structure like
394
395struct { BYTE x; WORD y; };
396
397will take 3 bytes under Windows, but 4 with gcc, because gcc will add a
398dummy byte between x and y. To have the correct layout for structures
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000399used by Windows code, you need to embed the struct within two special
400#include's which will take care of the packing for you:
401
402#include "pshpack1.h"
Eric Pouech19dc2081999-10-31 22:15:58 +0000403struct { BYTE x; WORD y; };
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000404#include "poppack1.h"
405
406For alignment on a 2-byte boundary, there is a "pshpack2.h", etc.
407
408The use of the WINE_PACKED attribute is obsolete. Please remove these
409in favour of the above solution.
410Using WINE_PACKED, you would declare the above structure like this:
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000411
412struct { BYTE x; WORD y WINE_PACKED; };
413
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000414You had to do this every time a structure member is not aligned
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000415correctly under Windows (i.e. a WORD not on an even address, or a
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000416DWORD on a address that was not a multiple of 4).
Alexandre Julliard2d93d001996-05-21 15:01:41 +0000417
418
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000419NAMING CONVENTIONS FOR API FUNCTIONS AND TYPES
420==============================================
421
422In order to support both Win16 and Win32 APIs within the same source
Douglas Ridgway692389d1998-11-22 16:56:44 +0000423code, the following convention must be used in naming all API
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000424functions and types. If the Windows API uses the name 'xxx', the Wine
425code must use:
426
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000427 - 'xxx16' for the Win16 version,
428 - 'xxx' for the Win32 version when no ASCII/Unicode strings are
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000429 involved,
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000430 - 'xxxA' for the Win32 version with ASCII strings,
431 - 'xxxW' for the Win32 version with Unicode strings.
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000432
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000433If the function has both ASCII and Unicode version, you should then
434use the macros WINELIB_NAME_AW(xxx) or DECL_WINELIB_TYPE_AW(xxx)
Jim Aston07684241999-07-18 13:28:59 +0000435(defined in include/windef.h) to define the correct 'xxx' function
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000436or type for Winelib. When compiling Wine itself, 'xxx' is _not_
437defined, meaning that code inside of Wine must always specify
438explicitly the ASCII or Unicode version.
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000439
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000440If 'xxx' is the same in Win16 and Win32, you can simply use the same
441name as Windows, i.e. just 'xxx'. If 'xxx' is Win16 only, you could
442use the name as is, but it's preferable to use 'xxx16' to make it
443clear it is a Win16 function.
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000444
445Examples:
446
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000447typedef struct { /* Win32 ASCII data structure */ } WNDCLASSA;
448typedef struct { /* Win32 Unicode data structure */ } WNDCLASSW;
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000449typedef struct { /* Win16 data structure */ } WNDCLASS16;
450DECL_WINELIB_TYPE_AW(WNDCLASS);
451
452ATOM RegisterClass16( WNDCLASS16 * );
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000453ATOM RegisterClassA( WNDCLASSA * );
454ATOM RegisterClassW( WNDCLASSW * );
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000455#define RegisterClass WINELIB_NAME_AW(RegisterClass)
456
457The Winelib user can then say:
458
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000459 WNDCLASS wc = { ... };
460 RegisterClass( &wc );
461
462and this will use the correct declaration depending on the definition
Alexandre Julliard9f69d891999-02-26 12:33:21 +0000463of the UNICODE symbol.
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000464
465
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000466NAMING CONVENTIONS FOR NON-API FUNCTIONS AND TYPES
467==================================================
468
469Functions and data which are internal to your code (or at least shouldn't be
Francois Gougete550ebe2000-12-02 20:17:13 +0000470visible to any Winelib or Windows program) should be preceded by
Klaas van Gend0a7aa161999-06-05 11:52:46 +0000471an identifier to the module:
472
473Examples:
474
475ENUMPRINTERS_GetDWORDFromRegistryA() (in dlls/winspool/info.c)
476IAVIFile_fnRelease() (in dlls/avifil32/avifile.c)
477X11DRV_CreateDC() (in graphics/x11drv/init.c)
478TIMER_Init() (implemented in windows/timer.c,
479 used in loader/main.c )
480
481if you need prototypes for these, there are a few possibilities:
482- within same source file only:
483 put the prototypes at the top of your file and mark them as prototypes.
484- within the same module:
485 create a header file within the subdirectory where that module resides,
486 e.g. graphics/ddraw_private.h
487- from a totally different module, or for use in winelib:
488 put your header file entry in /include/wine/
489 but be careful not to clutter this directory!
490under no circumstances, you should add non-api calls to the standard
491windoze include files. Unfortunately, this is often the case, e.g.
492the above example of TIMER_Init is defined in include/message.h
493
494
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000495API ENTRY POINTS
496================
Alexandre Julliarddba420a1994-02-02 06:48:31 +0000497
498Because Win16 programs use a 16-bit stack and because they can only
499call 16:16 addressed functions, all API entry points must be at low
500address offsets and must have the arguments translated and moved to
501Wines 32-bit stack. This task is handled by the code in the "if1632"
502directory. To define a new API entry point handler you must place a
503new entry in the appropriate API specification file. These files are
Alexandre Julliardca22b331996-07-12 19:02:39 +0000504named *.spec. For example, the API specification file for the USER
505DLL is contained in the file user.spec. These entries are processed
506by the "build" program to create an assembly file containing the entry
507point code for each API call. The format of the *.spec files is
Alexandre Julliard8d24ae61994-04-05 21:42:43 +0000508documented in the file "tools/build-spec.txt".
509
Alexandre Julliard1285c2f1996-05-06 16:06:24 +0000510
511DEBUG MESSAGES
512==============
Alexandre Julliardaca05781994-10-17 18:12:41 +0000513
514To display a message only during debugging, you normally write something
515like this:
516
Alexandre Julliard54c27111998-03-29 19:44:57 +0000517 TRACE(win,"abc..."); or
518 FIXME(win,"abc..."); or
519 WARN(win,"abc..."); or
520 ERR(win,"abc...");
Alexandre Julliardaca05781994-10-17 18:12:41 +0000521
Alexandre Julliard54c27111998-03-29 19:44:57 +0000522depending on the seriousness of the problem. (documentation/degug-msgs
523explains when it is appropriate to use each of them)
Alexandre Julliardaca05781994-10-17 18:12:41 +0000524
Alexandre Julliard54c27111998-03-29 19:44:57 +0000525These macros are defined in include/debug.h. The macro-definitions are
526generated by the shell-script tools/make_debug. It scans the source
527code for symbols of this forms and puts the necessary macro
528definitions in include/debug.h and include/debugdefs.h. These macros
529test whether the debugging "channel" associated with the first
530argument of these macros (win in the above example) is enabled and
531thus decide whether to actually display the text. In addition you can
532change the types of displayed messages by supplying the "-debugmsg"
533option to Wine. If your debugging code is more complex than just
534printf, you can use the symbols TRACE_ON(xxx), WARN_ON(xxx),
535ERR_ON(xxx) and FIXME_ON(xxx) as well. These are true when channel xxx
536is enabled, either permanent or in the command line. Thus, you can
537write:
Alexandre Julliardaca05781994-10-17 18:12:41 +0000538
Alexandre Julliard54c27111998-03-29 19:44:57 +0000539 if(TRACE_ON(win))DumpSomeStructure(&str);
Alexandre Julliard234bc241994-12-10 13:02:28 +0000540
Alexandre Julliard234bc241994-12-10 13:02:28 +0000541Don't worry about the inefficiency of the test. If it is permanently
Alexandre Julliard54c27111998-03-29 19:44:57 +0000542disabled (that is TRACE_ON(win) is 0 at compile time), the compiler will
Alexandre Julliard234bc241994-12-10 13:02:28 +0000543eliminate the dead code.
Alexandre Julliardaca05781994-10-17 18:12:41 +0000544
Alexandre Julliardaca05781994-10-17 18:12:41 +0000545You have to start tools/make_debug only if you introduced a new macro,
Alexandre Julliard54c27111998-03-29 19:44:57 +0000546e.g. TRACE(win32).
547
548For more info about debugging messages, read:
549
550documentation/debug-msgs
551
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000552
553MORE INFO
554=========
555
Alexandre Julliard33072e11997-06-29 18:08:02 +00005561. There is a FREE online version of the MSDN library (including
557 documentation for the Win32 API) on http://www.microsoft.com/msdn/
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000558
Alexandre Julliard33072e11997-06-29 18:08:02 +00005592. http://www.sonic.net/~undoc/bookstore.html
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000560
Alexandre Julliard33072e11997-06-29 18:08:02 +00005613. In 1993 Dr. Dobbs Journal published a column called "Undocumented Corner".
562
5634. You might want to check out BYTE from December 1983 as well :-)
Alexandre Julliard23946ad1997-06-16 17:43:53 +0000564