xref: /reactos/sdk/include/psdk/dbghelp.h (revision 58aee30e)
1 /*
2  * Declarations for DBGHELP
3  *
4  * Copyright (C) 2003 Eric Pouech
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #ifndef __WINE_DBGHELP_H
22 #define __WINE_DBGHELP_H
23 
24 /* A set of documentation macros (see also imagehlp.h) */
25 #ifndef __deref_out
26 # define __deref_out
27 #endif
28 #ifndef __deref_out_opt
29 # define __deref_out_opt
30 #endif
31 #ifndef __deref_opt_out
32 # define __deref_opt_out
33 #endif
34 #ifndef __in
35 # define __in
36 #endif
37 #ifndef __in_opt
38 # define __in_opt
39 #endif
40 #ifndef __in_bcount
41 # define __in_bcount(x)
42 #endif
43 #ifndef __in_bcount_opt
44 # define __in_bcount_opt(x)
45 #endif
46 #ifndef __in_ecount
47 # define __in_ecount(x)
48 #endif
49 #ifndef __inout
50 # define __inout
51 #endif
52 #ifndef __inout_opt
53 # define __inout_opt
54 #endif
55 #ifndef __inout_bcount
56 # define __inout_bcount(x)
57 #endif
58 #ifndef __inout_ecount
59 # define __inout_ecount(x)
60 #endif
61 #ifndef __out
62 # define __out
63 #endif
64 #ifndef __out_opt
65 # define __out_opt
66 #endif
67 #ifndef __out_bcount
68 # define __out_bcount(x)
69 #endif
70 #ifndef __out_bcount_opt
71 # define __out_bcount_opt(x)
72 #endif
73 #ifndef __out_ecount
74 # define __out_ecount(x)
75 #endif
76 #ifndef __out_ecount_opt
77 # define __out_ecount_opt(x)
78 #endif
79 #ifndef __out_xcount
80 # define __out_xcount(x)
81 #endif
82 
83 
84 #ifdef __cplusplus
85 extern "C" {
86 #endif /* defined(__cplusplus) */
87 
88 #ifdef _WIN64
89 #ifndef _IMAGEHLP64
90 #define _IMAGEHLP64
91 #endif
92 #endif
93 
94 #define IMAGEAPI WINAPI
95 #define DBHLPAPI IMAGEAPI
96 
97 typedef struct _LOADED_IMAGE
98 {
99     PSTR                        ModuleName;
100     HANDLE                      hFile;
101     PUCHAR                      MappedAddress;
102     PIMAGE_NT_HEADERS           FileHeader;
103     PIMAGE_SECTION_HEADER       LastRvaSection;
104     ULONG                       NumberOfSections;
105     PIMAGE_SECTION_HEADER       Sections;
106     ULONG                       Characteristics;
107     BOOLEAN                     fSystemImage;
108     BOOLEAN                     fDOSImage;
109     BOOLEAN                     fReadOnly;
110     UCHAR                       Version;
111     LIST_ENTRY                  Links;
112     ULONG                       SizeOfImage;
113 } LOADED_IMAGE, *PLOADED_IMAGE;
114 
115 /*************************
116  *    IMAGEHLP equiv     *
117  *************************/
118 
119 typedef enum
120 {
121     AddrMode1616,
122     AddrMode1632,
123     AddrModeReal,
124     AddrModeFlat
125 } ADDRESS_MODE;
126 
127 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
128 #define ADDRESS ADDRESS64
129 #define LPADDRESS LPADDRESS64
130 #else
131 typedef struct _tagADDRESS
132 {
133     DWORD                       Offset;
134     WORD                        Segment;
135     ADDRESS_MODE                Mode;
136 } ADDRESS, *LPADDRESS;
137 #endif
138 
139 typedef struct _tagADDRESS64
140 {
141     DWORD64                     Offset;
142     WORD                        Segment;
143     ADDRESS_MODE                Mode;
144 } ADDRESS64, *LPADDRESS64;
145 
146 #define SYMF_OMAP_GENERATED   0x00000001
147 #define SYMF_OMAP_MODIFIED    0x00000002
148 #define SYMF_USER_GENERATED   0x00000004
149 #define SYMF_REGISTER         0x00000008
150 #define SYMF_REGREL           0x00000010
151 #define SYMF_FRAMEREL         0x00000020
152 #define SYMF_PARAMETER        0x00000040
153 #define SYMF_LOCAL            0x00000080
154 #define SYMF_CONSTANT         0x00000100
155 #define SYMF_EXPORT           0x00000200
156 #define SYMF_FORWARDER        0x00000400
157 #define SYMF_FUNCTION         0x00000800
158 #define SYMF_VIRTUAL          0x00001000
159 #define SYMF_THUNK            0x00002000
160 #define SYMF_TLSREL           0x00004000
161 
162 typedef enum
163 {
164     SymNone = 0,
165     SymCoff,
166     SymCv,
167     SymPdb,
168     SymExport,
169     SymDeferred,
170     SymSym,
171     SymDia,
172     SymVirtual,
173     NumSymTypes
174 } SYM_TYPE;
175 
176 #ifdef _NO_CVCONST_H
177 enum SymTagEnum
178 {
179     SymTagNull,
180     SymTagExe,
181     SymTagCompiland,
182     SymTagCompilandDetails,
183     SymTagCompilandEnv,
184     SymTagFunction,
185     SymTagBlock,
186     SymTagData,
187     SymTagAnnotation,
188     SymTagLabel,
189     SymTagPublicSymbol,
190     SymTagUDT,
191     SymTagEnum,
192     SymTagFunctionType,
193     SymTagPointerType,
194     SymTagArrayType,
195     SymTagBaseType,
196     SymTagTypedef,
197     SymTagBaseClass,
198     SymTagFriend,
199     SymTagFunctionArgType,
200     SymTagFuncDebugStart,
201     SymTagFuncDebugEnd,
202     SymTagUsingNamespace,
203     SymTagVTableShape,
204     SymTagVTable,
205     SymTagCustom,
206     SymTagThunk,
207     SymTagCustomType,
208     SymTagManagedType,
209     SymTagDimension,
210     SymTagCallSite,
211     SymTagInlineSite,
212     SymTagBaseInterface,
213     SymTagVectorType,
214     SymTagMatrixType,
215     SymTagHLSLType,
216     SymTagCaller,
217     SymTagCallee,
218     SymTagExport,
219     SymTagHeapAllocationSite,
220     SymTagCoffGroup,
221     SymTagMax
222 };
223 #endif // _NO_CVCONST_H
224 
225 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
226 #define IMAGEHLP_SYMBOL IMAGEHLP_SYMBOL64
227 #define IMAGEHLP_SYMBOLW IMAGEHLP_SYMBOLW64
228 #define PIMAGEHLP_SYMBOL PIMAGEHLP_SYMBOL64
229 #define PIMAGEHLP_SYMBOLW PIMAGEHLP_SYMBOLW64
230 #else
231 typedef struct _IMAGEHLP_SYMBOL
232 {
233     DWORD                       SizeOfStruct;
234     DWORD                       Address;
235     DWORD                       Size;
236     DWORD                       Flags;
237     DWORD                       MaxNameLength;
238     CHAR                        Name[1];
239 } IMAGEHLP_SYMBOL, *PIMAGEHLP_SYMBOL;
240 
241 typedef struct _IMAGEHLP_SYMBOLW
242 {
243     DWORD                       SizeOfStruct;
244     DWORD                       Address;
245     DWORD                       Size;
246     DWORD                       Flags;
247     DWORD                       MaxNameLength;
248     WCHAR                       Name[1];
249 } IMAGEHLP_SYMBOLW, *PIMAGEHLP_SYMBOLW;
250 #endif
251 
252 typedef struct _IMAGEHLP_SYMBOL64
253 {
254     DWORD                       SizeOfStruct;
255     DWORD64                     Address;
256     DWORD                       Size;
257     DWORD                       Flags;
258     DWORD                       MaxNameLength;
259     CHAR                        Name[1];
260 } IMAGEHLP_SYMBOL64, *PIMAGEHLP_SYMBOL64;
261 
262 typedef struct _IMAGEHLP_SYMBOLW64
263 {
264     DWORD                       SizeOfStruct;
265     DWORD64                     Address;
266     DWORD                       Size;
267     DWORD                       Flags;
268     DWORD                       MaxNameLength;
269     WCHAR                       Name[1];
270 } IMAGEHLP_SYMBOLW64, *PIMAGEHLP_SYMBOLW64;
271 
272 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
273 #define IMAGEHLP_MODULE IMAGEHLP_MODULE64
274 #define PIMAGEHLP_MODULE PIMAGEHLP_MODULE64
275 #define IMAGEHLP_MODULEW IMAGEHLP_MODULEW64
276 #define PIMAGEHLP_MODULEW PIMAGEHLP_MODULEW64
277 #else
278 typedef struct _IMAGEHLP_MODULE
279 {
280     DWORD                       SizeOfStruct;
281     DWORD                       BaseOfImage;
282     DWORD                       ImageSize;
283     DWORD                       TimeDateStamp;
284     DWORD                       CheckSum;
285     DWORD                       NumSyms;
286     SYM_TYPE                    SymType;
287     CHAR                        ModuleName[32];
288     CHAR                        ImageName[256];
289     CHAR                        LoadedImageName[256];
290 } IMAGEHLP_MODULE, *PIMAGEHLP_MODULE;
291 
292 typedef struct _IMAGEHLP_MODULEW
293 {
294     DWORD                       SizeOfStruct;
295     DWORD                       BaseOfImage;
296     DWORD                       ImageSize;
297     DWORD                       TimeDateStamp;
298     DWORD                       CheckSum;
299     DWORD                       NumSyms;
300     SYM_TYPE                    SymType;
301     WCHAR                       ModuleName[32];
302     WCHAR                       ImageName[256];
303     WCHAR                       LoadedImageName[256];
304 } IMAGEHLP_MODULEW, *PIMAGEHLP_MODULEW;
305 #endif
306 
307 typedef struct _IMAGEHLP_MODULE64
308 {
309     DWORD                       SizeOfStruct;
310     DWORD64                     BaseOfImage;
311     DWORD                       ImageSize;
312     DWORD                       TimeDateStamp;
313     DWORD                       CheckSum;
314     DWORD                       NumSyms;
315     SYM_TYPE                    SymType;
316     CHAR                        ModuleName[32];
317     CHAR                        ImageName[256];
318     CHAR                        LoadedImageName[256];
319     CHAR                        LoadedPdbName[256];
320     DWORD                       CVSig;
321     CHAR                        CVData[MAX_PATH*3];
322     DWORD                       PdbSig;
323     GUID                        PdbSig70;
324     DWORD                       PdbAge;
325     BOOL                        PdbUnmatched;
326     BOOL                        DbgUnmatched;
327     BOOL                        LineNumbers;
328     BOOL                        GlobalSymbols;
329     BOOL                        TypeInfo;
330     BOOL                        SourceIndexed;
331     BOOL                        Publics;
332 } IMAGEHLP_MODULE64, *PIMAGEHLP_MODULE64;
333 
334 typedef struct _IMAGEHLP_MODULEW64
335 {
336     DWORD                       SizeOfStruct;
337     DWORD64                     BaseOfImage;
338     DWORD                       ImageSize;
339     DWORD                       TimeDateStamp;
340     DWORD                       CheckSum;
341     DWORD                       NumSyms;
342     SYM_TYPE                    SymType;
343     WCHAR                       ModuleName[32];
344     WCHAR                       ImageName[256];
345     WCHAR                       LoadedImageName[256];
346     WCHAR                       LoadedPdbName[256];
347     DWORD                       CVSig;
348     WCHAR                       CVData[MAX_PATH*3];
349     DWORD                       PdbSig;
350     GUID                        PdbSig70;
351     DWORD                       PdbAge;
352     BOOL                        PdbUnmatched;
353     BOOL                        DbgUnmatched;
354     BOOL                        LineNumbers;
355     BOOL                        GlobalSymbols;
356     BOOL                        TypeInfo;
357     BOOL                        SourceIndexed;
358     BOOL                        Publics;
359 } IMAGEHLP_MODULEW64, *PIMAGEHLP_MODULEW64;
360 
361 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
362 #define IMAGEHLP_LINE IMAGEHLP_LINE64
363 #define PIMAGEHLP_LINE PIMAGEHLP_LINE64
364 #define IMAGEHLP_LINEW IMAGEHLP_LINEW64
365 #define PIMAGEHLP_LINEW PIMAGEHLP_LINEW64
366 #else
367 typedef struct _IMAGEHLP_LINE
368 {
369     DWORD                       SizeOfStruct;
370     PVOID                       Key;
371     DWORD                       LineNumber;
372     PCHAR                       FileName;
373     DWORD                       Address;
374 } IMAGEHLP_LINE, *PIMAGEHLP_LINE;
375 
376 typedef struct _IMAGEHLP_LINEW
377 {
378     DWORD                       SizeOfStruct;
379     PVOID                       Key;
380     DWORD                       LineNumber;
381     PWSTR                       FileName;
382     DWORD                       Address;
383 } IMAGEHLP_LINEW, *PIMAGEHLP_LINEW;
384 #endif
385 
386 typedef struct _IMAGEHLP_LINE64
387 {
388     DWORD                       SizeOfStruct;
389     PVOID                       Key;
390     DWORD                       LineNumber;
391     PCHAR                       FileName;
392     DWORD64                     Address;
393 } IMAGEHLP_LINE64, *PIMAGEHLP_LINE64;
394 
395 typedef struct _IMAGEHLP_LINEW64
396 {
397     DWORD                       SizeOfStruct;
398     PVOID                       Key;
399     DWORD                       LineNumber;
400     PWSTR                       FileName;
401     DWORD64                     Address;
402 } IMAGEHLP_LINEW64, *PIMAGEHLP_LINEW64;
403 
404 typedef struct _SOURCEFILE
405 {
406     DWORD64                     ModBase;
407     PCHAR                       FileName;
408 } SOURCEFILE, *PSOURCEFILE;
409 
410 typedef struct _SOURCEFILEW
411 {
412     DWORD64                     ModBase;
413     PWSTR                       FileName;
414 } SOURCEFILEW, *PSOURCEFILEW;
415 
416 #define CBA_DEFERRED_SYMBOL_LOAD_START          0x00000001
417 #define CBA_DEFERRED_SYMBOL_LOAD_COMPLETE       0x00000002
418 #define CBA_DEFERRED_SYMBOL_LOAD_FAILURE        0x00000003
419 #define CBA_SYMBOLS_UNLOADED                    0x00000004
420 #define CBA_DUPLICATE_SYMBOL                    0x00000005
421 #define CBA_READ_MEMORY                         0x00000006
422 #define CBA_DEFERRED_SYMBOL_LOAD_CANCEL         0x00000007
423 #define CBA_SET_OPTIONS                         0x00000008
424 #define CBA_EVENT                               0x00000010
425 #define CBA_DEFERRED_SYMBOL_LOAD_PARTIAL        0x00000020
426 #define CBA_DEBUG_INFO                          0x10000000
427 
428 typedef struct _IMAGEHLP_CBA_READ_MEMORY
429 {
430     DWORD64   addr;
431     PVOID     buf;
432     DWORD     bytes;
433     DWORD    *bytesread;
434 } IMAGEHLP_CBA_READ_MEMORY, *PIMAGEHLP_CBA_READ_MEMORY;
435 
436 enum
437 {
438     sevInfo = 0,
439     sevProblem,
440     sevAttn,
441     sevFatal,
442     sevMax
443 };
444 
445 #define EVENT_SRCSPEW_START 100
446 #define EVENT_SRCSPEW       100
447 #define EVENT_SRCSPEW_END   199
448 
449 typedef struct _IMAGEHLP_CBA_EVENT
450 {
451     DWORD       severity;
452     DWORD       code;
453     PCHAR       desc;
454     PVOID       object;
455 } IMAGEHLP_CBA_EVENT, *PIMAGEHLP_CBA_EVENT;
456 
457 typedef struct _IMAGEHLP_CBA_EVENTW
458 {
459     DWORD       severity;
460     DWORD       code;
461     PCWSTR      desc;
462     PVOID       object;
463 } IMAGEHLP_CBA_EVENTW, *PIMAGEHLP_CBA_EVENTW;
464 
465 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
466 #define IMAGEHLP_DEFERRED_SYMBOL_LOAD IMAGEHLP_DEFERRED_SYMBOL_LOAD64
467 #define PIMAGEHLP_DEFERRED_SYMBOL_LOAD PIMAGEHLP_DEFERRED_SYMBOL_LOAD64
468 #else
469 typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD
470 {
471     DWORD                       SizeOfStruct;
472     DWORD                       BaseOfImage;
473     DWORD                       CheckSum;
474     DWORD                       TimeDateStamp;
475     CHAR                        FileName[MAX_PATH];
476     BOOLEAN                     Reparse;
477     HANDLE                      hFile;
478 } IMAGEHLP_DEFERRED_SYMBOL_LOAD, *PIMAGEHLP_DEFERRED_SYMBOL_LOAD;
479 #endif
480 
481 typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOAD64
482 {
483     DWORD                       SizeOfStruct;
484     DWORD64                     BaseOfImage;
485     DWORD                       CheckSum;
486     DWORD                       TimeDateStamp;
487     CHAR                        FileName[MAX_PATH];
488     BOOLEAN                     Reparse;
489     HANDLE                      hFile;
490     DWORD                       Flags;
491 } IMAGEHLP_DEFERRED_SYMBOL_LOAD64, *PIMAGEHLP_DEFERRED_SYMBOL_LOAD64;
492 
493 typedef struct _IMAGEHLP_DEFERRED_SYMBOL_LOADW64
494 {
495     DWORD                       SizeOfStruct;
496     DWORD64                     BaseOfImage;
497     DWORD                       CheckSum;
498     DWORD                       TimeDateStamp;
499     WCHAR                       FileName[MAX_PATH + 1];
500     BOOLEAN                     Reparse;
501     HANDLE                      hFile;
502     DWORD                       Flags;
503 } IMAGEHLP_DEFERRED_SYMBOL_LOADW64, *PIMAGEHLP_DEFERRED_SYMBOL_LOADW64;
504 
505 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
506 #define IMAGEHLP_DUPLICATE_SYMBOL IMAGEHLP_DUPLICATE_SYMBOL64
507 #define PIMAGEHLP_DUPLICATE_SYMBOL PIMAGEHLP_DUPLICATE_SYMBOL64
508 #else
509 typedef struct _IMAGEHLP_DUPLICATE_SYMBOL
510 {
511     DWORD                       SizeOfStruct;
512     DWORD                       NumberOfDups;
513     PIMAGEHLP_SYMBOL            Symbol;
514     DWORD                       SelectedSymbol;
515 } IMAGEHLP_DUPLICATE_SYMBOL, *PIMAGEHLP_DUPLICATE_SYMBOL;
516 #endif
517 
518 typedef struct _IMAGEHLP_DUPLICATE_SYMBOL64
519 {
520     DWORD                       SizeOfStruct;
521     DWORD                       NumberOfDups;
522     PIMAGEHLP_SYMBOL64          Symbol;
523     DWORD                       SelectedSymbol;
524 } IMAGEHLP_DUPLICATE_SYMBOL64, *PIMAGEHLP_DUPLICATE_SYMBOL64;
525 
526 #define SYMOPT_CASE_INSENSITIVE         0x00000001
527 #define SYMOPT_UNDNAME                  0x00000002
528 #define SYMOPT_DEFERRED_LOADS           0x00000004
529 #define SYMOPT_NO_CPP                   0x00000008
530 #define SYMOPT_LOAD_LINES               0x00000010
531 #define SYMOPT_OMAP_FIND_NEAREST        0x00000020
532 #define SYMOPT_LOAD_ANYTHING            0x00000040
533 #define SYMOPT_IGNORE_CVREC             0x00000080
534 #define SYMOPT_NO_UNQUALIFIED_LOADS     0x00000100
535 #define SYMOPT_FAIL_CRITICAL_ERRORS     0x00000200
536 #define SYMOPT_EXACT_SYMBOLS            0x00000400
537 #define SYMOPT_WILD_UNDERSCORE          0x00000800
538 #define SYMOPT_USE_DEFAULTS             0x00001000
539 #define SYMOPT_ALLOW_ABSOLUTE_SYMBOLS   0x00000800
540 #define SYMOPT_IGNORE_NT_SYMPATH        0x00001000
541 #define SYMOPT_INCLUDE_32BIT_MODULES    0x00002000
542 #define SYMOPT_PUBLICS_ONLY             0x00004000
543 #define SYMOPT_NO_PUBLICS               0x00008000
544 #define SYMOPT_AUTO_PUBLICS             0x00010000
545 #define SYMOPT_NO_IMAGE_SEARCH          0x00020000
546 #define SYMOPT_SECURE                   0x00040000
547 #define SYMOPT_NO_PROMPTS               0x00080000
548 #define SYMOPT_OVERWRITE                0x00100000
549 #define SYMOPT_IGNORE_IMAGEDIR          0x00200000
550 #define SYMOPT_FLAT_DIRECTORY           0x00400000
551 #define SYMOPT_FAVOR_COMPRESSED         0x00800000
552 #define SYMOPT_ALLOW_ZERO_ADDRESS       0x01000000
553 #define SYMOPT_DISABLE_SYMSRV_AUTODETECT 0x02000000
554 #define SYMOPT_READONLY_CACHE           0x04000000
555 #define SYMOPT_SYMPATH_LAST             0x08000000
556 #define SYMOPT_DEBUG                    0x80000000
557 
558 typedef struct _IMAGEHLP_STACK_FRAME
559 {
560     ULONG64     InstructionOffset;
561     ULONG64     ReturnOffset;
562     ULONG64     FrameOffset;
563     ULONG64     StackOffset;
564     ULONG64     BackingStoreOffset;
565     ULONG64     FuncTableEntry;
566     ULONG64     Params[4];
567     ULONG64     Reserved[5];
568     BOOL        Virtual;
569     ULONG       Reserved2;
570 } IMAGEHLP_STACK_FRAME, *PIMAGEHLP_STACK_FRAME;
571 
572 typedef VOID IMAGEHLP_CONTEXT, *PIMAGEHLP_CONTEXT;
573 
574 #define DBHHEADER_DEBUGDIRS     0x1
575 typedef struct _DBGHELP_MODLOAD_DATA
576 {
577     DWORD               ssize;
578     DWORD               ssig;
579     PVOID               data;
580     DWORD               size;
581     DWORD               flags;
582 } MODLOAD_DATA, *PMODLOAD_DATA;
583 
584 /*************************
585  *       MiniDUMP        *
586  *************************/
587 
588 #include <pshpack4.h>
589 /* DebugHelp */
590 
591 #define MINIDUMP_SIGNATURE 0x504D444D /* 'MDMP' */
592 #define MINIDUMP_VERSION   (42899)
593 
594 typedef DWORD   RVA;
595 typedef ULONG64 RVA64;
596 
597 typedef enum _MINIDUMP_TYPE
598 {
599     MiniDumpNormal                              = 0x0000,
600     MiniDumpWithDataSegs                        = 0x0001,
601     MiniDumpWithFullMemory                      = 0x0002,
602     MiniDumpWithHandleData                      = 0x0004,
603     MiniDumpFilterMemory                        = 0x0008,
604     MiniDumpScanMemory                          = 0x0010,
605     MiniDumpWithUnloadedModules                 = 0x0020,
606     MiniDumpWithIndirectlyReferencedMemory      = 0x0040,
607     MiniDumpFilterModulePaths                   = 0x0080,
608     MiniDumpWithProcessThreadData               = 0x0100,
609     MiniDumpWithPrivateReadWriteMemory          = 0x0200,
610     MiniDumpWithoutOptionalData                 = 0x0400,
611     MiniDumpWithFullMemoryInfo                  = 0x0800,
612     MiniDumpWithThreadInfo                      = 0x1000,
613     MiniDumpWithCodeSegs                        = 0x2000
614 } MINIDUMP_TYPE;
615 
616 typedef enum _MINIDUMP_CALLBACK_TYPE
617 {
618     ModuleCallback,
619     ThreadCallback,
620     ThreadExCallback,
621     IncludeThreadCallback,
622     IncludeModuleCallback,
623     MemoryCallback,
624 } MINIDUMP_CALLBACK_TYPE;
625 
626 typedef struct _MINIDUMP_THREAD_CALLBACK
627 {
628     ULONG                       ThreadId;
629     HANDLE                      ThreadHandle;
630     CONTEXT                     Context;
631     ULONG                       SizeOfContext;
632     ULONG64                     StackBase;
633     ULONG64                     StackEnd;
634 } MINIDUMP_THREAD_CALLBACK, *PMINIDUMP_THREAD_CALLBACK;
635 
636 typedef struct _MINIDUMP_THREAD_EX_CALLBACK
637 {
638     ULONG                       ThreadId;
639     HANDLE                      ThreadHandle;
640     CONTEXT                     Context;
641     ULONG                       SizeOfContext;
642     ULONG64                     StackBase;
643     ULONG64                     StackEnd;
644     ULONG64                     BackingStoreBase;
645     ULONG64                     BackingStoreEnd;
646 } MINIDUMP_THREAD_EX_CALLBACK, *PMINIDUMP_THREAD_EX_CALLBACK;
647 
648 typedef struct _MINIDUMP_INCLUDE_THREAD_CALLBACK
649 {
650     ULONG ThreadId;
651 } MINIDUMP_INCLUDE_THREAD_CALLBACK, *PMINIDUMP_INCLUDE_THREAD_CALLBACK;
652 
653 typedef enum _THREAD_WRITE_FLAGS
654 {
655     ThreadWriteThread            = 0x0001,
656     ThreadWriteStack             = 0x0002,
657     ThreadWriteContext           = 0x0004,
658     ThreadWriteBackingStore      = 0x0008,
659     ThreadWriteInstructionWindow = 0x0010,
660     ThreadWriteThreadData        = 0x0020,
661     ThreadWriteThreadInfo        = 0x0040
662 } THREAD_WRITE_FLAGS;
663 
664 typedef struct _MINIDUMP_MODULE_CALLBACK
665 {
666     PWCHAR                      FullPath;
667     ULONG64                     BaseOfImage;
668     ULONG                       SizeOfImage;
669     ULONG                       CheckSum;
670     ULONG                       TimeDateStamp;
671     VS_FIXEDFILEINFO            VersionInfo;
672     PVOID                       CvRecord;
673     ULONG                       SizeOfCvRecord;
674     PVOID                       MiscRecord;
675     ULONG                       SizeOfMiscRecord;
676 } MINIDUMP_MODULE_CALLBACK, *PMINIDUMP_MODULE_CALLBACK;
677 
678 typedef struct _MINIDUMP_INCLUDE_MODULE_CALLBACK
679 {
680     ULONG64 BaseOfImage;
681 } MINIDUMP_INCLUDE_MODULE_CALLBACK, *PMINIDUMP_INCLUDE_MODULE_CALLBACK;
682 
683 typedef enum _MODULE_WRITE_FLAGS
684 {
685     ModuleWriteModule        = 0x0001,
686     ModuleWriteDataSeg       = 0x0002,
687     ModuleWriteMiscRecord    = 0x0004,
688     ModuleWriteCvRecord      = 0x0008,
689     ModuleReferencedByMemory = 0x0010,
690     ModuleWriteTlsData       = 0x0020,
691     ModuleWriteCodeSegs      = 0x0040,
692 } MODULE_WRITE_FLAGS;
693 
694 typedef struct _MINIDUMP_CALLBACK_INPUT
695 {
696     ULONG                       ProcessId;
697     HANDLE                      ProcessHandle;
698     ULONG                       CallbackType;
699     union
700     {
701         MINIDUMP_THREAD_CALLBACK        Thread;
702         MINIDUMP_THREAD_EX_CALLBACK     ThreadEx;
703         MINIDUMP_MODULE_CALLBACK        Module;
704         MINIDUMP_INCLUDE_THREAD_CALLBACK IncludeThread;
705         MINIDUMP_INCLUDE_MODULE_CALLBACK IncludeModule;
706     } DUMMYUNIONNAME;
707 } MINIDUMP_CALLBACK_INPUT, *PMINIDUMP_CALLBACK_INPUT;
708 
709 typedef struct _MINIDUMP_CALLBACK_OUTPUT
710 {
711     union
712     {
713         ULONG                           ModuleWriteFlags;
714         ULONG                           ThreadWriteFlags;
715         struct
716         {
717             ULONG64                     MemoryBase;
718             ULONG                       MemorySize;
719         } DUMMYSTRUCTNAME;
720     } DUMMYUNIONNAME;
721 } MINIDUMP_CALLBACK_OUTPUT, *PMINIDUMP_CALLBACK_OUTPUT;
722 
723 typedef BOOL
724 (WINAPI* MINIDUMP_CALLBACK_ROUTINE)(
725   _Inout_ PVOID,
726   _In_ const PMINIDUMP_CALLBACK_INPUT,
727   _Inout_ PMINIDUMP_CALLBACK_OUTPUT);
728 
729 typedef struct _MINIDUMP_CALLBACK_INFORMATION
730 {
731     MINIDUMP_CALLBACK_ROUTINE   CallbackRoutine;
732     void*                       CallbackParam;
733 } MINIDUMP_CALLBACK_INFORMATION, *PMINIDUMP_CALLBACK_INFORMATION;
734 
735 typedef struct _MINIDUMP_LOCATION_DESCRIPTOR
736 {
737     ULONG                       DataSize;
738     RVA                         Rva;
739 } MINIDUMP_LOCATION_DESCRIPTOR;
740 
741 typedef struct _MINIDUMP_LOCATION_DESCRIPTOR64
742 {
743     ULONG64                     DataSize;
744     RVA64                       Rva;
745 } MINIDUMP_LOCATION_DESCRIPTOR64;
746 
747 typedef struct _MINIDUMP_DIRECTORY
748 {
749     ULONG                       StreamType;
750     MINIDUMP_LOCATION_DESCRIPTOR Location;
751 } MINIDUMP_DIRECTORY, *PMINIDUMP_DIRECTORY;
752 
753 typedef struct _MINIDUMP_EXCEPTION
754 {
755     ULONG                       ExceptionCode;
756     ULONG                       ExceptionFlags;
757     ULONG64                     ExceptionRecord;
758     ULONG64                     ExceptionAddress;
759     ULONG                       NumberParameters;
760     ULONG                        __unusedAlignment;
761     ULONG64                     ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
762 } MINIDUMP_EXCEPTION, *PMINIDUMP_EXCEPTION;
763 
764 typedef struct _MINIDUMP_EXCEPTION_INFORMATION
765 {
766     DWORD                       ThreadId;
767     PEXCEPTION_POINTERS         ExceptionPointers;
768     BOOL                        ClientPointers;
769 } MINIDUMP_EXCEPTION_INFORMATION, *PMINIDUMP_EXCEPTION_INFORMATION;
770 
771 typedef struct MINIDUMP_EXCEPTION_STREAM
772 {
773     ULONG                       ThreadId;
774     ULONG                       __alignment;
775     MINIDUMP_EXCEPTION          ExceptionRecord;
776     MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
777 } MINIDUMP_EXCEPTION_STREAM, *PMINIDUMP_EXCEPTION_STREAM;
778 
779 typedef struct _MINIDUMP_HEADER
780 {
781     DWORD                       Signature;
782     DWORD                       Version;
783     DWORD                       NumberOfStreams;
784     RVA                         StreamDirectoryRva;
785     DWORD                       CheckSum;
786     union
787     {
788         DWORD                           Reserved;
789         DWORD                           TimeDateStamp;
790     } DUMMYUNIONNAME;
791     ULONG64                     Flags;
792 } MINIDUMP_HEADER, *PMINIDUMP_HEADER;
793 
794 typedef struct _MINIDUMP_MEMORY_DESCRIPTOR
795 {
796     ULONG64                     StartOfMemoryRange;
797     MINIDUMP_LOCATION_DESCRIPTOR Memory;
798 } MINIDUMP_MEMORY_DESCRIPTOR, *PMINIDUMP_MEMORY_DESCRIPTOR;
799 
800 typedef struct _MINIDUMP_MEMORY_LIST
801 {
802     ULONG                       NumberOfMemoryRanges;
803     MINIDUMP_MEMORY_DESCRIPTOR  MemoryRanges[1]; /* FIXME: 0-sized array not supported */
804 } MINIDUMP_MEMORY_LIST, *PMINIDUMP_MEMORY_LIST;
805 
806 #define MINIDUMP_MISC1_PROCESS_ID       0x00000001
807 #define MINIDUMP_MISC1_PROCESS_TIMES    0x00000002
808 
809 typedef struct _MINIDUMP_MISC_INFO
810 {
811     ULONG                       SizeOfInfo;
812     ULONG                       Flags1;
813     ULONG                       ProcessId;
814     ULONG                       ProcessCreateTime;
815     ULONG                       ProcessUserTime;
816     ULONG                       ProcessKernelTime;
817 } MINIDUMP_MISC_INFO, *PMINIDUMP_MISC_INFO;
818 
819 typedef struct _MINIDUMP_MODULE
820 {
821     ULONG64                     BaseOfImage;
822     ULONG                       SizeOfImage;
823     ULONG                       CheckSum;
824     ULONG                       TimeDateStamp;
825     RVA                         ModuleNameRva;
826     VS_FIXEDFILEINFO            VersionInfo;
827     MINIDUMP_LOCATION_DESCRIPTOR CvRecord;
828     MINIDUMP_LOCATION_DESCRIPTOR MiscRecord;
829     ULONG64                     Reserved0;
830     ULONG64                     Reserved1;
831 } MINIDUMP_MODULE, *PMINIDUMP_MODULE;
832 
833 typedef struct _MINIDUMP_MODULE_LIST
834 {
835     ULONG                       NumberOfModules;
836     MINIDUMP_MODULE             Modules[1]; /* FIXME: 0-sized array not supported */
837 } MINIDUMP_MODULE_LIST, *PMINIDUMP_MODULE_LIST;
838 
839 typedef struct _MINIDUMP_STRING
840 {
841     ULONG                       Length;
842     WCHAR                       Buffer[1]; /* FIXME: O-sized array not supported */
843 } MINIDUMP_STRING, *PMINIDUMP_STRING;
844 
845 typedef struct _MINIDUMP_SYSTEM_INFO
846 {
847     USHORT                      ProcessorArchitecture;
848     USHORT                      ProcessorLevel;
849     USHORT                      ProcessorRevision;
850     union
851     {
852         USHORT                          Reserved0;
853         struct
854         {
855             UCHAR                       NumberOfProcessors;
856             UCHAR                       ProductType;
857         } DUMMYSTRUCTNAME;
858     } DUMMYUNIONNAME;
859 
860     ULONG                       MajorVersion;
861     ULONG                       MinorVersion;
862     ULONG                       BuildNumber;
863     ULONG                       PlatformId;
864 
865     RVA                         CSDVersionRva;
866     union
867     {
868         ULONG                           Reserved1;
869         struct
870         {
871             USHORT                      SuiteMask;
872             USHORT                      Reserved2;
873         } DUMMYSTRUCTNAME;
874     } DUMMYUNIONNAME1;
875     union _CPU_INFORMATION
876     {
877         struct
878         {
879             ULONG                       VendorId[3];
880             ULONG                       VersionInformation;
881             ULONG                       FeatureInformation;
882             ULONG                       AMDExtendedCpuFeatures;
883         } X86CpuInfo;
884         struct
885         {
886             ULONG64                     ProcessorFeatures[2];
887         } OtherCpuInfo;
888     } Cpu;
889 
890 } MINIDUMP_SYSTEM_INFO, *PMINIDUMP_SYSTEM_INFO;
891 
892 typedef struct _MINIDUMP_THREAD
893 {
894     ULONG                       ThreadId;
895     ULONG                       SuspendCount;
896     ULONG                       PriorityClass;
897     ULONG                       Priority;
898     ULONG64                     Teb;
899     MINIDUMP_MEMORY_DESCRIPTOR  Stack;
900     MINIDUMP_LOCATION_DESCRIPTOR ThreadContext;
901 } MINIDUMP_THREAD, *PMINIDUMP_THREAD;
902 
903 typedef struct _MINIDUMP_THREAD_LIST
904 {
905     ULONG                       NumberOfThreads;
906     MINIDUMP_THREAD             Threads[1]; /* FIXME: no support of 0 sized array */
907 } MINIDUMP_THREAD_LIST, *PMINIDUMP_THREAD_LIST;
908 
909 typedef struct _MINIDUMP_USER_STREAM
910 {
911     ULONG                       Type;
912     ULONG                       BufferSize;
913     void*                       Buffer;
914 } MINIDUMP_USER_STREAM, *PMINIDUMP_USER_STREAM;
915 
916 typedef struct _MINIDUMP_USER_STREAM_INFORMATION
917 {
918     ULONG                       UserStreamCount;
919     PMINIDUMP_USER_STREAM       UserStreamArray;
920 } MINIDUMP_USER_STREAM_INFORMATION, *PMINIDUMP_USER_STREAM_INFORMATION;
921 
922 typedef enum _MINIDUMP_STREAM_TYPE
923 {
924     UnusedStream                = 0,
925     ReservedStream0             = 1,
926     ReservedStream1             = 2,
927     ThreadListStream            = 3,
928     ModuleListStream            = 4,
929     MemoryListStream            = 5,
930     ExceptionStream             = 6,
931     SystemInfoStream            = 7,
932     ThreadExListStream          = 8,
933     Memory64ListStream          = 9,
934     CommentStreamA              = 10,
935     CommentStreamW              = 11,
936     HandleDataStream            = 12,
937     FunctionTableStream         = 13,
938     UnloadedModuleListStream    = 14,
939     MiscInfoStream              = 15,
940     MemoryInfoListStream        = 16,
941     ThreadInfoListStream        = 17,
942 
943     LastReservedStream          = 0xffff
944 } MINIDUMP_STREAM_TYPE;
945 
946 BOOL
947 WINAPI
948 MiniDumpWriteDump(
949   _In_ HANDLE,
950   _In_ DWORD,
951   _In_ HANDLE,
952   _In_ MINIDUMP_TYPE,
953   _In_opt_ PMINIDUMP_EXCEPTION_INFORMATION,
954   _In_opt_ PMINIDUMP_USER_STREAM_INFORMATION,
955   _In_opt_ PMINIDUMP_CALLBACK_INFORMATION);
956 
957 BOOL
958 WINAPI
959 MiniDumpReadDumpStream(
960   _In_ PVOID,
961   _In_ ULONG,
962   _Outptr_result_maybenull_ PMINIDUMP_DIRECTORY*,
963   _Outptr_result_maybenull_ PVOID*,
964   _Out_opt_ ULONG*);
965 
966 #include <poppack.h>
967 
968 /*************************
969  *    MODULE handling    *
970  *************************/
971 
972 /* flags for SymLoadModuleEx */
973 #define SLMFLAG_VIRTUAL         0x1
974 #define SLMFLAG_NO_SYMBOLS      0x4
975 
976 typedef BOOL
977 (CALLBACK *PENUMLOADED_MODULES_CALLBACK64)(
978   _In_ PCSTR,
979   _In_ DWORD64,
980   _In_ ULONG,
981   _In_opt_ PVOID);
982 
983 BOOL
984 WINAPI
985 EnumerateLoadedModules64(
986   _In_ HANDLE,
987   _In_ PENUMLOADED_MODULES_CALLBACK64,
988   _In_opt_ PVOID);
989 
990 typedef BOOL
991 (CALLBACK *PENUMLOADED_MODULES_CALLBACKW64)(
992   _In_ PCWSTR,
993   _In_ DWORD64,
994   _In_ ULONG,
995   _In_opt_ PVOID);
996 
997 BOOL
998 WINAPI
999 EnumerateLoadedModulesW64(
1000   _In_ HANDLE,
1001   _In_ PENUMLOADED_MODULES_CALLBACKW64,
1002   _In_opt_ PVOID);
1003 
1004 typedef BOOL
1005 (CALLBACK *PSYM_ENUMMODULES_CALLBACK64)(
1006   _In_ PCSTR,
1007   _In_ DWORD64,
1008   _In_opt_ PVOID);
1009 
1010 BOOL
1011 WINAPI
1012 SymEnumerateModules64(
1013   _In_ HANDLE,
1014   _In_ PSYM_ENUMMODULES_CALLBACK64,
1015   _In_opt_ PVOID);
1016 
1017 typedef BOOL
1018 (CALLBACK *PSYM_ENUMMODULES_CALLBACKW64)(
1019   _In_ PCWSTR,
1020   _In_ DWORD64,
1021   _In_opt_ PVOID);
1022 
1023 BOOL
1024 WINAPI
1025 SymEnumerateModulesW64(
1026   _In_ HANDLE,
1027   _In_ PSYM_ENUMMODULES_CALLBACKW64,
1028   _In_opt_ PVOID);
1029 
1030 BOOL
1031 WINAPI
1032 SymGetModuleInfo64(
1033   _In_ HANDLE,
1034   _In_ DWORD64,
1035   _Out_ PIMAGEHLP_MODULE64);
1036 
1037 BOOL
1038 WINAPI
1039 SymGetModuleInfoW64(
1040   _In_ HANDLE,
1041   _In_ DWORD64,
1042   _Out_ PIMAGEHLP_MODULEW64);
1043 
1044 DWORD64 WINAPI SymGetModuleBase64(_In_ HANDLE, _In_ DWORD64);
1045 
1046 DWORD64
1047 WINAPI
1048 SymLoadModule64(
1049   _In_ HANDLE,
1050   _In_opt_ HANDLE,
1051   _In_opt_ PCSTR,
1052   _In_opt_ PCSTR,
1053   _In_ DWORD64,
1054   _In_ DWORD);
1055 
1056 DWORD64
1057 WINAPI
1058 SymLoadModuleEx(
1059   _In_ HANDLE,
1060   _In_opt_ HANDLE,
1061   _In_opt_ PCSTR,
1062   _In_opt_ PCSTR,
1063   _In_ DWORD64,
1064   _In_ DWORD,
1065   _In_opt_ PMODLOAD_DATA,
1066   _In_opt_ DWORD);
1067 
1068 DWORD64
1069 WINAPI
1070 SymLoadModuleExW(
1071   _In_ HANDLE,
1072   _In_opt_ HANDLE,
1073   _In_opt_ PCWSTR,
1074   _In_opt_ PCWSTR,
1075   _In_ DWORD64,
1076   _In_ DWORD,
1077   _In_opt_ PMODLOAD_DATA,
1078   _In_opt_ DWORD);
1079 
1080 BOOL WINAPI SymUnloadModule64(_In_ HANDLE, _In_ DWORD64);
1081 
1082 /*************************
1083  *    Symbol Handling    *
1084  *************************/
1085 
1086 #define IMAGEHLP_SYMBOL_INFO_VALUEPRESENT          1
1087 #define IMAGEHLP_SYMBOL_INFO_REGISTER              SYMF_REGISTER        /*  0x08 */
1088 #define IMAGEHLP_SYMBOL_INFO_REGRELATIVE           SYMF_REGREL          /*  0x10 */
1089 #define IMAGEHLP_SYMBOL_INFO_FRAMERELATIVE         SYMF_FRAMEREL        /*  0x20 */
1090 #define IMAGEHLP_SYMBOL_INFO_PARAMETER             SYMF_PARAMETER       /*  0x40 */
1091 #define IMAGEHLP_SYMBOL_INFO_LOCAL                 SYMF_LOCAL           /*  0x80 */
1092 #define IMAGEHLP_SYMBOL_INFO_CONSTANT              SYMF_CONSTANT        /* 0x100 */
1093 #define IMAGEHLP_SYMBOL_FUNCTION                   SYMF_FUNCTION        /* 0x800 */
1094 
1095 #define SYMFLAG_VALUEPRESENT     0x00000001
1096 #define SYMFLAG_REGISTER         0x00000008
1097 #define SYMFLAG_REGREL           0x00000010
1098 #define SYMFLAG_FRAMEREL         0x00000020
1099 #define SYMFLAG_PARAMETER        0x00000040
1100 #define SYMFLAG_LOCAL            0x00000080
1101 #define SYMFLAG_CONSTANT         0x00000100
1102 #define SYMFLAG_EXPORT           0x00000200
1103 #define SYMFLAG_FORWARDER        0x00000400
1104 #define SYMFLAG_FUNCTION         0x00000800
1105 #define SYMFLAG_VIRTUAL          0x00001000
1106 #define SYMFLAG_THUNK            0x00002000
1107 #define SYMFLAG_TLSREL           0x00004000
1108 #define SYMFLAG_SLOT             0x00008000
1109 
1110 #define MAX_SYM_NAME    2000
1111 
1112 typedef struct _SYMBOL_INFO
1113 {
1114     ULONG       SizeOfStruct;
1115     ULONG       TypeIndex;
1116     ULONG64     Reserved[2];
1117     ULONG       Index;
1118     ULONG       Size;
1119     ULONG64     ModBase;
1120     ULONG       Flags;
1121     ULONG64     Value;
1122     ULONG64     Address;
1123     ULONG       Register;
1124     ULONG       Scope;
1125     ULONG       Tag;
1126     ULONG       NameLen;
1127     ULONG       MaxNameLen;
1128     CHAR        Name[1];
1129 } SYMBOL_INFO, *PSYMBOL_INFO;
1130 
1131 typedef struct _SYMBOL_INFOW
1132 {
1133     ULONG       SizeOfStruct;
1134     ULONG       TypeIndex;
1135     ULONG64     Reserved[2];
1136     ULONG       Index;
1137     ULONG       Size;
1138     ULONG64     ModBase;
1139     ULONG       Flags;
1140     ULONG64     Value;
1141     ULONG64     Address;
1142     ULONG       Register;
1143     ULONG       Scope;
1144     ULONG       Tag;
1145     ULONG       NameLen;
1146     ULONG       MaxNameLen;
1147     WCHAR       Name[1];
1148 } SYMBOL_INFOW, *PSYMBOL_INFOW;
1149 
1150 typedef struct _SYMBOL_INFO_PACKAGE
1151 {
1152     SYMBOL_INFO si;
1153     CHAR        name[MAX_SYM_NAME+1];
1154 } SYMBOL_INFO_PACKAGE, *PSYMBOL_INFO_PACKAGE;
1155 
1156 typedef struct _SYMBOL_INFO_PACKAGEW
1157 {
1158     SYMBOL_INFOW si;
1159     WCHAR        name[MAX_SYM_NAME+1];
1160 } SYMBOL_INFO_PACKAGEW, *PSYMBOL_INFO_PACKAGEW;
1161 
1162 typedef enum _IMAGEHLP_SYMBOL_TYPE_INFO
1163 {
1164     TI_GET_SYMTAG,
1165     TI_GET_SYMNAME,
1166     TI_GET_LENGTH,
1167     TI_GET_TYPE,
1168     TI_GET_TYPEID,
1169     TI_GET_BASETYPE,
1170     TI_GET_ARRAYINDEXTYPEID,
1171     TI_FINDCHILDREN,
1172     TI_GET_DATAKIND,
1173     TI_GET_ADDRESSOFFSET,
1174     TI_GET_OFFSET,
1175     TI_GET_VALUE,
1176     TI_GET_COUNT,
1177     TI_GET_CHILDRENCOUNT,
1178     TI_GET_BITPOSITION,
1179     TI_GET_VIRTUALBASECLASS,
1180     TI_GET_VIRTUALTABLESHAPEID,
1181     TI_GET_VIRTUALBASEPOINTEROFFSET,
1182     TI_GET_CLASSPARENTID,
1183     TI_GET_NESTED,
1184     TI_GET_SYMINDEX,
1185     TI_GET_LEXICALPARENT,
1186     TI_GET_ADDRESS,
1187     TI_GET_THISADJUST,
1188     TI_GET_UDTKIND,
1189     TI_IS_EQUIV_TO,
1190     TI_GET_CALLING_CONVENTION,
1191 } IMAGEHLP_SYMBOL_TYPE_INFO;
1192 
1193 #define IMAGEHLP_GET_TYPE_INFO_UNCACHED            0x00000001
1194 #define IMAGEHLP_GET_TYPE_INFO_CHILDREN            0x00000002
1195 typedef struct _IMAGEHLP_GET_TYPE_INFO_PARAMS
1196 {
1197     ULONG       SizeOfStruct;
1198     ULONG       Flags;
1199     ULONG       NumIds;
1200     PULONG      TypeIds;
1201     ULONG64     TagFilter;
1202     ULONG       NumReqs;
1203     IMAGEHLP_SYMBOL_TYPE_INFO* ReqKinds;
1204     PULONG_PTR  ReqOffsets;
1205     PULONG      ReqSizes;
1206     ULONG_PTR   ReqStride;
1207     ULONG_PTR   BufferSize;
1208     PVOID       Buffer;
1209     ULONG       EntriesMatched;
1210     ULONG       EntriesFilled;
1211     ULONG64     TagsFound;
1212     ULONG64     AllReqsValid;
1213     ULONG       NumReqsValid;
1214     PULONG64    ReqsValid;
1215 } IMAGEHLP_GET_TYPE_INFO_PARAMS, *PIMAGEHLP_GET_TYPE_INFO_PARAMS;
1216 
1217 typedef struct _TI_FINDCHILDREN_PARAMS
1218 {
1219     ULONG Count;
1220     ULONG Start;
1221     ULONG ChildId[1];
1222 } TI_FINDCHILDREN_PARAMS;
1223 
1224 #define UNDNAME_COMPLETE                 (0x0000)
1225 #define UNDNAME_NO_LEADING_UNDERSCORES   (0x0001)
1226 #define UNDNAME_NO_MS_KEYWORDS           (0x0002)
1227 #define UNDNAME_NO_FUNCTION_RETURNS      (0x0004)
1228 #define UNDNAME_NO_ALLOCATION_MODEL      (0x0008)
1229 #define UNDNAME_NO_ALLOCATION_LANGUAGE   (0x0010)
1230 #define UNDNAME_NO_MS_THISTYPE           (0x0020)
1231 #define UNDNAME_NO_CV_THISTYPE           (0x0040)
1232 #define UNDNAME_NO_THISTYPE              (0x0060)
1233 #define UNDNAME_NO_ACCESS_SPECIFIERS     (0x0080)
1234 #define UNDNAME_NO_THROW_SIGNATURES      (0x0100)
1235 #define UNDNAME_NO_MEMBER_TYPE           (0x0200)
1236 #define UNDNAME_NO_RETURN_UDT_MODEL      (0x0400)
1237 #define UNDNAME_32_BIT_DECODE            (0x0800)
1238 #define UNDNAME_NAME_ONLY                (0x1000)
1239 #define UNDNAME_NO_ARGUMENTS             (0x2000)
1240 #define UNDNAME_NO_SPECIAL_SYMS          (0x4000)
1241 
1242 #define SYMSEARCH_MASKOBJS              0x01
1243 #define SYMSEARCH_RECURSE               0x02
1244 #define SYMSEARCH_GLOBALSONLY           0x04
1245 
1246 BOOL
1247 WINAPI
1248 SymGetTypeInfo(
1249   _In_ HANDLE,
1250   _In_ DWORD64,
1251   _In_ ULONG,
1252   _In_ IMAGEHLP_SYMBOL_TYPE_INFO,
1253   _Out_ PVOID);
1254 
1255 BOOL
1256 WINAPI
1257 SymGetTypeInfoEx(
1258   _In_ HANDLE,
1259   _In_ DWORD64,
1260   _Inout_ PIMAGEHLP_GET_TYPE_INFO_PARAMS);
1261 
1262 typedef BOOL
1263 (CALLBACK *PSYM_ENUMERATESYMBOLS_CALLBACK)(
1264   _In_ PSYMBOL_INFO,
1265   _In_ ULONG,
1266   _In_opt_ PVOID);
1267 
1268 typedef BOOL
1269 (CALLBACK *PSYM_ENUMERATESYMBOLS_CALLBACKW)(
1270   _In_ PSYMBOL_INFOW,
1271   _In_ ULONG,
1272   _In_opt_ PVOID);
1273 
1274 BOOL
1275 WINAPI
1276 SymEnumTypes(
1277   _In_ HANDLE,
1278   _In_ ULONG64,
1279   _In_ PSYM_ENUMERATESYMBOLS_CALLBACK,
1280   _In_opt_ PVOID);
1281 
1282 BOOL
1283 WINAPI
1284 SymEnumTypesW(
1285   _In_ HANDLE,
1286   _In_ ULONG64,
1287   _In_ PSYM_ENUMERATESYMBOLS_CALLBACKW,
1288   _In_opt_ PVOID);
1289 
1290 BOOL
1291 WINAPI
1292 SymFromAddr(
1293   _In_ HANDLE,
1294   _In_ DWORD64,
1295   _Out_opt_ DWORD64*,
1296   _Inout_ SYMBOL_INFO*);
1297 
1298 BOOL
1299 WINAPI
1300 SymFromAddrW(
1301   _In_ HANDLE,
1302   _In_ DWORD64,
1303   _Out_opt_ DWORD64*,
1304   _Inout_ SYMBOL_INFOW*);
1305 
1306 BOOL
1307 WINAPI
1308 SymFromToken(
1309   _In_ HANDLE,
1310   _In_ DWORD64,
1311   _In_ DWORD,
1312   _Inout_ PSYMBOL_INFO);
1313 
1314 BOOL
1315 WINAPI
1316 SymFromTokenW(
1317   _In_ HANDLE,
1318   _In_ DWORD64,
1319   _In_ DWORD,
1320   _Inout_ PSYMBOL_INFOW);
1321 
1322 BOOL WINAPI SymFromName(_In_ HANDLE, _In_ PCSTR, _Inout_ PSYMBOL_INFO);
1323 BOOL WINAPI SymFromNameW(_In_ HANDLE, _In_ PCWSTR, _Inout_ PSYMBOL_INFOW);
1324 
1325 BOOL
1326 WINAPI
1327 SymGetSymFromAddr64(
1328   _In_ HANDLE,
1329   _In_ DWORD64,
1330   _Out_opt_ PDWORD64,
1331   _Inout_ PIMAGEHLP_SYMBOL64);
1332 
1333 BOOL
1334 WINAPI
1335 SymGetSymFromName64(
1336   _In_ HANDLE,
1337   _In_ PCSTR,
1338   _Inout_ PIMAGEHLP_SYMBOL64);
1339 
1340 BOOL
1341 WINAPI
1342 SymGetTypeFromName(
1343   _In_ HANDLE,
1344   _In_ ULONG64,
1345   _In_ PCSTR,
1346   _Inout_ PSYMBOL_INFO);
1347 
1348 BOOL
1349 WINAPI
1350 SymGetTypeFromNameW(
1351   _In_ HANDLE,
1352   _In_ ULONG64,
1353   _In_ PCWSTR,
1354   _Inout_ PSYMBOL_INFOW);
1355 
1356 BOOL WINAPI SymGetSymNext64(_In_ HANDLE, _Inout_ PIMAGEHLP_SYMBOL64);
1357 BOOL WINAPI SymGetSymNextW64(_In_ HANDLE, _Inout_ PIMAGEHLP_SYMBOLW64);
1358 BOOL WINAPI SymGetSymPrev64(_In_ HANDLE, _Inout_ PIMAGEHLP_SYMBOL64);
1359 BOOL WINAPI SymGetSymPrevW64(_In_ HANDLE, _Inout_ PIMAGEHLP_SYMBOLW64);
1360 
1361 BOOL
1362 WINAPI
1363 SymEnumSym(
1364   _In_ HANDLE,
1365   _In_ ULONG64,
1366   _In_ PSYM_ENUMERATESYMBOLS_CALLBACK,
1367   _In_opt_ PVOID);
1368 
1369 BOOL
1370 WINAPI
1371 SymEnumSymbols(
1372   _In_ HANDLE,
1373   _In_ ULONG64,
1374   _In_opt_ PCSTR,
1375   _In_ PSYM_ENUMERATESYMBOLS_CALLBACK,
1376   _In_opt_ PVOID);
1377 
1378 BOOL
1379 WINAPI
1380 SymEnumSymbolsW(
1381   _In_ HANDLE,
1382   _In_ ULONG64,
1383   _In_opt_ PCWSTR,
1384   _In_ PSYM_ENUMERATESYMBOLS_CALLBACKW,
1385   _In_opt_ PVOID);
1386 
1387 typedef BOOL
1388 (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK64)(
1389   _In_ PCSTR,
1390   _In_ DWORD64,
1391   _In_ ULONG,
1392   _In_opt_ PVOID);
1393 
1394 typedef BOOL
1395 (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK64W)(
1396   _In_ PCWSTR,
1397   _In_ DWORD64,
1398   _In_ ULONG,
1399   _In_opt_ PVOID);
1400 
1401 BOOL
1402 WINAPI
1403 SymEnumerateSymbols64(
1404   _In_ HANDLE,
1405   _In_ ULONG64,
1406   _In_ PSYM_ENUMSYMBOLS_CALLBACK64,
1407   _In_opt_ PVOID);
1408 
1409 BOOL
1410 WINAPI
1411 SymEnumerateSymbolsW64(
1412   _In_ HANDLE,
1413   _In_ ULONG64,
1414   _In_ PSYM_ENUMSYMBOLS_CALLBACK64W,
1415   _In_opt_ PVOID);
1416 
1417 BOOL
1418 WINAPI
1419 SymEnumSymbolsForAddr(
1420   _In_ HANDLE,
1421   _In_ DWORD64,
1422   _In_ PSYM_ENUMERATESYMBOLS_CALLBACK,
1423   _In_opt_ PVOID);
1424 
1425 BOOL
1426 WINAPI
1427 SymEnumSymbolsForAddrW(
1428   _In_ HANDLE,
1429   _In_ DWORD64,
1430   _In_ PSYM_ENUMERATESYMBOLS_CALLBACKW,
1431   _In_opt_ PVOID);
1432 
1433 typedef BOOL
1434 (CALLBACK *PSYMBOL_REGISTERED_CALLBACK64)(
1435   _In_ HANDLE,
1436   _In_ ULONG,
1437   _In_opt_ ULONG64,
1438   _In_opt_ ULONG64);
1439 
1440 BOOL
1441 WINAPI
1442 SymRegisterCallback64(
1443   _In_ HANDLE,
1444   _In_ PSYMBOL_REGISTERED_CALLBACK64,
1445   _In_ ULONG64);
1446 
1447 BOOL
1448 WINAPI
1449 SymRegisterCallbackW64(
1450   _In_ HANDLE,
1451   _In_ PSYMBOL_REGISTERED_CALLBACK64,
1452   _In_ ULONG64);
1453 
1454 BOOL
1455 WINAPI
1456 SymUnDName64(
1457   _In_ PIMAGEHLP_SYMBOL64,
1458   _Out_writes_(UnDecNameLength) PSTR,
1459   _In_ DWORD UnDecNameLength);
1460 
1461 BOOL WINAPI SymMatchString(_In_ PCSTR, _In_ PCSTR, _In_ BOOL);
1462 BOOL WINAPI SymMatchStringA(_In_ PCSTR, _In_ PCSTR, _In_ BOOL);
1463 BOOL WINAPI SymMatchStringW(_In_ PCWSTR, _In_ PCWSTR, _In_ BOOL);
1464 
1465 BOOL
1466 WINAPI
1467 SymSearch(
1468   _In_ HANDLE,
1469   _In_ ULONG64,
1470   _In_opt_ DWORD,
1471   _In_opt_ DWORD,
1472   _In_opt_ PCSTR,
1473   _In_opt_ DWORD64,
1474   _In_ PSYM_ENUMERATESYMBOLS_CALLBACK,
1475   _In_opt_ PVOID,
1476   _In_ DWORD);
1477 
1478 BOOL
1479 WINAPI
1480 SymSearchW(
1481   _In_ HANDLE,
1482   _In_ ULONG64,
1483   _In_opt_ DWORD,
1484   _In_opt_ DWORD,
1485   _In_opt_ PCWSTR,
1486   _In_opt_ DWORD64,
1487   _In_ PSYM_ENUMERATESYMBOLS_CALLBACKW,
1488   _In_opt_ PVOID,
1489   _In_ DWORD);
1490 
1491 DWORD
1492 WINAPI
1493 UnDecorateSymbolName(
1494   _In_ PCSTR,
1495   _Out_writes_(maxStringLength) PSTR,
1496   _In_ DWORD maxStringLength,
1497   _In_ DWORD);
1498 
1499 DWORD
1500 WINAPI
1501 UnDecorateSymbolNameW(
1502   _In_ PCWSTR,
1503   _Out_writes_(maxStringLength) PWSTR,
1504   _In_ DWORD maxStringLength,
1505   _In_ DWORD);
1506 
1507 BOOL
1508 WINAPI
1509 SymGetScope(
1510   _In_ HANDLE,
1511   _In_ ULONG64,
1512   _In_ DWORD,
1513   _Inout_ PSYMBOL_INFO);
1514 
1515 BOOL
1516 WINAPI
1517 SymGetScopeW(
1518   _In_ HANDLE,
1519   _In_ ULONG64,
1520   _In_ DWORD,
1521   _Inout_ PSYMBOL_INFOW);
1522 
1523 BOOL
1524 WINAPI
1525 SymFromIndex(
1526   _In_ HANDLE,
1527   _In_ ULONG64,
1528   _In_ DWORD,
1529   _Inout_ PSYMBOL_INFO);
1530 
1531 BOOL
1532 WINAPI
1533 SymFromIndexW(
1534   _In_ HANDLE,
1535   _In_ ULONG64,
1536   _In_ DWORD,
1537   _Inout_ PSYMBOL_INFOW);
1538 
1539 BOOL
1540 WINAPI
1541 SymAddSymbol(
1542   _In_ HANDLE,
1543   _In_ ULONG64,
1544   _In_ PCSTR,
1545   _In_ DWORD64,
1546   _In_ DWORD,
1547   _In_ DWORD);
1548 
1549 BOOL
1550 WINAPI
1551 SymAddSymbolW(
1552   _In_ HANDLE,
1553   _In_ ULONG64,
1554   _In_ PCWSTR,
1555   _In_ DWORD64,
1556   _In_ DWORD,
1557   _In_ DWORD);
1558 
1559 BOOL
1560 WINAPI
1561 SymDeleteSymbol(
1562   _In_ HANDLE,
1563   _In_ ULONG64,
1564   _In_opt_ PCSTR,
1565   _In_ DWORD64,
1566   _In_ DWORD);
1567 
1568 BOOL
1569 WINAPI
1570 SymDeleteSymbolW(
1571   _In_ HANDLE,
1572   _In_ ULONG64,
1573   _In_opt_ PCWSTR,
1574   _In_ DWORD64,
1575   _In_ DWORD);
1576 
1577 /*************************
1578  *      Source Files     *
1579  *************************/
1580 
1581 typedef BOOL
1582 (CALLBACK *PSYM_ENUMSOURCEFILES_CALLBACK)(
1583   _In_ PSOURCEFILE,
1584   _In_opt_ PVOID);
1585 
1586 typedef BOOL
1587 (CALLBACK *PSYM_ENUMSOURCEFILES_CALLBACKW)(
1588   _In_ PSOURCEFILEW,
1589   _In_opt_ PVOID);
1590 
1591 BOOL
1592 WINAPI
1593 SymEnumSourceFiles(
1594   _In_ HANDLE,
1595   _In_ ULONG64,
1596   _In_opt_ PCSTR,
1597   _In_ PSYM_ENUMSOURCEFILES_CALLBACK,
1598   _In_opt_ PVOID);
1599 
1600 BOOL
1601 WINAPI
1602 SymEnumSourceFilesW(
1603   _In_ HANDLE,
1604   _In_ ULONG64,
1605   _In_opt_ PCWSTR,
1606   _In_ PSYM_ENUMSOURCEFILES_CALLBACKW,
1607   _In_opt_ PVOID);
1608 
1609 BOOL
1610 WINAPI
1611 SymGetLineFromAddr64(
1612   _In_ HANDLE,
1613   _In_ DWORD64,
1614   _Out_ PDWORD,
1615   _Out_ PIMAGEHLP_LINE64);
1616 
1617 BOOL
1618 WINAPI
1619 SymGetLineFromAddrW64(
1620   _In_ HANDLE,
1621   _In_ DWORD64,
1622   _Out_ PDWORD,
1623   _Out_ PIMAGEHLP_LINEW64);
1624 
1625 BOOL WINAPI SymGetLinePrev64(_In_ HANDLE, _Inout_ PIMAGEHLP_LINE64);
1626 BOOL WINAPI SymGetLinePrevW64(_In_ HANDLE, _Inout_ PIMAGEHLP_LINEW64);
1627 BOOL WINAPI SymGetLineNext64(_In_ HANDLE, _Inout_ PIMAGEHLP_LINE64);
1628 BOOL WINAPI SymGetLineNextW64(_In_ HANDLE, _Inout_ PIMAGEHLP_LINEW64);
1629 
1630 BOOL
1631 WINAPI
1632 SymGetLineFromName64(
1633   _In_ HANDLE,
1634   _In_opt_ PCSTR,
1635   _In_opt_ PCSTR,
1636   _In_ DWORD,
1637   _Out_ PLONG,
1638   _Inout_ PIMAGEHLP_LINE64);
1639 
1640 BOOL
1641 WINAPI
1642 SymGetLineFromNameW64(
1643   _In_ HANDLE,
1644   _In_opt_ PCWSTR,
1645   _In_opt_ PCWSTR,
1646   _In_ DWORD,
1647   _Out_ PLONG,
1648   _Inout_ PIMAGEHLP_LINEW64);
1649 
1650 ULONG
1651 WINAPI
1652 SymGetFileLineOffsets64(
1653   _In_ HANDLE,
1654   _In_opt_ PCSTR,
1655   _In_ PCSTR,
1656   _Out_writes_(BufferLines) PDWORD64,
1657   _In_ ULONG BufferLines);
1658 
1659 BOOL
1660 WINAPI
1661 SymGetSourceFile(
1662   _In_ HANDLE,
1663   _In_ ULONG64,
1664   _In_opt_ PCSTR,
1665   _In_ PCSTR,
1666   _Out_writes_(Size) PSTR,
1667   _In_ DWORD Size);
1668 
1669 BOOL
1670 WINAPI
1671 SymGetSourceFileW(
1672   _In_ HANDLE,
1673   _In_ ULONG64,
1674   _In_opt_ PCWSTR,
1675   _In_ PCWSTR,
1676   _Out_writes_(Size) PWSTR,
1677   _In_ DWORD Size);
1678 
1679 BOOL
1680 WINAPI
1681 SymGetSourceFileToken(
1682   _In_ HANDLE,
1683   _In_ ULONG64,
1684   _In_ PCSTR,
1685   _Outptr_ PVOID*,
1686   _Out_ DWORD*);
1687 
1688 BOOL
1689 WINAPI
1690 SymGetSourceFileTokenW(
1691   _In_ HANDLE,
1692   _In_ ULONG64,
1693   _In_ PCWSTR,
1694   _Outptr_ PVOID*,
1695   _Out_ DWORD*);
1696 
1697 BOOL
1698 WINAPI
1699 SymGetSourceFileFromToken(
1700   _In_ HANDLE,
1701   _In_ PVOID,
1702   _In_opt_ PCSTR,
1703   _Out_writes_(Size) PSTR,
1704   _In_ DWORD Size);
1705 
1706 BOOL
1707 WINAPI
1708 SymGetSourceFileFromTokenW(
1709   _In_ HANDLE,
1710   _In_ PVOID,
1711   _In_opt_ PCWSTR,
1712   _Out_writes_(Size) PWSTR,
1713   _In_ DWORD Size);
1714 
1715 BOOL
1716 WINAPI
1717 SymGetSourceVarFromToken(
1718   _In_ HANDLE,
1719   _In_ PVOID,
1720   _In_opt_ PCSTR,
1721   _In_ PCSTR,
1722   _Out_writes_(Size) PSTR,
1723   _In_ DWORD Size);
1724 
1725 BOOL
1726 WINAPI
1727 SymGetSourceVarFromTokenW(
1728   _In_ HANDLE,
1729   _In_ PVOID,
1730   _In_opt_ PCWSTR,
1731   _In_ PCWSTR,
1732   _Out_writes_(Size) PWSTR,
1733   _In_ DWORD Size);
1734 
1735 typedef struct _SRCCODEINFO
1736 {
1737     DWORD       SizeOfStruct;
1738     PVOID       Key;
1739     DWORD64     ModBase;
1740     CHAR        Obj[MAX_PATH+1];
1741     CHAR        FileName[MAX_PATH+1];
1742     DWORD       LineNumber;
1743     DWORD64     Address;
1744 } SRCCODEINFO, *PSRCCODEINFO;
1745 
1746 typedef struct _SRCCODEINFOW
1747 {
1748     DWORD       SizeOfStruct;
1749     PVOID       Key;
1750     DWORD64     ModBase;
1751     WCHAR       Obj[MAX_PATH+1];
1752     WCHAR       FileName[MAX_PATH+1];
1753     DWORD       LineNumber;
1754     DWORD64     Address;
1755 } SRCCODEINFOW, *PSRCCODEINFOW;
1756 
1757 typedef BOOL
1758 (CALLBACK* PSYM_ENUMLINES_CALLBACK)(
1759   _In_ PSRCCODEINFO,
1760   _In_opt_ PVOID);
1761 
1762 typedef BOOL
1763 (CALLBACK* PSYM_ENUMLINES_CALLBACKW)(
1764   _In_ PSRCCODEINFOW,
1765   _In_opt_ PVOID);
1766 
1767 BOOL
1768 WINAPI
1769 SymEnumLines(
1770   _In_ HANDLE,
1771   _In_ ULONG64,
1772   _In_opt_ PCSTR,
1773   _In_opt_ PCSTR,
1774   _In_ PSYM_ENUMLINES_CALLBACK,
1775   _In_opt_ PVOID);
1776 
1777 BOOL
1778 WINAPI
1779 SymEnumLinesW(
1780   _In_ HANDLE,
1781   _In_ ULONG64,
1782   _In_opt_ PCWSTR,
1783   _In_opt_ PCWSTR,
1784   _In_ PSYM_ENUMLINES_CALLBACKW,
1785   _In_opt_ PVOID);
1786 
1787 BOOL
1788 WINAPI
1789 SymEnumSourceLines(
1790   _In_ HANDLE,
1791   _In_ ULONG64,
1792   _In_opt_ PCSTR,
1793   _In_opt_ PCSTR,
1794   _In_opt_ DWORD,
1795   _In_ DWORD,
1796   _In_ PSYM_ENUMLINES_CALLBACK,
1797   _In_opt_ PVOID);
1798 
1799 BOOL
1800 WINAPI
1801 SymEnumSourceLinesW(
1802   _In_ HANDLE,
1803   _In_ ULONG64,
1804   _In_opt_ PCWSTR,
1805   _In_opt_ PCWSTR,
1806   _In_opt_ DWORD,
1807   _In_ DWORD,
1808   _In_ PSYM_ENUMLINES_CALLBACKW,
1809   _In_opt_ PVOID);
1810 
1811 /*************************
1812  * File & image handling *
1813  *************************/
1814 
1815 BOOL WINAPI SymInitialize(_In_ HANDLE, _In_opt_ PCSTR, _In_ BOOL);
1816 BOOL WINAPI SymInitializeW(_In_ HANDLE, _In_opt_ PCWSTR, _In_ BOOL);
1817 BOOL WINAPI SymCleanup(_In_ HANDLE);
1818 
1819 HANDLE
1820 WINAPI
1821 FindDebugInfoFile(
1822   _In_ PCSTR,
1823   _In_ PCSTR,
1824   _Out_writes_(MAX_PATH + 1) PSTR);
1825 
1826 typedef BOOL
1827 (CALLBACK *PFIND_DEBUG_FILE_CALLBACK)(
1828   _In_ HANDLE,
1829   _In_ PCSTR,
1830   _In_ PVOID);
1831 
1832 typedef BOOL
1833 (CALLBACK *PFIND_DEBUG_FILE_CALLBACKW)(
1834   _In_ HANDLE,
1835   _In_ PCWSTR,
1836   _In_ PVOID);
1837 
1838 HANDLE
1839 WINAPI
1840 FindDebugInfoFileEx(
1841   _In_ PCSTR,
1842   _In_ PCSTR,
1843   _Out_writes_(MAX_PATH + 1) PSTR,
1844   _In_opt_ PFIND_DEBUG_FILE_CALLBACK,
1845   _In_opt_ PVOID);
1846 
1847 HANDLE
1848 WINAPI
1849 FindDebugInfoFileExW(
1850   _In_ PCWSTR,
1851   _In_ PCWSTR,
1852   _Out_writes_(MAX_PATH + 1) PWSTR,
1853   _In_opt_ PFIND_DEBUG_FILE_CALLBACKW,
1854   _In_opt_ PVOID);
1855 
1856 HANDLE
1857 WINAPI
1858 SymFindDebugInfoFile(
1859   _In_ HANDLE,
1860   _In_ PCSTR,
1861   _Out_writes_(MAX_PATH + 1) PSTR,
1862   _In_opt_ PFIND_DEBUG_FILE_CALLBACK,
1863   _In_opt_ PVOID);
1864 
1865 HANDLE
1866 WINAPI
1867 SymFindDebugInfoFileW(
1868   _In_ HANDLE,
1869   _In_ PCWSTR,
1870   _Out_writes_(MAX_PATH + 1) PWSTR,
1871   _In_opt_ PFIND_DEBUG_FILE_CALLBACKW,
1872   _In_opt_ PVOID);
1873 
1874 typedef BOOL
1875 (CALLBACK *PFINDFILEINPATHCALLBACK)(
1876   _In_ PCSTR,
1877   _In_ PVOID);
1878 
1879 typedef BOOL
1880 (CALLBACK *PFINDFILEINPATHCALLBACKW)(
1881   _In_ PCWSTR,
1882   _In_ PVOID);
1883 
1884 BOOL WINAPI FindFileInPath(HANDLE, PCSTR, PCSTR, PVOID, DWORD, DWORD, DWORD,
1885                            PSTR, PFINDFILEINPATHCALLBACK, PVOID);
1886 
1887 BOOL
1888 WINAPI
1889 SymFindFileInPath(
1890   _In_ HANDLE,
1891   _In_opt_ PCSTR,
1892   _In_ PCSTR,
1893   _In_opt_ PVOID,
1894   _In_ DWORD,
1895   _In_ DWORD,
1896   _In_ DWORD,
1897   _Out_writes_(MAX_PATH + 1) PSTR,
1898   _In_opt_ PFINDFILEINPATHCALLBACK,
1899   _In_opt_ PVOID);
1900 
1901 BOOL
1902 WINAPI
1903 SymFindFileInPathW(
1904   _In_ HANDLE,
1905   _In_opt_ PCWSTR,
1906   _In_ PCWSTR,
1907   _In_opt_ PVOID,
1908   _In_ DWORD,
1909   _In_ DWORD,
1910   _In_ DWORD,
1911   _Out_writes_(MAX_PATH + 1) PWSTR,
1912   _In_opt_ PFINDFILEINPATHCALLBACKW,
1913   _In_opt_ PVOID);
1914 
1915 HANDLE
1916 WINAPI
1917 FindExecutableImage(
1918   _In_ PCSTR,
1919   _In_ PCSTR,
1920   _Out_writes_(MAX_PATH + 1) PSTR);
1921 
1922 typedef BOOL
1923 (CALLBACK *PFIND_EXE_FILE_CALLBACK)(
1924   _In_ HANDLE,
1925   _In_ PCSTR,
1926   _In_opt_ PVOID);
1927 
1928 typedef BOOL
1929 (CALLBACK *PFIND_EXE_FILE_CALLBACKW)(
1930   _In_ HANDLE,
1931   _In_ PCWSTR,
1932   _In_opt_ PVOID);
1933 
1934 HANDLE
1935 WINAPI
1936 FindExecutableImageEx(
1937   _In_ PCSTR,
1938   _In_ PCSTR,
1939   _Out_writes_(MAX_PATH + 1) PSTR,
1940   _In_opt_ PFIND_EXE_FILE_CALLBACK,
1941   _In_opt_ PVOID);
1942 
1943 HANDLE
1944 WINAPI
1945 FindExecutableImageExW(
1946   _In_ PCWSTR,
1947   _In_ PCWSTR,
1948   _Out_writes_(MAX_PATH + 1) PWSTR,
1949   _In_opt_ PFIND_EXE_FILE_CALLBACKW,
1950   _In_opt_ PVOID);
1951 
1952 HANDLE
1953 WINAPI
1954 SymFindExecutableImage(
1955   _In_ HANDLE,
1956   _In_ PCSTR,
1957   _Out_writes_(MAX_PATH + 1) PSTR,
1958   _In_ PFIND_EXE_FILE_CALLBACK,
1959   _In_ PVOID);
1960 
1961 HANDLE
1962 WINAPI
1963 SymFindExecutableImageW(
1964   _In_ HANDLE,
1965   _In_ PCWSTR,
1966   _Out_writes_(MAX_PATH + 1) PWSTR,
1967   _In_ PFIND_EXE_FILE_CALLBACKW,
1968   _In_ PVOID);
1969 
1970 PIMAGE_NT_HEADERS WINAPI ImageNtHeader(_In_ PVOID);
1971 
1972 PVOID
1973 WINAPI
1974 ImageDirectoryEntryToDataEx(
1975   _In_ PVOID,
1976   _In_ BOOLEAN,
1977   _In_ USHORT,
1978   _Out_ PULONG,
1979   _Out_opt_ PIMAGE_SECTION_HEADER *);
1980 
1981 PVOID
1982 WINAPI
1983 ImageDirectoryEntryToData(
1984   _In_ PVOID,
1985   _In_ BOOLEAN,
1986   _In_ USHORT,
1987   _Out_ PULONG);
1988 
1989 PIMAGE_SECTION_HEADER
1990 WINAPI
1991 ImageRvaToSection(
1992   _In_ PIMAGE_NT_HEADERS,
1993   _In_ PVOID,
1994   _In_ ULONG);
1995 
1996 PVOID
1997 WINAPI
1998 ImageRvaToVa(
1999   _In_ PIMAGE_NT_HEADERS,
2000   _In_ PVOID,
2001   _In_ ULONG,
2002   _In_opt_ PIMAGE_SECTION_HEADER*);
2003 
2004 BOOL
2005 WINAPI
2006 SymGetSearchPath(
2007   _In_ HANDLE,
2008   _Out_writes_(SearchPathLength) PSTR,
2009   _In_ DWORD SearchPathLength);
2010 
2011 BOOL
2012 WINAPI
2013 SymGetSearchPathW(
2014   _In_ HANDLE,
2015   _Out_writes_(SearchPathLength) PWSTR,
2016   _In_ DWORD SearchPathLength);
2017 
2018 BOOL WINAPI SymSetSearchPath(_In_ HANDLE, _In_opt_ PCSTR);
2019 BOOL WINAPI SymSetSearchPathW(_In_ HANDLE, _In_opt_ PCWSTR);
2020 DWORD WINAPI GetTimestampForLoadedLibrary(_In_ HMODULE);
2021 BOOL WINAPI MakeSureDirectoryPathExists(_In_ PCSTR);
2022 
2023 BOOL
2024 WINAPI
2025 SearchTreeForFile(
2026   _In_ PCSTR,
2027   _In_ PCSTR,
2028   _Out_writes_(MAX_PATH + 1) PSTR);
2029 
2030 BOOL
2031 WINAPI
2032 SearchTreeForFileW(
2033   _In_ PCWSTR,
2034   _In_ PCWSTR,
2035   _Out_writes_(MAX_PATH + 1) PWSTR);
2036 
2037 typedef BOOL
2038 (CALLBACK *PENUMDIRTREE_CALLBACK)(
2039   _In_ PCSTR,
2040   _In_opt_ PVOID);
2041 
2042 typedef BOOL
2043 (CALLBACK *PENUMDIRTREE_CALLBACKW)(
2044   _In_ PCWSTR,
2045   _In_opt_ PVOID);
2046 
2047 BOOL
2048 WINAPI
2049 EnumDirTree(
2050   _In_opt_ HANDLE,
2051   _In_ PCSTR,
2052   _In_ PCSTR,
2053   _Out_writes_opt_(MAX_PATH + 1) PSTR,
2054   _In_opt_ PENUMDIRTREE_CALLBACK,
2055   _In_opt_ PVOID);
2056 
2057 BOOL
2058 WINAPI
2059 EnumDirTreeW(
2060   _In_opt_ HANDLE,
2061   _In_ PCWSTR,
2062   _In_ PCWSTR,
2063   _Out_writes_opt_(MAX_PATH + 1) PWSTR,
2064   _In_opt_ PENUMDIRTREE_CALLBACKW,
2065   _In_opt_ PVOID);
2066 
2067 BOOL
2068 WINAPI
2069 SymMatchFileName(
2070   _In_ PCSTR,
2071   _In_ PCSTR,
2072   _Outptr_opt_ PSTR*,
2073   _Outptr_opt_ PSTR*);
2074 
2075 BOOL
2076 WINAPI
2077 SymMatchFileNameW(
2078   _In_ PCWSTR,
2079   _In_ PCWSTR,
2080   _Outptr_opt_ PWSTR*,
2081   _Outptr_opt_ PWSTR*);
2082 
2083 PCHAR WINAPI SymSetHomeDirectory(_In_opt_ HANDLE, _In_opt_ PCSTR);
2084 PWSTR WINAPI SymSetHomeDirectoryW(_In_opt_ HANDLE, _In_opt_ PCWSTR);
2085 
2086 PCHAR
2087 WINAPI
2088 SymGetHomeDirectory(
2089   _In_ DWORD,
2090   _Out_writes_(size) PSTR,
2091   _In_ size_t size);
2092 
2093 PWSTR
2094 WINAPI
2095 SymGetHomeDirectoryW(
2096   _In_ DWORD,
2097   _Out_writes_(size) PWSTR,
2098   _In_ size_t size);
2099 
2100 #define hdBase  0
2101 #define hdSym   1
2102 #define hdSrc   2
2103 #define hdMax   3
2104 
2105 /*************************
2106  *   Context management  *
2107  *************************/
2108 
2109 BOOL
2110 WINAPI
2111 SymSetContext(
2112   _In_ HANDLE,
2113   _In_ PIMAGEHLP_STACK_FRAME,
2114   _In_opt_ PIMAGEHLP_CONTEXT);
2115 
2116 
2117 /*************************
2118  *    Stack management   *
2119  *************************/
2120 
2121 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
2122 #define KDHELP KDHELP64
2123 #define PKDHELP PKDHELP64
2124 #else
2125 typedef struct _KDHELP
2126 {
2127     DWORD       Thread;
2128     DWORD       ThCallbackStack;
2129     DWORD       NextCallback;
2130     DWORD       FramePointer;
2131     DWORD       KiCallUserMode;
2132     DWORD       KeUserCallbackDispatcher;
2133     DWORD       SystemRangeStart;
2134 } KDHELP, *PKDHELP;
2135 #endif
2136 
2137 typedef struct _KDHELP64
2138 {
2139     DWORD64     Thread;
2140     DWORD       ThCallbackStack;
2141     DWORD       ThCallbackBStore;
2142     DWORD       NextCallback;
2143     DWORD       FramePointer;
2144     DWORD64     KiCallUserMode;
2145     DWORD64     KeUserCallbackDispatcher;
2146     DWORD64     SystemRangeStart;
2147     DWORD64     Reserved[8];
2148 } KDHELP64, *PKDHELP64;
2149 
2150 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
2151 #define STACKFRAME STACKFRAME64
2152 #define LPSTACKFRAME LPSTACKFRAME64
2153 #else
2154 typedef struct _STACKFRAME
2155 {
2156     ADDRESS     AddrPC;
2157     ADDRESS     AddrReturn;
2158     ADDRESS     AddrFrame;
2159     ADDRESS     AddrStack;
2160     PVOID       FuncTableEntry;
2161     DWORD       Params[4];
2162     BOOL        Far;
2163     BOOL        Virtual;
2164     DWORD       Reserved[3];
2165     KDHELP      KdHelp;
2166     ADDRESS     AddrBStore;
2167 } STACKFRAME, *LPSTACKFRAME;
2168 #endif
2169 
2170 typedef struct _STACKFRAME64
2171 {
2172     ADDRESS64   AddrPC;
2173     ADDRESS64   AddrReturn;
2174     ADDRESS64   AddrFrame;
2175     ADDRESS64   AddrStack;
2176     ADDRESS64   AddrBStore;
2177     PVOID       FuncTableEntry;
2178     DWORD64     Params[4];
2179     BOOL        Far;
2180     BOOL        Virtual;
2181     DWORD64     Reserved[3];
2182     KDHELP64    KdHelp;
2183 } STACKFRAME64, *LPSTACKFRAME64;
2184 
2185 typedef BOOL
2186 (CALLBACK *PREAD_PROCESS_MEMORY_ROUTINE64)(
2187   _In_ HANDLE,
2188   _In_ DWORD64,
2189   _Out_writes_bytes_(nSize) PVOID,
2190   _In_ DWORD nSize,
2191   _Out_ PDWORD);
2192 
2193 typedef PVOID
2194 (CALLBACK *PFUNCTION_TABLE_ACCESS_ROUTINE64)(
2195   _In_ HANDLE,
2196   _In_ DWORD64);
2197 
2198 typedef DWORD64
2199 (CALLBACK *PGET_MODULE_BASE_ROUTINE64)(
2200   _In_ HANDLE,
2201   _In_ DWORD64);
2202 
2203 typedef DWORD64
2204 (CALLBACK *PTRANSLATE_ADDRESS_ROUTINE64)(
2205   _In_ HANDLE,
2206   _In_ HANDLE,
2207   _In_ LPADDRESS64);
2208 
2209 BOOL
2210 WINAPI
2211 StackWalk64(
2212   _In_ DWORD,
2213   _In_ HANDLE,
2214   _In_ HANDLE,
2215   _Inout_ LPSTACKFRAME64,
2216   _Inout_ PVOID,
2217   _In_opt_ PREAD_PROCESS_MEMORY_ROUTINE64,
2218   _In_opt_ PFUNCTION_TABLE_ACCESS_ROUTINE64,
2219   _In_opt_ PGET_MODULE_BASE_ROUTINE64,
2220   _In_opt_ PTRANSLATE_ADDRESS_ROUTINE64);
2221 
2222 PVOID WINAPI SymFunctionTableAccess64(_In_ HANDLE, _In_ DWORD64);
2223 
2224 typedef PVOID
2225 (CALLBACK *PSYMBOL_FUNCENTRY_CALLBACK64)(
2226   _In_ HANDLE,
2227   _In_ ULONG64,
2228   _In_ ULONG64);
2229 
2230 BOOL
2231 WINAPI
2232 SymRegisterFunctionEntryCallback64(
2233   _In_ HANDLE,
2234   _In_ PSYMBOL_FUNCENTRY_CALLBACK64,
2235   _In_ ULONG64);
2236 
2237 /*************************
2238  * Version, global stuff *
2239  *************************/
2240 
2241 #define API_VERSION_NUMBER 9
2242 
2243 typedef struct API_VERSION
2244 {
2245     USHORT  MajorVersion;
2246     USHORT  MinorVersion;
2247     USHORT  Revision;
2248     USHORT  Reserved;
2249 } API_VERSION, *LPAPI_VERSION;
2250 
2251 LPAPI_VERSION WINAPI ImagehlpApiVersion(void);
2252 LPAPI_VERSION WINAPI ImagehlpApiVersionEx(_In_ LPAPI_VERSION);
2253 
2254 typedef struct _IMAGE_DEBUG_INFORMATION
2255 {
2256     LIST_ENTRY                  List;
2257     DWORD                       ReservedSize;
2258     PVOID                       ReservedMappedBase;
2259     USHORT                      ReservedMachine;
2260     USHORT                      ReservedCharacteristics;
2261     DWORD                       ReservedCheckSum;
2262     DWORD                       ImageBase;
2263     DWORD                       SizeOfImage;
2264     DWORD                       ReservedNumberOfSections;
2265     PIMAGE_SECTION_HEADER       ReservedSections;
2266     DWORD                       ReservedExportedNamesSize;
2267     PSTR                        ReservedExportedNames;
2268     DWORD                       ReservedNumberOfFunctionTableEntries;
2269     PIMAGE_FUNCTION_ENTRY       ReservedFunctionTableEntries;
2270     DWORD                       ReservedLowestFunctionStartingAddress;
2271     DWORD                       ReservedHighestFunctionEndingAddress;
2272     DWORD                       ReservedNumberOfFpoTableEntries;
2273     PFPO_DATA                   ReservedFpoTableEntries;
2274     DWORD                       SizeOfCoffSymbols;
2275     PIMAGE_COFF_SYMBOLS_HEADER  CoffSymbols;
2276     DWORD                       ReservedSizeOfCodeViewSymbols;
2277     PVOID                       ReservedCodeViewSymbols;
2278     PSTR                        ImageFilePath;
2279     PSTR                        ImageFileName;
2280     PSTR                        ReservedDebugFilePath;
2281     DWORD                       ReservedTimeDateStamp;
2282     BOOL                        ReservedRomImage;
2283     PIMAGE_DEBUG_DIRECTORY      ReservedDebugDirectory;
2284     DWORD                       ReservedNumberOfDebugDirectories;
2285     DWORD                       ReservedOriginalFunctionTableBaseAddress;
2286     DWORD                       Reserved[ 2 ];
2287 } IMAGE_DEBUG_INFORMATION, *PIMAGE_DEBUG_INFORMATION;
2288 
2289 
2290 PIMAGE_DEBUG_INFORMATION
2291 WINAPI
2292 MapDebugInformation(
2293   _In_opt_ HANDLE,
2294   _In_ PCSTR,
2295   _In_opt_ PCSTR,
2296   _In_ ULONG);
2297 
2298 BOOL WINAPI UnmapDebugInformation(_Out_ PIMAGE_DEBUG_INFORMATION);
2299 
2300 DWORD WINAPI SymGetOptions(void);
2301 DWORD WINAPI SymSetOptions(_In_ DWORD);
2302 
2303 BOOL WINAPI SymSetParentWindow(_In_ HWND);
2304 
2305 BOOL
2306 IMAGEAPI
2307 SymSrvIsStore(
2308   _In_opt_ HANDLE hProcess,
2309   _In_ PCSTR path);
2310 
2311 BOOL
2312 IMAGEAPI
2313 SymSrvIsStoreW(
2314     _In_opt_ HANDLE hProcess,
2315     _In_ PCWSTR path);
2316 
2317 /*************************
2318  * Version, global stuff *
2319  *************************/
2320 
2321 typedef BOOL     (WINAPI* PSYMBOLSERVERPROC)(PCSTR, PCSTR, PVOID, DWORD, DWORD, PSTR);
2322 typedef BOOL     (WINAPI* PSYMBOLSERVERPROCA)(PCSTR, PCSTR, PVOID, DWORD, DWORD, PSTR);
2323 typedef BOOL     (WINAPI* PSYMBOLSERVERPROCW)(PCWSTR, PCWSTR, PVOID, DWORD, DWORD, PWSTR);
2324 typedef BOOL     (WINAPI* PSYMBOLSERVEROPENPROC)(void);
2325 typedef BOOL     (WINAPI* PSYMBOLSERVERCLOSEPROC)(void);
2326 typedef BOOL     (WINAPI* PSYMBOLSERVERSETOPTIONSPROC)(UINT_PTR, ULONG64);
2327 typedef BOOL     (CALLBACK* PSYMBOLSERVERCALLBACKPROC)(UINT_PTR, ULONG64, ULONG64);
2328 typedef UINT_PTR (WINAPI* PSYMBOLSERVERGETOPTIONSPROC)(void);
2329 typedef BOOL     (WINAPI* PSYMBOLSERVERPINGPROC)(PCSTR);
2330 typedef BOOL     (WINAPI* PSYMBOLSERVERPINGPROCA)(PCSTR);
2331 typedef BOOL     (WINAPI* PSYMBOLSERVERPINGPROCW)(PCWSTR);
2332 
2333 #define SSRVOPT_CALLBACK            0x0001
2334 #define SSRVOPT_DWORD               0x0002
2335 #define SSRVOPT_DWORDPTR            0x0004
2336 #define SSRVOPT_GUIDPTR             0x0008
2337 #define SSRVOPT_OLDGUIDPTR          0x0010
2338 #define SSRVOPT_UNATTENDED          0x0020
2339 #define SSRVOPT_NOCOPY              0x0040
2340 #define SSRVOPT_PARENTWIN           0x0080
2341 #define SSRVOPT_PARAMTYPE           0x0100
2342 #define SSRVOPT_SECURE              0x0200
2343 #define SSRVOPT_TRACE               0x0400
2344 #define SSRVOPT_SETCONTEXT          0x0800
2345 #define SSRVOPT_PROXY               0x1000
2346 #define SSRVOPT_DOWNSTREAM_STORE    0x2000
2347 #define SSRVOPT_RESET               ((ULONG_PTR)-1)
2348 
2349 #define SSRVACTION_TRACE        1
2350 #define SSRVACTION_QUERYCANCEL  2
2351 #define SSRVACTION_EVENT        3
2352 
2353 /* 32-bit functions */
2354 
2355 #if !defined(_IMAGEHLP_SOURCE_) && defined(_IMAGEHLP64)
2356 
2357 #define PENUMLOADED_MODULES_CALLBACK PENUMLOADED_MODULES_CALLBACK64
2358 #define PFUNCTION_TABLE_ACCESS_ROUTINE PFUNCTION_TABLE_ACCESS_ROUTINE64
2359 #define PGET_MODULE_BASE_ROUTINE PGET_MODULE_BASE_ROUTINE64
2360 #define PREAD_PROCESS_MEMORY_ROUTINE PREAD_PROCESS_MEMORY_ROUTINE64
2361 #define PSYMBOL_FUNCENTRY_CALLBACK PSYMBOL_FUNCENTRY_CALLBACK64
2362 #define PSYMBOL_REGISTERED_CALLBACK PSYMBOL_REGISTERED_CALLBACK64
2363 #define PSYM_ENUMMODULES_CALLBACK PSYM_ENUMMODULES_CALLBACK64
2364 #define PSYM_ENUMSYMBOLS_CALLBACK PSYM_ENUMSYMBOLS_CALLBACK64
2365 #define PSYM_ENUMSYMBOLS_CALLBACKW PSYM_ENUMSYMBOLS_CALLBACKW64
2366 #define PTRANSLATE_ADDRESS_ROUTINE PTRANSLATE_ADDRESS_ROUTINE64
2367 
2368 #define EnumerateLoadedModules EnumerateLoadedModules64
2369 #define StackWalk StackWalk64
2370 #define SymEnumerateModules SymEnumerateModules64
2371 #define SymEnumerateSymbols SymEnumerateSymbols64
2372 #define SymEnumerateSymbolsW SymEnumerateSymbolsW64
2373 #define SymFunctionTableAccess SymFunctionTableAccess64
2374 #define SymGetLineFromAddr SymGetLineFromAddr64
2375 #define SymGetLineFromAddrW SymGetLineFromAddrW64
2376 #define SymGetLineFromName SymGetLineFromName64
2377 #define SymGetLineNext SymGetLineNext64
2378 #define SymGetLineNextW SymGetLineNextW64
2379 #define SymGetLinePrev SymGetLinePrev64
2380 #define SymGetLinePrevW SymGetLinePrevW64
2381 #define SymGetModuleBase SymGetModuleBase64
2382 #define SymGetModuleInfo SymGetModuleInfo64
2383 #define SymGetModuleInfoW SymGetModuleInfoW64
2384 #define SymGetSymFromAddr SymGetSymFromAddr64
2385 #define SymGetSymFromName SymGetSymFromName64
2386 #define SymGetSymNext SymGetSymNext64
2387 #define SymGetSymNextW SymGetSymNextW64
2388 #define SymGetSymPrev SymGetSymPrev64
2389 #define SymGetSymPrevW SymGetSymPrevW64
2390 #define SymLoadModule SymLoadModule64
2391 #define SymRegisterCallback SymRegisterCallback64
2392 #define SymRegisterFunctionEntryCallback SymRegisterFunctionEntryCallback64
2393 #define SymUnDName SymUnDName64
2394 #define SymUnloadModule SymUnloadModule64
2395 
2396 #else
2397 
2398 typedef BOOL
2399 (CALLBACK *PENUMLOADED_MODULES_CALLBACK)(
2400   _In_ PCSTR,
2401   _In_ ULONG,
2402   _In_ ULONG,
2403   _In_opt_ PVOID);
2404 
2405 typedef PVOID
2406 (CALLBACK *PFUNCTION_TABLE_ACCESS_ROUTINE)(
2407   _In_ HANDLE,
2408   _In_ DWORD);
2409 
2410 typedef DWORD
2411 (CALLBACK *PGET_MODULE_BASE_ROUTINE)(
2412   _In_ HANDLE,
2413   _In_ DWORD);
2414 
2415 typedef BOOL
2416 (CALLBACK *PREAD_PROCESS_MEMORY_ROUTINE)(
2417   _In_ HANDLE,
2418   _In_ DWORD,
2419   _Out_writes_bytes_(nSize) PVOID,
2420   _In_ DWORD nSize,
2421   _Out_ PDWORD);
2422 
2423 typedef BOOL
2424 (CALLBACK *PSYM_ENUMMODULES_CALLBACK)(
2425   _In_ PCSTR,
2426   _In_ ULONG,
2427   _In_opt_ PVOID);
2428 
2429 typedef BOOL
2430 (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACK)(
2431   _In_ PCSTR,
2432   _In_ ULONG,
2433   _In_ ULONG,
2434   _In_opt_ PVOID);
2435 
2436 typedef BOOL
2437 (CALLBACK *PSYM_ENUMSYMBOLS_CALLBACKW)(
2438   _In_ PCWSTR,
2439   _In_ ULONG,
2440   _In_ ULONG,
2441   _In_opt_ PVOID);
2442 
2443 typedef BOOL
2444 (CALLBACK *PSYMBOL_REGISTERED_CALLBACK)(
2445   _In_ HANDLE,
2446   _In_ ULONG,
2447   _In_opt_ PVOID,
2448   _In_opt_ PVOID);
2449 
2450 typedef PVOID
2451 (CALLBACK *PSYMBOL_FUNCENTRY_CALLBACK)(
2452   _In_ HANDLE,
2453   _In_ DWORD,
2454   _In_opt_ PVOID);
2455 
2456 typedef DWORD
2457 (CALLBACK *PTRANSLATE_ADDRESS_ROUTINE)(
2458   _In_ HANDLE,
2459   _In_ HANDLE,
2460   _Out_ LPADDRESS);
2461 
2462 BOOL
2463 WINAPI
2464 EnumerateLoadedModules(
2465   _In_ HANDLE,
2466   _In_ PENUMLOADED_MODULES_CALLBACK,
2467   _In_opt_ PVOID);
2468 
2469 BOOL
2470 WINAPI
2471 StackWalk(
2472   _In_ DWORD,
2473   _In_ HANDLE,
2474   _In_ HANDLE,
2475   _Inout_ LPSTACKFRAME,
2476   _Inout_ PVOID,
2477   _In_opt_ PREAD_PROCESS_MEMORY_ROUTINE,
2478   _In_opt_ PFUNCTION_TABLE_ACCESS_ROUTINE,
2479   _In_opt_ PGET_MODULE_BASE_ROUTINE,
2480   _In_opt_ PTRANSLATE_ADDRESS_ROUTINE);
2481 
2482 BOOL
2483 WINAPI
2484 SymEnumerateModules(
2485   _In_ HANDLE,
2486   _In_ PSYM_ENUMMODULES_CALLBACK,
2487   _In_opt_ PVOID);
2488 
2489 BOOL
2490 WINAPI
2491 SymEnumerateSymbols(
2492   _In_ HANDLE,
2493   _In_ ULONG,
2494   _In_ PSYM_ENUMSYMBOLS_CALLBACK,
2495   _In_opt_ PVOID);
2496 
2497 BOOL
2498 WINAPI
2499 SymEnumerateSymbolsW(
2500   _In_ HANDLE,
2501   _In_ ULONG,
2502   _In_ PSYM_ENUMSYMBOLS_CALLBACKW,
2503   _In_opt_ PVOID);
2504 
2505 PVOID WINAPI SymFunctionTableAccess(_In_ HANDLE, _In_ DWORD);
2506 
2507 BOOL
2508 WINAPI
2509 SymGetLineFromAddr(
2510   _In_ HANDLE,
2511   _In_ DWORD,
2512   _Out_ PDWORD,
2513   _Out_ PIMAGEHLP_LINE);
2514 
2515 BOOL
2516 WINAPI
2517 SymGetLineFromAddrW(
2518   _In_ HANDLE,
2519   _In_ DWORD,
2520   _Out_ PDWORD,
2521   _Out_ PIMAGEHLP_LINEW);
2522 
2523 BOOL
2524 WINAPI
2525 SymGetLineFromName(
2526   _In_ HANDLE,
2527   _In_opt_ PCSTR,
2528   _In_opt_ PCSTR,
2529   _In_ DWORD,
2530   _Out_ PLONG,
2531   _Inout_ PIMAGEHLP_LINE);
2532 
2533 BOOL WINAPI SymGetLineNext(_In_ HANDLE, _Inout_ PIMAGEHLP_LINE);
2534 BOOL WINAPI SymGetLineNextW(_In_ HANDLE, _Inout_ PIMAGEHLP_LINEW);
2535 BOOL WINAPI SymGetLinePrev(_In_ HANDLE, _Inout_ PIMAGEHLP_LINE);
2536 BOOL WINAPI SymGetLinePrevW(_In_ HANDLE, _Inout_ PIMAGEHLP_LINEW);
2537 DWORD WINAPI SymGetModuleBase(_In_ HANDLE, _In_ DWORD);
2538 
2539 BOOL
2540 WINAPI
2541 SymGetModuleInfo(
2542   _In_ HANDLE,
2543   _In_ DWORD,
2544   _Out_ PIMAGEHLP_MODULE);
2545 
2546 BOOL
2547 WINAPI
2548 SymGetModuleInfoW(
2549   _In_ HANDLE,
2550   _In_ DWORD,
2551   _Out_ PIMAGEHLP_MODULEW);
2552 
2553 BOOL
2554 WINAPI
2555 SymGetSymFromAddr(
2556   _In_ HANDLE,
2557   _In_ DWORD,
2558   _Out_opt_ PDWORD,
2559   _Inout_ PIMAGEHLP_SYMBOL);
2560 
2561 BOOL
2562 WINAPI
2563 SymGetSymFromName(
2564   _In_ HANDLE,
2565   _In_ PCSTR,
2566   _Inout_ PIMAGEHLP_SYMBOL);
2567 
2568 BOOL WINAPI SymGetSymNext(_In_ HANDLE, _Inout_ PIMAGEHLP_SYMBOL);
2569 BOOL WINAPI SymGetSymNextW(_In_ HANDLE, _Inout_ PIMAGEHLP_SYMBOLW);
2570 BOOL WINAPI SymGetSymPrev(_In_ HANDLE, _Inout_ PIMAGEHLP_SYMBOL);
2571 BOOL WINAPI SymGetSymPrevW(_In_ HANDLE, _Inout_ PIMAGEHLP_SYMBOLW);
2572 
2573 DWORD
2574 WINAPI
2575 SymLoadModule(
2576   _In_ HANDLE,
2577   _In_opt_ HANDLE,
2578   _In_opt_ PCSTR,
2579   _In_opt_ PCSTR,
2580   _In_ DWORD,
2581   _In_ DWORD);
2582 
2583 BOOL
2584 WINAPI
2585 SymRegisterCallback(
2586   _In_ HANDLE,
2587   _In_ PSYMBOL_REGISTERED_CALLBACK,
2588   _In_opt_ PVOID);
2589 
2590 BOOL
2591 WINAPI
2592 SymRegisterFunctionEntryCallback(
2593   _In_ HANDLE,
2594   _In_ PSYMBOL_FUNCENTRY_CALLBACK,
2595   _In_opt_ PVOID);
2596 
2597 BOOL WINAPI SymRefreshModuleList(_In_ HANDLE);
2598 
2599 BOOL
2600 WINAPI
2601 SymUnDName(
2602   _In_ PIMAGEHLP_SYMBOL,
2603   _Out_writes_(UnDecNameLength) PSTR,
2604   _In_ DWORD UnDecNameLength);
2605 
2606 BOOL WINAPI SymUnloadModule(_In_ HANDLE, _In_ DWORD);
2607 
2608 #endif
2609 
2610 #ifdef __cplusplus
2611 } /* extern "C" */
2612 #endif /* defined(__cplusplus) */
2613 
2614 #endif  /* __WINE_DBGHELP_H */
2615