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
7 use shared
::basetsd
::{DWORD64, PDWORD64, ULONG64}
;
8 use shared
::guiddef
::GUID
;
9 use shared
::minwindef
::{
10 BOOL
, DWORD
, HMODULE
, LPDWORD
, PDWORD
, PUCHAR
, PULONG
, UCHAR
, ULONG
, USHORT
, WORD
,
13 BOOLEAN
, CHAR
, HANDLE
, LIST_ENTRY
, PCSTR
, PCWSTR
, PIMAGE_NT_HEADERS
, PIMAGE_SECTION_HEADER
,
14 PSTR
, PVOID
, PWSTR
, WCHAR
,
16 #[cfg(target_pointer_width = "32")]
18 PFPO_DATA
, PIMAGE_COFF_SYMBOLS_HEADER
, PIMAGE_DEBUG_DIRECTORY
, PIMAGE_FUNCTION_ENTRY
,
21 #[cfg(target_pointer_width = "64")]
22 use um
::winnt
::PIMAGE_NT_HEADERS64
;
23 use vc
::vcruntime
::size_t
;
24 #[cfg(target_pointer_width = "64")]
25 STRUCT
!{struct LOADED_IMAGE
{
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
,
41 #[cfg(target_pointer_width = "32")]
42 STRUCT
!{struct LOADED_IMAGE
{
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
,
58 pub const MAX_SYM_NAME
: usize = 2000;
59 pub const ERROR_IMAGE_NOT_STRIPPED
: DWORD
= 0x8800;
60 pub const ERROR_NO_DBG_POINTER
: DWORD
= 0x8801;
61 pub const ERROR_NO_PDB_POINTER
: DWORD
= 0x8802;
62 FN
!{stdcall
PFIND_DEBUG_FILE_CALLBACK(
67 FN
!{stdcall
PFIND_DEBUG_FILE_CALLBACKW(
72 FN
!{stdcall
PFINDFILEINPATHCALLBACK(
76 FN
!{stdcall
PFINDFILEINPATHCALLBACKW(
80 FN
!{stdcall
PFIND_EXE_FILE_CALLBACK(
85 FN
!{stdcall
PFIND_EXE_FILE_CALLBACKW(
90 FN
!{stdcall
PSYM_ENUMERATESYMBOLS_CALLBACKW(
91 pSymInfo
: PSYMBOL_INFOW
,
95 #[cfg(target_pointer_width = "32")]
96 STRUCT
!{struct IMAGE_DEBUG_INFORMATION
{
99 ReservedMappedBase
: PVOID
,
100 ReservedMachine
: USHORT
,
101 ReservedCharacteristics
: USHORT
,
102 ReservedCheckSum
: 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
,
121 ReservedDebugFilePath
: PSTR
,
122 ReservedTimeDateStamp
: DWORD
,
123 ReservedRomImage
: BOOL
,
124 ReservedDebugDirectory
: PIMAGE_DEBUG_DIRECTORY
,
125 ReservedNumberOfDebugDirectories
: DWORD
,
126 ReservedOriginalFunctionTableBaseAddress
: DWORD
,
127 Reserved
: [DWORD
; 2],
129 #[cfg(target_pointer_width = "32")]
130 pub type PIMAGE_DEBUG_INFORMATION
= *mut IMAGE_DEBUG_INFORMATION
;
131 FN
!{stdcall
PENUMDIRTREE_CALLBACK(
135 FN
!{stdcall
PENUMDIRTREE_CALLBACKW(
139 pub const UNDNAME_COMPLETE
: DWORD
= 0x0000;
140 pub const UNDNAME_NO_LEADING_UNDERSCORES
: DWORD
= 0x0001;
141 pub const UNDNAME_NO_MS_KEYWORDS
: DWORD
= 0x0002;
142 pub const UNDNAME_NO_FUNCTION_RETURNS
: DWORD
= 0x0004;
143 pub const UNDNAME_NO_ALLOCATION_MODEL
: DWORD
= 0x0008;
144 pub const UNDNAME_NO_ALLOCATION_LANGUAGE
: DWORD
= 0x0010;
145 pub const UNDNAME_NO_MS_THISTYPE
: DWORD
= 0x0020;
146 pub const UNDNAME_NO_CV_THISTYPE
: DWORD
= 0x0040;
147 pub const UNDNAME_NO_THISTYPE
: DWORD
= 0x0060;
148 pub const UNDNAME_NO_ACCESS_SPECIFIERS
: DWORD
= 0x0080;
149 pub const UNDNAME_NO_THROW_SIGNATURES
: DWORD
= 0x0100;
150 pub const UNDNAME_NO_MEMBER_TYPE
: DWORD
= 0x0200;
151 pub const UNDNAME_NO_RETURN_UDT_MODEL
: DWORD
= 0x0400;
152 pub const UNDNAME_32_BIT_DECODE
: DWORD
= 0x0800;
153 pub const UNDNAME_NAME_ONLY
: DWORD
= 0x1000;
154 pub const UNDNAME_NO_ARGUMENTS
: DWORD
= 0x2000;
155 pub const UNDNAME_NO_SPECIAL_SYMS
: DWORD
= 0x4000;
156 pub const DBHHEADER_DEBUGDIRS
: DWORD
= 0x1;
157 pub const DBHHEADER_CVMISC
: DWORD
= 0x2;
158 pub const DBHHEADER_PDBGUID
: DWORD
= 0x3;
159 STRUCT
!{struct MODLOAD_DATA
{
166 pub type PMODLOAD_DATA
= *mut MODLOAD_DATA
;
167 STRUCT
!{struct MODLOAD_CVMISC
{
175 pub type PMODLOAD_CVMISC
= *mut MODLOAD_CVMISC
;
176 STRUCT
!{struct MODLOAD_PDBGUID_PDBAGE
{
180 pub type PMODLOAD_PDBGUID_PDBAGE
= *mut MODLOAD_PDBGUID_PDBAGE
;
181 ENUM
!{enum ADDRESS_MODE
{
187 STRUCT
!{struct ADDRESS64
{
192 pub type LPADDRESS64
= *mut ADDRESS64
;
193 #[cfg(target_pointer_width = "64")]
194 pub type ADDRESS
= ADDRESS64
;
195 #[cfg(target_pointer_width = "64")]
196 pub type LPADDRESS
= LPADDRESS64
;
197 #[cfg(target_pointer_width = "32")]
198 STRUCT
!{struct ADDRESS
{
203 #[cfg(target_pointer_width = "32")]
204 pub type LPADDRESS
= *mut ADDRESS
;
205 STRUCT
!{struct KDHELP64
{
207 ThCallbackStack
: DWORD
,
208 ThCallbackBStore
: DWORD
,
211 KiCallUserMode
: DWORD64
,
212 KeUserCallbackDispatcher
: DWORD64
,
213 SystemRangeStart
: DWORD64
,
214 KiUserExceptionDispatcher
: DWORD64
,
219 Reserved1
: [DWORD64
; 4],
221 pub type PKDHELP64
= *mut KDHELP64
;
222 #[cfg(target_pointer_width = "64")]
223 pub type KDHELP
= KDHELP64
;
224 #[cfg(target_pointer_width = "64")]
225 pub type PKDHELP
= PKDHELP64
;
226 #[cfg(target_pointer_width = "32")]
227 STRUCT
!{struct KDHELP
{
229 ThCallbackStack
: DWORD
,
232 KiCallUserMode
: DWORD
,
233 KeUserCallbackDispatcher
: DWORD
,
234 SystemRangeStart
: DWORD
,
235 ThCallbackBStore
: DWORD
,
236 KiUserExceptionDispatcher
: DWORD
,
239 Reserved
: [DWORD
; 5],
241 #[cfg(target_pointer_width = "32")]
242 pub type PKDHELP
= *mut KDHELP
;
243 STRUCT
!{struct STACKFRAME64
{
245 AddrReturn
: ADDRESS64
,
246 AddrFrame
: ADDRESS64
,
247 AddrStack
: ADDRESS64
,
248 AddrBStore
: ADDRESS64
,
249 FuncTableEntry
: PVOID
,
250 Params
: [DWORD64
; 4],
253 Reserved
: [DWORD64
; 3],
256 pub type LPSTACKFRAME64
= *mut STACKFRAME64
;
257 pub const INLINE_FRAME_CONTEXT_INIT
: DWORD
= 0;
258 pub const INLINE_FRAME_CONTEXT_IGNORE
: DWORD
= 0xFFFFFFFF;
259 STRUCT
!{struct STACKFRAME_EX
{
261 AddrReturn
: ADDRESS64
,
262 AddrFrame
: ADDRESS64
,
263 AddrStack
: ADDRESS64
,
264 AddrBStore
: ADDRESS64
,
265 FuncTableEntry
: PVOID
,
266 Params
: [DWORD64
; 4],
269 Reserved
: [DWORD64
; 3],
271 StackFrameSize
: DWORD
,
272 InlineFrameContext
: DWORD
,
274 pub type LPSTACKFRAME_EX
= *mut STACKFRAME_EX
;
275 #[cfg(target_pointer_width = "64")]
276 pub type STACKFRAME
= STACKFRAME64
;
277 #[cfg(target_pointer_width = "64")]
278 pub type LPSTACKFRAME
= LPSTACKFRAME64
;
279 #[cfg(target_pointer_width = "32")]
280 STRUCT
!{struct STACKFRAME
{
285 FuncTableEntry
: PVOID
,
289 Reserved
: [DWORD
; 3],
293 #[cfg(target_pointer_width = "32")]
294 pub type LPSTACKFRAME
= *mut STACKFRAME
;
295 FN
!{stdcall
PREAD_PROCESS_MEMORY_ROUTINE64(
297 qwBaseAddress
: DWORD64
,
300 lpNumberOfBytesRead
: LPDWORD
,
302 FN
!{stdcall
PFUNCTION_TABLE_ACCESS_ROUTINE64(
306 FN
!{stdcall
PGET_MODULE_BASE_ROUTINE64(
310 FN
!{stdcall
PTRANSLATE_ADDRESS_ROUTINE64(
315 pub const SYM_STKWALK_DEFAULT
: DWORD
= 0x00000000;
316 pub const SYM_STKWALK_FORCE_FRAMEPTR
: DWORD
= 0x00000001;
317 #[cfg(target_pointer_width = "64")]
318 pub type PREAD_PROCESS_MEMORY_ROUTINE
= PREAD_PROCESS_MEMORY_ROUTINE64
;
319 #[cfg(target_pointer_width = "64")]
320 pub type PFUNCTION_TABLE_ACCESS_ROUTINE
= PFUNCTION_TABLE_ACCESS_ROUTINE64
;
321 #[cfg(target_pointer_width = "64")]
322 pub type PGET_MODULE_BASE_ROUTINE
= PGET_MODULE_BASE_ROUTINE64
;
323 #[cfg(target_pointer_width = "64")]
324 pub type PTRANSLATE_ADDRESS_ROUTINE
= PTRANSLATE_ADDRESS_ROUTINE64
;
325 #[cfg(target_pointer_width = "32")]
326 FN
!{stdcall
PREAD_PROCESS_MEMORY_ROUTINE(
328 qwBaseAddress
: DWORD
,
331 lpNumberOfBytesRead
: PDWORD
,
333 #[cfg(target_pointer_width = "32")]
334 FN
!{stdcall
PFUNCTION_TABLE_ACCESS_ROUTINE(
338 #[cfg(target_pointer_width = "32")]
339 FN
!{stdcall
PGET_MODULE_BASE_ROUTINE(
343 #[cfg(target_pointer_width = "32")]
344 FN
!{stdcall
PTRANSLATE_ADDRESS_ROUTINE(
349 pub const API_VERSION_NUMBER
: USHORT
= 12;
350 STRUCT
!{struct API_VERSION
{
351 MajorVersion
: USHORT
,
352 MinorVersion
: USHORT
,
356 pub type LPAPI_VERSION
= *mut API_VERSION
;
357 STRUCT
!{struct SYMBOL_INFOW
{
360 Reserved
: [ULONG64
; 2],
374 pub type PSYMBOL_INFOW
= *mut SYMBOL_INFOW
;
375 STRUCT
!{struct IMAGEHLP_SYMBOL64
{
380 MaxNameLength
: DWORD
,
383 pub type PIMAGEHLP_SYMBOL64
= *mut IMAGEHLP_SYMBOL64
;
384 STRUCT
!{struct IMAGEHLP_LINEW64
{
391 pub type PIMAGEHLP_LINEW64
= *mut IMAGEHLP_LINEW64
;
396 InputPathName
: PCSTR
,
397 OutputPathBuffer
: PSTR
,
398 cb
: PENUMDIRTREE_CALLBACK
,
404 InputPathName
: PCWSTR
,
405 OutputPathBuffer
: PWSTR
,
406 cb
: PENUMDIRTREE_CALLBACKW
,
409 pub fn ImagehlpApiVersion() -> LPAPI_VERSION
;
410 pub fn ImagehlpApiVersionEx(
411 AppVersion
: LPAPI_VERSION
,
413 pub fn MakeSureDirectoryPathExists(
416 pub fn SearchTreeForFile(
418 InputPathName
: PCSTR
,
419 OutputPathBuffer
: PSTR
,
421 pub fn SearchTreeForFileW(
423 InputPathName
: PCWSTR
,
424 OutputPathBuffer
: PWSTR
,
426 pub fn FindDebugInfoFile(
431 pub fn FindDebugInfoFileEx(
435 Callback
: PFIND_DEBUG_FILE_CALLBACK
,
438 pub fn FindDebugInfoFileExW(
441 DebugFilePath
: PWSTR
,
442 Callback
: PFIND_DEBUG_FILE_CALLBACKW
,
445 pub fn FindExecutableImage(
450 pub fn FindExecutableImageEx(
454 Callback
: PFIND_EXE_FILE_CALLBACK
,
457 pub fn FindExecutableImageExW(
460 ImageFilePath
: PWSTR
,
461 Callback
: PFIND_EXE_FILE_CALLBACKW
,
468 StackFrame
: LPSTACKFRAME
,
469 ContextRecord
: PVOID
,
470 ReadMemoryRoutine
: PREAD_PROCESS_MEMORY_ROUTINE
,
471 FunctionTableAccessRoutine
: PFUNCTION_TABLE_ACCESS_ROUTINE
,
472 GetModuleBaseRoutine
: PGET_MODULE_BASE_ROUTINE
,
473 TranslateAddress
: PTRANSLATE_ADDRESS_ROUTINE
,
479 StackFrame
: LPSTACKFRAME_EX
,
480 ContextRecord
: PVOID
,
481 ReadMemoryRoutine
: PREAD_PROCESS_MEMORY_ROUTINE64
,
482 FunctionTableAccessRoutine
: PFUNCTION_TABLE_ACCESS_ROUTINE64
,
483 GetModuleBaseRoutine
: PGET_MODULE_BASE_ROUTINE64
,
484 TranslateAddress
: PTRANSLATE_ADDRESS_ROUTINE64
,
491 StackFrame
: LPSTACKFRAME64
,
492 ContextRecord
: PVOID
,
493 ReadMemoryRoutine
: PREAD_PROCESS_MEMORY_ROUTINE64
,
494 FunctionTableAccessRoutine
: PFUNCTION_TABLE_ACCESS_ROUTINE64
,
495 GetModuleBaseRoutine
: PGET_MODULE_BASE_ROUTINE64
,
496 TranslateAddress
: PTRANSLATE_ADDRESS_ROUTINE64
,
498 pub fn UnDecorateSymbolName(
501 maxStringLength
: DWORD
,
504 pub fn UnDecorateSymbolNameW(
507 maxStringLength
: DWORD
,
510 pub fn GetTimestampForLoadedLibrary(
513 pub fn ImageDirectoryEntryToData(
515 MappedAsImage
: BOOLEAN
,
516 DirectoryEntry
: USHORT
,
519 pub fn ImageDirectoryEntryToDataEx(
521 MappedAsImage
: BOOLEAN
,
522 DirectoryEntry
: USHORT
,
524 FoundHeader
: *mut PIMAGE_SECTION_HEADER
,
526 pub fn ImageNtHeader(
528 ) -> PIMAGE_NT_HEADERS
;
529 pub fn ImageRvaToSection(
530 NtHeaders
: PIMAGE_NT_HEADERS
,
533 ) -> PIMAGE_SECTION_HEADER
;
535 NtHeaders
: PIMAGE_NT_HEADERS
,
538 LastRvaSection
: *mut PIMAGE_SECTION_HEADER
,
543 pub fn SymEnumSymbolsW(
547 EnumSymbolsCallback
: PSYM_ENUMERATESYMBOLS_CALLBACKW
,
550 pub fn SymFindDebugInfoFile(
554 Callback
: PFIND_DEBUG_FILE_CALLBACK
,
557 pub fn SymFindDebugInfoFileW(
560 DebugFilePath
: PWSTR
,
561 Callback
: PFIND_DEBUG_FILE_CALLBACKW
,
564 pub fn SymFindExecutableImage(
568 Callback
: PFIND_EXE_FILE_CALLBACK
,
571 pub fn SymFindExecutableImageW(
574 ImageFilePath
: PWSTR
,
575 Callback
: PFIND_EXE_FILE_CALLBACKW
,
578 pub fn SymFindFileInPath(
587 callback
: PFINDFILEINPATHCALLBACK
,
590 pub fn SymFindFileInPathW(
599 callback
: PFINDFILEINPATHCALLBACKW
,
605 Displacement
: PDWORD64
,
606 Symbol
: PSYMBOL_INFOW
,
611 Symbol
: PSYMBOL_INFOW
,
613 pub fn SymFunctionTableAccess64(
617 pub fn SymGetLineFromAddrW64(
620 pdwDisplacement
: PDWORD
,
621 Line
: PIMAGEHLP_LINEW64
,
623 pub fn SymGetModuleBase64(
627 pub fn SymGetSymFromAddr64(
630 Displacement
: PDWORD64
,
631 Symbol
: PIMAGEHLP_SYMBOL64
,
633 pub fn SymInitializeW(
635 UserSearchPath
: PCWSTR
,
636 fInvadeProcess
: BOOL
,
638 pub fn SymLoadModuleExW(
648 pub fn SymUnloadModule(
652 pub fn SymUnloadModule64(
656 #[cfg(target_pointer_width = "32")]
657 pub fn MapDebugInformation(
662 ) -> PIMAGE_DEBUG_INFORMATION
;
663 #[cfg(target_pointer_width = "32")]
664 pub fn UnmapDebugInformation(
665 DebugInfo
: PIMAGE_DEBUG_INFORMATION
,