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