1 /***********************************************************************\
2 *                               imagehlp.d                              *
3 *                                                                       *
4 *                       Windows API header module                       *
5 *                                                                       *
6 *                 Translated from MinGW Windows headers                 *
7 *                           by Stewart Gordon                           *
8 *                                                                       *
9 *                       Placed into public domain                       *
10 \***********************************************************************/
11 module win32.imagehlp;
12 version(Windows):
13 
14 /* Comment from MinGW
15 	NOTE: This strictly does not belong in the Win32 API since it's
16 	really part of Platform SDK. However, GDB needs it and we might
17 	as well provide it here.
18 */
19 
20 private import win32.winbase, win32.windef;
21 
22 // FIXME: check types of constants
23 
24 const API_VERSION_NUMBER = 7;
25 
26 const BIND_NO_BOUND_IMPORTS  = 1;
27 const BIND_NO_UPDATE         = 2;
28 const BIND_ALL_IMAGES        = 4;
29 const BIND_CACHE_IMPORT_DLLS = 8;
30 
31 enum {
32 	CBA_DEFERRED_SYMBOL_LOAD_START = 1,
33 	CBA_DEFERRED_SYMBOL_LOAD_COMPLETE,
34 	CBA_DEFERRED_SYMBOL_LOAD_FAILURE,
35 	CBA_SYMBOLS_UNLOADED,
36 	CBA_DUPLICATE_SYMBOL
37 }
38 
39 const CERT_PE_IMAGE_DIGEST_DEBUG_INFO      = 1;
40 const CERT_PE_IMAGE_DIGEST_RESOURCES       = 2;
41 const CERT_PE_IMAGE_DIGEST_ALL_IMPORT_INFO = 4;
42 const CERT_PE_IMAGE_DIGEST_NON_PE_INFO     = 8;
43 
44 const CERT_SECTION_TYPE_ANY = 255;
45 
46 enum {
47 	CHECKSUM_SUCCESS = 0,
48 	CHECKSUM_OPEN_FAILURE,
49 	CHECKSUM_MAP_FAILURE,
50 	CHECKSUM_MAPVIEW_FAILURE,
51 	CHECKSUM_UNICODE_FAILURE
52 }
53 
54 const IMAGE_SEPARATION = 65536;
55 
56 const SPLITSYM_REMOVE_PRIVATE    = 1;
57 const SPLITSYM_EXTRACT_ALL       = 2;
58 const SPLITSYM_SYMBOLPATH_IS_SRC = 4;
59 
60 const SYMF_OMAP_GENERATED = 1;
61 const SYMF_OMAP_MODIFIED  = 2;
62 
63 const SYMOPT_CASE_INSENSITIVE  =  1;
64 const SYMOPT_UNDNAME           =  2;
65 const SYMOPT_DEFERRED_LOADS    =  4;
66 const SYMOPT_NO_CPP            =  8;
67 const SYMOPT_LOAD_LINES        = 16;
68 const SYMOPT_OMAP_FIND_NEAREST = 32;
69 
70 const UNDNAME_COMPLETE               =     0;
71 const UNDNAME_NO_LEADING_UNDERSCORES =     1;
72 const UNDNAME_NO_MS_KEYWORDS         =     2;
73 const UNDNAME_NO_FUNCTION_RETURNS    =     4;
74 const UNDNAME_NO_ALLOCATION_MODEL    =     8;
75 const UNDNAME_NO_ALLOCATION_LANGUAGE =    16;
76 const UNDNAME_NO_MS_THISTYPE         =    32;
77 const UNDNAME_NO_CV_THISTYPE         =    64;
78 const UNDNAME_NO_THISTYPE            =    96;
79 const UNDNAME_NO_ACCESS_SPECIFIERS   =   128;
80 const UNDNAME_NO_THROW_SIGNATURES    =   256;
81 const UNDNAME_NO_MEMBER_TYPE         =   512;
82 const UNDNAME_NO_RETURN_UDT_MODEL    =  1024;
83 const UNDNAME_32_BIT_DECODE          =  2048;
84 const UNDNAME_NAME_ONLY              =  4096;
85 const UNDNAME_NO_ARGUMENTS           =  8192;
86 const UNDNAME_NO_SPECIAL_SYMS        = 16384;
87 
88 enum IMAGEHLP_STATUS_REASON {
89 	BindOutOfMemory,
90 	BindRvaToVaFailed,
91 	BindNoRoomInImage,
92 	BindImportModuleFailed,
93 	BindImportProcedureFailed,
94 	BindImportModule,
95 	BindImportProcedure,
96 	BindForwarder,
97 	BindForwarderNOT,
98 	BindImageModified,
99 	BindExpandFileHeaders,
100 	BindImageComplete,
101 	BindMismatchedSymbols,
102 	BindSymbolsNotUpdated
103 }
104 
105 struct LOADED_IMAGE {
106 	LPSTR                 ModuleName;
107 	HANDLE                hFile;
108 	PUCHAR                MappedAddress;
109 	PIMAGE_NT_HEADERS     FileHeader;
110 	PIMAGE_SECTION_HEADER LastRvaSection;
111 	ULONG                 NumberOfSections;
112 	PIMAGE_SECTION_HEADER Sections;
113 	ULONG                 Characteristics;
114 	BOOLEAN               fSystemImage;
115 	BOOLEAN               fDOSImage;
116 	LIST_ENTRY            Links;
117 	ULONG                 SizeOfImage;
118 }
119 alias LOADED_IMAGE* PLOADED_IMAGE;
120 
121 struct IMAGE_DEBUG_INFORMATION {
122 	LIST_ENTRY                 List;
123 	DWORD                      Size;
124 	PVOID                      MappedBase;
125 	USHORT                     Machine;
126 	USHORT                     Characteristics;
127 	DWORD                      CheckSum;
128 	DWORD                      ImageBase;
129 	DWORD                      SizeOfImage;
130 	DWORD                      NumberOfSections;
131 	PIMAGE_SECTION_HEADER      Sections;
132 	DWORD                      ExportedNamesSize;
133 	LPSTR                      ExportedNames;
134 	DWORD                      NumberOfFunctionTableEntries;
135 	PIMAGE_FUNCTION_ENTRY      FunctionTableEntries;
136 	DWORD                      LowestFunctionStartingAddress;
137 	DWORD                      HighestFunctionEndingAddress;
138 	DWORD                      NumberOfFpoTableEntries;
139 	PFPO_DATA                  FpoTableEntries;
140 	DWORD                      SizeOfCoffSymbols;
141 	PIMAGE_COFF_SYMBOLS_HEADER CoffSymbols;
142 	DWORD                      SizeOfCodeViewSymbols;
143 	PVOID                      CodeViewSymbols;
144 	LPSTR                      ImageFilePath;
145 	LPSTR                      ImageFileName;
146 	LPSTR                      DebugFilePath;
147 	DWORD                      TimeDateStamp;
148 	BOOL                       RomImage;
149 	PIMAGE_DEBUG_DIRECTORY     DebugDirectory;
150 	DWORD                      NumberOfDebugDirectories;
151 	DWORD[3]                   Reserved;
152 }
153 alias IMAGE_DEBUG_INFORMATION* PIMAGE_DEBUG_INFORMATION;
154 
155 enum ADDRESS_MODE {
156 	AddrMode1616,
157 	AddrMode1632,
158 	AddrModeReal,
159 	AddrModeFlat
160 }
161 
162 struct ADDRESS {
163 	DWORD        Offset;
164 	WORD         Segment;
165 	ADDRESS_MODE Mode;
166 }
167 alias ADDRESS* LPADDRESS;
168 
169 struct KDHELP {
170 	DWORD Thread;
171 	DWORD ThCallbackStack;
172 	DWORD NextCallback;
173 	DWORD FramePointer;
174 	DWORD KiCallUserMode;
175 	DWORD KeUserCallbackDispatcher;
176 	DWORD SystemRangeStart;
177 }
178 alias KDHELP* PKDHELP;
179 
180 struct STACKFRAME {
181 	ADDRESS  AddrPC;
182 	ADDRESS  AddrReturn;
183 	ADDRESS  AddrFrame;
184 	ADDRESS  AddrStack;
185 	LPVOID   FuncTableEntry;
186 	DWORD[4] Params;
187 	BOOL     Far;
188 	BOOL     Virtual;
189 	DWORD[3] Reserved;
190 	KDHELP   KdHelp;
191 }
192 alias STACKFRAME* LPSTACKFRAME;
193 
194 struct API_VERSION {
195 	USHORT MajorVersion;
196 	USHORT MinorVersion;
197 	USHORT Revision;
198 	USHORT Reserved;
199 }
200 alias API_VERSION* LPAPI_VERSION;
201 
202 enum SYM_TYPE {
203 	SymNone,
204 	SymCoff,
205 	SymCv,
206 	SymPdb,
207 	SymExport,
208 	SymDeferred,
209 	SymSym
210 }
211 
212 struct IMAGEHLP_SYMBOL {
213 	DWORD   SizeOfStruct;
214 	DWORD   Address;
215 	DWORD   Size;
216 	DWORD   Flags;
217 	DWORD   MaxNameLength;
218 	CHAR[1] Name;
219 }
220 alias IMAGEHLP_SYMBOL* PIMAGEHLP_SYMBOL;
221 
222 struct IMAGEHLP_MODULE {
223 	DWORD     SizeOfStruct;
224 	DWORD     BaseOfImage;
225 	DWORD     ImageSize;
226 	DWORD     TimeDateStamp;
227 	DWORD     CheckSum;
228 	DWORD     NumSyms;
229 	SYM_TYPE  SymType;
230 	CHAR[32]  ModuleName;
231 	CHAR[256] ImageName;
232 	CHAR[256] LoadedImageName;
233 }
234 alias IMAGEHLP_MODULE* PIMAGEHLP_MODULE;
235 
236 struct IMAGEHLP_LINE {
237 	DWORD SizeOfStruct;
238 	DWORD Key;
239 	DWORD LineNumber;
240 	PCHAR FileName;
241 	DWORD Address;
242 }
243 alias IMAGEHLP_LINE* PIMAGEHLP_LINE;
244 
245 struct IMAGEHLP_DEFERRED_SYMBOL_LOAD {
246 	DWORD          SizeOfStruct;
247 	DWORD          BaseOfImage;
248 	DWORD          CheckSum;
249 	DWORD          TimeDateStamp;
250 	CHAR[MAX_PATH] FileName;
251 	BOOLEAN        Reparse;
252 }
253 alias IMAGEHLP_DEFERRED_SYMBOL_LOAD* PIMAGEHLP_DEFERRED_SYMBOL_LOAD;
254 
255 struct IMAGEHLP_DUPLICATE_SYMBOL {
256 	DWORD            SizeOfStruct;
257 	DWORD            NumberOfDups;
258 	PIMAGEHLP_SYMBOL Symbol;
259 	ULONG            SelectedSymbol;
260 }
261 alias IMAGEHLP_DUPLICATE_SYMBOL* PIMAGEHLP_DUPLICATE_SYMBOL;
262 
263 mixin DECLARE_HANDLE!("DIGEST_HANDLE");
264 
265 extern (Windows) {
266 	alias BOOL function(IMAGEHLP_STATUS_REASON, LPSTR, LPSTR, ULONG, ULONG)
267 	  PIMAGEHLP_STATUS_ROUTINE;
268 	alias BOOL function(HANDLE , LPCVOID, LPVOID, DWORD, LPDWORD)
269 	  PREAD_PROCESS_MEMORY_ROUTINE;
270 	alias LPVOID function(HANDLE, DWORD) PFUNCTION_TABLE_ACCESS_ROUTINE;
271 	alias DWORD function(HANDLE, DWORD) PGET_MODULE_BASE_ROUTINE;
272 	alias DWORD function(HANDLE, HANDLE, LPADDRESS)
273 	  PTRANSLATE_ADDRESS_ROUTINE;
274 	alias BOOL function(LPSTR, ULONG, PVOID) PSYM_ENUMMODULES_CALLBACK;
275 	alias BOOL function(LPSTR, ULONG, ULONG, PVOID) PSYM_ENUMSYMBOLS_CALLBACK;
276 	alias BOOL function(LPSTR, ULONG, ULONG, PVOID)
277 	  PENUMLOADED_MODULES_CALLBACK;
278 	alias BOOL function(HANDLE, ULONG, PVOID, PVOID)
279 	  PSYMBOL_REGISTERED_CALLBACK;
280 	alias BOOL function(DIGEST_HANDLE refdata, PBYTE pData, DWORD dwLength)
281 	  DIGEST_FUNCTION;
282 
283 	PIMAGE_NT_HEADERS CheckSumMappedFile(LPVOID, DWORD, LPDWORD, LPDWORD);
284 	DWORD MapFileAndCheckSumA(LPSTR, LPDWORD, LPDWORD);
285 	DWORD MapFileAndCheckSumW(PWSTR, LPDWORD, LPDWORD);
286 	BOOL TouchFileTimes(HANDLE, LPSYSTEMTIME);
287 	BOOL SplitSymbols(LPSTR, LPSTR, LPSTR, DWORD);
288 	HANDLE FindDebugInfoFile(LPSTR, LPSTR, LPSTR);
289 	HANDLE FindExecutableImage(LPSTR, LPSTR, LPSTR);
290 	BOOL UpdateDebugInfoFile(LPSTR, LPSTR, LPSTR, PIMAGE_NT_HEADERS);
291 	BOOL UpdateDebugInfoFileEx(LPSTR, LPSTR, LPSTR, PIMAGE_NT_HEADERS, DWORD);
292 	BOOL BindImage(LPSTR, LPSTR, LPSTR);
293 	BOOL BindImageEx(DWORD, LPSTR, LPSTR, LPSTR, PIMAGEHLP_STATUS_ROUTINE);
294 	BOOL ReBaseImage(LPSTR, LPSTR, BOOL, BOOL, BOOL, ULONG, ULONG*, ULONG*,
295 	  ULONG*, ULONG*, ULONG);
296 	PLOADED_IMAGE ImageLoad(LPSTR, LPSTR);
297 	BOOL ImageUnload(PLOADED_IMAGE);
298 	PIMAGE_NT_HEADERS ImageNtHeader(PVOID);
299 	PVOID ImageDirectoryEntryToData(PVOID, BOOLEAN, USHORT, PULONG);
300 	PIMAGE_SECTION_HEADER ImageRvaToSection(PIMAGE_NT_HEADERS, PVOID, ULONG);
301 	PVOID ImageRvaToVa(PIMAGE_NT_HEADERS, PVOID, ULONG,
302 	  PIMAGE_SECTION_HEADER*);
303 	BOOL MapAndLoad(LPSTR, LPSTR, PLOADED_IMAGE, BOOL, BOOL);
304 	BOOL GetImageConfigInformation(PLOADED_IMAGE,
305 	  PIMAGE_LOAD_CONFIG_DIRECTORY);
306 	DWORD GetImageUnusedHeaderBytes(PLOADED_IMAGE, LPDWORD);
307 	BOOL SetImageConfigInformation(PLOADED_IMAGE,
308 	  PIMAGE_LOAD_CONFIG_DIRECTORY);
309 	BOOL UnMapAndLoad(PLOADED_IMAGE);
310 	PIMAGE_DEBUG_INFORMATION MapDebugInformation(HANDLE, LPSTR, LPSTR, DWORD);
311 	BOOL UnmapDebugInformation(PIMAGE_DEBUG_INFORMATION);
312 	HANDLE FindExecutableImage(LPSTR, LPSTR, LPSTR);
313 	BOOL SearchTreeForFile(LPSTR, LPSTR, LPSTR);
314 	BOOL MakeSureDirectoryPathExists(LPCSTR);
315 	DWORD UnDecorateSymbolName(LPCSTR, LPSTR, DWORD, DWORD);
316 	BOOL StackWalk(DWORD, HANDLE, HANDLE, LPSTACKFRAME, LPVOID,
317 	  PREAD_PROCESS_MEMORY_ROUTINE, PFUNCTION_TABLE_ACCESS_ROUTINE,
318 	  PGET_MODULE_BASE_ROUTINE, PTRANSLATE_ADDRESS_ROUTINE);
319 	LPAPI_VERSION ImagehlpApiVersion();
320 	LPAPI_VERSION ImagehlpApiVersionEx(LPAPI_VERSION);
321 	DWORD GetTimestampForLoadedLibrary(HMODULE);
322 	BOOL RemovePrivateCvSymbolic(PCHAR, PCHAR*, ULONG*);
323 	VOID RemoveRelocations(PCHAR);
324 	DWORD SymSetOptions(DWORD);
325 	DWORD SymGetOptions();
326 	BOOL SymCleanup(HANDLE);
327 	BOOL SymEnumerateModules(HANDLE, PSYM_ENUMMODULES_CALLBACK, PVOID);
328 	BOOL SymEnumerateSymbols(HANDLE, DWORD, PSYM_ENUMSYMBOLS_CALLBACK, PVOID);
329 	BOOL EnumerateLoadedModules(HANDLE, PENUMLOADED_MODULES_CALLBACK, PVOID);
330 	LPVOID SymFunctionTableAccess(HANDLE, DWORD);
331 	BOOL SymGetModuleInfo(HANDLE, DWORD, PIMAGEHLP_MODULE);
332 	DWORD SymGetModuleBase(HANDLE, DWORD);
333 	BOOL SymGetSymFromAddr(HANDLE, DWORD, PDWORD, PIMAGEHLP_SYMBOL);
334 	BOOL SymGetSymFromName(HANDLE, LPSTR, PIMAGEHLP_SYMBOL);
335 	BOOL SymGetSymNext(HANDLE, PIMAGEHLP_SYMBOL);
336 	BOOL SymGetSymPrev(HANDLE, PIMAGEHLP_SYMBOL);
337 	BOOL SymGetLineFromAddr(HANDLE, DWORD, PDWORD, PIMAGEHLP_LINE);
338 	BOOL SymGetLineFromName(HANDLE, LPSTR, LPSTR, DWORD, PLONG,
339 	  PIMAGEHLP_LINE);
340 	BOOL SymGetLineNext(HANDLE, PIMAGEHLP_LINE);
341 	BOOL SymGetLinePrev(HANDLE, PIMAGEHLP_LINE);
342 	BOOL SymMatchFileName(LPSTR, LPSTR, LPSTR*, LPSTR*);
343 	BOOL SymInitialize(HANDLE, LPSTR, BOOL);
344 	BOOL SymGetSearchPath(HANDLE, LPSTR, DWORD);
345 	BOOL SymSetSearchPath(HANDLE, LPSTR);
346 	BOOL SymLoadModule(HANDLE, HANDLE, PSTR, PSTR, DWORD, DWORD);
347 	BOOL SymUnloadModule(HANDLE, DWORD);
348 	BOOL SymUnDName(PIMAGEHLP_SYMBOL, LPSTR, DWORD);
349 	BOOL SymRegisterCallback(HANDLE, PSYMBOL_REGISTERED_CALLBACK, PVOID);
350 	BOOL ImageGetDigestStream(HANDLE, DWORD, DIGEST_FUNCTION, DIGEST_HANDLE);
351 	BOOL ImageAddCertificate(HANDLE, LPWIN_CERTIFICATE, PDWORD);
352 	BOOL ImageRemoveCertificate(HANDLE, DWORD);
353 	BOOL ImageEnumerateCertificates(HANDLE, WORD, PDWORD, PDWORD, DWORD);
354 	BOOL ImageGetCertificateData(HANDLE, DWORD, LPWIN_CERTIFICATE, PDWORD);
355 	BOOL ImageGetCertificateHeader(HANDLE, DWORD, LPWIN_CERTIFICATE);
356 	BOOL CopyPdb(CHAR*, CHAR*, BOOL);
357 	BOOL RemovePrivateCvSymbolicEx(PCHAR, ULONG, PCHAR*, ULONG*);
358 }
359 
360 version (Unicode) {
361 	alias MapFileAndCheckSumW MapFileAndCheckSum;
362 } else {
363 	alias MapFileAndCheckSumA MapFileAndCheckSum;
364 }