Skip to content

Commit 4e6453c

Browse files
committed
[PDB Import] Fix calculation of struct bitfield member offsets
1 parent 4680284 commit 4e6453c

2 files changed

Lines changed: 13 additions & 19 deletions

File tree

plugins/pdb-ng/src/struct_grouper.rs

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,11 @@ struct MemberSize {
2929

3030
#[derive(Debug, Clone, PartialEq, Eq)]
3131
enum ResolvedGroup {
32+
/// An index into a list of members
3233
Single(usize),
34+
/// Non-overlapping members with bit-offset of start
3335
Struct(u64, Vec<ResolvedGroup>),
36+
/// Overlapping members with bit-offset of start
3437
Union(u64, Vec<ResolvedGroup>),
3538
}
3639

@@ -399,36 +402,25 @@ fn apply_groups(
399402
match group {
400403
ResolvedGroup::Single(index) => {
401404
let member = &members[index];
402-
403-
// TODO : Fix inner-offset being larger than `member.offset`
404-
405+
let member_bit_offset = member.offset * 8;
405406
match (member.bitfield_position, member.bitfield_size) {
406407
(Some(bit_pos), bit_width) => {
407408
structure.insert_bitwise(
408409
&member.ty,
409410
&member.name,
410-
(member.offset - offset) * 8 + bit_pos,
411+
member_bit_offset - offset + bit_pos,
411412
bit_width.map(|w| w as u8),
412413
false,
413414
member.access,
414415
member.scope,
415416
);
416417
}
417-
(None, _) if offset > member.offset => {
418-
structure.insert(
419-
&member.ty,
420-
&member.name,
421-
0,
422-
false,
423-
member.access,
424-
member.scope,
425-
);
426-
}
427418
(None, _) => {
428-
structure.insert(
419+
structure.insert_bitwise(
429420
&member.ty,
430421
&member.name,
431-
member.offset - offset,
422+
member_bit_offset - offset,
423+
None,
432424
false,
433425
member.access,
434426
member.scope,
@@ -439,10 +431,11 @@ fn apply_groups(
439431
ResolvedGroup::Struct(inner_offset, children) => {
440432
let mut inner = StructureBuilder::new();
441433
apply_groups(members, &mut inner, children, inner_offset);
442-
structure.insert(
434+
structure.insert_bitwise(
443435
&Conf::new(Type::structure(inner.finalize().as_ref()), MAX_CONFIDENCE),
444436
&format!("__inner{}", i),
445437
inner_offset - offset,
438+
None,
446439
false,
447440
MemberAccess::PublicAccess,
448441
MemberScope::NoScope,
@@ -452,10 +445,11 @@ fn apply_groups(
452445
let mut inner = StructureBuilder::new();
453446
inner.structure_type(StructureType::UnionStructureType);
454447
apply_groups(members, &mut inner, children, inner_offset);
455-
structure.insert(
448+
structure.insert_bitwise(
456449
&Conf::new(Type::structure(inner.finalize().as_ref()), MAX_CONFIDENCE),
457450
&format!("__inner{}", i),
458451
inner_offset - offset,
452+
None,
459453
false,
460454
MemberAccess::PublicAccess,
461455
MemberScope::NoScope,

plugins/pdb-ng/src/type_parser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ pub struct ParsedMember {
7878
pub ty: Conf<Ref<Type>>,
7979
/// Member name
8080
pub name: String,
81-
/// Offset in structure
81+
/// Offset in structure (bytes)
8282
pub offset: u64,
8383
/// Access flags
8484
pub access: MemberAccess,

0 commit comments

Comments
 (0)