@@ -16,40 +16,12 @@ use crate::gxa::Gxa;
1616use crate :: map:: { MappedFileReader , Reader } ;
1717use crate :: structs:: {
1818 BmpHeader64 , Context , DUMP_HEADER64_EXPECTED_SIGNATURE , DUMP_HEADER64_EXPECTED_VALID_DUMP ,
19- DumpType , ExceptionRecord64 , FullRdmpHeader64 , Header64 , HugePage , KdDebuggerData64 ,
20- KernelRdmpHeader64 , LargePage , LdrDataTableEntry , ListEntry , Page , PfnRange , PhysmemDesc ,
21- PhysmemMap , PhysmemRun , UnicodeString , read_struct,
19+ DumpType , ExceptionRecord64 , FullRdmpHeader64 , Header64 , KdDebuggerData64 , KernelRdmpHeader64 ,
20+ LdrDataTableEntry , ListEntry , PageKind , PfnRange , PhysmemDesc , PhysmemMap , PhysmemRun ,
21+ UnicodeString , read_struct,
2222} ;
2323use crate :: { AddrTranslationError , Gpa , Gva , KdmpParserError , Pfn , Pxe } ;
2424
25- /// The kind of physical page.
26- #[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
27- pub enum PageKind {
28- /// A normal 4kb page.
29- Normal ,
30- /// A large 2mb page.
31- Large ,
32- /// A huge 1gb page.
33- Huge ,
34- }
35-
36- impl PageKind {
37- /// Size in bytes of the page.
38- pub fn size ( & self ) -> u64 {
39- match self {
40- Self :: Normal => Page :: size ( ) ,
41- Self :: Large => LargePage :: size ( ) ,
42- Self :: Huge => HugePage :: size ( ) ,
43- }
44- }
45-
46- pub fn page_offset_of ( & self , addr : u64 ) -> u64 {
47- let mask = self . size ( ) - 1 ;
48-
49- addr & mask
50- }
51- }
52-
5325/// The details related to a virtual to physical address translation.
5426#[ derive( Debug ) ]
5527pub struct TranslationDetails {
@@ -71,7 +43,7 @@ pub struct TranslationDetails {
7143
7244impl TranslationDetails {
7345 pub fn new ( pfn : Pfn , offset : u64 , page_kind : PageKind , pxes : & [ Pxe ] ) -> Self {
74- let readable = pxes. iter ( ) . all ( Pxe :: readable ) ;
46+ let readable = pxes. iter ( ) . all ( Pxe :: present ) ;
7547 let writable = pxes. iter ( ) . all ( Pxe :: writable) ;
7648 let executable = pxes. iter ( ) . all ( Pxe :: executable) ;
7749 let user_accessible = pxes. iter ( ) . all ( Pxe :: user_accessible) ;
@@ -103,7 +75,7 @@ fn gpa_from_bitmap(bitmap_idx: u64, bit_idx: usize) -> Option<Gpa> {
10375}
10476
10577fn gpa_from_pfn_range ( pfn_range : & PfnRange , page_idx : u64 ) -> Option < Gpa > {
106- let offset = page_idx. checked_mul ( Page :: size ( ) ) ?;
78+ let offset = page_idx. checked_mul ( PageKind :: Normal . size ( ) ) ?;
10779
10880 Some ( Pfn :: new ( pfn_range. page_file_number ) . gpa_with_offset ( offset) )
10981}
@@ -574,7 +546,7 @@ impl KernelDumpParser {
574546 // So let's figure out the maximum amount of bytes we can read off this page.
575547 // Either, we read it until its end, or we stop if the user wants us to read
576548 // less.
577- let left_in_page = ( Page :: size ( ) - gpa. offset ( ) ) as usize ;
549+ let left_in_page = ( PageKind :: Normal . size ( ) - gpa. offset ( ) ) as usize ;
578550 let amount_wanted = min ( amount_left, left_in_page) ;
579551 // Figure out where we should read into.
580552 let slice = & mut buf[ total_read..total_read + amount_wanted] ;
@@ -653,7 +625,7 @@ impl KernelDumpParser {
653625 let pd_base = pdpte. pfn . gpa ( ) ;
654626 if pdpte. large_page ( ) {
655627 let page_kind = PageKind :: Huge ;
656- let offset = page_kind. page_offset_of ( gva. u64 ( ) ) ;
628+ let offset = page_kind. page_offset ( gva. u64 ( ) ) ;
657629 return Ok ( TranslationDetails :: new ( pdpte. pfn , offset, page_kind, & [
658630 pml4e, pdpte,
659631 ] ) ) ;
@@ -671,7 +643,7 @@ impl KernelDumpParser {
671643 let pt_base = pde. pfn . gpa ( ) ;
672644 if pde. large_page ( ) {
673645 let page_kind = PageKind :: Large ;
674- let offset = page_kind. page_offset_of ( gva. u64 ( ) ) ;
646+ let offset = page_kind. page_offset ( gva. u64 ( ) ) ;
675647 return Ok ( TranslationDetails :: new (
676648 pde. pfn ,
677649 offset,
@@ -691,7 +663,7 @@ impl KernelDumpParser {
691663 }
692664
693665 let page_kind = PageKind :: Normal ;
694- let offset = page_kind. page_offset_of ( gva. u64 ( ) ) ;
666+ let offset = page_kind. page_offset ( gva. u64 ( ) ) ;
695667
696668 Ok ( TranslationDetails :: new ( pte. pfn , offset, page_kind, & [
697669 pml4e, pdpte, pde, pte,
@@ -936,7 +908,7 @@ impl KernelDumpParser {
936908
937909 // Move the page offset along.
938910 page_offset = page_offset
939- . checked_add ( Page :: size ( ) )
911+ . checked_add ( PageKind :: Normal . size ( ) )
940912 . ok_or ( KdmpParserError :: PageOffsetOverflow ( run_idx, page_idx) ) ?;
941913 }
942914 }
@@ -984,7 +956,7 @@ impl KernelDumpParser {
984956
985957 let insert = physmem. insert ( pa, page_offset) ;
986958 debug_assert ! ( insert. is_none( ) ) ;
987- page_offset = page_offset. checked_add ( Page :: size ( ) ) . ok_or (
959+ page_offset = page_offset. checked_add ( PageKind :: Normal . size ( ) ) . ok_or (
988960 KdmpParserError :: BitmapPageOffsetOverflow ( bitmap_idx, bit_idx) ,
989961 ) ?;
990962 }
@@ -1072,7 +1044,7 @@ impl KernelDumpParser {
10721044 let insert = physmem. insert ( gpa, page_offset) ;
10731045 debug_assert ! ( insert. is_none( ) ) ;
10741046 page_offset = page_offset
1075- . checked_add ( Page :: size ( ) )
1047+ . checked_add ( PageKind :: Normal . size ( ) )
10761048 . ok_or ( KdmpParserError :: Overflow ( "w/ page_offset" ) ) ?;
10771049 }
10781050
0 commit comments