Alexandre Julliard : dbghelp: Try to load the string table from file number 4 too.
Alexandre Julliard
julliard at winehq.org
Wed Jan 12 13:16:50 CST 2011
Module: wine
Branch: master
Commit: 530e9c9b175c03f7592eaabdf8c34f45be50117a
URL: http://source.winehq.org/git/wine.git/?a=commit;h=530e9c9b175c03f7592eaabdf8c34f45be50117a
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Jan 11 20:34:46 2011 +0100
dbghelp: Try to load the string table from file number 4 too.
---
dlls/dbghelp/msc.c | 46 +++++++++++++++++++++-------------------------
1 files changed, 21 insertions(+), 25 deletions(-)
diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c
index 93eef21..0514bc9 100644
--- a/dlls/dbghelp/msc.c
+++ b/dlls/dbghelp/msc.c
@@ -2119,12 +2119,8 @@ static void* pdb_read_ds_file(const struct PDB_DS_HEADER* pdb,
DWORD i;
if (!toc || file_nr >= toc->num_files) return NULL;
+ if (toc->file_size[file_nr] == 0 || toc->file_size[file_nr] == 0xFFFFFFFF) return NULL;
- if (toc->file_size[file_nr] == 0 || toc->file_size[file_nr] == 0xFFFFFFFF)
- {
- FIXME(">>> requesting NULL stream (%u)\n", file_nr);
- return NULL;
- }
block_list = &toc->file_size[toc->num_files];
for (i = 0; i < file_nr; i++)
block_list += (toc->file_size[i] + pdb->block_size - 1) / pdb->block_size;
@@ -2177,6 +2173,23 @@ static void pdb_free_file(struct pdb_file_info* pdb_file)
}
}
+static void* pdb_read_strings(const struct pdb_file_info* pdb_file)
+{
+ void *ret;
+
+ /* FIXME: how to determine the correct file number? */
+ /* 4 and 12 have been observed, there may be others */
+
+ ret = pdb_read_file( pdb_file, 4 );
+ if (ret && *(const DWORD *)ret == 0xeffeeffe) return ret;
+ pdb_free( ret );
+ ret = pdb_read_file( pdb_file, 12 );
+ if (ret && *(const DWORD *)ret == 0xeffeeffe) return ret;
+ pdb_free( ret );
+ WARN("string table not found\n");
+ return NULL;
+}
+
static void pdb_module_remove(struct process* pcsn, struct module_format* modfmt)
{
unsigned i;
@@ -2596,20 +2609,8 @@ static BOOL pdb_process_internal(const struct process* pcs,
symbols.version, symbols.version);
}
- files_image = pdb_read_file(pdb_file, 12); /* FIXME: really fixed ??? */
- if (files_image)
- {
- if (*(const DWORD*)files_image == 0xeffeeffe)
- {
- files_size = *(const DWORD*)(files_image + 8);
- }
- else
- {
- WARN("wrong header %x expecting 0xeffeeffe\n", *(const DWORD*)files_image);
- pdb_free(files_image);
- files_image = NULL;
- }
- }
+ files_image = pdb_read_strings(pdb_file);
+ if (files_image) files_size = *(const DWORD*)(files_image + 8);
pdb_process_symbol_imports(pcs, msc_dbg, &symbols, symbols_image, image,
pdb_lookup, pdb_module_info, module_index);
@@ -3015,13 +3016,8 @@ BOOL pdb_virtual_unwind(struct cpu_stack_walk* csw, DWORD_PTR ip,
TRACE("searching %lx => %lx\n", ip, ip - (DWORD_PTR)pair.effective->module.BaseOfImage);
ip -= (DWORD_PTR)pair.effective->module.BaseOfImage;
- strbase = pdb_read_file(&pdb_info->pdb_files[0], 12); /* FIXME: really fixed index ??? */
+ strbase = pdb_read_strings(&pdb_info->pdb_files[0]);
if (!strbase) return FALSE;
- if (*(const DWORD*)strbase != 0xeffeeffe)
- {
- pdb_free(strbase);
- return FALSE;
- }
strsize = *(const DWORD*)(strbase + 8);
fpoext = pdb_read_file(&pdb_info->pdb_files[0], 10);
size = pdb_get_file_size(&pdb_info->pdb_files[0], 10);
More information about the wine-cvs
mailing list