winapi_ui_automation/um/
dbghelp.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms.
6//! DbgHelp include file
7use shared::basetsd::{DWORD64, PDWORD64, ULONG64};
8use shared::guiddef::GUID;
9use shared::minwindef::{
10    BOOL, DWORD, HMODULE, LPDWORD, MAX_PATH, PDWORD, PUCHAR, PULONG, UCHAR, ULONG, USHORT, WORD,
11};
12use um::winnt::{
13    BOOLEAN, CHAR, HANDLE, LIST_ENTRY, PCSTR, PCWSTR, PIMAGE_NT_HEADERS, PIMAGE_SECTION_HEADER,
14    PSTR, PVOID, PWSTR, WCHAR,
15};
16#[cfg(target_pointer_width = "32")]
17use um::winnt::{
18    PFPO_DATA, PIMAGE_COFF_SYMBOLS_HEADER, PIMAGE_DEBUG_DIRECTORY, PIMAGE_FUNCTION_ENTRY,
19    PIMAGE_NT_HEADERS32,
20};
21#[cfg(target_pointer_width = "64")]
22use um::winnt::PIMAGE_NT_HEADERS64;
23use vc::vcruntime::size_t;
24#[cfg(target_pointer_width = "64")]
25STRUCT!{struct LOADED_IMAGE {
26    ModuleName: PSTR,
27    hFile: HANDLE,
28    MappedAddress: PUCHAR,
29    FileHeader: PIMAGE_NT_HEADERS64,
30    LastRvaSection: PIMAGE_SECTION_HEADER,
31    NumberOfSections: ULONG,
32    Sections: PIMAGE_SECTION_HEADER,
33    Characteristics: ULONG,
34    fSystemImage: BOOLEAN,
35    fDOSImage: BOOLEAN,
36    fReadOnly: BOOLEAN,
37    Version: UCHAR,
38    Links: LIST_ENTRY,
39    SizeOfImage: ULONG,
40}}
41#[cfg(target_pointer_width = "32")]
42STRUCT!{struct LOADED_IMAGE {
43    ModuleName: PSTR,
44    hFile: HANDLE,
45    MappedAddress: PUCHAR,
46    FileHeader: PIMAGE_NT_HEADERS32,
47    LastRvaSection: PIMAGE_SECTION_HEADER,
48    NumberOfSections: ULONG,
49    Sections: PIMAGE_SECTION_HEADER,
50    Characteristics: ULONG,
51    fSystemImage: BOOLEAN,
52    fDOSImage: BOOLEAN,
53    fReadOnly: BOOLEAN,
54    Version: UCHAR,
55    Links: LIST_ENTRY,
56    SizeOfImage: ULONG,
57}}
58pub const MAX_SYM_NAME: usize = 2000;
59pub const ERROR_IMAGE_NOT_STRIPPED: DWORD = 0x8800;
60pub const ERROR_NO_DBG_POINTER: DWORD = 0x8801;
61pub const ERROR_NO_PDB_POINTER: DWORD = 0x8802;
62FN!{stdcall PFIND_DEBUG_FILE_CALLBACK(
63    FileHandle: HANDLE,
64    FileName: PCSTR,
65    CallerData: PVOID,
66) -> BOOL}
67FN!{stdcall PFIND_DEBUG_FILE_CALLBACKW(
68    FileHandle: HANDLE,
69    FileName: PCWSTR,
70    CallerData: PVOID,
71) -> BOOL}
72FN!{stdcall PFINDFILEINPATHCALLBACK(
73    filename: PCSTR,
74    context: PVOID,
75) -> BOOL}
76FN!{stdcall PFINDFILEINPATHCALLBACKW(
77    filename: PCWSTR,
78    context: PVOID,
79) -> BOOL}
80FN!{stdcall PFIND_EXE_FILE_CALLBACK(
81    FileHandle: HANDLE,
82    FileName: PCSTR,
83    CallerData: PVOID,
84) -> BOOL}
85FN!{stdcall PFIND_EXE_FILE_CALLBACKW(
86    FileHandle: HANDLE,
87    FileName: PCWSTR,
88    CallerData: PVOID,
89) -> BOOL}
90FN!{stdcall PSYM_ENUMERATESYMBOLS_CALLBACKW(
91    pSymInfo: PSYMBOL_INFOW,
92    SymbolSize: ULONG,
93    CallerData: PVOID,
94) -> BOOL}
95#[cfg(target_pointer_width = "32")]
96STRUCT!{struct IMAGE_DEBUG_INFORMATION {
97    List: LIST_ENTRY,
98    ReservedSize: DWORD,
99    ReservedMappedBase: PVOID,
100    ReservedMachine: USHORT,
101    ReservedCharacteristics: USHORT,
102    ReservedCheckSum: DWORD,
103    ImageBase: DWORD,
104    SizeOfImage: DWORD,
105    ReservedNumberOfSections: DWORD,
106    ReservedSections: PIMAGE_SECTION_HEADER,
107    ReservedExportedNamesSize: DWORD,
108    ReservedExportedNames: PSTR,
109    ReservedNumberOfFunctionTableEntries: DWORD,
110    ReservedFunctionTableEntries: PIMAGE_FUNCTION_ENTRY,
111    ReservedLowestFunctionStartingAddress: DWORD,
112    ReservedHighestFunctionEndingAddress: DWORD,
113    ReservedNumberOfFpoTableEntries: DWORD,
114    ReservedFpoTableEntries: PFPO_DATA,
115    SizeOfCoffSymbols: DWORD,
116    CoffSymbols: PIMAGE_COFF_SYMBOLS_HEADER,
117    ReservedSizeOfCodeViewSymbols: DWORD,
118    ReservedCodeViewSymbols: PVOID,
119    ImageFilePath: PSTR,
120    ImageFileName: PSTR,
121    ReservedDebugFilePath: PSTR,
122    ReservedTimeDateStamp: DWORD,
123    ReservedRomImage: BOOL,
124    ReservedDebugDirectory: PIMAGE_DEBUG_DIRECTORY,
125    ReservedNumberOfDebugDirectories: DWORD,
126    ReservedOriginalFunctionTableBaseAddress: DWORD,
127    Reserved: [DWORD; 2],
128}}
129#[cfg(target_pointer_width = "32")]
130pub type PIMAGE_DEBUG_INFORMATION = *mut IMAGE_DEBUG_INFORMATION;
131FN!{stdcall PENUMDIRTREE_CALLBACK(
132    FilePath: PCSTR,
133    CallerData: PVOID,
134) -> BOOL}
135FN!{stdcall PENUMDIRTREE_CALLBACKW(
136    FilePath: PCWSTR,
137    CallerData: PVOID,
138) -> BOOL}
139pub const UNDNAME_COMPLETE: DWORD = 0x0000;
140pub const UNDNAME_NO_LEADING_UNDERSCORES: DWORD = 0x0001;
141pub const UNDNAME_NO_MS_KEYWORDS: DWORD = 0x0002;
142pub const UNDNAME_NO_FUNCTION_RETURNS: DWORD = 0x0004;
143pub const UNDNAME_NO_ALLOCATION_MODEL: DWORD = 0x0008;
144pub const UNDNAME_NO_ALLOCATION_LANGUAGE: DWORD = 0x0010;
145pub const UNDNAME_NO_MS_THISTYPE: DWORD = 0x0020;
146pub const UNDNAME_NO_CV_THISTYPE: DWORD = 0x0040;
147pub const UNDNAME_NO_THISTYPE: DWORD = 0x0060;
148pub const UNDNAME_NO_ACCESS_SPECIFIERS: DWORD = 0x0080;
149pub const UNDNAME_NO_THROW_SIGNATURES: DWORD = 0x0100;
150pub const UNDNAME_NO_MEMBER_TYPE: DWORD = 0x0200;
151pub const UNDNAME_NO_RETURN_UDT_MODEL: DWORD = 0x0400;
152pub const UNDNAME_32_BIT_DECODE: DWORD = 0x0800;
153pub const UNDNAME_NAME_ONLY: DWORD = 0x1000;
154pub const UNDNAME_NO_ARGUMENTS: DWORD = 0x2000;
155pub const UNDNAME_NO_SPECIAL_SYMS: DWORD = 0x4000;
156pub const DBHHEADER_DEBUGDIRS: DWORD = 0x1;
157pub const DBHHEADER_CVMISC: DWORD = 0x2;
158pub const DBHHEADER_PDBGUID: DWORD = 0x3;
159STRUCT!{struct MODLOAD_DATA {
160    ssize: DWORD,
161    ssig: DWORD,
162    data: PVOID,
163    size: DWORD,
164    flags: DWORD,
165}}
166pub type PMODLOAD_DATA = *mut MODLOAD_DATA;
167STRUCT!{struct MODLOAD_CVMISC {
168    oCV: DWORD,
169    cCV: size_t,
170    oMisc: DWORD,
171    cMisc: size_t,
172    dtImage: DWORD,
173    cImage: DWORD,
174}}
175pub type PMODLOAD_CVMISC = *mut MODLOAD_CVMISC;
176STRUCT!{struct MODLOAD_PDBGUID_PDBAGE {
177    PdbGuid: GUID,
178    PdbAge: DWORD,
179}}
180pub type PMODLOAD_PDBGUID_PDBAGE = *mut MODLOAD_PDBGUID_PDBAGE;
181ENUM!{enum ADDRESS_MODE {
182    AddrMode1616,
183    AddrMode1632,
184    AddrModeReal,
185    AddrModeFlat,
186}}
187STRUCT!{struct ADDRESS64 {
188    Offset: DWORD64,
189    Segment: WORD,
190    Mode: ADDRESS_MODE,
191}}
192pub type LPADDRESS64 = *mut ADDRESS64;
193#[cfg(target_pointer_width = "64")]
194pub type ADDRESS = ADDRESS64;
195#[cfg(target_pointer_width = "64")]
196pub type LPADDRESS = LPADDRESS64;
197#[cfg(target_pointer_width = "32")]
198STRUCT!{struct ADDRESS {
199    Offset: DWORD,
200    Segment: WORD,
201    Mode: ADDRESS_MODE,
202}}
203#[cfg(target_pointer_width = "32")]
204pub type LPADDRESS = *mut ADDRESS;
205STRUCT!{struct KDHELP64 {
206    Thread: DWORD64,
207    ThCallbackStack: DWORD,
208    ThCallbackBStore: DWORD,
209    NextCallback: DWORD,
210    FramePointer: DWORD,
211    KiCallUserMode: DWORD64,
212    KeUserCallbackDispatcher: DWORD64,
213    SystemRangeStart: DWORD64,
214    KiUserExceptionDispatcher: DWORD64,
215    StackBase: DWORD64,
216    StackLimit: DWORD64,
217    BuildVersion: DWORD,
218    Reserved0: DWORD,
219    Reserved1: [DWORD64; 4],
220}}
221pub type PKDHELP64 = *mut KDHELP64;
222#[cfg(target_pointer_width = "64")]
223pub type KDHELP = KDHELP64;
224#[cfg(target_pointer_width = "64")]
225pub type PKDHELP = PKDHELP64;
226#[cfg(target_pointer_width = "32")]
227STRUCT!{struct KDHELP {
228    Thread: DWORD,
229    ThCallbackStack: DWORD,
230    NextCallback: DWORD,
231    FramePointer: DWORD,
232    KiCallUserMode: DWORD,
233    KeUserCallbackDispatcher: DWORD,
234    SystemRangeStart: DWORD,
235    ThCallbackBStore: DWORD,
236    KiUserExceptionDispatcher: DWORD,
237    StackBase: DWORD,
238    StackLimit: DWORD,
239    Reserved: [DWORD; 5],
240}}
241#[cfg(target_pointer_width = "32")]
242pub type PKDHELP = *mut KDHELP;
243STRUCT!{struct STACKFRAME64 {
244    AddrPC: ADDRESS64,
245    AddrReturn: ADDRESS64,
246    AddrFrame: ADDRESS64,
247    AddrStack: ADDRESS64,
248    AddrBStore: ADDRESS64,
249    FuncTableEntry: PVOID,
250    Params: [DWORD64; 4],
251    Far: BOOL,
252    Virtual: BOOL,
253    Reserved: [DWORD64; 3],
254    KdHelp: KDHELP64,
255}}
256pub type LPSTACKFRAME64 = *mut STACKFRAME64;
257pub const INLINE_FRAME_CONTEXT_INIT: DWORD = 0;
258pub const INLINE_FRAME_CONTEXT_IGNORE: DWORD = 0xFFFFFFFF;
259STRUCT!{struct STACKFRAME_EX {
260    AddrPC: ADDRESS64,
261    AddrReturn: ADDRESS64,
262    AddrFrame: ADDRESS64,
263    AddrStack: ADDRESS64,
264    AddrBStore: ADDRESS64,
265    FuncTableEntry: PVOID,
266    Params: [DWORD64; 4],
267    Far: BOOL,
268    Virtual: BOOL,
269    Reserved: [DWORD64; 3],
270    KdHelp: KDHELP64,
271    StackFrameSize: DWORD,
272    InlineFrameContext: DWORD,
273}}
274pub type LPSTACKFRAME_EX = *mut STACKFRAME_EX;
275#[cfg(target_pointer_width = "64")]
276pub type STACKFRAME = STACKFRAME64;
277#[cfg(target_pointer_width = "64")]
278pub type LPSTACKFRAME = LPSTACKFRAME64;
279#[cfg(target_pointer_width = "32")]
280STRUCT!{struct STACKFRAME {
281    AddrPC: ADDRESS,
282    AddrReturn: ADDRESS,
283    AddrFrame: ADDRESS,
284    AddrStack: ADDRESS,
285    FuncTableEntry: PVOID,
286    Params: [DWORD; 4],
287    Far: BOOL,
288    Virtual: BOOL,
289    Reserved: [DWORD; 3],
290    KdHelp: KDHELP,
291    AddrBStore: ADDRESS,
292}}
293#[cfg(target_pointer_width = "32")]
294pub type LPSTACKFRAME = *mut STACKFRAME;
295FN!{stdcall PREAD_PROCESS_MEMORY_ROUTINE64(
296    hProcess: HANDLE,
297    qwBaseAddress: DWORD64,
298    lpBuffer: PVOID,
299    nSize: DWORD,
300    lpNumberOfBytesRead: LPDWORD,
301) -> BOOL}
302FN!{stdcall PFUNCTION_TABLE_ACCESS_ROUTINE64(
303    ahProcess: HANDLE,
304    AddrBase: DWORD64,
305) -> PVOID}
306FN!{stdcall PGET_MODULE_BASE_ROUTINE64(
307    hProcess: HANDLE,
308    Address: DWORD64,
309) -> DWORD64}
310FN!{stdcall PTRANSLATE_ADDRESS_ROUTINE64(
311    hProcess: HANDLE,
312    hThread: HANDLE,
313    lpaddr: LPADDRESS64,
314) -> DWORD64}
315pub const SYM_STKWALK_DEFAULT: DWORD = 0x00000000;
316pub const SYM_STKWALK_FORCE_FRAMEPTR: DWORD = 0x00000001;
317#[cfg(target_pointer_width = "64")]
318pub type PREAD_PROCESS_MEMORY_ROUTINE = PREAD_PROCESS_MEMORY_ROUTINE64;
319#[cfg(target_pointer_width = "64")]
320pub type PFUNCTION_TABLE_ACCESS_ROUTINE = PFUNCTION_TABLE_ACCESS_ROUTINE64;
321#[cfg(target_pointer_width = "64")]
322pub type PGET_MODULE_BASE_ROUTINE = PGET_MODULE_BASE_ROUTINE64;
323#[cfg(target_pointer_width = "64")]
324pub type PTRANSLATE_ADDRESS_ROUTINE = PTRANSLATE_ADDRESS_ROUTINE64;
325#[cfg(target_pointer_width = "32")]
326FN!{stdcall PREAD_PROCESS_MEMORY_ROUTINE(
327    hProcess: HANDLE,
328    qwBaseAddress: DWORD,
329    lpBuffer: PVOID,
330    nSize: DWORD,
331    lpNumberOfBytesRead: PDWORD,
332) -> BOOL}
333#[cfg(target_pointer_width = "32")]
334FN!{stdcall PFUNCTION_TABLE_ACCESS_ROUTINE(
335    ahProcess: HANDLE,
336    AddrBase: DWORD,
337) -> PVOID}
338#[cfg(target_pointer_width = "32")]
339FN!{stdcall PGET_MODULE_BASE_ROUTINE(
340    hProcess: HANDLE,
341    Address: DWORD,
342) -> DWORD}
343#[cfg(target_pointer_width = "32")]
344FN!{stdcall PTRANSLATE_ADDRESS_ROUTINE(
345    hProcess: HANDLE,
346    hThread: HANDLE,
347    lpaddr: LPADDRESS,
348) -> DWORD}
349pub const API_VERSION_NUMBER: USHORT = 12;
350STRUCT!{struct API_VERSION {
351    MajorVersion: USHORT,
352    MinorVersion: USHORT,
353    Revision: USHORT,
354    Reserved: USHORT,
355}}
356pub type LPAPI_VERSION = *mut API_VERSION;
357STRUCT!{struct SYMBOL_INFOW {
358    SizeOfStruct: ULONG,
359    TypeIndex: ULONG,
360    Reserved: [ULONG64; 2],
361    Index: ULONG,
362    Size: ULONG,
363    ModBase: ULONG64,
364    Flags: ULONG,
365    Value: ULONG64,
366    Address: ULONG64,
367    Register: ULONG,
368    Scope: ULONG,
369    Tag: ULONG,
370    NameLen: ULONG,
371    MaxNameLen: ULONG,
372    Name: [WCHAR; 1],
373}}
374pub type PSYMBOL_INFOW = *mut SYMBOL_INFOW;
375ENUM!{enum SYM_TYPE {
376    SymNone = 0,
377    SymCoff,
378    SymCv,
379    SymPdb,
380    SymExport,
381    SymDeferred,
382    SymSym,
383    SymDia,
384    SymVirtual,
385    NumSymTypes,
386}}
387STRUCT!{struct IMAGEHLP_SYMBOL64 {
388    SizeOfStruct: DWORD,
389    Address: DWORD64,
390    Size: DWORD,
391    Flags: DWORD,
392    MaxNameLength: DWORD,
393    Name: [CHAR; 1],
394}}
395pub type PIMAGEHLP_SYMBOL64 = *mut IMAGEHLP_SYMBOL64;
396STRUCT!{struct IMAGEHLP_MODULEW64 {
397    SizeOfStruct: DWORD,
398    BaseOfImage: DWORD64,
399    ImageSize: DWORD,
400    TimeDateStamp: DWORD,
401    CheckSum: DWORD,
402    NumSyms: DWORD,
403    SymType: SYM_TYPE,
404    ModuleName: [WCHAR; 32],
405    ImageName: [WCHAR; 256],
406    LoadedImageName: [WCHAR; 256],
407    LoadedPdbName: [WCHAR; 256],
408    CVSig: DWORD,
409    CVData: [WCHAR; MAX_PATH * 3],
410    PdbSig: DWORD,
411    PdbSig70: GUID,
412    PdbAge: DWORD,
413    PdbUnmatched: BOOL,
414    DbgUnmatched: BOOL,
415    LineNumbers: BOOL,
416    GlobalSymbols: BOOL,
417    TypeInfo: BOOL,
418    SourceIndexed: BOOL,
419    Publics: BOOL,
420    MachineType: DWORD,
421    Reserved: DWORD,
422}}
423pub type PIMAGEHLP_MODULEW64 = *mut IMAGEHLP_MODULEW64;
424STRUCT!{struct IMAGEHLP_LINEW64 {
425    SizeOfStruct: DWORD,
426    Key: PVOID,
427    LineNumber: DWORD,
428    FileName: PWSTR,
429    Address: DWORD64,
430}}
431pub type PIMAGEHLP_LINEW64 = *mut IMAGEHLP_LINEW64;
432extern "system" {
433    pub fn EnumDirTree(
434        hProcess: HANDLE,
435        RootPath: PCSTR,
436        InputPathName: PCSTR,
437        OutputPathBuffer: PSTR,
438        cb: PENUMDIRTREE_CALLBACK,
439        data: PVOID,
440    ) -> BOOL;
441    pub fn EnumDirTreeW(
442        hProcess: HANDLE,
443        RootPath: PCWSTR,
444        InputPathName: PCWSTR,
445        OutputPathBuffer: PWSTR,
446        cb: PENUMDIRTREE_CALLBACKW,
447        data: PVOID,
448    ) -> BOOL;
449    pub fn ImagehlpApiVersion() -> LPAPI_VERSION;
450    pub fn ImagehlpApiVersionEx(
451        AppVersion: LPAPI_VERSION,
452    ) -> LPAPI_VERSION;
453    pub fn MakeSureDirectoryPathExists(
454        DirPath: PCSTR,
455    ) -> BOOL;
456    pub fn SearchTreeForFile(
457        RootPath: PCSTR,
458        InputPathName: PCSTR,
459        OutputPathBuffer: PSTR,
460    ) -> BOOL;
461    pub fn SearchTreeForFileW(
462        RootPath: PCWSTR,
463        InputPathName: PCWSTR,
464        OutputPathBuffer: PWSTR,
465    ) -> BOOL;
466    pub fn FindDebugInfoFile(
467        FileName: PCSTR,
468        SymbolPath: PCSTR,
469        DebugFilePath: PSTR,
470    ) -> HANDLE;
471    pub fn FindDebugInfoFileEx(
472        FileName: PCSTR,
473        SymbolPath: PCSTR,
474        DebugFilePath: PSTR,
475        Callback: PFIND_DEBUG_FILE_CALLBACK,
476        CallerData: PVOID,
477    ) -> HANDLE;
478    pub fn FindDebugInfoFileExW(
479        FileName: PCWSTR,
480        SymbolPath: PCWSTR,
481        DebugFilePath: PWSTR,
482        Callback: PFIND_DEBUG_FILE_CALLBACKW,
483        CallerData: PVOID,
484    ) -> HANDLE;
485    pub fn FindExecutableImage(
486        FileName: PCSTR,
487        SymbolPath: PCSTR,
488        ImageFilePath: PSTR,
489    ) -> HANDLE;
490    pub fn FindExecutableImageEx(
491        FileName: PCSTR,
492        SymbolPath: PCSTR,
493        ImageFilePath: PSTR,
494        Callback: PFIND_EXE_FILE_CALLBACK,
495        CallerData: PVOID,
496    ) -> HANDLE;
497    pub fn FindExecutableImageExW(
498        FileName: PCWSTR,
499        SymbolPath: PCWSTR,
500        ImageFilePath: PWSTR,
501        Callback: PFIND_EXE_FILE_CALLBACKW,
502        CallerData: PVOID,
503    ) -> HANDLE;
504    pub fn StackWalk(
505        MachineType: DWORD,
506        hProcess: HANDLE,
507        hThread: HANDLE,
508        StackFrame: LPSTACKFRAME,
509        ContextRecord: PVOID,
510        ReadMemoryRoutine: PREAD_PROCESS_MEMORY_ROUTINE,
511        FunctionTableAccessRoutine: PFUNCTION_TABLE_ACCESS_ROUTINE,
512        GetModuleBaseRoutine: PGET_MODULE_BASE_ROUTINE,
513        TranslateAddress: PTRANSLATE_ADDRESS_ROUTINE,
514    ) -> BOOL;
515    pub fn StackWalkEx(
516        MachineType: DWORD,
517        hProcess: HANDLE,
518        hThread: HANDLE,
519        StackFrame: LPSTACKFRAME_EX,
520        ContextRecord: PVOID,
521        ReadMemoryRoutine: PREAD_PROCESS_MEMORY_ROUTINE64,
522        FunctionTableAccessRoutine: PFUNCTION_TABLE_ACCESS_ROUTINE64,
523        GetModuleBaseRoutine: PGET_MODULE_BASE_ROUTINE64,
524        TranslateAddress: PTRANSLATE_ADDRESS_ROUTINE64,
525        Flags: DWORD,
526    ) -> BOOL;
527    pub fn StackWalk64(
528        MachineType: DWORD,
529        hProcess: HANDLE,
530        hThread: HANDLE,
531        StackFrame: LPSTACKFRAME64,
532        ContextRecord: PVOID,
533        ReadMemoryRoutine: PREAD_PROCESS_MEMORY_ROUTINE64,
534        FunctionTableAccessRoutine: PFUNCTION_TABLE_ACCESS_ROUTINE64,
535        GetModuleBaseRoutine: PGET_MODULE_BASE_ROUTINE64,
536        TranslateAddress: PTRANSLATE_ADDRESS_ROUTINE64,
537    ) -> BOOL;
538    pub fn UnDecorateSymbolName(
539        name: PCSTR,
540        outputString: PSTR,
541        maxStringLength: DWORD,
542        flags: DWORD,
543    ) -> DWORD;
544    pub fn UnDecorateSymbolNameW(
545        name: PCWSTR,
546        outputString: PWSTR,
547        maxStringLength: DWORD,
548        flags: DWORD,
549    ) -> DWORD;
550    pub fn GetTimestampForLoadedLibrary(
551        Module: HMODULE,
552    ) -> DWORD;
553    pub fn ImageDirectoryEntryToData(
554        Base: PVOID,
555        MappedAsImage: BOOLEAN,
556        DirectoryEntry: USHORT,
557        Size: PULONG,
558    ) -> PVOID;
559    pub fn ImageDirectoryEntryToDataEx(
560        Base: PVOID,
561        MappedAsImage: BOOLEAN,
562        DirectoryEntry: USHORT,
563        Size: PULONG,
564        FoundHeader: *mut PIMAGE_SECTION_HEADER,
565    ) -> PVOID;
566    pub fn ImageNtHeader(
567        Base: PVOID,
568    ) -> PIMAGE_NT_HEADERS;
569    pub fn ImageRvaToSection(
570        NtHeaders: PIMAGE_NT_HEADERS,
571        Base: PVOID,
572        Rva: ULONG,
573    ) -> PIMAGE_SECTION_HEADER;
574    pub fn ImageRvaToVa(
575        NtHeaders: PIMAGE_NT_HEADERS,
576        Base: PVOID,
577        Rva: ULONG,
578        LastRvaSection: *mut PIMAGE_SECTION_HEADER,
579    ) -> PVOID;
580}
581pub const SYMOPT_CASE_INSENSITIVE: DWORD = 0x00000001;
582pub const SYMOPT_UNDNAME: DWORD = 0x00000002;
583pub const SYMOPT_DEFERRED_LOADS: DWORD = 0x00000004;
584pub const SYMOPT_NO_CPP: DWORD = 0x00000008;
585pub const SYMOPT_LOAD_LINES: DWORD = 0x00000010;
586pub const SYMOPT_OMAP_FIND_NEAREST: DWORD = 0x00000020;
587pub const SYMOPT_LOAD_ANYTHING: DWORD = 0x00000040;
588pub const SYMOPT_IGNORE_CVREC: DWORD = 0x00000080;
589pub const SYMOPT_NO_UNQUALIFIED_LOADS: DWORD = 0x00000100;
590pub const SYMOPT_FAIL_CRITICAL_ERRORS: DWORD = 0x00000200;
591pub const SYMOPT_EXACT_SYMBOLS: DWORD = 0x00000400;
592pub const SYMOPT_ALLOW_ABSOLUTE_SYMBOLS: DWORD = 0x00000800;
593pub const SYMOPT_IGNORE_NT_SYMPATH: DWORD = 0x00001000;
594pub const SYMOPT_INCLUDE_32BIT_MODULES: DWORD = 0x00002000;
595pub const SYMOPT_PUBLICS_ONLY: DWORD = 0x00004000;
596pub const SYMOPT_NO_PUBLICS: DWORD = 0x00008000;
597pub const SYMOPT_AUTO_PUBLICS: DWORD = 0x00010000;
598pub const SYMOPT_NO_IMAGE_SEARCH: DWORD = 0x00020000;
599pub const SYMOPT_SECURE: DWORD = 0x00040000;
600pub const SYMOPT_NO_PROMPTS: DWORD = 0x00080000;
601pub const SYMOPT_OVERWRITE: DWORD = 0x00100000;
602pub const SYMOPT_IGNORE_IMAGEDIR: DWORD = 0x00200000;
603pub const SYMOPT_FLAT_DIRECTORY: DWORD = 0x00400000;
604pub const SYMOPT_FAVOR_COMPRESSED: DWORD = 0x00800000;
605pub const SYMOPT_ALLOW_ZERO_ADDRESS: DWORD = 0x01000000;
606pub const SYMOPT_DISABLE_SYMSRV_AUTODETECT: DWORD = 0x02000000;
607pub const SYMOPT_READONLY_CACHE: DWORD = 0x04000000;
608pub const SYMOPT_SYMPATH_LAST: DWORD = 0x08000000;
609pub const SYMOPT_DISABLE_FAST_SYMBOLS: DWORD = 0x10000000;
610pub const SYMOPT_DISABLE_SYMSRV_TIMEOUT: DWORD = 0x20000000;
611pub const SYMOPT_DISABLE_SRVSTAR_ON_STARTUP: DWORD = 0x40000000;
612pub const SYMOPT_DEBUG: DWORD = 0x80000000;
613extern "system" {
614    pub fn SymSetOptions(
615        SymOptions: DWORD,
616    ) -> DWORD;
617    pub fn SymGetOptions() -> DWORD;
618    pub fn SymCleanup(
619        hProcess: HANDLE,
620    ) -> BOOL;
621    pub fn SymEnumSymbolsW(
622        hProcess: HANDLE,
623        BaseOfDll: ULONG64,
624        Mask: PCWSTR,
625        EnumSymbolsCallback: PSYM_ENUMERATESYMBOLS_CALLBACKW,
626        CallerData: PVOID,
627    ) -> BOOL;
628    pub fn SymFindDebugInfoFile(
629        hProcess: HANDLE,
630        FileName: PCSTR,
631        DebugFilePath: PSTR,
632        Callback: PFIND_DEBUG_FILE_CALLBACK,
633        CallerData: PVOID,
634    ) -> HANDLE;
635    pub fn SymFindDebugInfoFileW(
636        hProcess: HANDLE,
637        FileName: PCWSTR,
638        DebugFilePath: PWSTR,
639        Callback: PFIND_DEBUG_FILE_CALLBACKW,
640        CallerData: PVOID,
641    ) -> HANDLE;
642    pub fn SymFindExecutableImage(
643        hProcess: HANDLE,
644        FileName: PCSTR,
645        ImageFilePath: PSTR,
646        Callback: PFIND_EXE_FILE_CALLBACK,
647        CallerData: PVOID,
648    ) -> HANDLE;
649    pub fn SymFindExecutableImageW(
650        hProcess: HANDLE,
651        FileName: PCWSTR,
652        ImageFilePath: PWSTR,
653        Callback: PFIND_EXE_FILE_CALLBACKW,
654        CallerData: PVOID,
655    ) -> HANDLE;
656    pub fn SymFindFileInPath(
657        hprocess: HANDLE,
658        SearchPath: PCSTR,
659        FileName: PCSTR,
660        id: PVOID,
661        two: DWORD,
662        three: DWORD,
663        flags: DWORD,
664        FoundFile: PSTR,
665        callback: PFINDFILEINPATHCALLBACK,
666        context: PVOID,
667    ) -> BOOL;
668    pub fn SymFindFileInPathW(
669        hprocess: HANDLE,
670        SearchPath: PCWSTR,
671        FileName: PCWSTR,
672        id: PVOID,
673        two: DWORD,
674        three: DWORD,
675        flags: DWORD,
676        FoundFile: PWSTR,
677        callback: PFINDFILEINPATHCALLBACKW,
678        context: PVOID,
679    ) -> BOOL;
680    pub fn SymFromAddrW(
681        hProcess: HANDLE,
682        Address: DWORD64,
683        Displacement: PDWORD64,
684        Symbol: PSYMBOL_INFOW,
685    ) -> BOOL;
686    pub fn SymFromNameW(
687        hProcess: HANDLE,
688        Name: PCWSTR,
689        Symbol: PSYMBOL_INFOW,
690    ) -> BOOL;
691    pub fn SymFunctionTableAccess64(
692        hProcess: HANDLE,
693        AddrBase: DWORD64,
694    ) -> PVOID;
695    pub fn SymGetLineFromAddrW64(
696        hProcess: HANDLE,
697        dwAddr: DWORD64,
698        pdwDisplacement: PDWORD,
699        Line: PIMAGEHLP_LINEW64,
700    ) -> BOOL;
701    pub fn SymGetModuleInfoW64(
702        hProcess: HANDLE,
703        qwAddr: DWORD64,
704        ModuleInfo: PIMAGEHLP_MODULEW64,
705    ) -> BOOL;
706    pub fn SymGetModuleBase64(
707        hProcess: HANDLE,
708        AddrBase: DWORD64,
709    ) -> DWORD64;
710    pub fn SymGetSymFromAddr64(
711        hProcess: HANDLE,
712        Address: DWORD64,
713        Displacement: PDWORD64,
714        Symbol: PIMAGEHLP_SYMBOL64,
715    ) -> BOOL;
716    pub fn SymInitializeW(
717        hProcess: HANDLE,
718        UserSearchPath: PCWSTR,
719        fInvadeProcess: BOOL,
720    ) -> BOOL;
721    pub fn SymLoadModuleExW(
722        hProcess: HANDLE,
723        hFile: HANDLE,
724        ImageName: PCWSTR,
725        ModuleName: PCWSTR,
726        BaseOfDll: DWORD64,
727        SizeOfDll: DWORD,
728        Data: PMODLOAD_DATA,
729        Flags: DWORD,
730    ) -> DWORD64;
731    pub fn SymUnloadModule(
732        hProcess: HANDLE,
733        BaseOfDll: DWORD,
734    ) -> BOOL;
735    pub fn SymUnloadModule64(
736        hProcess: HANDLE,
737        BaseOfDll: DWORD64,
738    ) -> BOOL;
739    #[cfg(target_pointer_width = "32")]
740    pub fn MapDebugInformation(
741        FileHandle: HANDLE,
742        FileName: PCSTR,
743        SymbolPath: PCSTR,
744        ImageBase: ULONG,
745    ) -> PIMAGE_DEBUG_INFORMATION;
746    #[cfg(target_pointer_width = "32")]
747    pub fn UnmapDebugInformation(
748        DebugInfo: PIMAGE_DEBUG_INFORMATION,
749    ) -> BOOL;
750}