Skip to content

Commit 30f4875

Browse files
committed
fix(os-windows): enumerate trees in order
1 parent 5bb796f commit 30f4875

File tree

2 files changed

+33
-18
lines changed

2 files changed

+33
-18
lines changed

crates/vmi-os-windows/src/lib.rs

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -610,19 +610,15 @@ where
610610

611611
let left = Va(balanced_node.read(MMADDRESS_NODE.LeftChild)?);
612612
if !left.is_null() {
613-
if !callback(left) {
614-
return Ok(());
615-
}
616-
617613
self.enumerate_tree_node_v1(vmi, registers, left, callback, offsets)?;
618614
}
619615

616+
if !callback(node) {
617+
return Ok(());
618+
}
619+
620620
let right = Va(balanced_node.read(MMADDRESS_NODE.RightChild)?);
621621
if !right.is_null() {
622-
if !callback(right) {
623-
return Ok(());
624-
}
625-
626622
self.enumerate_tree_node_v1(vmi, registers, right, callback, offsets)?;
627623
}
628624

@@ -648,19 +644,15 @@ where
648644

649645
let left = Va(balanced_node.read(RTL_BALANCED_NODE.Left)?);
650646
if !left.is_null() {
651-
if !callback(left) {
652-
return Ok(());
653-
}
654-
655647
self.enumerate_tree_node_v2(vmi, registers, left, callback, offsets)?;
656648
}
657649

650+
if !callback(node) {
651+
return Ok(());
652+
}
653+
658654
let right = Va(balanced_node.read(RTL_BALANCED_NODE.Right)?);
659655
if !right.is_null() {
660-
if !callback(right) {
661-
return Ok(());
662-
}
663-
664656
self.enumerate_tree_node_v2(vmi, registers, right, callback, offsets)?;
665657
}
666658

@@ -675,6 +667,29 @@ where
675667
mut callback: impl FnMut(Va) -> bool,
676668
offsets: &v1::Offsets,
677669
) -> Result<(), VmiError> {
670+
let MM_AVL_TABLE = &offsets._MM_AVL_TABLE;
671+
let MMADDRESS_NODE = &offsets._MMADDRESS_NODE;
672+
673+
// NumberGenericTableElements is a ULONG_PTR, which is the same size
674+
// as a pointer.
675+
let count = vmi.read_va(
676+
registers.address_context(root + MM_AVL_TABLE.NumberGenericTableElements.offset),
677+
registers.address_width(),
678+
)?;
679+
680+
let count = MM_AVL_TABLE.NumberGenericTableElements.value_from(count.0);
681+
if count == 0 {
682+
return Ok(());
683+
}
684+
685+
// Table->BalancedRoot.RightChild
686+
let root = vmi.read_va(
687+
registers.address_context(
688+
root + MM_AVL_TABLE.BalancedRoot.offset + MMADDRESS_NODE.RightChild.offset,
689+
),
690+
registers.address_width(),
691+
)?;
692+
678693
self.enumerate_tree_node_v1(vmi, registers, root, &mut callback, offsets)
679694
}
680695

@@ -686,7 +701,6 @@ where
686701
mut callback: impl FnMut(Va) -> bool,
687702
offsets: &v2::Offsets,
688703
) -> Result<(), VmiError> {
689-
callback(root);
690704
self.enumerate_tree_node_v2(vmi, registers, root, &mut callback, offsets)
691705
}
692706

crates/vmi-os-windows/src/offsets/v1.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use isr_macros::{offsets, Field};
1+
use isr_macros::{offsets, Bitfield, Field};
22

33
offsets! {
44
/// Windows 7 kernel offsets used by the [`WindowsOs`] implementation.
@@ -28,6 +28,7 @@ offsets! {
2828

2929
struct _MM_AVL_TABLE {
3030
BalancedRoot: Field, // _MMADDRESS_NODE
31+
NumberGenericTableElements: Bitfield, // ULONG_PTR
3132
NodeHint: Field, // PVOID
3233
}
3334

0 commit comments

Comments
 (0)