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