[WINESYNC] dbghelp: Use vtbl to handle different image_file_map types.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>

wine commit id 95a5f8296188d7dd8ffb86afd4f0c3280e2f5656 by Jacek Caban <jacek@codeweavers.com>
This commit is contained in:
winesync 2020-09-11 17:01:17 +02:00 committed by Jérôme Gardou
parent 2fc432db92
commit fff3c0ca2c
5 changed files with 63 additions and 137 deletions

View file

@ -134,7 +134,7 @@ struct elf_module_info
* *
* Maps a single section into memory from an ELF file * Maps a single section into memory from an ELF file
*/ */
const char* elf_map_section(struct image_section_map* ism) static const char* elf_map_section(struct image_section_map* ism)
{ {
struct elf_file_map* fmap = &ism->fmap->u.elf; struct elf_file_map* fmap = &ism->fmap->u.elf;
SYSTEM_INFO sysinfo; SYSTEM_INFO sysinfo;
@ -176,7 +176,7 @@ const char* elf_map_section(struct image_section_map* ism)
* Finds a section by name (and type) into memory from an ELF file * Finds a section by name (and type) into memory from an ELF file
* or its alternate if any * or its alternate if any
*/ */
BOOL elf_find_section(struct image_file_map* _fmap, const char* name, struct image_section_map* ism) static BOOL elf_find_section(struct image_file_map* _fmap, const char* name, struct image_section_map* ism)
{ {
struct elf_file_map* fmap = &_fmap->u.elf; struct elf_file_map* fmap = &_fmap->u.elf;
unsigned i; unsigned i;
@ -233,7 +233,7 @@ static BOOL elf_find_section_type(struct image_file_map* _fmap, const char* name
* *
* Unmaps a single section from memory * Unmaps a single section from memory
*/ */
void elf_unmap_section(struct image_section_map* ism) static void elf_unmap_section(struct image_section_map* ism)
{ {
struct elf_file_map* fmap = &ism->fmap->u.elf; struct elf_file_map* fmap = &ism->fmap->u.elf;
@ -265,7 +265,7 @@ static void elf_end_find(struct image_file_map* fmap)
* *
* Get the RVA of an ELF section * Get the RVA of an ELF section
*/ */
DWORD_PTR elf_get_map_rva(const struct image_section_map* ism) static 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) if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.elf.elfhdr.e_shnum)
return 0; return 0;
@ -277,15 +277,25 @@ DWORD_PTR elf_get_map_rva(const struct image_section_map* ism)
* *
* Get the size of an ELF section * Get the size of an ELF section
*/ */
unsigned elf_get_map_size(const struct image_section_map* ism) static unsigned elf_get_map_size(const struct image_section_map* ism)
{ {
if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.elf.elfhdr.e_shnum) if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.elf.elfhdr.e_shnum)
return 0; return 0;
return ism->fmap->u.elf.sect[ism->sidx].shdr.sh_size; return ism->fmap->u.elf.sect[ism->sidx].shdr.sh_size;
} }
static const struct image_file_map_ops elf_file_map_ops =
{
elf_map_section,
elf_unmap_section,
elf_find_section,
elf_get_map_rva,
elf_get_map_size,
};
static inline void elf_reset_file_map(struct image_file_map* fmap) static inline void elf_reset_file_map(struct image_file_map* fmap)
{ {
fmap->ops = &elf_file_map_ops;
fmap->alternate = NULL; fmap->alternate = NULL;
fmap->u.elf.handle = INVALID_HANDLE_VALUE; fmap->u.elf.handle = INVALID_HANDLE_VALUE;
fmap->u.elf.shstrtab = IMAGE_NO_MAP; fmap->u.elf.shstrtab = IMAGE_NO_MAP;
@ -2036,30 +2046,6 @@ BOOL elf_synchronize_module_list(struct process* pcs)
#else /* !__ELF__ */ #else /* !__ELF__ */
BOOL elf_find_section(struct image_file_map* fmap, const char* name,
struct image_section_map* ism)
{
return FALSE;
}
const char* elf_map_section(struct image_section_map* ism)
{
return NULL;
}
void elf_unmap_section(struct image_section_map* ism)
{}
unsigned elf_get_map_size(const struct image_section_map* ism)
{
return 0;
}
DWORD_PTR elf_get_map_rva(const struct image_section_map* ism)
{
return 0;
}
BOOL elf_synchronize_module_list(struct process* pcs) BOOL elf_synchronize_module_list(struct process* pcs)
{ {
return FALSE; return FALSE;

View file

@ -62,6 +62,7 @@
struct image_file_map struct image_file_map
{ {
enum module_type modtype; enum module_type modtype;
const struct image_file_map_ops *ops;
unsigned addr_size; /* either 16 (not used), 32 or 64 */ unsigned addr_size; /* either 16 (not used), 32 or 64 */
struct image_file_map* alternate; /* another file linked to this one */ struct image_file_map* alternate; /* another file linked to this one */
union union
@ -131,47 +132,21 @@ struct image_section_map
long sidx; long sidx;
}; };
extern BOOL elf_find_section(struct image_file_map* fmap, const char* name, struct image_file_map_ops
struct image_section_map* ism) DECLSPEC_HIDDEN; {
extern const char* elf_map_section(struct image_section_map* ism) DECLSPEC_HIDDEN; const char* (*map_section)(struct image_section_map* ism);
extern void elf_unmap_section(struct image_section_map* ism) DECLSPEC_HIDDEN; void (*unmap_section)(struct image_section_map* ism);
extern DWORD_PTR elf_get_map_rva(const struct image_section_map* ism) DECLSPEC_HIDDEN; BOOL (*find_section)(struct image_file_map* fmap, const char* name, struct image_section_map* ism);
extern unsigned elf_get_map_size(const struct image_section_map* ism) DECLSPEC_HIDDEN; DWORD_PTR (*get_map_rva)(const struct image_section_map* ism);
unsigned (*get_map_size)(const struct image_section_map* ism);
extern BOOL macho_find_section(struct image_file_map* ifm, const char* segname, };
const char* sectname, struct image_section_map* ism) DECLSPEC_HIDDEN;
extern const char* macho_map_section(struct image_section_map* ism) DECLSPEC_HIDDEN;
extern void macho_unmap_section(struct image_section_map* ism) DECLSPEC_HIDDEN;
extern DWORD_PTR macho_get_map_rva(const struct image_section_map* ism) DECLSPEC_HIDDEN;
extern unsigned macho_get_map_size(const struct image_section_map* ism) DECLSPEC_HIDDEN;
extern BOOL pe_find_section(struct image_file_map* fmap, const char* name,
struct image_section_map* ism) DECLSPEC_HIDDEN;
extern const char* pe_map_section(struct image_section_map* psm) DECLSPEC_HIDDEN;
extern void pe_unmap_section(struct image_section_map* psm) DECLSPEC_HIDDEN;
extern DWORD_PTR pe_get_map_rva(const struct image_section_map* psm) DECLSPEC_HIDDEN;
extern unsigned pe_get_map_size(const struct image_section_map* psm) DECLSPEC_HIDDEN;
static inline BOOL image_find_section(struct image_file_map* fmap, const char* name, static inline BOOL image_find_section(struct image_file_map* fmap, const char* name,
struct image_section_map* ism) struct image_section_map* ism)
{ {
while (fmap) while (fmap)
{ {
switch (fmap->modtype) if (fmap->ops->find_section(fmap, name, ism)) return TRUE;
{
#ifndef DBGHELP_STATIC_LIB
case DMT_ELF:
if (elf_find_section(fmap, name, ism)) return TRUE;
break;
case DMT_MACHO:
if (macho_find_section(fmap, NULL, name, ism)) return TRUE;
break;
#endif
case DMT_PE:
if (pe_find_section(fmap, name, ism)) return TRUE;
break;
default: assert(0); return FALSE;
}
fmap = fmap->alternate; fmap = fmap->alternate;
} }
ism->fmap = NULL; ism->fmap = NULL;
@ -181,56 +156,20 @@ static inline BOOL image_find_section(struct image_file_map* fmap, const char* n
static inline const char* image_map_section(struct image_section_map* ism) static inline const char* image_map_section(struct image_section_map* ism)
{ {
if (!ism->fmap) return NULL; return ism->fmap ? ism->fmap->ops->map_section(ism) : NULL;
switch (ism->fmap->modtype)
{
#ifndef DBGHELP_STATIC_LIB
case DMT_ELF: return elf_map_section(ism);
case DMT_MACHO: return macho_map_section(ism);
#endif
case DMT_PE: return pe_map_section(ism);
default: assert(0); return NULL;
}
} }
static inline void image_unmap_section(struct image_section_map* ism) static inline void image_unmap_section(struct image_section_map* ism)
{ {
if (!ism->fmap) return; if (ism->fmap) ism->fmap->ops->unmap_section(ism);
switch (ism->fmap->modtype)
{
#ifndef DBGHELP_STATIC_LIB
case DMT_ELF: elf_unmap_section(ism); break;
case DMT_MACHO: macho_unmap_section(ism); break;
#endif
case DMT_PE: pe_unmap_section(ism); break;
default: assert(0); return;
}
} }
static inline DWORD_PTR image_get_map_rva(const struct image_section_map* ism) static inline DWORD_PTR image_get_map_rva(const struct image_section_map* ism)
{ {
if (!ism->fmap) return 0; return ism->fmap ? ism->fmap->ops->get_map_rva(ism) : 0;
switch (ism->fmap->modtype)
{
#ifndef DBGHELP_STATIC_LIB
case DMT_ELF: return elf_get_map_rva(ism);
case DMT_MACHO: return macho_get_map_rva(ism);
#endif
case DMT_PE: return pe_get_map_rva(ism);
default: assert(0); return 0;
}
} }
static inline unsigned image_get_map_size(const struct image_section_map* ism) static inline unsigned image_get_map_size(const struct image_section_map* ism)
{ {
if (!ism->fmap) return 0; return ism->fmap ? ism->fmap->ops->get_map_size(ism) : 0;
switch (ism->fmap->modtype)
{
#ifndef DBGHELP_STATIC_LIB
case DMT_ELF: return elf_get_map_size(ism);
case DMT_MACHO: return macho_get_map_size(ism);
#endif
case DMT_PE: return pe_get_map_size(ism);
default: assert(0); return 0;
}
} }

View file

@ -332,7 +332,7 @@ static void macho_unmap_ranges(const struct macho_file_map* fmap,
/****************************************************************** /******************************************************************
* macho_find_section * macho_find_section
*/ */
BOOL macho_find_section(struct image_file_map* ifm, const char* segname, const char* sectname, struct image_section_map* ism) static BOOL macho_find_segment_section(struct image_file_map* ifm, const char* segname, const char* sectname, struct image_section_map* ism)
{ {
struct macho_file_map* fmap; struct macho_file_map* fmap;
unsigned i; unsigned i;
@ -369,6 +369,11 @@ BOOL macho_find_section(struct image_file_map* ifm, const char* segname, const c
return FALSE; return FALSE;
} }
static BOOL macho_find_section(struct image_file_map* ifm, const char* sectname, struct image_section_map* ism)
{
return macho_find_segment_section(ifm, NULL, sectname, ism);
}
/****************************************************************** /******************************************************************
* macho_map_section * macho_map_section
*/ */
@ -420,6 +425,15 @@ unsigned macho_get_map_size(const struct image_section_map* ism)
return ism->fmap->u.macho.sect[ism->sidx].section.size; return ism->fmap->u.macho.sect[ism->sidx].section.size;
} }
static const struct image_file_map_ops macho_file_map_ops =
{
macho_map_section,
macho_unmap_section,
macho_find_section,
macho_get_map_rva,
macho_get_map_size,
};
/****************************************************************** /******************************************************************
* macho_map_load_commands * macho_map_load_commands
* *
@ -680,6 +694,7 @@ static BOOL macho_map_file(struct process *pcs, const WCHAR *filenameW,
reset_file_map(ifm); reset_file_map(ifm);
ifm->modtype = DMT_MACHO; ifm->modtype = DMT_MACHO;
ifm->ops = &macho_file_map_ops;
ifm->alternate = NULL; ifm->alternate = NULL;
ifm->addr_size = (pcs->is_64bit) ? 64 : 32; ifm->addr_size = (pcs->is_64bit) ? 64 : 32;
fmap->header_size = (pcs->is_64bit) ? sizeof(struct mach_header_64) : sizeof(struct mach_header); fmap->header_size = (pcs->is_64bit) ? sizeof(struct mach_header_64) : sizeof(struct mach_header);
@ -1998,30 +2013,6 @@ struct module* macho_load_module(struct process* pcs, const WCHAR* name, unsign
#else /* HAVE_MACH_O_LOADER_H */ #else /* HAVE_MACH_O_LOADER_H */
BOOL macho_find_section(struct image_file_map* ifm, const char* segname, const char* sectname, struct image_section_map* ism)
{
return FALSE;
}
const char* macho_map_section(struct image_section_map* ism)
{
return NULL;
}
void macho_unmap_section(struct image_section_map* ism)
{
}
DWORD_PTR macho_get_map_rva(const struct image_section_map* ism)
{
return 0;
}
unsigned macho_get_map_size(const struct image_section_map* ism)
{
return 0;
}
BOOL macho_synchronize_module_list(struct process* pcs) BOOL macho_synchronize_module_list(struct process* pcs)
{ {
return FALSE; return FALSE;

View file

@ -75,7 +75,7 @@ static void pe_unmap_full(struct image_file_map* fmap)
* *
* Maps a single section into memory from an PE file * Maps a single section into memory from an PE file
*/ */
const char* pe_map_section(struct image_section_map* ism) static const char* pe_map_section(struct image_section_map* ism)
{ {
void* mapping; void* mapping;
struct pe_file_map* fmap = &ism->fmap->u.pe; struct pe_file_map* fmap = &ism->fmap->u.pe;
@ -113,8 +113,8 @@ const char* pe_map_section(struct image_section_map* ism)
* Finds a section by name (and type) into memory from an PE file * Finds a section by name (and type) into memory from an PE file
* or its alternate if any * or its alternate if any
*/ */
BOOL pe_find_section(struct image_file_map* fmap, const char* name, static BOOL pe_find_section(struct image_file_map* fmap, const char* name,
struct image_section_map* ism) struct image_section_map* ism)
{ {
const char* sectname; const char* sectname;
unsigned i; unsigned i;
@ -150,7 +150,7 @@ BOOL pe_find_section(struct image_file_map* fmap, const char* name,
* *
* Unmaps a single section from memory * Unmaps a single section from memory
*/ */
void pe_unmap_section(struct image_section_map* ism) static void pe_unmap_section(struct image_section_map* ism)
{ {
if (ism->sidx >= 0 && ism->sidx < ism->fmap->u.pe.ntheader.FileHeader.NumberOfSections && if (ism->sidx >= 0 && ism->sidx < ism->fmap->u.pe.ntheader.FileHeader.NumberOfSections &&
ism->fmap->u.pe.sect[ism->sidx].mapped != IMAGE_NO_MAP) ism->fmap->u.pe.sect[ism->sidx].mapped != IMAGE_NO_MAP)
@ -165,7 +165,7 @@ void pe_unmap_section(struct image_section_map* ism)
* *
* Get the RVA of an PE section * Get the RVA of an PE section
*/ */
DWORD_PTR pe_get_map_rva(const struct image_section_map* ism) static 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) if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.pe.ntheader.FileHeader.NumberOfSections)
return 0; return 0;
@ -177,13 +177,22 @@ DWORD_PTR pe_get_map_rva(const struct image_section_map* ism)
* *
* Get the size of a PE section * Get the size of a PE section
*/ */
unsigned pe_get_map_size(const struct image_section_map* ism) static unsigned pe_get_map_size(const struct image_section_map* ism)
{ {
if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.pe.ntheader.FileHeader.NumberOfSections) if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.pe.ntheader.FileHeader.NumberOfSections)
return 0; return 0;
return ism->fmap->u.pe.sect[ism->sidx].shdr.Misc.VirtualSize; return ism->fmap->u.pe.sect[ism->sidx].shdr.Misc.VirtualSize;
} }
static const struct image_file_map_ops pe_file_map_ops =
{
pe_map_section,
pe_unmap_section,
pe_find_section,
pe_get_map_rva,
pe_get_map_size,
};
/****************************************************************** /******************************************************************
* pe_is_valid_pointer_table * pe_is_valid_pointer_table
* *
@ -208,11 +217,12 @@ static BOOL pe_is_valid_pointer_table(const IMAGE_NT_HEADERS* nthdr, const void*
* *
* Maps an PE file into memory (and checks it's a real PE file) * Maps an PE file into memory (and checks it's a real PE file)
*/ */
static BOOL pe_map_file(HANDLE file, struct image_file_map* fmap, enum module_type mt) BOOL pe_map_file(HANDLE file, struct image_file_map* fmap, enum module_type mt)
{ {
void* mapping; void* mapping;
fmap->modtype = mt; fmap->modtype = mt;
fmap->ops = &pe_file_map_ops;
fmap->alternate = NULL; fmap->alternate = NULL;
fmap->u.pe.hMap = CreateFileMappingW(file, NULL, PAGE_READONLY, 0, 0, NULL); fmap->u.pe.hMap = CreateFileMappingW(file, NULL, PAGE_READONLY, 0, 0, NULL);
if (fmap->u.pe.hMap == 0) return FALSE; if (fmap->u.pe.hMap == 0) return FALSE;

View file

@ -4,4 +4,4 @@ files:
include/dbghelp.h: sdk/include/psdk/dbghelp.h include/dbghelp.h: sdk/include/psdk/dbghelp.h
include/wine/mscvpdb.h: sdk/include/reactos/wine/mscvpdb.h include/wine/mscvpdb.h: sdk/include/reactos/wine/mscvpdb.h
tags: tags:
wine: 02dfd959ca6f2295ca279ab65f6b6429cd53673c wine: 95a5f8296188d7dd8ffb86afd4f0c3280e2f5656