(
&self,
pml4: PhysicalAddress,
virt_addr: VirtualAddress,
len: usize,
)
| 393 | } |
| 394 | |
| 395 | fn read_virtual_memory( |
| 396 | &self, |
| 397 | pml4: PhysicalAddress, |
| 398 | virt_addr: VirtualAddress, |
| 399 | len: usize, |
| 400 | ) -> Result<Vec<u8>, PageError> { |
| 401 | let offset_to_page = PAGE_SIZE - (virt_addr.addr as usize % PAGE_SIZE); |
| 402 | let beginning_len = cmp::min(len, offset_to_page); |
| 403 | |
| 404 | let mut beginning_data = self.read_virtual_memory_page(pml4, virt_addr)?.to_vec(); |
| 405 | beginning_data = beginning_data[(virt_addr.addr as usize % PAGE_SIZE) |
| 406 | ..((virt_addr.addr as usize % PAGE_SIZE) + beginning_len)] |
| 407 | .to_vec(); |
| 408 | |
| 409 | let complete_pages = (len - beginning_len) / PAGE_SIZE; |
| 410 | |
| 411 | for i in 0..complete_pages { |
| 412 | let mut page_addr = virt_addr + offset_to_page as u64; |
| 413 | page_addr = page_addr + (i * PAGE_SIZE) as u64; |
| 414 | |
| 415 | beginning_data.extend_from_slice(self.read_virtual_memory_page(pml4, page_addr)?); |
| 416 | } |
| 417 | |
| 418 | let ending_len = len - (beginning_len + (complete_pages * PAGE_SIZE)); |
| 419 | let ending_addr = VirtualAddress::from( |
| 420 | virt_addr.addr + beginning_len as u64 + (complete_pages * PAGE_SIZE) as u64, |
| 421 | ); |
| 422 | let ending_page = self.read_virtual_memory_page(pml4, ending_addr)?; |
| 423 | let ending_page = &ending_page[..ending_len]; |
| 424 | |
| 425 | beginning_data.extend_from_slice(ending_page); |
| 426 | Ok(beginning_data) |
| 427 | } |
| 428 | |
| 429 | fn get_ipid_table(&self, process_directory_base: PhysicalAddress) -> Option<u64> { |
| 430 | let com_data_info = get_com_data_section_info()?; |
no test coverage detected