Douglas Ridgway | 692389d | 1998-11-22 16:56:44 +0000 | [diff] [blame] | 1 | This document should help new developers get started. Like all of Wine, it |
| 2 | is a work in progress. |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 3 | |
Klaas van Gend | 0a7aa16 | 1999-06-05 11:52:46 +0000 | [diff] [blame] | 4 | |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 5 | SOURCE TREE STRUCTURE |
| 6 | ===================== |
| 7 | |
Douglas Ridgway | 692389d | 1998-11-22 16:56:44 +0000 | [diff] [blame] | 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 |
Jeff Smith | 344ed41 | 2002-12-24 00:56:33 +0000 | [diff] [blame] | 11 | code specific to the binary loader. Note that several of the libraries |
| 12 | listed here are "stubbed out", meaning they still need to be implemented. |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 13 | |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 14 | DLLs (under dlls/): |
| 15 | ------------------- |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 16 | |
Dimi Paun | 2d088c0 | 2005-07-26 10:33:10 +0000 | [diff] [blame] | 17 | activeds/ - Active Directory Service Interface |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 18 | advapi32/ - Crypto, systeminfo, security, eventlogging |
Tom Wickline | d8f4a0a | 2004-11-22 18:28:18 +0000 | [diff] [blame] | 19 | advpack/ - Reads and verifies .INF files |
Tom Wickline | c5da9b2 | 2004-05-13 19:40:53 +0000 | [diff] [blame] | 20 | amstream/ - MultiMedia Streams |
Dimitrie O. Paun | 206937e | 2004-09-22 19:10:37 +0000 | [diff] [blame] | 21 | atl/ - Active Template Library |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 22 | avicap32/ - AVI capture window class |
| 23 | avifil32/ - COM object to play AVI files |
| 24 | cabinet/ - Cabinet file interface |
| 25 | capi2032/ - Wrapper library for CAPI4Linux access |
Tom Wickline | c5da9b2 | 2004-05-13 19:40:53 +0000 | [diff] [blame] | 26 | cards/ - Card graphics |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 27 | cfgmgr32/ - Config manager |
| 28 | comcat/ - Component category manager |
| 29 | comctl32/ - Common controls |
| 30 | commdlg/ - Common dialog boxes (both 16 & 32 bit) |
| 31 | crtdll/ - Old C runtime library |
| 32 | crypt32/ - Cryptography |
Dimitrie O. Paun | 1b5bc2a | 2005-04-11 12:52:20 +0000 | [diff] [blame] | 33 | cryptdll/ - Cryptography Manager |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 34 | ctl3d/ - 3D Effects for Common GUI Components |
| 35 | d3d8/ - Direct3D (3D graphics) |
| 36 | d3d9/ - Direct3D (3D graphics) |
| 37 | d3dim/ - Direct3D Immediate Mode |
Ivan Leo Murray-Smith | 8f14eb0 | 2004-05-18 00:54:12 +0000 | [diff] [blame] | 38 | d3drm/ - Direct3D Retained Mode |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 39 | d3dx8/ - Direct3D (3D graphics) |
Tom Wickline | 49e5fda | 2004-08-11 23:46:01 +0000 | [diff] [blame] | 40 | d3dxof/ - DirectX Files Functions |
Tom Wickline | c5da9b2 | 2004-05-13 19:40:53 +0000 | [diff] [blame] | 41 | dbghelp/ - Engine for symbol and module enumeration |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 42 | dciman32/ - DCI Manager (graphics) |
| 43 | ddraw/ - DirectDraw (graphics) |
| 44 | devenum/ - Device enumeration (part of DirectShow) |
| 45 | dinput/ - DirectInput (device input) |
| 46 | dinput8/ - DirectInput (device input) |
Tom Wickline | c24c30f | 2003-12-31 00:11:25 +0000 | [diff] [blame] | 47 | dmband/ - DirectMusic Band |
| 48 | dmcompos/ - DirectMusic Composer |
| 49 | dmime/ - DirectMusic Interactive Engine |
| 50 | dmloader/ - DirectMusic Loader |
| 51 | dmscript/ - DirectMusic Scripting |
| 52 | dmstyle/ - DirectMusic Style Engine |
| 53 | dmsynth/ - DirectMusic Software Synthesizer |
| 54 | dmusic/ - DirectMusic Core Services |
| 55 | dmusic32/ - DirectMusic Legacy Port |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 56 | dplay/ - DirectPlay (networking) |
| 57 | dplayx/ - DirectPlay (networking) |
Tom Wickline | c5da9b2 | 2004-05-13 19:40:53 +0000 | [diff] [blame] | 58 | dpnet/ - DirectPlay (networking) |
Tom Wickline | c24c30f | 2003-12-31 00:11:25 +0000 | [diff] [blame] | 59 | dpnhpast/ - DirectPlay NAT Helper PAST |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 60 | dsound/ - DirectSound (audio) |
Dimitrie O. Paun | d9e53ca | 2004-02-11 23:58:16 +0000 | [diff] [blame] | 61 | dswave/ - DirectMusic Wave |
Tom Wickline | c5da9b2 | 2004-05-13 19:40:53 +0000 | [diff] [blame] | 62 | dxdiagn/ - DirectX Diagnostic Tool |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 63 | gdi/ - GDI (graphics) |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 64 | glu32/ - OpenGL Utility library (graphics) |
Dimitrie O. Paun | 7470fa7 | 2003-12-13 03:20:03 +0000 | [diff] [blame] | 65 | glut32/ - OpenGL Utility Toolkit |
Tom Wickline | c5da9b2 | 2004-05-13 19:40:53 +0000 | [diff] [blame] | 66 | hhctrl.ocx/ - HHCTRL OCX implementation |
Dimitrie O. Paun | d9e53ca | 2004-02-11 23:58:16 +0000 | [diff] [blame] | 67 | iccvid/ - Radius Cinepak Video Decoder |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 68 | icmp/ - ICMP protocol (networking) |
Dimitrie O. Paun | 29872b8 | 2004-02-20 05:13:05 +0000 | [diff] [blame] | 69 | ifsmgr.vxd/ - IFSMGR VxD implementation |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 70 | imagehlp/ - PE (Portable Executable) Image Helper lib |
| 71 | imm32/ - Input Method Manager |
| 72 | iphlpapi/ - IP Helper API |
Mike McCormack | 9120742 | 2004-09-14 17:43:24 +0000 | [diff] [blame] | 73 | itss/ - Infotech Structured Storage (HTML Help) |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 74 | kernel/ - The Windows kernel |
| 75 | lzexpand/ - Lempel-Ziv compression/decompression |
| 76 | mapi32/ - Mail interface |
Dimi Paun | 2d088c0 | 2005-07-26 10:33:10 +0000 | [diff] [blame] | 77 | midimap/ - MIDI mapper |
Tom Wickline | 49e5fda | 2004-08-11 23:46:01 +0000 | [diff] [blame] | 78 | mlang/ - Multi Language Support |
Dimitrie O. Paun | 29872b8 | 2004-02-20 05:13:05 +0000 | [diff] [blame] | 79 | mmdevldr.vxd/ - MMDEVLDR VxD implementation |
| 80 | monodebg.vxd/ - MONODEBG VxD implementation |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 81 | mpr/ - Multi-Protocol Router (networking) |
| 82 | msacm/ - Audio Compression Manager (multimedia) |
Dimitrie O. Paun | 7470fa7 | 2003-12-13 03:20:03 +0000 | [diff] [blame] | 83 | msacm/imaadp32/ - IMA ADPCM Audio Codec |
| 84 | msacm/msadp32/ - MS ADPCM Audio Codec |
| 85 | msacm/msg711/ - MS G711 Audio Codec (includes A-Law & MU-Law) |
| 86 | msacm/winemp3/ - Mpeg Layer 3 Audio Codec |
Hans Leidekker | 5164757 | 2004-09-22 04:08:38 +0000 | [diff] [blame] | 87 | mscms/ - Color Management System |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 88 | msdmo/ - DirectX Media Objects |
Dimitrie O. Paun | 7470fa7 | 2003-12-13 03:20:03 +0000 | [diff] [blame] | 89 | mshtml/ - MS HTML component |
Tom Wickline | c5da9b2 | 2004-05-13 19:40:53 +0000 | [diff] [blame] | 90 | msi/ - Microsoft Installer |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 91 | msimg32/ - Gradient and transparency (graphics) |
| 92 | msisys/ - System information |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 93 | msnet32/ - Network interface |
Tom Wickline | 49e5fda | 2004-08-11 23:46:01 +0000 | [diff] [blame] | 94 | msrle32/ - Video codecs |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 95 | msvcrt/ - C runtime library |
| 96 | msvcrt20/ - C runtime library version 2.0 |
Dimitrie O. Paun | d9e53ca | 2004-02-11 23:58:16 +0000 | [diff] [blame] | 97 | msvcrt40/ - C runtime library version 4.0 |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 98 | msvcrtd/ - C runtime library debugging |
Dimitrie O. Paun | d9e53ca | 2004-02-11 23:58:16 +0000 | [diff] [blame] | 99 | msvidc32/ - Microsoft Video-1 Decoder |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 100 | msvideo/ - 16 bit video manager |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 101 | mswsock/ - Misc networking |
Tom Wickline | 767dd36 | 2005-08-23 18:14:52 +0000 | [diff] [blame] | 102 | msxml3/ - MSXML Class Factory |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 103 | netapi32/ - Network interface |
Tom Wickline | c24c30f | 2003-12-31 00:11:25 +0000 | [diff] [blame] | 104 | newdev/ - New Hardware Device Library |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 105 | ntdll/ - NT implementation of kernel calls |
Thomas Weidenmueller | 96e052b | 2005-07-26 11:30:42 +0000 | [diff] [blame] | 106 | objsel/ - Object Picker Dialog |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 107 | odbc32/ - Open DataBase Connectivity driver manager |
Dimi Paun | 2d088c0 | 2005-07-26 10:33:10 +0000 | [diff] [blame] | 108 | odbccp32/ - Open DataBase Connectivity driver installer |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 109 | ole32/ - 32 bit OLE 2.0 libraries |
Dimitrie O. Paun | 7470fa7 | 2003-12-13 03:20:03 +0000 | [diff] [blame] | 110 | oleacc/ - OLE accessibility support |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 111 | oleaut32/ - 32 bit OLE 2.0 automation |
| 112 | olecli/ - 16 bit OLE client |
| 113 | oledlg/ - OLE 2.0 user interface support |
| 114 | olepro32/ - 32 bit OLE 2.0 automation |
| 115 | olesvr/ - 16 bit OLE server |
| 116 | opengl32/ - OpenGL implementation (graphics) |
Benjamin Cutler | 250a8ae | 2005-04-20 19:15:31 +0000 | [diff] [blame] | 117 | powrprof/ - Power Management and Profiling |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 118 | psapi/ - Process Status interface |
| 119 | qcap/ - DirectShow runtime |
| 120 | quartz/ - DirectShow runtime |
| 121 | rasapi32/ - Remote Access Server interface |
Tom Wickline | a812b61 | 2005-03-15 15:39:51 +0000 | [diff] [blame] | 122 | riched20/ - Rich text editing control version 2.0 |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 123 | richedit/ - Rich text editing control |
| 124 | rpcrt4/ - Remote Procedure Call runtime |
Dimitrie O. Paun | 8e7f81c | 2004-02-16 20:33:37 +0000 | [diff] [blame] | 125 | rsabase/ - RSA encryption |
Dimi Paun | 2d088c0 | 2005-07-26 10:33:10 +0000 | [diff] [blame] | 126 | rsaenh/ - Crypto API (DES, 3DES, RSA, etc.) |
Tom Wickline | c5da9b2 | 2004-05-13 19:40:53 +0000 | [diff] [blame] | 127 | secur32/ - Contains Windows Security functions |
Tom Wickline | a812b61 | 2005-03-15 15:39:51 +0000 | [diff] [blame] | 128 | sensapi/ - System Event Notification Service |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 129 | serialui/ - Serial port property pages |
| 130 | setupapi/ - Setup interface |
Detlef Riekenberg | aa318d1 | 2006-02-14 16:53:03 +0100 | [diff] [blame] | 131 | sfc/ - System File Checker (Windows File Protection) |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 132 | shdocvw/ - Shell document object and control |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 133 | shell32/ - COM object implementing shell views |
Tom Wickline | c5da9b2 | 2004-05-13 19:40:53 +0000 | [diff] [blame] | 134 | shfolder/ - Shell folder service |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 135 | shlwapi/ - Shell Light-Weight interface |
| 136 | snmpapi/ - SNMP protocol interface (networking) |
Dimi Paun | 2d088c0 | 2005-07-26 10:33:10 +0000 | [diff] [blame] | 137 | stdole2.tlb/ - OLE Automation typelib |
Dimitrie O. Paun | 1b5bc2a | 2005-04-11 12:52:20 +0000 | [diff] [blame] | 138 | stdole32.tlb/ - Standard OLE typelib |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 139 | sti/ - Still Image service |
| 140 | tapi32/ - Telephone interface |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 141 | twain/ - TWAIN Imaging device communications |
Dimitrie O. Paun | 7470fa7 | 2003-12-13 03:20:03 +0000 | [diff] [blame] | 142 | unicows/ - Unicows replacement (Unicode layer for Win9x) |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 143 | url/ - Internet shortcut shell extension |
Dimi Paun | 2d088c0 | 2005-07-26 10:33:10 +0000 | [diff] [blame] | 144 | urlmon/ - URL Moniker allows binding to a URL |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 145 | user/ - Window management, standard controls, etc. |
Tom Wickline | 767dd36 | 2005-08-23 18:14:52 +0000 | [diff] [blame] | 146 | usp10/ - Uniscribe Script Processor |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 147 | uxtheme/ - Theme library |
Dimitrie O. Paun | 29872b8 | 2004-02-20 05:13:05 +0000 | [diff] [blame] | 148 | vdhcp.vxd/ - VDHCP VxD implementation |
Tom Wickline | 49e5fda | 2004-08-11 23:46:01 +0000 | [diff] [blame] | 149 | vdmdbg/ - Virtual DOS machine debug library |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 150 | version/ - File installation library |
Dimitrie O. Paun | 31dd689 | 2004-02-25 01:25:21 +0000 | [diff] [blame] | 151 | vmm.vxd/ - VMM VxD implementation |
Tom Wickline | c5da9b2 | 2004-05-13 19:40:53 +0000 | [diff] [blame] | 152 | vnbt.vxd/ - VNBT VxD implementation |
Dimitrie O. Paun | 29872b8 | 2004-02-20 05:13:05 +0000 | [diff] [blame] | 153 | vnetbios.vxd/ - VNETBIOS VxD implementation |
| 154 | vtdapi.vxd/ - VTDAPI VxD implementation |
| 155 | vwin32.vxd/ - VWIN32 VxD implementation |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 156 | win32s/ - 32-bit function access for 16-bit systems |
| 157 | winaspi/ - 16 bit Advanced SCSI Peripheral Interface |
Dimitrie O. Paun | 7470fa7 | 2003-12-13 03:20:03 +0000 | [diff] [blame] | 158 | wined3d/ - Wine internal Direct3D helper |
Dimi Paun | 2d088c0 | 2005-07-26 10:33:10 +0000 | [diff] [blame] | 159 | winedos/ - DOS features and BIOS calls (Wine specific) |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 160 | wineps/ - Postscript driver (Wine specific) |
| 161 | wininet/ - Internet extensions |
| 162 | winmm/ - Multimedia (16 & 32 bit) |
| 163 | winmm/joystick/ - Joystick driver |
| 164 | winmm/mcianim/ - MCI animation driver |
| 165 | winmm/mciavi/ - MCI video driver |
| 166 | winmm/mcicda/ - MCI audio CD driver |
| 167 | winmm/mciseq/ - MCI MIDI driver |
| 168 | winmm/mciwave/ - MCI wave driver |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 169 | winmm/wavemap/ - Audio mapper |
| 170 | winmm/winealsa/ - ALSA audio driver |
| 171 | winmm/winearts/ - aRts audio driver |
| 172 | winmm/wineaudioio/ - audioio audio driver |
| 173 | winmm/winejack/ - JACK audio server driver |
| 174 | winmm/winenas/ - NAS audio driver |
| 175 | winmm/wineoss/ - OSS audio driver |
| 176 | winnls/ - National Language Support |
| 177 | winsock/ - Sockets 2.0 (networking) |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 178 | winspool/ - Printing & Print Spooler |
Tom Wickline | c5da9b2 | 2004-05-13 19:40:53 +0000 | [diff] [blame] | 179 | wintab32/ - Tablet device interface |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 180 | wintrust/ - Trust verification interface |
Hans Leidekker | 8d63dfb | 2005-07-13 11:56:15 +0000 | [diff] [blame] | 181 | wldap32/ - LDAP support |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 182 | wow32/ - WOW subsystem |
Tom Wickline | c5da9b2 | 2004-05-13 19:40:53 +0000 | [diff] [blame] | 183 | wsock32/ - Sockets 1.1 (networking) |
Tom Wickline | a812b61 | 2005-03-15 15:39:51 +0000 | [diff] [blame] | 184 | wtsapi32/ - Terminal Services |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 185 | x11drv/ - X11 display driver (Wine specific) |
Douglas Ridgway | 692389d | 1998-11-22 16:56:44 +0000 | [diff] [blame] | 186 | |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 187 | Winelib programs (under programs/): |
| 188 | ----------------------------------- |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 189 | |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 190 | avitools/ - AVI information viewer and player |
| 191 | clock/ - Graphical clock |
| 192 | cmdlgtst/ - Common dialog tests |
| 193 | control/ - Control panel |
| 194 | expand/ - Decompress Lempel-Ziv compressed archive |
Mike McCormack | 3565f5f | 2004-08-17 22:07:44 +0000 | [diff] [blame] | 195 | msiexec/ - Microsoft Installer frontend |
Steven Edwards | 26fe914 | 2004-05-05 05:53:37 +0000 | [diff] [blame] | 196 | notepad/ - Notepad replacement |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 197 | progman/ - Program manager |
| 198 | regedit/ - Registry editor |
| 199 | regsvr32/ - Register COM server |
| 200 | rpcss/ - RPC services |
| 201 | rundll32/ - Execute DLL functions directly |
| 202 | start/ - Replacement for start.exe |
Steven Edwards | 26fe914 | 2004-05-05 05:53:37 +0000 | [diff] [blame] | 203 | taskmgr/ - Manage running Windows/Winelib applications |
Dimitrie O. Paun | ab9cd6e | 2003-12-08 21:48:39 +0000 | [diff] [blame] | 204 | uninstaller/ - Remove installed programs |
| 205 | view/ - Metafile viewer |
| 206 | wcmd/ - Command line interface |
| 207 | wineboot/ - Wine bootstrap process |
| 208 | winecfg/ - Wine configuration utility |
| 209 | wineconsole/ - Console |
| 210 | winedbg/ - Debugger |
| 211 | winefile/ - File manager |
| 212 | winemenubuilder/ - Helper program for building Unix menu entries |
| 213 | winemine/ - Mine game |
| 214 | winepath/ - Translate between Wine and Unix paths |
| 215 | winetest/ - Wine testing shell |
| 216 | winevdm/ - Wine virtual DOS machine |
| 217 | winhelp/ - Help viewer |
| 218 | winver/ - Windows Version Program |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 219 | |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 220 | |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 221 | Support programs, libraries, etc: |
| 222 | --------------------------------- |
| 223 | |
Robert Reif | cc02d95 | 2004-03-09 23:25:57 +0000 | [diff] [blame] | 224 | dlls/dxerr8/ - DirectX 8 error import lib |
| 225 | dlls/dxerr9/ - DirectX 9 error import lib |
Dimitrie O. Paun | 6d4e392 | 2004-01-27 20:07:43 +0000 | [diff] [blame] | 226 | dlls/dxguid/ - DirectX UUID import lib |
Dimi Paun | 2d088c0 | 2005-07-26 10:33:10 +0000 | [diff] [blame] | 227 | dlls/strmiids/ - Exports class CLSIDs and interface IIDs |
Dimitrie O. Paun | 6d4e392 | 2004-01-27 20:07:43 +0000 | [diff] [blame] | 228 | dlls/uuid/ - Windows-compatible UUID import lib |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 229 | documentation/ - some documentation |
| 230 | include/ - Windows standard includes |
Dimitrie O. Paun | 6d4e392 | 2004-01-27 20:07:43 +0000 | [diff] [blame] | 231 | include/msvcrt/ - MSVC compatible libc headers |
| 232 | include/wine/ - Wine specific headers |
Mike Hearn | 4ebc806 | 2003-08-27 02:03:52 +0000 | [diff] [blame] | 233 | libs/ - the Wine libraries |
Dimitrie O. Paun | 7d2aefd | 2003-09-22 19:26:32 +0000 | [diff] [blame] | 234 | libs/port/ - portability library |
| 235 | libs/unicode/ - Unicode support shared |
Dimitrie O. Paun | 7d2aefd | 2003-09-22 19:26:32 +0000 | [diff] [blame] | 236 | libs/wine/ - Wine bootstrap library |
| 237 | libs/wpp/ - C preprocessor |
Alexandre Julliard | 357c740 | 2003-11-06 01:17:56 +0000 | [diff] [blame] | 238 | loader/ - the main Wine loader |
Jeff Smith | 344ed41 | 2002-12-24 00:56:33 +0000 | [diff] [blame] | 239 | server/ - the Wine server |
Dimitrie O. Paun | 6be1997 | 2003-12-12 04:09:12 +0000 | [diff] [blame] | 240 | tools/ - various tools used to build/check Wine |
Dimitrie O. Paun | 6d4e392 | 2004-01-27 20:07:43 +0000 | [diff] [blame] | 241 | tools/widl/ - the IDL compiler |
Hans Leidekker | f98e3a3 | 2006-01-04 14:49:12 +0100 | [diff] [blame] | 242 | tools/winapi/ - A Win32 API checker |
Dimitrie O. Paun | 6d4e392 | 2004-01-27 20:07:43 +0000 | [diff] [blame] | 243 | tools/winebuild/ - Wine build tool |
| 244 | tools/winedump/ - a .DLL dump utility |
| 245 | tools/winegcc/ - a MinGW command line compatible gcc wrapper |
| 246 | tools/wmc/ - the message compiler |
| 247 | tools/wpp/ - the C pre-processor library |
| 248 | tools/wrc/ - the resource compiler |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 249 | |
| 250 | |
Klaas van Gend | 0a7aa16 | 1999-06-05 11:52:46 +0000 | [diff] [blame] | 251 | |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 252 | IMPLEMENTING NEW API CALLS |
| 253 | ========================== |
| 254 | |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 255 | This is the simple version, and covers only Win32. Win16 is slightly |
| 256 | uglier, because of the Pascal heritage and the segmented memory model. |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 257 | |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 258 | All of the Win32 APIs known to Wine are listed in the .spec file of |
| 259 | their corresponding dll. An unimplemented call will look like (from |
| 260 | gdi32.spec) |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 261 | 269 stub PolyBezierTo |
| 262 | To implement this call, you need to do the following four things. |
| 263 | |
| 264 | 1. Find the appropriate parameters for the call, and add a prototype to |
Klaas van Gend | 0a7aa16 | 1999-06-05 11:52:46 +0000 | [diff] [blame] | 265 | the correct header file. In this case, that means [include/wingdi.h], |
| 266 | and it might look like |
Alexandre Julliard | 9f69d89 | 1999-02-26 12:33:21 +0000 | [diff] [blame] | 267 | BOOL WINAPI PolyBezierTo(HDC, LPCVOID, DWORD); |
| 268 | If the function has both an ASCII and a Unicode version, you need to |
| 269 | define both and add a #define WINELIB_NAME_AW declaration. See below |
| 270 | for discussion of function naming conventions. |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 271 | |
| 272 | 2. Modify the .spec file to tell Wine that the function has an |
| 273 | implementation, what the parameters look like and what Wine function |
| 274 | to use for the implementation. In Win32, things are simple--everything |
| 275 | is 32-bits. However, the relay code handles pointers and pointers to |
| 276 | strings slightly differently, so you should use 'str' and 'wstr' for |
| 277 | strings, 'ptr' for other pointer types, and 'long' for everything else. |
Alexandre Julliard | 9f69d89 | 1999-02-26 12:33:21 +0000 | [diff] [blame] | 278 | 269 stdcall PolyBezierTo(long ptr long) PolyBezierTo |
| 279 | The 'PolyBezierTo' at the end of the line is which Wine function to use |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 280 | for the implementation. |
| 281 | |
| 282 | 3. Implement the function as a stub. Once you add the function to the .spec |
| 283 | file, you must add the function to the Wine source before it will link. |
Alexandre Julliard | 9f69d89 | 1999-02-26 12:33:21 +0000 | [diff] [blame] | 284 | Add a function called 'PolyBezierTo' somewhere. Good things to put |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 285 | into a stub: |
| 286 | o a correct prototype, including the WINAPI |
| 287 | o header comments, including full documentation for the function and |
Klaas van Gend | 0a7aa16 | 1999-06-05 11:52:46 +0000 | [diff] [blame] | 288 | arguments (see documentation/README.documentation) |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 289 | o A FIXME message and an appropriate return value are good things to |
| 290 | put in a stub. |
| 291 | |
| 292 | /************************************************************ |
Klaas van Gend | 0a7aa16 | 1999-06-05 11:52:46 +0000 | [diff] [blame] | 293 | * PolyBezierTo (GDI32.269) |
| 294 | * |
Jon Griffiths | f554f8f | 2003-07-18 22:54:14 +0000 | [diff] [blame] | 295 | * Draw many Bezier curves. |
Klaas van Gend | 0a7aa16 | 1999-06-05 11:52:46 +0000 | [diff] [blame] | 296 | * |
Dimitrie O. Paun | d0bc4c2 | 2004-02-13 04:00:52 +0000 | [diff] [blame] | 297 | * PARAMS |
| 298 | * hdc [I] Device context to draw to |
| 299 | * p [I] Array of POINT structs |
| 300 | * count [I] Number of points in p |
| 301 | * |
Klaas van Gend | 0a7aa16 | 1999-06-05 11:52:46 +0000 | [diff] [blame] | 302 | * RETURNS |
Jon Griffiths | f554f8f | 2003-07-18 22:54:14 +0000 | [diff] [blame] | 303 | * Success: Non-zero. |
| 304 | * Failure: FALSE. Use GetLastError() to find the error cause. |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 305 | * |
| 306 | * BUGS |
| 307 | * Unimplemented |
| 308 | */ |
Dimitrie O. Paun | d0bc4c2 | 2004-02-13 04:00:52 +0000 | [diff] [blame] | 309 | BOOL WINAPI PolyBezierTo(HDC hdc, LPCVOID p, DWORD count) |
Klaas van Gend | 0a7aa16 | 1999-06-05 11:52:46 +0000 | [diff] [blame] | 310 | { |
Dimitrie O. Paun | d0bc4c2 | 2004-02-13 04:00:52 +0000 | [diff] [blame] | 311 | /* tell the user they've got a substandard implementation */ |
Jon Griffiths | b9aba91 | 2004-11-30 17:23:37 +0000 | [diff] [blame] | 312 | FIXME("(%x,%p,%d): stub\n", hdc, p, count); |
Klaas van Gend | 0a7aa16 | 1999-06-05 11:52:46 +0000 | [diff] [blame] | 313 | |
Dimitrie O. Paun | d0bc4c2 | 2004-02-13 04:00:52 +0000 | [diff] [blame] | 314 | /* some programs may be able to compensate, |
| 315 | * if they know what happened |
| 316 | */ |
| 317 | SetLastError(ERROR_CALL_NOT_IMPLEMENTED); |
| 318 | return FALSE; /* error value */ |
Alexandre Julliard | c7c217b | 1998-04-13 12:21:30 +0000 | [diff] [blame] | 319 | } |
| 320 | |
Klaas van Gend | 0a7aa16 | 1999-06-05 11:52:46 +0000 | [diff] [blame] | 321 | 4. Implement and test the rest of the function. |
| 322 | |
Alexandre Julliard | 889f742 | 1997-04-15 17:19:52 +0000 | [diff] [blame] | 323 | |
Eric Pouech | 19dc208 | 1999-10-31 22:15:58 +0000 | [diff] [blame] | 324 | IMPLEMENTING A NEW DLL |
| 325 | ====================== |
| 326 | |
Eric Pouech | 31b41cf | 1999-12-05 02:16:24 +0000 | [diff] [blame] | 327 | Generic directions |
| 328 | ------------------ |
| 329 | |
Eric Pouech | 19dc208 | 1999-10-31 22:15:58 +0000 | [diff] [blame] | 330 | Apart from writing the set of needed .c files, you also need to do the |
| 331 | following: |
| 332 | |
| 333 | 1. Create a directory <MyDll> where to store the implementation of |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 334 | the DLL. This directory has to be put under the dlls/ directory. |
| 335 | If the DLL exists under Windows as both 16 and 32 bit DLL, you |
| 336 | should have a single directory with both implementations. |
Eric Pouech | 19dc208 | 1999-10-31 22:15:58 +0000 | [diff] [blame] | 337 | |
| 338 | 2. Create the Makefile.in in the ./dlls/<MyDll>/ directory. You can |
| 339 | copy an existing Makefile.in from another ./dlls/ subdirectory. |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 340 | You need at least to change the MODULE and C_SRCS macros. |
Eric Pouech | 19dc208 | 1999-10-31 22:15:58 +0000 | [diff] [blame] | 341 | |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 342 | 3. Add the directory in ./configure.ac (in AC_OUTPUT macro at the end |
| 343 | of the file to trigger the Makefile generation) |
Eric Pouech | 19dc208 | 1999-10-31 22:15:58 +0000 | [diff] [blame] | 344 | |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 345 | 4. Run ./make_dlls in the dlls directory to update Makefile.in in |
| 346 | that directory. |
Eric Pouech | 19dc208 | 1999-10-31 22:15:58 +0000 | [diff] [blame] | 347 | |
Mike McCormack | 69653da | 2005-07-03 11:21:43 +0000 | [diff] [blame] | 348 | 5. You can now regenerate ./configure file (with 'autoconf') |
Eric Pouech | 19dc208 | 1999-10-31 22:15:58 +0000 | [diff] [blame] | 349 | and the various Makefiles (with 'configure; make depend') (run |
| 350 | from the top of Wine's tree). |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 351 | You should now have a Makefile file in ./dlls/<MyDll>/ |
Eric Pouech | 19dc208 | 1999-10-31 22:15:58 +0000 | [diff] [blame] | 352 | |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 353 | 6. Create the .spec file for the DLL exported functions in your |
Eric Pouech | 19dc208 | 1999-10-31 22:15:58 +0000 | [diff] [blame] | 354 | directory. Refer to 'Implementation of new API calls' earlier in |
| 355 | this document for more information on this part. |
| 356 | |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 357 | 7. You can now start adding .c files. For the .h files, if they are |
| 358 | standard Windows one, put them in include/. If they are linked to |
| 359 | *your* implementation of the dll, put them in your newly created |
| 360 | directory. |
Eric Pouech | 19dc208 | 1999-10-31 22:15:58 +0000 | [diff] [blame] | 361 | |
Eric Pouech | 31b41cf | 1999-12-05 02:16:24 +0000 | [diff] [blame] | 362 | Debug channels |
| 363 | -------------- |
| 364 | |
Eric Pouech | 19dc208 | 1999-10-31 22:15:58 +0000 | [diff] [blame] | 365 | If you need to create a new debug channel, just add the |
Dimitrie O. Paun | d95ce8c | 2002-09-18 18:29:59 +0000 | [diff] [blame] | 366 | WINE_DEFAULT_DEBUG_CHANNEL to your .c file(s), and use them. |
| 367 | All the housekeeping will happen automatically. |
Eric Pouech | 19dc208 | 1999-10-31 22:15:58 +0000 | [diff] [blame] | 368 | |
Eric Pouech | 31b41cf | 1999-12-05 02:16:24 +0000 | [diff] [blame] | 369 | Resources |
| 370 | --------- |
| 371 | |
Jeff Smith | 344ed41 | 2002-12-24 00:56:33 +0000 | [diff] [blame] | 372 | If you also need to add resources to your DLL, then create the .rc |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 373 | file. Add to your ./dlls/<MyDll>/Makefile.in, in the RC_SRCS macro, |
| 374 | the list of .rc files to add to the DLL. See dlls/comctl32/ for an |
| 375 | example of this. |
Eric Pouech | 31b41cf | 1999-12-05 02:16:24 +0000 | [diff] [blame] | 376 | |
| 377 | Thunking |
| 378 | -------- |
| 379 | |
| 380 | If you're building a 16 & 32 bit DLLs pair, then from the 32 bit code |
| 381 | you might need to call 16 bit routine. The way to do it to add in the |
| 382 | code, fragments like: |
| 383 | /* ### Start build ### */ |
| 384 | extern WORD CALLBACK <PREFIX>_CallTo16_word_wwlll(FARPROC16,WORD,WORD,LONG,LONG,LONG); |
| 385 | /* ### stop build ### */ |
| 386 | Where <PREFIX>_ is an internal prefix for your module. The first |
| 387 | parameter is always of type FARPROC16. Then, you can get the regular |
| 388 | list of parameters. The _word_wwlll indicates the type of return (long |
| 389 | or word) and the size of the parameters (here l=>long, w=>word; which |
| 390 | maps to WORD,WORD,LONG,LONG,LONG. |
| 391 | You can put several functions between the Start/Stop build pair. |
| 392 | |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 393 | You can also read the winebuild manpage for more details on this. |
Eric Pouech | 31b41cf | 1999-12-05 02:16:24 +0000 | [diff] [blame] | 394 | |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 395 | Then, add to ./dlls/<MyDll>/Makefile.in a line like: |
| 396 | |
| 397 | EXTRA_OBJS = $(MODULE).glue.o |
Eric Pouech | 31b41cf | 1999-12-05 02:16:24 +0000 | [diff] [blame] | 398 | |
| 399 | See dlls/winmm/ for an example of this. |
| 400 | |
Alexandre Julliard | 1285c2f | 1996-05-06 16:06:24 +0000 | [diff] [blame] | 401 | MEMORY AND SEGMENTS |
| 402 | =================== |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 403 | |
| 404 | NE (Win16) executables consist of multiple segments. The Wine loader |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 405 | loads each segment into a unique location in the Wine processes memory |
| 406 | and assigns a selector to that segment. Because of this, it's not |
| 407 | possible to exchange addresses freely between 16-bit and 32-bit code. |
| 408 | Addresses used by 16-bit code are segmented addresses (16:16), formed |
| 409 | by a 16-bit selector and a 16-bit offset. Those used by the Wine code |
| 410 | are regular 32-bit linear addresses. |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 411 | |
Alexandre Julliard | 1e37a18 | 1996-08-18 16:21:52 +0000 | [diff] [blame] | 412 | There are four ways to obtain a segmented pointer: |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 413 | - Using the MapLS function (recommended). |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 414 | - Allocate a block of memory from the global heap and use |
| 415 | WIN16_GlobalLock to get its segmented address. |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 416 | - Declare the argument as 'segptr' instead of 'ptr' in the spec file |
| 417 | for a given API function. |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 418 | |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 419 | Once you have a segmented pointer, it must be converted to a linear |
| 420 | pointer before you can use it from 32-bit code. This can be done with |
Alexandre Julliard | c513a30 | 2002-09-18 23:11:19 +0000 | [diff] [blame] | 421 | the MapSL function. The linear pointer can then be used freely with |
| 422 | standard Unix functions like memcpy() etc. without worrying about 64k |
| 423 | boundaries. Note: there's no easy way to convert back from a linear |
| 424 | to a segmented address. |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 425 | |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 426 | In most cases, you don't need to worry about segmented address, as the |
| 427 | conversion is made automatically by the callback code and the API |
| 428 | functions only see linear addresses. However, in some cases it is |
| 429 | necessary to manipulate segmented addresses; the most frequent cases |
| 430 | are: |
| 431 | - API functions that return a pointer |
| 432 | - lParam of Windows messages that point to a structure |
| 433 | - Pointers contained inside structures accessed by 16-bit code. |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 434 | |
Alexandre Julliard | e2abbb1 | 1995-03-19 17:39:39 +0000 | [diff] [blame] | 435 | It is usually a good practice to used the type 'SEGPTR' for segmented |
| 436 | pointers, instead of something like 'LPSTR' or 'char *'. As SEGPTR is |
| 437 | defined as a DWORD, you'll get a compilation warning if you mistakenly |
| 438 | use it as a regular 32-bit pointer. |
Alexandre Julliard | dba420a | 1994-02-02 06:48:31 +0000 | [diff] [blame] | 439 | |
Alexandre Julliard | 1285c2f | 1996-05-06 16:06:24 +0000 | [diff] [blame] | 440 | |
Alexandre Julliard | 2d93d00 | 1996-05-21 15:01:41 +0000 | [diff] [blame] | 441 | STRUCTURE PACKING |
| 442 | ================= |
| 443 | |
| 444 | Under Windows, data structures are tightly packed, i.e. there is no |
| 445 | padding between structure members. On the other hand, by default gcc |
| 446 | aligns structure members (e.g. WORDs are on a WORD boundary, etc.). |
| 447 | This means that a structure like |
| 448 | |
| 449 | struct { BYTE x; WORD y; }; |
| 450 | |
| 451 | will take 3 bytes under Windows, but 4 with gcc, because gcc will add a |
| 452 | dummy byte between x and y. To have the correct layout for structures |
Klaas van Gend | 0a7aa16 | 1999-06-05 11:52:46 +0000 | [diff] [blame] | 453 | used by Windows code, you need to embed the struct within two special |
| 454 | #include's which will take care of the packing for you: |
| 455 | |
| 456 | #include "pshpack1.h" |
Eric Pouech | 19dc208 | 1999-10-31 22:15:58 +0000 | [diff] [blame] | 457 | struct { BYTE x; WORD y; }; |
Klaas van Gend | 0a7aa16 | 1999-06-05 11:52:46 +0000 | [diff] [blame] | 458 | #include "poppack1.h" |
| 459 | |
| 460 | For alignment on a 2-byte boundary, there is a "pshpack2.h", etc. |
| 461 | |
Alexandre Julliard | 2d93d00 | 1996-05-21 15:01:41 +0000 | [diff] [blame] | 462 | |
Alexandre Julliard | 1285c2f | 1996-05-06 16:06:24 +0000 | [diff] [blame] | 463 | NAMING CONVENTIONS FOR API FUNCTIONS AND TYPES |
| 464 | ============================================== |
| 465 | |
| 466 | In order to support both Win16 and Win32 APIs within the same source |
Douglas Ridgway | 692389d | 1998-11-22 16:56:44 +0000 | [diff] [blame] | 467 | code, the following convention must be used in naming all API |
Alexandre Julliard | 1285c2f | 1996-05-06 16:06:24 +0000 | [diff] [blame] | 468 | functions and types. If the Windows API uses the name 'xxx', the Wine |
| 469 | code must use: |
| 470 | |
Alexandre Julliard | 9f69d89 | 1999-02-26 12:33:21 +0000 | [diff] [blame] | 471 | - 'xxx16' for the Win16 version, |
Dimitrie O. Paun | d0bc4c2 | 2004-02-13 04:00:52 +0000 | [diff] [blame] | 472 | - 'xxx' for the Win32 version when no strings are involved, |
Alexandre Julliard | 9f69d89 | 1999-02-26 12:33:21 +0000 | [diff] [blame] | 473 | - 'xxxA' for the Win32 version with ASCII strings, |
| 474 | - 'xxxW' for the Win32 version with Unicode strings. |
Alexandre Julliard | 1285c2f | 1996-05-06 16:06:24 +0000 | [diff] [blame] | 475 | |
Alexandre Julliard | 9f69d89 | 1999-02-26 12:33:21 +0000 | [diff] [blame] | 476 | If the function has both ASCII and Unicode version, you should then |
| 477 | use the macros WINELIB_NAME_AW(xxx) or DECL_WINELIB_TYPE_AW(xxx) |
Jim Aston | 0768424 | 1999-07-18 13:28:59 +0000 | [diff] [blame] | 478 | (defined in include/windef.h) to define the correct 'xxx' function |
Alexandre Julliard | 9f69d89 | 1999-02-26 12:33:21 +0000 | [diff] [blame] | 479 | or type for Winelib. When compiling Wine itself, 'xxx' is _not_ |
| 480 | defined, meaning that code inside of Wine must always specify |
| 481 | explicitly the ASCII or Unicode version. |
Alexandre Julliard | 1285c2f | 1996-05-06 16:06:24 +0000 | [diff] [blame] | 482 | |
Alexandre Julliard | 9f69d89 | 1999-02-26 12:33:21 +0000 | [diff] [blame] | 483 | If 'xxx' is the same in Win16 and Win32, you can simply use the same |
| 484 | name as Windows, i.e. just 'xxx'. If 'xxx' is Win16 only, you could |
| 485 | use the name as is, but it's preferable to use 'xxx16' to make it |
| 486 | clear it is a Win16 function. |
Alexandre Julliard | 1285c2f | 1996-05-06 16:06:24 +0000 | [diff] [blame] | 487 | |
| 488 | Examples: |
| 489 | |
Alexandre Julliard | 9f69d89 | 1999-02-26 12:33:21 +0000 | [diff] [blame] | 490 | typedef struct { /* Win32 ASCII data structure */ } WNDCLASSA; |
| 491 | typedef struct { /* Win32 Unicode data structure */ } WNDCLASSW; |
Alexandre Julliard | 1285c2f | 1996-05-06 16:06:24 +0000 | [diff] [blame] | 492 | typedef struct { /* Win16 data structure */ } WNDCLASS16; |
| 493 | DECL_WINELIB_TYPE_AW(WNDCLASS); |
| 494 | |
| 495 | ATOM RegisterClass16( WNDCLASS16 * ); |
Alexandre Julliard | 9f69d89 | 1999-02-26 12:33:21 +0000 | [diff] [blame] | 496 | ATOM RegisterClassA( WNDCLASSA * ); |
| 497 | ATOM RegisterClassW( WNDCLASSW * ); |
Alexandre Julliard | 1285c2f | 1996-05-06 16:06:24 +0000 | [diff] [blame] | 498 | #define RegisterClass WINELIB_NAME_AW(RegisterClass) |
| 499 | |
| 500 | The Winelib user can then say: |
| 501 | |
Alexandre Julliard | 1285c2f | 1996-05-06 16:06:24 +0000 | [diff] [blame] | 502 | WNDCLASS wc = { ... }; |
| 503 | RegisterClass( &wc ); |
| 504 | |
| 505 | and this will use the correct declaration depending on the definition |
Alexandre Julliard | 9f69d89 | 1999-02-26 12:33:21 +0000 | [diff] [blame] | 506 | of the UNICODE symbol. |
Alexandre Julliard | 1285c2f | 1996-05-06 16:06:24 +0000 | [diff] [blame] | 507 | |
| 508 | |
Alexandre Julliard | 1285c2f | 1996-05-06 16:06:24 +0000 | [diff] [blame] | 509 | DEBUG MESSAGES |
| 510 | ============== |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 511 | |
| 512 | To display a message only during debugging, you normally write something |
| 513 | like this: |
| 514 | |
Dimitrie O. Paun | d95ce8c | 2002-09-18 18:29:59 +0000 | [diff] [blame] | 515 | TRACE("abc..."); or |
| 516 | FIXME("abc..."); or |
| 517 | WARN("abc..."); or |
| 518 | ERR("abc..."); |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 519 | |
Dimitrie O. Paun | 7d2aefd | 2003-09-22 19:26:32 +0000 | [diff] [blame] | 520 | depending on the seriousness of the problem. (documentation/debugging.sgml |
Dimitrie O. Paun | d95ce8c | 2002-09-18 18:29:59 +0000 | [diff] [blame] | 521 | explains when it is appropriate to use each of them). You need to declare |
| 522 | the debug channel name at the top of the file (after the includes) using |
| 523 | the WINE_DEFAULT_DEBUG_CHANNEL macro, like so: |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 524 | |
Dimitrie O. Paun | d95ce8c | 2002-09-18 18:29:59 +0000 | [diff] [blame] | 525 | WINE_DEFAULT_DEBUG_CHANNEL(win); |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 526 | |
Dimitrie O. Paun | d95ce8c | 2002-09-18 18:29:59 +0000 | [diff] [blame] | 527 | If your debugging code is more complex than just printf, you can use |
| 528 | the macros: |
| 529 | |
| 530 | TRACE_ON(xxx), WARN_ON(xxx), ERR_ON(xxx) and FIXME_ON(xxx) |
| 531 | |
| 532 | to test if the given channel is enabled. Thus, you can write: |
| 533 | |
| 534 | if (TRACE_ON(win)) DumpSomeStructure(&str); |
Alexandre Julliard | 234bc24 | 1994-12-10 13:02:28 +0000 | [diff] [blame] | 535 | |
Alexandre Julliard | 234bc24 | 1994-12-10 13:02:28 +0000 | [diff] [blame] | 536 | Don't worry about the inefficiency of the test. If it is permanently |
Alexandre Julliard | 54c2711 | 1998-03-29 19:44:57 +0000 | [diff] [blame] | 537 | disabled (that is TRACE_ON(win) is 0 at compile time), the compiler will |
Alexandre Julliard | 234bc24 | 1994-12-10 13:02:28 +0000 | [diff] [blame] | 538 | eliminate the dead code. |
Alexandre Julliard | aca0578 | 1994-10-17 18:12:41 +0000 | [diff] [blame] | 539 | |
Alexandre Julliard | 54c2711 | 1998-03-29 19:44:57 +0000 | [diff] [blame] | 540 | For more info about debugging messages, read: |
| 541 | |
Dimitrie O. Paun | 7d2aefd | 2003-09-22 19:26:32 +0000 | [diff] [blame] | 542 | http://www.winehq.org/site/docs/wine-devel/debugging |
Alexandre Julliard | 54c2711 | 1998-03-29 19:44:57 +0000 | [diff] [blame] | 543 | |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 544 | |
| 545 | MORE INFO |
| 546 | ========= |
| 547 | |
Alexandre Julliard | 33072e1 | 1997-06-29 18:08:02 +0000 | [diff] [blame] | 548 | 1. There is a FREE online version of the MSDN library (including |
Jeff Smith | 344ed41 | 2002-12-24 00:56:33 +0000 | [diff] [blame] | 549 | documentation for the Win32 API) on http://msdn.microsoft.com/ |
Mike Hearn | 4ebc806 | 2003-08-27 02:03:52 +0000 | [diff] [blame] | 550 | or http://www.msdn.com/ |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 551 | |
Tom Wickline | 7be37f4 | 2003-06-30 02:05:07 +0000 | [diff] [blame] | 552 | 2. Windows apilist: http://www.mentalis.org/apilist/apilist.php |
Alexandre Julliard | 23946ad | 1997-06-16 17:43:53 +0000 | [diff] [blame] | 553 | |
Tom Wickline | 7be37f4 | 2003-06-30 02:05:07 +0000 | [diff] [blame] | 554 | 3. http://www.sonic.net/~undoc/bookstore.html |
Alexandre Julliard | 33072e1 | 1997-06-29 18:08:02 +0000 | [diff] [blame] | 555 | |
Tom Wickline | 7be37f4 | 2003-06-30 02:05:07 +0000 | [diff] [blame] | 556 | 4. In 1993 Dr. Dobbs Journal published a column called "Undocumented Corner". |
Dimitrie O. Paun | 64ed084 | 2003-10-09 19:47:23 +0000 | [diff] [blame] | 557 | |
| 558 | 5. www.geocities.com/SiliconValley/4942/ |