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