summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authorJosh Ferrell <josh@vector35.com>2026-04-20 22:07:54 -0400
committerJosh Ferrell <josh@vector35.com>2026-04-20 22:07:54 -0400
commit4e6453c7609bbea86c172f4df2f3aa3a3429677f (patch)
tree7980d8e2b92ec5af7994c2618e9eebab3fb5a3c2 /plugins
parent468028455f5b7d9bf71fc111c078487c6dbf8a73 (diff)
[PDB Import] Fix calculation of struct bitfield member offsets
Diffstat (limited to 'plugins')
-rw-r--r--plugins/pdb-ng/src/struct_grouper.rs30
-rw-r--r--plugins/pdb-ng/src/type_parser.rs2
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,