1 // Copyright © 2015, Peter Atashian 2 // Licensed under the MIT License <LICENSE.md> 3 //! DbgHelp include file 4 #[cfg(target_arch = "x86_64")] 5 STRUCT!{struct LOADED_IMAGE { 6 ModuleName: ::PSTR, 7 hFile: ::HANDLE, 8 MappedAddress: ::PUCHAR, 9 FileHeader: ::PIMAGE_NT_HEADERS64, 10 LastRvaSection: ::PIMAGE_SECTION_HEADER, 11 NumberOfSections: ::ULONG, 12 Sections: ::PIMAGE_SECTION_HEADER, 13 Characteristics: ::ULONG, 14 fSystemImage: ::BOOLEAN, 15 fDOSImage: ::BOOLEAN, 16 fReadOnly: ::BOOLEAN, 17 Version: ::UCHAR, 18 Links: ::LIST_ENTRY, 19 SizeOfImage: ::ULONG, 20 }} 21 #[cfg(target_arch = "x86")] 22 STRUCT!{struct LOADED_IMAGE { 23 ModuleName: ::PSTR, 24 hFile: ::HANDLE, 25 MappedAddress: ::PUCHAR, 26 FileHeader: ::PIMAGE_NT_HEADERS32, 27 LastRvaSection: ::PIMAGE_SECTION_HEADER, 28 NumberOfSections: ::ULONG, 29 Sections: ::PIMAGE_SECTION_HEADER, 30 Characteristics: ::ULONG, 31 fSystemImage: ::BOOLEAN, 32 fDOSImage: ::BOOLEAN, 33 fReadOnly: ::BOOLEAN, 34 Version: ::UCHAR, 35 Links: ::LIST_ENTRY, 36 SizeOfImage: ::ULONG, 37 }} 38 pub const MAX_SYM_NAME: usize = 2000; 39 pub const ERROR_IMAGE_NOT_STRIPPED: ::DWORD = 0x8800; 40 pub const ERROR_NO_DBG_POINTER: ::DWORD = 0x8801; 41 pub const ERROR_NO_PDB_POINTER: ::DWORD = 0x8802; 42 pub type PFIND_DEBUG_FILE_CALLBACK = Option<unsafe extern "system" fn( 43 FileHandle: ::HANDLE, FileName: ::PCSTR, CallerData: ::PVOID, 44 ) -> ::BOOL>; 45 pub type PFIND_DEBUG_FILE_CALLBACKW = Option<unsafe extern "system" fn( 46 FileHandle: ::HANDLE, FileName: ::PCWSTR, CallerData: ::PVOID, 47 ) -> ::BOOL>; 48 pub type PFINDFILEINPATHCALLBACK = Option<unsafe extern "system" fn( 49 filename: ::PCSTR, context: ::PVOID, 50 ) -> ::BOOL>; 51 pub type PFINDFILEINPATHCALLBACKW = Option<unsafe extern "system" fn( 52 filename: ::PCWSTR, context: ::PVOID, 53 ) -> ::BOOL>; 54 pub type PFIND_EXE_FILE_CALLBACK = Option<unsafe extern "system" fn( 55 FileHandle: ::HANDLE, FileName: ::PCSTR, CallerData: ::PVOID, 56 ) -> ::BOOL>; 57 pub type PFIND_EXE_FILE_CALLBACKW = Option<unsafe extern "system" fn( 58 FileHandle: ::HANDLE, FileName: ::PCWSTR, CallerData: ::PVOID, 59 ) -> ::BOOL>; 60 #[cfg(target_arch = "x86")] 61 STRUCT!{struct IMAGE_DEBUG_INFORMATION { 62 List: ::LIST_ENTRY, 63 ReservedSize: ::DWORD, 64 ReservedMappedBase: ::PVOID, 65 ReservedMachine: ::USHORT, 66 ReservedCharacteristics: ::USHORT, 67 ReservedCheckSum: ::DWORD, 68 ImageBase: ::DWORD, 69 SizeOfImage: ::DWORD, 70 ReservedNumberOfSections: ::DWORD, 71 ReservedSections: ::PIMAGE_SECTION_HEADER, 72 ReservedExportedNamesSize: ::DWORD, 73 ReservedExportedNames: ::PSTR, 74 ReservedNumberOfFunctionTableEntries: ::DWORD, 75 ReservedFunctionTableEntries: ::PIMAGE_FUNCTION_ENTRY, 76 ReservedLowestFunctionStartingAddress: ::DWORD, 77 ReservedHighestFunctionEndingAddress: ::DWORD, 78 ReservedNumberOfFpoTableEntries: ::DWORD, 79 ReservedFpoTableEntries: ::PFPO_DATA, 80 SizeOfCoffSymbols: ::DWORD, 81 CoffSymbols: ::PIMAGE_COFF_SYMBOLS_HEADER, 82 ReservedSizeOfCodeViewSymbols: ::DWORD, 83 ReservedCodeViewSymbols: ::PVOID, 84 ImageFilePath: ::PSTR, 85 ImageFileName: ::PSTR, 86 ReservedDebugFilePath: ::PSTR, 87 ReservedTimeDateStamp: ::DWORD, 88 ReservedRomImage: ::BOOL, 89 ReservedDebugDirectory: ::PIMAGE_DEBUG_DIRECTORY, 90 ReservedNumberOfDebugDirectories: ::DWORD, 91 ReservedOriginalFunctionTableBaseAddress: ::DWORD, 92 Reserved: [::DWORD; 2], 93 }} 94 #[cfg(target_arch = "x86")] 95 pub type PIMAGE_DEBUG_INFORMATION = *mut IMAGE_DEBUG_INFORMATION; 96 pub type PENUMDIRTREE_CALLBACK = Option<unsafe extern "system" fn( 97 FilePath: ::PCSTR, CallerData: ::PVOID, 98 ) -> ::BOOL>; 99 pub type PENUMDIRTREE_CALLBACKW = Option<unsafe extern "system" fn( 100 FilePath: ::PCWSTR, CallerData: ::PVOID, 101 ) -> ::BOOL>; 102 pub const UNDNAME_COMPLETE: ::DWORD = 0x0000; 103 pub const UNDNAME_NO_LEADING_UNDERSCORES: ::DWORD = 0x0001; 104 pub const UNDNAME_NO_MS_KEYWORDS: ::DWORD = 0x0002; 105 pub const UNDNAME_NO_FUNCTION_RETURNS: ::DWORD = 0x0004; 106 pub const UNDNAME_NO_ALLOCATION_MODEL: ::DWORD = 0x0008; 107 pub const UNDNAME_NO_ALLOCATION_LANGUAGE: ::DWORD = 0x0010; 108 pub const UNDNAME_NO_MS_THISTYPE: ::DWORD = 0x0020; 109 pub const UNDNAME_NO_CV_THISTYPE: ::DWORD = 0x0040; 110 pub const UNDNAME_NO_THISTYPE: ::DWORD = 0x0060; 111 pub const UNDNAME_NO_ACCESS_SPECIFIERS: ::DWORD = 0x0080; 112 pub const UNDNAME_NO_THROW_SIGNATURES: ::DWORD = 0x0100; 113 pub const UNDNAME_NO_MEMBER_TYPE: ::DWORD = 0x0200; 114 pub const UNDNAME_NO_RETURN_UDT_MODEL: ::DWORD = 0x0400; 115 pub const UNDNAME_32_BIT_DECODE: ::DWORD = 0x0800; 116 pub const UNDNAME_NAME_ONLY: ::DWORD = 0x1000; 117 pub const UNDNAME_NO_ARGUMENTS: ::DWORD = 0x2000; 118 pub const UNDNAME_NO_SPECIAL_SYMS: ::DWORD = 0x4000; 119 pub const DBHHEADER_DEBUGDIRS: ::DWORD = 0x1; 120 pub const DBHHEADER_CVMISC: ::DWORD = 0x2; 121 pub const DBHHEADER_PDBGUID: ::DWORD = 0x3; 122 STRUCT!{struct MODLOAD_DATA { 123 ssize: ::DWORD, 124 ssig: ::DWORD, 125 data: ::PVOID, 126 size: ::DWORD, 127 flags: ::DWORD, 128 }} 129 pub type PMODLOAD_DATA = *mut MODLOAD_DATA; 130 STRUCT!{struct MODLOAD_CVMISC { 131 oCV: ::DWORD, 132 cCV: ::size_t, 133 oMisc: ::DWORD, 134 cMisc: ::size_t, 135 dtImage: ::DWORD, 136 cImage: ::DWORD, 137 }} 138 pub type PMODLOAD_CVMISC = *mut MODLOAD_CVMISC; 139 STRUCT!{struct MODLOAD_PDBGUID_PDBAGE { 140 PdbGuid: ::GUID, 141 PdbAge: ::DWORD, 142 }} 143 pub type PMODLOAD_PDBGUID_PDBAGE = *mut MODLOAD_PDBGUID_PDBAGE; 144 ENUM!{enum ADDRESS_MODE { 145 AddrMode1616, 146 AddrMode1632, 147 AddrModeReal, 148 AddrModeFlat, 149 }} 150 STRUCT!{struct ADDRESS64 { 151 Offset: ::DWORD64, 152 Segment: ::WORD, 153 Mode: ::ADDRESS_MODE, 154 }} 155 pub type LPADDRESS64 = *mut ADDRESS64; 156 #[cfg(target_arch = "x86_64")] 157 pub type ADDRESS = ADDRESS64; 158 #[cfg(target_arch = "x86_64")] 159 pub type LPADDRESS = LPADDRESS64; 160 #[cfg(target_arch = "x86")] 161 STRUCT!{struct ADDRESS { 162 Offset: ::DWORD, 163 Segment: ::WORD, 164 Mode: ::ADDRESS_MODE, 165 }} 166 #[cfg(target_arch = "x86")] 167 pub type LPADDRESS = *mut ADDRESS; 168 STRUCT!{struct KDHELP64 { 169 Thread: ::DWORD64, 170 ThCallbackStack: ::DWORD, 171 ThCallbackBStore: ::DWORD, 172 NextCallback: ::DWORD, 173 FramePointer: ::DWORD, 174 KiCallUserMode: ::DWORD64, 175 KeUserCallbackDispatcher: ::DWORD64, 176 SystemRangeStart: ::DWORD64, 177 KiUserExceptionDispatcher: ::DWORD64, 178 StackBase: ::DWORD64, 179 StackLimit: ::DWORD64, 180 BuildVersion: ::DWORD, 181 Reserved0: ::DWORD, 182 Reserved1: [::DWORD64; 4], 183 }} 184 pub type PKDHELP64 = *mut KDHELP64; 185 #[cfg(target_arch = "x86_64")] 186 pub type KDHELP = KDHELP64; 187 #[cfg(target_arch = "x86_64")] 188 pub type PKDHELP = PKDHELP64; 189 #[cfg(target_arch = "x86")] 190 STRUCT!{struct KDHELP { 191 Thread: ::DWORD, 192 ThCallbackStack: ::DWORD, 193 NextCallback: ::DWORD, 194 FramePointer: ::DWORD, 195 KiCallUserMode: ::DWORD, 196 KeUserCallbackDispatcher: ::DWORD, 197 SystemRangeStart: ::DWORD, 198 ThCallbackBStore: ::DWORD, 199 KiUserExceptionDispatcher: ::DWORD, 200 StackBase: ::DWORD, 201 StackLimit: ::DWORD, 202 Reserved: [::DWORD; 5], 203 }} 204 #[cfg(target_arch = "x86")] 205 pub type PKDHELP = *mut KDHELP; 206 STRUCT!{struct STACKFRAME64 { 207 AddrPC: ::ADDRESS64, 208 AddrReturn: ::ADDRESS64, 209 AddrFrame: ::ADDRESS64, 210 AddrStack: ::ADDRESS64, 211 AddrBStore: ::ADDRESS64, 212 FuncTableEntry: ::PVOID, 213 Params: [::DWORD64; 4], 214 Far: ::BOOL, 215 Virtual: ::BOOL, 216 Reserved: [::DWORD64; 3], 217 KdHelp: ::KDHELP64, 218 }} 219 pub type LPSTACKFRAME64 = *mut STACKFRAME64; 220 pub const INLINE_FRAME_CONTEXT_INIT: ::DWORD = 0; 221 pub const INLINE_FRAME_CONTEXT_IGNORE: ::DWORD = 0xFFFFFFFF; 222 STRUCT!{struct STACKFRAME_EX { 223 AddrPC: ::ADDRESS64, 224 AddrReturn: ::ADDRESS64, 225 AddrFrame: ::ADDRESS64, 226 AddrStack: ::ADDRESS64, 227 AddrBStore: ::ADDRESS64, 228 FuncTableEntry: ::PVOID, 229 Params: [::DWORD64; 4], 230 Far: ::BOOL, 231 Virtual: ::BOOL, 232 Reserved: [::DWORD64; 3], 233 KdHelp: ::KDHELP64, 234 StackFrameSize: ::DWORD, 235 InlineFrameContext: ::DWORD, 236 }} 237 pub type LPSTACKFRAME_EX = *mut STACKFRAME_EX; 238 #[cfg(target_arch = "x86_64")] 239 pub type STACKFRAME = STACKFRAME64; 240 #[cfg(target_arch = "x86_64")] 241 pub type LPSTACKFRAME = LPSTACKFRAME64; 242 #[cfg(target_arch = "x86")] 243 STRUCT!{struct STACKFRAME { 244 AddrPC: ::ADDRESS, 245 AddrReturn: ::ADDRESS, 246 AddrFrame: ::ADDRESS, 247 AddrStack: ::ADDRESS, 248 FuncTableEntry: ::PVOID, 249 Params: [::DWORD; 4], 250 Far: ::BOOL, 251 Virtual: ::BOOL, 252 Reserved: [::DWORD; 3], 253 KdHelp: ::KDHELP, 254 AddrBStore: ::ADDRESS, 255 }} 256 #[cfg(target_arch = "x86")] 257 pub type LPSTACKFRAME = *mut STACKFRAME; 258 pub type PREAD_PROCESS_MEMORY_ROUTINE64 = Option<unsafe extern "system" fn( 259 hProcess: ::HANDLE, qwBaseAddress: ::DWORD64, lpBuffer: ::PVOID, nSize: ::DWORD, 260 lpNumberOfBytesRead: ::LPDWORD, 261 ) -> ::BOOL>; 262 pub type PFUNCTION_TABLE_ACCESS_ROUTINE64 = Option<unsafe extern "system" fn( 263 ahProcess: ::HANDLE, AddrBase: ::DWORD64, 264 ) -> ::PVOID>; 265 pub type PGET_MODULE_BASE_ROUTINE64 = Option<unsafe extern "system" fn( 266 hProcess: ::HANDLE, Address: ::DWORD64, 267 ) -> ::DWORD64>; 268 pub type PTRANSLATE_ADDRESS_ROUTINE64 = Option<unsafe extern "system" fn( 269 hProcess: ::HANDLE, hThread: ::HANDLE, lpaddr: LPADDRESS64, 270 ) -> ::DWORD64>; 271 pub const SYM_STKWALK_DEFAULT: ::DWORD = 0x00000000; 272 pub const SYM_STKWALK_FORCE_FRAMEPTR: ::DWORD = 0x00000001; 273 #[cfg(target_arch = "x86_64")] 274 pub type PREAD_PROCESS_MEMORY_ROUTINE = PREAD_PROCESS_MEMORY_ROUTINE64; 275 #[cfg(target_arch = "x86_64")] 276 pub type PFUNCTION_TABLE_ACCESS_ROUTINE = PFUNCTION_TABLE_ACCESS_ROUTINE64; 277 #[cfg(target_arch = "x86_64")] 278 pub type PGET_MODULE_BASE_ROUTINE = PGET_MODULE_BASE_ROUTINE64; 279 #[cfg(target_arch = "x86_64")] 280 pub type PTRANSLATE_ADDRESS_ROUTINE = PTRANSLATE_ADDRESS_ROUTINE64; 281 #[cfg(target_arch = "x86")] 282 pub type PREAD_PROCESS_MEMORY_ROUTINE = Option<unsafe extern "system" fn( 283 hProcess: ::HANDLE, qwBaseAddress: ::DWORD, lpBuffer: ::PVOID, nSize: ::DWORD, 284 lpNumberOfBytesRead: ::PDWORD, 285 ) -> ::BOOL>; 286 #[cfg(target_arch = "x86")] 287 pub type PFUNCTION_TABLE_ACCESS_ROUTINE = Option<unsafe extern "system" fn( 288 ahProcess: ::HANDLE, AddrBase: ::DWORD, 289 ) -> ::PVOID>; 290 #[cfg(target_arch = "x86")] 291 pub type PGET_MODULE_BASE_ROUTINE = Option<unsafe extern "system" fn( 292 hProcess: ::HANDLE, Address: ::DWORD, 293 ) -> ::DWORD>; 294 #[cfg(target_arch = "x86")] 295 pub type PTRANSLATE_ADDRESS_ROUTINE = Option<unsafe extern "system" fn( 296 hProcess: ::HANDLE, hThread: ::HANDLE, lpaddr: LPADDRESS, 297 ) -> ::DWORD>; 298 pub const API_VERSION_NUMBER: ::USHORT = 12; 299 STRUCT!{struct API_VERSION { 300 MajorVersion: ::USHORT, 301 MinorVersion: ::USHORT, 302 Revision: ::USHORT, 303 Reserved: ::USHORT, 304 }} 305 pub type LPAPI_VERSION = *mut API_VERSION; 306 STRUCT!{struct SYMBOL_INFOW { 307 SizeOfStruct: ::ULONG, 308 TypeIndex: ::ULONG, 309 Reserved: [::ULONG64; 2], 310 Index: ::ULONG, 311 Size: ::ULONG, 312 ModBase: ::ULONG64, 313 Flags: ::ULONG, 314 Value: ::ULONG64, 315 Address: ::ULONG64, 316 Register: ::ULONG, 317 Scope: ::ULONG, 318 Tag: ::ULONG, 319 NameLen: ::ULONG, 320 MaxNameLen: ::ULONG, 321 Name: [::WCHAR; 1], 322 }} 323 pub type PSYMBOL_INFOW = *mut SYMBOL_INFOW; 324 STRUCT!{struct IMAGEHLP_SYMBOL64 { 325 SizeOfStruct: ::DWORD, 326 Address: ::DWORD64, 327 Size: ::DWORD, 328 Flags: ::DWORD, 329 MaxNameLength: ::DWORD, 330 Name: [::CHAR; 1], 331 }} 332 pub type PIMAGEHLP_SYMBOL64 = *mut IMAGEHLP_SYMBOL64; 333 STRUCT!{struct IMAGEHLP_LINEW64 { 334 SizeOfStruct: ::DWORD, 335 Key: ::PVOID, 336 LineNumber: ::DWORD, 337 FileName: ::PWSTR, 338 Address: ::DWORD64, 339 }} 340 pub type PIMAGEHLP_LINEW64 = *mut IMAGEHLP_LINEW64; 341