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

Method from_buffer

src/kdmp/parser.rs:254–291  ·  view source on GitHub ↗
(buf: &'a [u8])

Source from the content-addressed store, hash-verified

252
253impl<'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

Callers

nothing calls this directly

Calls 2

Tested by

no test coverage detected