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
		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)
			enhmetafiledrv/	- Enhanced metafile driver
			metafiledrv/	- 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
		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.
		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)
			mciXXX/   - Various MCI drivers
			midimap/  - MIDI mapper
			wavemap/  - Audio mapper
			winealsa/ - ALSA audio driver
			winearts/ - aRts audio driver
			winejack/ - JACK audio server driver
			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
	miscemu/		- the main Wine program
	server/			- the Wine server
	tools/			- relay code builder, resource compiler, etc.
	unicode/		- Unicode support shared


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

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

	files/			- KERNEL file I/O
	loader/			- KERNEL loader code
	memory/			- KERNEL memory management
	misc/			- KERNEL shell, registry, winsock, etc.
	msdos/			- KERNEL DOS support
	relay32/		- KERNEL 32-bit relay code
	scheduler/		- KERNEL process and thread management
	win32/			- KERNEL misc Win32 functions

	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/degug-msgs
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:

documentation/debug-msgs


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".
