1 /*
2 * File dbghelp_private.h - dbghelp internal definitions
3 *
4 * Copyright (C) 1995, Alexandre Julliard
5 * Copyright (C) 1996, Eric Youngdale.
6 * Copyright (C) 1999-2000, Ulrich Weigand.
7 * Copyright (C) 2004-2007, Eric Pouech.
8 *
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
18 *
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24 #pragma once
25
26 #include <stdarg.h>
27
28 #ifndef DBGHELP_STATIC_LIB
29
30 #include "windef.h"
31 #include "winbase.h"
32 #include "winver.h"
33 #include "dbghelp.h"
34 #include "objbase.h"
35 #include "oaidl.h"
36 #include "winnls.h"
37 #include "wine/list.h"
38 #include "wine/rbtree.h"
39
40 #include "cvconst.h"
41
42 #else /* DBGHELP_STATIC_LIB */
43
44 #include <string.h>
45 #include "compat.h"
46 #include <wine/list.h>
47 #include <wine/rbtree.h>
48 #endif /* DBGHELP_STATIC_LIB */
49
50 /* #define USE_STATS */
51
52 struct pool /* poor's man */
53 {
54 struct list arena_list;
55 struct list arena_full;
56 size_t arena_size;
57 };
58
59 void pool_init(struct pool* a, size_t arena_size) DECLSPEC_HIDDEN;
60 void pool_destroy(struct pool* a) DECLSPEC_HIDDEN;
61 void* pool_alloc(struct pool* a, size_t len) DECLSPEC_HIDDEN;
62 char* pool_strdup(struct pool* a, const char* str) DECLSPEC_HIDDEN;
63
64 struct vector
65 {
66 void** buckets;
67 unsigned elt_size;
68 unsigned shift;
69 unsigned num_elts;
70 unsigned num_buckets;
71 unsigned buckets_allocated;
72 };
73
74 void vector_init(struct vector* v, unsigned elt_sz, unsigned bucket_sz) DECLSPEC_HIDDEN;
75 unsigned vector_length(const struct vector* v) DECLSPEC_HIDDEN;
76 void* vector_at(const struct vector* v, unsigned pos) DECLSPEC_HIDDEN;
77 void* vector_add(struct vector* v, struct pool* pool) DECLSPEC_HIDDEN;
78
79 struct sparse_array
80 {
81 struct vector key2index;
82 struct vector elements;
83 };
84
85 void sparse_array_init(struct sparse_array* sa, unsigned elt_sz, unsigned bucket_sz) DECLSPEC_HIDDEN;
86 void* sparse_array_find(const struct sparse_array* sa, ULONG_PTR idx) DECLSPEC_HIDDEN;
87 void* sparse_array_add(struct sparse_array* sa, ULONG_PTR key, struct pool* pool) DECLSPEC_HIDDEN;
88 unsigned sparse_array_length(const struct sparse_array* sa) DECLSPEC_HIDDEN;
89
90 struct hash_table_elt
91 {
92 const char* name;
93 struct hash_table_elt* next;
94 };
95
96 struct hash_table_bucket
97 {
98 struct hash_table_elt* first;
99 struct hash_table_elt* last;
100 };
101
102 struct hash_table
103 {
104 unsigned num_elts;
105 unsigned num_buckets;
106 struct hash_table_bucket* buckets;
107 struct pool* pool;
108 };
109
110 void hash_table_init(struct pool* pool, struct hash_table* ht,
111 unsigned num_buckets) DECLSPEC_HIDDEN;
112 void hash_table_destroy(struct hash_table* ht) DECLSPEC_HIDDEN;
113 void hash_table_add(struct hash_table* ht, struct hash_table_elt* elt) DECLSPEC_HIDDEN;
114
115 struct hash_table_iter
116 {
117 const struct hash_table* ht;
118 struct hash_table_elt* element;
119 int index;
120 int last;
121 };
122
123 void hash_table_iter_init(const struct hash_table* ht,
124 struct hash_table_iter* hti, const char* name) DECLSPEC_HIDDEN;
125 void* hash_table_iter_up(struct hash_table_iter* hti) DECLSPEC_HIDDEN;
126
127
128 extern unsigned dbghelp_options DECLSPEC_HIDDEN;
129 extern BOOL dbghelp_opt_native DECLSPEC_HIDDEN;
130 #ifndef DBGHELP_STATIC_LIB
131 extern SYSTEM_INFO sysinfo DECLSPEC_HIDDEN;
132 #endif
133
134 enum location_kind {loc_error, /* reg is the error code */
135 loc_unavailable, /* location is not available */
136 loc_absolute, /* offset is the location */
137 loc_register, /* reg is the location */
138 loc_regrel, /* [reg+offset] is the location */
139 loc_tlsrel, /* offset is the address of the TLS index */
140 loc_user, /* value is debug information dependent,
141 reg & offset can be used ad libidem */
142 };
143
144 enum location_error {loc_err_internal = -1, /* internal while computing */
145 loc_err_too_complex = -2, /* couldn't compute location (even at runtime) */
146 loc_err_out_of_scope = -3, /* variable isn't available at current address */
147 loc_err_cant_read = -4, /* couldn't read memory at given address */
148 loc_err_no_location = -5, /* likely optimized away (by compiler) */
149 };
150
151 struct location
152 {
153 unsigned kind : 8,
154 reg;
155 ULONG_PTR offset;
156 };
157
158 struct symt
159 {
160 enum SymTagEnum tag;
161 };
162
163 struct symt_ht
164 {
165 struct symt symt;
166 struct hash_table_elt hash_elt; /* if global symbol or type */
167 };
168
169 /* lexical tree */
170 struct symt_block
171 {
172 struct symt symt;
173 ULONG_PTR address;
174 ULONG_PTR size;
175 struct symt* container; /* block, or func */
176 struct vector vchildren; /* sub-blocks & local variables */
177 };
178
179 struct symt_compiland
180 {
181 struct symt symt;
182 ULONG_PTR address;
183 unsigned source;
184 struct vector vchildren; /* global variables & functions */
185 };
186
187 struct symt_data
188 {
189 struct symt symt;
190 struct hash_table_elt hash_elt; /* if global symbol */
191 enum DataKind kind;
192 struct symt* container;
193 struct symt* type;
194 union /* depends on kind */
195 {
196 /* DataIs{Global, FileStatic}:
197 * with loc.kind
198 * loc_absolute loc.offset is address
199 * loc_tlsrel loc.offset is TLS index address
200 * DataIs{Local,Param}:
201 * with loc.kind
202 * loc_absolute not supported
203 * loc_register location is in register loc.reg
204 * loc_regrel location is at address loc.reg + loc.offset
205 * >= loc_user ask debug info provider for resolution
206 */
207 struct location var;
208 /* DataIs{Member} (all values are in bits, not bytes) */
209 struct
210 {
211 LONG_PTR offset;
212 ULONG_PTR length;
213 } member;
214 /* DataIsConstant */
215 VARIANT value;
216 } u;
217 };
218
219 struct symt_function
220 {
221 struct symt symt;
222 struct hash_table_elt hash_elt; /* if global symbol */
223 ULONG_PTR address;
224 struct symt* container; /* compiland */
225 struct symt* type; /* points to function_signature */
226 ULONG_PTR size;
227 struct vector vlines;
228 struct vector vchildren; /* locals, params, blocks, start/end, labels */
229 };
230
231 struct symt_hierarchy_point
232 {
233 struct symt symt; /* either SymTagFunctionDebugStart, SymTagFunctionDebugEnd, SymTagLabel */
234 struct hash_table_elt hash_elt; /* if label (and in compiland's hash table if global) */
235 struct symt* parent; /* symt_function or symt_compiland */
236 struct location loc;
237 };
238
239 struct symt_public
240 {
241 struct symt symt;
242 struct hash_table_elt hash_elt;
243 struct symt* container; /* compiland */
244 BOOL is_function;
245 ULONG_PTR address;
246 ULONG_PTR size;
247 };
248
249 struct symt_thunk
250 {
251 struct symt symt;
252 struct hash_table_elt hash_elt;
253 struct symt* container; /* compiland */
254 ULONG_PTR address;
255 ULONG_PTR size;
256 THUNK_ORDINAL ordinal; /* FIXME: doesn't seem to be accessible */
257 };
258
259 /* class tree */
260 struct symt_array
261 {
262 struct symt symt;
263 int start;
264 int end; /* end index if > 0, or -array_len (in bytes) if < 0 */
265 struct symt* base_type;
266 struct symt* index_type;
267 };
268
269 struct symt_basic
270 {
271 struct symt symt;
272 struct hash_table_elt hash_elt;
273 enum BasicType bt;
274 ULONG_PTR size;
275 };
276
277 struct symt_enum
278 {
279 struct symt symt;
280 struct symt* base_type;
281 const char* name;
282 struct vector vchildren;
283 };
284
285 struct symt_function_signature
286 {
287 struct symt symt;
288 struct symt* rettype;
289 struct vector vchildren;
290 enum CV_call_e call_conv;
291 };
292
293 struct symt_function_arg_type
294 {
295 struct symt symt;
296 struct symt* arg_type;
297 struct symt* container;
298 };
299
300 struct symt_pointer
301 {
302 struct symt symt;
303 struct symt* pointsto;
304 ULONG_PTR size;
305 };
306
307 struct symt_typedef
308 {
309 struct symt symt;
310 struct hash_table_elt hash_elt;
311 struct symt* type;
312 };
313
314 struct symt_udt
315 {
316 struct symt symt;
317 struct hash_table_elt hash_elt;
318 enum UdtKind kind;
319 int size;
320 struct vector vchildren;
321 };
322
323 enum module_type
324 {
325 DMT_UNKNOWN, /* for lookup, not actually used for a module */
326 DMT_ELF, /* a real ELF shared module */
327 DMT_PE, /* a native or builtin PE module */
328 DMT_MACHO, /* a real Mach-O shared module */
329 DMT_PDB, /* .PDB file */
330 DMT_DBG, /* .DBG file */
331 };
332
333 struct process;
334 struct module;
335
336 /* a module can be made of several debug information formats, so we have to
337 * support them all
338 */
339 enum format_info
340 {
341 DFI_ELF,
342 DFI_PE,
343 DFI_MACHO,
344 DFI_DWARF,
345 DFI_PDB,
346 DFI_LAST
347 };
348
349 struct module_format
350 {
351 struct module* module;
352 void (*remove)(struct process* pcs, struct module_format* modfmt);
353 void (*loc_compute)(struct process* pcs,
354 const struct module_format* modfmt,
355 const struct symt_function* func,
356 struct location* loc);
357 union
358 {
359 struct elf_module_info* elf_info;
360 struct dwarf2_module_info_s* dwarf2_info;
361 struct pe_module_info* pe_info;
362 struct macho_module_info* macho_info;
363 struct pdb_module_info* pdb_info;
364 } u;
365 };
366
367 #ifdef __REACTOS__
368 struct symt_idx_to_ptr
369 {
370 struct hash_table_elt hash_elt;
371 DWORD idx;
372 const struct symt *sym;
373 };
374 #endif
375
376 struct module
377 {
378 struct process* process;
379 IMAGEHLP_MODULEW64 module;
380 WCHAR modulename[64]; /* used for enumeration */
381 struct module* next;
382 enum module_type type : 16;
383 unsigned short is_virtual : 1;
384 DWORD64 reloc_delta;
385 WCHAR* real_path;
386
387 /* specific information for debug types */
388 struct module_format* format_info[DFI_LAST];
389
390 /* memory allocation pool */
391 struct pool pool;
392
393 /* symbols & symbol tables */
394 struct vector vsymt;
395 int sortlist_valid;
396 unsigned num_sorttab; /* number of symbols with addresses */
397 unsigned num_symbols;
398 unsigned sorttab_size;
399 struct symt_ht** addr_sorttab;
400 struct hash_table ht_symbols;
401 #ifdef __x86_64__
402 struct hash_table ht_symaddr;
403 #endif
404
405 /* types */
406 struct hash_table ht_types;
407 struct vector vtypes;
408
409 /* source files */
410 unsigned sources_used;
411 unsigned sources_alloc;
412 char* sources;
413 struct wine_rb_tree sources_offsets_tree;
414 };
415
416 typedef BOOL (*enum_modules_cb)(const WCHAR*, ULONG_PTR addr, void* user);
417
418 struct loader_ops
419 {
420 BOOL (*synchronize_module_list)(struct process* process);
421 struct module* (*load_module)(struct process* process, const WCHAR* name, ULONG_PTR addr);
422 BOOL (*load_debug_info)(struct process *process, struct module* module);
423 BOOL (*enum_modules)(struct process* process, enum_modules_cb callback, void* user);
424 BOOL (*fetch_file_info)(struct process* process, const WCHAR* name, ULONG_PTR load_addr, DWORD_PTR* base, DWORD* size, DWORD* checksum);
425 };
426
427 struct process
428 {
429 struct process* next;
430 HANDLE handle;
431 const struct loader_ops* loader;
432 WCHAR* search_path;
433 WCHAR* environment;
434
435 PSYMBOL_REGISTERED_CALLBACK64 reg_cb;
436 PSYMBOL_REGISTERED_CALLBACK reg_cb32;
437 BOOL reg_is_unicode;
438 DWORD64 reg_user;
439
440 struct module* lmodules;
441 ULONG_PTR dbg_hdr_addr;
442
443 IMAGEHLP_STACK_FRAME ctx_frame;
444
445 unsigned buffer_size;
446 void* buffer;
447
448 BOOL is_64bit;
449 };
450
read_process_memory(const struct process * process,UINT64 addr,void * buf,size_t size)451 static inline BOOL read_process_memory(const struct process *process, UINT64 addr, void *buf, size_t size)
452 {
453 return ReadProcessMemory(process->handle, (void*)(UINT_PTR)addr, buf, size, NULL);
454 }
455
456 struct line_info
457 {
458 ULONG_PTR is_first : 1,
459 is_last : 1,
460 is_source_file : 1,
461 line_number;
462 union
463 {
464 ULONG_PTR pc_offset; /* if is_source_file isn't set */
465 unsigned source_file; /* if is_source_file is set */
466 } u;
467 };
468
469 struct module_pair
470 {
471 struct process* pcs;
472 struct module* requested; /* in: to module_get_debug() */
473 struct module* effective; /* out: module with debug info */
474 };
475
476 enum pdb_kind {PDB_JG, PDB_DS};
477
478 struct pdb_lookup
479 {
480 const char* filename;
481 enum pdb_kind kind;
482 DWORD age;
483 DWORD timestamp;
484 GUID guid;
485 };
486
487 struct cpu_stack_walk
488 {
489 HANDLE hProcess;
490 HANDLE hThread;
491 BOOL is32;
492 struct cpu * cpu;
493 union
494 {
495 struct
496 {
497 PREAD_PROCESS_MEMORY_ROUTINE f_read_mem;
498 PTRANSLATE_ADDRESS_ROUTINE f_xlat_adr;
499 PFUNCTION_TABLE_ACCESS_ROUTINE f_tabl_acs;
500 PGET_MODULE_BASE_ROUTINE f_modl_bas;
501 } s32;
502 struct
503 {
504 PREAD_PROCESS_MEMORY_ROUTINE64 f_read_mem;
505 PTRANSLATE_ADDRESS_ROUTINE64 f_xlat_adr;
506 PFUNCTION_TABLE_ACCESS_ROUTINE64 f_tabl_acs;
507 PGET_MODULE_BASE_ROUTINE64 f_modl_bas;
508 } s64;
509 } u;
510 };
511
512 struct dump_memory
513 {
514 ULONG64 base;
515 ULONG size;
516 ULONG rva;
517 };
518
519 struct dump_memory64
520 {
521 ULONG64 base;
522 ULONG64 size;
523 };
524
525 struct dump_module
526 {
527 unsigned is_elf;
528 ULONG64 base;
529 ULONG size;
530 DWORD timestamp;
531 DWORD checksum;
532 WCHAR name[MAX_PATH];
533 };
534
535 struct dump_thread
536 {
537 ULONG tid;
538 ULONG prio_class;
539 ULONG curr_prio;
540 };
541
542 struct dump_context
543 {
544 /* process & thread information */
545 struct process *process;
546 DWORD pid;
547 unsigned flags_out;
548 /* thread information */
549 struct dump_thread* threads;
550 unsigned num_threads;
551 /* module information */
552 struct dump_module* modules;
553 unsigned num_modules;
554 unsigned alloc_modules;
555 /* exception information */
556 /* output information */
557 MINIDUMP_TYPE type;
558 HANDLE hFile;
559 RVA rva;
560 struct dump_memory* mem;
561 unsigned num_mem;
562 unsigned alloc_mem;
563 struct dump_memory64* mem64;
564 unsigned num_mem64;
565 unsigned alloc_mem64;
566 /* callback information */
567 MINIDUMP_CALLBACK_INFORMATION* cb;
568 };
569
570 union ctx
571 {
572 CONTEXT ctx;
573 WOW64_CONTEXT x86;
574 };
575
576 enum cpu_addr {cpu_addr_pc, cpu_addr_stack, cpu_addr_frame};
577 struct cpu
578 {
579 DWORD machine;
580 DWORD word_size;
581 DWORD frame_regno;
582
583 /* address manipulation */
584 BOOL (*get_addr)(HANDLE hThread, const CONTEXT* ctx,
585 enum cpu_addr, ADDRESS64* addr);
586
587 /* stack manipulation */
588 BOOL (*stack_walk)(struct cpu_stack_walk *csw, STACKFRAME64 *frame,
589 union ctx *ctx);
590
591 /* module manipulation */
592 void* (*find_runtime_function)(struct module*, DWORD64 addr);
593
594 /* dwarf dedicated information */
595 unsigned (*map_dwarf_register)(unsigned regno, const struct module* module, BOOL eh_frame);
596
597 /* context related manipulation */
598 void * (*fetch_context_reg)(union ctx *ctx, unsigned regno, unsigned *size);
599 const char* (*fetch_regname)(unsigned regno);
600
601 /* minidump per CPU extension */
602 BOOL (*fetch_minidump_thread)(struct dump_context* dc, unsigned index, unsigned flags, const CONTEXT* ctx);
603 BOOL (*fetch_minidump_module)(struct dump_context* dc, unsigned index, unsigned flags);
604 };
605
606 extern struct cpu* dbghelp_current_cpu DECLSPEC_HIDDEN;
607
608 /* Abbreviated 32-bit PEB */
609 typedef struct _PEB32
610 {
611 BOOLEAN InheritedAddressSpace;
612 BOOLEAN ReadImageFileExecOptions;
613 BOOLEAN BeingDebugged;
614 BOOLEAN SpareBool;
615 DWORD Mutant;
616 DWORD ImageBaseAddress;
617 DWORD LdrData;
618 DWORD ProcessParameters;
619 DWORD SubSystemData;
620 DWORD ProcessHeap;
621 DWORD FastPebLock;
622 DWORD FastPebLockRoutine;
623 DWORD FastPebUnlockRoutine;
624 ULONG EnvironmentUpdateCount;
625 DWORD KernelCallbackTable;
626 ULONG Reserved[2];
627 } PEB32;
628
629 /* dbghelp.c */
630 extern struct process* process_find_by_handle(HANDLE hProcess) DECLSPEC_HIDDEN;
631 extern BOOL validate_addr64(DWORD64 addr) DECLSPEC_HIDDEN;
632 extern BOOL pcs_callback(const struct process* pcs, ULONG action, void* data) DECLSPEC_HIDDEN;
633 extern void* fetch_buffer(struct process* pcs, unsigned size) DECLSPEC_HIDDEN;
634 extern const char* wine_dbgstr_addr(const ADDRESS64* addr) DECLSPEC_HIDDEN;
635 extern struct cpu* cpu_find(DWORD) DECLSPEC_HIDDEN;
636 extern const WCHAR *process_getenv(const struct process *process, const WCHAR *name);
637 extern DWORD calc_crc32(HANDLE handle) DECLSPEC_HIDDEN;
638
639 #ifndef __REACTOS__
640 /* elf_module.c */
641 extern BOOL elf_read_wine_loader_dbg_info(struct process* pcs, ULONG_PTR addr) DECLSPEC_HIDDEN;
642 struct elf_thunk_area;
643 extern int elf_is_in_thunk_area(ULONG_PTR addr, const struct elf_thunk_area* thunks) DECLSPEC_HIDDEN;
644
645 /* macho_module.c */
646 extern BOOL macho_read_wine_loader_dbg_info(struct process* pcs, ULONG_PTR addr) DECLSPEC_HIDDEN;
647 #else
648 struct elf_thunk_area;
649 #endif
650
651 /* minidump.c */
652 void minidump_add_memory_block(struct dump_context* dc, ULONG64 base, ULONG size, ULONG rva) DECLSPEC_HIDDEN;
653
654 /* module.c */
655 extern const WCHAR S_ElfW[] DECLSPEC_HIDDEN;
656 extern const WCHAR S_WineLoaderW[] DECLSPEC_HIDDEN;
657 extern const WCHAR S_SlashW[] DECLSPEC_HIDDEN;
658 extern const struct loader_ops no_loader_ops DECLSPEC_HIDDEN;
659
660 extern struct module*
661 module_find_by_addr(const struct process* pcs, DWORD64 addr,
662 enum module_type type) DECLSPEC_HIDDEN;
663 extern struct module*
664 module_find_by_nameW(const struct process* pcs,
665 const WCHAR* name) DECLSPEC_HIDDEN;
666 extern struct module*
667 module_find_by_nameA(const struct process* pcs,
668 const char* name) DECLSPEC_HIDDEN;
669 extern struct module*
670 module_is_already_loaded(const struct process* pcs,
671 const WCHAR* imgname) DECLSPEC_HIDDEN;
672 extern BOOL module_get_debug(struct module_pair*) DECLSPEC_HIDDEN;
673 extern struct module*
674 module_new(struct process* pcs, const WCHAR* name,
675 enum module_type type, BOOL virtual,
676 DWORD64 addr, DWORD64 size,
677 ULONG_PTR stamp, ULONG_PTR checksum) DECLSPEC_HIDDEN;
678 extern struct module*
679 module_get_containee(const struct process* pcs,
680 const struct module* inner) DECLSPEC_HIDDEN;
681 extern void module_reset_debug_info(struct module* module) DECLSPEC_HIDDEN;
682 extern BOOL module_remove(struct process* pcs,
683 struct module* module) DECLSPEC_HIDDEN;
684 extern void module_set_module(struct module* module, const WCHAR* name) DECLSPEC_HIDDEN;
685 #ifndef __REACTOS__
686 extern WCHAR * get_wine_loader_name(struct process *pcs) DECLSPEC_HIDDEN;
687 #endif
688
689 /* msc.c */
690 extern BOOL pe_load_debug_directory(const struct process* pcs,
691 struct module* module,
692 const BYTE* mapping,
693 const IMAGE_SECTION_HEADER* sectp, DWORD nsect,
694 const IMAGE_DEBUG_DIRECTORY* dbg, int nDbg) DECLSPEC_HIDDEN;
695 extern BOOL pdb_fetch_file_info(const struct pdb_lookup* pdb_lookup, unsigned* matched) DECLSPEC_HIDDEN;
696 struct pdb_cmd_pair {
697 const char* name;
698 DWORD* pvalue;
699 };
700 extern BOOL pdb_virtual_unwind(struct cpu_stack_walk *csw, DWORD_PTR ip,
701 union ctx *context, struct pdb_cmd_pair *cpair) DECLSPEC_HIDDEN;
702
703 /* path.c */
704 extern BOOL path_find_symbol_file(const struct process* pcs, const struct module* module,
705 PCSTR full_path, enum module_type type, const GUID* guid, DWORD dw1, DWORD dw2,
706 WCHAR *buffer, BOOL* is_unmatched) DECLSPEC_HIDDEN;
707 extern WCHAR *get_dos_file_name(const WCHAR *filename) DECLSPEC_HIDDEN;
708 extern BOOL search_dll_path(const struct process* process, const WCHAR *name,
709 BOOL (*match)(void*, HANDLE, const WCHAR*), void *param) DECLSPEC_HIDDEN;
710 extern BOOL search_unix_path(const WCHAR *name, const WCHAR *path, BOOL (*match)(void*, HANDLE, const WCHAR*), void *param) DECLSPEC_HIDDEN;
711 extern const WCHAR* file_name(const WCHAR* str) DECLSPEC_HIDDEN;
712 extern const char* file_nameA(const char* str) DECLSPEC_HIDDEN;
713
714 /* pe_module.c */
715 extern BOOL pe_load_nt_header(HANDLE hProc, DWORD64 base, IMAGE_NT_HEADERS* nth) DECLSPEC_HIDDEN;
716 extern struct module*
717 pe_load_native_module(struct process* pcs, const WCHAR* name,
718 HANDLE hFile, DWORD64 base, DWORD size) DECLSPEC_HIDDEN;
719 extern struct module*
720 pe_load_builtin_module(struct process* pcs, const WCHAR* name,
721 DWORD64 base, DWORD64 size) DECLSPEC_HIDDEN;
722 extern BOOL pe_load_debug_info(const struct process* pcs,
723 struct module* module) DECLSPEC_HIDDEN;
724 extern const char* pe_map_directory(struct module* module, int dirno, DWORD* size) DECLSPEC_HIDDEN;
725
726 /* source.c */
727 extern unsigned source_new(struct module* module, const char* basedir, const char* source) DECLSPEC_HIDDEN;
728 extern const char* source_get(const struct module* module, unsigned idx) DECLSPEC_HIDDEN;
729 extern int source_rb_compare(const void *key, const struct wine_rb_entry *entry) DECLSPEC_HIDDEN;
730
731 /* stabs.c */
732 typedef void (*stabs_def_cb)(struct module* module, ULONG_PTR load_offset,
733 const char* name, ULONG_PTR offset,
734 BOOL is_public, BOOL is_global, unsigned char other,
735 struct symt_compiland* compiland, void* user);
736 extern BOOL stabs_parse(struct module* module, ULONG_PTR load_offset,
737 const char* stabs, size_t nstab, size_t stabsize,
738 const char* strs, int strtablen,
739 stabs_def_cb callback, void* user) DECLSPEC_HIDDEN;
740
741 /* dwarf.c */
742 struct image_file_map;
743 extern BOOL dwarf2_parse(struct module* module, ULONG_PTR load_offset,
744 const struct elf_thunk_area* thunks,
745 struct image_file_map* fmap) DECLSPEC_HIDDEN;
746 extern BOOL dwarf2_virtual_unwind(struct cpu_stack_walk *csw, DWORD_PTR ip,
747 union ctx *ctx, DWORD64 *cfa) DECLSPEC_HIDDEN;
748
749 /* rsym.c */
750 extern BOOL rsym_parse(struct module* module, unsigned long load_offset,
751 const void* rsym, int rsymlen) DECLSPEC_HIDDEN;
752
753
754
755 /* stack.c */
756 #ifndef DBGHELP_STATIC_LIB
757 extern BOOL sw_read_mem(struct cpu_stack_walk* csw, DWORD64 addr, void* ptr, DWORD sz) DECLSPEC_HIDDEN;
758 #endif
759 extern DWORD64 sw_xlat_addr(struct cpu_stack_walk* csw, ADDRESS64* addr) DECLSPEC_HIDDEN;
760 extern void* sw_table_access(struct cpu_stack_walk* csw, DWORD64 addr) DECLSPEC_HIDDEN;
761 extern DWORD64 sw_module_base(struct cpu_stack_walk* csw, DWORD64 addr) DECLSPEC_HIDDEN;
762
763 /* symbol.c */
764 extern const char* symt_get_name(const struct symt* sym) DECLSPEC_HIDDEN;
765 extern WCHAR* symt_get_nameW(const struct symt* sym) DECLSPEC_HIDDEN;
766 extern BOOL symt_get_address(const struct symt* type, ULONG64* addr) DECLSPEC_HIDDEN;
767 extern int __cdecl symt_cmp_addr(const void* p1, const void* p2) DECLSPEC_HIDDEN;
768 extern void copy_symbolW(SYMBOL_INFOW* siw, const SYMBOL_INFO* si) DECLSPEC_HIDDEN;
769 extern struct symt_ht*
770 symt_find_nearest(struct module* module, DWORD_PTR addr) DECLSPEC_HIDDEN;
771 extern struct symt_compiland*
772 symt_new_compiland(struct module* module, ULONG_PTR address,
773 unsigned src_idx) DECLSPEC_HIDDEN;
774 extern struct symt_public*
775 symt_new_public(struct module* module,
776 struct symt_compiland* parent,
777 const char* typename,
778 BOOL is_function,
779 ULONG_PTR address,
780 unsigned size) DECLSPEC_HIDDEN;
781 extern struct symt_data*
782 symt_new_global_variable(struct module* module,
783 struct symt_compiland* parent,
784 const char* name, unsigned is_static,
785 struct location loc, ULONG_PTR size,
786 struct symt* type) DECLSPEC_HIDDEN;
787 extern struct symt_function*
788 symt_new_function(struct module* module,
789 struct symt_compiland* parent,
790 const char* name,
791 ULONG_PTR addr, ULONG_PTR size,
792 struct symt* type) DECLSPEC_HIDDEN;
793 extern BOOL symt_normalize_function(struct module* module,
794 const struct symt_function* func) DECLSPEC_HIDDEN;
795 extern void symt_add_func_line(struct module* module,
796 struct symt_function* func,
797 unsigned source_idx, int line_num,
798 ULONG_PTR offset) DECLSPEC_HIDDEN;
799 extern struct symt_data*
800 symt_add_func_local(struct module* module,
801 struct symt_function* func,
802 enum DataKind dt, const struct location* loc,
803 struct symt_block* block,
804 struct symt* type, const char* name) DECLSPEC_HIDDEN;
805 extern struct symt_block*
806 symt_open_func_block(struct module* module,
807 struct symt_function* func,
808 struct symt_block* block,
809 unsigned pc, unsigned len) DECLSPEC_HIDDEN;
810 extern struct symt_block*
811 symt_close_func_block(struct module* module,
812 const struct symt_function* func,
813 struct symt_block* block, unsigned pc) DECLSPEC_HIDDEN;
814 extern struct symt_hierarchy_point*
815 symt_add_function_point(struct module* module,
816 struct symt_function* func,
817 enum SymTagEnum point,
818 const struct location* loc,
819 const char* name) DECLSPEC_HIDDEN;
820 extern BOOL symt_fill_func_line_info(const struct module* module,
821 const struct symt_function* func,
822 DWORD64 addr, IMAGEHLP_LINE64* line) DECLSPEC_HIDDEN;
823 extern BOOL symt_get_func_line_next(const struct module* module, PIMAGEHLP_LINE64 line) DECLSPEC_HIDDEN;
824 extern struct symt_thunk*
825 symt_new_thunk(struct module* module,
826 struct symt_compiland* parent,
827 const char* name, THUNK_ORDINAL ord,
828 ULONG_PTR addr, ULONG_PTR size) DECLSPEC_HIDDEN;
829 extern struct symt_data*
830 symt_new_constant(struct module* module,
831 struct symt_compiland* parent,
832 const char* name, struct symt* type,
833 const VARIANT* v) DECLSPEC_HIDDEN;
834 extern struct symt_hierarchy_point*
835 symt_new_label(struct module* module,
836 struct symt_compiland* compiland,
837 const char* name, ULONG_PTR address) DECLSPEC_HIDDEN;
838 extern struct symt* symt_index2ptr(struct module* module, DWORD id) DECLSPEC_HIDDEN;
839 extern DWORD symt_ptr2index(struct module* module, const struct symt* sym) DECLSPEC_HIDDEN;
840
841 /* type.c */
842 extern void symt_init_basic(struct module* module) DECLSPEC_HIDDEN;
843 extern BOOL symt_get_info(struct module* module, const struct symt* type,
844 IMAGEHLP_SYMBOL_TYPE_INFO req, void* pInfo) DECLSPEC_HIDDEN;
845 extern struct symt_basic*
846 symt_new_basic(struct module* module, enum BasicType,
847 const char* typename, unsigned size) DECLSPEC_HIDDEN;
848 extern struct symt_udt*
849 symt_new_udt(struct module* module, const char* typename,
850 unsigned size, enum UdtKind kind) DECLSPEC_HIDDEN;
851 extern BOOL symt_set_udt_size(struct module* module,
852 struct symt_udt* type, unsigned size) DECLSPEC_HIDDEN;
853 extern BOOL symt_add_udt_element(struct module* module,
854 struct symt_udt* udt_type,
855 const char* name,
856 struct symt* elt_type, unsigned offset,
857 unsigned size) DECLSPEC_HIDDEN;
858 extern struct symt_enum*
859 symt_new_enum(struct module* module, const char* typename,
860 struct symt* basetype) DECLSPEC_HIDDEN;
861 extern BOOL symt_add_enum_element(struct module* module,
862 struct symt_enum* enum_type,
863 const char* name, int value) DECLSPEC_HIDDEN;
864 extern struct symt_array*
865 symt_new_array(struct module* module, int min, int max,
866 struct symt* base, struct symt* index) DECLSPEC_HIDDEN;
867 extern struct symt_function_signature*
868 symt_new_function_signature(struct module* module,
869 struct symt* ret_type,
870 enum CV_call_e call_conv) DECLSPEC_HIDDEN;
871 extern BOOL symt_add_function_signature_parameter(struct module* module,
872 struct symt_function_signature* sig,
873 struct symt* param) DECLSPEC_HIDDEN;
874 extern struct symt_pointer*
875 symt_new_pointer(struct module* module,
876 struct symt* ref_type,
877 ULONG_PTR size) DECLSPEC_HIDDEN;
878 extern struct symt_typedef*
879 symt_new_typedef(struct module* module, struct symt* ref,
880 const char* name) DECLSPEC_HIDDEN;
881