MCPcopy Create free account
hub / github.com/Slowerzs/PPLSystem / read_virtual_memory_page

Method read_virtual_memory_page

src/kdmp/parser.rs:316–393  ·  view source on GitHub ↗
(
        &self,
        pml4: PhysicalAddress,
        virt_addr: VirtualAddress,
    )

Source from the content-addressed store, hash-verified

314 }
315
316 fn read_virtual_memory_page(
317 &self,
318 pml4: PhysicalAddress,
319 virt_addr: VirtualAddress,
320 ) -> Result<&[u8], PageError> {
321 let page_frame_number = PageEntry::from(pml4.addr).get_page_frame_number();
322 let pml4_base = PhysicalAddress::from(page_frame_number << 12);
323 let pml4_offset = virt_addr.get_pml4_offset();
324
325 let level4_entry_address = PhysicalAddress::from(pml4_base.addr + pml4_offset);
326
327 let level4_entry_data = self.read_physical_memory(level4_entry_address, 0x8)?;
328 let level4_entry = u64::from_le_bytes(level4_entry_data.try_into().unwrap());
329
330 let pml4_entry = PageEntry::from(level4_entry);
331
332 if !pml4_entry.is_present() {
333 println!("Error level 4");
334 return Err(PageError::PageNotInDump);
335 }
336
337 let pdpt_base = PhysicalAddress::from(pml4_entry.get_page_frame_number() << 12);
338 let pdpt_offset = virt_addr.get_pdpt_offset();
339
340 let pdpt_entry_address = PhysicalAddress::from(pdpt_base.addr + pdpt_offset);
341 let pdpt_entry_data = self.read_physical_memory(pdpt_entry_address, 0x8)?;
342 let pdpt_entry = u64::from_le_bytes(pdpt_entry_data.try_into().unwrap());
343
344 let pdpt_entry = PageEntry::from(pdpt_entry);
345
346 if !pdpt_entry.is_present() {
347 println!("Error level 3");
348 return Err(PageError::PageNotInDump);
349 }
350
351 let pdt_base = PhysicalAddress::from(pdpt_entry.get_page_frame_number() << 12);
352 let pdt_offset = virt_addr.get_pdt_offset();
353
354 let pdt_entry_address = PhysicalAddress::from(pdt_base.addr + pdt_offset);
355 let pdt_entry_data = self.read_physical_memory(pdt_entry_address, 0x8)?;
356 let pdt_entry = u64::from_le_bytes(pdt_entry_data.try_into().unwrap());
357
358 let pdt_entry = PageEntry::from(pdt_entry);
359
360 if !pdt_entry.is_present() {
361 println!("Error level 2");
362 return Err(PageError::PageNotInDump);
363 }
364
365 if pdt_entry.is_large_page() {
366 let pt_base = PhysicalAddress::from(pdt_entry.get_page_frame_number() << 12);
367 let pt_offset = virt_addr.get_large_page_offset();
368
369 let pt_entry_address = PhysicalAddress::from((pt_base.addr + pt_offset) & !0xFFF);
370 let pt_entry_data = self.read_physical_memory(pt_entry_address, PAGE_SIZE)?;
371
372 return Ok(pt_entry_data);
373 }

Callers 1

read_virtual_memoryMethod · 0.80

Calls 9

get_page_frame_numberMethod · 0.80
get_pml4_offsetMethod · 0.80
read_physical_memoryMethod · 0.80
is_presentMethod · 0.80
get_pdpt_offsetMethod · 0.80
get_pdt_offsetMethod · 0.80
is_large_pageMethod · 0.80
get_large_page_offsetMethod · 0.80
get_pt_offsetMethod · 0.80

Tested by

no test coverage detected