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)
		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
		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)
		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/winejack/	- JACK audio server 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
	miscemu/		- the main Wine program
	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
	loader/			- KERNEL loader code
	memory/			- KERNEL memory management
	misc/			- KERNEL shell, registry, winsock, etc.
	msdos/			- KERNEL DOS support
	scheduler/		- KERNEL process and thread management

	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/
