Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
1acbb1c0
Commit
1acbb1c0
authored
Jan 08, 2011
by
Eric Pouech
Committed by
Alexandre Julliard
Jan 10, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dbghelp: Restructure internal PDB information.
parent
982775dd
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
134 additions
and
131 deletions
+134
-131
dbghelp_private.h
dlls/dbghelp/dbghelp_private.h
+4
-15
msc.c
dlls/dbghelp/msc.c
+117
-84
path.c
dlls/dbghelp/path.c
+13
-32
No files found.
dlls/dbghelp/dbghelp_private.h
View file @
1acbb1c0
...
...
@@ -427,21 +427,10 @@ enum pdb_kind {PDB_JG, PDB_DS};
struct
pdb_lookup
{
const
char
*
filename
;
DWORD
age
;
enum
pdb_kind
kind
;
union
{
struct
{
DWORD
timestamp
;
struct
PDB_JG_TOC
*
toc
;
}
jg
;
struct
{
GUID
guid
;
struct
PDB_DS_TOC
*
toc
;
}
ds
;
}
u
;
DWORD
age
;
DWORD
timestamp
;
GUID
guid
;
};
struct
cpu_stack_walk
...
...
@@ -567,7 +556,7 @@ extern BOOL pe_load_debug_directory(const struct process* pcs,
const
BYTE
*
mapping
,
const
IMAGE_SECTION_HEADER
*
sectp
,
DWORD
nsect
,
const
IMAGE_DEBUG_DIRECTORY
*
dbg
,
int
nDbg
);
extern
BOOL
pdb_fetch_file_info
(
struct
pdb_lookup
*
pdb_lookup
);
extern
BOOL
pdb_fetch_file_info
(
const
struct
pdb_lookup
*
pdb_lookup
,
unsigned
*
matched
);
/* path.c */
extern
BOOL
path_find_symbol_file
(
const
struct
process
*
pcs
,
PCSTR
full_path
,
...
...
dlls/dbghelp/msc.c
View file @
1acbb1c0
...
...
@@ -62,6 +62,25 @@ WINE_DEFAULT_DEBUG_CHANNEL(dbghelp_msc);
#define MAX_PATHNAME_LEN 1024
struct
pdb_file_info
{
enum
pdb_kind
kind
;
DWORD
age
;
union
{
struct
{
DWORD
timestamp
;
struct
PDB_JG_TOC
*
toc
;
}
jg
;
struct
{
GUID
guid
;
struct
PDB_DS_TOC
*
toc
;
}
ds
;
}
u
;
};
/*========================================================================
* Debug file access helper routines
*/
...
...
@@ -2103,27 +2122,27 @@ static void* pdb_read_ds_file(const struct PDB_DS_HEADER* pdb,
return
pdb_ds_read
(
pdb
,
block_list
,
toc
->
file_size
[
file_nr
]);
}
static
void
*
pdb_read_file
(
const
char
*
image
,
const
struct
pdb_
lookup
*
pdb_lookup
,
static
void
*
pdb_read_file
(
const
char
*
image
,
const
struct
pdb_
file_info
*
pdb_file
,
DWORD
file_nr
)
{
switch
(
pdb_
lookup
->
kind
)
switch
(
pdb_
file
->
kind
)
{
case
PDB_JG
:
return
pdb_read_jg_file
((
const
struct
PDB_JG_HEADER
*
)
image
,
pdb_
lookup
->
u
.
jg
.
toc
,
file_nr
);
return
pdb_read_jg_file
((
const
struct
PDB_JG_HEADER
*
)
image
,
pdb_
file
->
u
.
jg
.
toc
,
file_nr
);
case
PDB_DS
:
return
pdb_read_ds_file
((
const
struct
PDB_DS_HEADER
*
)
image
,
pdb_
lookup
->
u
.
ds
.
toc
,
file_nr
);
pdb_
file
->
u
.
ds
.
toc
,
file_nr
);
}
return
NULL
;
}
static
unsigned
pdb_get_file_size
(
const
struct
pdb_
lookup
*
pdb_lookup
,
DWORD
file_nr
)
static
unsigned
pdb_get_file_size
(
const
struct
pdb_
file_info
*
pdb_file
,
DWORD
file_nr
)
{
switch
(
pdb_
lookup
->
kind
)
switch
(
pdb_
file
->
kind
)
{
case
PDB_JG
:
return
pdb_
lookup
->
u
.
jg
.
toc
->
file
[
file_nr
].
size
;
case
PDB_DS
:
return
pdb_
lookup
->
u
.
ds
.
toc
->
file_size
[
file_nr
];
case
PDB_JG
:
return
pdb_
file
->
u
.
jg
.
toc
->
file
[
file_nr
].
size
;
case
PDB_DS
:
return
pdb_
file
->
u
.
ds
.
toc
->
file_size
[
file_nr
];
}
return
0
;
}
...
...
@@ -2133,19 +2152,21 @@ static void pdb_free(void* buffer)
HeapFree
(
GetProcessHeap
(),
0
,
buffer
);
}
static
void
pdb_free_
lookup
(
const
struct
pdb_lookup
*
pdb_lookup
)
static
void
pdb_free_
file
(
struct
pdb_file_info
*
pdb_file
)
{
switch
(
pdb_
lookup
->
kind
)
switch
(
pdb_
file
->
kind
)
{
case
PDB_JG
:
pdb_free
(
pdb_lookup
->
u
.
jg
.
toc
);
pdb_free
(
pdb_file
->
u
.
jg
.
toc
);
pdb_file
->
u
.
jg
.
toc
=
NULL
;
break
;
case
PDB_DS
:
pdb_free
(
pdb_lookup
->
u
.
ds
.
toc
);
pdb_free
(
pdb_file
->
u
.
ds
.
toc
);
pdb_file
->
u
.
ds
.
toc
=
NULL
;
break
;
}
}
static
void
pdb_convert_types_header
(
PDB_TYPES
*
types
,
const
BYTE
*
image
)
{
memset
(
types
,
0
,
sizeof
(
PDB_TYPES
));
...
...
@@ -2232,11 +2253,11 @@ static HANDLE open_pdb_file(const struct process* pcs,
switch
(
lookup
->
kind
)
{
case
PDB_JG
:
ret
=
path_find_symbol_file
(
pcs
,
lookup
->
filename
,
NULL
,
lookup
->
u
.
jg
.
timestamp
,
ret
=
path_find_symbol_file
(
pcs
,
lookup
->
filename
,
NULL
,
lookup
->
timestamp
,
lookup
->
age
,
dbg_file_path
,
&
module
->
module
.
PdbUnmatched
);
break
;
case
PDB_DS
:
ret
=
path_find_symbol_file
(
pcs
,
lookup
->
filename
,
&
lookup
->
u
.
ds
.
guid
,
0
,
ret
=
path_find_symbol_file
(
pcs
,
lookup
->
filename
,
&
lookup
->
guid
,
0
,
lookup
->
age
,
dbg_file_path
,
&
module
->
module
.
PdbUnmatched
);
break
;
}
...
...
@@ -2251,12 +2272,13 @@ static HANDLE open_pdb_file(const struct process* pcs,
return
(
h
==
INVALID_HANDLE_VALUE
)
?
NULL
:
h
;
}
static
void
pdb_process_types
(
const
struct
msc_debug_info
*
msc_dbg
,
const
char
*
image
,
const
struct
pdb_lookup
*
pdb_lookup
)
static
void
pdb_process_types
(
const
struct
msc_debug_info
*
msc_dbg
,
const
char
*
image
,
const
struct
pdb_file_info
*
pdb_file
)
{
BYTE
*
types_image
=
NULL
;
types_image
=
pdb_read_file
(
image
,
pdb_
lookup
,
2
);
types_image
=
pdb_read_file
(
image
,
pdb_
file
,
2
);
if
(
types_image
)
{
PDB_TYPES
types
;
...
...
@@ -2309,25 +2331,27 @@ static const char PDB_DS_IDENT[] = "Microsoft C/C++ MSF 7.00\r\n\032DS\0";
* pdb_init
*
* Tries to load a pdb file
*
if do_fill is TRUE, then it just fills pdb_lookup with the information of the
*
fil
e
*
if do_fill is FALSE, then it just checks that the kind of PDB (stored in
*
pdb_lookup) matches what's really in the file
*
'matched' is filled with the number of correct matches for this file:
*
- age counts for on
e
*
- timestamp or guid depending on kind counts for one
*
a wrong kind of file returns FALSE (FIXME ?)
*/
static
BOOL
pdb_init
(
struct
pdb_lookup
*
pdb_lookup
,
const
char
*
image
,
BOOL
do_fill
)
static
BOOL
pdb_init
(
const
struct
pdb_lookup
*
pdb_lookup
,
struct
pdb_file_info
*
pdb_file
,
const
char
*
image
,
unsigned
*
matched
)
{
BOOL
ret
=
TRUE
;
/* check the file header, and if ok, load the TOC */
TRACE
(
"PDB(%s): %.40s
\n
"
,
pdb_lookup
->
filename
,
debugstr_an
(
image
,
40
));
*
matched
=
0
;
if
(
!
memcmp
(
image
,
PDB_JG_IDENT
,
sizeof
(
PDB_JG_IDENT
)))
{
const
struct
PDB_JG_HEADER
*
pdb
=
(
const
struct
PDB_JG_HEADER
*
)
image
;
struct
PDB_JG_ROOT
*
root
;
pdb_
lookup
->
u
.
jg
.
toc
=
pdb_jg_read
(
pdb
,
pdb
->
toc_block
,
pdb
->
toc
.
size
);
root
=
pdb_read_jg_file
(
pdb
,
pdb_
lookup
->
u
.
jg
.
toc
,
1
);
pdb_
file
->
u
.
jg
.
toc
=
pdb_jg_read
(
pdb
,
pdb
->
toc_block
,
pdb
->
toc
.
size
);
root
=
pdb_read_jg_file
(
pdb
,
pdb_
file
->
u
.
jg
.
toc
,
1
);
if
(
!
root
)
{
ERR
(
"-Unable to get root from .PDB in %s
\n
"
,
pdb_lookup
->
filename
);
...
...
@@ -2343,19 +2367,22 @@ static BOOL pdb_init(struct pdb_lookup* pdb_lookup, const char* image, BOOL do_f
default:
ERR
(
"-Unknown root block version %d
\n
"
,
root
->
Version
);
}
if
(
do_fill
)
if
(
pdb_lookup
->
kind
!=
PDB_JG
)
{
pdb_lookup
->
kind
=
PDB_JG
;
pdb_lookup
->
u
.
jg
.
timestamp
=
root
->
TimeDateStamp
;
pdb_lookup
->
age
=
root
->
Age
;
WARN
(
"Found %s, but wrong PDB kind
\n
"
,
pdb_lookup
->
filename
);
return
FALSE
;
}
else
if
(
pdb_lookup
->
kind
!=
PDB_JG
||
pdb_lookup
->
u
.
jg
.
timestamp
!=
root
->
TimeDateStamp
||
pdb_lookup
->
age
!=
root
->
Age
)
ret
=
FALSE
;
TRACE
(
"found JG/%c for %s: age=%x timestamp=%x
\n
"
,
do_fill
?
'f'
:
'-'
,
pdb_lookup
->
filename
,
root
->
Age
,
root
->
TimeDateStamp
);
pdb_file
->
kind
=
PDB_JG
;
pdb_file
->
u
.
jg
.
timestamp
=
root
->
TimeDateStamp
;
pdb_file
->
age
=
root
->
Age
;
if
(
root
->
TimeDateStamp
==
pdb_lookup
->
timestamp
)
(
*
matched
)
++
;
else
WARN
(
"Found %s, but wrong signature: %08x %08x
\n
"
,
pdb_lookup
->
filename
,
root
->
TimeDateStamp
,
pdb_lookup
->
timestamp
);
if
(
root
->
Age
==
pdb_lookup
->
age
)
(
*
matched
)
++
;
else
WARN
(
"Found %s, but wrong age: %08x %08x
\n
"
,
pdb_lookup
->
filename
,
root
->
Age
,
pdb_lookup
->
age
);
TRACE
(
"found JG for %s: age=%x timestamp=%x
\n
"
,
pdb_lookup
->
filename
,
root
->
Age
,
root
->
TimeDateStamp
);
pdb_free
(
root
);
}
else
if
(
!
memcmp
(
image
,
PDB_DS_IDENT
,
sizeof
(
PDB_DS_IDENT
)))
...
...
@@ -2363,11 +2390,11 @@ static BOOL pdb_init(struct pdb_lookup* pdb_lookup, const char* image, BOOL do_f
const
struct
PDB_DS_HEADER
*
pdb
=
(
const
struct
PDB_DS_HEADER
*
)
image
;
struct
PDB_DS_ROOT
*
root
;
pdb_
lookup
->
u
.
ds
.
toc
=
pdb_
file
->
u
.
ds
.
toc
=
pdb_ds_read
(
pdb
,
(
const
DWORD
*
)((
const
char
*
)
pdb
+
pdb
->
toc_page
*
pdb
->
block_size
),
pdb
->
toc_size
);
root
=
pdb_read_ds_file
(
pdb
,
pdb_
lookup
->
u
.
ds
.
toc
,
1
);
root
=
pdb_read_ds_file
(
pdb
,
pdb_
file
->
u
.
ds
.
toc
,
1
);
if
(
!
root
)
{
ERR
(
"-Unable to get root from .PDB in %s
\n
"
,
pdb_lookup
->
filename
);
...
...
@@ -2380,19 +2407,18 @@ static BOOL pdb_init(struct pdb_lookup* pdb_lookup, const char* image, BOOL do_f
default:
ERR
(
"-Unknown root block version %d
\n
"
,
root
->
Version
);
}
if
(
do_fill
)
{
pdb_lookup
->
kind
=
PDB_DS
;
pdb_lookup
->
u
.
ds
.
guid
=
root
->
guid
;
pdb_lookup
->
age
=
root
->
Age
;
}
else
if
(
pdb_lookup
->
kind
!=
PDB_DS
||
memcmp
(
&
pdb_lookup
->
u
.
ds
.
guid
,
&
root
->
guid
,
sizeof
(
GUID
))
||
pdb_lookup
->
age
!=
root
->
Age
)
ret
=
FALSE
;
TRACE
(
"found DS/%c for %s: age=%x guid=%s
\n
"
,
do_fill
?
'f'
:
'-'
,
pdb_lookup
->
filename
,
root
->
Age
,
debugstr_guid
(
&
root
->
guid
));
pdb_file
->
kind
=
PDB_DS
;
pdb_file
->
u
.
ds
.
guid
=
root
->
guid
;
pdb_file
->
age
=
root
->
Age
;
if
(
!
memcmp
(
&
root
->
guid
,
&
pdb_lookup
->
guid
,
sizeof
(
GUID
)))
(
*
matched
)
++
;
else
WARN
(
"Found %s, but wrong GUID: %s %s
\n
"
,
pdb_lookup
->
filename
,
debugstr_guid
(
&
root
->
guid
),
debugstr_guid
(
&
pdb_lookup
->
guid
));
if
(
root
->
Age
==
pdb_lookup
->
age
)
(
*
matched
)
++
;
else
WARN
(
"Found %s, but wrong age: %08x %08x
\n
"
,
pdb_lookup
->
filename
,
root
->
Age
,
pdb_lookup
->
age
);
TRACE
(
"found DS for %s: age=%x guid=%s
\n
"
,
pdb_lookup
->
filename
,
root
->
Age
,
debugstr_guid
(
&
root
->
guid
));
pdb_free
(
root
);
}
...
...
@@ -2400,18 +2426,18 @@ static BOOL pdb_init(struct pdb_lookup* pdb_lookup, const char* image, BOOL do_f
{
int
i
,
num_files
;
switch
(
pdb_
lookup
->
kind
)
switch
(
pdb_
file
->
kind
)
{
case
PDB_JG
:
num_files
=
pdb_
lookup
->
u
.
jg
.
toc
->
num_files
;
break
;
case
PDB_DS
:
num_files
=
pdb_
lookup
->
u
.
ds
.
toc
->
num_files
;
break
;
case
PDB_JG
:
num_files
=
pdb_
file
->
u
.
jg
.
toc
->
num_files
;
break
;
case
PDB_DS
:
num_files
=
pdb_
file
->
u
.
ds
.
toc
->
num_files
;
break
;
}
for
(
i
=
1
;
i
<
num_files
;
i
++
)
{
unsigned
char
*
x
=
pdb_read_file
(
image
,
pdb_
lookup
,
i
);
unsigned
char
*
x
=
pdb_read_file
(
image
,
pdb_
file
,
i
);
FIXME
(
"********************** [%u]: size=%08x
\n
"
,
i
,
pdb_get_file_size
(
pdb_
lookup
,
i
));
dump
(
x
,
pdb_get_file_size
(
pdb_
lookup
,
i
));
i
,
pdb_get_file_size
(
pdb_
file
,
i
));
dump
(
x
,
pdb_get_file_size
(
pdb_
file
,
i
));
pdb_free
(
x
);
}
}
...
...
@@ -2420,7 +2446,8 @@ static BOOL pdb_init(struct pdb_lookup* pdb_lookup, const char* image, BOOL do_f
static
BOOL
pdb_process_internal
(
const
struct
process
*
pcs
,
const
struct
msc_debug_info
*
msc_dbg
,
struct
pdb_lookup
*
pdb_lookup
,
const
struct
pdb_lookup
*
pdb_lookup
,
struct
pdb_file_info
*
pdb_file
,
unsigned
module_index
);
static
void
pdb_process_symbol_imports
(
const
struct
process
*
pcs
,
...
...
@@ -2456,17 +2483,18 @@ static void pdb_process_symbol_imports(const struct process* pcs,
else
{
struct
pdb_lookup
imp_pdb_lookup
;
struct
pdb_file_info
pdb_file
;
/* FIXME: this is an import of a JG PDB file
* how's a DS PDB handled ?
*/
imp_pdb_lookup
.
filename
=
imp
->
filename
;
imp_pdb_lookup
.
kind
=
PDB_JG
;
imp_pdb_lookup
.
u
.
jg
.
timestamp
=
imp
->
TimeDateStamp
;
imp_pdb_lookup
.
timestamp
=
imp
->
TimeDateStamp
;
imp_pdb_lookup
.
age
=
imp
->
Age
;
TRACE
(
"got for %s: age=%u ts=%x
\n
"
,
imp
->
filename
,
imp
->
Age
,
imp
->
TimeDateStamp
);
pdb_process_internal
(
pcs
,
msc_dbg
,
&
imp_pdb_lookup
,
i
);
pdb_process_internal
(
pcs
,
msc_dbg
,
&
imp_pdb_lookup
,
&
pdb_file
,
i
);
}
i
++
;
imp
=
(
const
PDB_SYMBOL_IMPORT
*
)((
const
char
*
)
first
+
((
ptr
-
(
const
char
*
)
first
+
strlen
(
ptr
)
+
1
+
3
)
&
~
3
));
...
...
@@ -2475,12 +2503,12 @@ static void pdb_process_symbol_imports(const struct process* pcs,
cv_current_module
=
&
cv_zmodules
[(
module_index
==
-
1
)
?
0
:
module_index
];
if
(
cv_current_module
->
allowed
)
FIXME
(
"Already allowed ??
\n
"
);
cv_current_module
->
allowed
=
TRUE
;
pdb_process_types
(
msc_dbg
,
image
,
pdb_lookup
);
}
static
BOOL
pdb_process_internal
(
const
struct
process
*
pcs
,
const
struct
msc_debug_info
*
msc_dbg
,
struct
pdb_lookup
*
pdb_lookup
,
const
struct
pdb_lookup
*
pdb_lookup
,
struct
pdb_file_info
*
pdb_file
,
unsigned
module_index
)
{
BOOL
ret
=
FALSE
;
...
...
@@ -2489,6 +2517,7 @@ static BOOL pdb_process_internal(const struct process* pcs,
BYTE
*
symbols_image
=
NULL
;
char
*
files_image
=
NULL
;
DWORD
files_size
=
0
;
unsigned
matched
;
TRACE
(
"Processing PDB file %s
\n
"
,
pdb_lookup
->
filename
);
...
...
@@ -2500,9 +2529,12 @@ static BOOL pdb_process_internal(const struct process* pcs,
WARN
(
"Unable to open .PDB file: %s
\n
"
,
pdb_lookup
->
filename
);
goto
leave
;
}
pdb_init
(
pdb_lookup
,
image
,
FALSE
);
if
(
!
pdb_init
(
pdb_lookup
,
pdb_file
,
image
,
&
matched
)
||
matched
!=
2
)
{
goto
leave
;
}
symbols_image
=
pdb_read_file
(
image
,
pdb_
lookup
,
3
);
symbols_image
=
pdb_read_file
(
image
,
pdb_
file
,
3
);
if
(
symbols_image
)
{
PDB_SYMBOLS
symbols
;
...
...
@@ -2524,7 +2556,7 @@ static BOOL pdb_process_internal(const struct process* pcs,
symbols
.
version
,
symbols
.
version
);
}
files_image
=
pdb_read_file
(
image
,
pdb_
lookup
,
12
);
/* FIXME: really fixed ??? */
files_image
=
pdb_read_file
(
image
,
pdb_
file
,
12
);
/* FIXME: really fixed ??? */
if
(
files_image
)
{
if
(
*
(
const
DWORD
*
)
files_image
==
0xeffeeffe
)
...
...
@@ -2540,13 +2572,14 @@ static BOOL pdb_process_internal(const struct process* pcs,
}
pdb_process_symbol_imports
(
pcs
,
msc_dbg
,
&
symbols
,
symbols_image
,
image
,
pdb_lookup
,
module_index
);
pdb_process_types
(
msc_dbg
,
image
,
pdb_file
);
/* Read global symbol table */
globalimage
=
pdb_read_file
(
image
,
pdb_
lookup
,
symbols
.
gsym_file
);
globalimage
=
pdb_read_file
(
image
,
pdb_
file
,
symbols
.
gsym_file
);
if
(
globalimage
)
{
codeview_snarf
(
msc_dbg
,
globalimage
,
0
,
pdb_get_file_size
(
pdb_
lookup
,
symbols
.
gsym_file
),
FALSE
);
pdb_get_file_size
(
pdb_
file
,
symbols
.
gsym_file
),
FALSE
);
}
/* Read per-module symbols' tables */
...
...
@@ -2560,7 +2593,7 @@ static BOOL pdb_process_internal(const struct process* pcs,
HeapValidate
(
GetProcessHeap
(),
0
,
NULL
);
pdb_convert_symbol_file
(
&
symbols
,
&
sfile
,
&
size
,
file
);
modimage
=
pdb_read_file
(
image
,
pdb_
lookup
,
sfile
.
file
);
modimage
=
pdb_read_file
(
image
,
pdb_
file
,
sfile
.
file
);
if
(
modimage
)
{
if
(
sfile
.
symbol_size
)
...
...
@@ -2574,7 +2607,7 @@ static BOOL pdb_process_internal(const struct process* pcs,
pdb_lookup
->
kind
==
PDB_JG
);
if
(
files_image
)
codeview_snarf_linetab2
(
msc_dbg
,
modimage
+
sfile
.
symbol_size
+
sfile
.
lineno_size
,
pdb_get_file_size
(
pdb_
lookup
,
sfile
.
file
)
-
sfile
.
symbol_size
-
sfile
.
lineno_size
,
pdb_get_file_size
(
pdb_
file
,
sfile
.
file
)
-
sfile
.
symbol_size
-
sfile
.
lineno_size
,
files_image
+
12
,
files_size
);
pdb_free
(
modimage
);
...
...
@@ -2587,7 +2620,7 @@ static BOOL pdb_process_internal(const struct process* pcs,
if
(
globalimage
)
{
codeview_snarf_public
(
msc_dbg
,
globalimage
,
0
,
pdb_get_file_size
(
pdb_
lookup
,
symbols
.
gsym_file
));
pdb_get_file_size
(
pdb_
file
,
symbols
.
gsym_file
));
pdb_free
(
globalimage
);
}
...
...
@@ -2601,7 +2634,7 @@ static BOOL pdb_process_internal(const struct process* pcs,
/* Cleanup */
pdb_free
(
symbols_image
);
pdb_free
(
files_image
);
pdb_free_
lookup
(
pdb_lookup
);
pdb_free_
file
(
pdb_file
);
if
(
image
)
UnmapViewOfFile
(
image
);
if
(
hMap
)
CloseHandle
(
hMap
);
...
...
@@ -2614,20 +2647,21 @@ static BOOL pdb_process_file(const struct process* pcs,
const
struct
msc_debug_info
*
msc_dbg
,
struct
pdb_lookup
*
pdb_lookup
)
{
BOOL
ret
;
BOOL
ret
;
struct
pdb_file_info
pdb_file
;
memset
(
cv_zmodules
,
0
,
sizeof
(
cv_zmodules
));
codeview_init_basic_types
(
msc_dbg
->
module
);
ret
=
pdb_process_internal
(
pcs
,
msc_dbg
,
pdb_lookup
,
-
1
);
ret
=
pdb_process_internal
(
pcs
,
msc_dbg
,
pdb_lookup
,
&
pdb_file
,
-
1
);
codeview_clear_type_table
();
if
(
ret
)
{
msc_dbg
->
module
->
module
.
SymType
=
SymCv
;
if
(
pdb_lookup
->
kind
==
PDB_JG
)
msc_dbg
->
module
->
module
.
PdbSig
=
pdb_
lookup
->
u
.
jg
.
timestamp
;
msc_dbg
->
module
->
module
.
PdbSig
=
pdb_
file
.
u
.
jg
.
timestamp
;
else
msc_dbg
->
module
->
module
.
PdbSig70
=
pdb_
lookup
->
u
.
ds
.
guid
;
msc_dbg
->
module
->
module
.
PdbAge
=
pdb_
lookup
->
age
;
msc_dbg
->
module
->
module
.
PdbSig70
=
pdb_
file
.
u
.
ds
.
guid
;
msc_dbg
->
module
->
module
.
PdbAge
=
pdb_
file
.
age
;
MultiByteToWideChar
(
CP_ACP
,
0
,
pdb_lookup
->
filename
,
-
1
,
msc_dbg
->
module
->
module
.
LoadedPdbName
,
sizeof
(
msc_dbg
->
module
->
module
.
LoadedPdbName
)
/
sizeof
(
WCHAR
));
...
...
@@ -2641,11 +2675,12 @@ static BOOL pdb_process_file(const struct process* pcs,
return
ret
;
}
BOOL
pdb_fetch_file_info
(
struct
pdb_lookup
*
pdb_lookup
)
BOOL
pdb_fetch_file_info
(
const
struct
pdb_lookup
*
pdb_lookup
,
unsigned
*
matched
)
{
HANDLE
hFile
,
hMap
=
NULL
;
char
*
image
=
NULL
;
BOOL
ret
=
TRUE
;
struct
pdb_file_info
pdb_file
;
if
((
hFile
=
CreateFileA
(
pdb_lookup
->
filename
,
GENERIC_READ
,
FILE_SHARE_READ
,
NULL
,
OPEN_EXISTING
,
FILE_ATTRIBUTE_NORMAL
,
NULL
))
==
INVALID_HANDLE_VALUE
||
...
...
@@ -2657,8 +2692,8 @@ BOOL pdb_fetch_file_info(struct pdb_lookup* pdb_lookup)
}
else
{
pdb_init
(
pdb_lookup
,
image
,
TRUE
);
pdb_free_
lookup
(
pdb_lookup
);
ret
=
pdb_init
(
pdb_lookup
,
&
pdb_file
,
image
,
matched
);
pdb_free_
file
(
&
pdb_file
);
}
if
(
image
)
UnmapViewOfFile
(
image
);
...
...
@@ -2772,8 +2807,7 @@ static BOOL codeview_process_info(const struct process* pcs,
const
CODEVIEW_PDB_DATA
*
pdb
=
(
const
CODEVIEW_PDB_DATA
*
)
msc_dbg
->
root
;
pdb_lookup
.
filename
=
pdb
->
name
;
pdb_lookup
.
kind
=
PDB_JG
;
pdb_lookup
.
u
.
jg
.
timestamp
=
pdb
->
timestamp
;
pdb_lookup
.
u
.
jg
.
toc
=
NULL
;
pdb_lookup
.
timestamp
=
pdb
->
timestamp
;
pdb_lookup
.
age
=
pdb
->
age
;
ret
=
pdb_process_file
(
pcs
,
msc_dbg
,
&
pdb_lookup
);
break
;
...
...
@@ -2786,8 +2820,7 @@ static BOOL codeview_process_info(const struct process* pcs,
wine_dbgstr_guid
(
&
rsds
->
guid
),
rsds
->
age
,
rsds
->
name
);
pdb_lookup
.
filename
=
rsds
->
name
;
pdb_lookup
.
kind
=
PDB_DS
;
pdb_lookup
.
u
.
ds
.
guid
=
rsds
->
guid
;
pdb_lookup
.
u
.
ds
.
toc
=
NULL
;
pdb_lookup
.
guid
=
rsds
->
guid
;
pdb_lookup
.
age
=
rsds
->
age
;
ret
=
pdb_process_file
(
pcs
,
msc_dbg
,
&
pdb_lookup
);
break
;
...
...
dlls/dbghelp/path.c
View file @
1acbb1c0
...
...
@@ -539,46 +539,27 @@ static BOOL CALLBACK module_find_cb(PCWSTR buffer, PVOID user)
break
;
case
DMT_PDB
:
{
struct
pdb_lookup
pdb_lookup
;
char
fn
[
MAX_PATH
];
struct
pdb_lookup
pdb_lookup
;
char
fn
[
MAX_PATH
];
WideCharToMultiByte
(
CP_ACP
,
0
,
buffer
,
-
1
,
fn
,
MAX_PATH
,
NULL
,
NULL
);
pdb_lookup
.
filename
=
fn
;
if
(
!
pdb_fetch_file_info
(
&
pdb_lookup
))
return
FALSE
;
matched
++
;
switch
(
pdb_lookup
.
kind
)
if
(
mf
->
guid
)
{
case
PDB_JG
:
if
(
mf
->
guid
)
{
WARN
(
"Found %s, but wrong PDB version
\n
"
,
debugstr_w
(
buffer
));
}
else
if
(
pdb_lookup
.
u
.
jg
.
timestamp
==
mf
->
dw1
)
matched
++
;
else
WARN
(
"Found %s, but wrong signature: %08x %08x
\n
"
,
debugstr_w
(
buffer
),
pdb_lookup
.
u
.
jg
.
timestamp
,
mf
->
dw1
);
break
;
case
PDB_DS
:
if
(
!
mf
->
guid
)
{
WARN
(
"Found %s, but wrong PDB version
\n
"
,
debugstr_w
(
buffer
));
}
else
if
(
!
memcmp
(
&
pdb_lookup
.
u
.
ds
.
guid
,
mf
->
guid
,
sizeof
(
GUID
)))
matched
++
;
else
WARN
(
"Found %s, but wrong GUID: %s %s
\n
"
,
debugstr_w
(
buffer
),
debugstr_guid
(
&
pdb_lookup
.
u
.
ds
.
guid
),
debugstr_guid
(
mf
->
guid
));
break
;
pdb_lookup
.
kind
=
PDB_DS
;
pdb_lookup
.
timestamp
=
0
;
pdb_lookup
.
guid
=
*
mf
->
guid
;
}
if
(
pdb_lookup
.
age
!=
mf
->
dw2
)
else
{
matched
--
;
WARN
(
"Found %s, but wrong age: %08x %08x
\n
"
,
debugstr_w
(
buffer
),
pdb_lookup
.
age
,
mf
->
dw2
);
pdb_lookup
.
kind
=
PDB_JG
;
pdb_lookup
.
timestamp
=
mf
->
dw1
;
/* pdb_loopkup.guid = */
}
pdb_lookup
.
age
=
mf
->
dw2
;
if
(
!
pdb_fetch_file_info
(
&
pdb_lookup
,
&
matched
))
return
FALSE
;
}
break
;
case
DMT_DBG
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment