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