@@ -610,19 +610,15 @@ where
610
610
611
611
let left = Va ( balanced_node. read ( MMADDRESS_NODE . LeftChild ) ?) ;
612
612
if !left. is_null ( ) {
613
- if !callback ( left) {
614
- return Ok ( ( ) ) ;
615
- }
616
-
617
613
self . enumerate_tree_node_v1 ( vmi, registers, left, callback, offsets) ?;
618
614
}
619
615
616
+ if !callback ( node) {
617
+ return Ok ( ( ) ) ;
618
+ }
619
+
620
620
let right = Va ( balanced_node. read ( MMADDRESS_NODE . RightChild ) ?) ;
621
621
if !right. is_null ( ) {
622
- if !callback ( right) {
623
- return Ok ( ( ) ) ;
624
- }
625
-
626
622
self . enumerate_tree_node_v1 ( vmi, registers, right, callback, offsets) ?;
627
623
}
628
624
@@ -648,19 +644,15 @@ where
648
644
649
645
let left = Va ( balanced_node. read ( RTL_BALANCED_NODE . Left ) ?) ;
650
646
if !left. is_null ( ) {
651
- if !callback ( left) {
652
- return Ok ( ( ) ) ;
653
- }
654
-
655
647
self . enumerate_tree_node_v2 ( vmi, registers, left, callback, offsets) ?;
656
648
}
657
649
650
+ if !callback ( node) {
651
+ return Ok ( ( ) ) ;
652
+ }
653
+
658
654
let right = Va ( balanced_node. read ( RTL_BALANCED_NODE . Right ) ?) ;
659
655
if !right. is_null ( ) {
660
- if !callback ( right) {
661
- return Ok ( ( ) ) ;
662
- }
663
-
664
656
self . enumerate_tree_node_v2 ( vmi, registers, right, callback, offsets) ?;
665
657
}
666
658
@@ -675,6 +667,29 @@ where
675
667
mut callback : impl FnMut ( Va ) -> bool ,
676
668
offsets : & v1:: Offsets ,
677
669
) -> 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
+
678
693
self . enumerate_tree_node_v1 ( vmi, registers, root, & mut callback, offsets)
679
694
}
680
695
@@ -686,7 +701,6 @@ where
686
701
mut callback : impl FnMut ( Va ) -> bool ,
687
702
offsets : & v2:: Offsets ,
688
703
) -> Result < ( ) , VmiError > {
689
- callback ( root) ;
690
704
self . enumerate_tree_node_v2 ( vmi, registers, root, & mut callback, offsets)
691
705
}
692
706
0 commit comments