ReactOS.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2024
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
List overview
Download
Ros-diffs
September 2020
----- 2024 -----
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
ros-diffs@reactos.org
25 participants
382 discussions
Start a n
N
ew thread
[reactos] 84/179: [WINESYNC] dbghelp: Move alternate file map pointer to generic image_file_map.
by winesync
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=2fc432db924a44a30d144…
commit 2fc432db924a44a30d144dbfd587446477fd5440 Author: winesync <ros-dev(a)reactos.org> AuthorDate: Fri Sep 11 16:57:26 2020 +0200 Commit: Jérôme Gardou <jerome.gardou(a)reactos.org> CommitDate: Wed Sep 16 10:35:44 2020 +0200 [WINESYNC] dbghelp: Move alternate file map pointer to generic image_file_map. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> wine commit id 02dfd959ca6f2295ca279ab65f6b6429cd53673c by Jacek Caban <jacek(a)codeweavers.com> --- dll/win32/dbghelp/elf_module.c | 61 ++++++++++++++++++++++++++------------- dll/win32/dbghelp/image_private.h | 29 ++++++++++++++----- dll/win32/dbghelp/macho_module.c | 1 + dll/win32/dbghelp/pe_module.c | 1 + sdk/tools/winesync/dbghelp.cfg | 2 +- 5 files changed, 65 insertions(+), 29 deletions(-) diff --git a/dll/win32/dbghelp/elf_module.c b/dll/win32/dbghelp/elf_module.c index 1013b70749a..a5b7c1dc5ca 100644 --- a/dll/win32/dbghelp/elf_module.c +++ b/dll/win32/dbghelp/elf_module.c @@ -176,14 +176,36 @@ const char* elf_map_section(struct image_section_map* ism) * Finds a section by name (and type) into memory from an ELF file * or its alternate if any */ -BOOL elf_find_section(struct image_file_map* _fmap, const char* name, - unsigned sht, struct image_section_map* ism) +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; + unsigned i; + + if (fmap->shstrtab == IMAGE_NO_MAP) + { + struct image_section_map hdr_ism = {_fmap, fmap->elfhdr.e_shstrndx}; + if ((fmap->shstrtab = elf_map_section(&hdr_ism)) == IMAGE_NO_MAP) return FALSE; + } + for (i = 0; i < fmap->elfhdr.e_shnum; i++) + { + if (strcmp(fmap->shstrtab + fmap->sect[i].shdr.sh_name, name) == 0) + { + ism->fmap = _fmap; + ism->sidx = i; + return TRUE; + } + } + return FALSE; +} + +static BOOL elf_find_section_type(struct image_file_map* _fmap, const char* name, unsigned sht, struct image_section_map* ism) { struct elf_file_map* fmap; unsigned i; while (_fmap) { + if (_fmap->modtype != DMT_ELF) break; fmap = &_fmap->u.elf; if (fmap->shstrtab == IMAGE_NO_MAP) { @@ -192,15 +214,14 @@ BOOL elf_find_section(struct image_file_map* _fmap, const char* name, } for (i = 0; i < fmap->elfhdr.e_shnum; i++) { - if (strcmp(fmap->shstrtab + fmap->sect[i].shdr.sh_name, name) == 0 && - (sht == SHT_NULL || sht == fmap->sect[i].shdr.sh_type)) + if (strcmp(fmap->shstrtab + fmap->sect[i].shdr.sh_name, name) == 0 && sht == fmap->sect[i].shdr.sh_type) { ism->fmap = _fmap; ism->sidx = i; return TRUE; } } - _fmap = fmap->alternate; + _fmap = _fmap->alternate; } ism->fmap = NULL; ism->sidx = -1; @@ -229,13 +250,13 @@ static void elf_end_find(struct image_file_map* fmap) { struct image_section_map ism; - while (fmap) + while (fmap && fmap->modtype == DMT_ELF) { ism.fmap = fmap; ism.sidx = fmap->u.elf.elfhdr.e_shstrndx; elf_unmap_section(&ism); fmap->u.elf.shstrtab = IMAGE_NO_MAP; - fmap = fmap->u.elf.alternate; + fmap = fmap->alternate; } } @@ -265,9 +286,9 @@ unsigned elf_get_map_size(const struct image_section_map* ism) static inline void elf_reset_file_map(struct image_file_map* fmap) { + fmap->alternate = NULL; fmap->u.elf.handle = INVALID_HANDLE_VALUE; fmap->u.elf.shstrtab = IMAGE_NO_MAP; - fmap->u.elf.alternate = NULL; fmap->u.elf.target_copy = NULL; } @@ -512,7 +533,7 @@ static BOOL elf_map_file(struct elf_map_file_data* emfd, struct image_file_map* */ static void elf_unmap_file(struct image_file_map* fmap) { - while (fmap) + while (fmap && fmap->modtype == DMT_ELF) { if (fmap->u.elf.handle != INVALID_HANDLE_VALUE) { @@ -526,7 +547,7 @@ static void elf_unmap_file(struct image_file_map* fmap) CloseHandle(fmap->u.elf.handle); } HeapFree(GetProcessHeap(), 0, fmap->u.elf.target_copy); - fmap = fmap->u.elf.alternate; + fmap = fmap->alternate; } } @@ -573,8 +594,8 @@ static void elf_hash_symtab(struct module* module, struct pool* pool, struct image_section_map ism, ism_str; const char *symtab; - if (!elf_find_section(fmap, ".symtab", SHT_SYMTAB, &ism) && - !elf_find_section(fmap, ".dynsym", SHT_DYNSYM, &ism)) return; + if (!elf_find_section_type(fmap, ".symtab", SHT_SYMTAB, &ism) && + !elf_find_section_type(fmap, ".dynsym", SHT_DYNSYM, &ism)) return; if ((symtab = image_map_section(&ism)) == IMAGE_NO_MAP) return; ism_str.fmap = ism.fmap; ism_str.sidx = fmap->u.elf.sect[ism.sidx].shdr.sh_link; @@ -1040,7 +1061,7 @@ static BOOL elf_locate_debug_link(struct image_file_map* fmap, const char* filen found: TRACE("Located debug information file %s at %s\n", filename, debugstr_w(p)); HeapFree(GetProcessHeap(), 0, p); - fmap->u.elf.alternate = fmap_link; + fmap->alternate = fmap_link; return TRUE; } @@ -1094,7 +1115,7 @@ static BOOL elf_locate_build_id_target(struct image_file_map* fmap, const BYTE* if (elf_map_file(&emfd, fmap_link)) { struct image_section_map buildid_sect; - if (elf_find_section(fmap_link, ".note.gnu.build-id", SHT_NULL, &buildid_sect)) + if (image_find_section(fmap_link, ".note.gnu.build-id", &buildid_sect)) { const uint32_t* note; @@ -1109,7 +1130,7 @@ static BOOL elf_locate_build_id_target(struct image_file_map* fmap, const BYTE* { TRACE("Located debug information file at %s\n", debugstr_w(p)); HeapFree(GetProcessHeap(), 0, p); - fmap->u.elf.alternate = fmap_link; + fmap->alternate = fmap_link; return TRUE; } WARN("mismatch in buildid information for %s\n", wine_dbgstr_w(p)); @@ -1223,8 +1244,8 @@ static BOOL elf_load_debug_info_from_map(struct module* module, /* check if we need an alternate file (from debuglink or build-id) */ ret = elf_check_alternate(fmap, module); - if (elf_find_section(fmap, ".stab", SHT_NULL, &stab_sect) && - elf_find_section(fmap, ".stabstr", SHT_NULL, &stabstr_sect)) + if (image_find_section(fmap, ".stab", &stab_sect) && + image_find_section(fmap, ".stabstr", &stabstr_sect)) { const char* stab; const char* stabstr; @@ -1323,7 +1344,7 @@ static BOOL elf_load_file_from_fmap(struct process* pcs, const WCHAR* filename, { struct image_section_map ism; - if (elf_find_section(fmap, ".dynamic", SHT_DYNAMIC, &ism)) + if (elf_find_section_type(fmap, ".dynamic", SHT_DYNAMIC, &ism)) { char* ptr = (char*)(ULONG_PTR)fmap->u.elf.sect[ism.sidx].shdr.sh_addr; unsigned long len; @@ -1385,7 +1406,7 @@ static BOOL elf_load_file_from_fmap(struct process* pcs, const WCHAR* filename, struct image_section_map ism; unsigned long modbase = load_offset; - if (elf_find_section(fmap, ".dynamic", SHT_DYNAMIC, &ism)) + if (elf_find_section_type(fmap, ".dynamic", SHT_DYNAMIC, &ism)) { unsigned long rva_dyn = elf_get_map_rva(&ism); @@ -2016,7 +2037,7 @@ BOOL elf_synchronize_module_list(struct process* pcs) #else /* !__ELF__ */ BOOL elf_find_section(struct image_file_map* fmap, const char* name, - unsigned sht, struct image_section_map* ism) + struct image_section_map* ism) { return FALSE; } diff --git a/dll/win32/dbghelp/image_private.h b/dll/win32/dbghelp/image_private.h index 2d9b354f7a6..072c956c3e5 100644 --- a/dll/win32/dbghelp/image_private.h +++ b/dll/win32/dbghelp/image_private.h @@ -63,6 +63,7 @@ struct image_file_map { enum module_type modtype; unsigned addr_size; /* either 16 (not used), 32 or 64 */ + struct image_file_map* alternate; /* another file linked to this one */ union { struct elf_file_map @@ -71,7 +72,6 @@ struct image_file_map size_t elf_start; HANDLE handle; const char* shstrtab; - struct image_file_map* alternate; /* another ELF file (linked to this one) */ char* target_copy; #if defined(__ELF__) && !defined(DBGHELP_STATIC_LIB) Elf64_Ehdr elfhdr; @@ -132,7 +132,7 @@ struct image_section_map }; extern BOOL elf_find_section(struct image_file_map* fmap, const char* name, - unsigned sht, struct image_section_map* ism) DECLSPEC_HIDDEN; + struct image_section_map* ism) DECLSPEC_HIDDEN; extern const char* elf_map_section(struct image_section_map* ism) DECLSPEC_HIDDEN; extern void elf_unmap_section(struct image_section_map* ism) DECLSPEC_HIDDEN; extern DWORD_PTR elf_get_map_rva(const struct image_section_map* ism) DECLSPEC_HIDDEN; @@ -155,15 +155,28 @@ extern unsigned pe_get_map_size(const struct image_section_map* psm) DECLSPE static inline BOOL image_find_section(struct image_file_map* fmap, const char* name, struct image_section_map* ism) { - switch (fmap->modtype) + while (fmap) { + switch (fmap->modtype) + { #ifndef DBGHELP_STATIC_LIB - case DMT_ELF: return elf_find_section(fmap, name, SHT_NULL, ism); - case DMT_MACHO: return macho_find_section(fmap, NULL, name, ism); -#endif - case DMT_PE: return pe_find_section(fmap, name, ism); - default: assert(0); return FALSE; + 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; } + ism->fmap = NULL; + ism->sidx = -1; + return FALSE; } static inline const char* image_map_section(struct image_section_map* ism) diff --git a/dll/win32/dbghelp/macho_module.c b/dll/win32/dbghelp/macho_module.c index f957439d435..1df48c8a951 100644 --- a/dll/win32/dbghelp/macho_module.c +++ b/dll/win32/dbghelp/macho_module.c @@ -680,6 +680,7 @@ static BOOL macho_map_file(struct process *pcs, const WCHAR *filenameW, reset_file_map(ifm); ifm->modtype = DMT_MACHO; + ifm->alternate = NULL; ifm->addr_size = (pcs->is_64bit) ? 64 : 32; fmap->header_size = (pcs->is_64bit) ? sizeof(struct mach_header_64) : sizeof(struct mach_header); diff --git a/dll/win32/dbghelp/pe_module.c b/dll/win32/dbghelp/pe_module.c index 1217a8edd0c..2134804ccaa 100644 --- a/dll/win32/dbghelp/pe_module.c +++ b/dll/win32/dbghelp/pe_module.c @@ -213,6 +213,7 @@ static BOOL pe_map_file(HANDLE file, struct image_file_map* fmap, enum module_ty void* mapping; fmap->modtype = mt; + fmap->alternate = NULL; fmap->u.pe.hMap = CreateFileMappingW(file, NULL, PAGE_READONLY, 0, 0, NULL); if (fmap->u.pe.hMap == 0) return FALSE; fmap->u.pe.full_count = 0; diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg index b5e65c980e9..d04078ef2a3 100644 --- a/sdk/tools/winesync/dbghelp.cfg +++ b/sdk/tools/winesync/dbghelp.cfg @@ -4,4 +4,4 @@ files: include/dbghelp.h: sdk/include/psdk/dbghelp.h include/wine/mscvpdb.h: sdk/include/reactos/wine/mscvpdb.h tags: - wine: a3e1c7fa02351b032de60fc2a685f14e9f7308fe + wine: 02dfd959ca6f2295ca279ab65f6b6429cd53673c
4 years
1
0
0
0
[reactos] 83/179: [WINESYNC] dbghelp: Use generic image_find_section in elf_check_alternate.
by winesync
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=bf6f0cfe9b75374ee68bb…
commit bf6f0cfe9b75374ee68bb88d55fc1cd18a056b51 Author: winesync <ros-dev(a)reactos.org> AuthorDate: Fri Sep 11 16:57:26 2020 +0200 Commit: Jérôme Gardou <jerome.gardou(a)reactos.org> CommitDate: Wed Sep 16 10:35:44 2020 +0200 [WINESYNC] dbghelp: Use generic image_find_section in elf_check_alternate. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> wine commit id a3e1c7fa02351b032de60fc2a685f14e9f7308fe by Jacek Caban <jacek(a)codeweavers.com> --- dll/win32/dbghelp/elf_module.c | 4 ++-- sdk/tools/winesync/dbghelp.cfg | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dll/win32/dbghelp/elf_module.c b/dll/win32/dbghelp/elf_module.c index 648169b9806..1013b70749a 100644 --- a/dll/win32/dbghelp/elf_module.c +++ b/dll/win32/dbghelp/elf_module.c @@ -1139,7 +1139,7 @@ static BOOL elf_check_alternate(struct image_file_map* fmap, const struct module struct image_section_map buildid_sect, debuglink_sect; /* if present, add the .gnu_debuglink file as an alternate to current one */ - if (elf_find_section(fmap, ".note.gnu.build-id", SHT_NULL, &buildid_sect)) + if (image_find_section(fmap, ".note.gnu.build-id", &buildid_sect)) { const uint32_t* note; @@ -1156,7 +1156,7 @@ static BOOL elf_check_alternate(struct image_file_map* fmap, const struct module image_unmap_section(&buildid_sect); } /* if present, add the .gnu_debuglink file as an alternate to current one */ - if (!ret && elf_find_section(fmap, ".gnu_debuglink", SHT_NULL, &debuglink_sect)) + if (!ret && image_find_section(fmap, ".gnu_debuglink", &debuglink_sect)) { const char* dbg_link; diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg index dc32ebbc6fe..b5e65c980e9 100644 --- a/sdk/tools/winesync/dbghelp.cfg +++ b/sdk/tools/winesync/dbghelp.cfg @@ -4,4 +4,4 @@ files: include/dbghelp.h: sdk/include/psdk/dbghelp.h include/wine/mscvpdb.h: sdk/include/reactos/wine/mscvpdb.h tags: - wine: a60b3985bf37827fd0b0f7583c31dcf52069b4a8 + wine: a3e1c7fa02351b032de60fc2a685f14e9f7308fe
4 years
1
0
0
0
[reactos] 82/179: [WINESYNC] dbghelp: Use Windows API to map ELF files.
by winesync
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=4fc82fc5bda5360f006c7…
commit 4fc82fc5bda5360f006c7dff35a5bfd527e66e04 Author: winesync <ros-dev(a)reactos.org> AuthorDate: Fri Sep 11 16:57:25 2020 +0200 Commit: Jérôme Gardou <jerome.gardou(a)reactos.org> CommitDate: Wed Sep 16 10:35:44 2020 +0200 [WINESYNC] dbghelp: Use Windows API to map ELF files. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> wine commit id a60b3985bf37827fd0b0f7583c31dcf52069b4a8 by Jacek Caban <jacek(a)codeweavers.com> --- dll/win32/dbghelp/elf_module.c | 168 +++++++++++++++++++++----------------- dll/win32/dbghelp/image_private.h | 2 +- sdk/tools/winesync/dbghelp.cfg | 2 +- 3 files changed, 95 insertions(+), 77 deletions(-) diff --git a/dll/win32/dbghelp/elf_module.c b/dll/win32/dbghelp/elf_module.c index 96b16fd5c0c..648169b9806 100644 --- a/dll/win32/dbghelp/elf_module.c +++ b/dll/win32/dbghelp/elf_module.c @@ -32,16 +32,6 @@ #include <assert.h> #include <stdio.h> #include <stdlib.h> -#ifdef HAVE_SYS_STAT_H -# include <sys/stat.h> -#endif -#include <fcntl.h> -#ifdef HAVE_SYS_MMAN_H -#include <sys/mman.h> -#endif -#ifdef HAVE_UNISTD_H -# include <unistd.h> -#endif #include "dbghelp_private.h" #include "winternl.h" @@ -147,7 +137,9 @@ struct elf_module_info const char* elf_map_section(struct image_section_map* ism) { struct elf_file_map* fmap = &ism->fmap->u.elf; - size_t ofst, size, pgsz = sysconf( _SC_PAGESIZE ); + SYSTEM_INFO sysinfo; + SIZE_T ofst, size; + HANDLE mapping; assert(ism->fmap->modtype == DMT_ELF); if (ism->sidx < 0 || ism->sidx >= ism->fmap->u.elf.elfhdr.e_shnum || @@ -158,14 +150,24 @@ const char* elf_map_section(struct image_section_map* ism) { return fmap->target_copy + fmap->sect[ism->sidx].shdr.sh_offset; } - /* align required information on page size (we assume pagesize is a power of 2) */ - ofst = fmap->sect[ism->sidx].shdr.sh_offset & ~(pgsz - 1); - size = ((fmap->sect[ism->sidx].shdr.sh_offset + - fmap->sect[ism->sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1)) - ofst; - fmap->sect[ism->sidx].mapped = mmap(NULL, size, PROT_READ, MAP_PRIVATE, - fmap->fd, ofst); - if (fmap->sect[ism->sidx].mapped == IMAGE_NO_MAP) return IMAGE_NO_MAP; - return fmap->sect[ism->sidx].mapped + (fmap->sect[ism->sidx].shdr.sh_offset & (pgsz - 1)); + + /* align required information on allocation granularity */ + GetSystemInfo(&sysinfo); + ofst = fmap->sect[ism->sidx].shdr.sh_offset & ~(sysinfo.dwAllocationGranularity - 1); + size = fmap->sect[ism->sidx].shdr.sh_offset + fmap->sect[ism->sidx].shdr.sh_size - ofst; + if (!(mapping = CreateFileMappingW(fmap->handle, NULL, PAGE_READONLY, 0, ofst + size, NULL))) + { + ERR("map creation %p failed %u offset %lu %lu size %lu\n", fmap->handle, GetLastError(), ofst, ofst % 4096, size); + return IMAGE_NO_MAP; + } + fmap->sect[ism->sidx].mapped = MapViewOfFile(mapping, FILE_MAP_READ, 0, ofst, size); + CloseHandle(mapping); + if (!fmap->sect[ism->sidx].mapped) + { + ERR("map %p failed %u offset %lu %lu size %lu\n", fmap->handle, GetLastError(), ofst, ofst % 4096, size); + return IMAGE_NO_MAP; + } + return fmap->sect[ism->sidx].mapped + (fmap->sect[ism->sidx].shdr.sh_offset & (sysinfo.dwAllocationGranularity - 1)); } /****************************************************************** @@ -215,15 +217,11 @@ void elf_unmap_section(struct image_section_map* ism) struct elf_file_map* fmap = &ism->fmap->u.elf; if (ism->sidx >= 0 && ism->sidx < fmap->elfhdr.e_shnum && !fmap->target_copy && - fmap->sect[ism->sidx].mapped != IMAGE_NO_MAP) + fmap->sect[ism->sidx].mapped) { - size_t pgsz = sysconf( _SC_PAGESIZE ); - size_t ofst = fmap->sect[ism->sidx].shdr.sh_offset & ~(pgsz - 1); - size_t size = ((fmap->sect[ism->sidx].shdr.sh_offset + - fmap->sect[ism->sidx].shdr.sh_size + pgsz - 1) & ~(pgsz - 1)) - ofst; - if (munmap((char*)fmap->sect[ism->sidx].mapped, size) < 0) + if (!UnmapViewOfFile(fmap->sect[ism->sidx].mapped)) WARN("Couldn't unmap the section\n"); - fmap->sect[ism->sidx].mapped = IMAGE_NO_MAP; + fmap->sect[ism->sidx].mapped = NULL; } } @@ -267,7 +265,7 @@ unsigned elf_get_map_size(const struct image_section_map* ism) static inline void elf_reset_file_map(struct image_file_map* fmap) { - fmap->u.elf.fd = -1; + fmap->u.elf.handle = INVALID_HANDLE_VALUE; fmap->u.elf.shstrtab = IMAGE_NO_MAP; fmap->u.elf.alternate = NULL; fmap->u.elf.target_copy = NULL; @@ -293,12 +291,16 @@ struct elf_map_file_data static BOOL elf_map_file_read(struct image_file_map* fmap, struct elf_map_file_data* emfd, void* buf, size_t len, off_t off) { + LARGE_INTEGER li; + DWORD bytes_read; SIZE_T dw; switch (emfd->kind) { case from_file: - return pread(fmap->u.elf.fd, buf, len, off) == len; + li.QuadPart = off; + if (!SetFilePointerEx(fmap->u.elf.handle, li, NULL, FILE_BEGIN)) return FALSE; + return ReadFile(fmap->u.elf.handle, buf, len, &bytes_read, NULL); case from_process: return ReadProcessMemory(emfd->u.process.handle, (void*)((unsigned long)emfd->u.process.load_addr + (unsigned long)off), @@ -339,6 +341,29 @@ static BOOL elf_map_shdr(struct elf_map_file_data* emfd, struct image_file_map* return TRUE; } +static WCHAR *get_dos_file_name(const WCHAR *filename) +{ + WCHAR *dos_path; + size_t len; + + if (*filename == '/') + { + char *unix_path; + len = WideCharToMultiByte(CP_UNIXCP, 0, filename, -1, NULL, 0, NULL, NULL); + unix_path = heap_alloc(len * sizeof(WCHAR)); + WideCharToMultiByte(CP_UNIXCP, 0, filename, -1, unix_path, len, NULL, NULL); + dos_path = wine_get_dos_file_name(unix_path); + heap_free(unix_path); + } + else + { + len = lstrlenW(filename); + dos_path = heap_alloc((len + 1) * sizeof(WCHAR)); + memcpy(dos_path, filename, (len + 1) * sizeof(WCHAR)); + } + return dos_path; +} + /****************************************************************** * elf_map_file * @@ -347,53 +372,35 @@ static BOOL elf_map_shdr(struct elf_map_file_data* emfd, struct image_file_map* static BOOL elf_map_file(struct elf_map_file_data* emfd, struct image_file_map* fmap) { static const BYTE elf_signature[4] = { ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3 }; - struct stat statbuf; unsigned int i; size_t tmp, page_mask = sysconf( _SC_PAGESIZE ) - 1; - char* filename; - unsigned len; - BOOL ret = FALSE; + WCHAR *dos_path; unsigned char e_ident[EI_NIDENT]; - switch (emfd->kind) - { - case from_file: - len = WideCharToMultiByte(CP_UNIXCP, 0, emfd->u.file.filename, -1, NULL, 0, NULL, NULL); - if (!(filename = HeapAlloc(GetProcessHeap(), 0, len))) return FALSE; - WideCharToMultiByte(CP_UNIXCP, 0, emfd->u.file.filename, -1, filename, len, NULL, NULL); - break; - case from_process: - filename = NULL; - break; - default: assert(0); - return FALSE; - } - elf_reset_file_map(fmap); fmap->modtype = DMT_ELF; - fmap->u.elf.fd = -1; + fmap->u.elf.handle = INVALID_HANDLE_VALUE; fmap->u.elf.target_copy = NULL; switch (emfd->kind) { case from_file: - /* check that the file exists, and that the module hasn't been loaded yet */ - if (stat(filename, &statbuf) == -1 || S_ISDIR(statbuf.st_mode)) goto done; - - /* Now open the file, so that we can mmap() it. */ - if ((fmap->u.elf.fd = open(filename, O_RDONLY)) == -1) goto done; + if (!(dos_path = get_dos_file_name(emfd->u.file.filename))) return FALSE; + fmap->u.elf.handle = CreateFileW(dos_path, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); + heap_free(dos_path); + if (fmap->u.elf.handle == INVALID_HANDLE_VALUE) return FALSE; break; case from_process: break; } if (!elf_map_file_read(fmap, emfd, e_ident, sizeof(e_ident), 0)) - goto done; + return FALSE; /* and check for an ELF header */ if (memcmp(e_ident, elf_signature, sizeof(elf_signature))) - goto done; + return FALSE; fmap->addr_size = e_ident[EI_CLASS] == ELFCLASS64 ? 64 : 32; @@ -402,7 +409,7 @@ static BOOL elf_map_file(struct elf_map_file_data* emfd, struct image_file_map* Elf32_Ehdr elfhdr32; if (!elf_map_file_read(fmap, emfd, &elfhdr32, sizeof(elfhdr32), 0)) - goto done; + return FALSE; memcpy(fmap->u.elf.elfhdr.e_ident, elfhdr32.e_ident, EI_NIDENT); fmap->u.elf.elfhdr.e_type = elfhdr32.e_type; @@ -422,12 +429,12 @@ static BOOL elf_map_file(struct elf_map_file_data* emfd, struct image_file_map* else { if (!elf_map_file_read(fmap, emfd, &fmap->u.elf.elfhdr, sizeof(fmap->u.elf.elfhdr), 0)) - goto done; + return FALSE; } fmap->u.elf.sect = HeapAlloc(GetProcessHeap(), 0, fmap->u.elf.elfhdr.e_shnum * sizeof(fmap->u.elf.sect[0])); - if (!fmap->u.elf.sect) goto done; + if (!fmap->u.elf.sect) return FALSE; for (i = 0; i < fmap->u.elf.elfhdr.e_shnum; i++) { @@ -435,9 +442,9 @@ static BOOL elf_map_file(struct elf_map_file_data* emfd, struct image_file_map* { HeapFree(GetProcessHeap(), 0, fmap->u.elf.sect); fmap->u.elf.sect = NULL; - goto done; + return FALSE; } - fmap->u.elf.sect[i].mapped = IMAGE_NO_MAP; + fmap->u.elf.sect[i].mapped = NULL; } /* grab size of module once loaded in memory */ @@ -484,21 +491,18 @@ static BOOL elf_map_file(struct elf_map_file_data* emfd, struct image_file_map* if (!(fmap->u.elf.target_copy = HeapAlloc(GetProcessHeap(), 0, fmap->u.elf.elf_size))) { HeapFree(GetProcessHeap(), 0, fmap->u.elf.sect); - goto done; + return FALSE; } if (!ReadProcessMemory(emfd->u.process.handle, emfd->u.process.load_addr, fmap->u.elf.target_copy, fmap->u.elf.elf_size, NULL)) { HeapFree(GetProcessHeap(), 0, fmap->u.elf.target_copy); HeapFree(GetProcessHeap(), 0, fmap->u.elf.sect); - goto done; + return FALSE; } break; } - ret = TRUE; -done: - HeapFree(GetProcessHeap(), 0, filename); - return ret; + return TRUE; } /****************************************************************** @@ -510,7 +514,7 @@ static void elf_unmap_file(struct image_file_map* fmap) { while (fmap) { - if (fmap->u.elf.fd != -1) + if (fmap->u.elf.handle != INVALID_HANDLE_VALUE) { struct image_section_map ism; ism.fmap = fmap; @@ -519,7 +523,7 @@ static void elf_unmap_file(struct image_file_map* fmap) elf_unmap_section(&ism); } HeapFree(GetProcessHeap(), 0, fmap->u.elf.sect); - close(fmap->u.elf.fd); + CloseHandle(fmap->u.elf.handle); } HeapFree(GetProcessHeap(), 0, fmap->u.elf.target_copy); fmap = fmap->u.elf.alternate; @@ -934,21 +938,35 @@ static int elf_new_public_symbols(struct module* module, const struct hash_table return TRUE; } -static BOOL elf_check_debug_link(const WCHAR* file, struct image_file_map* fmap, DWORD crc) +static DWORD calc_crc(HANDLE handle) +{ + BYTE buffer[8192]; + DWORD crc = 0; + DWORD len; + + SetFilePointer(handle, 0, 0, FILE_BEGIN); + while (ReadFile(handle, buffer, sizeof(buffer), &len, NULL) && len) + crc = RtlComputeCrc32(crc, buffer, len); + return crc; +} + +static BOOL elf_check_debug_link(const WCHAR* file, struct image_file_map* fmap, DWORD link_crc) { - BOOL ret; struct elf_map_file_data emfd; + DWORD crc; emfd.kind = from_file; emfd.u.file.filename = file; if (!elf_map_file(&emfd, fmap)) return FALSE; - if (!(ret = crc == calc_crc32(fmap->u.elf.fd))) + + crc = calc_crc(fmap->u.elf.handle); + if (crc != link_crc) { - WARN("Bad CRC for file %s (got %08x while expecting %08x)\n", - debugstr_w(file), calc_crc32(fmap->u.elf.fd), crc); + WARN("Bad CRC for file %s (got %08x while expecting %08x)\n", debugstr_w(file), crc, link_crc); elf_unmap_file(fmap); + return FALSE; } - return ret; + return TRUE; } /****************************************************************** @@ -1290,7 +1308,7 @@ BOOL elf_fetch_file_info(const WCHAR* name, DWORD_PTR* base, if (!elf_map_file(&emfd, &fmap)) return FALSE; if (base) *base = fmap.u.elf.elf_start; *size = fmap.u.elf.elf_size; - *checksum = calc_crc32(fmap.u.elf.fd); + *checksum = calc_crc(fmap.u.elf.handle); elf_unmap_file(&fmap); return TRUE; } @@ -1386,7 +1404,7 @@ static BOOL elf_load_file_from_fmap(struct process* pcs, const WCHAR* filename, sizeof(struct module_format) + sizeof(struct elf_module_info)); if (!modfmt) return FALSE; elf_info->module = module_new(pcs, filename, DMT_ELF, FALSE, modbase, - fmap->u.elf.elf_size, 0, calc_crc32(fmap->u.elf.fd)); + fmap->u.elf.elf_size, 0, calc_crc(fmap->u.elf.handle)); if (!elf_info->module) { HeapFree(GetProcessHeap(), 0, modfmt); diff --git a/dll/win32/dbghelp/image_private.h b/dll/win32/dbghelp/image_private.h index fd5a7c91d69..2d9b354f7a6 100644 --- a/dll/win32/dbghelp/image_private.h +++ b/dll/win32/dbghelp/image_private.h @@ -69,7 +69,7 @@ struct image_file_map { size_t elf_size; size_t elf_start; - int fd; + HANDLE handle; const char* shstrtab; struct image_file_map* alternate; /* another ELF file (linked to this one) */ char* target_copy; diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg index abdb0e40ad3..dc32ebbc6fe 100644 --- a/sdk/tools/winesync/dbghelp.cfg +++ b/sdk/tools/winesync/dbghelp.cfg @@ -4,4 +4,4 @@ files: include/dbghelp.h: sdk/include/psdk/dbghelp.h include/wine/mscvpdb.h: sdk/include/reactos/wine/mscvpdb.h tags: - wine: d731208602393877709d3bb0bdeb28c80f9719b0 + wine: a60b3985bf37827fd0b0f7583c31dcf52069b4a8
4 years
1
0
0
0
[reactos] 81/179: [WINESYNC] dbghelp: Search also real path location in path_find_symbol_file.
by winesync
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=c82f34344e88b2e6b68a8…
commit c82f34344e88b2e6b68a8cbe0b4d5ab78f8c44dd Author: winesync <ros-dev(a)reactos.org> AuthorDate: Fri Sep 11 16:57:23 2020 +0200 Commit: Jérôme Gardou <jerome.gardou(a)reactos.org> CommitDate: Wed Sep 16 10:35:44 2020 +0200 [WINESYNC] dbghelp: Search also real path location in path_find_symbol_file. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> wine commit id d731208602393877709d3bb0bdeb28c80f9719b0 by Jacek Caban <jacek(a)codeweavers.com> --- dll/win32/dbghelp/path.c | 5 +++++ sdk/tools/winesync/dbghelp.cfg | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/dll/win32/dbghelp/path.c b/dll/win32/dbghelp/path.c index f8a7f3d890a..014c79c4790 100644 --- a/dll/win32/dbghelp/path.c +++ b/dll/win32/dbghelp/path.c @@ -664,6 +664,11 @@ BOOL path_find_symbol_file(const struct process* pcs, const struct module* modul /* 2. check module-path */ file_pathW(module->module.LoadedImageName, buffer); if (do_searchW(filename, buffer, FALSE, module_find_cb, &mf)) return TRUE; + if (module->real_path) + { + file_pathW(module->real_path, buffer); + if (do_searchW(filename, buffer, FALSE, module_find_cb, &mf)) return TRUE; + } while (searchPath) { diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg index 3b36c85191e..abdb0e40ad3 100644 --- a/sdk/tools/winesync/dbghelp.cfg +++ b/sdk/tools/winesync/dbghelp.cfg @@ -4,4 +4,4 @@ files: include/dbghelp.h: sdk/include/psdk/dbghelp.h include/wine/mscvpdb.h: sdk/include/reactos/wine/mscvpdb.h tags: - wine: e21b61392cbc3a4879f837316c869c44b8dcf685 + wine: d731208602393877709d3bb0bdeb28c80f9719b0
4 years
1
0
0
0
[reactos] 80/179: [WINESYNC] dbghelp: Try loading builtin modules from unix installation.
by winesync
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=95f6a74d855565e92caf3…
commit 95f6a74d855565e92caf3c9de4c873ff945ee765 Author: winesync <ros-dev(a)reactos.org> AuthorDate: Fri Sep 11 16:56:27 2020 +0200 Commit: Jérôme Gardou <jerome.gardou(a)reactos.org> CommitDate: Wed Sep 16 10:35:44 2020 +0200 [WINESYNC] dbghelp: Try loading builtin modules from unix installation. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> wine commit id e21b61392cbc3a4879f837316c869c44b8dcf685 by Jacek Caban <jacek(a)codeweavers.com> --- dll/win32/dbghelp/dbghelp_private.h | 1 + dll/win32/dbghelp/image_private.h | 1 + dll/win32/dbghelp/module.c | 1 + dll/win32/dbghelp/pe_module.c | 94 +++++++++++++++++++++++++++++++++++++ sdk/tools/winesync/dbghelp.cfg | 2 +- 5 files changed, 98 insertions(+), 1 deletion(-) diff --git a/dll/win32/dbghelp/dbghelp_private.h b/dll/win32/dbghelp/dbghelp_private.h index 27cb8f2f453..d9cddae5f02 100644 --- a/dll/win32/dbghelp/dbghelp_private.h +++ b/dll/win32/dbghelp/dbghelp_private.h @@ -384,6 +384,7 @@ struct module enum module_type type : 16; unsigned short is_virtual : 1; DWORD64 reloc_delta; + WCHAR* real_path; /* specific information for debug types */ struct module_format* format_info[DFI_LAST]; diff --git a/dll/win32/dbghelp/image_private.h b/dll/win32/dbghelp/image_private.h index 46275481f96..fd5a7c91d69 100644 --- a/dll/win32/dbghelp/image_private.h +++ b/dll/win32/dbghelp/image_private.h @@ -112,6 +112,7 @@ struct image_file_map { HANDLE hMap; IMAGE_NT_HEADERS ntheader; + BOOL builtin; unsigned full_count; void* full_map; struct diff --git a/dll/win32/dbghelp/module.c b/dll/win32/dbghelp/module.c index 4dca1cf0a9b..5243b53a829 100644 --- a/dll/win32/dbghelp/module.c +++ b/dll/win32/dbghelp/module.c @@ -732,6 +732,7 @@ BOOL module_remove(struct process* pcs, struct module* module) hash_table_destroy(&module->ht_types); HeapFree(GetProcessHeap(), 0, module->sources); HeapFree(GetProcessHeap(), 0, module->addr_sorttab); + HeapFree(GetProcessHeap(), 0, module->real_path); pool_destroy(&module->pool); /* native dbghelp doesn't invoke registered callback(,CBA_SYMBOLS_UNLOADED,) here * so do we diff --git a/dll/win32/dbghelp/pe_module.c b/dll/win32/dbghelp/pe_module.c index 54a830c5420..1217a8edd0c 100644 --- a/dll/win32/dbghelp/pe_module.c +++ b/dll/win32/dbghelp/pe_module.c @@ -34,6 +34,7 @@ #ifndef DBGHELP_STATIC_LIB #include "winternl.h" #include "wine/debug.h" +#include "wine/heap.h" #endif WINE_DEFAULT_DEBUG_CHANNEL(dbghelp); @@ -43,6 +44,8 @@ struct pe_module_info struct image_file_map fmap; }; +static const char builtin_signature[] = "Wine builtin DLL"; + static void* pe_map_full(struct image_file_map* fmap, IMAGE_NT_HEADERS** nth) { if (!fmap->u.pe.full_map) @@ -232,6 +235,8 @@ static BOOL pe_map_file(HANDLE file, struct image_file_map* fmap, enum module_ty case 0x20b: fmap->addr_size = 64; break; default: return FALSE; } + + fmap->u.pe.builtin = !memcmp((const IMAGE_DOS_HEADER*)mapping + 1, builtin_signature, sizeof(builtin_signature)); section = (IMAGE_SECTION_HEADER*) ((char*)&nthdr->OptionalHeader + nthdr->FileHeader.SizeOfOptionalHeader); fmap->u.pe.sect = HeapAlloc(GetProcessHeap(), 0, @@ -756,6 +761,72 @@ BOOL pe_load_debug_info(const struct process* pcs, struct module* module) return ret; } +#ifndef __REACTOS__ +static WCHAR *find_builtin_pe(const WCHAR *path, HANDLE *file) +{ + const WCHAR *base_name; + size_t len, i; + WCHAR *buf; + + static const WCHAR winebuilddirW[] = {'W','I','N','E','B','U','I','L','D','D','I','R',0}; + static const WCHAR winedlldirW[] = {'W','I','N','E','D','L','L','D','I','R','%','u',0}; + + if ((base_name = strrchrW(path, '\\'))) base_name++; + else base_name = path; + + if ((len = GetEnvironmentVariableW(winebuilddirW, NULL, 0))) + { + WCHAR *p, *end; + const WCHAR dllsW[] = { '\\','d','l','l','s','\\' }; + const WCHAR programsW[] = { '\\','p','r','o','g','r','a','m','s','\\' }; + const WCHAR dot_dllW[] = {'.','d','l','l',0}; + const WCHAR dot_exeW[] = {'.','e','x','e',0}; + + if (!(buf = heap_alloc((len + 8 + 2 * lstrlenW(base_name)) * sizeof(WCHAR)))) return NULL; + end = buf + GetEnvironmentVariableW(winebuilddirW, buf, len); + + memcpy(end, dllsW, sizeof(dllsW)); + strcpyW(end + ARRAY_SIZE(dllsW), base_name); + if ((p = strchrW(end, '.')) && !lstrcmpW(p, dot_dllW)) *p = 0; + p = end + strlenW(end); + *p++ = '\\'; + strcpyW(p, base_name); + *file = CreateFileW(buf, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (*file != INVALID_HANDLE_VALUE) return buf; + + memcpy(end, programsW, sizeof(programsW)); + end += ARRAY_SIZE(programsW); + strcpyW(end, base_name); + if ((p = strchrW(end, '.')) && !lstrcmpW(p, dot_exeW)) *p = 0; + p = end + strlenW(end); + *p++ = '\\'; + strcpyW(p, base_name); + *file = CreateFileW(buf, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (*file != INVALID_HANDLE_VALUE) return buf; + + heap_free(buf); + } + + for (i = 0;; i++) + { + WCHAR name[64]; + sprintfW(name, winedlldirW, i); + if (!(len = GetEnvironmentVariableW(name, NULL, 0))) break; + if (!(buf = heap_alloc((len + lstrlenW(base_name) + 2) * sizeof(WCHAR)))) return NULL; + + GetEnvironmentVariableW(name, buf, len); + buf[len++] = '\\'; + strcpyW(buf + len, base_name); + *file = CreateFileW(buf, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (*file != INVALID_HANDLE_VALUE) return buf; + + heap_free(buf); + } + + return NULL; +} +#endif + /****************************************************************** * pe_load_native_module * @@ -785,6 +856,21 @@ struct module* pe_load_native_module(struct process* pcs, const WCHAR* name, modfmt->u.pe_info = (struct pe_module_info*)(modfmt + 1); if (pe_map_file(hFile, &modfmt->u.pe_info->fmap, DMT_PE)) { +#ifndef __REACTOS__ + WCHAR *builtin_path = NULL; + HANDLE builtin_module; + if (modfmt->u.pe_info->fmap.u.pe.builtin && (builtin_path = find_builtin_pe(loaded_name, &builtin_module))) + { + struct image_file_map builtin_fmap; + if (pe_map_file(builtin_module, &builtin_fmap, DMT_PE)) + { + TRACE("reloaded %s from %s\n", debugstr_w(loaded_name), debugstr_w(builtin_path)); + pe_unmap_file(&modfmt->u.pe_info->fmap); + modfmt->u.pe_info->fmap = builtin_fmap; + } + CloseHandle(builtin_module); + } +#endif if (!base) base = modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.ImageBase; if (!size) size = modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.SizeOfImage; @@ -793,6 +879,11 @@ struct module* pe_load_native_module(struct process* pcs, const WCHAR* name, modfmt->u.pe_info->fmap.u.pe.ntheader.OptionalHeader.CheckSum); if (module) { +#ifdef __REACTOS__ + module->real_path = NULL; +#else + module->real_path = builtin_path; +#endif modfmt->module = module; modfmt->remove = pe_module_remove; modfmt->loc_compute = NULL; @@ -807,6 +898,9 @@ struct module* pe_load_native_module(struct process* pcs, const WCHAR* name, else { ERR("could not load the module '%s'\n", debugstr_w(loaded_name)); +#ifndef __REACTOS__ + heap_free(module->real_path); +#endif pe_unmap_file(&modfmt->u.pe_info->fmap); } } diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg index 80fc0c075da..3b36c85191e 100644 --- a/sdk/tools/winesync/dbghelp.cfg +++ b/sdk/tools/winesync/dbghelp.cfg @@ -4,4 +4,4 @@ files: include/dbghelp.h: sdk/include/psdk/dbghelp.h include/wine/mscvpdb.h: sdk/include/reactos/wine/mscvpdb.h tags: - wine: 7e16acf3806f9e810884d710c640f5f82c158093 + wine: e21b61392cbc3a4879f837316c869c44b8dcf685
4 years
1
0
0
0
[reactos] 79/179: [WINESYNC] dbghelp: Use RtlImageDirectoryEntryToData in pe_load_msc_debug_info.
by winesync
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=a6145efdfd9e2645320d0…
commit a6145efdfd9e2645320d0c7a87f92711684a1b00 Author: winesync <ros-dev(a)reactos.org> AuthorDate: Fri Sep 11 16:53:38 2020 +0200 Commit: Jérôme Gardou <jerome.gardou(a)reactos.org> CommitDate: Wed Sep 16 10:35:43 2020 +0200 [WINESYNC] dbghelp: Use RtlImageDirectoryEntryToData in pe_load_msc_debug_info. Signed-off-by: Piotr Caban <piotr(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> wine commit id 7e16acf3806f9e810884d710c640f5f82c158093 by Piotr Caban <piotr(a)codeweavers.com> --- dll/win32/dbghelp/pe_module.c | 29 ++++++++--------------------- sdk/tools/winesync/dbghelp.cfg | 2 +- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/dll/win32/dbghelp/pe_module.c b/dll/win32/dbghelp/pe_module.c index 7fcaf27e6c7..54a830c5420 100644 --- a/dll/win32/dbghelp/pe_module.c +++ b/dll/win32/dbghelp/pe_module.c @@ -465,7 +465,7 @@ static BOOL pe_load_coff_symbol_table(struct module* module) /****************************************************************** * pe_load_stabs * - * look for stabs information in PE header (it's how the mingw compiler provides + * look for stabs information in PE header (it's how the mingw compiler provides * its debugging information) */ static BOOL pe_load_stabs(const struct process* pcs, struct module* module) @@ -601,28 +601,15 @@ static BOOL pe_load_msc_debug_info(const struct process* pcs, struct module* mod { struct image_file_map* fmap = &module->format_info[DFI_PE]->u.pe_info->fmap; BOOL ret = FALSE; - const IMAGE_DATA_DIRECTORY* dir; - const IMAGE_DEBUG_DIRECTORY*dbg = NULL; - int nDbg; + const IMAGE_DEBUG_DIRECTORY*dbg; + ULONG nDbg; void* mapping; IMAGE_NT_HEADERS* nth; if (!(mapping = pe_map_full(fmap, &nth))) return FALSE; /* Read in debug directory */ - dir = nth->OptionalHeader.DataDirectory + IMAGE_DIRECTORY_ENTRY_DEBUG; - nDbg = dir->Size / sizeof(IMAGE_DEBUG_DIRECTORY); - if (!nDbg) goto done; - - dbg = RtlImageRvaToVa(nth, mapping, dir->VirtualAddress, NULL); - -#ifdef __REACTOS__ - if (!dbg) - { - ERR("Debug directory not found in module %s\n", - debugstr_w(module->module.ModuleName)); - goto done; - } -#endif + dbg = RtlImageDirectoryEntryToData( mapping, FALSE, IMAGE_DIRECTORY_ENTRY_DEBUG, &nDbg ); + if (!dbg || !(nDbg /= sizeof(IMAGE_DEBUG_DIRECTORY))) goto done; /* Parse debug directory */ if (nth->FileHeader.Characteristics & IMAGE_FILE_DEBUG_STRIPPED) @@ -676,18 +663,18 @@ static BOOL pe_load_export_debug_info(const struct process* pcs, struct module* /* FIXME: module.ModuleName isn't correctly set yet if it's passed in SymLoadModule */ symt_new_public(module, NULL, module->module.ModuleName, FALSE, base, 1); #endif - + /* Add entry point */ symt_new_public(module, NULL, "EntryPoint", FALSE, base + nth->OptionalHeader.AddressOfEntryPoint, 1); #if 0 - /* FIXME: we'd better store addresses linked to sections rather than + /* FIXME: we'd better store addresses linked to sections rather than absolute values */ IMAGE_SECTION_HEADER* section; /* Add start of sections */ section = (IMAGE_SECTION_HEADER*) ((char*)&nth->OptionalHeader + nth->FileHeader.SizeOfOptionalHeader); - for (i = 0; i < nth->FileHeader.NumberOfSections; i++, section++) + for (i = 0; i < nth->FileHeader.NumberOfSections; i++, section++) { symt_new_public(module, NULL, section->Name, FALSE, RtlImageRvaToVa(nth, mapping, section->VirtualAddress, NULL), 1); diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg index dcca9791c8c..80fc0c075da 100644 --- a/sdk/tools/winesync/dbghelp.cfg +++ b/sdk/tools/winesync/dbghelp.cfg @@ -4,4 +4,4 @@ files: include/dbghelp.h: sdk/include/psdk/dbghelp.h include/wine/mscvpdb.h: sdk/include/reactos/wine/mscvpdb.h tags: - wine: ab4c64a4093b98ca7a74ec29a9d947333791b26d + wine: 7e16acf3806f9e810884d710c640f5f82c158093
4 years
1
0
0
0
[reactos] 78/179: [WINESYNC] dbghelp: Support 32 and 64-bit binaries in ImageDirectoryEntryToDataEx.
by winesync
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e27e4dbaee71dc7fe527b…
commit e27e4dbaee71dc7fe527b88b07bc08336ceb6df4 Author: winesync <ros-dev(a)reactos.org> AuthorDate: Fri Sep 11 16:53:37 2020 +0200 Commit: Jérôme Gardou <jerome.gardou(a)reactos.org> CommitDate: Wed Sep 16 10:35:43 2020 +0200 [WINESYNC] dbghelp: Support 32 and 64-bit binaries in ImageDirectoryEntryToDataEx. Signed-off-by: Piotr Caban <piotr(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> wine commit id ab4c64a4093b98ca7a74ec29a9d947333791b26d by Piotr Caban <piotr(a)codeweavers.com> --- dll/win32/dbghelp/pe_module.c | 22 ++++++++++++++++++---- sdk/tools/winesync/dbghelp.cfg | 2 +- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/dll/win32/dbghelp/pe_module.c b/dll/win32/dbghelp/pe_module.c index f458b8aa516..7fcaf27e6c7 100644 --- a/dll/win32/dbghelp/pe_module.c +++ b/dll/win32/dbghelp/pe_module.c @@ -896,11 +896,25 @@ PVOID WINAPI ImageDirectoryEntryToDataEx( PVOID base, BOOLEAN image, USHORT dir, if (section) *section = NULL; if (!(nt = RtlImageNtHeader( base ))) return NULL; - if (dir >= nt->OptionalHeader.NumberOfRvaAndSizes) return NULL; - if (!(addr = nt->OptionalHeader.DataDirectory[dir].VirtualAddress)) return NULL; + if (nt->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR64_MAGIC) + { + const IMAGE_NT_HEADERS64 *nt64 = (const IMAGE_NT_HEADERS64 *)nt; - *size = nt->OptionalHeader.DataDirectory[dir].Size; - if (image || addr < nt->OptionalHeader.SizeOfHeaders) return (char *)base + addr; + if (dir >= nt64->OptionalHeader.NumberOfRvaAndSizes) return NULL; + if (!(addr = nt64->OptionalHeader.DataDirectory[dir].VirtualAddress)) return NULL; + *size = nt64->OptionalHeader.DataDirectory[dir].Size; + if (image || addr < nt64->OptionalHeader.SizeOfHeaders) return (char *)base + addr; + } + else if (nt->OptionalHeader.Magic == IMAGE_NT_OPTIONAL_HDR32_MAGIC) + { + const IMAGE_NT_HEADERS32 *nt32 = (const IMAGE_NT_HEADERS32 *)nt; + + if (dir >= nt32->OptionalHeader.NumberOfRvaAndSizes) return NULL; + if (!(addr = nt32->OptionalHeader.DataDirectory[dir].VirtualAddress)) return NULL; + *size = nt32->OptionalHeader.DataDirectory[dir].Size; + if (image || addr < nt32->OptionalHeader.SizeOfHeaders) return (char *)base + addr; + } + else return NULL; return RtlImageRvaToVa( nt, base, addr, section ); } diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg index 3a6c57148d7..dcca9791c8c 100644 --- a/sdk/tools/winesync/dbghelp.cfg +++ b/sdk/tools/winesync/dbghelp.cfg @@ -4,4 +4,4 @@ files: include/dbghelp.h: sdk/include/psdk/dbghelp.h include/wine/mscvpdb.h: sdk/include/reactos/wine/mscvpdb.h tags: - wine: 8000b5415d2c249176bda3d8b49f8fc9978e1623 + wine: ab4c64a4093b98ca7a74ec29a9d947333791b26d
4 years
1
0
0
0
[reactos] 77/179: [WINESYNC] dbghelp: Look for .eh_fram if no .eh_frame is found.
by winesync
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=b7d8c1b1c2a7baf2dfcf1…
commit b7d8c1b1c2a7baf2dfcf1d7e324b194de3b903b6 Author: winesync <ros-dev(a)reactos.org> AuthorDate: Fri Sep 11 16:53:27 2020 +0200 Commit: Jérôme Gardou <jerome.gardou(a)reactos.org> CommitDate: Wed Sep 16 10:35:43 2020 +0200 [WINESYNC] dbghelp: Look for .eh_fram if no .eh_frame is found. lld produces these, because '.eh_frame' misses the eight-character limit by one character, but '.eh_fram' does not. This allows it to avoid producing a string table for this common section. Signed-off-by: Chip Davis <cdavis(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> wine commit id 8000b5415d2c249176bda3d8b49f8fc9978e1623 by Chip Davis <cdavis(a)codeweavers.com> --- dll/win32/dbghelp/dwarf.c | 4 +++- sdk/tools/winesync/dbghelp.cfg | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/dll/win32/dbghelp/dwarf.c b/dll/win32/dbghelp/dwarf.c index 1c227d5f23d..6d3fb534d98 100644 --- a/dll/win32/dbghelp/dwarf.c +++ b/dll/win32/dbghelp/dwarf.c @@ -3539,7 +3539,9 @@ BOOL dwarf2_parse(struct module* module, unsigned long load_offset, BOOL ret = TRUE; struct module_format* dwarf2_modfmt; - dwarf2_init_section(&eh_frame, fmap, ".eh_frame", NULL, &eh_frame_sect); + if (!dwarf2_init_section(&eh_frame, fmap, ".eh_frame", NULL, &eh_frame_sect)) + /* lld produces .eh_fram to avoid generating a long name */ + dwarf2_init_section(&eh_frame, fmap, ".eh_fram", NULL, &eh_frame_sect); dwarf2_init_section(§ion[section_debug], fmap, ".debug_info", ".zdebug_info", &debug_sect); dwarf2_init_section(§ion[section_abbrev], fmap, ".debug_abbrev", ".zdebug_abbrev", &debug_abbrev_sect); dwarf2_init_section(§ion[section_string], fmap, ".debug_str", ".zdebug_str", &debug_str_sect); diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg index d06f4b1040f..3a6c57148d7 100644 --- a/sdk/tools/winesync/dbghelp.cfg +++ b/sdk/tools/winesync/dbghelp.cfg @@ -4,4 +4,4 @@ files: include/dbghelp.h: sdk/include/psdk/dbghelp.h include/wine/mscvpdb.h: sdk/include/reactos/wine/mscvpdb.h tags: - wine: 7a567d1bb00ea2cdac0e972220b1985800ab445e + wine: 8000b5415d2c249176bda3d8b49f8fc9978e1623
4 years
1
0
0
0
[reactos] 76/179: [WINESYNC] dbghelp: Fix MiniDumpWriteDump spec file entry.
by winesync
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=dfead9b2ca59048d1897d…
commit dfead9b2ca59048d1897d2a300f10b5391e203a3 Author: winesync <ros-dev(a)reactos.org> AuthorDate: Fri Sep 11 16:49:24 2020 +0200 Commit: Jérôme Gardou <jerome.gardou(a)reactos.org> CommitDate: Wed Sep 16 10:35:43 2020 +0200 [WINESYNC] dbghelp: Fix MiniDumpWriteDump spec file entry. Signed-off-by: André Hentschel <nerv(a)dawncrow.de> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> wine commit id 7a567d1bb00ea2cdac0e972220b1985800ab445e by André Hentschel <nerv(a)dawncrow.de> --- sdk/tools/winesync/dbghelp.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg index 0ba2c849dc3..d06f4b1040f 100644 --- a/sdk/tools/winesync/dbghelp.cfg +++ b/sdk/tools/winesync/dbghelp.cfg @@ -4,4 +4,4 @@ files: include/dbghelp.h: sdk/include/psdk/dbghelp.h include/wine/mscvpdb.h: sdk/include/reactos/wine/mscvpdb.h tags: - wine: 4b9defe09a24e77547cde4e8211f701a4984681b + wine: 7a567d1bb00ea2cdac0e972220b1985800ab445e
4 years
1
0
0
0
[reactos] 75/179: [WINESYNC] dbghelp: Fix reading the target's dyld image info, based on its CPU architecture.
by winesync
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=82a89ba33caf815923cc5…
commit 82a89ba33caf815923cc587b4c4361c49cbb93e3 Author: winesync <ros-dev(a)reactos.org> AuthorDate: Fri Sep 11 16:49:21 2020 +0200 Commit: Jérôme Gardou <jerome.gardou(a)reactos.org> CommitDate: Wed Sep 16 10:35:43 2020 +0200 [WINESYNC] dbghelp: Fix reading the target's dyld image info, based on its CPU architecture. Signed-off-by: Ken Thomases <ken(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> wine commit id 4b9defe09a24e77547cde4e8211f701a4984681b by Ken Thomases <ken(a)codeweavers.com> --- dll/win32/dbghelp/macho_module.c | 134 ++++++++++++++++++++++++++++----------- sdk/tools/winesync/dbghelp.cfg | 2 +- 2 files changed, 98 insertions(+), 38 deletions(-) diff --git a/dll/win32/dbghelp/macho_module.c b/dll/win32/dbghelp/macho_module.c index 8eda11ab91c..f957439d435 100644 --- a/dll/win32/dbghelp/macho_module.c +++ b/dll/win32/dbghelp/macho_module.c @@ -60,23 +60,39 @@ #include <mach-o/nlist.h> #include <mach-o/dyld.h> -#ifdef HAVE_MACH_O_DYLD_IMAGES_H -#include <mach-o/dyld_images.h> -#else -struct dyld_image_info { - const struct mach_header *imageLoadAddress; - const char *imageFilePath; - uintptr_t imageFileModDate; +struct dyld_image_info32 { + uint32_t /* const struct mach_header* */ imageLoadAddress; + uint32_t /* const char* */ imageFilePath; + uint32_t /* uintptr_t */ imageFileModDate; }; -struct dyld_all_image_infos { - uint32_t version; - uint32_t infoArrayCount; - const struct dyld_image_info *infoArray; - void* notification; - int processDetachedFromSharedRegion; +struct dyld_all_image_infos32 { + uint32_t version; + uint32_t infoArrayCount; + uint32_t /* const struct dyld_image_info* */ infoArray; +}; + +struct dyld_image_info64 { + uint64_t /* const struct mach_header* */ imageLoadAddress; + uint64_t /* const char* */ imageFilePath; + uint64_t /* uintptr_t */ imageFileModDate; +}; + +struct dyld_all_image_infos64 { + uint32_t version; + uint32_t infoArrayCount; + uint64_t /* const struct dyld_image_info* */ infoArray; +}; + +union wine_image_info { + struct dyld_image_info32 info32; + struct dyld_image_info64 info64; +}; + +union wine_all_image_infos { + struct dyld_all_image_infos32 infos32; + struct dyld_all_image_infos64 infos64; }; -#endif #ifdef WORDS_BIGENDIAN #define swap_ulong_be_to_host(n) (n) @@ -1649,8 +1665,8 @@ static BOOL macho_enum_modules_internal(const struct process* pcs, const WCHAR* main_name, enum_modules_cb cb, void* user) { - struct dyld_all_image_infos image_infos; - struct dyld_image_info* info_array = NULL; + union wine_all_image_infos image_infos; + union wine_image_info* info_array = NULL; unsigned long len; int i; char bufstr[256]; @@ -1660,31 +1676,55 @@ static BOOL macho_enum_modules_internal(const struct process* pcs, TRACE("(%p/%p, %s, %p, %p)\n", pcs, pcs->handle, debugstr_w(main_name), cb, user); + if (pcs->is_64bit) + len = sizeof(image_infos.infos64); + else + len = sizeof(image_infos.infos32); if (!pcs->dbg_hdr_addr || !ReadProcessMemory(pcs->handle, (void*)pcs->dbg_hdr_addr, - &image_infos, sizeof(image_infos), NULL) || - !image_infos.infoArray) + &image_infos, len, NULL)) goto done; - TRACE("Process has %u image infos at %p\n", image_infos.infoArrayCount, image_infos.infoArray); + if (!pcs->is_64bit) + { + struct dyld_all_image_infos32 temp = image_infos.infos32; + image_infos.infos64.infoArrayCount = temp.infoArrayCount; + image_infos.infos64.infoArray = temp.infoArray; + } + if (!image_infos.infos64.infoArray) + goto done; + TRACE("Process has %u image infos at %p\n", image_infos.infos64.infoArrayCount, (void*)image_infos.infos64.infoArray); - len = image_infos.infoArrayCount * sizeof(info_array[0]); + if (pcs->is_64bit) + len = sizeof(info_array->info64); + else + len = sizeof(info_array->info32); + len *= image_infos.infos64.infoArrayCount; info_array = HeapAlloc(GetProcessHeap(), 0, len); if (!info_array || - !ReadProcessMemory(pcs->handle, image_infos.infoArray, + !ReadProcessMemory(pcs->handle, (void*)image_infos.infos64.infoArray, info_array, len, NULL)) goto done; TRACE("... read image infos\n"); - for (i = 0; i < image_infos.infoArrayCount; i++) + for (i = 0; i < image_infos.infos64.infoArrayCount; i++) { - if (info_array[i].imageFilePath != NULL && - ReadProcessMemory(pcs->handle, info_array[i].imageFilePath, bufstr, sizeof(bufstr), NULL)) + struct dyld_image_info64 info; + if (pcs->is_64bit) + info = info_array[i].info64; + else + { + struct dyld_image_info32 *info32 = &info_array->info32 + i; + info.imageLoadAddress = info32->imageLoadAddress; + info.imageFilePath = info32->imageFilePath; + } + if (info.imageFilePath && + ReadProcessMemory(pcs->handle, (void*)info.imageFilePath, bufstr, sizeof(bufstr), NULL)) { bufstr[sizeof(bufstr) - 1] = '\0'; TRACE("[%d] image file %s\n", i, debugstr_a(bufstr)); MultiByteToWideChar(CP_UNIXCP, 0, bufstr, -1, bufstrW, ARRAY_SIZE(bufstrW)); if (main_name && !bufstrW[0]) strcpyW(bufstrW, main_name); - if (!cb(bufstrW, (unsigned long)info_array[i].imageLoadAddress, user)) break; + if (!cb(bufstrW, info.imageLoadAddress, user)) break; } } @@ -1764,27 +1804,47 @@ static BOOL macho_search_loader(struct process* pcs, struct macho_info* macho_in WCHAR *loader = get_wine_loader_name(pcs); BOOL ret = FALSE; ULONG_PTR dyld_image_info_address; - struct dyld_all_image_infos image_infos; - struct dyld_image_info image_info; + union wine_all_image_infos image_infos; + union wine_image_info image_info; uint32_t len; char path[PATH_MAX]; BOOL got_path = FALSE; + if (pcs->is_64bit) + len = sizeof(image_infos.infos64); + else + len = sizeof(image_infos.infos32); dyld_image_info_address = get_dyld_image_info_address(pcs); if (dyld_image_info_address && - ReadProcessMemory(pcs->handle, (void*)dyld_image_info_address, &image_infos, sizeof(image_infos), NULL) && - image_infos.infoArray && image_infos.infoArrayCount && - ReadProcessMemory(pcs->handle, image_infos.infoArray, &image_info, sizeof(image_info), NULL) && - image_info.imageFilePath) + ReadProcessMemory(pcs->handle, (void*)dyld_image_info_address, &image_infos, len, NULL)) { - for (len = sizeof(path); len > 0; len /= 2) + if (pcs->is_64bit) + len = sizeof(image_info.info64); + else { - if (ReadProcessMemory(pcs->handle, image_info.imageFilePath, path, len, NULL)) + struct dyld_all_image_infos32 temp = image_infos.infos32; + image_infos.infos64.infoArrayCount = temp.infoArrayCount; + image_infos.infos64.infoArray = temp.infoArray; + len = sizeof(image_info.info32); + } + if (image_infos.infos64.infoArray && image_infos.infos64.infoArrayCount && + ReadProcessMemory(pcs->handle, (void*)image_infos.infos64.infoArray, &image_info, len, NULL)) + { + if (!pcs->is_64bit) { - path[len - 1] = 0; - got_path = TRUE; - TRACE("got executable path from target's dyld image info: %s\n", debugstr_a(path)); - break; + struct dyld_image_info32 temp = image_info.info32; + image_info.info64.imageLoadAddress = temp.imageLoadAddress; + image_info.info64.imageFilePath = temp.imageFilePath; + } + for (len = sizeof(path); image_info.info64.imageFilePath && len > 0; len /= 2) + { + if (ReadProcessMemory(pcs->handle, (void*)image_info.info64.imageFilePath, path, len, NULL)) + { + path[len - 1] = 0; + got_path = TRUE; + TRACE("got executable path from target's dyld image info: %s\n", debugstr_a(path)); + break; + } } } } diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg index 24fb63533e3..0ba2c849dc3 100644 --- a/sdk/tools/winesync/dbghelp.cfg +++ b/sdk/tools/winesync/dbghelp.cfg @@ -4,4 +4,4 @@ files: include/dbghelp.h: sdk/include/psdk/dbghelp.h include/wine/mscvpdb.h: sdk/include/reactos/wine/mscvpdb.h tags: - wine: 28a25b052d21a9e2e4fc3c7790711b290d44a488 + wine: 4b9defe09a24e77547cde4e8211f701a4984681b
4 years
1
0
0
0
← Newer
1
...
17
18
19
20
21
22
23
...
39
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Results per page:
10
25
50
100
200