xmllite/writer: Implement WriteNodeShallow().
[wine.git] / dlls / dbghelp / dbghelp_private.h
blob24ac003df71d3d942198cbb08a36db4383a469c3
1 /*
2 * File dbghelp_private.h - dbghelp internal definitions
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.
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.
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.
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
24 #include <stdarg.h>
25 #include "windef.h"
26 #include "winbase.h"
27 #include "winver.h"
28 #include "dbghelp.h"
29 #include "objbase.h"
30 #include "oaidl.h"
31 #include "winnls.h"
32 #include "wine/list.h"
33 #include "wine/rbtree.h"
35 #include "cvconst.h"
37 /* #define USE_STATS */
39 struct pool /* poor's man */
41 struct list arena_list;
42 struct list arena_full;
43 size_t arena_size;
46 void pool_init(struct pool* a, size_t arena_size) DECLSPEC_HIDDEN;
47 void pool_destroy(struct pool* a) DECLSPEC_HIDDEN;
48 void* pool_alloc(struct pool* a, size_t len) DECLSPEC_HIDDEN;
49 char* pool_strdup(struct pool* a, const char* str) DECLSPEC_HIDDEN;
51 struct vector
53 void** buckets;
54 unsigned elt_size;
55 unsigned shift;
56 unsigned num_elts;
57 unsigned num_buckets;
58 unsigned buckets_allocated;
61 void vector_init(struct vector* v, unsigned elt_sz, unsigned bucket_sz) DECLSPEC_HIDDEN;
62 unsigned vector_length(const struct vector* v) DECLSPEC_HIDDEN;
63 void* vector_at(const struct vector* v, unsigned pos) DECLSPEC_HIDDEN;
64 void* vector_add(struct vector* v, struct pool* pool) DECLSPEC_HIDDEN;
66 struct sparse_array
68 struct vector key2index;
69 struct vector elements;
72 void sparse_array_init(struct sparse_array* sa, unsigned elt_sz, unsigned bucket_sz) DECLSPEC_HIDDEN;
73 void* sparse_array_find(const struct sparse_array* sa, ULONG_PTR idx) DECLSPEC_HIDDEN;
74 void* sparse_array_add(struct sparse_array* sa, ULONG_PTR key, struct pool* pool) DECLSPEC_HIDDEN;
75 unsigned sparse_array_length(const struct sparse_array* sa) DECLSPEC_HIDDEN;
77 struct hash_table_elt
79 const char* name;
80 struct hash_table_elt* next;
83 struct hash_table_bucket
85 struct hash_table_elt* first;
86 struct hash_table_elt* last;
89 struct hash_table
91 unsigned num_elts;
92 unsigned num_buckets;
93 struct hash_table_bucket* buckets;
94 struct pool* pool;
97 void hash_table_init(struct pool* pool, struct hash_table* ht,
98 unsigned num_buckets) DECLSPEC_HIDDEN;
99 void hash_table_destroy(struct hash_table* ht) DECLSPEC_HIDDEN;
100 void hash_table_add(struct hash_table* ht, struct hash_table_elt* elt) DECLSPEC_HIDDEN;
102 struct hash_table_iter
104 const struct hash_table* ht;
105 struct hash_table_elt* element;
106 int index;
107 int last;
110 void hash_table_iter_init(const struct hash_table* ht,
111 struct hash_table_iter* hti, const char* name) DECLSPEC_HIDDEN;
112 void* hash_table_iter_up(struct hash_table_iter* hti) DECLSPEC_HIDDEN;
115 extern unsigned dbghelp_options DECLSPEC_HIDDEN;
116 extern BOOL dbghelp_opt_native DECLSPEC_HIDDEN;
117 extern SYSTEM_INFO sysinfo DECLSPEC_HIDDEN;
119 enum location_kind {loc_error, /* reg is the error code */
120 loc_unavailable, /* location is not available */
121 loc_absolute, /* offset is the location */
122 loc_register, /* reg is the location */
123 loc_regrel, /* [reg+offset] is the location */
124 loc_tlsrel, /* offset is the address of the TLS index */
125 loc_user, /* value is debug information dependent,
126 reg & offset can be used ad libidem */
129 enum location_error {loc_err_internal = -1, /* internal while computing */
130 loc_err_too_complex = -2, /* couldn't compute location (even at runtime) */
131 loc_err_out_of_scope = -3, /* variable isn't available at current address */
132 loc_err_cant_read = -4, /* couldn't read memory at given address */
133 loc_err_no_location = -5, /* likely optimized away (by compiler) */
136 struct location
138 unsigned kind : 8,
139 reg;
140 ULONG_PTR offset;
143 struct symt
145 enum SymTagEnum tag;
148 struct symt_ht
150 struct symt symt;
151 struct hash_table_elt hash_elt; /* if global symbol or type */
154 static inline BOOL symt_check_tag(const struct symt* s, enum SymTagEnum tag)
156 return s && s->tag == tag;
159 /* lexical tree */
160 struct symt_block
162 struct symt symt;
163 ULONG_PTR address;
164 ULONG_PTR size;
165 struct symt* container; /* block, or func */
166 struct vector vchildren; /* sub-blocks & local variables */
169 struct symt_module /* in fact any of .exe, .dll... */
171 struct symt symt; /* module */
172 struct vector vchildren; /* compilation units */
173 struct module* module;
176 struct symt_compiland
178 struct symt symt;
179 struct symt_module* container; /* symt_module */
180 ULONG_PTR address;
181 unsigned source;
182 struct vector vchildren; /* global variables & functions */
183 void* user; /* when debug info provider needs to store information */
186 struct symt_data
188 struct symt symt;
189 struct hash_table_elt hash_elt; /* if global symbol */
190 enum DataKind kind;
191 struct symt* container;
192 struct symt* type;
193 union /* depends on kind */
195 /* DataIs{Global, FileStatic}:
196 * with loc.kind
197 * loc_absolute loc.offset is address
198 * loc_tlsrel loc.offset is TLS index address
199 * DataIs{Local,Param}:
200 * with loc.kind
201 * loc_absolute not supported
202 * loc_register location is in register loc.reg
203 * loc_regrel location is at address loc.reg + loc.offset
204 * >= loc_user ask debug info provider for resolution
206 struct location var;
207 /* DataIs{Member} (all values are in bits, not bytes) */
208 struct
210 LONG_PTR offset;
211 ULONG_PTR bit_length;
212 ULONG_PTR bit_offset;
213 } member;
214 /* DataIsConstant */
215 VARIANT value;
216 } u;
219 /* We must take into account that most debug formats (dwarf and pdb) report for
220 * code (esp. inlined functions) inside functions the following way:
221 * - block
222 * + is represented by a contiguous area of memory,
223 * or at least have lo/hi addresses to encompass it's contents
224 * + but most importantly, block A's lo/hi range is always embedded within
225 * its parent (block or function)
226 * - inline site:
227 * + is most of the times represented by a set of ranges (instead of a
228 * contiguous block)
229 * + native dbghelp only exports the start address, not its size
230 * + the set of ranges isn't always embedded in enclosing block (if any)
231 * + the set of ranges is always embedded in top function
232 * - (top) function
233 * + is described as a contiguous block of memory
235 * On top of the items above (taken as assumptions), we also assume that:
236 * - a range in inline site A, is disjoint from all the other ranges in
237 * inline site A
238 * - a range in inline site A, is either disjoint or embedded into any of
239 * the ranges of inline sites parent of A
241 * Therefore, we also store all inline sites inside a function:
242 * - available as a linked list to simplify the walk among them
243 * - this linked list shall preserve the weak order of the lexical-parent
244 * relationship (eg for any inline site A, which has inline site B
245 * as lexical parent, then A is present before B in the linked list)
246 * - hence (from the assumptions above), when looking up which inline site
247 * contains a given address, the first range containing that address found
248 * while walking the list of inline sites is the right one.
251 struct symt_function
253 struct symt symt; /* SymTagFunction (or SymTagInlineSite when embedded in symt_inlinesite) */
254 struct hash_table_elt hash_elt; /* if global symbol */
255 ULONG_PTR address;
256 struct symt* container; /* compiland */
257 struct symt* type; /* points to function_signature */
258 ULONG_PTR size;
259 struct vector vlines;
260 struct vector vchildren; /* locals, params, blocks, start/end, labels, inline sites */
261 struct symt_inlinesite* next_inlinesite;/* linked list of inline sites in this function */
264 /* FIXME: this could be optimized later on by using relative offsets and smaller integral sizes */
265 struct addr_range
267 DWORD64 low; /* absolute address of first byte of the range */
268 DWORD64 high; /* absolute address of first byte after the range */
271 /* tests whether ar2 is inside ar1 */
272 static inline BOOL addr_range_inside(const struct addr_range* ar1, const struct addr_range* ar2)
274 return ar1->low <= ar2->low && ar2->high <= ar1->high;
277 /* tests whether ar1 and ar2 are disjoint */
278 static inline BOOL addr_range_disjoint(const struct addr_range* ar1, const struct addr_range* ar2)
280 return ar1->high <= ar2->low || ar2->high <= ar1->low;
283 /* a symt_inlinesite* can be casted to a symt_function* to access all function bits */
284 struct symt_inlinesite
286 struct symt_function func;
287 struct vector vranges; /* of addr_range: where the inline site is actually defined */
290 struct symt_hierarchy_point
292 struct symt symt; /* either SymTagFunctionDebugStart, SymTagFunctionDebugEnd, SymTagLabel */
293 struct hash_table_elt hash_elt; /* if label (and in compiland's hash table if global) */
294 struct symt* parent; /* symt_function or symt_compiland */
295 struct location loc;
298 struct symt_public
300 struct symt symt;
301 struct hash_table_elt hash_elt;
302 struct symt* container; /* compiland */
303 BOOL is_function;
304 ULONG_PTR address;
305 ULONG_PTR size;
308 struct symt_thunk
310 struct symt symt;
311 struct hash_table_elt hash_elt;
312 struct symt* container; /* compiland */
313 ULONG_PTR address;
314 ULONG_PTR size;
315 THUNK_ORDINAL ordinal; /* FIXME: doesn't seem to be accessible */
318 struct symt_custom
320 struct symt symt;
321 struct hash_table_elt hash_elt;
322 DWORD64 address;
323 DWORD size;
326 /* class tree */
327 struct symt_array
329 struct symt symt;
330 int start;
331 DWORD count;
332 struct symt* base_type;
333 struct symt* index_type;
336 struct symt_basic
338 struct symt symt;
339 enum BasicType bt;
340 ULONG_PTR size;
343 struct symt_enum
345 struct symt symt;
346 struct hash_table_elt hash_elt;
347 struct symt* base_type;
348 struct vector vchildren;
351 struct symt_function_signature
353 struct symt symt;
354 struct symt* rettype;
355 struct vector vchildren;
356 enum CV_call_e call_conv;
359 struct symt_function_arg_type
361 struct symt symt;
362 struct symt* arg_type;
365 struct symt_pointer
367 struct symt symt;
368 struct symt* pointsto;
369 ULONG_PTR size;
372 struct symt_typedef
374 struct symt symt;
375 struct hash_table_elt hash_elt;
376 struct symt* type;
379 struct symt_udt
381 struct symt symt;
382 struct hash_table_elt hash_elt;
383 enum UdtKind kind;
384 int size;
385 struct vector vchildren;
388 enum module_type
390 DMT_UNKNOWN, /* for lookup, not actually used for a module */
391 DMT_ELF, /* a real ELF shared module */
392 DMT_PE, /* a native or builtin PE module */
393 DMT_MACHO, /* a real Mach-O shared module */
394 DMT_PDB, /* .PDB file */
395 DMT_DBG, /* .DBG file */
398 struct process;
399 struct module;
401 /* a module can be made of several debug information formats, so we have to
402 * support them all
404 enum format_info
406 DFI_ELF,
407 DFI_PE,
408 DFI_MACHO,
409 DFI_DWARF,
410 DFI_PDB,
411 DFI_LAST
414 struct module_format
416 struct module* module;
417 void (*remove)(struct process* pcs, struct module_format* modfmt);
418 void (*loc_compute)(struct process* pcs,
419 const struct module_format* modfmt,
420 const struct symt_function* func,
421 struct location* loc);
422 union
424 struct elf_module_info* elf_info;
425 struct dwarf2_module_info_s* dwarf2_info;
426 struct pe_module_info* pe_info;
427 struct macho_module_info* macho_info;
428 struct pdb_module_info* pdb_info;
429 } u;
432 struct cpu;
434 struct module
436 struct process* process;
437 IMAGEHLP_MODULEW64 module;
438 WCHAR modulename[64]; /* used for enumeration */
439 struct module* next;
440 enum module_type type : 16;
441 unsigned short is_virtual : 1;
442 struct cpu* cpu;
443 DWORD64 reloc_delta;
444 WCHAR* real_path;
446 /* specific information for debug types */
447 struct module_format* format_info[DFI_LAST];
449 /* memory allocation pool */
450 struct pool pool;
452 /* symbols & symbol tables */
453 struct vector vsymt;
454 struct vector vcustom_symt;
455 int sortlist_valid;
456 unsigned num_sorttab; /* number of symbols with addresses */
457 unsigned num_symbols;
458 unsigned sorttab_size;
459 struct symt_ht** addr_sorttab;
460 struct hash_table ht_symbols;
461 struct symt_module* top;
463 /* types */
464 struct hash_table ht_types;
465 struct vector vtypes;
467 /* source files */
468 unsigned sources_used;
469 unsigned sources_alloc;
470 char* sources;
471 struct wine_rb_tree sources_offsets_tree;
474 typedef BOOL (*enum_modules_cb)(const WCHAR*, ULONG_PTR addr, void* user);
476 struct loader_ops
478 BOOL (*synchronize_module_list)(struct process* process);
479 struct module* (*load_module)(struct process* process, const WCHAR* name, ULONG_PTR addr);
480 BOOL (*load_debug_info)(struct process *process, struct module* module);
481 BOOL (*enum_modules)(struct process* process, enum_modules_cb callback, void* user);
482 BOOL (*fetch_file_info)(struct process* process, const WCHAR* name, ULONG_PTR load_addr, DWORD_PTR* base, DWORD* size, DWORD* checksum);
485 struct process
487 struct process* next;
488 HANDLE handle;
489 const struct loader_ops* loader;
490 WCHAR* search_path;
491 WCHAR* environment;
493 PSYMBOL_REGISTERED_CALLBACK64 reg_cb;
494 PSYMBOL_REGISTERED_CALLBACK reg_cb32;
495 BOOL reg_is_unicode;
496 DWORD64 reg_user;
498 struct module* lmodules;
499 ULONG_PTR dbg_hdr_addr;
501 IMAGEHLP_STACK_FRAME ctx_frame;
502 DWORD64 localscope_pc;
503 struct symt* localscope_symt;
505 unsigned buffer_size;
506 void* buffer;
508 BOOL is_64bit;
511 static inline BOOL read_process_memory(const struct process *process, UINT64 addr, void *buf, size_t size)
513 return ReadProcessMemory(process->handle, (void*)(UINT_PTR)addr, buf, size, NULL);
516 struct line_info
518 ULONG_PTR is_first : 1,
519 is_last : 1,
520 is_source_file : 1,
521 line_number;
522 union
524 ULONG_PTR address; /* absolute, if is_source_file isn't set */
525 unsigned source_file; /* if is_source_file is set */
526 } u;
529 struct module_pair
531 struct process* pcs;
532 struct module* requested; /* in: to module_get_debug() */
533 struct module* effective; /* out: module with debug info */
536 enum pdb_kind {PDB_JG, PDB_DS};
538 struct pdb_lookup
540 const char* filename;
541 enum pdb_kind kind;
542 unsigned int age;
543 unsigned int timestamp;
544 GUID guid;
547 struct cpu_stack_walk
549 HANDLE hProcess;
550 HANDLE hThread;
551 BOOL is32;
552 struct cpu * cpu;
553 union
555 struct
557 PREAD_PROCESS_MEMORY_ROUTINE f_read_mem;
558 PTRANSLATE_ADDRESS_ROUTINE f_xlat_adr;
559 PFUNCTION_TABLE_ACCESS_ROUTINE f_tabl_acs;
560 PGET_MODULE_BASE_ROUTINE f_modl_bas;
561 } s32;
562 struct
564 PREAD_PROCESS_MEMORY_ROUTINE64 f_read_mem;
565 PTRANSLATE_ADDRESS_ROUTINE64 f_xlat_adr;
566 PFUNCTION_TABLE_ACCESS_ROUTINE64 f_tabl_acs;
567 PGET_MODULE_BASE_ROUTINE64 f_modl_bas;
568 } s64;
569 } u;
572 struct dump_memory
574 ULONG64 base;
575 ULONG size;
576 ULONG rva;
579 struct dump_memory64
581 ULONG64 base;
582 ULONG64 size;
585 struct dump_module
587 unsigned is_elf;
588 ULONG64 base;
589 ULONG size;
590 DWORD timestamp;
591 DWORD checksum;
592 WCHAR name[MAX_PATH];
595 struct dump_thread
597 ULONG tid;
598 ULONG prio_class;
599 ULONG curr_prio;
602 struct dump_context
604 /* process & thread information */
605 struct process *process;
606 DWORD pid;
607 unsigned flags_out;
608 /* thread information */
609 struct dump_thread* threads;
610 unsigned num_threads;
611 /* module information */
612 struct dump_module* modules;
613 unsigned num_modules;
614 unsigned alloc_modules;
615 /* exception information */
616 /* output information */
617 MINIDUMP_TYPE type;
618 HANDLE hFile;
619 RVA rva;
620 struct dump_memory* mem;
621 unsigned num_mem;
622 unsigned alloc_mem;
623 struct dump_memory64* mem64;
624 unsigned num_mem64;
625 unsigned alloc_mem64;
626 /* callback information */
627 MINIDUMP_CALLBACK_INFORMATION* cb;
630 union ctx
632 CONTEXT ctx;
633 WOW64_CONTEXT x86;
636 enum cpu_addr {cpu_addr_pc, cpu_addr_stack, cpu_addr_frame};
637 struct cpu
639 DWORD machine;
640 DWORD word_size;
641 DWORD frame_regno;
643 /* address manipulation */
644 BOOL (*get_addr)(HANDLE hThread, const CONTEXT* ctx,
645 enum cpu_addr, ADDRESS64* addr);
647 /* stack manipulation */
648 BOOL (*stack_walk)(struct cpu_stack_walk *csw, STACKFRAME64 *frame,
649 union ctx *ctx);
651 /* module manipulation */
652 void* (*find_runtime_function)(struct module*, DWORD64 addr);
654 /* dwarf dedicated information */
655 unsigned (*map_dwarf_register)(unsigned regno, const struct module* module, BOOL eh_frame);
657 /* context related manipulation */
658 void * (*fetch_context_reg)(union ctx *ctx, unsigned regno, unsigned *size);
659 const char* (*fetch_regname)(unsigned regno);
661 /* minidump per CPU extension */
662 BOOL (*fetch_minidump_thread)(struct dump_context* dc, unsigned index, unsigned flags, const CONTEXT* ctx);
663 BOOL (*fetch_minidump_module)(struct dump_context* dc, unsigned index, unsigned flags);
666 extern struct cpu* dbghelp_current_cpu DECLSPEC_HIDDEN;
668 /* PDB and Codeview */
670 struct msc_debug_info
672 struct module* module;
673 int nsect;
674 const IMAGE_SECTION_HEADER* sectp;
675 int nomap;
676 const OMAP* omapp;
677 const BYTE* root;
680 /* coff.c */
681 extern BOOL coff_process_info(const struct msc_debug_info* msc_dbg) DECLSPEC_HIDDEN;
683 /* dbghelp.c */
684 extern struct process* process_find_by_handle(HANDLE hProcess) DECLSPEC_HIDDEN;
685 extern BOOL validate_addr64(DWORD64 addr) DECLSPEC_HIDDEN;
686 extern BOOL pcs_callback(const struct process* pcs, ULONG action, void* data) DECLSPEC_HIDDEN;
687 extern void* fetch_buffer(struct process* pcs, unsigned size) DECLSPEC_HIDDEN;
688 extern const char* wine_dbgstr_addr(const ADDRESS64* addr) DECLSPEC_HIDDEN;
689 extern struct cpu* cpu_find(DWORD) DECLSPEC_HIDDEN;
690 extern const WCHAR *process_getenv(const struct process *process, const WCHAR *name);
691 extern DWORD calc_crc32(HANDLE handle) DECLSPEC_HIDDEN;
693 /* elf_module.c */
694 extern BOOL elf_read_wine_loader_dbg_info(struct process* pcs, ULONG_PTR addr) DECLSPEC_HIDDEN;
695 struct elf_thunk_area;
696 extern int elf_is_in_thunk_area(ULONG_PTR addr, const struct elf_thunk_area* thunks) DECLSPEC_HIDDEN;
698 /* macho_module.c */
699 extern BOOL macho_read_wine_loader_dbg_info(struct process* pcs, ULONG_PTR addr) DECLSPEC_HIDDEN;
701 /* minidump.c */
702 void minidump_add_memory_block(struct dump_context* dc, ULONG64 base, ULONG size, ULONG rva) DECLSPEC_HIDDEN;
704 /* module.c */
705 extern const WCHAR S_ElfW[] DECLSPEC_HIDDEN;
706 extern const WCHAR S_WineLoaderW[] DECLSPEC_HIDDEN;
707 extern const struct loader_ops no_loader_ops DECLSPEC_HIDDEN;
709 extern BOOL module_init_pair(struct module_pair* pair, HANDLE hProcess,
710 DWORD64 addr) DECLSPEC_HIDDEN;
711 extern struct module*
712 module_find_by_addr(const struct process* pcs, DWORD64 addr,
713 enum module_type type) DECLSPEC_HIDDEN;
714 extern struct module*
715 module_find_by_nameW(const struct process* pcs,
716 const WCHAR* name) DECLSPEC_HIDDEN;
717 extern struct module*
718 module_find_by_nameA(const struct process* pcs,
719 const char* name) DECLSPEC_HIDDEN;
720 extern struct module*
721 module_is_already_loaded(const struct process* pcs,
722 const WCHAR* imgname) DECLSPEC_HIDDEN;
723 extern BOOL module_get_debug(struct module_pair*) DECLSPEC_HIDDEN;
724 extern struct module*
725 module_new(struct process* pcs, const WCHAR* name,
726 enum module_type type, BOOL virtual,
727 DWORD64 addr, DWORD64 size,
728 ULONG_PTR stamp, ULONG_PTR checksum, WORD machine) DECLSPEC_HIDDEN;
729 extern struct module*
730 module_get_containee(const struct process* pcs,
731 const struct module* inner) DECLSPEC_HIDDEN;
732 extern void module_reset_debug_info(struct module* module) DECLSPEC_HIDDEN;
733 extern BOOL module_remove(struct process* pcs,
734 struct module* module) DECLSPEC_HIDDEN;
735 extern void module_set_module(struct module* module, const WCHAR* name) DECLSPEC_HIDDEN;
736 extern WCHAR* get_wine_loader_name(struct process *pcs) DECLSPEC_HIDDEN;
738 /* msc.c */
739 extern BOOL pe_load_debug_directory(const struct process* pcs,
740 struct module* module,
741 const BYTE* mapping,
742 const IMAGE_SECTION_HEADER* sectp, DWORD nsect,
743 const IMAGE_DEBUG_DIRECTORY* dbg, int nDbg) DECLSPEC_HIDDEN;
744 extern BOOL pdb_fetch_file_info(const struct pdb_lookup* pdb_lookup, unsigned* matched) DECLSPEC_HIDDEN;
745 struct pdb_cmd_pair {
746 const char* name;
747 DWORD* pvalue;
749 extern BOOL pdb_virtual_unwind(struct cpu_stack_walk *csw, DWORD_PTR ip,
750 union ctx *context, struct pdb_cmd_pair *cpair) DECLSPEC_HIDDEN;
752 /* path.c */
753 extern BOOL path_find_symbol_file(const struct process* pcs, const struct module* module,
754 PCSTR full_path, enum module_type type, const GUID* guid, DWORD dw1, DWORD dw2,
755 WCHAR *buffer, BOOL* is_unmatched) DECLSPEC_HIDDEN;
756 extern WCHAR *get_dos_file_name(const WCHAR *filename) DECLSPEC_HIDDEN;
757 extern BOOL search_dll_path(const struct process* process, const WCHAR *name,
758 BOOL (*match)(void*, HANDLE, const WCHAR*), void *param) DECLSPEC_HIDDEN;
759 extern BOOL search_unix_path(const WCHAR *name, const WCHAR *path, BOOL (*match)(void*, HANDLE, const WCHAR*), void *param) DECLSPEC_HIDDEN;
760 extern const WCHAR* file_name(const WCHAR* str) DECLSPEC_HIDDEN;
761 extern const char* file_nameA(const char* str) DECLSPEC_HIDDEN;
763 /* pe_module.c */
764 extern BOOL pe_load_nt_header(HANDLE hProc, DWORD64 base, IMAGE_NT_HEADERS* nth) DECLSPEC_HIDDEN;
765 extern struct module*
766 pe_load_native_module(struct process* pcs, const WCHAR* name,
767 HANDLE hFile, DWORD64 base, DWORD size) DECLSPEC_HIDDEN;
768 extern struct module*
769 pe_load_builtin_module(struct process* pcs, const WCHAR* name,
770 DWORD64 base, DWORD64 size) DECLSPEC_HIDDEN;
771 extern BOOL pe_load_debug_info(const struct process* pcs,
772 struct module* module) DECLSPEC_HIDDEN;
773 extern const char* pe_map_directory(struct module* module, int dirno, DWORD* size) DECLSPEC_HIDDEN;
775 /* source.c */
776 extern unsigned source_new(struct module* module, const char* basedir, const char* source) DECLSPEC_HIDDEN;
777 extern const char* source_get(const struct module* module, unsigned idx) DECLSPEC_HIDDEN;
778 extern int source_rb_compare(const void *key, const struct wine_rb_entry *entry) DECLSPEC_HIDDEN;
780 /* stabs.c */
781 typedef void (*stabs_def_cb)(struct module* module, ULONG_PTR load_offset,
782 const char* name, ULONG_PTR offset,
783 BOOL is_public, BOOL is_global, unsigned char other,
784 struct symt_compiland* compiland, void* user);
785 extern BOOL stabs_parse(struct module* module, ULONG_PTR load_offset,
786 const char* stabs, size_t nstab, size_t stabsize,
787 const char* strs, int strtablen,
788 stabs_def_cb callback, void* user) DECLSPEC_HIDDEN;
790 /* dwarf.c */
791 struct image_file_map;
792 extern BOOL dwarf2_parse(struct module* module, ULONG_PTR load_offset,
793 const struct elf_thunk_area* thunks,
794 struct image_file_map* fmap) DECLSPEC_HIDDEN;
795 extern BOOL dwarf2_virtual_unwind(struct cpu_stack_walk *csw, DWORD_PTR ip,
796 union ctx *ctx, DWORD64 *cfa) DECLSPEC_HIDDEN;
798 /* stack.c */
799 extern BOOL sw_read_mem(struct cpu_stack_walk* csw, DWORD64 addr, void* ptr, DWORD sz) DECLSPEC_HIDDEN;
800 extern DWORD64 sw_xlat_addr(struct cpu_stack_walk* csw, ADDRESS64* addr) DECLSPEC_HIDDEN;
801 extern void* sw_table_access(struct cpu_stack_walk* csw, DWORD64 addr) DECLSPEC_HIDDEN;
802 extern DWORD64 sw_module_base(struct cpu_stack_walk* csw, DWORD64 addr) DECLSPEC_HIDDEN;
804 /* symbol.c */
805 extern const char* symt_get_name(const struct symt* sym) DECLSPEC_HIDDEN;
806 extern WCHAR* symt_get_nameW(const struct symt* sym) DECLSPEC_HIDDEN;
807 extern BOOL symt_get_address(const struct symt* type, ULONG64* addr) DECLSPEC_HIDDEN;
808 extern int __cdecl symt_cmp_addr(const void* p1, const void* p2) DECLSPEC_HIDDEN;
809 extern void copy_symbolW(SYMBOL_INFOW* siw, const SYMBOL_INFO* si) DECLSPEC_HIDDEN;
810 extern void symbol_setname(SYMBOL_INFO* si, const char* name) DECLSPEC_HIDDEN;
811 extern struct symt_ht*
812 symt_find_nearest(struct module* module, DWORD_PTR addr) DECLSPEC_HIDDEN;
813 extern struct symt_ht*
814 symt_find_symbol_at(struct module* module, DWORD_PTR addr) DECLSPEC_HIDDEN;
815 extern struct symt_module*
816 symt_new_module(struct module* module) DECLSPEC_HIDDEN;
817 extern struct symt_compiland*
818 symt_new_compiland(struct module* module, ULONG_PTR address,
819 unsigned src_idx) DECLSPEC_HIDDEN;
820 extern struct symt_public*
821 symt_new_public(struct module* module,
822 struct symt_compiland* parent,
823 const char* typename,
824 BOOL is_function,
825 ULONG_PTR address,
826 unsigned size) DECLSPEC_HIDDEN;
827 extern struct symt_data*
828 symt_new_global_variable(struct module* module,
829 struct symt_compiland* parent,
830 const char* name, unsigned is_static,
831 struct location loc, ULONG_PTR size,
832 struct symt* type) DECLSPEC_HIDDEN;
833 extern struct symt_function*
834 symt_new_function(struct module* module,
835 struct symt_compiland* parent,
836 const char* name,
837 ULONG_PTR addr, ULONG_PTR size,
838 struct symt* type) DECLSPEC_HIDDEN;
839 extern struct symt_inlinesite*
840 symt_new_inlinesite(struct module* module,
841 struct symt_function* func,
842 struct symt* parent,
843 const char* name,
844 ULONG_PTR addr,
845 struct symt* type) DECLSPEC_HIDDEN;
846 extern void symt_add_func_line(struct module* module,
847 struct symt_function* func,
848 unsigned source_idx, int line_num,
849 ULONG_PTR offset) DECLSPEC_HIDDEN;
850 extern struct symt_data*
851 symt_add_func_local(struct module* module,
852 struct symt_function* func,
853 enum DataKind dt, const struct location* loc,
854 struct symt_block* block,
855 struct symt* type, const char* name) DECLSPEC_HIDDEN;
856 extern struct symt_data*
857 symt_add_func_constant(struct module* module,
858 struct symt_function* func, struct symt_block* block,
859 struct symt* type, const char* name, VARIANT* v) DECLSPEC_HIDDEN;
860 extern struct symt_block*
861 symt_open_func_block(struct module* module,
862 struct symt_function* func,
863 struct symt_block* block,
864 unsigned pc, unsigned len) DECLSPEC_HIDDEN;
865 extern struct symt_block*
866 symt_close_func_block(struct module* module,
867 const struct symt_function* func,
868 struct symt_block* block, unsigned pc) DECLSPEC_HIDDEN;
869 extern struct symt_hierarchy_point*
870 symt_add_function_point(struct module* module,
871 struct symt_function* func,
872 enum SymTagEnum point,
873 const struct location* loc,
874 const char* name) DECLSPEC_HIDDEN;
875 extern BOOL symt_add_inlinesite_range(struct module* module,
876 struct symt_inlinesite* inlined,
877 ULONG_PTR low, ULONG_PTR high) DECLSPEC_HIDDEN;
878 extern struct symt_thunk*
879 symt_new_thunk(struct module* module,
880 struct symt_compiland* parent,
881 const char* name, THUNK_ORDINAL ord,
882 ULONG_PTR addr, ULONG_PTR size) DECLSPEC_HIDDEN;
883 extern struct symt_data*
884 symt_new_constant(struct module* module,
885 struct symt_compiland* parent,
886 const char* name, struct symt* type,
887 const VARIANT* v) DECLSPEC_HIDDEN;
888 extern struct symt_hierarchy_point*
889 symt_new_label(struct module* module,
890 struct symt_compiland* compiland,
891 const char* name, ULONG_PTR address) DECLSPEC_HIDDEN;
892 extern struct symt* symt_index2ptr(struct module* module, DWORD id) DECLSPEC_HIDDEN;
893 extern DWORD symt_ptr2index(struct module* module, const struct symt* sym) DECLSPEC_HIDDEN;
894 extern struct symt_custom*
895 symt_new_custom(struct module* module, const char* name,
896 DWORD64 addr, DWORD size) DECLSPEC_HIDDEN;
898 /* type.c */
899 extern void symt_init_basic(struct module* module) DECLSPEC_HIDDEN;
900 extern BOOL symt_get_info(struct module* module, const struct symt* type,
901 IMAGEHLP_SYMBOL_TYPE_INFO req, void* pInfo) DECLSPEC_HIDDEN;
902 extern struct symt_basic*
903 symt_get_basic(enum BasicType, unsigned size) DECLSPEC_HIDDEN;
904 extern struct symt_udt*
905 symt_new_udt(struct module* module, const char* typename,
906 unsigned size, enum UdtKind kind) DECLSPEC_HIDDEN;
907 extern BOOL symt_set_udt_size(struct module* module,
908 struct symt_udt* type, unsigned size) DECLSPEC_HIDDEN;
909 extern BOOL symt_add_udt_element(struct module* module,
910 struct symt_udt* udt_type,
911 const char* name,
912 struct symt* elt_type, unsigned offset,
913 unsigned bit_offset, unsigned bit_size) DECLSPEC_HIDDEN;
914 extern struct symt_enum*
915 symt_new_enum(struct module* module, const char* typename,
916 struct symt* basetype) DECLSPEC_HIDDEN;
917 extern BOOL symt_add_enum_element(struct module* module,
918 struct symt_enum* enum_type,
919 const char* name, int value) DECLSPEC_HIDDEN;
920 extern struct symt_array*
921 symt_new_array(struct module* module, int min, DWORD count,
922 struct symt* base, struct symt* index) DECLSPEC_HIDDEN;
923 extern struct symt_function_signature*
924 symt_new_function_signature(struct module* module,
925 struct symt* ret_type,
926 enum CV_call_e call_conv) DECLSPEC_HIDDEN;
927 extern BOOL symt_add_function_signature_parameter(struct module* module,
928 struct symt_function_signature* sig,
929 struct symt* param) DECLSPEC_HIDDEN;
930 extern struct symt_pointer*
931 symt_new_pointer(struct module* module,
932 struct symt* ref_type,
933 ULONG_PTR size) DECLSPEC_HIDDEN;
934 extern struct symt_typedef*
935 symt_new_typedef(struct module* module, struct symt* ref,
936 const char* name) DECLSPEC_HIDDEN;
937 extern struct symt_inlinesite*
938 symt_find_lowest_inlined(struct symt_function* func, DWORD64 addr) DECLSPEC_HIDDEN;
939 extern struct symt*
940 symt_get_upper_inlined(struct symt_inlinesite* inlined) DECLSPEC_HIDDEN;
941 static inline struct symt_function*
942 symt_get_function_from_inlined(struct symt_inlinesite* inlined)
944 while (!symt_check_tag(&inlined->func.symt, SymTagFunction))
945 inlined = (struct symt_inlinesite*)symt_get_upper_inlined(inlined);
946 return &inlined->func;
948 extern struct symt_inlinesite*
949 symt_find_inlined_site(struct module* module,
950 DWORD64 addr, DWORD inline_ctx) DECLSPEC_HIDDEN;
951 extern DWORD symt_get_inlinesite_depth(HANDLE hProcess, DWORD64 addr) DECLSPEC_HIDDEN;
953 /* Inline context encoding (different from what native does):
954 * bits 31:30: 3 ignore (includes INLINE_FRAME_CONTEXT_IGNORE=0xFFFFFFFF)
955 * 2 regular frame
956 * 1 frame with inlined function(s).
957 * 0 init (includes INLINE_FRAME_CONTEXT_INIT=0)
958 * so either stackwalkex is called with:
959 * - inlinectx=IGNORE, and we use (old) StackWalk64 behavior:
960 * - inlinectx=INIT, and StackWalkEx will upon return swing back&forth between:
961 * INLINE when the frame is from an inline site (inside a function)
962 * REGULAR when the frame is for a function without inline site
963 * bits 29:00 depth of inline site (way too big!!)
964 * 0 being the lowest inline site
966 #define IFC_MODE_IGNORE 0xC0000000
967 #define IFC_MODE_REGULAR 0x80000000
968 #define IFC_MODE_INLINE 0x40000000
969 #define IFC_MODE_INIT 0x00000000
970 #define IFC_DEPTH_MASK 0x3FFFFFFF
971 #define IFC_MODE(x) ((x) & ~IFC_DEPTH_MASK)
972 #define IFC_DEPTH(x) ((x) & IFC_DEPTH_MASK)