This document should help new developers get started. Like all of Wine, it
is a work in progress.


SOURCE TREE STRUCTURE
=====================

The Wine source tree is loosely based on the original Windows modules. 
Most of the source is concerned with implementing the Wine API, although
there are also various tools, documentation, sample Winelib code, and
code specific to the binary loader.  Note that several of the libraries
listed here are "stubbed out", meaning they still need to be implemented.

DLLs:
-----
	dlls/			- All the DLLs implemented by Wine

		advapi32/	- Crypto, systeminfo, security, eventlogging
		avicap32/	- AVI capture window class
		avifil32/	- COM object to play AVI files
		cabinet/	- Cabinet file interface
		capi2032/	- Wrapper library for CAPI4Linux access
		cfgmgr32/	- Config manager
		comcat/		- Component category manager
		comctl32/	- Common controls
		commdlg/	- Common dialog boxes (both 16 & 32 bit)
		crtdll/		- Old C runtime library
		crypt32/	- Cryptography
		ctl3d/          - 3D Effects for Common GUI Components
		d3d8/		- Direct3D (3D graphics)
		d3d9/		- Direct3D (3D graphics)
		d3dim/		- Direct3D Immediate Mode
		d3dx8/		- Direct3D (3D graphics)
		dciman32/	- DCI Manager (graphics)
		ddraw/		- DirectDraw (graphics)
		devenum/	- Device enumeration (part of DirectShow)
		dinput/		- DirectInput (device input)
		dinput8/	- DirectInput (device input)
		dmband/		- DirectMusic
		dmcompos/	- DirectMusic
		dmime/		- DirectMusic
		dmloader/	- DirectMusic
		dmscript/	- DirectMusic
		dmstyle/	- DirectMusic
		dmsynth/	- DirectMusic
		dmusic/		- DirectMusic
		dmusic32/	- DirectMusic
		dplay/		- DirectPlay (networking)
		dplayx/		- DirectPlay (networking)
		dpnhpast/	- DirectPlay NAT Helper
		dsound/		- DirectSound (audio)
		gdi/		- GDI (graphics)
		gdi/enhmfdrv/	- Enhanced metafile driver
		gdi/mfdrv/	- Metafile driver
		glu32/		- OpenGL Utility library (graphics)
		icmp/		- ICMP protocol (networking)
		imagehlp/	- PE (Portable Executable) Image Helper lib
		imm32/		- Input Method Manager
		iphlpapi/       - IP Helper API
		kernel/		- The Windows kernel
		lzexpand/	- Lempel-Ziv compression/decompression
		mapi32/		- Mail interface
		mpr/		- Multi-Protocol Router (networking)
		msacm/		- Audio Compression Manager (multimedia)
		msdmo/		- DirectX Media Objects
		msimg32/	- Gradient and transparency (graphics)
		msisys/		- System information
		msi/		- Microsoft Installer
		msnet32/	- Network interface
		msvcrt/		- C runtime library 
		msvcrt20/	- C runtime library version 2.0
		msvcrtd/	- C runtime library debugging
		msvideo/	- 16 bit video manager
		msvideo/msrle32/- Video codecs
		mswsock/	- Misc networking
		netapi32/	- Network interface
		ntdll/		- NT implementation of kernel calls
		odbc32/		- Open DataBase Connectivity driver manager
		ole32/		- 32 bit OLE 2.0 libraries
		oleaut32/	- 32 bit OLE 2.0 automation
		olecli/		- 16 bit OLE client
		oledlg/		- OLE 2.0 user interface support
		olepro32/	- 32 bit OLE 2.0 automation
		olesvr/		- 16 bit OLE server
		opengl32/	- OpenGL implementation (graphics)
		psapi/		- Process Status interface
		qcap/		- DirectShow runtime
		quartz/		- DirectShow runtime
		rasapi32/	- Remote Access Server interface
		richedit/	- Rich text editing control
		rpcrt4/		- Remote Procedure Call runtime
		serialui/	- Serial port property pages
		setupapi/	- Setup interface
		shdocvw/	- Shell document object and control
		shfolder/	- Shell folder service
		shell32/	- COM object implementing shell views
		shlwapi/	- Shell Light-Weight interface
		snmpapi/	- SNMP protocol interface (networking)
		sti/		- Still Image service
		tapi32/		- Telephone interface
		ttydrv/		- TTY display driver (Wine specific)
		twain/		- TWAIN Imaging device communications
		url/		- Internet shortcut shell extension
		urlmon/		- URL Moniker allows binding to a URL (like KIO/gnome-vfs)
		user/		- Window management, standard controls, etc.
		uxtheme/	- Theme library
		version/	- File installation library
		win32s/		- 32-bit function access for 16-bit systems
		winaspi/	- 16 bit Advanced SCSI Peripheral Interface
		winedos/	- DOS features and BIOS calls (interrupts) (wine specific)
		wineps/		- Postscript driver (Wine specific)
		wininet/	- Internet extensions
		winmm/		- Multimedia (16 & 32 bit)
		winmm/joystick/	- Joystick driver
		winmm/mcianim/	- MCI animation driver
		winmm/mciavi/	- MCI video driver
		winmm/mcicda/	- MCI audio CD driver
		winmm/mciseq/	- MCI MIDI driver
		winmm/mciwave/	- MCI wave driver
		winmm/midimap/	- MIDI mapper
		winmm/wavemap/	- Audio mapper
		winmm/winealsa/	- ALSA audio driver
		winmm/winearts/	- aRts audio driver
		winmm/wineaudioio/ - audioio audio driver
		winmm/winejack/	- JACK audio server driver
		winmm/winenas/	- NAS audio driver
		winmm/wineoss/	- OSS audio driver
		winnls/		- National Language Support
		winsock/	- Sockets 2.0 (networking)
		wsock32/	- Sockets 1.1 (networking)
		wintab32/	- Tablet device interface
		winspool/	- Printing & Print Spooler
		wintrust/	- Trust verification interface
		wow32/		- WOW subsystem
		x11drv/		- X11 display driver (Wine specific)

Winelib programs:
-----------------

	programs/		- All the Winelib programs

		avitools/	- AVI information viewer and player
		clock/		- Graphical clock
		cmdlgtst/	- Common dialog tests
		control/	- Control panel
		expand/		- Decompress Lempel-Ziv compressed archive
		notepad/	- Notepad with RichEdit functionality
		osversioncheck/	- Check version of Windows being indicated
		progman/	- Program manager
		regapi/		- Command line Registry implementation
		regedit/	- Registry editor
		regsvr32/	- Register COM server
		regtest/	- Registry testing program
		rpcss/		- RPC services
		rundll32/	- Execute DLL functions directly
		uninstaller/	- Remove installed programs
		view/		- Metafile viewer
		wcmd/		- Command line interface
		wineconsole/	- Console
		winedbg/	- Debugger
		winefile/	- File manager
		winemine/	- Mine game
		winepath/	- Translate between Wine and Unix paths
		winhelp/	- Help viewer
		winver/		- Windows Version Program


Support programs, libraries, etc:
---------------------------------

	documentation/		- some documentation
	include/		- Windows standard includes
	libs/			- the Wine libraries
	libs/port/		- portability library
	libs/unicode/		- Unicode support shared
	libs/uuid/		- Windows-compatible UUID numbers
	libs/wine/		- Wine bootstrap library
	libs/wpp/		- C preprocessor
	loader/			- the main Wine loader
	server/			- the Wine server
	tools/			- relay code builder, resource compiler, etc.


Miscellaneous:
--------------

Note: these directories will ultimately get moved into their
respective dlls.

	files/			- KERNEL file I/O
	misc/			- KERNEL shell, registry, winsock, etc.

	graphics/		- GDI graphics drivers
	objects/		- GDI logical objects

	controls/		- USER built-in widgets
	windows/		- USER window management



IMPLEMENTING NEW API CALLS
==========================

This is the simple version, and covers only Win32. Win16 is slightly
uglier, because of the Pascal heritage and the segmented memory model.

All of the Win32 APIs known to Wine are listed in the .spec file of
their corresponding dll. An unimplemented call will look like (from
gdi32.spec)
  269 stub PolyBezierTo
To implement this call, you need to do the following four things.

1. Find the appropriate parameters for the call, and add a prototype to
the correct header file. In this case, that means [include/wingdi.h],
and it might look like
  BOOL WINAPI PolyBezierTo(HDC, LPCVOID, DWORD);
If the function has both an ASCII and a Unicode version, you need to
define both and add a #define WINELIB_NAME_AW declaration. See below
for discussion of function naming conventions.
  
2. Modify the .spec file to tell Wine that the function has an
implementation, what the parameters look like and what Wine function
to use for the implementation. In Win32, things are simple--everything
is 32-bits. However, the relay code handles pointers and pointers to
strings slightly differently, so you should use 'str' and 'wstr' for
strings, 'ptr' for other pointer types, and 'long' for everything else.
  269 stdcall PolyBezierTo(long ptr long) PolyBezierTo
The 'PolyBezierTo' at the end of the line is which Wine function to use
for the implementation.

3. Implement the function as a stub. Once you add the function to the .spec
file, you must add the function to the Wine source before it will link.
Add a function called 'PolyBezierTo' somewhere. Good things to put
into a stub:
  o a correct prototype, including the WINAPI
  o header comments, including full documentation for the function and
    arguments (see documentation/README.documentation)
  o A FIXME message and an appropriate return value are good things to
    put in a stub.

  /************************************************************
   *                    PolyBezierTo   (GDI32.269)  
   *  
   * Draw many Bezier curves.
   *
   * RETURNS
   *   Success: Non-zero.
   *   Failure: FALSE. Use GetLastError() to find the error cause.
   *
   * BUGS
   *   Unimplemented
   */
   BOOL WINAPI PolyBezierTo(HDC hdc,     /* [In] Device context to draw to */
                            LPCVOID p,   /* [In] Array of POINT structs */
                            DWORD count  /* [In] Number of points in p */
   ) 
   {
      /* tell the user they've got a substandard implementation */
      FIXME(gdi, ":(%x,%p,%d): stub\n", hdc, p, count);

      /* some programs may be able to compensate, 
       * if they know what happened 
       */
      SetLastError(ERROR_CALL_NOT_IMPLEMENTED);  
      return FALSE;    /* error value */
   }

4. Implement and test the rest of the function.


IMPLEMENTING A NEW DLL
======================

Generic directions
------------------

Apart from writing the set of needed .c files, you also need to do the 
following:

1.  Create a directory <MyDll> where to store the implementation of
    the DLL. This directory has to be put under the dlls/ directory.
    If the DLL exists under Windows as both 16 and 32 bit DLL, you
    should have a single directory with both implementations.

2.  Create the Makefile.in in the ./dlls/<MyDll>/ directory. You can
    copy an existing Makefile.in from another ./dlls/ subdirectory.
    You need at least to change the MODULE and C_SRCS macros. 

3.  Add the directory in ./configure.ac (in AC_OUTPUT macro at the end
    of the file to trigger the Makefile generation)

4.  Run ./make_dlls in the dlls directory to update Makefile.in in
    that directory.

5.  You can now regenerate ./configure file (with 'make configure')
    and the various Makefiles (with 'configure; make depend') (run
    from the top of Wine's tree).
    You should now have a Makefile file in ./dlls/<MyDll>/

6.  Create the .spec file for the DLL exported functions in your
    directory. Refer to 'Implementation of new API calls' earlier in
    this document for more information on this part.

7.  You can now start adding .c files. For the .h files, if they are
    standard Windows one, put them in include/. If they are linked to
    *your* implementation of the dll, put them in your newly created
    directory.

Debug channels
--------------

If you need to create a new debug channel, just add the
WINE_DEFAULT_DEBUG_CHANNEL to your .c file(s), and use them. 
All the housekeeping will happen automatically.

Resources
---------

If you also need to add resources to your DLL, then create the .rc
file. Add to your ./dlls/<MyDll>/Makefile.in, in the RC_SRCS macro,
the list of .rc files to add to the DLL. See dlls/comctl32/ for an
example of this.

Thunking
--------

If you're building a 16 & 32 bit DLLs pair, then from the 32 bit code
you might need to call 16 bit routine. The way to do it to add in the
code, fragments like:
/* ### Start build ### */
extern WORD CALLBACK <PREFIX>_CallTo16_word_wwlll(FARPROC16,WORD,WORD,LONG,LONG,LONG);
/* ### stop build ### */
Where <PREFIX>_ is an internal prefix for your module. The first
parameter is always of type FARPROC16. Then, you can get the regular
list of parameters. The _word_wwlll indicates the type of return (long
or word) and the size of the parameters (here l=>long, w=>word; which
maps to WORD,WORD,LONG,LONG,LONG.
You can put several functions between the Start/Stop build pair.

You can also read the winebuild manpage for more details on this.

Then, add to ./dlls/<MyDll>/Makefile.in a line like:

EXTRA_OBJS = $(MODULE).glue.o

See dlls/winmm/ for an example of this.

MEMORY AND SEGMENTS
===================

NE (Win16) executables consist of multiple segments.  The Wine loader
loads each segment into a unique location in the Wine processes memory
and assigns a selector to that segment.  Because of this, it's not
possible to exchange addresses freely between 16-bit and 32-bit code.
Addresses used by 16-bit code are segmented addresses (16:16), formed
by a 16-bit selector and a 16-bit offset.  Those used by the Wine code
are regular 32-bit linear addresses.

There are four ways to obtain a segmented pointer:
  - Using the MapLS function (recommended).
  - Allocate a block of memory from the global heap and use
    WIN16_GlobalLock to get its segmented address.
  - Declare the argument as 'segptr' instead of 'ptr' in the spec file
    for a given API function.

Once you have a segmented pointer, it must be converted to a linear
pointer before you can use it from 32-bit code.  This can be done with
the MapSL function.  The linear pointer can then be used freely with
standard Unix functions like memcpy() etc. without worrying about 64k
boundaries.  Note: there's no easy way to convert back from a linear
to a segmented address.

In most cases, you don't need to worry about segmented address, as the
conversion is made automatically by the callback code and the API
functions only see linear addresses. However, in some cases it is
necessary to manipulate segmented addresses; the most frequent cases
are:
  - API functions that return a pointer
  - lParam of Windows messages that point to a structure
  - Pointers contained inside structures accessed by 16-bit code.

It is usually a good practice to used the type 'SEGPTR' for segmented
pointers, instead of something like 'LPSTR' or 'char *'.  As SEGPTR is
defined as a DWORD, you'll get a compilation warning if you mistakenly
use it as a regular 32-bit pointer.


STRUCTURE PACKING
=================

Under Windows, data structures are tightly packed, i.e. there is no
padding between structure members. On the other hand, by default gcc
aligns structure members (e.g. WORDs are on a WORD boundary, etc.).
This means that a structure like

struct { BYTE x; WORD y; };

will take 3 bytes under Windows, but 4 with gcc, because gcc will add a
dummy byte between x and y. To have the correct layout for structures
used by Windows code, you need to embed the struct within two special
#include's which will take care of the packing for you:

#include "pshpack1.h"
struct { BYTE x; WORD y; };
#include "poppack1.h"

For alignment on a 2-byte boundary, there is a "pshpack2.h", etc.

The use of the WINE_PACKED attribute is obsolete. Please remove these 
in favour of the above solution. 
Using WINE_PACKED, you would declare the above structure like this:

struct { BYTE x; WORD y WINE_PACKED; };

You had to do this every time a structure member is not aligned
correctly under Windows (i.e. a WORD not on an even address, or a
DWORD on a address that was not a multiple of 4).


NAMING CONVENTIONS FOR API FUNCTIONS AND TYPES
==============================================

In order to support both Win16 and Win32 APIs within the same source
code, the following convention must be used in naming all API
functions and types. If the Windows API uses the name 'xxx', the Wine
code must use:

 - 'xxx16' for the Win16 version,
 - 'xxx'   for the Win32 version when no ASCII/Unicode strings are
   involved,
 - 'xxxA'  for the Win32 version with ASCII strings,
 - 'xxxW'  for the Win32 version with Unicode strings.

If the function has both ASCII and Unicode version, you should then
use the macros WINELIB_NAME_AW(xxx) or DECL_WINELIB_TYPE_AW(xxx)
(defined in include/windef.h) to define the correct 'xxx' function
or type for Winelib. When compiling Wine itself, 'xxx' is _not_
defined, meaning that code inside of Wine must always specify
explicitly the ASCII or Unicode version.

If 'xxx' is the same in Win16 and Win32, you can simply use the same
name as Windows, i.e. just 'xxx'.  If 'xxx' is Win16 only, you could
use the name as is, but it's preferable to use 'xxx16' to make it
clear it is a Win16 function.

Examples:

typedef struct { /* Win32 ASCII data structure */ } WNDCLASSA;
typedef struct { /* Win32 Unicode data structure */ } WNDCLASSW;
typedef struct { /* Win16 data structure */ } WNDCLASS16;
DECL_WINELIB_TYPE_AW(WNDCLASS);

ATOM RegisterClass16( WNDCLASS16 * );
ATOM RegisterClassA( WNDCLASSA * );
ATOM RegisterClassW( WNDCLASSW * );
#define RegisterClass WINELIB_NAME_AW(RegisterClass)

The Winelib user can then say:

    WNDCLASS wc = { ... };
    RegisterClass( &wc );

and this will use the correct declaration depending on the definition
of the UNICODE symbol.


NAMING CONVENTIONS FOR NON-API FUNCTIONS AND TYPES
==================================================

Functions and data which are internal to your code (or at least shouldn't be
visible to any Winelib or Windows program) should be preceded by
an identifier to the module:

Examples:

ENUMPRINTERS_GetDWORDFromRegistryA()    (in dlls/winspool/info.c)
IAVIFile_fnRelease()                    (in dlls/avifil32/avifile.c)
X11DRV_CreateDC()                       (in graphics/x11drv/init.c)

if you need prototypes for these, there are a few possibilities:
- within same source file only:
  put the prototypes at the top of your file and mark them as prototypes.
- within the same module:
  create a header file within the subdirectory where that module resides,
  e.g.  graphics/ddraw_private.h
- from a totally different module, or for use in winelib:
  you should never do that. Only exported APIs can be called across
  module boundaries.


DEBUG MESSAGES
==============

To display a message only during debugging, you normally write something
like this:

        TRACE("abc...");  or
        FIXME("abc...");  or
        WARN("abc...");   or
        ERR("abc...");

depending on the seriousness of the problem. (documentation/debugging.sgml
explains when it is appropriate to use each of them). You need to declare
the debug channel name at the top of the file (after the includes) using
the WINE_DEFAULT_DEBUG_CHANNEL macro, like so:

	WINE_DEFAULT_DEBUG_CHANNEL(win);

If your debugging code is more complex than just printf, you can use 
the macros:

	TRACE_ON(xxx), WARN_ON(xxx), ERR_ON(xxx) and FIXME_ON(xxx) 

to test if the given channel is enabled. Thus, you can write:

	if (TRACE_ON(win)) DumpSomeStructure(&str);

Don't worry about the inefficiency of the test. If it is permanently 
disabled (that is TRACE_ON(win) is 0 at compile time), the compiler will 
eliminate the dead code.

For more info about debugging messages, read:

http://www.winehq.org/site/docs/wine-devel/debugging


MORE INFO
=========

1. There is a FREE online version of the MSDN library (including
   documentation for the Win32 API) on http://msdn.microsoft.com/
   or http://www.msdn.com/

2. Windows apilist:  http://www.mentalis.org/apilist/apilist.php

3. http://www.sonic.net/~undoc/bookstore.html

4. In 1993 Dr. Dobbs Journal published a column called "Undocumented Corner".

5. www.geocities.com/SiliconValley/4942/
