(buf: &'a [u8])
| 252 | |
| 253 | impl<'a> Parsable<'a> for DmpParser<'a> { |
| 254 | fn from_buffer(buf: &'a [u8]) -> Result<Self, ParsingError> { |
| 255 | let dmp_headers = get_dump_headers_from_buffer(buf)?; |
| 256 | |
| 257 | let bitmap_header = |
| 258 | get_bitmap_headers_from_buffer(&buf[size_of::<DUMP_HEADER64>()..buf.len()])?; |
| 259 | |
| 260 | let mut dmp_pages: HashMap<PhysicalAddress, usize> = HashMap::new(); |
| 261 | |
| 262 | let mut current_page = bitmap_header.FirstPage as usize; |
| 263 | let bitmap_size = bitmap_header.Pages / 8; |
| 264 | |
| 265 | let bitmap_data = &buf[(size_of::<DUMP_HEADER64>() + size_of::<BitmapHeader>())..buf.len()]; |
| 266 | |
| 267 | for bitmap_index in 0..bitmap_size { |
| 268 | let byte = bitmap_data[bitmap_index as usize]; |
| 269 | |
| 270 | for bit_index in 0..8 { |
| 271 | let bit = (byte >> bit_index) & 1; |
| 272 | if bit != 0 { |
| 273 | let pfn = (bitmap_index * 8) + bit_index as u64; |
| 274 | let pa = pfn * PAGE_SIZE as u64; |
| 275 | |
| 276 | dmp_pages.insert(PhysicalAddress::from(pa), current_page); |
| 277 | |
| 278 | current_page += PAGE_SIZE; |
| 279 | } |
| 280 | } |
| 281 | } |
| 282 | |
| 283 | let dmp = DmpParser { |
| 284 | buffer: buf, |
| 285 | pages: dmp_pages, |
| 286 | directory_table_base: PhysicalAddress::from(dmp_headers.DirectoryTableBase), |
| 287 | ps_active_process_list: VirtualAddress::from(dmp_headers.PsActiveProcessHead), |
| 288 | }; |
| 289 | |
| 290 | Ok(dmp) |
| 291 | } |
| 292 | |
| 293 | fn read_physical_memory_page(&self, phys_addr: PhysicalAddress) -> Result<&[u8], PageError> { |
| 294 | let page_offset = self |
nothing calls this directly
no test coverage detected