diff options
| author | Josh Ferrell <josh@vector35.com> | 2026-04-20 22:07:54 -0400 |
|---|---|---|
| committer | Josh Ferrell <josh@vector35.com> | 2026-04-20 22:07:54 -0400 |
| commit | 4e6453c7609bbea86c172f4df2f3aa3a3429677f (patch) | |
| tree | 7980d8e2b92ec5af7994c2618e9eebab3fb5a3c2 /plugins | |
| parent | 468028455f5b7d9bf71fc111c078487c6dbf8a73 (diff) | |
[PDB Import] Fix calculation of struct bitfield member offsets
Diffstat (limited to 'plugins')
| -rw-r--r-- | plugins/pdb-ng/src/struct_grouper.rs | 30 | ||||
| -rw-r--r-- | plugins/pdb-ng/src/type_parser.rs | 2 |
2 files changed, 13 insertions, 19 deletions
diff --git a/plugins/pdb-ng/src/struct_grouper.rs b/plugins/pdb-ng/src/struct_grouper.rs index 378d8c3b..7d07377b 100644 --- a/plugins/pdb-ng/src/struct_grouper.rs +++ b/plugins/pdb-ng/src/struct_grouper.rs @@ -29,8 +29,11 @@ struct MemberSize { #[derive(Debug, Clone, PartialEq, Eq)] enum ResolvedGroup { + /// An index into a list of members Single(usize), + /// Non-overlapping members with bit-offset of start Struct(u64, Vec<ResolvedGroup>), + /// Overlapping members with bit-offset of start Union(u64, Vec<ResolvedGroup>), } @@ -399,36 +402,25 @@ fn apply_groups( match group { ResolvedGroup::Single(index) => { let member = &members[index]; - - // TODO : Fix inner-offset being larger than `member.offset` - + let member_bit_offset = member.offset * 8; match (member.bitfield_position, member.bitfield_size) { (Some(bit_pos), bit_width) => { structure.insert_bitwise( &member.ty, &member.name, - (member.offset - offset) * 8 + bit_pos, + member_bit_offset - offset + bit_pos, bit_width.map(|w| w as u8), false, member.access, member.scope, ); } - (None, _) if offset > member.offset => { - structure.insert( - &member.ty, - &member.name, - 0, - false, - member.access, - member.scope, - ); - } (None, _) => { - structure.insert( + structure.insert_bitwise( &member.ty, &member.name, - member.offset - offset, + member_bit_offset - offset, + None, false, member.access, member.scope, @@ -439,10 +431,11 @@ fn apply_groups( ResolvedGroup::Struct(inner_offset, children) => { let mut inner = StructureBuilder::new(); apply_groups(members, &mut inner, children, inner_offset); - structure.insert( + structure.insert_bitwise( &Conf::new(Type::structure(inner.finalize().as_ref()), MAX_CONFIDENCE), &format!("__inner{}", i), inner_offset - offset, + None, false, MemberAccess::PublicAccess, MemberScope::NoScope, @@ -452,10 +445,11 @@ fn apply_groups( let mut inner = StructureBuilder::new(); inner.structure_type(StructureType::UnionStructureType); apply_groups(members, &mut inner, children, inner_offset); - structure.insert( + structure.insert_bitwise( &Conf::new(Type::structure(inner.finalize().as_ref()), MAX_CONFIDENCE), &format!("__inner{}", i), inner_offset - offset, + None, false, MemberAccess::PublicAccess, MemberScope::NoScope, diff --git a/plugins/pdb-ng/src/type_parser.rs b/plugins/pdb-ng/src/type_parser.rs index 2ab2a0cc..026a421a 100644 --- a/plugins/pdb-ng/src/type_parser.rs +++ b/plugins/pdb-ng/src/type_parser.rs @@ -78,7 +78,7 @@ pub struct ParsedMember { pub ty: Conf<Ref<Type>>, /// Member name pub name: String, - /// Offset in structure + /// Offset in structure (bytes) pub offset: u64, /// Access flags pub access: MemberAccess, |
