Module: wine Branch: master Commit: c9bac2efd2b3590230aed946d5ed7086d19182a4 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c9bac2efd2b3590230aed946d5...
Author: Eric Pouech eric.pouech@orange.fr Date: Thu Mar 18 21:31:19 2010 +0100
dbghelp: Extend the image (ELF/PE) scheme to get the RVA out of a section.
---
dlls/dbghelp/elf_module.c | 12 ++++++++++++ dlls/dbghelp/image_private.h | 13 +++++++++++++ dlls/dbghelp/pe_module.c | 12 ++++++++++++ 3 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c index 64b8481..4719aed 100644 --- a/dlls/dbghelp/elf_module.c +++ b/dlls/dbghelp/elf_module.c @@ -195,6 +195,18 @@ static void elf_end_find(struct image_file_map* fmap) }
/****************************************************************** + * elf_get_map_rva + * + * Get the RVA of an ELF section + */ +DWORD_PTR elf_get_map_rva(const struct image_section_map* ism) +{ + if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.elf.elfhdr.e_shnum) + return 0; + return ism->fmap->u.elf.sect[ism->sidx].shdr.sh_addr - ism->fmap->u.elf.elf_start; +} + +/****************************************************************** * elf_get_map_size * * Get the size of an ELF section diff --git a/dlls/dbghelp/image_private.h b/dlls/dbghelp/image_private.h index 4eb5f83..b768deb 100644 --- a/dlls/dbghelp/image_private.h +++ b/dlls/dbghelp/image_private.h @@ -116,12 +116,14 @@ extern BOOL elf_find_section(struct image_file_map* fmap, const char* na unsigned sht, struct image_section_map* ism); extern const char* elf_map_section(struct image_section_map* ism); extern void elf_unmap_section(struct image_section_map* ism); +extern DWORD_PTR elf_get_map_rva(const struct image_section_map* ism); extern unsigned elf_get_map_size(const struct image_section_map* ism);
extern BOOL pe_find_section(struct image_file_map* fmap, const char* name, struct image_section_map* ism); extern const char* pe_map_section(struct image_section_map* psm); extern void pe_unmap_section(struct image_section_map* psm); +extern DWORD_PTR pe_get_map_rva(const struct image_section_map* psm); extern unsigned pe_get_map_size(const struct image_section_map* psm);
static inline BOOL image_find_section(struct image_file_map* fmap, const char* name, @@ -157,6 +159,17 @@ static inline void image_unmap_section(struct image_section_map* ism) } }
+static inline DWORD_PTR image_get_map_rva(struct image_section_map* ism) +{ + if (!ism->fmap) return 0; + switch (ism->fmap->modtype) + { + case DMT_ELF: return elf_get_map_rva(ism); + case DMT_PE: return pe_get_map_rva(ism); + default: assert(0); return 0; + } +} + static inline unsigned image_get_map_size(struct image_section_map* ism) { if (!ism->fmap) return 0; diff --git a/dlls/dbghelp/pe_module.c b/dlls/dbghelp/pe_module.c index 171d616..67c2e8d 100644 --- a/dlls/dbghelp/pe_module.c +++ b/dlls/dbghelp/pe_module.c @@ -148,6 +148,18 @@ void pe_unmap_section(struct image_section_map* ism) }
/****************************************************************** + * pe_get_map_rva + * + * Get the RVA of an PE section + */ +DWORD_PTR pe_get_map_rva(const struct image_section_map* ism) +{ + if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.pe.ntheader.FileHeader.NumberOfSections) + return 0; + return ism->fmap->u.pe.sect[ism->sidx].shdr.VirtualAddress; +} + +/****************************************************************** * pe_get_map_size * * Get the size of an PE section