d6b2bbe075e369f4588c7fb17c2ae5fe584231db
[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 #ifndef _DBGHELP_PRIVATE_H_
25 #define _DBGHELP_PRIVATE_H_
26
27 #include <config.h>
28
29 #include <assert.h>
30 #include <stdio.h>
31
32 #ifdef HAVE_SYS_MMAN_H
33 # include <sys/mman.h>
34 #endif
35 #ifdef HAVE_SYS_STAT_H
36 # include <sys/stat.h>
37 #endif
38 #ifdef HAVE_UNISTD_H
39 # include <unistd.h>
40 #endif
41
42 #define _INC_WINDOWS
43 #define COM_NO_WINDOWS_H
44
45 #define NONAMELESSUNION
46 #define NONAMELESSSTRUCT
47
48 #ifndef DBGHELP_STATIC_LIB
49
50 #include <wine/port.h>
51
52 #include <ntstatus.h>
53 #define WIN32_NO_STATUS
54 #include <windef.h>
55 #include <winbase.h>
56 #include <winver.h>
57 #include <winternl.h>
58 #include <dbghelp.h>
59 #include <objbase.h>
60 #include <cvconst.h>
61 #include <psapi.h>
62
63 #include <wine/debug.h>
64 #include <wine/mscvpdb.h>
65 #include <wine/unicode.h>
66
67 #else /* DBGHELP_STATIC_LIB */
68
69 #include <string.h>
70 #include "compat.h"
71
72 #endif /* DBGHELP_STATIC_LIB */
73
74 #include <wine/list.h>
75 #include <wine/rbtree.h>
76
77 /* #define USE_STATS */
78
79 struct pool /* poor's man */
80 {
81 struct list arena_list;
82 struct list arena_full;
83 size_t arena_size;
84 };
85
86 void pool_init(struct pool* a, size_t arena_size) DECLSPEC_HIDDEN;
87 void pool_destroy(struct pool* a) DECLSPEC_HIDDEN;
88 void* pool_alloc(struct pool* a, size_t len) DECLSPEC_HIDDEN;
89 char* pool_strdup(struct pool* a, const char* str) DECLSPEC_HIDDEN;
90
91 struct vector
92 {
93 void** buckets;
94 unsigned elt_size;
95 unsigned shift;
96 unsigned num_elts;
97 unsigned num_buckets;
98 unsigned buckets_allocated;
99 };
100
101 void vector_init(struct vector* v, unsigned elt_sz, unsigned bucket_sz) DECLSPEC_HIDDEN;
102 unsigned vector_length(const struct vector* v) DECLSPEC_HIDDEN;
103 void* vector_at(const struct vector* v, unsigned pos) DECLSPEC_HIDDEN;
104 void* vector_add(struct vector* v, struct pool* pool) DECLSPEC_HIDDEN;
105
106 struct sparse_array
107 {
108 struct vector key2index;
109 struct vector elements;
110 };
111
112 void sparse_array_init(struct sparse_array* sa, unsigned elt_sz, unsigned bucket_sz) DECLSPEC_HIDDEN;
113 void* sparse_array_find(const struct sparse_array* sa, unsigned long idx) DECLSPEC_HIDDEN;
114 void* sparse_array_add(struct sparse_array* sa, unsigned long key, struct pool* pool) DECLSPEC_HIDDEN;
115 unsigned sparse_array_length(const struct sparse_array* sa) DECLSPEC_HIDDEN;
116
117 struct hash_table_elt
118 {
119 const char* name;
120 struct hash_table_elt* next;
121 };
122
123 struct hash_table_bucket
124 {
125 struct hash_table_elt* first;
126 struct hash_table_elt* last;
127 };
128
129 struct hash_table
130 {
131 unsigned num_elts;
132 unsigned num_buckets;
133 struct hash_table_bucket* buckets;
134 struct pool* pool;
135 };
136
137 void hash_table_init(struct pool* pool, struct hash_table* ht,
138 unsigned num_buckets) DECLSPEC_HIDDEN;
139 void hash_table_destroy(struct hash_table* ht) DECLSPEC_HIDDEN;
140 void hash_table_add(struct hash_table* ht, struct hash_table_elt* elt) DECLSPEC_HIDDEN;
141
142 struct hash_table_iter
143 {
144 const struct hash_table* ht;
145 struct hash_table_elt* element;
146 int index;
147 int last;
148 };
149
150 void hash_table_iter_init(const struct hash_table* ht,
151 struct hash_table_iter* hti, const char* name) DECLSPEC_HIDDEN;
152 void* hash_table_iter_up(struct hash_table_iter* hti) DECLSPEC_HIDDEN;
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 #ifdef __REACTOS__
392 struct symt_idx_to_ptr
393 {
394 struct hash_table_elt hash_elt;
395 DWORD idx;
396 const struct symt *sym;
397 };
398 #endif
399
400 struct module
401 {
402 struct process* process;
403 IMAGEHLP_MODULEW64 module;
404 struct module* next;
405 enum module_type type : 16;
406 unsigned short is_virtual : 1;
407 DWORD64 reloc_delta;
408
409 /* specific information for debug types */
410 struct module_format* format_info[DFI_LAST];
411
412 /* memory allocation pool */
413 struct pool pool;
414
415 /* symbols & symbol tables */
416 struct vector vsymt;
417 int sortlist_valid;
418 unsigned num_sorttab; /* number of symbols with addresses */
419 unsigned num_symbols;
420 unsigned sorttab_size;
421 struct symt_ht** addr_sorttab;
422 struct hash_table ht_symbols;
423 #ifdef __x86_64__
424 struct hash_table ht_symaddr;
425 #endif
426
427 /* types */
428 struct hash_table ht_types;
429 struct vector vtypes;
430
431 /* source files */
432 unsigned sources_used;
433 unsigned sources_alloc;
434 char* sources;
435 struct wine_rb_tree sources_offsets_tree;
436 };
437
438 struct process
439 {
440 struct process* next;
441 HANDLE handle;
442 WCHAR* search_path;
443
444 PSYMBOL_REGISTERED_CALLBACK64 reg_cb;
445 PSYMBOL_REGISTERED_CALLBACK reg_cb32;
446 BOOL reg_is_unicode;
447 DWORD64 reg_user;
448
449 struct module* lmodules;
450 unsigned long dbg_hdr_addr;
451
452 IMAGEHLP_STACK_FRAME ctx_frame;
453
454 unsigned buffer_size;
455 void* buffer;
456 };
457
458 struct line_info
459 {
460 unsigned long is_first : 1,
461 is_last : 1,
462 is_source_file : 1,
463 line_number;
464 union
465 {
466 unsigned long pc_offset; /* if is_source_file isn't set */
467 unsigned source_file; /* if is_source_file is set */
468 } u;
469 };
470
471 struct module_pair
472 {
473 struct process* pcs;
474 struct module* requested; /* in: to module_get_debug() */
475 struct module* effective; /* out: module with debug info */
476 };
477
478 enum pdb_kind {PDB_JG, PDB_DS};
479
480 struct pdb_lookup
481 {
482 const char* filename;
483 enum pdb_kind kind;
484 DWORD age;
485 DWORD timestamp;
486 GUID guid;
487 };
488
489 struct cpu_stack_walk
490 {
491 HANDLE hProcess;
492 HANDLE hThread;
493 BOOL is32;
494 union
495 {
496 struct
497 {
498 PREAD_PROCESS_MEMORY_ROUTINE f_read_mem;
499 PTRANSLATE_ADDRESS_ROUTINE f_xlat_adr;
500 PFUNCTION_TABLE_ACCESS_ROUTINE f_tabl_acs;
501 PGET_MODULE_BASE_ROUTINE f_modl_bas;
502 } s32;
503 struct
504 {
505 PREAD_PROCESS_MEMORY_ROUTINE64 f_read_mem;
506 PTRANSLATE_ADDRESS_ROUTINE64 f_xlat_adr;
507 PFUNCTION_TABLE_ACCESS_ROUTINE64 f_tabl_acs;
508 PGET_MODULE_BASE_ROUTINE64 f_modl_bas;
509 } s64;
510 } u;
511 };
512
513 struct dump_memory
514 {
515 ULONG64 base;
516 ULONG size;
517 ULONG rva;
518 };
519
520 struct dump_module
521 {
522 unsigned is_elf;
523 ULONG64 base;
524 ULONG size;
525 DWORD timestamp;
526 DWORD checksum;
527 WCHAR name[MAX_PATH];
528 };
529
530 struct dump_thread
531 {
532 ULONG tid;
533 ULONG prio_class;
534 ULONG curr_prio;
535 };
536
537 struct dump_context
538 {
539 /* process & thread information */
540 HANDLE hProcess;
541 DWORD pid;
542 unsigned flags_out;
543 /* thread information */
544 struct dump_thread* threads;
545 unsigned num_threads;
546 /* module information */
547 struct dump_module* modules;
548 unsigned num_modules;
549 unsigned alloc_modules;
550 /* exception information */
551 /* output information */
552 MINIDUMP_TYPE type;
553 HANDLE hFile;
554 RVA rva;
555 struct dump_memory* mem;
556 unsigned num_mem;
557 unsigned alloc_mem;
558 /* callback information */
559 MINIDUMP_CALLBACK_INFORMATION* cb;
560 };
561
562 enum cpu_addr {cpu_addr_pc, cpu_addr_stack, cpu_addr_frame};
563 struct cpu
564 {
565 DWORD machine;
566 DWORD word_size;
567 DWORD frame_regno;
568
569 /* address manipulation */
570 BOOL (*get_addr)(HANDLE hThread, const CONTEXT* ctx,
571 enum cpu_addr, ADDRESS64* addr);
572
573 /* stack manipulation */
574 BOOL (*stack_walk)(struct cpu_stack_walk* csw, LPSTACKFRAME64 frame, CONTEXT* context);
575
576 /* module manipulation */
577 void* (*find_runtime_function)(struct module*, DWORD64 addr);
578
579 /* dwarf dedicated information */
580 unsigned (*map_dwarf_register)(unsigned regno, BOOL eh_frame);
581
582 /* context related manipulation */
583 void* (*fetch_context_reg)(CONTEXT* context, unsigned regno, unsigned* size);
584 const char* (*fetch_regname)(unsigned regno);
585
586 /* minidump per CPU extension */
587 BOOL (*fetch_minidump_thread)(struct dump_context* dc, unsigned index, unsigned flags, const CONTEXT* ctx);
588 BOOL (*fetch_minidump_module)(struct dump_context* dc, unsigned index, unsigned flags);
589 };
590
591 extern struct cpu* dbghelp_current_cpu DECLSPEC_HIDDEN;
592
593 /* dbghelp.c */
594 extern struct process* process_find_by_handle(HANDLE hProcess) 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 extern BOOL macho_enum_modules(HANDLE hProc, enum_modules_cb, void*) DECLSPEC_HIDDEN;
620 extern BOOL macho_fetch_file_info(HANDLE process, const WCHAR* name, unsigned long load_addr, DWORD_PTR* base, DWORD* size, DWORD* checksum) DECLSPEC_HIDDEN;
621 extern BOOL macho_load_debug_info(struct module* module) DECLSPEC_HIDDEN;
622 extern struct module*
623 macho_load_module(struct process* pcs, const WCHAR* name, unsigned long) DECLSPEC_HIDDEN;
624 extern BOOL macho_read_wine_loader_dbg_info(struct process* pcs) DECLSPEC_HIDDEN;
625 extern BOOL macho_synchronize_module_list(struct process* pcs) DECLSPEC_HIDDEN;
626
627 /* minidump.c */
628 void minidump_add_memory_block(struct dump_context* dc, ULONG64 base, ULONG size, ULONG rva) DECLSPEC_HIDDEN;
629
630 /* module.c */
631 extern const WCHAR S_ElfW[] DECLSPEC_HIDDEN;
632 extern const WCHAR S_WineLoaderW[] DECLSPEC_HIDDEN;
633 extern const WCHAR S_SlashW[] DECLSPEC_HIDDEN;
634
635 extern struct module*
636 module_find_by_addr(const struct process* pcs, DWORD64 addr,
637 enum module_type type) DECLSPEC_HIDDEN;
638 extern struct module*
639 module_find_by_nameW(const struct process* pcs,
640 const WCHAR* name) DECLSPEC_HIDDEN;
641 extern struct module*
642 module_find_by_nameA(const struct process* pcs,
643 const char* name) DECLSPEC_HIDDEN;
644 extern struct module*
645 module_is_already_loaded(const struct process* pcs,
646 const WCHAR* imgname) DECLSPEC_HIDDEN;
647 extern BOOL module_get_debug(struct module_pair*) DECLSPEC_HIDDEN;
648 extern struct module*
649 module_new(struct process* pcs, const WCHAR* name,
650 enum module_type type, BOOL virtual,
651 DWORD64 addr, DWORD64 size,
652 unsigned long stamp, unsigned long checksum) DECLSPEC_HIDDEN;
653 extern struct module*
654 module_get_containee(const struct process* pcs,
655 const struct module* inner) DECLSPEC_HIDDEN;
656 extern enum module_type
657 module_get_type_by_name(const WCHAR* name) DECLSPEC_HIDDEN;
658 extern void module_reset_debug_info(struct module* module) DECLSPEC_HIDDEN;
659 extern BOOL module_remove(struct process* pcs,
660 struct module* module) DECLSPEC_HIDDEN;
661 extern void module_set_module(struct module* module, const WCHAR* name) DECLSPEC_HIDDEN;
662 extern const WCHAR *get_wine_loader_name(void) DECLSPEC_HIDDEN;
663
664 /* msc.c */
665 extern BOOL pe_load_debug_directory(const struct process* pcs,
666 struct module* module,
667 const BYTE* mapping,
668 const IMAGE_SECTION_HEADER* sectp, DWORD nsect,
669 const IMAGE_DEBUG_DIRECTORY* dbg, int nDbg) DECLSPEC_HIDDEN;
670 extern BOOL pdb_fetch_file_info(const struct pdb_lookup* pdb_lookup, unsigned* matched) DECLSPEC_HIDDEN;
671 struct pdb_cmd_pair {
672 const char* name;
673 DWORD* pvalue;
674 };
675 extern BOOL pdb_virtual_unwind(struct cpu_stack_walk* csw, DWORD_PTR ip,
676 CONTEXT* context, struct pdb_cmd_pair* cpair) DECLSPEC_HIDDEN;
677
678 /* path.c */
679 extern BOOL path_find_symbol_file(const struct process* pcs, PCSTR full_path,
680 const GUID* guid, DWORD dw1, DWORD dw2, PSTR buffer,
681 BOOL* is_unmatched) DECLSPEC_HIDDEN;
682
683 /* pe_module.c */
684 extern BOOL pe_load_nt_header(HANDLE hProc, DWORD64 base, IMAGE_NT_HEADERS* nth) DECLSPEC_HIDDEN;
685 extern struct module*
686 pe_load_native_module(struct process* pcs, const WCHAR* name,
687 HANDLE hFile, DWORD64 base, DWORD size) DECLSPEC_HIDDEN;
688 extern struct module*
689 pe_load_builtin_module(struct process* pcs, const WCHAR* name,
690 DWORD64 base, DWORD64 size) DECLSPEC_HIDDEN;
691 extern BOOL pe_load_debug_info(const struct process* pcs,
692 struct module* module) DECLSPEC_HIDDEN;
693 extern const char* pe_map_directory(struct module* module, int dirno, DWORD* size) DECLSPEC_HIDDEN;
694
695 /* source.c */
696 extern unsigned source_new(struct module* module, const char* basedir, const char* source) DECLSPEC_HIDDEN;
697 extern const char* source_get(const struct module* module, unsigned idx) DECLSPEC_HIDDEN;
698 extern int source_rb_compare(const void *key, const struct wine_rb_entry *entry) DECLSPEC_HIDDEN;
699
700 /* stabs.c */
701 typedef void (*stabs_def_cb)(struct module* module, unsigned long load_offset,
702 const char* name, unsigned long offset,
703 BOOL is_public, BOOL is_global, unsigned char other,
704 struct symt_compiland* compiland, void* user);
705 extern BOOL stabs_parse(struct module* module, unsigned long load_offset,
706 const void* stabs, int stablen,
707 const char* strs, int strtablen,
708 stabs_def_cb callback, void* user) DECLSPEC_HIDDEN;
709
710 /* dwarf.c */
711 extern BOOL dwarf2_parse(struct module* module, unsigned long load_offset,
712 const struct elf_thunk_area* thunks,
713 struct image_file_map* fmap) DECLSPEC_HIDDEN;
714 extern BOOL dwarf2_virtual_unwind(struct cpu_stack_walk* csw, DWORD_PTR ip,
715 CONTEXT* context, ULONG_PTR* cfa) DECLSPEC_HIDDEN;
716
717 /* rsym.c */
718 extern BOOL rsym_parse(struct module* module, unsigned long load_offset,
719 const void* rsym, int rsymlen) DECLSPEC_HIDDEN;
720
721
722
723 /* stack.c */
724 #ifndef DBGHELP_STATIC_LIB
725 extern BOOL sw_read_mem(struct cpu_stack_walk* csw, DWORD64 addr, void* ptr, DWORD sz) DECLSPEC_HIDDEN;
726 #endif
727 extern DWORD64 sw_xlat_addr(struct cpu_stack_walk* csw, ADDRESS64* addr) DECLSPEC_HIDDEN;
728 extern void* sw_table_access(struct cpu_stack_walk* csw, DWORD64 addr) DECLSPEC_HIDDEN;
729 extern DWORD64 sw_module_base(struct cpu_stack_walk* csw, DWORD64 addr) DECLSPEC_HIDDEN;
730
731 /* symbol.c */
732 extern const char* symt_get_name(const struct symt* sym) DECLSPEC_HIDDEN;
733 extern WCHAR* symt_get_nameW(const struct symt* sym) DECLSPEC_HIDDEN;
734 extern BOOL symt_get_address(const struct symt* type, ULONG64* addr) DECLSPEC_HIDDEN;
735 extern int symt_cmp_addr(const void* p1, const void* p2) DECLSPEC_HIDDEN;
736 extern void copy_symbolW(SYMBOL_INFOW* siw, const SYMBOL_INFO* si) DECLSPEC_HIDDEN;
737 extern struct symt_ht*
738 symt_find_nearest(struct module* module, DWORD_PTR addr) DECLSPEC_HIDDEN;
739 extern struct symt_compiland*
740 symt_new_compiland(struct module* module, unsigned long address,
741 unsigned src_idx) DECLSPEC_HIDDEN;
742 extern struct symt_public*
743 symt_new_public(struct module* module,
744 struct symt_compiland* parent,
745 const char* typename,
746 unsigned long address, unsigned size) DECLSPEC_HIDDEN;
747 extern struct symt_data*
748 symt_new_global_variable(struct module* module,
749 struct symt_compiland* parent,
750 const char* name, unsigned is_static,
751 struct location loc, unsigned long size,
752 struct symt* type) DECLSPEC_HIDDEN;
753 extern struct symt_function*
754 symt_new_function(struct module* module,
755 struct symt_compiland* parent,
756 const char* name,
757 unsigned long addr, unsigned long size,
758 struct symt* type) DECLSPEC_HIDDEN;
759 extern BOOL symt_normalize_function(struct module* module,
760 const struct symt_function* func) DECLSPEC_HIDDEN;
761 extern void symt_add_func_line(struct module* module,
762 struct symt_function* func,
763 unsigned source_idx, int line_num,
764 unsigned long offset) DECLSPEC_HIDDEN;
765 extern struct symt_data*
766 symt_add_func_local(struct module* module,
767 struct symt_function* func,
768 enum DataKind dt, const struct location* loc,
769 struct symt_block* block,
770 struct symt* type, const char* name) DECLSPEC_HIDDEN;
771 extern struct symt_block*
772 symt_open_func_block(struct module* module,
773 struct symt_function* func,
774 struct symt_block* block,
775 unsigned pc, unsigned len) DECLSPEC_HIDDEN;
776 extern struct symt_block*
777 symt_close_func_block(struct module* module,
778 const struct symt_function* func,
779 struct symt_block* block, unsigned pc) DECLSPEC_HIDDEN;
780 extern struct symt_hierarchy_point*
781 symt_add_function_point(struct module* module,
782 struct symt_function* func,
783 enum SymTagEnum point,
784 const struct location* loc,
785 const char* name) DECLSPEC_HIDDEN;
786 extern BOOL symt_fill_func_line_info(const struct module* module,
787 const struct symt_function* func,
788 DWORD64 addr, IMAGEHLP_LINE64* line) DECLSPEC_HIDDEN;
789 extern BOOL symt_get_func_line_next(const struct module* module, PIMAGEHLP_LINE64 line) DECLSPEC_HIDDEN;
790 extern struct symt_thunk*
791 symt_new_thunk(struct module* module,
792 struct symt_compiland* parent,
793 const char* name, THUNK_ORDINAL ord,
794 unsigned long addr, unsigned long size) DECLSPEC_HIDDEN;
795 extern struct symt_data*
796 symt_new_constant(struct module* module,
797 struct symt_compiland* parent,
798 const char* name, struct symt* type,
799 const VARIANT* v) DECLSPEC_HIDDEN;
800 extern struct symt_hierarchy_point*
801 symt_new_label(struct module* module,
802 struct symt_compiland* compiland,
803 const char* name, unsigned long address) DECLSPEC_HIDDEN;
804 extern struct symt* symt_index2ptr(struct module* module, DWORD id) DECLSPEC_HIDDEN;
805 extern DWORD symt_ptr2index(struct module* module, const struct symt* sym) DECLSPEC_HIDDEN;
806
807 /* type.c */
808 extern void symt_init_basic(struct module* module) DECLSPEC_HIDDEN;
809 extern BOOL symt_get_info(struct module* module, const struct symt* type,
810 IMAGEHLP_SYMBOL_TYPE_INFO req, void* pInfo) DECLSPEC_HIDDEN;
811 extern struct symt_basic*
812 symt_new_basic(struct module* module, enum BasicType,
813 const char* typename, unsigned size) DECLSPEC_HIDDEN;
814 extern struct symt_udt*
815 symt_new_udt(struct module* module, const char* typename,
816 unsigned size, enum UdtKind kind) DECLSPEC_HIDDEN;
817 extern BOOL symt_set_udt_size(struct module* module,
818 struct symt_udt* type, unsigned size) DECLSPEC_HIDDEN;
819 extern BOOL symt_add_udt_element(struct module* module,
820 struct symt_udt* udt_type,
821 const char* name,
822 struct symt* elt_type, unsigned offset,
823 unsigned size) DECLSPEC_HIDDEN;
824 extern struct symt_enum*
825 symt_new_enum(struct module* module, const char* typename,
826 struct symt* basetype) DECLSPEC_HIDDEN;
827 extern BOOL symt_add_enum_element(struct module* module,
828 struct symt_enum* enum_type,
829 const char* name, int value) DECLSPEC_HIDDEN;
830 extern struct symt_array*
831 symt_new_array(struct module* module, int min, int max,
832 struct symt* base, struct symt* index) DECLSPEC_HIDDEN;
833 extern struct symt_function_signature*
834 symt_new_function_signature(struct module* module,
835 struct symt* ret_type,
836 enum CV_call_e call_conv) DECLSPEC_HIDDEN;
837 extern BOOL symt_add_function_signature_parameter(struct module* module,
838 struct symt_function_signature* sig,
839 struct symt* param) DECLSPEC_HIDDEN;
840 extern struct symt_pointer*
841 symt_new_pointer(struct module* module,
842 struct symt* ref_type,
843 unsigned long size) DECLSPEC_HIDDEN;
844 extern struct symt_typedef*
845 symt_new_typedef(struct module* module, struct symt* ref,
846 const char* name) DECLSPEC_HIDDEN;
847
848 #include "image_private.h"
849
850 #endif /* _DBGHELP_PRIVATE_H_ */