1use crate::utils::encoding::decode_to_string;
3use crate::{types::Encoding, utils::struct_pack::StructUnpack};
4use std::ffi::CString;
5use std::io::*;
6use std::sync::Mutex;
7
8pub trait Peek {
10 fn peek(&mut self, buf: &mut [u8]) -> Result<usize>;
13 fn peek_exact(&mut self, buf: &mut [u8]) -> Result<()>;
16 fn peek_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<usize>;
19 fn peek_exact_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<()>;
22 fn peek_at_vec(&mut self, offset: u64, len: usize) -> Result<Vec<u8>> {
25 let mut buf = vec![0u8; len];
26 let bytes_read = self.peek_at(offset, &mut buf)?;
27 if bytes_read < len {
28 buf.truncate(bytes_read);
29 }
30 Ok(buf)
31 }
32 fn peek_exact_at_vec(&mut self, offset: u64, len: usize) -> Result<Vec<u8>> {
35 let mut buf = vec![0u8; len];
36 self.peek_exact_at(offset, &mut buf)?;
37 Ok(buf)
38 }
39
40 fn peek_u8(&mut self) -> Result<u8> {
42 let mut buf = [0u8; 1];
43 self.peek_exact(&mut buf)?;
44 Ok(buf[0])
45 }
46 fn peek_u16(&mut self) -> Result<u16> {
48 let mut buf = [0u8; 2];
49 self.peek_exact(&mut buf)?;
50 Ok(u16::from_le_bytes(buf))
51 }
52 fn peek_u16_be(&mut self) -> Result<u16> {
54 let mut buf = [0u8; 2];
55 self.peek_exact(&mut buf)?;
56 Ok(u16::from_be_bytes(buf))
57 }
58 fn peek_u32(&mut self) -> Result<u32> {
60 let mut buf = [0u8; 4];
61 self.peek_exact(&mut buf)?;
62 Ok(u32::from_le_bytes(buf))
63 }
64 fn peek_u32_be(&mut self) -> Result<u32> {
66 let mut buf = [0u8; 4];
67 self.peek_exact(&mut buf)?;
68 Ok(u32::from_be_bytes(buf))
69 }
70 fn peek_u64(&mut self) -> Result<u64> {
72 let mut buf = [0u8; 8];
73 self.peek_exact(&mut buf)?;
74 Ok(u64::from_le_bytes(buf))
75 }
76 fn peek_u64_be(&mut self) -> Result<u64> {
78 let mut buf = [0u8; 8];
79 self.peek_exact(&mut buf)?;
80 Ok(u64::from_be_bytes(buf))
81 }
82 fn peek_u128(&mut self) -> Result<u128> {
84 let mut buf = [0u8; 16];
85 self.peek_exact(&mut buf)?;
86 Ok(u128::from_le_bytes(buf))
87 }
88 fn peek_u128_be(&mut self) -> Result<u128> {
90 let mut buf = [0u8; 16];
91 self.peek_exact(&mut buf)?;
92 Ok(u128::from_be_bytes(buf))
93 }
94 fn peek_i8(&mut self) -> Result<i8> {
96 let mut buf = [0u8; 1];
97 self.peek_exact(&mut buf)?;
98 Ok(i8::from_le_bytes(buf))
99 }
100 fn peek_i16(&mut self) -> Result<i16> {
102 let mut buf = [0u8; 2];
103 self.peek_exact(&mut buf)?;
104 Ok(i16::from_le_bytes(buf))
105 }
106 fn peek_i16_be(&mut self) -> Result<i16> {
108 let mut buf = [0u8; 2];
109 self.peek_exact(&mut buf)?;
110 Ok(i16::from_be_bytes(buf))
111 }
112 fn peek_i32(&mut self) -> Result<i32> {
114 let mut buf = [0u8; 4];
115 self.peek_exact(&mut buf)?;
116 Ok(i32::from_le_bytes(buf))
117 }
118 fn peek_i32_be(&mut self) -> Result<i32> {
120 let mut buf = [0u8; 4];
121 self.peek_exact(&mut buf)?;
122 Ok(i32::from_be_bytes(buf))
123 }
124 fn peek_i64(&mut self) -> Result<i64> {
126 let mut buf = [0u8; 8];
127 self.peek_exact(&mut buf)?;
128 Ok(i64::from_le_bytes(buf))
129 }
130 fn peek_i64_be(&mut self) -> Result<i64> {
132 let mut buf = [0u8; 8];
133 self.peek_exact(&mut buf)?;
134 Ok(i64::from_be_bytes(buf))
135 }
136 fn peek_i128(&mut self) -> Result<i128> {
138 let mut buf = [0u8; 16];
139 self.peek_exact(&mut buf)?;
140 Ok(i128::from_le_bytes(buf))
141 }
142 fn peek_i128_be(&mut self) -> Result<i128> {
144 let mut buf = [0u8; 16];
145 self.peek_exact(&mut buf)?;
146 Ok(i128::from_be_bytes(buf))
147 }
148 fn peek_u8_at(&mut self, offset: u64) -> Result<u8> {
150 let mut buf = [0u8; 1];
151 self.peek_exact_at(offset, &mut buf)?;
152 Ok(buf[0])
153 }
154 fn peek_u16_at(&mut self, offset: u64) -> Result<u16> {
156 let mut buf = [0u8; 2];
157 self.peek_exact_at(offset, &mut buf)?;
158 Ok(u16::from_le_bytes(buf))
159 }
160 fn peek_u16_be_at(&mut self, offset: u64) -> Result<u16> {
162 let mut buf = [0u8; 2];
163 self.peek_exact_at(offset, &mut buf)?;
164 Ok(u16::from_be_bytes(buf))
165 }
166 fn peek_u32_at(&mut self, offset: u64) -> Result<u32> {
168 let mut buf = [0u8; 4];
169 self.peek_exact_at(offset, &mut buf)?;
170 Ok(u32::from_le_bytes(buf))
171 }
172 fn peek_u32_be_at(&mut self, offset: u64) -> Result<u32> {
174 let mut buf = [0u8; 4];
175 self.peek_exact_at(offset, &mut buf)?;
176 Ok(u32::from_be_bytes(buf))
177 }
178 fn peek_u64_at(&mut self, offset: u64) -> Result<u64> {
180 let mut buf = [0u8; 8];
181 self.peek_exact_at(offset, &mut buf)?;
182 Ok(u64::from_le_bytes(buf))
183 }
184 fn peek_u64_be_at(&mut self, offset: u64) -> Result<u64> {
186 let mut buf = [0u8; 8];
187 self.peek_exact_at(offset, &mut buf)?;
188 Ok(u64::from_be_bytes(buf))
189 }
190 fn peek_u128_at(&mut self, offset: u64) -> Result<u128> {
192 let mut buf = [0u8; 16];
193 self.peek_exact_at(offset, &mut buf)?;
194 Ok(u128::from_le_bytes(buf))
195 }
196 fn peek_u128_be_at(&mut self, offset: u64) -> Result<u128> {
198 let mut buf = [0u8; 16];
199 self.peek_exact_at(offset, &mut buf)?;
200 Ok(u128::from_be_bytes(buf))
201 }
202 fn peek_i8_at(&mut self, offset: u64) -> Result<i8> {
204 let mut buf = [0u8; 1];
205 self.peek_exact_at(offset, &mut buf)?;
206 Ok(i8::from_le_bytes(buf))
207 }
208 fn peek_i16_at(&mut self, offset: u64) -> Result<i16> {
210 let mut buf = [0u8; 2];
211 self.peek_exact_at(offset, &mut buf)?;
212 Ok(i16::from_le_bytes(buf))
213 }
214 fn peek_i16_be_at(&mut self, offset: u64) -> Result<i16> {
216 let mut buf = [0u8; 2];
217 self.peek_exact_at(offset, &mut buf)?;
218 Ok(i16::from_be_bytes(buf))
219 }
220 fn peek_i32_at(&mut self, offset: u64) -> Result<i32> {
222 let mut buf = [0u8; 4];
223 self.peek_exact_at(offset, &mut buf)?;
224 Ok(i32::from_le_bytes(buf))
225 }
226 fn peek_i32_be_at(&mut self, offset: u64) -> Result<i32> {
228 let mut buf = [0u8; 4];
229 self.peek_exact_at(offset, &mut buf)?;
230 Ok(i32::from_be_bytes(buf))
231 }
232 fn peek_i64_at(&mut self, offset: u64) -> Result<i64> {
234 let mut buf = [0u8; 8];
235 self.peek_exact_at(offset, &mut buf)?;
236 Ok(i64::from_le_bytes(buf))
237 }
238 fn peek_i64_be_at(&mut self, offset: u64) -> Result<i64> {
240 let mut buf = [0u8; 8];
241 self.peek_exact_at(offset, &mut buf)?;
242 Ok(i64::from_be_bytes(buf))
243 }
244 fn peek_i128_at(&mut self, offset: u64) -> Result<i128> {
246 let mut buf = [0u8; 16];
247 self.peek_exact_at(offset, &mut buf)?;
248 Ok(i128::from_le_bytes(buf))
249 }
250 fn peek_i128_be_at(&mut self, offset: u64) -> Result<i128> {
252 let mut buf = [0u8; 16];
253 self.peek_exact_at(offset, &mut buf)?;
254 Ok(i128::from_be_bytes(buf))
255 }
256
257 fn peek_cstring(&mut self) -> Result<CString>;
259 fn peek_cstring_at(&mut self, offset: u64) -> Result<CString>;
261
262 fn read_struct<T: StructUnpack>(&mut self, big: bool, encoding: Encoding) -> Result<T>;
269 fn read_struct_vec<T: StructUnpack>(
277 &mut self,
278 count: usize,
279 big: bool,
280 encoding: Encoding,
281 ) -> Result<Vec<T>> {
282 let mut vec = Vec::with_capacity(count);
283 for _ in 0..count {
284 vec.push(self.read_struct(big, encoding)?);
285 }
286 Ok(vec)
287 }
288
289 fn peek_and_equal(&mut self, data: &[u8]) -> Result<()> {
291 let mut buf = vec![0u8; data.len()];
292 self.peek_exact(&mut buf)?;
293 if buf != data {
294 return Err(std::io::Error::new(
295 std::io::ErrorKind::InvalidData,
296 "Data does not match",
297 ));
298 }
299 Ok(())
300 }
301 fn peek_and_equal_at(&mut self, offset: u64, data: &[u8]) -> Result<()> {
303 let mut buf = vec![0u8; data.len()];
304 self.peek_exact_at(offset, &mut buf)?;
305 if buf != data {
306 return Err(std::io::Error::new(
307 std::io::ErrorKind::InvalidData,
308 "Data does not match at offset",
309 ));
310 }
311 Ok(())
312 }
313}
314
315impl<T: Read + Seek> Peek for T {
316 fn peek(&mut self, buf: &mut [u8]) -> Result<usize> {
317 let current_pos = self.stream_position()?;
318 let bytes_read = self.read(buf)?;
319 self.seek(SeekFrom::Start(current_pos))?;
320 Ok(bytes_read)
321 }
322
323 fn peek_exact(&mut self, buf: &mut [u8]) -> Result<()> {
324 let current_pos = self.stream_position()?;
325 self.read_exact(buf)?;
326 self.seek(SeekFrom::Start(current_pos))?;
327 Ok(())
328 }
329
330 fn peek_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<usize> {
331 let current_pos = self.stream_position()?;
332 self.seek(SeekFrom::Start(offset))?;
333 let bytes_read = self.read(buf)?;
334 self.seek(SeekFrom::Start(current_pos))?;
335 Ok(bytes_read)
336 }
337
338 fn peek_exact_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<()> {
339 let current_pos = self.stream_position()?;
340 self.seek(SeekFrom::Start(offset))?;
341 self.read_exact(buf)?;
342 self.seek(SeekFrom::Start(current_pos))?;
343 Ok(())
344 }
345
346 fn peek_cstring(&mut self) -> Result<CString> {
347 let current_pos = self.stream_position()?;
348 let mut buf = Vec::new();
349 loop {
350 let mut byte = [0u8; 1];
351 self.read_exact(&mut byte)?;
352 if byte[0] == 0 {
353 break;
354 }
355 buf.push(byte[0]);
356 }
357 self.seek(SeekFrom::Start(current_pos))?;
358 CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
359 }
360
361 fn peek_cstring_at(&mut self, offset: u64) -> Result<CString> {
362 let current_pos = self.stream_position()?;
363 let mut buf = Vec::new();
364 self.seek(SeekFrom::Start(offset as u64))?;
365 loop {
366 let mut byte = [0u8; 1];
367 self.read_exact(&mut byte)?;
368 if byte[0] == 0 {
369 break;
370 }
371 buf.push(byte[0]);
372 }
373 self.seek(SeekFrom::Start(current_pos))?;
374 CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
375 }
376
377 fn read_struct<S: StructUnpack>(&mut self, big: bool, encoding: Encoding) -> Result<S> {
378 S::unpack(self, big, encoding)
379 .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
380 }
381}
382
383pub trait CPeek {
385 fn cpeek(&self, buf: &mut [u8]) -> Result<usize>;
388 fn cpeek_exact(&self, buf: &mut [u8]) -> Result<()> {
391 let bytes_read = self.cpeek(buf)?;
392 if bytes_read < buf.len() {
393 return Err(std::io::Error::new(
394 std::io::ErrorKind::UnexpectedEof,
395 "Not enough data to read",
396 ));
397 }
398 Ok(())
399 }
400 fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize>;
403 fn cpeek_exact_at(&self, offset: u64, buf: &mut [u8]) -> Result<()> {
406 let bytes_read = self.cpeek_at(offset, buf)?;
407 if bytes_read < buf.len() {
408 return Err(std::io::Error::new(
409 std::io::ErrorKind::UnexpectedEof,
410 "Not enough data to read",
411 ));
412 }
413 Ok(())
414 }
415 fn cpeek_at_vec(&self, offset: u64, len: usize) -> Result<Vec<u8>> {
418 let mut buf = vec![0u8; len];
419 let bytes_read = self.cpeek_at(offset, &mut buf)?;
420 if bytes_read < len {
421 buf.truncate(bytes_read);
422 }
423 Ok(buf)
424 }
425 fn cpeek_exact_at_vec(&self, offset: u64, len: usize) -> Result<Vec<u8>> {
428 let mut buf = vec![0u8; len];
429 self.cpeek_exact_at(offset, &mut buf)?;
430 Ok(buf)
431 }
432
433 fn cpeek_u8(&self) -> Result<u8> {
435 let mut buf = [0u8; 1];
436 self.cpeek_exact(&mut buf)?;
437 Ok(buf[0])
438 }
439 fn cpeek_u16(&self) -> Result<u16> {
441 let mut buf = [0u8; 2];
442 self.cpeek_exact(&mut buf)?;
443 Ok(u16::from_le_bytes(buf))
444 }
445 fn cpeek_u16_be(&self) -> Result<u16> {
447 let mut buf = [0u8; 2];
448 self.cpeek_exact(&mut buf)?;
449 Ok(u16::from_be_bytes(buf))
450 }
451 fn cpeek_u32(&self) -> Result<u32> {
453 let mut buf = [0u8; 4];
454 self.cpeek_exact(&mut buf)?;
455 Ok(u32::from_le_bytes(buf))
456 }
457 fn cpeek_u32_be(&self) -> Result<u32> {
459 let mut buf = [0u8; 4];
460 self.cpeek_exact(&mut buf)?;
461 Ok(u32::from_be_bytes(buf))
462 }
463 fn cpeek_u64(&self) -> Result<u64> {
465 let mut buf = [0u8; 8];
466 self.cpeek_exact(&mut buf)?;
467 Ok(u64::from_le_bytes(buf))
468 }
469 fn cpeek_u64_be(&self) -> Result<u64> {
471 let mut buf = [0u8; 8];
472 self.cpeek_exact(&mut buf)?;
473 Ok(u64::from_be_bytes(buf))
474 }
475 fn cpeek_u128(&self) -> Result<u128> {
477 let mut buf = [0u8; 16];
478 self.cpeek_exact(&mut buf)?;
479 Ok(u128::from_le_bytes(buf))
480 }
481 fn cpeek_u128_be(&self) -> Result<u128> {
483 let mut buf = [0u8; 16];
484 self.cpeek_exact(&mut buf)?;
485 Ok(u128::from_be_bytes(buf))
486 }
487 fn cpeek_i8(&self) -> Result<i8> {
489 let mut buf = [0u8; 1];
490 self.cpeek_exact(&mut buf)?;
491 Ok(i8::from_le_bytes(buf))
492 }
493 fn cpeek_i16(&self) -> Result<i16> {
495 let mut buf = [0u8; 2];
496 self.cpeek_exact(&mut buf)?;
497 Ok(i16::from_le_bytes(buf))
498 }
499 fn cpeek_i16_be(&self) -> Result<i16> {
501 let mut buf = [0u8; 2];
502 self.cpeek_exact(&mut buf)?;
503 Ok(i16::from_be_bytes(buf))
504 }
505 fn cpeek_i32(&self) -> Result<i32> {
507 let mut buf = [0u8; 4];
508 self.cpeek_exact(&mut buf)?;
509 Ok(i32::from_le_bytes(buf))
510 }
511 fn cpeek_i32_be(&self) -> Result<i32> {
513 let mut buf = [0u8; 4];
514 self.cpeek_exact(&mut buf)?;
515 Ok(i32::from_be_bytes(buf))
516 }
517 fn cpeek_i64(&self) -> Result<i64> {
519 let mut buf = [0u8; 8];
520 self.cpeek_exact(&mut buf)?;
521 Ok(i64::from_le_bytes(buf))
522 }
523 fn cpeek_i64_be(&self) -> Result<i64> {
525 let mut buf = [0u8; 8];
526 self.cpeek_exact(&mut buf)?;
527 Ok(i64::from_be_bytes(buf))
528 }
529 fn cpeek_i128(&self) -> Result<i128> {
531 let mut buf = [0u8; 16];
532 self.cpeek_exact(&mut buf)?;
533 Ok(i128::from_le_bytes(buf))
534 }
535 fn cpeek_i128_be(&self) -> Result<i128> {
537 let mut buf = [0u8; 16];
538 self.cpeek_exact(&mut buf)?;
539 Ok(i128::from_be_bytes(buf))
540 }
541 fn cpeek_u8_at(&self, offset: u64) -> Result<u8> {
543 let mut buf = [0u8; 1];
544 self.cpeek_exact_at(offset, &mut buf)?;
545 Ok(buf[0])
546 }
547 fn cpeek_u16_at(&self, offset: u64) -> Result<u16> {
549 let mut buf = [0u8; 2];
550 self.cpeek_exact_at(offset, &mut buf)?;
551 Ok(u16::from_le_bytes(buf))
552 }
553 fn cpeek_u16_be_at(&self, offset: u64) -> Result<u16> {
555 let mut buf = [0u8; 2];
556 self.cpeek_exact_at(offset, &mut buf)?;
557 Ok(u16::from_be_bytes(buf))
558 }
559 fn cpeek_u32_at(&self, offset: u64) -> Result<u32> {
561 let mut buf = [0u8; 4];
562 self.cpeek_exact_at(offset, &mut buf)?;
563 Ok(u32::from_le_bytes(buf))
564 }
565 fn cpeek_u32_be_at(&self, offset: u64) -> Result<u32> {
567 let mut buf = [0u8; 4];
568 self.cpeek_exact_at(offset, &mut buf)?;
569 Ok(u32::from_be_bytes(buf))
570 }
571 fn cpeek_u64_at(&self, offset: u64) -> Result<u64> {
573 let mut buf = [0u8; 8];
574 self.cpeek_exact_at(offset, &mut buf)?;
575 Ok(u64::from_le_bytes(buf))
576 }
577 fn cpeek_u64_be_at(&self, offset: u64) -> Result<u64> {
579 let mut buf = [0u8; 8];
580 self.cpeek_exact_at(offset, &mut buf)?;
581 Ok(u64::from_be_bytes(buf))
582 }
583 fn cpeek_u128_at(&self, offset: u64) -> Result<u128> {
585 let mut buf = [0u8; 16];
586 self.cpeek_exact_at(offset, &mut buf)?;
587 Ok(u128::from_le_bytes(buf))
588 }
589 fn cpeek_u128_be_at(&self, offset: u64) -> Result<u128> {
591 let mut buf = [0u8; 16];
592 self.cpeek_exact_at(offset, &mut buf)?;
593 Ok(u128::from_be_bytes(buf))
594 }
595 fn cpeek_i8_at(&self, offset: u64) -> Result<i8> {
597 let mut buf = [0u8; 1];
598 self.cpeek_exact_at(offset, &mut buf)?;
599 Ok(i8::from_le_bytes(buf))
600 }
601 fn cpeek_i16_at(&self, offset: u64) -> Result<i16> {
603 let mut buf = [0u8; 2];
604 self.cpeek_exact_at(offset, &mut buf)?;
605 Ok(i16::from_le_bytes(buf))
606 }
607 fn cpeek_i16_be_at(&self, offset: u64) -> Result<i16> {
609 let mut buf = [0u8; 2];
610 self.cpeek_exact_at(offset, &mut buf)?;
611 Ok(i16::from_be_bytes(buf))
612 }
613 fn cpeek_i32_at(&self, offset: u64) -> Result<i32> {
615 let mut buf = [0u8; 4];
616 self.cpeek_exact_at(offset, &mut buf)?;
617 Ok(i32::from_le_bytes(buf))
618 }
619 fn cpeek_i32_be_at(&self, offset: u64) -> Result<i32> {
621 let mut buf = [0u8; 4];
622 self.cpeek_exact_at(offset, &mut buf)?;
623 Ok(i32::from_be_bytes(buf))
624 }
625 fn cpeek_i64_at(&self, offset: u64) -> Result<i64> {
627 let mut buf = [0u8; 8];
628 self.cpeek_exact_at(offset, &mut buf)?;
629 Ok(i64::from_le_bytes(buf))
630 }
631 fn cpeek_i64_be_at(&self, offset: u64) -> Result<i64> {
633 let mut buf = [0u8; 8];
634 self.cpeek_exact_at(offset, &mut buf)?;
635 Ok(i64::from_be_bytes(buf))
636 }
637 fn cpeek_i128_at(&self, offset: u64) -> Result<i128> {
639 let mut buf = [0u8; 16];
640 self.cpeek_exact_at(offset, &mut buf)?;
641 Ok(i128::from_le_bytes(buf))
642 }
643 fn cpeek_i128_be_at(&self, offset: u64) -> Result<i128> {
645 let mut buf = [0u8; 16];
646 self.cpeek_exact_at(offset, &mut buf)?;
647 Ok(i128::from_be_bytes(buf))
648 }
649
650 fn cpeek_cstring(&self) -> Result<CString>;
652
653 fn cpeek_cstring_at(&self, offset: u64) -> Result<CString> {
655 let mut buf = Vec::new();
656 let mut byte = [0u8; 1];
657 self.cpeek_at(offset, &mut byte)?;
658 while byte[0] != 0 {
659 buf.push(byte[0]);
660 self.cpeek_at(offset + buf.len() as u64, &mut byte)?;
661 }
662 CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
663 }
664
665 fn cpeek_and_equal(&self, data: &[u8]) -> Result<()> {
667 let mut buf = vec![0u8; data.len()];
668 self.cpeek_exact(&mut buf)?;
669 if buf != data {
670 return Err(std::io::Error::new(
671 std::io::ErrorKind::InvalidData,
672 "Data does not match",
673 ));
674 }
675 Ok(())
676 }
677 fn cpeek_and_equal_at(&self, offset: u64, data: &[u8]) -> Result<()> {
679 let mut buf = vec![0u8; data.len()];
680 self.cpeek_exact_at(offset, &mut buf)?;
681 if buf != data {
682 return Err(std::io::Error::new(
683 std::io::ErrorKind::InvalidData,
684 "Data does not match at offset",
685 ));
686 }
687 Ok(())
688 }
689}
690
691impl<T: Peek> CPeek for Mutex<T> {
692 fn cpeek(&self, buf: &mut [u8]) -> Result<usize> {
693 let mut lock = self.lock().map_err(|_| {
694 std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
695 })?;
696 lock.peek(buf)
697 }
698
699 fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize> {
700 let mut lock = self.lock().map_err(|_| {
701 std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
702 })?;
703 lock.peek_at(offset, buf)
704 }
705
706 fn cpeek_cstring(&self) -> Result<CString> {
707 let mut lock = self.lock().map_err(|_| {
708 std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
709 })?;
710 lock.peek_cstring()
711 }
712}
713
714pub trait ReadExt {
716 fn read_u8(&mut self) -> Result<u8>;
718 fn read_u16(&mut self) -> Result<u16>;
720 fn read_u16_be(&mut self) -> Result<u16>;
722 fn read_u32(&mut self) -> Result<u32>;
724 fn read_u32_be(&mut self) -> Result<u32>;
726 fn read_u64(&mut self) -> Result<u64>;
728 fn read_u64_be(&mut self) -> Result<u64>;
730 fn read_u128(&mut self) -> Result<u128>;
732 fn read_u128_be(&mut self) -> Result<u128>;
734 fn read_i8(&mut self) -> Result<i8>;
736 fn read_i16(&mut self) -> Result<i16>;
738 fn read_i16_be(&mut self) -> Result<i16>;
740 fn read_i32(&mut self) -> Result<i32>;
742 fn read_i32_be(&mut self) -> Result<i32>;
744 fn read_i64(&mut self) -> Result<i64>;
746 fn read_i64_be(&mut self) -> Result<i64>;
748 fn read_i128(&mut self) -> Result<i128>;
750 fn read_i128_be(&mut self) -> Result<i128>;
752 fn read_f32(&mut self) -> Result<f32>;
754 fn read_f32_be(&mut self) -> Result<f32>;
756 fn read_f64(&mut self) -> Result<f64>;
758 fn read_f64_be(&mut self) -> Result<f64>;
760
761 fn read_cstring(&mut self) -> Result<CString>;
763 fn read_fstring(&mut self, len: usize, encoding: Encoding, trim: bool) -> Result<String>;
768
769 fn read_exact_vec(&mut self, len: usize) -> Result<Vec<u8>>;
771
772 fn read_and_equal(&mut self, data: &[u8]) -> Result<()>;
774}
775
776impl<T: Read> ReadExt for T {
777 fn read_u8(&mut self) -> Result<u8> {
778 let mut buf = [0u8; 1];
779 self.read_exact(&mut buf)?;
780 Ok(buf[0])
781 }
782 fn read_u16(&mut self) -> Result<u16> {
783 let mut buf = [0u8; 2];
784 self.read_exact(&mut buf)?;
785 Ok(u16::from_le_bytes(buf))
786 }
787 fn read_u16_be(&mut self) -> Result<u16> {
788 let mut buf = [0u8; 2];
789 self.read_exact(&mut buf)?;
790 Ok(u16::from_be_bytes(buf))
791 }
792 fn read_u32(&mut self) -> Result<u32> {
793 let mut buf = [0u8; 4];
794 self.read_exact(&mut buf)?;
795 Ok(u32::from_le_bytes(buf))
796 }
797 fn read_u32_be(&mut self) -> Result<u32> {
798 let mut buf = [0u8; 4];
799 self.read_exact(&mut buf)?;
800 Ok(u32::from_be_bytes(buf))
801 }
802 fn read_u64(&mut self) -> Result<u64> {
803 let mut buf = [0u8; 8];
804 self.read_exact(&mut buf)?;
805 Ok(u64::from_le_bytes(buf))
806 }
807 fn read_u64_be(&mut self) -> Result<u64> {
808 let mut buf = [0u8; 8];
809 self.read_exact(&mut buf)?;
810 Ok(u64::from_be_bytes(buf))
811 }
812 fn read_u128(&mut self) -> Result<u128> {
813 let mut buf = [0u8; 16];
814 self.read_exact(&mut buf)?;
815 Ok(u128::from_le_bytes(buf))
816 }
817 fn read_u128_be(&mut self) -> Result<u128> {
818 let mut buf = [0u8; 16];
819 self.read_exact(&mut buf)?;
820 Ok(u128::from_be_bytes(buf))
821 }
822 fn read_i8(&mut self) -> Result<i8> {
823 let mut buf = [0u8; 1];
824 self.read_exact(&mut buf)?;
825 Ok(i8::from_le_bytes(buf))
826 }
827 fn read_i16(&mut self) -> Result<i16> {
828 let mut buf = [0u8; 2];
829 self.read_exact(&mut buf)?;
830 Ok(i16::from_le_bytes(buf))
831 }
832 fn read_i16_be(&mut self) -> Result<i16> {
833 let mut buf = [0u8; 2];
834 self.read_exact(&mut buf)?;
835 Ok(i16::from_be_bytes(buf))
836 }
837 fn read_i32(&mut self) -> Result<i32> {
838 let mut buf = [0u8; 4];
839 self.read_exact(&mut buf)?;
840 Ok(i32::from_le_bytes(buf))
841 }
842 fn read_i32_be(&mut self) -> Result<i32> {
843 let mut buf = [0u8; 4];
844 self.read_exact(&mut buf)?;
845 Ok(i32::from_be_bytes(buf))
846 }
847 fn read_i64(&mut self) -> Result<i64> {
848 let mut buf = [0u8; 8];
849 self.read_exact(&mut buf)?;
850 Ok(i64::from_le_bytes(buf))
851 }
852 fn read_i64_be(&mut self) -> Result<i64> {
853 let mut buf = [0u8; 8];
854 self.read_exact(&mut buf)?;
855 Ok(i64::from_be_bytes(buf))
856 }
857 fn read_i128(&mut self) -> Result<i128> {
858 let mut buf = [0u8; 16];
859 self.read_exact(&mut buf)?;
860 Ok(i128::from_le_bytes(buf))
861 }
862 fn read_i128_be(&mut self) -> Result<i128> {
863 let mut buf = [0u8; 16];
864 self.read_exact(&mut buf)?;
865 Ok(i128::from_be_bytes(buf))
866 }
867 fn read_f32(&mut self) -> Result<f32> {
868 let mut buf = [0u8; 4];
869 self.read_exact(&mut buf)?;
870 Ok(f32::from_le_bytes(buf))
871 }
872 fn read_f32_be(&mut self) -> Result<f32> {
873 let mut buf = [0u8; 4];
874 self.read_exact(&mut buf)?;
875 Ok(f32::from_be_bytes(buf))
876 }
877 fn read_f64(&mut self) -> Result<f64> {
878 let mut buf = [0u8; 8];
879 self.read_exact(&mut buf)?;
880 Ok(f64::from_le_bytes(buf))
881 }
882 fn read_f64_be(&mut self) -> Result<f64> {
883 let mut buf = [0u8; 8];
884 self.read_exact(&mut buf)?;
885 Ok(f64::from_be_bytes(buf))
886 }
887
888 fn read_cstring(&mut self) -> Result<CString> {
889 let mut buf = Vec::new();
890 loop {
891 let mut byte = [0u8; 1];
892 self.read_exact(&mut byte)?;
893 if byte[0] == 0 {
894 break;
895 }
896 buf.push(byte[0]);
897 }
898 CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
899 }
900 fn read_fstring(&mut self, len: usize, encoding: Encoding, trim: bool) -> Result<String> {
901 let mut buf = vec![0u8; len];
902 self.read_exact(&mut buf)?;
903 if trim {
904 let first_zero = buf.iter().position(|&b| b == 0);
905 if let Some(pos) = first_zero {
906 buf.truncate(pos);
907 }
908 }
909 let s = decode_to_string(encoding, &buf, true)
910 .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?;
911 Ok(s)
912 }
913
914 fn read_exact_vec(&mut self, len: usize) -> Result<Vec<u8>> {
915 let mut buf = vec![0u8; len];
916 self.read_exact(&mut buf)?;
917 Ok(buf)
918 }
919
920 fn read_and_equal(&mut self, data: &[u8]) -> Result<()> {
921 let mut buf = vec![0u8; data.len()];
922 self.read_exact(&mut buf)?;
923 if buf != data {
924 return Err(std::io::Error::new(
925 std::io::ErrorKind::InvalidData,
926 "Data does not match",
927 ));
928 }
929 Ok(())
930 }
931}
932
933pub trait WriteExt {
935 fn write_u8(&mut self, value: u8) -> Result<()>;
937 fn write_u16(&mut self, value: u16) -> Result<()>;
939 fn write_u16_be(&mut self, value: u16) -> Result<()>;
941 fn write_u32(&mut self, value: u32) -> Result<()>;
943 fn write_u32_be(&mut self, value: u32) -> Result<()>;
945 fn write_u64(&mut self, value: u64) -> Result<()>;
947 fn write_u64_be(&mut self, value: u64) -> Result<()>;
949 fn write_u128(&mut self, value: u128) -> Result<()>;
951 fn write_u128_be(&mut self, value: u128) -> Result<()>;
953 fn write_i8(&mut self, value: i8) -> Result<()>;
955 fn write_i16(&mut self, value: i16) -> Result<()>;
957 fn write_i16_be(&mut self, value: i16) -> Result<()>;
959 fn write_i32(&mut self, value: i32) -> Result<()>;
961 fn write_i32_be(&mut self, value: i32) -> Result<()>;
963 fn write_i64(&mut self, value: i64) -> Result<()>;
965 fn write_i64_be(&mut self, value: i64) -> Result<()>;
967 fn write_i128(&mut self, value: i128) -> Result<()>;
969 fn write_i128_be(&mut self, value: i128) -> Result<()>;
971
972 fn write_cstring(&mut self, value: &CString) -> Result<()>;
974}
975
976impl<T: Write> WriteExt for T {
977 fn write_u8(&mut self, value: u8) -> Result<()> {
978 self.write_all(&value.to_le_bytes())
979 }
980 fn write_u16(&mut self, value: u16) -> Result<()> {
981 self.write_all(&value.to_le_bytes())
982 }
983 fn write_u16_be(&mut self, value: u16) -> Result<()> {
984 self.write_all(&value.to_be_bytes())
985 }
986 fn write_u32(&mut self, value: u32) -> Result<()> {
987 self.write_all(&value.to_le_bytes())
988 }
989 fn write_u32_be(&mut self, value: u32) -> Result<()> {
990 self.write_all(&value.to_be_bytes())
991 }
992 fn write_u64(&mut self, value: u64) -> Result<()> {
993 self.write_all(&value.to_le_bytes())
994 }
995 fn write_u64_be(&mut self, value: u64) -> Result<()> {
996 self.write_all(&value.to_be_bytes())
997 }
998 fn write_u128(&mut self, value: u128) -> Result<()> {
999 self.write_all(&value.to_le_bytes())
1000 }
1001 fn write_u128_be(&mut self, value: u128) -> Result<()> {
1002 self.write_all(&value.to_be_bytes())
1003 }
1004 fn write_i8(&mut self, value: i8) -> Result<()> {
1005 self.write_all(&value.to_le_bytes())
1006 }
1007 fn write_i16(&mut self, value: i16) -> Result<()> {
1008 self.write_all(&value.to_le_bytes())
1009 }
1010 fn write_i16_be(&mut self, value: i16) -> Result<()> {
1011 self.write_all(&value.to_be_bytes())
1012 }
1013 fn write_i32(&mut self, value: i32) -> Result<()> {
1014 self.write_all(&value.to_le_bytes())
1015 }
1016 fn write_i32_be(&mut self, value: i32) -> Result<()> {
1017 self.write_all(&value.to_be_bytes())
1018 }
1019 fn write_i64(&mut self, value: i64) -> Result<()> {
1020 self.write_all(&value.to_le_bytes())
1021 }
1022 fn write_i64_be(&mut self, value: i64) -> Result<()> {
1023 self.write_all(&value.to_be_bytes())
1024 }
1025 fn write_i128(&mut self, value: i128) -> Result<()> {
1026 self.write_all(&value.to_le_bytes())
1027 }
1028 fn write_i128_be(&mut self, value: i128) -> Result<()> {
1029 self.write_all(&value.to_be_bytes())
1030 }
1031
1032 fn write_cstring(&mut self, value: &CString) -> Result<()> {
1033 self.write_all(value.as_bytes_with_nul())
1034 }
1035}
1036
1037pub trait WriteAt {
1039 fn write_at(&mut self, offset: u64, buf: &[u8]) -> Result<usize>;
1042 fn write_all_at(&mut self, offset: u64, buf: &[u8]) -> Result<()>;
1045
1046 fn write_u8_at(&mut self, offset: u64, value: u8) -> Result<()> {
1048 self.write_all_at(offset, &value.to_le_bytes())
1049 }
1050 fn write_u16_at(&mut self, offset: u64, value: u16) -> Result<()> {
1052 self.write_all_at(offset, &value.to_le_bytes())
1053 }
1054 fn write_u16_be_at(&mut self, offset: u64, value: u16) -> Result<()> {
1056 self.write_all_at(offset, &value.to_be_bytes())
1057 }
1058 fn write_u32_at(&mut self, offset: u64, value: u32) -> Result<()> {
1060 self.write_all_at(offset, &value.to_le_bytes())
1061 }
1062 fn write_u32_be_at(&mut self, offset: u64, value: u32) -> Result<()> {
1064 self.write_all_at(offset, &value.to_be_bytes())
1065 }
1066 fn write_u64_at(&mut self, offset: u64, value: u64) -> Result<()> {
1068 self.write_all_at(offset, &value.to_le_bytes())
1069 }
1070 fn write_u64_be_at(&mut self, offset: u64, value: u64) -> Result<()> {
1072 self.write_all_at(offset, &value.to_be_bytes())
1073 }
1074 fn write_u128_at(&mut self, offset: u64, value: u128) -> Result<()> {
1076 self.write_all_at(offset, &value.to_le_bytes())
1077 }
1078 fn write_u128_be_at(&mut self, offset: u64, value: u128) -> Result<()> {
1080 self.write_all_at(offset, &value.to_be_bytes())
1081 }
1082 fn write_i8_at(&mut self, offset: u64, value: i8) -> Result<()> {
1084 self.write_all_at(offset, &value.to_le_bytes())
1085 }
1086 fn write_i16_at(&mut self, offset: u64, value: i16) -> Result<()> {
1088 self.write_all_at(offset, &value.to_le_bytes())
1089 }
1090 fn write_i16_be_at(&mut self, offset: u64, value: i16) -> Result<()> {
1092 self.write_all_at(offset, &value.to_be_bytes())
1093 }
1094 fn write_i32_at(&mut self, offset: u64, value: i32) -> Result<()> {
1096 self.write_all_at(offset, &value.to_le_bytes())
1097 }
1098 fn write_i32_be_at(&mut self, offset: u64, value: i32) -> Result<()> {
1100 self.write_all_at(offset, &value.to_be_bytes())
1101 }
1102 fn write_i64_at(&mut self, offset: u64, value: i64) -> Result<()> {
1104 self.write_all_at(offset, &value.to_le_bytes())
1105 }
1106 fn write_i64_be_at(&mut self, offset: u64, value: i64) -> Result<()> {
1108 self.write_all_at(offset, &value.to_be_bytes())
1109 }
1110 fn write_i128_at(&mut self, offset: u64, value: i128) -> Result<()> {
1112 self.write_all_at(offset, &value.to_le_bytes())
1113 }
1114 fn write_i128_be_at(&mut self, offset: u64, value: i128) -> Result<()> {
1116 self.write_all_at(offset, &value.to_be_bytes())
1117 }
1118
1119 fn write_cstring_at(&mut self, offset: u64, value: &CString) -> Result<()> {
1121 self.write_all_at(offset, value.as_bytes_with_nul())
1122 }
1123}
1124
1125impl<T: Write + Seek> WriteAt for T {
1126 fn write_at(&mut self, offset: u64, buf: &[u8]) -> Result<usize> {
1127 let current_pos = self.stream_position()?;
1128 self.seek(SeekFrom::Start(offset as u64))?;
1129 let bytes_written = self.write(buf)?;
1130 self.seek(SeekFrom::Start(current_pos))?;
1131 Ok(bytes_written)
1132 }
1133
1134 fn write_all_at(&mut self, offset: u64, buf: &[u8]) -> Result<()> {
1135 let current_pos = self.stream_position()?;
1136 self.seek(SeekFrom::Start(offset as u64))?;
1137 self.write_all(buf)?;
1138 self.seek(SeekFrom::Start(current_pos))?;
1139 Ok(())
1140 }
1141}
1142
1143pub trait SeekExt {
1145 fn stream_length(&mut self) -> Result<u64>;
1147}
1148
1149impl<T: Seek> SeekExt for T {
1150 fn stream_length(&mut self) -> Result<u64> {
1151 let current_pos = self.stream_position()?;
1152 let length = self.seek(SeekFrom::End(0))?;
1153 self.seek(SeekFrom::Start(current_pos))?;
1154 Ok(length)
1155 }
1156}
1157
1158pub struct MemReader {
1160 pub data: Vec<u8>,
1162 pub pos: usize,
1164}
1165
1166#[derive(Clone)]
1168pub struct MemReaderRef<'a> {
1169 pub data: &'a [u8],
1171 pub pos: usize,
1173}
1174
1175impl std::fmt::Debug for MemReader {
1176 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1177 f.debug_struct("MemReader")
1178 .field("pos", &self.pos)
1179 .field("data_length", &self.data.len())
1180 .finish_non_exhaustive()
1181 }
1182}
1183
1184impl<'a> std::fmt::Debug for MemReaderRef<'a> {
1185 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1186 f.debug_struct("MemReaderRef")
1187 .field("pos", &self.pos)
1188 .field("data_length", &self.data.len())
1189 .finish_non_exhaustive()
1190 }
1191}
1192
1193impl MemReader {
1194 pub fn new(data: Vec<u8>) -> Self {
1196 MemReader { data, pos: 0 }
1197 }
1198
1199 pub fn to_ref<'a>(&'a self) -> MemReaderRef<'a> {
1201 MemReaderRef {
1202 data: &self.data,
1203 pos: self.pos,
1204 }
1205 }
1206
1207 pub fn is_eof(&self) -> bool {
1209 self.pos >= self.data.len()
1210 }
1211
1212 pub fn inner(self) -> Vec<u8> {
1214 self.data
1215 }
1216}
1217
1218impl<'a> MemReaderRef<'a> {
1219 pub fn new(data: &'a [u8]) -> Self {
1221 MemReaderRef { data, pos: 0 }
1222 }
1223
1224 pub fn is_eof(&self) -> bool {
1226 self.pos >= self.data.len()
1227 }
1228}
1229
1230impl Read for MemReader {
1231 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
1232 if self.pos >= self.data.len() {
1233 return Ok(0);
1234 }
1235 let bytes_to_read = buf.len().min(self.data.len() - self.pos);
1236 let mut bu = &self.data[self.pos..self.pos + bytes_to_read];
1237 bu.read(buf)?;
1238 self.pos += bytes_to_read;
1239 Ok(bytes_to_read)
1240 }
1241}
1242
1243impl Seek for MemReader {
1244 fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
1245 match pos {
1246 SeekFrom::Start(offset) => {
1247 if offset > self.data.len() as u64 {
1248 return Err(std::io::Error::new(
1249 std::io::ErrorKind::InvalidInput,
1250 "Seek position is beyond the end of the data",
1251 ));
1252 }
1253 self.pos = offset as usize;
1254 }
1255 SeekFrom::End(offset) => {
1256 let end_pos = self.data.len() as i64 + offset;
1257 if end_pos < 0 {
1258 return Err(std::io::Error::new(
1259 std::io::ErrorKind::InvalidInput,
1260 "Seek from end resulted in negative position",
1261 ));
1262 }
1263 self.pos = end_pos as usize;
1264 }
1265 SeekFrom::Current(offset) => {
1266 let new_pos = (self.pos as i64 + offset) as usize;
1267 if new_pos > self.data.len() {
1268 return Err(std::io::Error::new(
1269 std::io::ErrorKind::InvalidInput,
1270 "Seek position is beyond the end of the data",
1271 ));
1272 }
1273 self.pos = new_pos;
1274 }
1275 }
1276 Ok(self.pos as u64)
1277 }
1278
1279 fn stream_position(&mut self) -> Result<u64> {
1280 Ok(self.pos as u64)
1281 }
1282
1283 fn rewind(&mut self) -> Result<()> {
1284 self.pos = 0;
1285 Ok(())
1286 }
1287}
1288
1289impl CPeek for MemReader {
1290 fn cpeek(&self, buf: &mut [u8]) -> Result<usize> {
1291 self.to_ref().cpeek(buf)
1292 }
1293
1294 fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize> {
1295 self.to_ref().cpeek_at(offset, buf)
1296 }
1297
1298 fn cpeek_cstring(&self) -> Result<CString> {
1299 self.to_ref().cpeek_cstring()
1300 }
1301}
1302
1303impl<'a> Read for MemReaderRef<'a> {
1304 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
1305 if self.pos >= self.data.len() {
1306 return Ok(0);
1307 }
1308 let bytes_to_read = buf.len().min(self.data.len() - self.pos);
1309 let mut bu = &self.data[self.pos..self.pos + bytes_to_read];
1310 bu.read(buf)?;
1311 self.pos += bytes_to_read;
1312 Ok(bytes_to_read)
1313 }
1314}
1315
1316impl<'a> Seek for MemReaderRef<'a> {
1317 fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
1318 match pos {
1319 SeekFrom::Start(offset) => {
1320 if offset > self.data.len() as u64 {
1321 return Err(std::io::Error::new(
1322 std::io::ErrorKind::InvalidInput,
1323 "Seek position is beyond the end of the data",
1324 ));
1325 }
1326 self.pos = offset as usize;
1327 }
1328 SeekFrom::End(offset) => {
1329 let end_pos = self.data.len() as i64 + offset;
1330 if end_pos < 0 {
1331 return Err(std::io::Error::new(
1332 std::io::ErrorKind::InvalidInput,
1333 "Seek from end resulted in negative position",
1334 ));
1335 }
1336 self.pos = end_pos as usize;
1337 }
1338 SeekFrom::Current(offset) => {
1339 let new_pos = (self.pos as i64 + offset) as usize;
1340 if new_pos > self.data.len() {
1341 return Err(std::io::Error::new(
1342 std::io::ErrorKind::InvalidInput,
1343 "Seek position is beyond the end of the data",
1344 ));
1345 }
1346 self.pos = new_pos;
1347 }
1348 }
1349 Ok(self.pos as u64)
1350 }
1351
1352 fn stream_position(&mut self) -> Result<u64> {
1353 Ok(self.pos as u64)
1354 }
1355
1356 fn rewind(&mut self) -> Result<()> {
1357 self.pos = 0;
1358 Ok(())
1359 }
1360}
1361
1362impl<'a> CPeek for MemReaderRef<'a> {
1363 fn cpeek(&self, buf: &mut [u8]) -> Result<usize> {
1364 let len = self.data.len();
1365 let bytes_to_read = std::cmp::min(buf.len(), len - self.pos);
1366 buf[..bytes_to_read].copy_from_slice(&self.data[self.pos..self.pos + bytes_to_read]);
1367 Ok(bytes_to_read)
1368 }
1369
1370 fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize> {
1371 let len = self.data.len();
1372 let offset = offset as usize;
1373 if offset >= len {
1374 return Ok(0);
1375 }
1376 let bytes_to_read = std::cmp::min(buf.len(), len - offset);
1377 buf[..bytes_to_read].copy_from_slice(&self.data[offset..offset + bytes_to_read]);
1378 Ok(bytes_to_read)
1379 }
1380
1381 fn cpeek_cstring(&self) -> Result<CString> {
1382 let mut buf = Vec::new();
1383 for &byte in &self.data[self.pos..] {
1384 if byte == 0 {
1385 break;
1386 }
1387 buf.push(byte);
1388 }
1389 CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
1390 }
1391}
1392
1393pub struct MemWriter {
1395 pub data: Vec<u8>,
1397 pub pos: usize,
1399}
1400
1401impl MemWriter {
1402 pub fn new() -> Self {
1404 MemWriter {
1405 data: Vec::new(),
1406 pos: 0,
1407 }
1408 }
1409
1410 pub fn from_vec(data: Vec<u8>) -> Self {
1412 MemWriter { data, pos: 0 }
1413 }
1414
1415 pub fn into_inner(self) -> Vec<u8> {
1417 self.data
1418 }
1419
1420 pub fn as_slice(&self) -> &[u8] {
1422 &self.data
1423 }
1424
1425 pub fn to_ref<'a>(&'a self) -> MemReaderRef<'a> {
1427 MemReaderRef {
1428 data: &self.data,
1429 pos: self.pos,
1430 }
1431 }
1432}
1433
1434impl std::fmt::Debug for MemWriter {
1435 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1436 f.debug_struct("MemWriter")
1437 .field("pos", &self.pos)
1438 .field("data_length", &self.data.len())
1439 .finish_non_exhaustive()
1440 }
1441}
1442
1443impl Write for MemWriter {
1444 fn write(&mut self, buf: &[u8]) -> Result<usize> {
1445 if self.pos + buf.len() > self.data.len() {
1446 self.data.resize(self.pos + buf.len(), 0);
1447 }
1448 let bytes_written = buf.len();
1449 self.data[self.pos..self.pos + bytes_written].copy_from_slice(buf);
1450 self.pos += bytes_written;
1451 Ok(bytes_written)
1452 }
1453
1454 fn flush(&mut self) -> Result<()> {
1455 Ok(())
1456 }
1457}
1458
1459impl Seek for MemWriter {
1460 fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
1461 match pos {
1462 SeekFrom::Start(offset) => {
1463 self.pos = offset as usize;
1464 }
1465 SeekFrom::End(offset) => {
1466 let end_pos = self.data.len() as i64 + offset;
1467 if end_pos < 0 {
1468 return Err(std::io::Error::new(
1469 std::io::ErrorKind::InvalidInput,
1470 "Seek from end resulted in negative position",
1471 ));
1472 }
1473 self.pos = end_pos as usize;
1474 }
1475 SeekFrom::Current(offset) => {
1476 let new_pos = self.pos as i64 + offset;
1477 if new_pos < 0 {
1478 return Err(std::io::Error::new(
1479 std::io::ErrorKind::InvalidInput,
1480 "Seek position is negative",
1481 ));
1482 }
1483 self.pos = new_pos as usize;
1484 }
1485 }
1486 Ok(self.pos as u64)
1487 }
1488
1489 fn stream_position(&mut self) -> Result<u64> {
1490 Ok(self.pos as u64)
1491 }
1492
1493 fn rewind(&mut self) -> Result<()> {
1494 self.pos = 0;
1495 Ok(())
1496 }
1497}
1498
1499impl CPeek for MemWriter {
1500 fn cpeek(&self, buf: &mut [u8]) -> Result<usize> {
1501 self.to_ref().cpeek(buf)
1502 }
1503
1504 fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize> {
1505 self.to_ref().cpeek_at(offset, buf)
1506 }
1507
1508 fn cpeek_cstring(&self) -> Result<CString> {
1509 self.to_ref().cpeek_cstring()
1510 }
1511}
1512
1513pub struct StreamRegion<T: Seek> {
1515 stream: T,
1516 start_pos: u64,
1517 end_pos: u64,
1518 cur_pos: u64,
1519}
1520
1521impl<T: Seek> StreamRegion<T> {
1522 pub fn new(stream: T, start_pos: u64, end_pos: u64) -> Result<Self> {
1524 if start_pos > end_pos {
1525 return Err(std::io::Error::new(
1526 std::io::ErrorKind::InvalidInput,
1527 "Start position cannot be greater than end position",
1528 ));
1529 }
1530 Ok(Self {
1531 stream,
1532 start_pos,
1533 end_pos,
1534 cur_pos: 0,
1535 })
1536 }
1537
1538 pub fn with_size(mut stream: T, size: u64) -> Result<Self> {
1542 let start_pos = stream.stream_position()?;
1543 let end_pos = start_pos + size;
1544 Self::new(stream, start_pos, end_pos)
1545 }
1546
1547 pub fn with_start_pos(mut stream: T, start_pos: u64) -> Result<Self> {
1550 let end_pos = stream.stream_length()?;
1551 Self::new(stream, start_pos, end_pos)
1552 }
1553}
1554
1555impl<T: Read + Seek> Read for StreamRegion<T> {
1556 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
1557 if self.cur_pos + self.start_pos >= self.end_pos {
1558 return Ok(0); }
1560 self.stream
1561 .seek(SeekFrom::Start(self.start_pos + self.cur_pos))?;
1562 let bytes_to_read = (self.end_pos - self.start_pos - self.cur_pos) as usize;
1563 let m = buf.len().min(bytes_to_read);
1564 let readed = self.stream.read(&mut buf[..m])?;
1565 self.cur_pos += readed as u64;
1566 Ok(readed)
1567 }
1568}
1569
1570impl<T: Seek> Seek for StreamRegion<T> {
1571 fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
1572 let new_pos = match pos {
1573 SeekFrom::Start(offset) => self.start_pos + offset,
1574 SeekFrom::End(offset) => (self.end_pos as i64 + offset as i64) as u64,
1575 SeekFrom::Current(offset) => {
1576 (self.start_pos as i64 + self.cur_pos as i64 + offset as i64) as u64
1577 }
1578 };
1579 if new_pos < self.start_pos || new_pos > self.end_pos {
1580 return Err(std::io::Error::new(
1581 std::io::ErrorKind::InvalidInput,
1582 "Seek position out of bounds",
1583 ));
1584 }
1585 self.cur_pos = new_pos - self.start_pos;
1586 self.stream.seek(SeekFrom::Start(new_pos))
1587 }
1588
1589 fn stream_position(&mut self) -> Result<u64> {
1590 Ok(self.cur_pos)
1591 }
1592
1593 fn rewind(&mut self) -> Result<()> {
1594 self.cur_pos = 0;
1595 self.stream.seek(SeekFrom::Start(self.start_pos))?;
1596 Ok(())
1597 }
1598}
1599
1600struct RangeMap {
1601 original: (u64, u64),
1602 new: (u64, u64),
1603}
1604
1605pub struct BinaryPatcher<
1607 R: Read + Seek,
1608 W: Write + Seek,
1609 A: Fn(u64) -> Result<u64>,
1610 O: Fn(u64) -> Result<u64>,
1611> {
1612 pub input: R,
1613 pub output: W,
1614 input_len: u64,
1615 address_to_offset: A,
1616 offset_to_address: O,
1617 range_maps: Vec<RangeMap>,
1618}
1619
1620impl<R: Read + Seek, W: Write + Seek, A: Fn(u64) -> Result<u64>, O: Fn(u64) -> Result<u64>>
1621 BinaryPatcher<R, W, A, O>
1622{
1623 pub fn new(
1625 mut input: R,
1626 output: W,
1627 address_to_offset: A,
1628 offset_to_address: O,
1629 ) -> Result<Self> {
1630 let input_len = input.stream_length()?;
1631 Ok(BinaryPatcher {
1632 input,
1633 output,
1634 input_len,
1635 address_to_offset,
1636 offset_to_address,
1637 range_maps: Vec::new(),
1638 })
1639 }
1640
1641 pub fn copy_up_to(&mut self, original_offset: u64) -> Result<()> {
1643 let cur_pos = self.input.stream_position()?;
1644 if original_offset < cur_pos || original_offset > self.input_len {
1645 return Err(std::io::Error::new(
1646 std::io::ErrorKind::InvalidInput,
1647 "Original offset is out of bounds",
1648 ));
1649 }
1650 let bytes_to_copy = original_offset - cur_pos;
1651 std::io::copy(&mut (&mut self.input).take(bytes_to_copy), &mut self.output)?;
1652 Ok(())
1653 }
1654
1655 pub fn map_offset(&mut self, original_offset: u64) -> Result<u64> {
1657 if original_offset > self.input_len {
1658 return Err(std::io::Error::new(
1659 std::io::ErrorKind::InvalidInput,
1660 "Original offset is out of bounds",
1661 ));
1662 }
1663 let cur_pos = self.input.stream_position()?;
1664 if original_offset > cur_pos {
1665 return Err(std::io::Error::new(
1666 std::io::ErrorKind::InvalidInput,
1667 "Original offset is beyond current position",
1668 ));
1669 }
1670 let mut start = 0;
1671 let mut end = self.range_maps.len();
1672 while start < end {
1673 let pivot = (start + end) / 2;
1674 let range = &self.range_maps[pivot];
1675 if original_offset < range.original.0 {
1676 end = pivot;
1677 } else if original_offset == range.original.0 {
1678 return Ok(range.new.0);
1679 } else if original_offset >= range.original.1 {
1680 start = pivot + 1;
1681 } else {
1682 return Err(std::io::Error::new(
1683 std::io::ErrorKind::InvalidInput,
1684 "Can't map an offset inside a changed section",
1685 ));
1686 }
1687 }
1688 if start == 0 {
1689 return Ok(original_offset);
1690 }
1691 let index = start - 1;
1692 let range = &self.range_maps[index];
1693 let new_offset = original_offset + range.new.1 - range.original.1;
1694 let out_len = self.output.stream_length()?;
1695 if new_offset > out_len {
1696 return Err(std::io::Error::new(
1697 std::io::ErrorKind::InvalidInput,
1698 "Mapped offset is beyond the end of the output stream",
1699 ));
1700 }
1701 Ok(new_offset)
1702 }
1703
1704 pub fn replace_bytes(&mut self, original_length: u64, new_data: &[u8]) -> Result<()> {
1709 self.replace_bytes_with_write(original_length, |writer| writer.write_all(new_data))
1710 }
1711
1712 pub fn replace_bytes_with_write<F: Fn(&mut W) -> Result<()>>(
1717 &mut self,
1718 original_length: u64,
1719 write: F,
1720 ) -> Result<()> {
1721 let cur_pos = self.input.stream_position()?;
1722 if cur_pos + original_length > self.input_len {
1723 return Err(std::io::Error::new(
1724 std::io::ErrorKind::InvalidInput,
1725 "Original length exceeds input length",
1726 ));
1727 }
1728 let new_data_offset = self.output.stream_position()?;
1729 write(&mut self.output)?;
1730 let new_data_length = self.output.stream_position()? - new_data_offset;
1731 if new_data_length != original_length {
1732 self.range_maps.push(RangeMap {
1733 original: (cur_pos, cur_pos + original_length),
1734 new: (new_data_offset, new_data_offset + new_data_length),
1735 });
1736 }
1737 self.input
1738 .seek(SeekFrom::Start(cur_pos + original_length))?;
1739 Ok(())
1740 }
1741
1742 pub fn patch_u32_address(&mut self, original_offset: u64) -> Result<()> {
1744 let input_pos = self.input.stream_position()?;
1745 if input_pos < original_offset + 4 {
1746 return Err(std::io::Error::new(
1747 std::io::ErrorKind::InvalidInput,
1748 "Original offset is out of bounds for u32 address patching",
1749 ));
1750 }
1751 let original_address = self.input.peek_u32_at(original_offset)?;
1752 let new_offset = self.map_offset(original_offset)?;
1753 let offset = (self.address_to_offset)(original_address as u64)?;
1754 let offset = self.map_offset(offset)?;
1755 let new_addr = (self.offset_to_address)(offset)?;
1756 self.output.seek(SeekFrom::Start(new_offset))?;
1757 self.output.write_u32(new_addr as u32)?;
1758 self.output.seek(SeekFrom::End(0))?;
1759 Ok(())
1760 }
1761}