Mercurial > projects > ddbg_continued
comparison src/win32/dbghelp.d @ 1:4a9dcbd9e54f
-files of 0.13 beta
-fixes so that it now compiles with the current dmd version
author | marton@basel.hu |
---|---|
date | Tue, 05 Apr 2011 20:44:01 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:586e4a649642 | 1:4a9dcbd9e54f |
---|---|
1 /* BUILD Version: 0001 Increment this if a change has global effects | |
2 | |
3 Copyright (c) Microsoft Corporation. All rights reserved. | |
4 | |
5 Module Name: | |
6 | |
7 dbghelp.h | |
8 | |
9 Abstract: | |
10 | |
11 This module defines the prototypes and constants required for the image | |
12 help routines. | |
13 | |
14 Contains debugging support routines that are redistributable. | |
15 | |
16 Revision History: | |
17 | |
18 --*/ | |
19 | |
20 //#ifndef _DBGHELP_ | |
21 //#define _DBGHELP_ | |
22 module win32.dbghelp; | |
23 | |
24 import win32.windef; | |
25 import win32.winver; | |
26 | |
27 // As a general principal always call the 64 bit version | |
28 // of every API, if a choice exists. The 64 bit version | |
29 // works great on 32 bit platforms, and is forward | |
30 // compatible to 64 bit platforms. | |
31 | |
32 version(Win64) { | |
33 version = _IMAGEHLP64; | |
34 } | |
35 | |
36 | |
37 extern(Windows) { | |
38 | |
39 /+ | |
40 #ifdef _IMAGEHLP_SOURCE_ | |
41 #define IMAGEAPI __stdcall | |
42 #define DBHLP_DEPRECIATED | |
43 #else | |
44 #define IMAGEAPI DECLSPEC_IMPORT __stdcall | |
45 #if (_MSC_VER >= 1300) && !defined(MIDL_PASS) | |
46 #define DBHLP_DEPRECIATED __declspec(deprecated) | |
47 #else | |
48 #define DBHLP_DEPRECIATED | |
49 #endif | |
50 #endif | |
51 | |
52 #define DBHLPAPI IMAGEAPI | |
53 | |
54 #define IMAGE_SEPARATION (64*1024) | |
55 | |
56 typedef struct _LOADED_IMAGE { | |
57 PSTR ModuleName; | |
58 HANDLE hFile; | |
59 PUCHAR MappedAddress; | |
60 #ifdef _IMAGEHLP64 | |
61 PIMAGE_NT_HEADERS64 FileHeader; | |
62 #else | |
63 PIMAGE_NT_HEADERS32 FileHeader; | |
64 #endif | |
65 PIMAGE_SECTION_HEADER LastRvaSection; | |
66 ULONG NumberOfSections; | |
67 PIMAGE_SECTION_HEADER Sections; | |
68 ULONG Characteristics; | |
69 BOOLEAN fSystemImage; | |
70 BOOLEAN fDOSImage; | |
71 LIST_ENTRY Links; | |
72 ULONG SizeOfImage; | |
73 } LOADED_IMAGE, *PLOADED_IMAGE; | |
74 | |
75 #define MAX_SYM_NAME 2000 | |
76 | |
77 | |
78 HANDLE | |
79 IMAGEAPI | |
80 FindDebugInfoFile ( | |
81 PSTR FileName, | |
82 PSTR SymbolPath, | |
83 PSTR DebugFilePath | |
84 ); | |
85 | |
86 typedef BOOL | |
87 (CALLBACK *PFIND_DEBUG_FILE_CALLBACK)( | |
88 HANDLE FileHandle, | |
89 PSTR FileName, | |
90 PVOID CallerData | |
91 ); | |
92 | |
93 HANDLE | |
94 IMAGEAPI | |
95 FindDebugInfoFileEx ( | |
96 PSTR FileName, | |
97 PSTR SymbolPath, | |
98 PSTR DebugFilePath, | |
99 PFIND_DEBUG_FILE_CALLBACK Callback, | |
100 PVOID CallerData | |
101 ); | |
102 | |
103 typedef BOOL | |
104 (CALLBACK *PFINDFILEINPATHCALLBACK)( | |
105 PSTR filename, | |
106 PVOID context | |
107 ); | |
108 | |
109 BOOL | |
110 IMAGEAPI | |
111 SymFindFileInPath( | |
112 HANDLE hprocess, | |
113 LPSTR SearchPath, | |
114 LPSTR FileName, | |
115 PVOID id, | |
116 DWORD two, | |
117 DWORD three, | |
118 DWORD flags, | |
119 LPSTR FoundFile, | |
120 PFINDFILEINPATHCALLBACK callback, | |
121 PVOID context | |
122 ); | |
123 | |
124 HANDLE | |
125 IMAGEAPI | |
126 FindExecutableImage( | |
127 PSTR FileName, | |
128 PSTR SymbolPath, | |
129 PSTR ImageFilePath | |
130 ); | |
131 | |
132 typedef BOOL | |
133 (CALLBACK *PFIND_EXE_FILE_CALLBACK)( | |
134 HANDLE FileHandle, | |
135 PSTR FileName, | |
136 PVOID CallerData | |
137 ); | |
138 | |
139 HANDLE | |
140 IMAGEAPI | |
141 FindExecutableImageEx( | |
142 PSTR FileName, | |
143 PSTR SymbolPath, | |
144 PSTR ImageFilePath, | |
145 PFIND_EXE_FILE_CALLBACK Callback, | |
146 PVOID CallerData | |
147 ); | |
148 | |
149 PIMAGE_NT_HEADERS | |
150 IMAGEAPI | |
151 ImageNtHeader ( | |
152 IN PVOID Base | |
153 ); | |
154 | |
155 PVOID | |
156 IMAGEAPI | |
157 ImageDirectoryEntryToDataEx ( | |
158 IN PVOID Base, | |
159 IN BOOLEAN MappedAsImage, | |
160 IN USHORT DirectoryEntry, | |
161 OUT PULONG Size, | |
162 OUT PIMAGE_SECTION_HEADER *FoundHeader OPTIONAL | |
163 ); | |
164 | |
165 PVOID | |
166 IMAGEAPI | |
167 ImageDirectoryEntryToData ( | |
168 IN PVOID Base, | |
169 IN BOOLEAN MappedAsImage, | |
170 IN USHORT DirectoryEntry, | |
171 OUT PULONG Size | |
172 ); | |
173 | |
174 PIMAGE_SECTION_HEADER | |
175 IMAGEAPI | |
176 ImageRvaToSection( | |
177 IN PIMAGE_NT_HEADERS NtHeaders, | |
178 IN PVOID Base, | |
179 IN ULONG Rva | |
180 ); | |
181 | |
182 PVOID | |
183 IMAGEAPI | |
184 ImageRvaToVa( | |
185 IN PIMAGE_NT_HEADERS NtHeaders, | |
186 IN PVOID Base, | |
187 IN ULONG Rva, | |
188 IN OUT PIMAGE_SECTION_HEADER *LastRvaSection | |
189 ); | |
190 | |
191 // Symbol server exports | |
192 | |
193 typedef BOOL (WINAPI *PSYMBOLSERVERPROC)(LPCSTR, LPCSTR, PVOID, DWORD, DWORD, LPSTR); | |
194 typedef BOOL (WINAPI *PSYMBOLSERVEROPENPROC)(VOID); | |
195 typedef BOOL (WINAPI *PSYMBOLSERVERCLOSEPROC)(VOID); | |
196 typedef BOOL (WINAPI *PSYMBOLSERVERSETOPTIONSPROC)(UINT_PTR, ULONG64); | |
197 typedef BOOL (CALLBACK WINAPI *PSYMBOLSERVERCALLBACKPROC)(UINT_PTR action, ULONG64 data, ULONG64 context); | |
198 typedef UINT_PTR (WINAPI *PSYMBOLSERVERGETOPTIONSPROC)(); | |
199 typedef BOOL (WINAPI *PSYMBOLSERVERPINGPROC)(LPCSTR); | |
200 | |
201 #define SSRVOPT_CALLBACK 0x001 | |
202 #define SSRVOPT_DWORD 0x002 | |
203 #define SSRVOPT_DWORDPTR 0x004 | |
204 #define SSRVOPT_GUIDPTR 0x008 | |
205 #define SSRVOPT_OLDGUIDPTR 0x010 | |
206 #define SSRVOPT_UNATTENDED 0x020 | |
207 #define SSRVOPT_NOCOPY 0x040 | |
208 #define SSRVOPT_PARENTWIN 0x080 | |
209 #define SSRVOPT_PARAMTYPE 0x100 | |
210 #define SSRVOPT_SECURE 0x200 | |
211 #define SSRVOPT_TRACE 0x400 | |
212 #define SSRVOPT_RESET ((ULONG_PTR)-1) | |
213 | |
214 #define SSRVACTION_TRACE 1 | |
215 | |
216 | |
217 #ifndef _WIN64 | |
218 // This api won't be ported to Win64 - Fix your code. | |
219 | |
220 typedef struct _IMAGE_DEBUG_INFORMATION { | |
221 LIST_ENTRY List; | |
222 DWORD ReservedSize; | |
223 PVOID ReservedMappedBase; | |
224 USHORT ReservedMachine; | |
225 USHORT ReservedCharacteristics; | |
226 DWORD ReservedCheckSum; | |
227 DWORD ImageBase; | |
228 DWORD SizeOfImage; | |
229 | |
230 DWORD ReservedNumberOfSections; | |
231 PIMAGE_SECTION_HEADER ReservedSections; | |
232 | |
233 DWORD ReservedExportedNamesSize; | |
234 PSTR ReservedExportedNames; | |
235 | |
236 DWORD ReservedNumberOfFunctionTableEntries; | |
237 PIMAGE_FUNCTION_ENTRY ReservedFunctionTableEntries; | |
238 DWORD ReservedLowestFunctionStartingAddress; | |
239 DWORD ReservedHighestFunctionEndingAddress; | |
240 | |
241 DWORD ReservedNumberOfFpoTableEntries; | |
242 PFPO_DATA ReservedFpoTableEntries; | |
243 | |
244 DWORD SizeOfCoffSymbols; | |
245 PIMAGE_COFF_SYMBOLS_HEADER CoffSymbols; | |
246 | |
247 DWORD ReservedSizeOfCodeViewSymbols; | |
248 PVOID ReservedCodeViewSymbols; | |
249 | |
250 PSTR ImageFilePath; | |
251 PSTR ImageFileName; | |
252 PSTR ReservedDebugFilePath; | |
253 | |
254 DWORD ReservedTimeDateStamp; | |
255 | |
256 BOOL ReservedRomImage; | |
257 PIMAGE_DEBUG_DIRECTORY ReservedDebugDirectory; | |
258 DWORD ReservedNumberOfDebugDirectories; | |
259 | |
260 DWORD ReservedOriginalFunctionTableBaseAddress; | |
261 | |
262 DWORD Reserved[ 2 ]; | |
263 | |
264 } IMAGE_DEBUG_INFORMATION, *PIMAGE_DEBUG_INFORMATION; | |
265 | |
266 | |
267 PIMAGE_DEBUG_INFORMATION | |
268 IMAGEAPI | |
269 MapDebugInformation( | |
270 HANDLE FileHandle, | |
271 PSTR FileName, | |
272 PSTR SymbolPath, | |
273 DWORD ImageBase | |
274 ); | |
275 | |
276 BOOL | |
277 IMAGEAPI | |
278 UnmapDebugInformation( | |
279 PIMAGE_DEBUG_INFORMATION DebugInfo | |
280 ); | |
281 | |
282 #endif | |
283 | |
284 BOOL | |
285 IMAGEAPI | |
286 SearchTreeForFile( | |
287 PSTR RootPath, | |
288 PSTR InputPathName, | |
289 PSTR OutputPathBuffer | |
290 ); | |
291 | |
292 typedef BOOL | |
293 (CALLBACK *PENUMDIRTREE_CALLBACK)( | |
294 LPCSTR FilePath, | |
295 PVOID CallerData | |
296 ); | |
297 | |
298 BOOL | |
299 IMAGEAPI | |
300 EnumDirTree( | |
301 HANDLE hProcess, | |
302 PSTR RootPath, | |
303 PSTR InputPathName, | |
304 PSTR OutputPathBuffer, | |
305 PENUMDIRTREE_CALLBACK Callback, | |
306 PVOID CallbackData | |
307 ); | |
308 | |
309 BOOL | |
310 IMAGEAPI | |
311 MakeSureDirectoryPathExists( | |
312 PCSTR DirPath | |
313 ); | |
314 | |
315 // | |
316 // UnDecorateSymbolName Flags | |
317 // | |
318 | |
319 #define UNDNAME_COMPLETE (0x0000) // Enable full undecoration | |
320 #define UNDNAME_NO_LEADING_UNDERSCORES (0x0001) // Remove leading underscores from MS extended keywords | |
321 #define UNDNAME_NO_MS_KEYWORDS (0x0002) // Disable expansion of MS extended keywords | |
322 #define UNDNAME_NO_FUNCTION_RETURNS (0x0004) // Disable expansion of return type for primary declaration | |
323 #define UNDNAME_NO_ALLOCATION_MODEL (0x0008) // Disable expansion of the declaration model | |
324 #define UNDNAME_NO_ALLOCATION_LANGUAGE (0x0010) // Disable expansion of the declaration language specifier | |
325 #define UNDNAME_NO_MS_THISTYPE (0x0020) // NYI Disable expansion of MS keywords on the 'this' type for primary declaration | |
326 #define UNDNAME_NO_CV_THISTYPE (0x0040) // NYI Disable expansion of CV modifiers on the 'this' type for primary declaration | |
327 #define UNDNAME_NO_THISTYPE (0x0060) // Disable all modifiers on the 'this' type | |
328 #define UNDNAME_NO_ACCESS_SPECIFIERS (0x0080) // Disable expansion of access specifiers for members | |
329 #define UNDNAME_NO_THROW_SIGNATURES (0x0100) // Disable expansion of 'throw-signatures' for functions and pointers to functions | |
330 #define UNDNAME_NO_MEMBER_TYPE (0x0200) // Disable expansion of 'static' or 'virtual'ness of members | |
331 #define UNDNAME_NO_RETURN_UDT_MODEL (0x0400) // Disable expansion of MS model for UDT returns | |
332 #define UNDNAME_32_BIT_DECODE (0x0800) // Undecorate 32-bit decorated names | |
333 #define UNDNAME_NAME_ONLY (0x1000) // Crack only the name for primary declaration; | |
334 // return just [scope::]name. Does expand template params | |
335 #define UNDNAME_NO_ARGUMENTS (0x2000) // Don't undecorate arguments to function | |
336 #define UNDNAME_NO_SPECIAL_SYMS (0x4000) // Don't undecorate special names (v-table, vcall, vector xxx, metatype, etc) | |
337 | |
338 DWORD | |
339 IMAGEAPI | |
340 WINAPI | |
341 UnDecorateSymbolName( | |
342 PCSTR DecoratedName, // Name to undecorate | |
343 PSTR UnDecoratedName, // If NULL, it will be allocated | |
344 DWORD UndecoratedLength, // The maximym length | |
345 DWORD Flags // See above. | |
346 ); | |
347 | |
348 | |
349 // | |
350 // these values are used for synthesized file types | |
351 // that can be passed in as image headers instead of | |
352 // the standard ones from ntimage.h | |
353 // | |
354 | |
355 #define DBHHEADER_DEBUGDIRS 0x1 | |
356 | |
357 typedef struct _MODLOAD_DATA { | |
358 DWORD ssize; // size of this struct | |
359 DWORD ssig; // signature identifying the passed data | |
360 PVOID data; // pointer to passed data | |
361 DWORD size; // size of passed data | |
362 DWORD flags; // options | |
363 } MODLOAD_DATA, *PMODLOAD_DATA; | |
364 | |
365 // | |
366 // StackWalking API | |
367 // | |
368 | |
369 typedef enum { | |
370 AddrMode1616, | |
371 AddrMode1632, | |
372 AddrModeReal, | |
373 AddrModeFlat | |
374 } ADDRESS_MODE; | |
375 | |
376 typedef struct _tagADDRESS64 { | |
377 DWORD64 Offset; | |
378 WORD Segment; | |
379 ADDRESS_MODE Mode; | |
380 } ADDRESS64, *LPADDRESS64; | |
381 | |
382 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
383 #define ADDRESS ADDRESS64 | |
384 #define LPADDRESS LPADDRESS64 | |
385 #else | |
386 typedef struct _tagADDRESS { | |
387 DWORD Offset; | |
388 WORD Segment; | |
389 ADDRESS_MODE Mode; | |
390 } ADDRESS, *LPADDRESS; | |
391 | |
392 __inline | |
393 void | |
394 Address32To64( | |
395 LPADDRESS a32, | |
396 LPADDRESS64 a64 | |
397 ) | |
398 { | |
399 a64->Offset = (ULONG64)(LONG64)(LONG)a32->Offset; | |
400 a64->Segment = a32->Segment; | |
401 a64->Mode = a32->Mode; | |
402 } | |
403 | |
404 __inline | |
405 void | |
406 Address64To32( | |
407 LPADDRESS64 a64, | |
408 LPADDRESS a32 | |
409 ) | |
410 { | |
411 a32->Offset = (ULONG)a64->Offset; | |
412 a32->Segment = a64->Segment; | |
413 a32->Mode = a64->Mode; | |
414 } | |
415 #endif | |
416 | |
417 // | |
418 // This structure is included in the STACKFRAME structure, | |
419 // and is used to trace through usermode callbacks in a thread's | |
420 // kernel stack. The values must be copied by the kernel debugger | |
421 // from the DBGKD_GET_VERSION and WAIT_STATE_CHANGE packets. | |
422 // | |
423 | |
424 // | |
425 // New KDHELP structure for 64 bit system support. | |
426 // This structure is preferred in new code. | |
427 // | |
428 typedef struct _KDHELP64 { | |
429 | |
430 // | |
431 // address of kernel thread object, as provided in the | |
432 // WAIT_STATE_CHANGE packet. | |
433 // | |
434 DWORD64 Thread; | |
435 | |
436 // | |
437 // offset in thread object to pointer to the current callback frame | |
438 // in kernel stack. | |
439 // | |
440 DWORD ThCallbackStack; | |
441 | |
442 // | |
443 // offset in thread object to pointer to the current callback backing | |
444 // store frame in kernel stack. | |
445 // | |
446 DWORD ThCallbackBStore; | |
447 | |
448 // | |
449 // offsets to values in frame: | |
450 // | |
451 // address of next callback frame | |
452 DWORD NextCallback; | |
453 | |
454 // address of saved frame pointer (if applicable) | |
455 DWORD FramePointer; | |
456 | |
457 | |
458 // | |
459 // Address of the kernel function that calls out to user mode | |
460 // | |
461 DWORD64 KiCallUserMode; | |
462 | |
463 // | |
464 // Address of the user mode dispatcher function | |
465 // | |
466 DWORD64 KeUserCallbackDispatcher; | |
467 | |
468 // | |
469 // Lowest kernel mode address | |
470 // | |
471 DWORD64 SystemRangeStart; | |
472 | |
473 DWORD64 Reserved[8]; | |
474 | |
475 } KDHELP64, *PKDHELP64; | |
476 | |
477 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
478 #define KDHELP KDHELP64 | |
479 #define PKDHELP PKDHELP64 | |
480 #else | |
481 typedef struct _KDHELP { | |
482 | |
483 // | |
484 // address of kernel thread object, as provided in the | |
485 // WAIT_STATE_CHANGE packet. | |
486 // | |
487 DWORD Thread; | |
488 | |
489 // | |
490 // offset in thread object to pointer to the current callback frame | |
491 // in kernel stack. | |
492 // | |
493 DWORD ThCallbackStack; | |
494 | |
495 // | |
496 // offsets to values in frame: | |
497 // | |
498 // address of next callback frame | |
499 DWORD NextCallback; | |
500 | |
501 // address of saved frame pointer (if applicable) | |
502 DWORD FramePointer; | |
503 | |
504 // | |
505 // Address of the kernel function that calls out to user mode | |
506 // | |
507 DWORD KiCallUserMode; | |
508 | |
509 // | |
510 // Address of the user mode dispatcher function | |
511 // | |
512 DWORD KeUserCallbackDispatcher; | |
513 | |
514 // | |
515 // Lowest kernel mode address | |
516 // | |
517 DWORD SystemRangeStart; | |
518 | |
519 // | |
520 // offset in thread object to pointer to the current callback backing | |
521 // store frame in kernel stack. | |
522 // | |
523 DWORD ThCallbackBStore; | |
524 | |
525 DWORD Reserved[8]; | |
526 | |
527 } KDHELP, *PKDHELP; | |
528 | |
529 __inline | |
530 void | |
531 KdHelp32To64( | |
532 PKDHELP p32, | |
533 PKDHELP64 p64 | |
534 ) | |
535 { | |
536 p64->Thread = p32->Thread; | |
537 p64->ThCallbackStack = p32->ThCallbackStack; | |
538 p64->NextCallback = p32->NextCallback; | |
539 p64->FramePointer = p32->FramePointer; | |
540 p64->KiCallUserMode = p32->KiCallUserMode; | |
541 p64->KeUserCallbackDispatcher = p32->KeUserCallbackDispatcher; | |
542 p64->SystemRangeStart = p32->SystemRangeStart; | |
543 } | |
544 #endif | |
545 | |
546 typedef struct _tagSTACKFRAME64 { | |
547 ADDRESS64 AddrPC; // program counter | |
548 ADDRESS64 AddrReturn; // return address | |
549 ADDRESS64 AddrFrame; // frame pointer | |
550 ADDRESS64 AddrStack; // stack pointer | |
551 ADDRESS64 AddrBStore; // backing store pointer | |
552 PVOID FuncTableEntry; // pointer to pdata/fpo or NULL | |
553 DWORD64 Params[4]; // possible arguments to the function | |
554 BOOL Far; // WOW far call | |
555 BOOL Virtual; // is this a virtual frame? | |
556 DWORD64 Reserved[3]; | |
557 KDHELP64 KdHelp; | |
558 } STACKFRAME64, *LPSTACKFRAME64; | |
559 | |
560 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
561 #define STACKFRAME STACKFRAME64 | |
562 #define LPSTACKFRAME LPSTACKFRAME64 | |
563 #else | |
564 typedef struct _tagSTACKFRAME { | |
565 ADDRESS AddrPC; // program counter | |
566 ADDRESS AddrReturn; // return address | |
567 ADDRESS AddrFrame; // frame pointer | |
568 ADDRESS AddrStack; // stack pointer | |
569 PVOID FuncTableEntry; // pointer to pdata/fpo or NULL | |
570 DWORD Params[4]; // possible arguments to the function | |
571 BOOL Far; // WOW far call | |
572 BOOL Virtual; // is this a virtual frame? | |
573 DWORD Reserved[3]; | |
574 KDHELP KdHelp; | |
575 ADDRESS AddrBStore; // backing store pointer | |
576 } STACKFRAME, *LPSTACKFRAME; | |
577 #endif | |
578 | |
579 | |
580 typedef | |
581 BOOL | |
582 (__stdcall *PREAD_PROCESS_MEMORY_ROUTINE64)( | |
583 HANDLE hProcess, | |
584 DWORD64 qwBaseAddress, | |
585 PVOID lpBuffer, | |
586 DWORD nSize, | |
587 LPDWORD lpNumberOfBytesRead | |
588 ); | |
589 | |
590 typedef | |
591 PVOID | |
592 (__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE64)( | |
593 HANDLE hProcess, | |
594 DWORD64 AddrBase | |
595 ); | |
596 | |
597 typedef | |
598 DWORD64 | |
599 (__stdcall *PGET_MODULE_BASE_ROUTINE64)( | |
600 HANDLE hProcess, | |
601 DWORD64 Address | |
602 ); | |
603 | |
604 typedef | |
605 DWORD64 | |
606 (__stdcall *PTRANSLATE_ADDRESS_ROUTINE64)( | |
607 HANDLE hProcess, | |
608 HANDLE hThread, | |
609 LPADDRESS64 lpaddr | |
610 ); | |
611 | |
612 BOOL | |
613 IMAGEAPI | |
614 StackWalk64( | |
615 DWORD MachineType, | |
616 HANDLE hProcess, | |
617 HANDLE hThread, | |
618 LPSTACKFRAME64 StackFrame, | |
619 PVOID ContextRecord, | |
620 PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine, | |
621 PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, | |
622 PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine, | |
623 PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress | |
624 ); | |
625 | |
626 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
627 | |
628 #define PREAD_PROCESS_MEMORY_ROUTINE PREAD_PROCESS_MEMORY_ROUTINE64 | |
629 #define PFUNCTION_TABLE_ACCESS_ROUTINE PFUNCTION_TABLE_ACCESS_ROUTINE64 | |
630 #define PGET_MODULE_BASE_ROUTINE PGET_MODULE_BASE_ROUTINE64 | |
631 #define PTRANSLATE_ADDRESS_ROUTINE PTRANSLATE_ADDRESS_ROUTINE64 | |
632 | |
633 #define StackWalk StackWalk64 | |
634 | |
635 #else | |
636 | |
637 typedef | |
638 BOOL | |
639 (__stdcall *PREAD_PROCESS_MEMORY_ROUTINE)( | |
640 HANDLE hProcess, | |
641 DWORD lpBaseAddress, | |
642 PVOID lpBuffer, | |
643 DWORD nSize, | |
644 PDWORD lpNumberOfBytesRead | |
645 ); | |
646 | |
647 typedef | |
648 PVOID | |
649 (__stdcall *PFUNCTION_TABLE_ACCESS_ROUTINE)( | |
650 HANDLE hProcess, | |
651 DWORD AddrBase | |
652 ); | |
653 | |
654 typedef | |
655 DWORD | |
656 (__stdcall *PGET_MODULE_BASE_ROUTINE)( | |
657 HANDLE hProcess, | |
658 DWORD Address | |
659 ); | |
660 | |
661 typedef | |
662 DWORD | |
663 (__stdcall *PTRANSLATE_ADDRESS_ROUTINE)( | |
664 HANDLE hProcess, | |
665 HANDLE hThread, | |
666 LPADDRESS lpaddr | |
667 ); | |
668 | |
669 BOOL | |
670 IMAGEAPI | |
671 StackWalk( | |
672 DWORD MachineType, | |
673 HANDLE hProcess, | |
674 HANDLE hThread, | |
675 LPSTACKFRAME StackFrame, | |
676 PVOID ContextRecord, | |
677 PREAD_PROCESS_MEMORY_ROUTINE ReadMemoryRoutine, | |
678 PFUNCTION_TABLE_ACCESS_ROUTINE FunctionTableAccessRoutine, | |
679 PGET_MODULE_BASE_ROUTINE GetModuleBaseRoutine, | |
680 PTRANSLATE_ADDRESS_ROUTINE TranslateAddress | |
681 ); | |
682 | |
683 #endif | |
684 | |
685 | |
686 #define API_VERSION_NUMBER 9 | |
687 | |
688 typedef struct API_VERSION { | |
689 USHORT MajorVersion; | |
690 USHORT MinorVersion; | |
691 USHORT Revision; | |
692 USHORT Reserved; | |
693 } API_VERSION, *LPAPI_VERSION; | |
694 | |
695 LPAPI_VERSION | |
696 IMAGEAPI | |
697 ImagehlpApiVersion( | |
698 VOID | |
699 ); | |
700 | |
701 LPAPI_VERSION | |
702 IMAGEAPI | |
703 ImagehlpApiVersionEx( | |
704 LPAPI_VERSION AppVersion | |
705 ); | |
706 | |
707 DWORD | |
708 IMAGEAPI | |
709 GetTimestampForLoadedLibrary( | |
710 HMODULE Module | |
711 ); | |
712 | |
713 // | |
714 // typedefs for function pointers | |
715 // | |
716 typedef BOOL | |
717 (CALLBACK *PSYM_ENUMMODULES_CALLBACK64)( | |
718 PSTR ModuleName, | |
719 DWORD64 BaseOfDll, | |
720 PVOID UserContext | |
721 ); | |
722 | |
723 typedef BOOL | |
724 (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK64)( | |
725 PSTR SymbolName, | |
726 DWORD64 SymbolAddress, | |
727 ULONG SymbolSize, | |
728 PVOID UserContext | |
729 ); | |
730 | |
731 typedef BOOL | |
732 (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK64W)( | |
733 PWSTR SymbolName, | |
734 DWORD64 SymbolAddress, | |
735 ULONG SymbolSize, | |
736 PVOID UserContext | |
737 ); | |
738 | |
739 typedef BOOL | |
740 (CALLBACK *PENUMLOADED_MODULES_CALLBACK64)( | |
741 PSTR ModuleName, | |
742 DWORD64 ModuleBase, | |
743 ULONG ModuleSize, | |
744 PVOID UserContext | |
745 ); | |
746 | |
747 typedef BOOL | |
748 (CALLBACK *PSYMBOL_REGISTERED_CALLBACK64)( | |
749 HANDLE hProcess, | |
750 ULONG ActionCode, | |
751 ULONG64 CallbackData, | |
752 ULONG64 UserContext | |
753 ); | |
754 | |
755 typedef | |
756 PVOID | |
757 (CALLBACK *PSYMBOL_FUNCENTRY_CALLBACK)( | |
758 HANDLE hProcess, | |
759 DWORD AddrBase, | |
760 PVOID UserContext | |
761 ); | |
762 | |
763 typedef | |
764 PVOID | |
765 (CALLBACK *PSYMBOL_FUNCENTRY_CALLBACK64)( | |
766 HANDLE hProcess, | |
767 ULONG64 AddrBase, | |
768 ULONG64 UserContext | |
769 ); | |
770 | |
771 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
772 | |
773 #define PSYM_ENUMMODULES_CALLBACK PSYM_ENUMMODULES_CALLBACK64 | |
774 #define PSYM_ENUMSYMBOLS_CALLBACK PSYM_ENUMSYMBOLS_CALLBACK64 | |
775 #define PSYM_ENUMSYMBOLS_CALLBACKW PSYM_ENUMSYMBOLS_CALLBACK64W | |
776 #define PENUMLOADED_MODULES_CALLBACK PENUMLOADED_MODULES_CALLBACK64 | |
777 #define PSYMBOL_REGISTERED_CALLBACK PSYMBOL_REGISTERED_CALLBACK64 | |
778 #define PSYMBOL_FUNCENTRY_CALLBACK PSYMBOL_FUNCENTRY_CALLBACK64 | |
779 | |
780 #else | |
781 | |
782 typedef BOOL | |
783 (CALLBACK *PSYM_ENUMMODULES_CALLBACK)( | |
784 PSTR ModuleName, | |
785 ULONG BaseOfDll, | |
786 PVOID UserContext | |
787 ); | |
788 | |
789 typedef BOOL | |
790 (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK)( | |
791 PSTR SymbolName, | |
792 ULONG SymbolAddress, | |
793 ULONG SymbolSize, | |
794 PVOID UserContext | |
795 ); | |
796 | |
797 typedef BOOL | |
798 (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACKW)( | |
799 PWSTR SymbolName, | |
800 ULONG SymbolAddress, | |
801 ULONG SymbolSize, | |
802 PVOID UserContext | |
803 ); | |
804 | |
805 typedef BOOL | |
806 (CALLBACK *PENUMLOADED_MODULES_CALLBACK)( | |
807 PSTR ModuleName, | |
808 ULONG ModuleBase, | |
809 ULONG ModuleSize, | |
810 PVOID UserContext | |
811 ); | |
812 | |
813 typedef BOOL | |
814 (CALLBACK *PSYMBOL_REGISTERED_CALLBACK)( | |
815 HANDLE hProcess, | |
816 ULONG ActionCode, | |
817 PVOID CallbackData, | |
818 PVOID UserContext | |
819 ); | |
820 | |
821 #endif | |
822 | |
823 | |
824 // | |
825 // flags found in SYMBOL_INFO.Flags | |
826 // | |
827 | |
828 #define SYMFLAG_VALUEPRESENT 0x00000001 | |
829 #define SYMFLAG_REGISTER 0x00000008 | |
830 #define SYMFLAG_REGREL 0x00000010 | |
831 #define SYMFLAG_FRAMEREL 0x00000020 | |
832 #define SYMFLAG_PARAMETER 0x00000040 | |
833 #define SYMFLAG_LOCAL 0x00000080 | |
834 #define SYMFLAG_CONSTANT 0x00000100 | |
835 #define SYMFLAG_EXPORT 0x00000200 | |
836 #define SYMFLAG_FORWARDER 0x00000400 | |
837 #define SYMFLAG_FUNCTION 0x00000800 | |
838 #define SYMFLAG_VIRTUAL 0x00001000 | |
839 #define SYMFLAG_THUNK 0x00002000 | |
840 #define SYMFLAG_TLSREL 0x00004000 | |
841 | |
842 // | |
843 // symbol type enumeration | |
844 // | |
845 typedef enum { | |
846 SymNone = 0, | |
847 SymCoff, | |
848 SymCv, | |
849 SymPdb, | |
850 SymExport, | |
851 SymDeferred, | |
852 SymSym, // .sym file | |
853 SymDia, | |
854 SymVirtual, | |
855 NumSymTypes | |
856 } SYM_TYPE; | |
857 | |
858 // | |
859 // symbol data structure | |
860 // | |
861 | |
862 typedef struct _IMAGEHLP_SYMBOL64 { | |
863 DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_SYMBOL64) | |
864 DWORD64 Address; // virtual address including dll base address | |
865 DWORD Size; // estimated size of symbol, can be zero | |
866 DWORD Flags; // info about the symbols, see the SYMF defines | |
867 DWORD MaxNameLength; // maximum size of symbol name in 'Name' | |
868 CHAR Name[1]; // symbol name (null terminated string) | |
869 } IMAGEHLP_SYMBOL64, *PIMAGEHLP_SYMBOL64; | |
870 | |
871 typedef struct _IMAGEHLP_SYMBOL64_PACKAGE { | |
872 IMAGEHLP_SYMBOL64 sym; | |
873 CHAR name[MAX_SYM_NAME + 1]; | |
874 } IMAGEHLP_SYMBOL64_PACKAGE, *PIMAGEHLP_SYMBOL64_PACKAGE; | |
875 | |
876 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
877 | |
878 #define IMAGEHLP_SYMBOL IMAGEHLP_SYMBOL64 | |
879 #define PIMAGEHLP_SYMBOL PIMAGEHLP_SYMBOL64 | |
880 #define IMAGEHLP_SYMBOL_PACKAGE IMAGEHLP_SYMBOL64_PACKAGE | |
881 #define PIMAGEHLP_SYMBOL_PACKAGE PIMAGEHLP_SYMBOL64_PACKAGE | |
882 | |
883 #else | |
884 | |
885 typedef struct _IMAGEHLP_SYMBOL { | |
886 DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_SYMBOL) | |
887 DWORD Address; // virtual address including dll base address | |
888 DWORD Size; // estimated size of symbol, can be zero | |
889 DWORD Flags; // info about the symbols, see the SYMF defines | |
890 DWORD MaxNameLength; // maximum size of symbol name in 'Name' | |
891 CHAR Name[1]; // symbol name (null terminated string) | |
892 } IMAGEHLP_SYMBOL, *PIMAGEHLP_SYMBOL; | |
893 | |
894 typedef struct _IMAGEHLP_SYMBOL_PACKAGE { | |
895 IMAGEHLP_SYMBOL sym; | |
896 CHAR name[MAX_SYM_NAME + 1]; | |
897 } IMAGEHLP_SYMBOL_PACKAGE, *PIMAGEHLP_SYMBOL_PACKAGE; | |
898 | |
899 #endif | |
900 | |
901 // | |
902 // module data structure | |
903 // | |
904 | |
905 typedef struct _IMAGEHLP_MODULE64 { | |
906 DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_MODULE64) | |
907 DWORD64 BaseOfImage; // base load address of module | |
908 DWORD ImageSize; // virtual size of the loaded module | |
909 DWORD TimeDateStamp; // date/time stamp from pe header | |
910 DWORD CheckSum; // checksum from the pe header | |
911 DWORD NumSyms; // number of symbols in the symbol table | |
912 SYM_TYPE SymType; // type of symbols loaded | |
913 CHAR ModuleName[32]; // module name | |
914 CHAR ImageName[256]; // image name | |
915 CHAR LoadedImageName[256]; // symbol file name | |
916 } IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64; | |
917 | |
918 typedef struct _IMAGEHLP_MODULE64W { | |
919 DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_MODULE64) | |
920 DWORD64 BaseOfImage; // base load address of module | |
921 DWORD ImageSize; // virtual size of the loaded module | |
922 DWORD TimeDateStamp; // date/time stamp from pe header | |
923 DWORD CheckSum; // checksum from the pe header | |
924 DWORD NumSyms; // number of symbols in the symbol table | |
925 SYM_TYPE SymType; // type of symbols loaded | |
926 WCHAR ModuleName[32]; // module name | |
927 WCHAR ImageName[256]; // image name | |
928 WCHAR LoadedImageName[256]; // symbol file name | |
929 } IMAGEHLP_MODULEW64, *PIMAGEHLP_MODULEW64; | |
930 | |
931 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
932 #define IMAGEHLP_MODULE IMAGEHLP_MODULE64 | |
933 #define PIMAGEHLP_MODULE PIMAGEHLP_MODULE64 | |
934 #define IMAGEHLP_MODULEW IMAGEHLP_MODULEW64 | |
935 #define PIMAGEHLP_MODULEW PIMAGEHLP_MODULEW64 | |
936 #else | |
937 typedef struct _IMAGEHLP_MODULE { | |
938 DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_MODULE) | |
939 DWORD BaseOfImage; // base load address of module | |
940 DWORD ImageSize; // virtual size of the loaded module | |
941 DWORD TimeDateStamp; // date/time stamp from pe header | |
942 DWORD CheckSum; // checksum from the pe header | |
943 DWORD NumSyms; // number of symbols in the symbol table | |
944 SYM_TYPE SymType; // type of symbols loaded | |
945 CHAR ModuleName[32]; // module name | |
946 CHAR ImageName[256]; // image name | |
947 CHAR LoadedImageName[256]; // symbol file name | |
948 } IMAGEHLP_MODULE, *PIMAGEHLP_MODULE; | |
949 | |
950 typedef struct _IMAGEHLP_MODULEW { | |
951 DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_MODULE) | |
952 DWORD BaseOfImage; // base load address of module | |
953 DWORD ImageSize; // virtual size of the loaded module | |
954 DWORD TimeDateStamp; // date/time stamp from pe header | |
955 DWORD CheckSum; // checksum from the pe header | |
956 DWORD NumSyms; // number of symbols in the symbol table | |
957 SYM_TYPE SymType; // type of symbols loaded | |
958 WCHAR ModuleName[32]; // module name | |
959 WCHAR ImageName[256]; // image name | |
960 WCHAR LoadedImageName[256]; // symbol file name | |
961 } IMAGEHLP_MODULEW, *PIMAGEHLP_MODULEW; | |
962 #endif | |
963 | |
964 // | |
965 // source file line data structure | |
966 // | |
967 | |
968 typedef struct _IMAGEHLP_LINE64 { | |
969 DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_LINE64) | |
970 PVOID Key; // internal | |
971 DWORD LineNumber; // line number in file | |
972 PCHAR FileName; // full filename | |
973 DWORD64 Address; // first instruction of line | |
974 } IMAGEHLP_LINE64, *PIMAGEHLP_LINE64; | |
975 | |
976 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
977 #define IMAGEHLP_LINE IMAGEHLP_LINE64 | |
978 #define PIMAGEHLP_LINE PIMAGEHLP_LINE64 | |
979 #else | |
980 typedef struct _IMAGEHLP_LINE { | |
981 DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_LINE) | |
982 PVOID Key; // internal | |
983 DWORD LineNumber; // line number in file | |
984 PCHAR FileName; // full filename | |
985 DWORD Address; // first instruction of line | |
986 } IMAGEHLP_LINE, *PIMAGEHLP_LINE; | |
987 #endif | |
988 | |
989 // | |
990 // source file structure | |
991 // | |
992 | |
993 typedef struct _SOURCEFILE { | |
994 DWORD64 ModBase; // base address of loaded module | |
995 PCHAR FileName; // full filename of source | |
996 } SOURCEFILE, *PSOURCEFILE; | |
997 | |
998 // | |
999 // data structures used for registered symbol callbacks | |
1000 // | |
1001 | |
1002 #define CBA_DEFERRED_SYMBOL_LOAD_START 0x00000001 | |
1003 #define CBA_DEFERRED_SYMBOL_LOAD_COMPLETE 0x00000002 | |
1004 #define CBA_DEFERRED_SYMBOL_LOAD_FAILURE 0x00000003 | |
1005 #define CBA_SYMBOLS_UNLOADED 0x00000004 | |
1006 #define CBA_DUPLICATE_SYMBOL 0x00000005 | |
1007 #define CBA_READ_MEMORY 0x00000006 | |
1008 #define CBA_DEFERRED_SYMBOL_LOAD_CANCEL 0x00000007 | |
1009 #define CBA_SET_OPTIONS 0x00000008 | |
1010 #define CBA_EVENT 0x00000010 | |
1011 #define CBA_DEFERRED_SYMBOL_LOAD_PARTIAL 0x00000020 | |
1012 #define CBA_DEBUG_INFO 0x10000000 | |
1013 | |
1014 typedef struct _IMAGEHLP_CBA_READ_MEMORY { | |
1015 DWORD64 addr; // address to read from | |
1016 PVOID buf; // buffer to read to | |
1017 DWORD bytes; // amount of bytes to read | |
1018 DWORD *bytesread; // pointer to store amount of bytes read | |
1019 } IMAGEHLP_CBA_READ_MEMORY, *PIMAGEHLP_CBA_READ_MEMORY; | |
1020 | |
1021 enum { | |
1022 sevInfo = 0, | |
1023 sevProblem, | |
1024 sevAttn, | |
1025 sevFatal, | |
1026 sevMax // unused | |
1027 }; | |
1028 | |
1029 typedef struct _IMAGEHLP_CBA_EVENT { | |
1030 DWORD severity; // values from sevInfo to sevFatal | |
1031 DWORD code; // numerical code IDs the error | |
1032 PCHAR desc; // may contain a text description of the error | |
1033 PVOID object; // value dependant upon the error code | |
1034 } IMAGEHLP_CBA_EVENT, *PIMAGEHLP_CBA_EVENT; | |
1035 | |
1036 typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD64 { | |
1037 DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_DEFERRED_SYMBOL_LOAD64) | |
1038 DWORD64 BaseOfImage; // base load address of module | |
1039 DWORD CheckSum; // checksum from the pe header | |
1040 DWORD TimeDateStamp; // date/time stamp from pe header | |
1041 CHAR FileName[MAX_PATH]; // symbols file or image name | |
1042 BOOLEAN Reparse; // load failure reparse | |
1043 HANDLE hFile; // file handle, if passed | |
1044 DWORD Flags; // | |
1045 } IMAGEHLP_DEFERRED_SYMBOL_LOAD64, *PIMAGEHLP_DEFERRED_SYMBOL_LOAD64; | |
1046 | |
1047 #define DSLFLAG_MISMATCHED_PDB 0x1 | |
1048 #define DSLFLAG_MISMATCHED_DBG 0x2 | |
1049 | |
1050 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1051 #define IMAGEHLP_DEFERRED_SYMBOL_LOAD IMAGEHLP_DEFERRED_SYMBOL_LOAD64 | |
1052 #define PIMAGEHLP_DEFERRED_SYMBOL_LOAD PIMAGEHLP_DEFERRED_SYMBOL_LOAD64 | |
1053 #else | |
1054 typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD { | |
1055 DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_DEFERRED_SYMBOL_LOAD) | |
1056 DWORD BaseOfImage; // base load address of module | |
1057 DWORD CheckSum; // checksum from the pe header | |
1058 DWORD TimeDateStamp; // date/time stamp from pe header | |
1059 CHAR FileName[MAX_PATH]; // symbols file or image name | |
1060 BOOLEAN Reparse; // load failure reparse | |
1061 HANDLE hFile; // file handle, if passed | |
1062 } IMAGEHLP_DEFERRED_SYMBOL_LOAD, *PIMAGEHLP_DEFERRED_SYMBOL_LOAD; | |
1063 #endif | |
1064 | |
1065 typedef struct _IMAGEHLP_DUPLICATE_SYMBOL64 { | |
1066 DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_DUPLICATE_SYMBOL64) | |
1067 DWORD NumberOfDups; // number of duplicates in the Symbol array | |
1068 PIMAGEHLP_SYMBOL64 Symbol; // array of duplicate symbols | |
1069 DWORD SelectedSymbol; // symbol selected (-1 to start) | |
1070 } IMAGEHLP_DUPLICATE_SYMBOL64, *PIMAGEHLP_DUPLICATE_SYMBOL64; | |
1071 | |
1072 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1073 #define IMAGEHLP_DUPLICATE_SYMBOL IMAGEHLP_DUPLICATE_SYMBOL64 | |
1074 #define PIMAGEHLP_DUPLICATE_SYMBOL PIMAGEHLP_DUPLICATE_SYMBOL64 | |
1075 #else | |
1076 typedef struct _IMAGEHLP_DUPLICATE_SYMBOL { | |
1077 DWORD SizeOfStruct; // set to sizeof(IMAGEHLP_DUPLICATE_SYMBOL) | |
1078 DWORD NumberOfDups; // number of duplicates in the Symbol array | |
1079 PIMAGEHLP_SYMBOL Symbol; // array of duplicate symbols | |
1080 DWORD SelectedSymbol; // symbol selected (-1 to start) | |
1081 } IMAGEHLP_DUPLICATE_SYMBOL, *PIMAGEHLP_DUPLICATE_SYMBOL; | |
1082 #endif | |
1083 | |
1084 // If dbghelp ever needs to display graphical UI, it will use this as the parent window. | |
1085 | |
1086 BOOL | |
1087 SymSetParentWindow( | |
1088 HWND hwnd | |
1089 ); | |
1090 | |
1091 // | |
1092 // options that are set/returned by SymSetOptions() & SymGetOptions() | |
1093 // these are used as a mask | |
1094 // | |
1095 #define SYMOPT_CASE_INSENSITIVE 0x00000001 | |
1096 #define SYMOPT_UNDNAME 0x00000002 | |
1097 #define SYMOPT_DEFERRED_LOADS 0x00000004 | |
1098 #define SYMOPT_NO_CPP 0x00000008 | |
1099 #define SYMOPT_LOAD_LINES 0x00000010 | |
1100 #define SYMOPT_OMAP_FIND_NEAREST 0x00000020 | |
1101 #define SYMOPT_LOAD_ANYTHING 0x00000040 | |
1102 #define SYMOPT_IGNORE_CVREC 0x00000080 | |
1103 #define SYMOPT_NO_UNQUALIFIED_LOADS 0x00000100 | |
1104 #define SYMOPT_FAIL_CRITICAL_ERRORS 0x00000200 | |
1105 #define SYMOPT_EXACT_SYMBOLS 0x00000400 | |
1106 #define SYMOPT_ALLOW_ABSOLUTE_SYMBOLS 0x00000800 | |
1107 #define SYMOPT_IGNORE_NT_SYMPATH 0x00001000 | |
1108 #define SYMOPT_INCLUDE_32BIT_MODULES 0x00002000 | |
1109 #define SYMOPT_PUBLICS_ONLY 0x00004000 | |
1110 #define SYMOPT_NO_PUBLICS 0x00008000 | |
1111 #define SYMOPT_AUTO_PUBLICS 0x00010000 | |
1112 #define SYMOPT_NO_IMAGE_SEARCH 0x00020000 | |
1113 #define SYMOPT_SECURE 0x00040000 | |
1114 | |
1115 #define SYMOPT_DEBUG 0x80000000 | |
1116 | |
1117 DWORD | |
1118 IMAGEAPI | |
1119 SymSetOptions( | |
1120 IN DWORD SymOptions | |
1121 ); | |
1122 | |
1123 DWORD | |
1124 IMAGEAPI | |
1125 SymGetOptions( | |
1126 VOID | |
1127 ); | |
1128 | |
1129 BOOL | |
1130 IMAGEAPI | |
1131 SymCleanup( | |
1132 IN HANDLE hProcess | |
1133 ); | |
1134 | |
1135 BOOL | |
1136 IMAGEAPI | |
1137 SymMatchString( | |
1138 IN LPSTR string, | |
1139 IN LPSTR expression, | |
1140 IN BOOL fCase | |
1141 ); | |
1142 | |
1143 typedef BOOL | |
1144 (CALLBACK *PSYM_ENUMSOURCFILES_CALLBACK)( | |
1145 PSOURCEFILE pSourceFile, | |
1146 PVOID UserContext | |
1147 ); | |
1148 | |
1149 BOOL | |
1150 IMAGEAPI | |
1151 SymEnumSourceFiles( | |
1152 IN HANDLE hProcess, | |
1153 IN ULONG64 ModBase, | |
1154 IN LPSTR Mask, | |
1155 IN PSYM_ENUMSOURCFILES_CALLBACK cbSrcFiles, | |
1156 IN PVOID UserContext | |
1157 ); | |
1158 | |
1159 BOOL | |
1160 IMAGEAPI | |
1161 SymEnumerateModules64( | |
1162 IN HANDLE hProcess, | |
1163 IN PSYM_ENUMMODULES_CALLBACK64 EnumModulesCallback, | |
1164 IN PVOID UserContext | |
1165 ); | |
1166 | |
1167 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1168 #define SymEnumerateModules SymEnumerateModules64 | |
1169 #else | |
1170 BOOL | |
1171 IMAGEAPI | |
1172 SymEnumerateModules( | |
1173 IN HANDLE hProcess, | |
1174 IN PSYM_ENUMMODULES_CALLBACK EnumModulesCallback, | |
1175 IN PVOID UserContext | |
1176 ); | |
1177 #endif | |
1178 | |
1179 BOOL | |
1180 IMAGEAPI | |
1181 SymEnumerateSymbols64( | |
1182 IN HANDLE hProcess, | |
1183 IN DWORD64 BaseOfDll, | |
1184 IN PSYM_ENUMSYMBOLS_CALLBACK64 EnumSymbolsCallback, | |
1185 IN PVOID UserContext | |
1186 ); | |
1187 | |
1188 BOOL | |
1189 IMAGEAPI | |
1190 SymEnumerateSymbolsW64( | |
1191 IN HANDLE hProcess, | |
1192 IN DWORD64 BaseOfDll, | |
1193 IN PSYM_ENUMSYMBOLS_CALLBACK64W EnumSymbolsCallback, | |
1194 IN PVOID UserContext | |
1195 ); | |
1196 | |
1197 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1198 #define SymEnumerateSymbols SymEnumerateSymbols64 | |
1199 #define SymEnumerateSymbolsW SymEnumerateSymbolsW64 | |
1200 #else | |
1201 BOOL | |
1202 IMAGEAPI | |
1203 SymEnumerateSymbols( | |
1204 IN HANDLE hProcess, | |
1205 IN DWORD BaseOfDll, | |
1206 IN PSYM_ENUMSYMBOLS_CALLBACK EnumSymbolsCallback, | |
1207 IN PVOID UserContext | |
1208 ); | |
1209 | |
1210 BOOL | |
1211 IMAGEAPI | |
1212 SymEnumerateSymbolsW( | |
1213 IN HANDLE hProcess, | |
1214 IN DWORD BaseOfDll, | |
1215 IN PSYM_ENUMSYMBOLS_CALLBACKW EnumSymbolsCallback, | |
1216 IN PVOID UserContext | |
1217 ); | |
1218 #endif | |
1219 | |
1220 BOOL | |
1221 IMAGEAPI | |
1222 EnumerateLoadedModules64( | |
1223 IN HANDLE hProcess, | |
1224 IN PENUMLOADED_MODULES_CALLBACK64 EnumLoadedModulesCallback, | |
1225 IN PVOID UserContext | |
1226 ); | |
1227 | |
1228 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1229 #define EnumerateLoadedModules EnumerateLoadedModules64 | |
1230 #else | |
1231 BOOL | |
1232 IMAGEAPI | |
1233 EnumerateLoadedModules( | |
1234 IN HANDLE hProcess, | |
1235 IN PENUMLOADED_MODULES_CALLBACK EnumLoadedModulesCallback, | |
1236 IN PVOID UserContext | |
1237 ); | |
1238 #endif | |
1239 | |
1240 PVOID | |
1241 IMAGEAPI | |
1242 SymFunctionTableAccess64( | |
1243 HANDLE hProcess, | |
1244 DWORD64 AddrBase | |
1245 ); | |
1246 | |
1247 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1248 #define SymFunctionTableAccess SymFunctionTableAccess64 | |
1249 #else | |
1250 PVOID | |
1251 IMAGEAPI | |
1252 SymFunctionTableAccess( | |
1253 HANDLE hProcess, | |
1254 DWORD AddrBase | |
1255 ); | |
1256 #endif | |
1257 | |
1258 BOOL | |
1259 IMAGEAPI | |
1260 SymGetModuleInfo64( | |
1261 IN HANDLE hProcess, | |
1262 IN DWORD64 qwAddr, | |
1263 OUT PIMAGEHLP_MODULE64 ModuleInfo | |
1264 ); | |
1265 | |
1266 BOOL | |
1267 IMAGEAPI | |
1268 SymGetModuleInfoW64( | |
1269 IN HANDLE hProcess, | |
1270 IN DWORD64 qwAddr, | |
1271 OUT PIMAGEHLP_MODULEW64 ModuleInfo | |
1272 ); | |
1273 | |
1274 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1275 #define SymGetModuleInfo SymGetModuleInfo64 | |
1276 #define SymGetModuleInfoW SymGetModuleInfoW64 | |
1277 #else | |
1278 BOOL | |
1279 IMAGEAPI | |
1280 SymGetModuleInfo( | |
1281 IN HANDLE hProcess, | |
1282 IN DWORD dwAddr, | |
1283 OUT PIMAGEHLP_MODULE ModuleInfo | |
1284 ); | |
1285 | |
1286 BOOL | |
1287 IMAGEAPI | |
1288 SymGetModuleInfoW( | |
1289 IN HANDLE hProcess, | |
1290 IN DWORD dwAddr, | |
1291 OUT PIMAGEHLP_MODULEW ModuleInfo | |
1292 ); | |
1293 #endif | |
1294 | |
1295 DWORD64 | |
1296 IMAGEAPI | |
1297 SymGetModuleBase64( | |
1298 IN HANDLE hProcess, | |
1299 IN DWORD64 qwAddr | |
1300 ); | |
1301 | |
1302 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1303 #define SymGetModuleBase SymGetModuleBase64 | |
1304 #else | |
1305 DWORD | |
1306 IMAGEAPI | |
1307 SymGetModuleBase( | |
1308 IN HANDLE hProcess, | |
1309 IN DWORD dwAddr | |
1310 ); | |
1311 #endif | |
1312 | |
1313 BOOL | |
1314 IMAGEAPI | |
1315 SymGetSymNext64( | |
1316 IN HANDLE hProcess, | |
1317 IN OUT PIMAGEHLP_SYMBOL64 Symbol | |
1318 ); | |
1319 | |
1320 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1321 #define SymGetSymNext SymGetSymNext64 | |
1322 #else | |
1323 BOOL | |
1324 IMAGEAPI | |
1325 SymGetSymNext( | |
1326 IN HANDLE hProcess, | |
1327 IN OUT PIMAGEHLP_SYMBOL Symbol | |
1328 ); | |
1329 #endif | |
1330 | |
1331 BOOL | |
1332 IMAGEAPI | |
1333 SymGetSymPrev64( | |
1334 IN HANDLE hProcess, | |
1335 IN OUT PIMAGEHLP_SYMBOL64 Symbol | |
1336 ); | |
1337 | |
1338 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1339 #define SymGetSymPrev SymGetSymPrev64 | |
1340 #else | |
1341 BOOL | |
1342 IMAGEAPI | |
1343 SymGetSymPrev( | |
1344 IN HANDLE hProcess, | |
1345 IN OUT PIMAGEHLP_SYMBOL Symbol | |
1346 ); | |
1347 #endif | |
1348 | |
1349 BOOL | |
1350 IMAGEAPI | |
1351 SymGetLineFromAddr64( | |
1352 IN HANDLE hProcess, | |
1353 IN DWORD64 qwAddr, | |
1354 OUT PDWORD pdwDisplacement, | |
1355 OUT PIMAGEHLP_LINE64 Line64 | |
1356 ); | |
1357 | |
1358 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1359 #define SymGetLineFromAddr SymGetLineFromAddr64 | |
1360 #else | |
1361 BOOL | |
1362 IMAGEAPI | |
1363 SymGetLineFromAddr( | |
1364 IN HANDLE hProcess, | |
1365 IN DWORD dwAddr, | |
1366 OUT PDWORD pdwDisplacement, | |
1367 OUT PIMAGEHLP_LINE Line | |
1368 ); | |
1369 #endif | |
1370 | |
1371 BOOL | |
1372 IMAGEAPI | |
1373 SymGetLineFromName64( | |
1374 IN HANDLE hProcess, | |
1375 IN PSTR ModuleName, | |
1376 IN PSTR FileName, | |
1377 IN DWORD dwLineNumber, | |
1378 OUT PLONG plDisplacement, | |
1379 IN OUT PIMAGEHLP_LINE64 Line | |
1380 ); | |
1381 | |
1382 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1383 #define SymGetLineFromName SymGetLineFromName64 | |
1384 #else | |
1385 BOOL | |
1386 IMAGEAPI | |
1387 SymGetLineFromName( | |
1388 IN HANDLE hProcess, | |
1389 IN PSTR ModuleName, | |
1390 IN PSTR FileName, | |
1391 IN DWORD dwLineNumber, | |
1392 OUT PLONG plDisplacement, | |
1393 IN OUT PIMAGEHLP_LINE Line | |
1394 ); | |
1395 #endif | |
1396 | |
1397 BOOL | |
1398 IMAGEAPI | |
1399 SymGetLineNext64( | |
1400 IN HANDLE hProcess, | |
1401 IN OUT PIMAGEHLP_LINE64 Line | |
1402 ); | |
1403 | |
1404 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1405 #define SymGetLineNext SymGetLineNext64 | |
1406 #else | |
1407 BOOL | |
1408 IMAGEAPI | |
1409 SymGetLineNext( | |
1410 IN HANDLE hProcess, | |
1411 IN OUT PIMAGEHLP_LINE Line | |
1412 ); | |
1413 #endif | |
1414 | |
1415 BOOL | |
1416 IMAGEAPI | |
1417 SymGetLinePrev64( | |
1418 IN HANDLE hProcess, | |
1419 IN OUT PIMAGEHLP_LINE64 Line | |
1420 ); | |
1421 | |
1422 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1423 #define SymGetLinePrev SymGetLinePrev64 | |
1424 #else | |
1425 BOOL | |
1426 IMAGEAPI | |
1427 SymGetLinePrev( | |
1428 IN HANDLE hProcess, | |
1429 IN OUT PIMAGEHLP_LINE Line | |
1430 ); | |
1431 #endif | |
1432 | |
1433 BOOL | |
1434 IMAGEAPI | |
1435 SymMatchFileName( | |
1436 IN PSTR FileName, | |
1437 IN PSTR Match, | |
1438 OUT PSTR *FileNameStop, | |
1439 OUT PSTR *MatchStop | |
1440 ); | |
1441 | |
1442 BOOL | |
1443 IMAGEAPI | |
1444 SymInitialize( | |
1445 IN HANDLE hProcess, | |
1446 IN PSTR UserSearchPath, | |
1447 IN BOOL fInvadeProcess | |
1448 ); | |
1449 | |
1450 BOOL | |
1451 IMAGEAPI | |
1452 SymGetSearchPath( | |
1453 IN HANDLE hProcess, | |
1454 OUT PSTR SearchPath, | |
1455 IN DWORD SearchPathLength | |
1456 ); | |
1457 | |
1458 BOOL | |
1459 IMAGEAPI | |
1460 SymSetSearchPath( | |
1461 IN HANDLE hProcess, | |
1462 IN PSTR SearchPath | |
1463 ); | |
1464 | |
1465 DWORD64 | |
1466 IMAGEAPI | |
1467 SymLoadModule64( | |
1468 IN HANDLE hProcess, | |
1469 IN HANDLE hFile, | |
1470 IN PSTR ImageName, | |
1471 IN PSTR ModuleName, | |
1472 IN DWORD64 BaseOfDll, | |
1473 IN DWORD SizeOfDll | |
1474 ); | |
1475 | |
1476 #define SLMFLAG_VIRTUAL 0x1 | |
1477 | |
1478 DWORD64 | |
1479 IMAGEAPI | |
1480 SymLoadModuleEx( | |
1481 IN HANDLE hProcess, | |
1482 IN HANDLE hFile, | |
1483 IN PSTR ImageName, | |
1484 IN PSTR ModuleName, | |
1485 IN DWORD64 BaseOfDll, | |
1486 IN DWORD DllSize, | |
1487 IN PMODLOAD_DATA Data, | |
1488 IN DWORD Flags | |
1489 ); | |
1490 | |
1491 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1492 #define SymLoadModule SymLoadModule64 | |
1493 #else | |
1494 DWORD | |
1495 IMAGEAPI | |
1496 SymLoadModule( | |
1497 IN HANDLE hProcess, | |
1498 IN HANDLE hFile, | |
1499 IN PSTR ImageName, | |
1500 IN PSTR ModuleName, | |
1501 IN DWORD BaseOfDll, | |
1502 IN DWORD SizeOfDll | |
1503 ); | |
1504 #endif | |
1505 | |
1506 BOOL | |
1507 IMAGEAPI | |
1508 SymUnloadModule64( | |
1509 IN HANDLE hProcess, | |
1510 IN DWORD64 BaseOfDll | |
1511 ); | |
1512 | |
1513 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1514 #define SymUnloadModule SymUnloadModule64 | |
1515 #else | |
1516 BOOL | |
1517 IMAGEAPI | |
1518 SymUnloadModule( | |
1519 IN HANDLE hProcess, | |
1520 IN DWORD BaseOfDll | |
1521 ); | |
1522 #endif | |
1523 | |
1524 BOOL | |
1525 IMAGEAPI | |
1526 SymUnDName64( | |
1527 IN PIMAGEHLP_SYMBOL64 sym, // Symbol to undecorate | |
1528 OUT PSTR UnDecName, // Buffer to store undecorated name in | |
1529 IN DWORD UnDecNameLength // Size of the buffer | |
1530 ); | |
1531 | |
1532 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1533 #define SymUnDName SymUnDName64 | |
1534 #else | |
1535 BOOL | |
1536 IMAGEAPI | |
1537 SymUnDName( | |
1538 IN PIMAGEHLP_SYMBOL sym, // Symbol to undecorate | |
1539 OUT PSTR UnDecName, // Buffer to store undecorated name in | |
1540 IN DWORD UnDecNameLength // Size of the buffer | |
1541 ); | |
1542 #endif | |
1543 | |
1544 BOOL | |
1545 IMAGEAPI | |
1546 SymRegisterCallback64( | |
1547 IN HANDLE hProcess, | |
1548 IN PSYMBOL_REGISTERED_CALLBACK64 CallbackFunction, | |
1549 IN ULONG64 UserContext | |
1550 ); | |
1551 | |
1552 BOOL | |
1553 IMAGEAPI | |
1554 SymRegisterFunctionEntryCallback64( | |
1555 IN HANDLE hProcess, | |
1556 IN PSYMBOL_FUNCENTRY_CALLBACK64 CallbackFunction, | |
1557 IN ULONG64 UserContext | |
1558 ); | |
1559 | |
1560 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1561 #define SymRegisterCallback SymRegisterCallback64 | |
1562 #define SymRegisterFunctionEntryCallback SymRegisterFunctionEntryCallback64 | |
1563 #else | |
1564 BOOL | |
1565 IMAGEAPI | |
1566 SymRegisterCallback( | |
1567 IN HANDLE hProcess, | |
1568 IN PSYMBOL_REGISTERED_CALLBACK CallbackFunction, | |
1569 IN PVOID UserContext | |
1570 ); | |
1571 | |
1572 BOOL | |
1573 IMAGEAPI | |
1574 SymRegisterFunctionEntryCallback( | |
1575 IN HANDLE hProcess, | |
1576 IN PSYMBOL_FUNCENTRY_CALLBACK CallbackFunction, | |
1577 IN PVOID UserContext | |
1578 ); | |
1579 #endif | |
1580 | |
1581 | |
1582 typedef struct _IMAGEHLP_SYMBOL_SRC { | |
1583 DWORD sizeofstruct; | |
1584 DWORD type; | |
1585 char file[MAX_PATH]; | |
1586 } IMAGEHLP_SYMBOL_SRC, *PIMAGEHLP_SYMBOL_SRC; | |
1587 | |
1588 typedef struct _MODULE_TYPE_INFO { // AKA TYPTYP | |
1589 USHORT dataLength; | |
1590 USHORT leaf; | |
1591 BYTE data[1]; | |
1592 } MODULE_TYPE_INFO, *PMODULE_TYPE_INFO; | |
1593 | |
1594 typedef struct _SYMBOL_INFO { | |
1595 ULONG SizeOfStruct; | |
1596 ULONG TypeIndex; // Type Index of symbol | |
1597 ULONG64 Reserved[2]; | |
1598 ULONG info; | |
1599 ULONG Size; | |
1600 ULONG64 ModBase; // Base Address of module comtaining this symbol | |
1601 ULONG Flags; | |
1602 ULONG64 Value; // Value of symbol, ValuePresent should be 1 | |
1603 ULONG64 Address; // Address of symbol including base address of module | |
1604 ULONG Register; // register holding value or pointer to value | |
1605 ULONG Scope; // scope of the symbol | |
1606 ULONG Tag; // pdb classification | |
1607 ULONG NameLen; // Actual length of name | |
1608 ULONG MaxNameLen; | |
1609 CHAR Name[1]; // Name of symbol | |
1610 } SYMBOL_INFO, *PSYMBOL_INFO; | |
1611 | |
1612 typedef struct _SYMBOL_INFO_PACKAGE { | |
1613 SYMBOL_INFO si; | |
1614 CHAR name[MAX_SYM_NAME + 1]; | |
1615 } SYMBOL_INFO_PACKAGE, *PSYMBOL_INFO_PACKAGE; | |
1616 | |
1617 typedef struct _IMAGEHLP_STACK_FRAME | |
1618 { | |
1619 ULONG64 InstructionOffset; | |
1620 ULONG64 ReturnOffset; | |
1621 ULONG64 FrameOffset; | |
1622 ULONG64 StackOffset; | |
1623 ULONG64 BackingStoreOffset; | |
1624 ULONG64 FuncTableEntry; | |
1625 ULONG64 Params[4]; | |
1626 ULONG64 Reserved[5]; | |
1627 BOOL Virtual; | |
1628 ULONG Reserved2; | |
1629 } IMAGEHLP_STACK_FRAME, *PIMAGEHLP_STACK_FRAME; | |
1630 | |
1631 typedef VOID IMAGEHLP_CONTEXT, *PIMAGEHLP_CONTEXT; | |
1632 | |
1633 | |
1634 BOOL | |
1635 IMAGEAPI | |
1636 SymSetContext( | |
1637 HANDLE hProcess, | |
1638 PIMAGEHLP_STACK_FRAME StackFrame, | |
1639 PIMAGEHLP_CONTEXT Context | |
1640 ); | |
1641 | |
1642 BOOL | |
1643 IMAGEAPI | |
1644 SymFromAddr( | |
1645 IN HANDLE hProcess, | |
1646 IN DWORD64 Address, | |
1647 OUT PDWORD64 Displacement, | |
1648 IN OUT PSYMBOL_INFO Symbol | |
1649 ); | |
1650 | |
1651 // While SymFromName will provide a symbol from a name, | |
1652 // SymEnumSymbols can provide the same matching information | |
1653 // for ALL symbols with a matching name, even regular | |
1654 // expressions. That way you can search across modules | |
1655 // and differentiate between identically named symbols. | |
1656 | |
1657 BOOL | |
1658 IMAGEAPI | |
1659 SymFromName( | |
1660 IN HANDLE hProcess, | |
1661 IN LPSTR Name, | |
1662 OUT PSYMBOL_INFO Symbol | |
1663 ); | |
1664 | |
1665 typedef BOOL | |
1666 (CALLBACK *PSYM_ENUMERATESYMBOLS_CALLBACK)( | |
1667 PSYMBOL_INFO pSymInfo, | |
1668 ULONG SymbolSize, | |
1669 PVOID UserContext | |
1670 ); | |
1671 | |
1672 BOOL | |
1673 IMAGEAPI | |
1674 SymEnumSymbols( | |
1675 IN HANDLE hProcess, | |
1676 IN ULONG64 BaseOfDll, | |
1677 IN PCSTR Mask, | |
1678 IN PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, | |
1679 IN PVOID UserContext | |
1680 ); | |
1681 | |
1682 BOOL | |
1683 IMAGEAPI | |
1684 SymEnumSymbolsForAddr( | |
1685 IN HANDLE hProcess, | |
1686 IN DWORD64 Address, | |
1687 IN PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, | |
1688 IN PVOID UserContext | |
1689 ); | |
1690 | |
1691 typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO { | |
1692 TI_GET_SYMTAG, | |
1693 TI_GET_SYMNAME, | |
1694 TI_GET_LENGTH, | |
1695 TI_GET_TYPE, | |
1696 TI_GET_TYPEID, | |
1697 TI_GET_BASETYPE, | |
1698 TI_GET_ARRAYINDEXTYPEID, | |
1699 TI_FINDCHILDREN, | |
1700 TI_GET_DATAKIND, | |
1701 TI_GET_ADDRESSOFFSET, | |
1702 TI_GET_OFFSET, | |
1703 TI_GET_VALUE, | |
1704 TI_GET_COUNT, | |
1705 TI_GET_CHILDRENCOUNT, | |
1706 TI_GET_BITPOSITION, | |
1707 TI_GET_VIRTUALBASECLASS, | |
1708 TI_GET_VIRTUALTABLESHAPEID, | |
1709 TI_GET_VIRTUALBASEPOINTEROFFSET, | |
1710 TI_GET_CLASSPARENTID, | |
1711 TI_GET_NESTED, | |
1712 TI_GET_SYMINDEX, | |
1713 TI_GET_LEXICALPARENT, | |
1714 TI_GET_ADDRESS, | |
1715 TI_GET_THISADJUST, | |
1716 TI_GET_UDTKIND, | |
1717 TI_IS_EQUIV_TO, | |
1718 TI_GET_CALLING_CONVENTION, | |
1719 } IMAGEHLP_SYMBOL_TYPE_INFO; | |
1720 | |
1721 typedef struct _TI_FINDCHILDREN_PARAMS { | |
1722 ULONG Count; | |
1723 ULONG Start; | |
1724 ULONG ChildId[1]; | |
1725 } TI_FINDCHILDREN_PARAMS; | |
1726 | |
1727 BOOL | |
1728 IMAGEAPI | |
1729 SymGetTypeInfo( | |
1730 IN HANDLE hProcess, | |
1731 IN DWORD64 ModBase, | |
1732 IN ULONG TypeId, | |
1733 IN IMAGEHLP_SYMBOL_TYPE_INFO GetType, | |
1734 OUT PVOID pInfo | |
1735 ); | |
1736 | |
1737 BOOL | |
1738 IMAGEAPI | |
1739 SymEnumTypes( | |
1740 IN HANDLE hProcess, | |
1741 IN ULONG64 BaseOfDll, | |
1742 IN PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, | |
1743 IN PVOID UserContext | |
1744 ); | |
1745 | |
1746 BOOL | |
1747 IMAGEAPI | |
1748 SymGetTypeFromName( | |
1749 IN HANDLE hProcess, | |
1750 IN ULONG64 BaseOfDll, | |
1751 IN LPSTR Name, | |
1752 OUT PSYMBOL_INFO Symbol | |
1753 ); | |
1754 | |
1755 BOOL | |
1756 IMAGEAPI | |
1757 SymAddSymbol( | |
1758 IN HANDLE hProcess, | |
1759 IN ULONG64 BaseOfDll, | |
1760 IN PCSTR Name, | |
1761 IN DWORD64 Address, | |
1762 IN DWORD Size, | |
1763 IN DWORD Flags | |
1764 ); | |
1765 | |
1766 BOOL | |
1767 IMAGEAPI | |
1768 SymDeleteSymbol( | |
1769 IN HANDLE hProcess, | |
1770 IN ULONG64 BaseOfDll, | |
1771 IN PCSTR Name, | |
1772 IN DWORD64 Address, | |
1773 IN DWORD Flags | |
1774 ); | |
1775 | |
1776 // | |
1777 // Full user-mode dump creation. | |
1778 // | |
1779 | |
1780 typedef BOOL (WINAPI *PDBGHELP_CREATE_USER_DUMP_CALLBACK)( | |
1781 DWORD DataType, | |
1782 PVOID* Data, | |
1783 LPDWORD DataLength, | |
1784 PVOID UserData | |
1785 ); | |
1786 | |
1787 BOOL | |
1788 WINAPI | |
1789 DbgHelpCreateUserDump( | |
1790 IN LPSTR FileName, | |
1791 IN PDBGHELP_CREATE_USER_DUMP_CALLBACK Callback, | |
1792 IN PVOID UserData | |
1793 ); | |
1794 | |
1795 BOOL | |
1796 WINAPI | |
1797 DbgHelpCreateUserDumpW( | |
1798 IN LPWSTR FileName, | |
1799 IN PDBGHELP_CREATE_USER_DUMP_CALLBACK Callback, | |
1800 IN PVOID UserData | |
1801 ); | |
1802 | |
1803 // ----------------------------------------------------------------- | |
1804 // The following 4 legacy APIs are fully supported, but newer | |
1805 // ones are recommended. SymFromName and SymFromAddr provide | |
1806 // much more detailed info on the returned symbol. | |
1807 | |
1808 BOOL | |
1809 IMAGEAPI | |
1810 SymGetSymFromAddr64( | |
1811 IN HANDLE hProcess, | |
1812 IN DWORD64 qwAddr, | |
1813 OUT PDWORD64 pdwDisplacement, | |
1814 OUT PIMAGEHLP_SYMBOL64 Symbol | |
1815 ); | |
1816 | |
1817 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1818 #define SymGetSymFromAddr SymGetSymFromAddr64 | |
1819 #else | |
1820 BOOL | |
1821 IMAGEAPI | |
1822 SymGetSymFromAddr( | |
1823 IN HANDLE hProcess, | |
1824 IN DWORD dwAddr, | |
1825 OUT PDWORD pdwDisplacement, | |
1826 OUT PIMAGEHLP_SYMBOL Symbol | |
1827 ); | |
1828 #endif | |
1829 | |
1830 // While following two APIs will provide a symbol from a name, | |
1831 // SymEnumSymbols can provide the same matching information | |
1832 // for ALL symbols with a matching name, even regular | |
1833 // expressions. That way you can search across modules | |
1834 // and differentiate between identically named symbols. | |
1835 | |
1836 BOOL | |
1837 IMAGEAPI | |
1838 SymGetSymFromName64( | |
1839 IN HANDLE hProcess, | |
1840 IN PSTR Name, | |
1841 OUT PIMAGEHLP_SYMBOL64 Symbol | |
1842 ); | |
1843 | |
1844 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64) | |
1845 #define SymGetSymFromName SymGetSymFromName64 | |
1846 #else | |
1847 BOOL | |
1848 IMAGEAPI | |
1849 SymGetSymFromName( | |
1850 IN HANDLE hProcess, | |
1851 IN PSTR Name, | |
1852 OUT PIMAGEHLP_SYMBOL Symbol | |
1853 ); | |
1854 #endif | |
1855 | |
1856 | |
1857 // ----------------------------------------------------------------- | |
1858 // The following APIs exist only for backwards compatibility | |
1859 // with a pre-release version documented in an MSDN release. | |
1860 | |
1861 // You should use SymFindFileInPath if you want to maintain | |
1862 // future compatibility. | |
1863 | |
1864 DBHLP_DEPRECIATED | |
1865 BOOL | |
1866 IMAGEAPI | |
1867 FindFileInPath( | |
1868 HANDLE hprocess, | |
1869 LPSTR SearchPath, | |
1870 LPSTR FileName, | |
1871 PVOID id, | |
1872 DWORD two, | |
1873 DWORD three, | |
1874 DWORD flags, | |
1875 LPSTR FilePath | |
1876 ); | |
1877 | |
1878 // You should use SymFindFileInPath if you want to maintain | |
1879 // future compatibility. | |
1880 | |
1881 DBHLP_DEPRECIATED | |
1882 BOOL | |
1883 IMAGEAPI | |
1884 FindFileInSearchPath( | |
1885 HANDLE hprocess, | |
1886 LPSTR SearchPath, | |
1887 LPSTR FileName, | |
1888 DWORD one, | |
1889 DWORD two, | |
1890 DWORD three, | |
1891 LPSTR FilePath | |
1892 ); | |
1893 | |
1894 DBHLP_DEPRECIATED | |
1895 BOOL | |
1896 IMAGEAPI | |
1897 SymEnumSym( | |
1898 IN HANDLE hProcess, | |
1899 IN ULONG64 BaseOfDll, | |
1900 IN PSYM_ENUMERATESYMBOLS_CALLBACK EnumSymbolsCallback, | |
1901 IN PVOID UserContext | |
1902 ); | |
1903 | |
1904 // These values should not be used. | |
1905 // They have been replaced by SYMFLAG_ values. | |
1906 | |
1907 #define SYMF_OMAP_GENERATED 0x00000001 | |
1908 #define SYMF_OMAP_MODIFIED 0x00000002 | |
1909 #define SYMF_REGISTER 0x00000008 | |
1910 #define SYMF_REGREL 0x00000010 | |
1911 #define SYMF_FRAMEREL 0x00000020 | |
1912 #define SYMF_PARAMETER 0x00000040 | |
1913 #define SYMF_LOCAL 0x00000080 | |
1914 #define SYMF_CONSTANT 0x00000100 | |
1915 #define SYMF_EXPORT 0x00000200 | |
1916 #define SYMF_FORWARDER 0x00000400 | |
1917 #define SYMF_FUNCTION 0x00000800 | |
1918 #define SYMF_VIRTUAL 0x00001000 | |
1919 #define SYMF_THUNK 0x00002000 | |
1920 #define SYMF_TLSREL 0x00004000 | |
1921 | |
1922 // These values should also not be used. | |
1923 // They have been replaced by SYMFLAG_ values. | |
1924 | |
1925 #define IMAGEHLP_SYMBOL_INFO_VALUEPRESENT 1 | |
1926 #define IMAGEHLP_SYMBOL_INFO_REGISTER SYMF_REGISTER // 0x0008 | |
1927 #define IMAGEHLP_SYMBOL_INFO_REGRELATIVE SYMF_REGREL // 0x0010 | |
1928 #define IMAGEHLP_SYMBOL_INFO_FRAMERELATIVE SYMF_FRAMEREL // 0x0020 | |
1929 #define IMAGEHLP_SYMBOL_INFO_PARAMETER SYMF_PARAMETER // 0x0040 | |
1930 #define IMAGEHLP_SYMBOL_INFO_LOCAL SYMF_LOCAL // 0x0080 | |
1931 #define IMAGEHLP_SYMBOL_INFO_CONSTANT SYMF_CONSTANT // 0x0100 | |
1932 #define IMAGEHLP_SYMBOL_FUNCTION SYMF_FUNCTION // 0x0800 | |
1933 #define IMAGEHLP_SYMBOL_VIRTUAL SYMF_VIRTUAL // 0x1000 | |
1934 #define IMAGEHLP_SYMBOL_THUNK SYMF_THUNK // 0x2000 | |
1935 #define IMAGEHLP_SYMBOL_INFO_TLSRELATIVE SYMF_TLSREL // 0x4000 | |
1936 | |
1937 | |
1938 #include <pshpack4.h> | |
1939 | |
1940 #pragma warning(disable:4200) // Zero length array | |
1941 | |
1942 | |
1943 #define MINIDUMP_SIGNATURE ('PMDM') | |
1944 #define MINIDUMP_VERSION (42899) | |
1945 +/ | |
1946 | |
1947 alias DWORD RVA; | |
1948 alias ULONG64 RVA64; | |
1949 | |
1950 struct MINIDUMP_LOCATION_DESCRIPTOR { | |
1951 ULONG32 DataSize; | |
1952 RVA Rva; | |
1953 } | |
1954 | |
1955 struct MINIDUMP_LOCATION_DESCRIPTOR64 { | |
1956 ULONG64 DataSize; | |
1957 RVA64 Rva; | |
1958 } | |
1959 | |
1960 struct MINIDUMP_MEMORY_DESCRIPTOR { | |
1961 ULONG64 StartOfMemoryRange; | |
1962 MINIDUMP_LOCATION_DESCRIPTOR Memory; | |
1963 } | |
1964 alias MINIDUMP_MEMORY_DESCRIPTOR* PMINIDUMP_MEMORY_DESCRIPTOR; | |
1965 | |
1966 // DESCRIPTOR64 is used for full-memory minidumps where | |
1967 // all of the raw memory is laid out sequentially at the | |
1968 // end of the dump. There is no need for individual RVAs | |
1969 // as the RVA is the base RVA plus the sum of the preceeding | |
1970 // data blocks. | |
1971 struct MINIDUMP_MEMORY_DESCRIPTOR64 { | |
1972 ULONG64 StartOfMemoryRange; | |
1973 ULONG64 DataSize; | |
1974 } | |
1975 alias MINIDUMP_MEMORY_DESCRIPTOR64* PMINIDUMP_MEMORY_DESCRIPTOR64; | |
1976 | |
1977 | |
1978 struct MINIDUMP_HEADER { | |
1979 ULONG32 Signature; | |
1980 ULONG32 Version; | |
1981 ULONG32 NumberOfStreams; | |
1982 RVA StreamDirectoryRva; | |
1983 ULONG32 CheckSum; | |
1984 union { | |
1985 ULONG32 Reserved; | |
1986 ULONG32 TimeDateStamp; | |
1987 }; | |
1988 ULONG64 Flags; | |
1989 } | |
1990 alias MINIDUMP_HEADER* PMINIDUMP_HEADER; | |
1991 | |
1992 // | |
1993 // The MINIDUMP_HEADER field StreamDirectoryRva points to | |
1994 // an array of MINIDUMP_DIRECTORY structures. | |
1995 // | |
1996 | |
1997 struct MINIDUMP_DIRECTORY { | |
1998 ULONG32 StreamType; | |
1999 MINIDUMP_LOCATION_DESCRIPTOR Location; | |
2000 } | |
2001 alias MINIDUMP_DIRECTORY* PMINIDUMP_DIRECTORY; | |
2002 | |
2003 | |
2004 struct MINIDUMP_STRING { | |
2005 ULONG32 Length; // Length in bytes of the string | |
2006 WCHAR Buffer [0]; // Variable size buffer | |
2007 } | |
2008 alias MINIDUMP_STRING* PMINIDUMP_STRING; | |
2009 | |
2010 // | |
2011 // The MINIDUMP_DIRECTORY field StreamType may be one of the following types. | |
2012 // Types will be added in the future, so if a program reading the minidump | |
2013 // header encounters a stream type it does not understand it should ignore | |
2014 // the data altogether. Any tag above LastReservedStream will not be used by | |
2015 // the system and is reserved for program-specific information. | |
2016 // | |
2017 | |
2018 enum MINIDUMP_STREAM_TYPE { | |
2019 | |
2020 UnusedStream = 0, | |
2021 ReservedStream0 = 1, | |
2022 ReservedStream1 = 2, | |
2023 ThreadListStream = 3, | |
2024 ModuleListStream = 4, | |
2025 MemoryListStream = 5, | |
2026 ExceptionStream = 6, | |
2027 SystemInfoStream = 7, | |
2028 ThreadExListStream = 8, | |
2029 Memory64ListStream = 9, | |
2030 CommentStreamA = 10, | |
2031 CommentStreamW = 11, | |
2032 HandleDataStream = 12, | |
2033 FunctionTableStream = 13, | |
2034 UnloadedModuleListStream = 14, | |
2035 MiscInfoStream = 15, | |
2036 | |
2037 LastReservedStream = 0xffff | |
2038 | |
2039 } | |
2040 | |
2041 | |
2042 // | |
2043 // The minidump system information contains processor and | |
2044 // Operating System specific information. | |
2045 // | |
2046 | |
2047 /+ | |
2048 #if defined(_MSC_VER) | |
2049 #if _MSC_VER >= 800 | |
2050 #if _MSC_VER >= 1200 | |
2051 #pragma warning(push) | |
2052 #endif | |
2053 #pragma warning(disable:4201) /* Nameless struct/union */ | |
2054 #endif | |
2055 #endif | |
2056 +/ | |
2057 | |
2058 struct MINIDUMP_SYSTEM_INFO { | |
2059 | |
2060 // | |
2061 // ProcessorArchitecture, ProcessorLevel and ProcessorRevision are all | |
2062 // taken from the SYSTEM_INFO structure obtained by GetSystemInfo( ). | |
2063 // | |
2064 | |
2065 USHORT ProcessorArchitecture; | |
2066 USHORT ProcessorLevel; | |
2067 USHORT ProcessorRevision; | |
2068 | |
2069 union { | |
2070 USHORT Reserved0; | |
2071 struct { | |
2072 UCHAR NumberOfProcessors; | |
2073 UCHAR ProductType; | |
2074 }; | |
2075 }; | |
2076 | |
2077 // | |
2078 // MajorVersion, MinorVersion, BuildNumber, PlatformId and | |
2079 // CSDVersion are all taken from the OSVERSIONINFO structure | |
2080 // returned by GetVersionEx( ). | |
2081 // | |
2082 | |
2083 ULONG32 MajorVersion; | |
2084 ULONG32 MinorVersion; | |
2085 ULONG32 BuildNumber; | |
2086 ULONG32 PlatformId; | |
2087 | |
2088 // | |
2089 // RVA to a CSDVersion string in the string table. | |
2090 // | |
2091 | |
2092 RVA CSDVersionRva; | |
2093 | |
2094 union { | |
2095 ULONG32 Reserved1; | |
2096 struct { | |
2097 USHORT SuiteMask; | |
2098 USHORT Reserved2; | |
2099 }; | |
2100 }; | |
2101 | |
2102 // | |
2103 // CPU information is obtained from one of two places. | |
2104 // | |
2105 // 1) On x86 computers, CPU_INFORMATION is obtained from the CPUID | |
2106 // instruction. You must use the X86 portion of the union for X86 | |
2107 // computers. | |
2108 // | |
2109 // 2) On non-x86 architectures, CPU_INFORMATION is obtained by calling | |
2110 // IsProcessorFeatureSupported(). | |
2111 // | |
2112 | |
2113 union CPU_INFORMATION { | |
2114 | |
2115 // | |
2116 // X86 platforms use CPUID function to obtain processor information. | |
2117 // | |
2118 | |
2119 struct _X86CpuInfo_t { | |
2120 | |
2121 // | |
2122 // CPUID Subfunction 0, register EAX (VendorId [0]), | |
2123 // EBX (VendorId [1]) and ECX (VendorId [2]). | |
2124 // | |
2125 | |
2126 ULONG32 VendorId [ 3 ]; | |
2127 | |
2128 // | |
2129 // CPUID Subfunction 1, register EAX | |
2130 // | |
2131 | |
2132 ULONG32 VersionInformation; | |
2133 | |
2134 // | |
2135 // CPUID Subfunction 1, register EDX | |
2136 // | |
2137 | |
2138 ULONG32 FeatureInformation; | |
2139 | |
2140 | |
2141 // | |
2142 // CPUID, Subfunction 80000001, register EBX. This will only | |
2143 // be obtained if the vendor id is "AuthenticAMD". | |
2144 // | |
2145 | |
2146 ULONG32 AMDExtendedCpuFeatures; | |
2147 | |
2148 } | |
2149 _X86CpuInfo_t X86CpuInfo; | |
2150 | |
2151 // | |
2152 // Non-x86 platforms use processor feature flags. | |
2153 // | |
2154 | |
2155 struct _OtherCpuInfo_t { | |
2156 | |
2157 ULONG64 ProcessorFeatures [ 2 ]; | |
2158 | |
2159 } | |
2160 _OtherCpuInfo_t OtherCpuInfo; | |
2161 | |
2162 } | |
2163 CPU_INFORMATION Cpu; | |
2164 | |
2165 } | |
2166 alias MINIDUMP_SYSTEM_INFO* PMINIDUMP_SYSTEM_INFO; | |
2167 alias MINIDUMP_SYSTEM_INFO.CPU_INFORMATION* PCPU_INFORMATION; | |
2168 | |
2169 /+ | |
2170 #if defined(_MSC_VER) | |
2171 #if _MSC_VER >= 800 | |
2172 #if _MSC_VER >= 1200 | |
2173 #pragma warning(pop) | |
2174 #else | |
2175 #pragma warning(disable:4201) /* Nameless struct/union */ | |
2176 #endif | |
2177 #endif | |
2178 #endif | |
2179 +/ | |
2180 | |
2181 // | |
2182 // The minidump thread contains standard thread | |
2183 // information plus an RVA to the memory for this | |
2184 // thread and an RVA to the CONTEXT structure for | |
2185 // this thread. | |
2186 // | |
2187 | |
2188 | |
2189 // | |
2190 // ThreadId must be 4 bytes on all architectures. | |
2191 // | |
2192 | |
2193 //C_ASSERT (sizeof ( ((PPROCESS_INFORMATION)0)->dwThreadId ) == 4); | |
2194 | |
2195 struct MINIDUMP_THREAD { | |
2196 ULONG32 ThreadId; | |
2197 ULONG32 SuspendCount; | |
2198 ULONG32 PriorityClass; | |
2199 ULONG32 Priority; | |
2200 ULONG64 Teb; | |
2201 MINIDUMP_MEMORY_DESCRIPTOR Stack; | |
2202 MINIDUMP_LOCATION_DESCRIPTOR ThreadContext; | |
2203 } | |
2204 alias MINIDUMP_THREAD* PMINIDUMP_THREAD; | |
2205 | |
2206 // | |
2207 // The thread list is a container of threads. | |
2208 // | |
2209 | |
2210 struct MINIDUMP_THREAD_LIST { | |
2211 ULONG32 NumberOfThreads; | |
2212 MINIDUMP_THREAD Threads [0]; | |
2213 } | |
2214 alias MINIDUMP_THREAD_LIST* PMINIDUMP_THREAD_LIST; | |
2215 | |
2216 | |
2217 struct MINIDUMP_THREAD_EX { | |
2218 ULONG32 ThreadId; | |
2219 ULONG32 SuspendCount; | |
2220 ULONG32 PriorityClass; | |
2221 ULONG32 Priority; | |
2222 ULONG64 Teb; | |
2223 MINIDUMP_MEMORY_DESCRIPTOR Stack; | |
2224 MINIDUMP_LOCATION_DESCRIPTOR ThreadContext; | |
2225 MINIDUMP_MEMORY_DESCRIPTOR BackingStore; | |
2226 } | |
2227 alias MINIDUMP_THREAD_EX* PMINIDUMP_THREAD_EX; | |
2228 | |
2229 // | |
2230 // The thread list is a container of threads. | |
2231 // | |
2232 | |
2233 struct MINIDUMP_THREAD_EX_LIST { | |
2234 ULONG32 NumberOfThreads; | |
2235 MINIDUMP_THREAD_EX Threads [0]; | |
2236 } | |
2237 alias MINIDUMP_THREAD_EX_LIST* PMINIDUMP_THREAD_EX_LIST; | |
2238 | |
2239 | |
2240 // | |
2241 // The MINIDUMP_EXCEPTION is the same as EXCEPTION on Win64. | |
2242 // | |
2243 | |
2244 struct MINIDUMP_EXCEPTION { | |
2245 ULONG32 ExceptionCode; | |
2246 ULONG32 ExceptionFlags; | |
2247 ULONG64 ExceptionRecord; | |
2248 ULONG64 ExceptionAddress; | |
2249 ULONG32 NumberParameters; | |
2250 ULONG32 __unusedAlignment; | |
2251 ULONG64 ExceptionInformation [ EXCEPTION_MAXIMUM_PARAMETERS ]; | |
2252 } | |
2253 alias MINIDUMP_EXCEPTION* PMINIDUMP_EXCEPTION; | |
2254 | |
2255 | |
2256 // | |
2257 // The exception information stream contains the id of the thread that caused | |
2258 // the exception (ThreadId), the exception record for the exception | |
2259 // (ExceptionRecord) and an RVA to the thread context where the exception | |
2260 // occured. | |
2261 // | |
2262 | |
2263 struct MINIDUMP_EXCEPTION_STREAM { | |
2264 ULONG32 ThreadId; | |
2265 ULONG32 __alignment; | |
2266 MINIDUMP_EXCEPTION ExceptionRecord; | |
2267 MINIDUMP_LOCATION_DESCRIPTOR ThreadContext; | |
2268 } | |
2269 alias MINIDUMP_EXCEPTION_STREAM* PMINIDUMP_EXCEPTION_STREAM; | |
2270 | |
2271 | |
2272 // | |
2273 // The MINIDUMP_MODULE contains information about a | |
2274 // a specific module. It includes the CheckSum and | |
2275 // the TimeDateStamp for the module so the module | |
2276 // can be reloaded during the analysis phase. | |
2277 // | |
2278 | |
2279 struct MINIDUMP_MODULE { | |
2280 ULONG64 BaseOfImage; | |
2281 ULONG32 SizeOfImage; | |
2282 ULONG32 CheckSum; | |
2283 ULONG32 TimeDateStamp; | |
2284 RVA ModuleNameRva; | |
2285 VS_FIXEDFILEINFO VersionInfo; | |
2286 MINIDUMP_LOCATION_DESCRIPTOR CvRecord; | |
2287 MINIDUMP_LOCATION_DESCRIPTOR MiscRecord; | |
2288 ULONG64 Reserved0; // Reserved for future use. | |
2289 ULONG64 Reserved1; // Reserved for future use. | |
2290 } | |
2291 alias MINIDUMP_MODULE* PMINIDUMP_MODULE; | |
2292 | |
2293 | |
2294 // | |
2295 // The minidump module list is a container for modules. | |
2296 // | |
2297 | |
2298 struct MINIDUMP_MODULE_LIST { | |
2299 ULONG32 NumberOfModules; | |
2300 MINIDUMP_MODULE Modules [ 0 ]; | |
2301 } | |
2302 alias MINIDUMP_MODULE_LIST* PMINIDUMP_MODULE_LIST; | |
2303 | |
2304 | |
2305 // | |
2306 // Memory Ranges | |
2307 // | |
2308 | |
2309 struct MINIDUMP_MEMORY_LIST { | |
2310 ULONG32 NumberOfMemoryRanges; | |
2311 MINIDUMP_MEMORY_DESCRIPTOR MemoryRanges [0]; | |
2312 } | |
2313 alias MINIDUMP_MEMORY_LIST* PMINIDUMP_MEMORY_LIST; | |
2314 | |
2315 struct MINIDUMP_MEMORY64_LIST { | |
2316 ULONG64 NumberOfMemoryRanges; | |
2317 RVA64 BaseRva; | |
2318 MINIDUMP_MEMORY_DESCRIPTOR64 MemoryRanges [0]; | |
2319 } | |
2320 alias MINIDUMP_MEMORY64_LIST* PMINIDUMP_MEMORY64_LIST; | |
2321 | |
2322 | |
2323 // | |
2324 // Support for user supplied exception information. | |
2325 // | |
2326 | |
2327 struct MINIDUMP_EXCEPTION_INFORMATION { | |
2328 DWORD ThreadId; | |
2329 PEXCEPTION_POINTERS ExceptionPointers; | |
2330 BOOL ClientPointers; | |
2331 }; | |
2332 alias MINIDUMP_EXCEPTION_INFORMATION* PMINIDUMP_EXCEPTION_INFORMATION; | |
2333 | |
2334 // | |
2335 // Support for capturing system handle state at the time of the dump. | |
2336 // | |
2337 | |
2338 struct MINIDUMP_HANDLE_DESCRIPTOR { | |
2339 ULONG64 Handle; | |
2340 RVA TypeNameRva; | |
2341 RVA ObjectNameRva; | |
2342 ULONG32 Attributes; | |
2343 ULONG32 GrantedAccess; | |
2344 ULONG32 HandleCount; | |
2345 ULONG32 PointerCount; | |
2346 } | |
2347 alias MINIDUMP_HANDLE_DESCRIPTOR* PMINIDUMP_HANDLE_DESCRIPTOR; | |
2348 | |
2349 struct MINIDUMP_HANDLE_DATA_STREAM { | |
2350 ULONG32 SizeOfHeader; | |
2351 ULONG32 SizeOfDescriptor; | |
2352 ULONG32 NumberOfDescriptors; | |
2353 ULONG32 Reserved; | |
2354 } | |
2355 alias MINIDUMP_HANDLE_DATA_STREAM* PMINIDUMP_HANDLE_DATA_STREAM; | |
2356 | |
2357 | |
2358 // | |
2359 // Support for capturing dynamic function table state at the time of the dump. | |
2360 // | |
2361 | |
2362 struct MINIDUMP_FUNCTION_TABLE_DESCRIPTOR { | |
2363 ULONG64 MinimumAddress; | |
2364 ULONG64 MaximumAddress; | |
2365 ULONG64 BaseAddress; | |
2366 ULONG32 EntryCount; | |
2367 ULONG32 SizeOfAlignPad; | |
2368 } | |
2369 alias MINIDUMP_FUNCTION_TABLE_DESCRIPTOR* PMINIDUMP_FUNCTION_TABLE_DESCRIPTOR; | |
2370 | |
2371 struct MINIDUMP_FUNCTION_TABLE_STREAM { | |
2372 ULONG32 SizeOfHeader; | |
2373 ULONG32 SizeOfDescriptor; | |
2374 ULONG32 SizeOfNativeDescriptor; | |
2375 ULONG32 SizeOfFunctionEntry; | |
2376 ULONG32 NumberOfDescriptors; | |
2377 ULONG32 SizeOfAlignPad; | |
2378 } | |
2379 alias MINIDUMP_FUNCTION_TABLE_STREAM* PMINIDUMP_FUNCTION_TABLE_STREAM; | |
2380 | |
2381 | |
2382 // | |
2383 // The MINIDUMP_UNLOADED_MODULE contains information about a | |
2384 // a specific module that was previously loaded but no | |
2385 // longer is. This can help with diagnosing problems where | |
2386 // callers attempt to call code that is no longer loaded. | |
2387 // | |
2388 | |
2389 struct MINIDUMP_UNLOADED_MODULE { | |
2390 ULONG64 BaseOfImage; | |
2391 ULONG32 SizeOfImage; | |
2392 ULONG32 CheckSum; | |
2393 ULONG32 TimeDateStamp; | |
2394 RVA ModuleNameRva; | |
2395 } | |
2396 alias MINIDUMP_UNLOADED_MODULE* PMINIDUMP_UNLOADED_MODULE; | |
2397 | |
2398 | |
2399 // | |
2400 // The minidump unloaded module list is a container for unloaded modules. | |
2401 // | |
2402 | |
2403 struct MINIDUMP_UNLOADED_MODULE_LIST { | |
2404 ULONG32 SizeOfHeader; | |
2405 ULONG32 SizeOfEntry; | |
2406 ULONG32 NumberOfEntries; | |
2407 } | |
2408 alias MINIDUMP_UNLOADED_MODULE_LIST* PMINIDUMP_UNLOADED_MODULE_LIST; | |
2409 | |
2410 | |
2411 // | |
2412 // The miscellaneous information stream contains a variety | |
2413 // of small pieces of information. A member is valid if | |
2414 // it's within the available size and its corresponding | |
2415 // bit is set. | |
2416 // | |
2417 | |
2418 enum : uint { | |
2419 MINIDUMP_MISC1_PROCESS_ID = 0x00000001, | |
2420 MINIDUMP_MISC1_PROCESS_TIMES | |
2421 } | |
2422 | |
2423 struct MINIDUMP_MISC_INFO { | |
2424 ULONG32 SizeOfInfo; | |
2425 ULONG32 Flags1; | |
2426 ULONG32 ProcessId; | |
2427 ULONG32 ProcessCreateTime; | |
2428 ULONG32 ProcessUserTime; | |
2429 ULONG32 ProcessKernelTime; | |
2430 } | |
2431 alias MINIDUMP_MISC_INFO* PMINIDUMP_MISC_INFO; | |
2432 | |
2433 | |
2434 // | |
2435 // Support for arbitrary user-defined information. | |
2436 // | |
2437 | |
2438 struct MINIDUMP_USER_RECORD { | |
2439 ULONG32 Type; | |
2440 MINIDUMP_LOCATION_DESCRIPTOR Memory; | |
2441 } | |
2442 alias MINIDUMP_USER_RECORD* PMINIDUMP_USER_RECORD; | |
2443 | |
2444 | |
2445 struct MINIDUMP_USER_STREAM { | |
2446 ULONG32 Type; | |
2447 ULONG BufferSize; | |
2448 PVOID Buffer; | |
2449 } | |
2450 alias MINIDUMP_USER_STREAM* PMINIDUMP_USER_STREAM; | |
2451 | |
2452 struct MINIDUMP_USER_STREAM_INFORMATION { | |
2453 ULONG UserStreamCount; | |
2454 PMINIDUMP_USER_STREAM UserStreamArray; | |
2455 } | |
2456 alias MINIDUMP_USER_STREAM_INFORMATION* PMINIDUMP_USER_STREAM_INFORMATION; | |
2457 | |
2458 // | |
2459 // Callback support. | |
2460 // | |
2461 | |
2462 enum MINIDUMP_CALLBACK_TYPE { | |
2463 ModuleCallback, | |
2464 ThreadCallback, | |
2465 ThreadExCallback, | |
2466 IncludeThreadCallback, | |
2467 IncludeModuleCallback, | |
2468 } | |
2469 | |
2470 | |
2471 struct MINIDUMP_THREAD_CALLBACK { | |
2472 ULONG ThreadId; | |
2473 HANDLE ThreadHandle; | |
2474 CONTEXT Context; | |
2475 ULONG SizeOfContext; | |
2476 ULONG64 StackBase; | |
2477 ULONG64 StackEnd; | |
2478 } | |
2479 alias MINIDUMP_THREAD_CALLBACK* PMINIDUMP_THREAD_CALLBACK; | |
2480 | |
2481 struct MINIDUMP_THREAD_EX_CALLBACK { | |
2482 ULONG ThreadId; | |
2483 HANDLE ThreadHandle; | |
2484 CONTEXT Context; | |
2485 ULONG SizeOfContext; | |
2486 ULONG64 StackBase; | |
2487 ULONG64 StackEnd; | |
2488 ULONG64 BackingStoreBase; | |
2489 ULONG64 BackingStoreEnd; | |
2490 } | |
2491 alias MINIDUMP_THREAD_EX_CALLBACK* PMINIDUMP_THREAD_EX_CALLBACK; | |
2492 | |
2493 | |
2494 struct MINIDUMP_INCLUDE_THREAD_CALLBACK { | |
2495 ULONG ThreadId; | |
2496 } | |
2497 alias MINIDUMP_INCLUDE_THREAD_CALLBACK* PMINIDUMP_INCLUDE_THREAD_CALLBACK; | |
2498 | |
2499 | |
2500 enum THREAD_WRITE_FLAGS { | |
2501 ThreadWriteThread = 0x0001, | |
2502 ThreadWriteStack = 0x0002, | |
2503 ThreadWriteContext = 0x0004, | |
2504 ThreadWriteBackingStore = 0x0008, | |
2505 ThreadWriteInstructionWindow = 0x0010, | |
2506 ThreadWriteThreadData = 0x0020, | |
2507 } | |
2508 | |
2509 struct MINIDUMP_MODULE_CALLBACK { | |
2510 PWCHAR FullPath; | |
2511 ULONG64 BaseOfImage; | |
2512 ULONG SizeOfImage; | |
2513 ULONG CheckSum; | |
2514 ULONG TimeDateStamp; | |
2515 VS_FIXEDFILEINFO VersionInfo; | |
2516 PVOID CvRecord; | |
2517 ULONG SizeOfCvRecord; | |
2518 PVOID MiscRecord; | |
2519 ULONG SizeOfMiscRecord; | |
2520 } | |
2521 alias MINIDUMP_MODULE_CALLBACK* PMINIDUMP_MODULE_CALLBACK; | |
2522 | |
2523 | |
2524 struct MINIDUMP_INCLUDE_MODULE_CALLBACK { | |
2525 ULONG64 BaseOfImage; | |
2526 } | |
2527 alias MINIDUMP_INCLUDE_MODULE_CALLBACK* PMINIDUMP_INCLUDE_MODULE_CALLBACK; | |
2528 | |
2529 | |
2530 enum MODULE_WRITE_FLAGS { | |
2531 ModuleWriteModule = 0x0001, | |
2532 ModuleWriteDataSeg = 0x0002, | |
2533 ModuleWriteMiscRecord = 0x0004, | |
2534 ModuleWriteCvRecord = 0x0008, | |
2535 ModuleReferencedByMemory = 0x0010 | |
2536 } | |
2537 | |
2538 struct MINIDUMP_CALLBACK_INPUT { | |
2539 ULONG ProcessId; | |
2540 HANDLE ProcessHandle; | |
2541 ULONG CallbackType; | |
2542 union { | |
2543 MINIDUMP_THREAD_CALLBACK Thread; | |
2544 MINIDUMP_THREAD_EX_CALLBACK ThreadEx; | |
2545 MINIDUMP_MODULE_CALLBACK Module; | |
2546 MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread; | |
2547 MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule; | |
2548 }; | |
2549 } | |
2550 alias MINIDUMP_CALLBACK_INPUT* PMINIDUMP_CALLBACK_INPUT; | |
2551 | |
2552 struct MINIDUMP_CALLBACK_OUTPUT { | |
2553 union { | |
2554 ULONG ModuleWriteFlags; | |
2555 ULONG ThreadWriteFlags; | |
2556 }; | |
2557 } | |
2558 alias MINIDUMP_CALLBACK_OUTPUT* PMINIDUMP_CALLBACK_OUTPUT; | |
2559 | |
2560 | |
2561 // | |
2562 // A normal minidump contains just the information | |
2563 // necessary to capture stack traces for all of the | |
2564 // existing threads in a process. | |
2565 // | |
2566 // A minidump with data segments includes all of the data | |
2567 // sections from loaded modules in order to capture | |
2568 // global variable contents. This can make the dump much | |
2569 // larger if many modules have global data. | |
2570 // | |
2571 // A minidump with full memory includes all of the accessible | |
2572 // memory in the process and can be very large. A minidump | |
2573 // with full memory always has the raw memory data at the end | |
2574 // of the dump so that the initial structures in the dump can | |
2575 // be mapped directly without having to include the raw | |
2576 // memory information. | |
2577 // | |
2578 // Stack and backing store memory can be filtered to remove | |
2579 // data unnecessary for stack walking. This can improve | |
2580 // compression of stacks and also deletes data that may | |
2581 // be private and should not be stored in a dump. | |
2582 // Memory can also be scanned to see what modules are | |
2583 // referenced by stack and backing store memory to allow | |
2584 // omission of other modules to reduce dump size. | |
2585 // In either of these modes the ModuleReferencedByMemory flag | |
2586 // is set for all modules referenced before the base | |
2587 // module callbacks occur. | |
2588 // | |
2589 // On some operating systems a list of modules that were | |
2590 // recently unloaded is kept in addition to the currently | |
2591 // loaded module list. This information can be saved in | |
2592 // the dump if desired. | |
2593 // | |
2594 // Stack and backing store memory can be scanned for referenced | |
2595 // pages in order to pick up data referenced by locals or other | |
2596 // stack memory. This can increase the size of a dump significantly. | |
2597 // | |
2598 // Module paths may contain undesired information such as user names | |
2599 // or other important directory names so they can be stripped. This | |
2600 // option reduces the ability to locate the proper image later | |
2601 // and should only be used in certain situations. | |
2602 // | |
2603 // Complete operating system per-process and per-thread information can | |
2604 // be gathered and stored in the dump. | |
2605 // | |
2606 // The virtual address space can be scanned for various types | |
2607 // of memory to be included in the dump. | |
2608 // | |
2609 | |
2610 | |
2611 enum MINIDUMP_TYPE { | |
2612 MiniDumpNormal = 0x0000, | |
2613 MiniDumpWithDataSegs = 0x0001, | |
2614 MiniDumpWithFullMemory = 0x0002, | |
2615 MiniDumpWithHandleData = 0x0004, | |
2616 MiniDumpFilterMemory = 0x0008, | |
2617 MiniDumpScanMemory = 0x0010, | |
2618 MiniDumpWithUnloadedModules = 0x0020, | |
2619 MiniDumpWithIndirectlyReferencedMemory = 0x0040, | |
2620 MiniDumpFilterModulePaths = 0x0080, | |
2621 MiniDumpWithProcessThreadData = 0x0100, | |
2622 MiniDumpWithPrivateReadWriteMemory = 0x0200, | |
2623 }; | |
2624 | |
2625 | |
2626 // | |
2627 // The minidump callback should modify the FieldsToWrite parameter to reflect | |
2628 // what portions of the specified thread or module should be written to the | |
2629 // file. | |
2630 // | |
2631 | |
2632 | |
2633 alias BOOL function ( | |
2634 PVOID CallbackParam, | |
2635 PMINIDUMP_CALLBACK_INPUT CallbackInput, | |
2636 PMINIDUMP_CALLBACK_OUTPUT CallbackOutput | |
2637 ) | |
2638 MINIDUMP_CALLBACK_ROUTINE; | |
2639 | |
2640 struct MINIDUMP_CALLBACK_INFORMATION { | |
2641 MINIDUMP_CALLBACK_ROUTINE CallbackRoutine; | |
2642 PVOID CallbackParam; | |
2643 } | |
2644 alias MINIDUMP_CALLBACK_INFORMATION* PMINIDUMP_CALLBACK_INFORMATION; | |
2645 | |
2646 // | |
2647 // | |
2648 // PVOID | |
2649 // RVA_TO_ADDR( | |
2650 // PVOID Mapping, | |
2651 // ULONG Rva | |
2652 // ) | |
2653 // | |
2654 // Routine Description: | |
2655 // | |
2656 // Map an RVA that is contained within a mapped file to it's associated | |
2657 // flat address. | |
2658 // | |
2659 // Arguments: | |
2660 // | |
2661 // Mapping - Base address of mapped file containing the RVA. | |
2662 // | |
2663 // Rva - An Rva to fixup. | |
2664 // | |
2665 // Return Values: | |
2666 // | |
2667 // A pointer to the desired data. | |
2668 // | |
2669 //-- | |
2670 | |
2671 //#define RVA_TO_ADDR(Mapping,Rva) ((PVOID)(((ULONG_PTR) (Mapping)) + (Rva))) | |
2672 | |
2673 BOOL | |
2674 MiniDumpWriteDump( | |
2675 HANDLE hProcess, | |
2676 DWORD ProcessId, | |
2677 HANDLE hFile, | |
2678 MINIDUMP_TYPE DumpType, | |
2679 PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, | |
2680 PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, | |
2681 PMINIDUMP_CALLBACK_INFORMATION CallbackParam | |
2682 ); | |
2683 | |
2684 BOOL | |
2685 MiniDumpReadDumpStream( | |
2686 PVOID BaseOfDump, | |
2687 ULONG StreamNumber, | |
2688 PMINIDUMP_DIRECTORY * Dir, | |
2689 PVOID * StreamPointer, | |
2690 ULONG * StreamSize | |
2691 ); | |
2692 | |
2693 //#include <poppack.h> | |
2694 | |
2695 } | |
2696 | |
2697 | |
2698 //#endif // _DBGHELP_ |