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