(&self)
| 116 | } |
| 117 | |
| 118 | fn init(&self) -> BinaryViewResult<()> { |
| 119 | let parent_view = self.parent_view().ok_or(())?; |
| 120 | let read_buffer = parent_view.read_buffer(0, parent_view.len() as usize)?; |
| 121 | |
| 122 | if let Ok(minidump_obj) = Minidump::read(read_buffer.get_data()) { |
| 123 | // Architecture, platform information |
| 124 | if let Ok(minidump_system_info) = minidump_obj.get_stream::<MinidumpSystemInfo>() { |
| 125 | if let Some(platform) = MinidumpBinaryView::translate_minidump_platform( |
| 126 | minidump_system_info.cpu, |
| 127 | minidump_obj.endian, |
| 128 | minidump_system_info.os, |
| 129 | ) { |
| 130 | self.set_default_platform(&platform); |
| 131 | } else { |
| 132 | error!( |
| 133 | "Could not parse valid system information from minidump: could not map system information in MinidumpSystemInfo stream (arch {:?}, endian {:?}, os {:?}) to a known architecture", |
| 134 | minidump_system_info.cpu, |
| 135 | minidump_obj.endian, |
| 136 | minidump_system_info.os, |
| 137 | ); |
| 138 | return Err(()); |
| 139 | } |
| 140 | } else { |
| 141 | error!("Could not parse system information from minidump: could not find a valid MinidumpSystemInfo stream"); |
| 142 | return Err(()); |
| 143 | } |
| 144 | |
| 145 | // Memory segments |
| 146 | let mut segment_data = Vec::<SegmentData>::new(); |
| 147 | |
| 148 | // Memory segments in a full memory dump (MinidumpMemory64List) |
| 149 | // Grab the shared base RVA for all entries in the MinidumpMemory64List, |
| 150 | // since the minidump crate doesn't expose this to us |
| 151 | if let Ok(raw_stream) = minidump_obj.get_raw_stream(MinidumpMemory64List::STREAM_TYPE) { |
| 152 | if let Ok(base_rva_array) = raw_stream[8..16].try_into() { |
| 153 | let base_rva = u64::from_le_bytes(base_rva_array); |
| 154 | debug!("Found BaseRVA value {:#x}", base_rva); |
| 155 | |
| 156 | if let Ok(minidump_memory_list) = |
| 157 | minidump_obj.get_stream::<MinidumpMemory64List>() |
| 158 | { |
| 159 | let mut current_rva = base_rva; |
| 160 | for memory_segment in minidump_memory_list.iter() { |
| 161 | debug!( |
| 162 | "Found memory segment at RVA {:#x} with virtual address {:#x} and size {:#x}", |
| 163 | current_rva, |
| 164 | memory_segment.base_address, |
| 165 | memory_segment.size, |
| 166 | ); |
| 167 | segment_data.push(SegmentData::from_addresses_and_size( |
| 168 | current_rva, |
| 169 | memory_segment.base_address, |
| 170 | memory_segment.size, |
| 171 | )); |
| 172 | current_rva += memory_segment.size; |
| 173 | } |
| 174 | } |
| 175 | } else { |
no test coverage detected