Implemented RtlUnicodeStringToInteger.
[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.
12
13 DLLs:
14 -----
15         dlls/                   - All the DLLs implemented by Wine
16
17                 advapi32/       - crypto, systeminfo, security, eventlogging
18                 avicap32/
19                 avifil32/       - COM object to play AVI files
20                 comctl32/       - common controls
21                 commdlg/        - common dialog boxes (both 16 & 32 bit)
22                 crtdll/         - Old C runtime library
23                 crypt32/
24                 dciman32/
25                 ddraw/          - DirectX ddraw
26                 dinput/         - DirectX dinput 
27                 dplay/          - DirectX dplay
28                 dplayx/         - DirectX dplayx
29                 dsound/         - DirectX dsound
30                 gdi/            - GDI (graphics calls)
31                         enhmetafiledrv/ - enhanced metafile driver
32                         metafiledrv/    - metafile driver
33                         win16drv/       - support for Win16 printer drivers
34                 glu32/
35                 icmp/
36                 imagehlp/       - PE (Portable Executable) Image Helper lib
37                 imm32/
38                 kernel/         - The Windows kernel
39                 lzexpand/       - Liv-Zempel compression/decompression
40                 mpr/            - Multi-Protocol Router (interface to various 
41                                   network transport protocols)
42                 msacm/          - audio compression manager (multimedia) (16 bit)
43                 msacm32/        - audio compression manager (multimedia) (32 bit)
44                 msdmo/
45                 msimg32/
46                 msisys/
47                 msnet/
48                 msrle32
49                 msvcrt/         - 16 bit C runtime library 
50                 msvcrt20/       - 32 bit C runtime library
51                 msvideo/        - 16 bit video manager
52                 netapi32/
53                 ntdll/          - NT implementation of kernel calls
54                 odbc32/
55                 ole32/          - 32 bit OLE 2.0 libraries
56                 oleaut32/       - 32 bit OLE 2.0 automation
57                 olecli/         - 16 bit OLE client
58                 oledlg/         - OLE 2.0 user interface support
59                 olepro32/       - 32 bit OLE 2.0 automation
60                 olesvr/         - 16 bit OLE server
61                 opengl32/       - OpenGL implementation
62                 psapi/          - process status API
63                 qcap/
64                 quartz/
65                 rasapi32/       - remote access server API
66                 richedit/
67                 rpcrt4/
68                 serialui/
69                 setupapi/
70                 shdocvw/
71                 shfolder/
72                 shell32/        - COM object implementing shell views
73                 shlwapi/
74                 sti/
75                 tapi32/         - telephone API
76                 ttydrv/         - TTY display driver (Wine specific)
77                 url
78                 urlmon
79                 user/           - Window management, standard controls, etc.
80                 ver/            - File Installation Library (16 bit)
81                 version/        - File Installation Library (32 bit)
82                 win32s/
83                 win87em/        - 80387 math-emulation
84                 winaspi/        - 16 bit Advanced SCSI Peripheral Interface
85                 winedos/        - DOS features and BIOS calls (interrupts)
86                 wineps/         - Postscript driver (Wine specific)
87                 winmm/          - multimedia (16 & 32 bit)
88                         mciXXX/ - various MCI drivers
89                         midimap/- midi mapper
90                         wavemap/- audio mapper
91                         winearts/ - ARTS audio driver
92                         wineoss/- MM driver for OSS systems
93                 winnls/         - National Language Support
94                 winsock/        
95                 wsock32/
96                 winspool/       - Printing & Print Spooler
97                 wintrust/
98                 wnaspi32/       - 32 bit ASPI
99                 x11drv/         - X11 display driver (Wine specific)
100
101 Winelib programs:
102 -----------------
103
104         programs/               - All the Winelib programs
105                 avitools/
106                 clock/
107                 cmdlgtst/
108                 control/
109                 expand/
110                 notepad/
111                 osversioncheck/
112                 progman/
113                 regapi/
114                 regedit/
115                 regsvr32/
116                 regtest/
117                 uninstaller/
118                 view/
119                 wcmd/
120                 wineconsole/
121                 winedbg/
122                 winefile/
123                 winemine/
124                 winepath/
125                 winetest/
126                 winhelp/
127                 winver/
128
129
130 Support programs, libraries, etc:
131 ---------------------------------
132
133         documentation/          - some documentation
134         include/                - Windows standard includes
135         library/                - the Wine portability library
136         miscemu/                - the main Wine program
137         ole/                    - global UUIDs static library
138         server/                 - the Wine server
139         tools/                  - relay code builder, new rc, bugreport
140                                   generator, wineconfigurator, etc.
141         unicode/                - Unicode support shared
142
143
144 Miscellaneous:
145 --------------
146
147 Note: these directories will ultimately get moved into their
148 respective dlls.
149
150         files/                  - KERNEL file I/O
151         if1632/                 - KERNEL relay code
152         loader/                 - KERNEL loader code
153         memory/                 - KERNEL memory management
154         misc/                   - KERNEL shell, registry, winsock, etc.
155         msdos/                  - KERNEL DOS support
156         relay32/                - KERNEL 32-bit relay code
157         scheduler/              - KERNEL process and thread management
158         win32/                  - KERNEL misc Win32 functions
159
160         graphics/               - GDI graphics drivers
161         objects/                - GDI logical objects
162
163         controls/               - USER built-in widgets
164         windows/                - USER window management
165
166         tsx11/                  - thread-safe X11 wrappers (auto generated)
167
168
169
170 IMPLEMENTING NEW API CALLS
171 ==========================
172
173 This is the simple version, and covers only Win32. Win16 is slightly
174 uglier, because of the Pascal heritage and the segmented memory model.
175
176 All of the Win32 APIs known to Wine are listed in the .spec file of
177 their corresponding dll. An unimplemented call will look like (from
178 gdi32.spec)
179   269 stub PolyBezierTo
180 To implement this call, you need to do the following four things.
181
182 1. Find the appropriate parameters for the call, and add a prototype to
183 the correct header file. In this case, that means [include/wingdi.h],
184 and it might look like
185   BOOL WINAPI PolyBezierTo(HDC, LPCVOID, DWORD);
186 If the function has both an ASCII and a Unicode version, you need to
187 define both and add a #define WINELIB_NAME_AW declaration. See below
188 for discussion of function naming conventions.
189   
190 2. Modify the .spec file to tell Wine that the function has an
191 implementation, what the parameters look like and what Wine function
192 to use for the implementation. In Win32, things are simple--everything
193 is 32-bits. However, the relay code handles pointers and pointers to
194 strings slightly differently, so you should use 'str' and 'wstr' for
195 strings, 'ptr' for other pointer types, and 'long' for everything else.
196   269 stdcall PolyBezierTo(long ptr long) PolyBezierTo
197 The 'PolyBezierTo' at the end of the line is which Wine function to use
198 for the implementation.
199
200 3. Implement the function as a stub. Once you add the function to the .spec
201 file, you must add the function to the Wine source before it will link.
202 Add a function called 'PolyBezierTo' somewhere. Good things to put
203 into a stub:
204   o a correct prototype, including the WINAPI
205   o header comments, including full documentation for the function and
206     arguments (see documentation/README.documentation)
207   o A FIXME message and an appropriate return value are good things to
208     put in a stub.
209
210   /************************************************************
211    *                    PolyBezierTo   (GDI32.269)  
212    *  
213    * Draw many Bezier curves
214    *
215    * RETURNS
216    *   nonzero on success or zero on faillure
217    *
218    * BUGS
219    *   Unimplemented
220    */
221    BOOL WINAPI PolyBezierTo(HDC hdc,     /* handle to device context */
222                             LPCVOID p,   /* ptr to array of Point structs */
223                             DWORD count  /* nr of points in array */
224    ) 
225    {
226       /* tell the user they've got a substandard implementation */
227       FIXME(gdi, ":(%x,%p,%d): stub\n", hdc, p, count);
228
229       /* some programs may be able to compensate, 
230        * if they know what happened 
231        */
232       SetLastError(ERROR_CALL_NOT_IMPLEMENTED);  
233       return FALSE;    /* error value */
234    }
235
236 4. Implement and test the rest of the function.
237
238
239 IMPLEMENTING A NEW DLL
240 ======================
241
242 Generic directions
243 ------------------
244
245 Apart from writing the set of needed .c files, you also need to do the 
246 following:
247
248 1.  Create a directory <MyDll> where to store the implementation of
249     the DLL. This directory has to be put under the dlls/ directory.
250     If the DLL exists under Windows as both 16 and 32 bit DLL, you
251     should have a single directory with both implementations.
252
253 2.  Create the Makefile.in in the ./dlls/<MyDll>/ directory. You can
254     copy an existing Makefile.in from another ./dlls/ subdirectory.
255     You need at least to change the MODULE and C_SRCS macros. 
256
257 3.  Add the directory in ./configure.ac (in AC_OUTPUT macro at the end
258     of the file to trigger the Makefile generation)
259
260 4.  Run ./make_dlls in the dlls directory to update Makefile.in in
261     that directory.
262
263 5.  You can now regenerate ./configure file (with 'make configure')
264     and the various Makefiles (with 'configure; make depend') (run
265     from the top of Wine's tree).
266     You should now have a Makefile file in ./dlls/<MyDll>/
267
268 6.  Create the .spec file for the DLL exported functions in your
269     directory. Refer to 'Implementation of new API calls' earlier in
270     this document for more information on this part.
271
272 7.  You can now start adding .c files. For the .h files, if they are
273     standard Windows one, put them in include/. If they are linked to
274     *your* implementation of the dll, put them in your newly created
275     directory.
276
277 Debug channels
278 --------------
279
280 If you need to create a new debug channel, just add the
281 WINE_DEFAULT_DEBUG_CHANNEL to your .c file(s), and use them. 
282 All the housekeeping will happen automatically.
283
284 Resources
285 ---------
286
287 If you also need to add resources to your DLL, the create the .rc
288 file. Add to your ./dlls/<MyDll>/Makefile.in, in the RC_SRCS macro,
289 the list of .rc files to add to the DLL. See dlls/comctl32/ for an
290 example of this.
291
292 Thunking
293 --------
294
295 If you're building a 16 & 32 bit DLLs pair, then from the 32 bit code
296 you might need to call 16 bit routine. The way to do it to add in the
297 code, fragments like:
298 /* ### Start build ### */
299 extern WORD CALLBACK <PREFIX>_CallTo16_word_wwlll(FARPROC16,WORD,WORD,LONG,LONG,LONG);
300 /* ### stop build ### */
301 Where <PREFIX>_ is an internal prefix for your module. The first
302 parameter is always of type FARPROC16. Then, you can get the regular
303 list of parameters. The _word_wwlll indicates the type of return (long
304 or word) and the size of the parameters (here l=>long, w=>word; which
305 maps to WORD,WORD,LONG,LONG,LONG.
306 You can put several functions between the Start/Stop build pair.
307
308 You can also read the winebuild manpage for more details on this.
309
310 Then, add to ./dlls/<MyDll>/Makefile.in a line like:
311
312 EXTRA_OBJS = $(MODULE).glue.o
313
314 See dlls/winmm/ for an example of this.
315
316 MEMORY AND SEGMENTS
317 ===================
318
319 NE (Win16) executables consist of multiple segments.  The Wine loader
320 loads each segment into a unique location in the Wine processes memory
321 and assigns a selector to that segment.  Because of this, it's not
322 possible to exchange addresses freely between 16-bit and 32-bit code.
323 Addresses used by 16-bit code are segmented addresses (16:16), formed
324 by a 16-bit selector and a 16-bit offset.  Those used by the Wine code
325 are regular 32-bit linear addresses.
326
327 There are four ways to obtain a segmented pointer:
328   - Using the MapLS function (recommended).
329   - Allocate a block of memory from the global heap and use
330     WIN16_GlobalLock to get its segmented address.
331   - Declare the argument as 'segptr' instead of 'ptr' in the spec file
332     for a given API function.
333
334 Once you have a segmented pointer, it must be converted to a linear
335 pointer before you can use it from 32-bit code.  This can be done with
336 the MapSL function.  The linear pointer can then be used freely with
337 standard Unix functions like memcpy() etc. without worrying about 64k
338 boundaries.  Note: there's no easy way to convert back from a linear
339 to a segmented address.
340
341 In most cases, you don't need to worry about segmented address, as the
342 conversion is made automatically by the callback code and the API
343 functions only see linear addresses. However, in some cases it is
344 necessary to manipulate segmented addresses; the most frequent cases
345 are:
346   - API functions that return a pointer
347   - lParam of Windows messages that point to a structure
348   - Pointers contained inside structures accessed by 16-bit code.
349
350 It is usually a good practice to used the type 'SEGPTR' for segmented
351 pointers, instead of something like 'LPSTR' or 'char *'.  As SEGPTR is
352 defined as a DWORD, you'll get a compilation warning if you mistakenly
353 use it as a regular 32-bit pointer.
354
355
356 STRUCTURE PACKING
357 =================
358
359 Under Windows, data structures are tightly packed, i.e. there is no
360 padding between structure members. On the other hand, by default gcc
361 aligns structure members (e.g. WORDs are on a WORD boundary, etc.).
362 This means that a structure like
363
364 struct { BYTE x; WORD y; };
365
366 will take 3 bytes under Windows, but 4 with gcc, because gcc will add a
367 dummy byte between x and y. To have the correct layout for structures
368 used by Windows code, you need to embed the struct within two special
369 #include's which will take care of the packing for you:
370
371 #include "pshpack1.h"
372 struct { BYTE x; WORD y; };
373 #include "poppack1.h"
374
375 For alignment on a 2-byte boundary, there is a "pshpack2.h", etc.
376
377 The use of the WINE_PACKED attribute is obsolete. Please remove these 
378 in favour of the above solution. 
379 Using WINE_PACKED, you would declare the above structure like this:
380
381 struct { BYTE x; WORD y WINE_PACKED; };
382
383 You had to do this every time a structure member is not aligned
384 correctly under Windows (i.e. a WORD not on an even address, or a
385 DWORD on a address that was not a multiple of 4).
386
387
388 NAMING CONVENTIONS FOR API FUNCTIONS AND TYPES
389 ==============================================
390
391 In order to support both Win16 and Win32 APIs within the same source
392 code, the following convention must be used in naming all API
393 functions and types. If the Windows API uses the name 'xxx', the Wine
394 code must use:
395
396  - 'xxx16' for the Win16 version,
397  - 'xxx'   for the Win32 version when no ASCII/Unicode strings are
398    involved,
399  - 'xxxA'  for the Win32 version with ASCII strings,
400  - 'xxxW'  for the Win32 version with Unicode strings.
401
402 If the function has both ASCII and Unicode version, you should then
403 use the macros WINELIB_NAME_AW(xxx) or DECL_WINELIB_TYPE_AW(xxx)
404 (defined in include/windef.h) to define the correct 'xxx' function
405 or type for Winelib. When compiling Wine itself, 'xxx' is _not_
406 defined, meaning that code inside of Wine must always specify
407 explicitly the ASCII or Unicode version.
408
409 If 'xxx' is the same in Win16 and Win32, you can simply use the same
410 name as Windows, i.e. just 'xxx'.  If 'xxx' is Win16 only, you could
411 use the name as is, but it's preferable to use 'xxx16' to make it
412 clear it is a Win16 function.
413
414 Examples:
415
416 typedef struct { /* Win32 ASCII data structure */ } WNDCLASSA;
417 typedef struct { /* Win32 Unicode data structure */ } WNDCLASSW;
418 typedef struct { /* Win16 data structure */ } WNDCLASS16;
419 DECL_WINELIB_TYPE_AW(WNDCLASS);
420
421 ATOM RegisterClass16( WNDCLASS16 * );
422 ATOM RegisterClassA( WNDCLASSA * );
423 ATOM RegisterClassW( WNDCLASSW * );
424 #define RegisterClass WINELIB_NAME_AW(RegisterClass)
425
426 The Winelib user can then say:
427
428     WNDCLASS wc = { ... };
429     RegisterClass( &wc );
430
431 and this will use the correct declaration depending on the definition
432 of the UNICODE symbol.
433
434
435 NAMING CONVENTIONS FOR NON-API FUNCTIONS AND TYPES
436 ==================================================
437
438 Functions and data which are internal to your code (or at least shouldn't be
439 visible to any Winelib or Windows program) should be preceded by
440 an identifier to the module:
441
442 Examples:
443
444 ENUMPRINTERS_GetDWORDFromRegistryA()    (in dlls/winspool/info.c)
445 IAVIFile_fnRelease()                    (in dlls/avifil32/avifile.c)
446 X11DRV_CreateDC()                       (in graphics/x11drv/init.c)
447
448 if you need prototypes for these, there are a few possibilities:
449 - within same source file only:
450   put the prototypes at the top of your file and mark them as prototypes.
451 - within the same module:
452   create a header file within the subdirectory where that module resides,
453   e.g.  graphics/ddraw_private.h
454 - from a totally different module, or for use in winelib:
455   you should never do that. Only exported APIs can be called across
456   module boundaries.
457
458
459 DEBUG MESSAGES
460 ==============
461
462 To display a message only during debugging, you normally write something
463 like this:
464
465         TRACE("abc...");  or
466         FIXME("abc...");  or
467         WARN("abc...");   or
468         ERR("abc...");
469
470 depending on the seriousness of the problem. (documentation/degug-msgs
471 explains when it is appropriate to use each of them). You need to declare
472 the debug channel name at the top of the file (after the includes) using
473 the WINE_DEFAULT_DEBUG_CHANNEL macro, like so:
474
475         WINE_DEFAULT_DEBUG_CHANNEL(win);
476
477 If your debugging code is more complex than just printf, you can use 
478 the macros:
479
480         TRACE_ON(xxx), WARN_ON(xxx), ERR_ON(xxx) and FIXME_ON(xxx) 
481
482 to test if the given channel is enabled. Thus, you can write:
483
484         if (TRACE_ON(win)) DumpSomeStructure(&str);
485
486 Don't worry about the inefficiency of the test. If it is permanently 
487 disabled (that is TRACE_ON(win) is 0 at compile time), the compiler will 
488 eliminate the dead code.
489
490 For more info about debugging messages, read:
491
492 documentation/debug-msgs
493
494
495 MORE INFO
496 =========
497
498 1. There is a FREE online version of the MSDN library (including
499    documentation for the Win32 API) on http://www.microsoft.com/msdn/
500
501 2. http://www.sonic.net/~undoc/bookstore.html
502
503 3. In 1993 Dr. Dobbs Journal published a column called "Undocumented Corner".
504
505 4. You might want to check out BYTE from December 1983 as well :-)