Updated a lot of obsolete stuff.
diff --git a/DEVELOPERS-HINTS b/DEVELOPERS-HINTS
index 95bf84f..be8c993 100644
--- a/DEVELOPERS-HINTS
+++ b/DEVELOPERS-HINTS
@@ -10,37 +10,10 @@
there are also various tools, documentation, sample Winelib code, and
code specific to the binary loader.
-Wine API directories:
----------------------
+DLLs:
+-----
+ dlls/ - All the DLLs implemented by Wine
-KERNEL:
-
- files/ - file I/O
- memory/ - memory management
- scheduler/ - process and thread management
- winnls/ - National Language Support configuration files
-
-GDI:
-
- graphics/ - graphics drivers
- x11drv/ - X11 display driver
- win16drv/ -> see below
- ttydrv/ - tty display driver
- psdrv/ - PostScript graphics driver
- metafiledrv/ - metafile driver
- enhmetafiledrv/ - enhanced metafile driver
- wing/ - WinG (for games) internface
- objects/ - logical objects
-
-USER:
-
- controls/ - built-in widgets
- resources/ - built-in menu and message box resources
- windows/ - window management
-
-Other DLLs:
-
- dlls/ - Other system DLLs implemented by Wine
advapi32/ - crypto, systeminfo, security, eventlogging
avicap32/
avifil32/ - COM object to play AVI files
@@ -54,10 +27,15 @@
dplay/ - DirectX dplay
dplayx/ - DirectX dplayx
dsound/ - DirectX dsound
+ gdi/ - GDI (graphics calls)
+ enhmetafiledrv/ - enhanced metafile driver
+ metafiledrv/ - metafile driver
+ win16drv/ - support for Win16 printer drivers
glu32/
icmp/
imagehlp/ - PE (Portable Executable) Image Helper lib
imm32/
+ kernel/ - The Windows kernel
lzexpand/ - Liv-Zempel compression/decompression
mpr/ - Multi-Protocol Router (interface to various
network transport protocols)
@@ -95,14 +73,17 @@
shlwapi/
sti/
tapi32/ - telephone API
+ ttydrv/ - TTY display driver (Wine specific)
url
urlmon
+ user/ - Window management, standard controls, etc.
ver/ - File Installation Library (16 bit)
version/ - File Installation Library (32 bit)
win32s/
win87em/ - 80387 math-emulation
winaspi/ - 16 bit Advanced SCSI Peripheral Interface
winedos/ - DOS features and BIOS calls (interrupts)
+ wineps/ - Postscript driver (Wine specific)
winmm/ - multimedia (16 & 32 bit)
mciXXX/ - various MCI drivers
midimap/- midi mapper
@@ -115,45 +96,86 @@
winspool/ - Printing & Print Spooler
wintrust/
wnaspi32/ - 32 bit ASPI
+ x11drv/ - X11 display driver (Wine specific)
-Miscellaneous:
+Winelib programs:
+-----------------
- misc/ - shell, registry, winsock, etc.
- ipc/ - SysV IPC based interprocess communication
- win32/ - misc Win32 functions
+ programs/ - All the Winelib programs
+ avitools/
+ clock/
+ cmdlgtst/
+ control/
+ expand/
+ notepad/
+ osversioncheck/
+ progman/
+ regapi/
+ regedit/
+ regsvr32/
+ regtest/
+ uninstaller/
+ view/
+ wcmd/
+ wineconsole/
+ winedbg/
+ winefile/
+ winemine/
+ winepath/
+ winetest/
+ winhelp/
+ winver/
-Tools:
-------
+Support programs, libraries, etc:
+---------------------------------
+
+ documentation/ - some documentation
+ include/ - Windows standard includes
+ library/ - the Wine portability library
+ miscemu/ - the main Wine program
+ ole/ - global UUIDs static library
+ server/ - the Wine server
tools/ - relay code builder, new rc, bugreport
generator, wineconfigurator, etc.
- documentation/ - some documentation
+ unicode/ - Unicode support shared
-Binary loader specific directories:
------------------------------------
+Miscellaneous:
+--------------
- if1632/ - relay code
- miscemu/ - hardware instruction emulation
- graphics/win16drv/ - Win16 printer driver
- server/ - the main, controlling thread of wine
+Note: these directories will ultimately get moved into their
+respective dlls.
+
+ files/ - KERNEL file I/O
+ if1632/ - KERNEL relay code
+ 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
+
tsx11/ - thread-safe X11 wrappers (auto generated)
-Winelib specific directories:
------------------------------
-
- library/ - Required code for programs using Winelib
- programs/ - Extended samples / system utilities
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.
+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 [relay32/*.spec]. An
-unimplemented call will look like (from gdi32.spec)
+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.
@@ -224,71 +246,33 @@
following:
1. Create a directory <MyDll> where to store the implementation of
- the DLL.
-
- If the DLL exists under Windows as both 16 and 32 bit DLL, you can
- either create one directory for each, or have a single directory
- with both implementations.
-
- This (those) directory(ies) have to be put under the dlls/
- directory in Wine tree structure.
+ 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.
- You need at least to change the MODULE, SPEC_SRCS, 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)
-3. Add the directory (and the generated .o file for the module) in:
- + ./configure.in (in AC_OUTPUT macro at the end of the file to
- trigger the Makefile generation),
- + ./Makefile.in (in LIBSUBDIRS and LIBOBJS macros)
- + ./dlls/Makefile.in (in SUBDIRS macro)
+4. Run ./make_dlls in the dlls directory to update Makefile.in in
+ that directory.
-4. You can now regenerate ./configure file (with 'make configure')
+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>/
- You shall now have a Makefile file in ./dlls/<MyDll>/
-
-5. You now need to declare the DLL in the module lists. This is done
- by adding the corresponding descriptor in ./if1632/builtin.c if
- your DLL is 16 bit (resp. ./relay32/builtin.c for a 32 bit DLL)
- (or both if your directory contains the dual 16/32
- implementations).
-
- Note: the name of the descriptor is based on the module name, not
- on the file name (they are the same in most of the case, but for
- some DLLs it's not the case).
-
-6. You also need to define the loadorder for the created DLL
- (./wine.ini and ./loader/loadorder.c). Usually, "native,builtin"
- is ok. If you have written a paired 16/32 bit implementation, don't
- forget to define it also in those files.
-
-7. Create the .spec file for the DLL export points in your
+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.
-8. Don't forget the .cvsignore file. The .cvsignore contain (on a per
- directory basis) all the files generated by the compilation
- process, why cvs shall ignore when processing the dir.
- *.o is in there by default, but in Wine case you will find:
- - Makefile (generated from Makefile.in)
- - *.spec.c: those c files are generated by tools/build from the
- .spec file
- - when thunking down to 16 bit DLLs, you'll get some others (.glue.c)
- - result of .y => .c translation (by yacc or bison)
- - result of .rc compilation
- - ...
- For a simple DLL, listing in .cvsignore Makefile and
- <MyDll>.spec.c will do.
-
-9. You can now start adding .c files.
-
-10. 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.
+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
--------------
@@ -301,18 +285,9 @@
---------
If you also need to add resources to your DLL, the create the .rc
-file. Since, the .rc file will be translated into a .s file, and then
-compiled as a .o file, its basename must be different from the
-basename of any .c file.
-Add to your ./dlls/<MyDll>/Makefile.in, in the RC_SRCS macro, the list
-of .rc files to add to the DLL. You may also have to add the following
-directives
-1/ to tell gnumake to translate .rc into .s files,
- $(RC_SRCS:.rc=.s): $(WRC)
-2/ to give some parameters to wrc for helping the translation.
- WRCEXTRA = -s -p$(MODULE)
-
-See dlls/comctl32/ for an example of this.
+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
--------
@@ -330,10 +305,11 @@
maps to WORD,WORD,LONG,LONG,LONG.
You can put several functions between the Start/Stop build pair.
-You can also read tools/build.txt for more details on this.
+You can also read the winebuild manpage for more details on this.
-Then, add to ./dlls/<MyDll>/Makefile.in to the macro GLUE the list of
-.c files containing the /* ### Start build ### */ directives.
+Then, add to ./dlls/<MyDll>/Makefile.in a line like:
+
+EXTRA_OBJS = $(MODULE).glue.o
See dlls/winmm/ for an example of this.
@@ -349,21 +325,18 @@
are regular 32-bit linear addresses.
There are four ways to obtain a segmented pointer:
- - Use the SEGPTR_* macros in include/heap.h (recommended).
+ - Using the MapLS function (recommended).
- Allocate a block of memory from the global heap and use
WIN16_GlobalLock to get its segmented address.
- - Allocate a block of memory from a local heap, and build the
- segmented address from the local heap selector (see the
- USER_HEAP_* macros for an example of this).
- 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 PTR_SEG_TO_LIN() and PTR_SEG_OFF_TO_LIN() macros. 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.
+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
@@ -471,8 +444,6 @@
ENUMPRINTERS_GetDWORDFromRegistryA() (in dlls/winspool/info.c)
IAVIFile_fnRelease() (in dlls/avifil32/avifile.c)
X11DRV_CreateDC() (in graphics/x11drv/init.c)
-TIMER_Init() (implemented in windows/timer.c,
- used in loader/main.c )
if you need prototypes for these, there are a few possibilities:
- within same source file only:
@@ -481,27 +452,8 @@
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:
- put your header file entry in /include/wine/
- but be careful not to clutter this directory!
-under no circumstances, you should add non-api calls to the standard
-windoze include files. Unfortunately, this is often the case, e.g.
-the above example of TIMER_Init is defined in include/message.h
-
-
-API ENTRY POINTS
-================
-
-Because Win16 programs use a 16-bit stack and because they can only
-call 16:16 addressed functions, all API entry points must be at low
-address offsets and must have the arguments translated and moved to
-Wines 32-bit stack. This task is handled by the code in the "if1632"
-directory. To define a new API entry point handler you must place a
-new entry in the appropriate API specification file. These files are
-named *.spec. For example, the API specification file for the USER
-DLL is contained in the file user.spec. These entries are processed
-by the "build" program to create an assembly file containing the entry
-point code for each API call. The format of the *.spec files is
-documented in the file "tools/build-spec.txt".
+ you should never do that. Only exported APIs can be called across
+ module boundaries.
DEBUG MESSAGES