(
source: &dyn MemorySource,
address: u64,
max_count: usize,
)
| 9 | } |
| 10 | |
| 11 | pub fn read_memory_array<T: Sized + Default>( |
| 12 | source: &dyn MemorySource, |
| 13 | address: u64, |
| 14 | max_count: usize, |
| 15 | ) -> Result<Vec<T>, &'static str> { |
| 16 | let element_size = ::core::mem::size_of::<T>(); |
| 17 | let max_bytes = max_count * element_size; |
| 18 | let raw_bytes = source.read_raw_memory(address, max_bytes); |
| 19 | let mut data: Vec<T> = Vec::new(); |
| 20 | let mut offset: usize = 0; |
| 21 | while offset + element_size <= raw_bytes.len() { |
| 22 | let mut item: T = T::default(); |
| 23 | let dst: *mut u8 = unsafe { std::mem::transmute(&mut item) }; |
| 24 | let src = &raw_bytes[offset] as *const u8; |
| 25 | unsafe { std::ptr::copy_nonoverlapping(src, dst, element_size) }; |
| 26 | data.push(item); |
| 27 | offset += element_size; |
| 28 | } |
| 29 | |
| 30 | Ok(data) |
| 31 | } |
| 32 | |
| 33 | pub fn read_memory_full_array<T: Sized + Default>( |
| 34 | source: &dyn MemorySource, |
no test coverage detected