1use crate::scripts::base::ReadSeek;
3use crate::types::Encoding;
4use crate::utils::encoding::{decode_to_string, encode_string};
5use crate::utils::struct_pack::{StructPack, StructUnpack};
6use std::ffi::CString;
7use std::io::*;
8use std::sync::{Arc, Mutex};
9
10pub trait Peek {
12 fn peek(&mut self, buf: &mut [u8]) -> Result<usize>;
15 fn peek_exact(&mut self, buf: &mut [u8]) -> Result<()>;
18 fn peek_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<usize>;
21 fn peek_exact_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<()>;
24 fn peek_at_vec(&mut self, offset: u64, len: usize) -> Result<Vec<u8>> {
27 let mut buf = vec![0u8; len];
28 let bytes_read = self.peek_at(offset, &mut buf)?;
29 if bytes_read < len {
30 buf.truncate(bytes_read);
31 }
32 Ok(buf)
33 }
34 fn peek_exact_at_vec(&mut self, offset: u64, len: usize) -> Result<Vec<u8>> {
37 let mut buf = vec![0u8; len];
38 self.peek_exact_at(offset, &mut buf)?;
39 Ok(buf)
40 }
41
42 fn peek_u8(&mut self) -> Result<u8> {
44 let mut buf = [0u8; 1];
45 self.peek_exact(&mut buf)?;
46 Ok(buf[0])
47 }
48 fn peek_u16(&mut self) -> Result<u16> {
50 let mut buf = [0u8; 2];
51 self.peek_exact(&mut buf)?;
52 Ok(u16::from_le_bytes(buf))
53 }
54 fn peek_u16_be(&mut self) -> Result<u16> {
56 let mut buf = [0u8; 2];
57 self.peek_exact(&mut buf)?;
58 Ok(u16::from_be_bytes(buf))
59 }
60 fn peek_u32(&mut self) -> Result<u32> {
62 let mut buf = [0u8; 4];
63 self.peek_exact(&mut buf)?;
64 Ok(u32::from_le_bytes(buf))
65 }
66 fn peek_u32_be(&mut self) -> Result<u32> {
68 let mut buf = [0u8; 4];
69 self.peek_exact(&mut buf)?;
70 Ok(u32::from_be_bytes(buf))
71 }
72 fn peek_u64(&mut self) -> Result<u64> {
74 let mut buf = [0u8; 8];
75 self.peek_exact(&mut buf)?;
76 Ok(u64::from_le_bytes(buf))
77 }
78 fn peek_u64_be(&mut self) -> Result<u64> {
80 let mut buf = [0u8; 8];
81 self.peek_exact(&mut buf)?;
82 Ok(u64::from_be_bytes(buf))
83 }
84 fn peek_u128(&mut self) -> Result<u128> {
86 let mut buf = [0u8; 16];
87 self.peek_exact(&mut buf)?;
88 Ok(u128::from_le_bytes(buf))
89 }
90 fn peek_u128_be(&mut self) -> Result<u128> {
92 let mut buf = [0u8; 16];
93 self.peek_exact(&mut buf)?;
94 Ok(u128::from_be_bytes(buf))
95 }
96 fn peek_i8(&mut self) -> Result<i8> {
98 let mut buf = [0u8; 1];
99 self.peek_exact(&mut buf)?;
100 Ok(i8::from_le_bytes(buf))
101 }
102 fn peek_i16(&mut self) -> Result<i16> {
104 let mut buf = [0u8; 2];
105 self.peek_exact(&mut buf)?;
106 Ok(i16::from_le_bytes(buf))
107 }
108 fn peek_i16_be(&mut self) -> Result<i16> {
110 let mut buf = [0u8; 2];
111 self.peek_exact(&mut buf)?;
112 Ok(i16::from_be_bytes(buf))
113 }
114 fn peek_i32(&mut self) -> Result<i32> {
116 let mut buf = [0u8; 4];
117 self.peek_exact(&mut buf)?;
118 Ok(i32::from_le_bytes(buf))
119 }
120 fn peek_i32_be(&mut self) -> Result<i32> {
122 let mut buf = [0u8; 4];
123 self.peek_exact(&mut buf)?;
124 Ok(i32::from_be_bytes(buf))
125 }
126 fn peek_i64(&mut self) -> Result<i64> {
128 let mut buf = [0u8; 8];
129 self.peek_exact(&mut buf)?;
130 Ok(i64::from_le_bytes(buf))
131 }
132 fn peek_i64_be(&mut self) -> Result<i64> {
134 let mut buf = [0u8; 8];
135 self.peek_exact(&mut buf)?;
136 Ok(i64::from_be_bytes(buf))
137 }
138 fn peek_i128(&mut self) -> Result<i128> {
140 let mut buf = [0u8; 16];
141 self.peek_exact(&mut buf)?;
142 Ok(i128::from_le_bytes(buf))
143 }
144 fn peek_i128_be(&mut self) -> Result<i128> {
146 let mut buf = [0u8; 16];
147 self.peek_exact(&mut buf)?;
148 Ok(i128::from_be_bytes(buf))
149 }
150 fn peek_u8_at(&mut self, offset: u64) -> Result<u8> {
152 let mut buf = [0u8; 1];
153 self.peek_exact_at(offset, &mut buf)?;
154 Ok(buf[0])
155 }
156 fn peek_u16_at(&mut self, offset: u64) -> Result<u16> {
158 let mut buf = [0u8; 2];
159 self.peek_exact_at(offset, &mut buf)?;
160 Ok(u16::from_le_bytes(buf))
161 }
162 fn peek_u16_be_at(&mut self, offset: u64) -> Result<u16> {
164 let mut buf = [0u8; 2];
165 self.peek_exact_at(offset, &mut buf)?;
166 Ok(u16::from_be_bytes(buf))
167 }
168 fn peek_u32_at(&mut self, offset: u64) -> Result<u32> {
170 let mut buf = [0u8; 4];
171 self.peek_exact_at(offset, &mut buf)?;
172 Ok(u32::from_le_bytes(buf))
173 }
174 fn peek_u32_be_at(&mut self, offset: u64) -> Result<u32> {
176 let mut buf = [0u8; 4];
177 self.peek_exact_at(offset, &mut buf)?;
178 Ok(u32::from_be_bytes(buf))
179 }
180 fn peek_u64_at(&mut self, offset: u64) -> Result<u64> {
182 let mut buf = [0u8; 8];
183 self.peek_exact_at(offset, &mut buf)?;
184 Ok(u64::from_le_bytes(buf))
185 }
186 fn peek_u64_be_at(&mut self, offset: u64) -> Result<u64> {
188 let mut buf = [0u8; 8];
189 self.peek_exact_at(offset, &mut buf)?;
190 Ok(u64::from_be_bytes(buf))
191 }
192 fn peek_u128_at(&mut self, offset: u64) -> Result<u128> {
194 let mut buf = [0u8; 16];
195 self.peek_exact_at(offset, &mut buf)?;
196 Ok(u128::from_le_bytes(buf))
197 }
198 fn peek_u128_be_at(&mut self, offset: u64) -> Result<u128> {
200 let mut buf = [0u8; 16];
201 self.peek_exact_at(offset, &mut buf)?;
202 Ok(u128::from_be_bytes(buf))
203 }
204 fn peek_i8_at(&mut self, offset: u64) -> Result<i8> {
206 let mut buf = [0u8; 1];
207 self.peek_exact_at(offset, &mut buf)?;
208 Ok(i8::from_le_bytes(buf))
209 }
210 fn peek_i16_at(&mut self, offset: u64) -> Result<i16> {
212 let mut buf = [0u8; 2];
213 self.peek_exact_at(offset, &mut buf)?;
214 Ok(i16::from_le_bytes(buf))
215 }
216 fn peek_i16_be_at(&mut self, offset: u64) -> Result<i16> {
218 let mut buf = [0u8; 2];
219 self.peek_exact_at(offset, &mut buf)?;
220 Ok(i16::from_be_bytes(buf))
221 }
222 fn peek_i32_at(&mut self, offset: u64) -> Result<i32> {
224 let mut buf = [0u8; 4];
225 self.peek_exact_at(offset, &mut buf)?;
226 Ok(i32::from_le_bytes(buf))
227 }
228 fn peek_i32_be_at(&mut self, offset: u64) -> Result<i32> {
230 let mut buf = [0u8; 4];
231 self.peek_exact_at(offset, &mut buf)?;
232 Ok(i32::from_be_bytes(buf))
233 }
234 fn peek_i64_at(&mut self, offset: u64) -> Result<i64> {
236 let mut buf = [0u8; 8];
237 self.peek_exact_at(offset, &mut buf)?;
238 Ok(i64::from_le_bytes(buf))
239 }
240 fn peek_i64_be_at(&mut self, offset: u64) -> Result<i64> {
242 let mut buf = [0u8; 8];
243 self.peek_exact_at(offset, &mut buf)?;
244 Ok(i64::from_be_bytes(buf))
245 }
246 fn peek_i128_at(&mut self, offset: u64) -> Result<i128> {
248 let mut buf = [0u8; 16];
249 self.peek_exact_at(offset, &mut buf)?;
250 Ok(i128::from_le_bytes(buf))
251 }
252 fn peek_i128_be_at(&mut self, offset: u64) -> Result<i128> {
254 let mut buf = [0u8; 16];
255 self.peek_exact_at(offset, &mut buf)?;
256 Ok(i128::from_be_bytes(buf))
257 }
258
259 fn peek_cstring(&mut self) -> Result<CString>;
261 fn peek_cstring_at(&mut self, offset: u64) -> Result<CString>;
263 fn peek_fstring(&mut self, len: usize, encoding: Encoding, trim: bool) -> Result<String> {
265 let mut buf = vec![0u8; len];
266 self.peek_exact(&mut buf)?;
267 if trim {
268 let first_zero = buf.iter().position(|&b| b == 0);
269 if let Some(pos) = first_zero {
270 buf.truncate(pos);
271 }
272 }
273 let s = decode_to_string(encoding, &buf, true)
274 .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?;
275 Ok(s)
276 }
277 fn peek_fstring_at(
279 &mut self,
280 offset: u64,
281 len: usize,
282 encoding: Encoding,
283 trim: bool,
284 ) -> Result<String> {
285 let mut buf = vec![0u8; len];
286 self.peek_exact_at(offset, &mut buf)?;
287 if trim {
288 let first_zero = buf.iter().position(|&b| b == 0);
289 if let Some(pos) = first_zero {
290 buf.truncate(pos);
291 }
292 }
293 let s = decode_to_string(encoding, &buf, true)
294 .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?;
295 Ok(s)
296 }
297
298 fn peek_u16string(&mut self) -> Result<Vec<u8>>;
301 fn peek_u16string_at(&mut self, offset: u64) -> Result<Vec<u8>>;
304
305 fn read_struct<T: StructUnpack>(
312 &mut self,
313 big: bool,
314 encoding: Encoding,
315 info: &Option<Box<dyn std::any::Any>>,
316 ) -> Result<T>;
317 fn read_struct_vec<T: StructUnpack>(
325 &mut self,
326 count: usize,
327 big: bool,
328 encoding: Encoding,
329 info: &Option<Box<dyn std::any::Any>>,
330 ) -> Result<Vec<T>> {
331 self.read_struct_vec2(count, big, encoding, info, 4194304)
332 }
333 fn read_struct_vec2<T: StructUnpack>(
341 &mut self,
342 count: usize,
343 big: bool,
344 encoding: Encoding,
345 info: &Option<Box<dyn std::any::Any>>,
346 max_preallocated_size: usize,
347 ) -> Result<Vec<T>> {
348 let mut vec = if size_of::<T>() * count <= max_preallocated_size {
349 Vec::with_capacity(count)
350 } else {
351 Vec::new()
352 };
353 for _ in 0..count {
354 vec.push(self.read_struct(big, encoding, info)?);
355 }
356 Ok(vec)
357 }
358
359 fn peek_and_equal(&mut self, data: &[u8]) -> Result<()> {
361 let mut buf = vec![0u8; data.len()];
362 self.peek_exact(&mut buf)?;
363 if buf != data {
364 return Err(std::io::Error::new(
365 std::io::ErrorKind::InvalidData,
366 "Data does not match",
367 ));
368 }
369 Ok(())
370 }
371 fn peek_and_equal_at(&mut self, offset: u64, data: &[u8]) -> Result<()> {
373 let mut buf = vec![0u8; data.len()];
374 self.peek_exact_at(offset, &mut buf)?;
375 if buf != data {
376 return Err(std::io::Error::new(
377 std::io::ErrorKind::InvalidData,
378 "Data does not match at offset",
379 ));
380 }
381 Ok(())
382 }
383}
384
385impl<T: Read + Seek> Peek for T {
386 fn peek(&mut self, buf: &mut [u8]) -> Result<usize> {
387 let current_pos = self.stream_position()?;
388 let bytes_read = self.read(buf)?;
389 self.seek(SeekFrom::Start(current_pos))?;
390 Ok(bytes_read)
391 }
392
393 fn peek_exact(&mut self, buf: &mut [u8]) -> Result<()> {
394 let current_pos = self.stream_position()?;
395 self.read_exact(buf)?;
396 self.seek(SeekFrom::Start(current_pos))?;
397 Ok(())
398 }
399
400 fn peek_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<usize> {
401 let current_pos = self.stream_position()?;
402 self.seek(SeekFrom::Start(offset))?;
403 let bytes_read = self.read(buf)?;
404 self.seek(SeekFrom::Start(current_pos))?;
405 Ok(bytes_read)
406 }
407
408 fn peek_exact_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<()> {
409 let current_pos = self.stream_position()?;
410 self.seek(SeekFrom::Start(offset))?;
411 self.read_exact(buf)?;
412 self.seek(SeekFrom::Start(current_pos))?;
413 Ok(())
414 }
415
416 fn peek_cstring(&mut self) -> Result<CString> {
417 let current_pos = self.stream_position()?;
418 let mut buf = Vec::new();
419 loop {
420 let mut byte = [0u8; 1];
421 self.read_exact(&mut byte)?;
422 if byte[0] == 0 {
423 break;
424 }
425 buf.push(byte[0]);
426 }
427 self.seek(SeekFrom::Start(current_pos))?;
428 CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
429 }
430
431 fn peek_cstring_at(&mut self, offset: u64) -> Result<CString> {
432 let current_pos = self.stream_position()?;
433 let mut buf = Vec::new();
434 self.seek(SeekFrom::Start(offset as u64))?;
435 loop {
436 let mut byte = [0u8; 1];
437 self.read_exact(&mut byte)?;
438 if byte[0] == 0 {
439 break;
440 }
441 buf.push(byte[0]);
442 }
443 self.seek(SeekFrom::Start(current_pos))?;
444 CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
445 }
446
447 fn peek_u16string(&mut self) -> Result<Vec<u8>> {
448 let current_pos = self.stream_position()?;
449 let mut buf = Vec::new();
450 loop {
451 let mut bytes = [0u8; 2];
452 self.read_exact(&mut bytes)?;
453 if bytes == [0, 0] {
454 break;
455 }
456 buf.extend_from_slice(&bytes);
457 }
458 self.seek(SeekFrom::Start(current_pos))?;
459 Ok(buf)
460 }
461
462 fn peek_u16string_at(&mut self, offset: u64) -> Result<Vec<u8>> {
463 let current_pos = self.stream_position()?;
464 let mut buf = Vec::new();
465 self.seek(SeekFrom::Start(offset as u64))?;
466 loop {
467 let mut bytes = [0u8; 2];
468 self.read_exact(&mut bytes)?;
469 if bytes == [0, 0] {
470 break;
471 }
472 buf.extend_from_slice(&bytes);
473 }
474 self.seek(SeekFrom::Start(current_pos))?;
475 Ok(buf)
476 }
477
478 fn read_struct<S: StructUnpack>(
479 &mut self,
480 big: bool,
481 encoding: Encoding,
482 info: &Option<Box<dyn std::any::Any>>,
483 ) -> Result<S> {
484 S::unpack(self, big, encoding, info)
485 .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
486 }
487}
488
489pub trait CPeek {
491 fn cpeek(&self, buf: &mut [u8]) -> Result<usize>;
494 fn cpeek_exact(&self, buf: &mut [u8]) -> Result<()> {
497 let bytes_read = self.cpeek(buf)?;
498 if bytes_read < buf.len() {
499 return Err(std::io::Error::new(
500 std::io::ErrorKind::UnexpectedEof,
501 "Not enough data to read",
502 ));
503 }
504 Ok(())
505 }
506 fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize>;
509 fn cpeek_exact_at(&self, offset: u64, buf: &mut [u8]) -> Result<()> {
512 let bytes_read = self.cpeek_at(offset, buf)?;
513 if bytes_read < buf.len() {
514 return Err(std::io::Error::new(
515 std::io::ErrorKind::UnexpectedEof,
516 "Not enough data to read",
517 ));
518 }
519 Ok(())
520 }
521 fn cpeek_at_vec(&self, offset: u64, len: usize) -> Result<Vec<u8>> {
524 let mut buf = vec![0u8; len];
525 let bytes_read = self.cpeek_at(offset, &mut buf)?;
526 if bytes_read < len {
527 buf.truncate(bytes_read);
528 }
529 Ok(buf)
530 }
531 fn cpeek_exact_at_vec(&self, offset: u64, len: usize) -> Result<Vec<u8>> {
534 let mut buf = vec![0u8; len];
535 self.cpeek_exact_at(offset, &mut buf)?;
536 Ok(buf)
537 }
538
539 fn cpeek_u8(&self) -> Result<u8> {
541 let mut buf = [0u8; 1];
542 self.cpeek_exact(&mut buf)?;
543 Ok(buf[0])
544 }
545 fn cpeek_u16(&self) -> Result<u16> {
547 let mut buf = [0u8; 2];
548 self.cpeek_exact(&mut buf)?;
549 Ok(u16::from_le_bytes(buf))
550 }
551 fn cpeek_u16_be(&self) -> Result<u16> {
553 let mut buf = [0u8; 2];
554 self.cpeek_exact(&mut buf)?;
555 Ok(u16::from_be_bytes(buf))
556 }
557 fn cpeek_u32(&self) -> Result<u32> {
559 let mut buf = [0u8; 4];
560 self.cpeek_exact(&mut buf)?;
561 Ok(u32::from_le_bytes(buf))
562 }
563 fn cpeek_u32_be(&self) -> Result<u32> {
565 let mut buf = [0u8; 4];
566 self.cpeek_exact(&mut buf)?;
567 Ok(u32::from_be_bytes(buf))
568 }
569 fn cpeek_u64(&self) -> Result<u64> {
571 let mut buf = [0u8; 8];
572 self.cpeek_exact(&mut buf)?;
573 Ok(u64::from_le_bytes(buf))
574 }
575 fn cpeek_u64_be(&self) -> Result<u64> {
577 let mut buf = [0u8; 8];
578 self.cpeek_exact(&mut buf)?;
579 Ok(u64::from_be_bytes(buf))
580 }
581 fn cpeek_u128(&self) -> Result<u128> {
583 let mut buf = [0u8; 16];
584 self.cpeek_exact(&mut buf)?;
585 Ok(u128::from_le_bytes(buf))
586 }
587 fn cpeek_u128_be(&self) -> Result<u128> {
589 let mut buf = [0u8; 16];
590 self.cpeek_exact(&mut buf)?;
591 Ok(u128::from_be_bytes(buf))
592 }
593 fn cpeek_i8(&self) -> Result<i8> {
595 let mut buf = [0u8; 1];
596 self.cpeek_exact(&mut buf)?;
597 Ok(i8::from_le_bytes(buf))
598 }
599 fn cpeek_i16(&self) -> Result<i16> {
601 let mut buf = [0u8; 2];
602 self.cpeek_exact(&mut buf)?;
603 Ok(i16::from_le_bytes(buf))
604 }
605 fn cpeek_i16_be(&self) -> Result<i16> {
607 let mut buf = [0u8; 2];
608 self.cpeek_exact(&mut buf)?;
609 Ok(i16::from_be_bytes(buf))
610 }
611 fn cpeek_i32(&self) -> Result<i32> {
613 let mut buf = [0u8; 4];
614 self.cpeek_exact(&mut buf)?;
615 Ok(i32::from_le_bytes(buf))
616 }
617 fn cpeek_i32_be(&self) -> Result<i32> {
619 let mut buf = [0u8; 4];
620 self.cpeek_exact(&mut buf)?;
621 Ok(i32::from_be_bytes(buf))
622 }
623 fn cpeek_i64(&self) -> Result<i64> {
625 let mut buf = [0u8; 8];
626 self.cpeek_exact(&mut buf)?;
627 Ok(i64::from_le_bytes(buf))
628 }
629 fn cpeek_i64_be(&self) -> Result<i64> {
631 let mut buf = [0u8; 8];
632 self.cpeek_exact(&mut buf)?;
633 Ok(i64::from_be_bytes(buf))
634 }
635 fn cpeek_i128(&self) -> Result<i128> {
637 let mut buf = [0u8; 16];
638 self.cpeek_exact(&mut buf)?;
639 Ok(i128::from_le_bytes(buf))
640 }
641 fn cpeek_i128_be(&self) -> Result<i128> {
643 let mut buf = [0u8; 16];
644 self.cpeek_exact(&mut buf)?;
645 Ok(i128::from_be_bytes(buf))
646 }
647 fn cpeek_u8_at(&self, offset: u64) -> Result<u8> {
649 let mut buf = [0u8; 1];
650 self.cpeek_exact_at(offset, &mut buf)?;
651 Ok(buf[0])
652 }
653 fn cpeek_u16_at(&self, offset: u64) -> Result<u16> {
655 let mut buf = [0u8; 2];
656 self.cpeek_exact_at(offset, &mut buf)?;
657 Ok(u16::from_le_bytes(buf))
658 }
659 fn cpeek_u16_be_at(&self, offset: u64) -> Result<u16> {
661 let mut buf = [0u8; 2];
662 self.cpeek_exact_at(offset, &mut buf)?;
663 Ok(u16::from_be_bytes(buf))
664 }
665 fn cpeek_u32_at(&self, offset: u64) -> Result<u32> {
667 let mut buf = [0u8; 4];
668 self.cpeek_exact_at(offset, &mut buf)?;
669 Ok(u32::from_le_bytes(buf))
670 }
671 fn cpeek_u32_be_at(&self, offset: u64) -> Result<u32> {
673 let mut buf = [0u8; 4];
674 self.cpeek_exact_at(offset, &mut buf)?;
675 Ok(u32::from_be_bytes(buf))
676 }
677 fn cpeek_u64_at(&self, offset: u64) -> Result<u64> {
679 let mut buf = [0u8; 8];
680 self.cpeek_exact_at(offset, &mut buf)?;
681 Ok(u64::from_le_bytes(buf))
682 }
683 fn cpeek_u64_be_at(&self, offset: u64) -> Result<u64> {
685 let mut buf = [0u8; 8];
686 self.cpeek_exact_at(offset, &mut buf)?;
687 Ok(u64::from_be_bytes(buf))
688 }
689 fn cpeek_u128_at(&self, offset: u64) -> Result<u128> {
691 let mut buf = [0u8; 16];
692 self.cpeek_exact_at(offset, &mut buf)?;
693 Ok(u128::from_le_bytes(buf))
694 }
695 fn cpeek_u128_be_at(&self, offset: u64) -> Result<u128> {
697 let mut buf = [0u8; 16];
698 self.cpeek_exact_at(offset, &mut buf)?;
699 Ok(u128::from_be_bytes(buf))
700 }
701 fn cpeek_i8_at(&self, offset: u64) -> Result<i8> {
703 let mut buf = [0u8; 1];
704 self.cpeek_exact_at(offset, &mut buf)?;
705 Ok(i8::from_le_bytes(buf))
706 }
707 fn cpeek_i16_at(&self, offset: u64) -> Result<i16> {
709 let mut buf = [0u8; 2];
710 self.cpeek_exact_at(offset, &mut buf)?;
711 Ok(i16::from_le_bytes(buf))
712 }
713 fn cpeek_i16_be_at(&self, offset: u64) -> Result<i16> {
715 let mut buf = [0u8; 2];
716 self.cpeek_exact_at(offset, &mut buf)?;
717 Ok(i16::from_be_bytes(buf))
718 }
719 fn cpeek_i32_at(&self, offset: u64) -> Result<i32> {
721 let mut buf = [0u8; 4];
722 self.cpeek_exact_at(offset, &mut buf)?;
723 Ok(i32::from_le_bytes(buf))
724 }
725 fn cpeek_i32_be_at(&self, offset: u64) -> Result<i32> {
727 let mut buf = [0u8; 4];
728 self.cpeek_exact_at(offset, &mut buf)?;
729 Ok(i32::from_be_bytes(buf))
730 }
731 fn cpeek_i64_at(&self, offset: u64) -> Result<i64> {
733 let mut buf = [0u8; 8];
734 self.cpeek_exact_at(offset, &mut buf)?;
735 Ok(i64::from_le_bytes(buf))
736 }
737 fn cpeek_i64_be_at(&self, offset: u64) -> Result<i64> {
739 let mut buf = [0u8; 8];
740 self.cpeek_exact_at(offset, &mut buf)?;
741 Ok(i64::from_be_bytes(buf))
742 }
743 fn cpeek_i128_at(&self, offset: u64) -> Result<i128> {
745 let mut buf = [0u8; 16];
746 self.cpeek_exact_at(offset, &mut buf)?;
747 Ok(i128::from_le_bytes(buf))
748 }
749 fn cpeek_i128_be_at(&self, offset: u64) -> Result<i128> {
751 let mut buf = [0u8; 16];
752 self.cpeek_exact_at(offset, &mut buf)?;
753 Ok(i128::from_be_bytes(buf))
754 }
755
756 fn cpeek_cstring(&self) -> Result<CString>;
758
759 fn cpeek_cstring_at(&self, offset: u64) -> Result<CString> {
761 let mut buf = Vec::new();
762 let mut byte = [0u8; 1];
763 self.cpeek_at(offset, &mut byte)?;
764 while byte[0] != 0 {
765 buf.push(byte[0]);
766 self.cpeek_at(offset + buf.len() as u64, &mut byte)?;
767 }
768 CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
769 }
770
771 fn cpeek_fstring(&self, len: usize, encoding: Encoding, trim: bool) -> Result<String> {
773 let mut buf = vec![0u8; len];
774 self.cpeek_exact(&mut buf)?;
775 if trim {
776 let first_zero = buf.iter().position(|&b| b == 0);
777 if let Some(pos) = first_zero {
778 buf.truncate(pos);
779 }
780 }
781 let s = decode_to_string(encoding, &buf, true)
782 .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?;
783 Ok(s)
784 }
785 fn cpeek_fstring_at(
787 &self,
788 offset: u64,
789 len: usize,
790 encoding: Encoding,
791 trim: bool,
792 ) -> Result<String> {
793 let mut buf = vec![0u8; len];
794 self.cpeek_exact_at(offset, &mut buf)?;
795 if trim {
796 let first_zero = buf.iter().position(|&b| b == 0);
797 if let Some(pos) = first_zero {
798 buf.truncate(pos);
799 }
800 }
801 let s = decode_to_string(encoding, &buf, true)
802 .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?;
803 Ok(s)
804 }
805
806 fn cpeek_u16string(&self) -> Result<Vec<u8>>;
809 fn cpeek_u16string_at(&self, offset: u64) -> Result<Vec<u8>> {
812 let mut buf = Vec::new();
813 let mut bytes = [0u8; 2];
814 let mut current_offset = offset;
815 loop {
816 self.cpeek_exact_at(current_offset, &mut bytes)?;
817 if bytes == [0, 0] {
818 break;
819 }
820 buf.extend_from_slice(&bytes);
821 current_offset += 2;
822 }
823 Ok(buf)
824 }
825
826 fn cpeek_and_equal(&self, data: &[u8]) -> Result<()> {
828 let mut buf = vec![0u8; data.len()];
829 self.cpeek_exact(&mut buf)?;
830 if buf != data {
831 return Err(std::io::Error::new(
832 std::io::ErrorKind::InvalidData,
833 "Data does not match",
834 ));
835 }
836 Ok(())
837 }
838 fn cpeek_and_equal_at(&self, offset: u64, data: &[u8]) -> Result<()> {
840 let mut buf = vec![0u8; data.len()];
841 self.cpeek_exact_at(offset, &mut buf)?;
842 if buf != data {
843 return Err(std::io::Error::new(
844 std::io::ErrorKind::InvalidData,
845 "Data does not match at offset",
846 ));
847 }
848 Ok(())
849 }
850}
851
852impl<T: Peek> CPeek for Mutex<T> {
853 fn cpeek(&self, buf: &mut [u8]) -> Result<usize> {
854 let mut lock = self.lock().map_err(|_| {
855 std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
856 })?;
857 lock.peek(buf)
858 }
859
860 fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize> {
861 let mut lock = self.lock().map_err(|_| {
862 std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
863 })?;
864 lock.peek_at(offset, buf)
865 }
866
867 fn cpeek_cstring(&self) -> Result<CString> {
868 let mut lock = self.lock().map_err(|_| {
869 std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
870 })?;
871 lock.peek_cstring()
872 }
873
874 fn cpeek_u16string(&self) -> Result<Vec<u8>> {
875 let mut lock = self.lock().map_err(|_| {
876 std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
877 })?;
878 lock.peek_u16string()
879 }
880}
881
882pub trait ReadExt {
884 fn read_u8(&mut self) -> Result<u8>;
886 fn read_u16(&mut self) -> Result<u16>;
888 fn read_u16_be(&mut self) -> Result<u16>;
890 fn read_u32(&mut self) -> Result<u32>;
892 fn read_u32_be(&mut self) -> Result<u32>;
894 fn read_u64(&mut self) -> Result<u64>;
896 fn read_u64_be(&mut self) -> Result<u64>;
898 fn read_u128(&mut self) -> Result<u128>;
900 fn read_u128_be(&mut self) -> Result<u128>;
902 fn read_i8(&mut self) -> Result<i8>;
904 fn read_i16(&mut self) -> Result<i16>;
906 fn read_i16_be(&mut self) -> Result<i16>;
908 fn read_i32(&mut self) -> Result<i32>;
910 fn read_i32_be(&mut self) -> Result<i32>;
912 fn read_i64(&mut self) -> Result<i64>;
914 fn read_i64_be(&mut self) -> Result<i64>;
916 fn read_i128(&mut self) -> Result<i128>;
918 fn read_i128_be(&mut self) -> Result<i128>;
920 fn read_f32(&mut self) -> Result<f32>;
922 fn read_f32_be(&mut self) -> Result<f32>;
924 fn read_f64(&mut self) -> Result<f64>;
926 fn read_f64_be(&mut self) -> Result<f64>;
928
929 fn read_cstring(&mut self) -> Result<CString>;
931 fn read_fstring(&mut self, len: usize, encoding: Encoding, trim: bool) -> Result<String>;
936
937 fn read_u16string(&mut self) -> Result<Vec<u8>>;
940
941 fn read_exact_vec(&mut self, len: usize) -> Result<Vec<u8>>;
943
944 fn read_and_equal(&mut self, data: &[u8]) -> Result<()>;
946
947 fn read_most(&mut self, buf: &mut [u8]) -> Result<usize>;
950}
951
952impl<T: Read> ReadExt for T {
953 fn read_u8(&mut self) -> Result<u8> {
954 let mut buf = [0u8; 1];
955 self.read_exact(&mut buf)?;
956 Ok(buf[0])
957 }
958 fn read_u16(&mut self) -> Result<u16> {
959 let mut buf = [0u8; 2];
960 self.read_exact(&mut buf)?;
961 Ok(u16::from_le_bytes(buf))
962 }
963 fn read_u16_be(&mut self) -> Result<u16> {
964 let mut buf = [0u8; 2];
965 self.read_exact(&mut buf)?;
966 Ok(u16::from_be_bytes(buf))
967 }
968 fn read_u32(&mut self) -> Result<u32> {
969 let mut buf = [0u8; 4];
970 self.read_exact(&mut buf)?;
971 Ok(u32::from_le_bytes(buf))
972 }
973 fn read_u32_be(&mut self) -> Result<u32> {
974 let mut buf = [0u8; 4];
975 self.read_exact(&mut buf)?;
976 Ok(u32::from_be_bytes(buf))
977 }
978 fn read_u64(&mut self) -> Result<u64> {
979 let mut buf = [0u8; 8];
980 self.read_exact(&mut buf)?;
981 Ok(u64::from_le_bytes(buf))
982 }
983 fn read_u64_be(&mut self) -> Result<u64> {
984 let mut buf = [0u8; 8];
985 self.read_exact(&mut buf)?;
986 Ok(u64::from_be_bytes(buf))
987 }
988 fn read_u128(&mut self) -> Result<u128> {
989 let mut buf = [0u8; 16];
990 self.read_exact(&mut buf)?;
991 Ok(u128::from_le_bytes(buf))
992 }
993 fn read_u128_be(&mut self) -> Result<u128> {
994 let mut buf = [0u8; 16];
995 self.read_exact(&mut buf)?;
996 Ok(u128::from_be_bytes(buf))
997 }
998 fn read_i8(&mut self) -> Result<i8> {
999 let mut buf = [0u8; 1];
1000 self.read_exact(&mut buf)?;
1001 Ok(i8::from_le_bytes(buf))
1002 }
1003 fn read_i16(&mut self) -> Result<i16> {
1004 let mut buf = [0u8; 2];
1005 self.read_exact(&mut buf)?;
1006 Ok(i16::from_le_bytes(buf))
1007 }
1008 fn read_i16_be(&mut self) -> Result<i16> {
1009 let mut buf = [0u8; 2];
1010 self.read_exact(&mut buf)?;
1011 Ok(i16::from_be_bytes(buf))
1012 }
1013 fn read_i32(&mut self) -> Result<i32> {
1014 let mut buf = [0u8; 4];
1015 self.read_exact(&mut buf)?;
1016 Ok(i32::from_le_bytes(buf))
1017 }
1018 fn read_i32_be(&mut self) -> Result<i32> {
1019 let mut buf = [0u8; 4];
1020 self.read_exact(&mut buf)?;
1021 Ok(i32::from_be_bytes(buf))
1022 }
1023 fn read_i64(&mut self) -> Result<i64> {
1024 let mut buf = [0u8; 8];
1025 self.read_exact(&mut buf)?;
1026 Ok(i64::from_le_bytes(buf))
1027 }
1028 fn read_i64_be(&mut self) -> Result<i64> {
1029 let mut buf = [0u8; 8];
1030 self.read_exact(&mut buf)?;
1031 Ok(i64::from_be_bytes(buf))
1032 }
1033 fn read_i128(&mut self) -> Result<i128> {
1034 let mut buf = [0u8; 16];
1035 self.read_exact(&mut buf)?;
1036 Ok(i128::from_le_bytes(buf))
1037 }
1038 fn read_i128_be(&mut self) -> Result<i128> {
1039 let mut buf = [0u8; 16];
1040 self.read_exact(&mut buf)?;
1041 Ok(i128::from_be_bytes(buf))
1042 }
1043 fn read_f32(&mut self) -> Result<f32> {
1044 let mut buf = [0u8; 4];
1045 self.read_exact(&mut buf)?;
1046 Ok(f32::from_le_bytes(buf))
1047 }
1048 fn read_f32_be(&mut self) -> Result<f32> {
1049 let mut buf = [0u8; 4];
1050 self.read_exact(&mut buf)?;
1051 Ok(f32::from_be_bytes(buf))
1052 }
1053 fn read_f64(&mut self) -> Result<f64> {
1054 let mut buf = [0u8; 8];
1055 self.read_exact(&mut buf)?;
1056 Ok(f64::from_le_bytes(buf))
1057 }
1058 fn read_f64_be(&mut self) -> Result<f64> {
1059 let mut buf = [0u8; 8];
1060 self.read_exact(&mut buf)?;
1061 Ok(f64::from_be_bytes(buf))
1062 }
1063
1064 fn read_cstring(&mut self) -> Result<CString> {
1065 let mut buf = Vec::new();
1066 loop {
1067 let mut byte = [0u8; 1];
1068 self.read_exact(&mut byte)?;
1069 if byte[0] == 0 {
1070 break;
1071 }
1072 buf.push(byte[0]);
1073 }
1074 CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
1075 }
1076 fn read_fstring(&mut self, len: usize, encoding: Encoding, trim: bool) -> Result<String> {
1077 let mut buf = vec![0u8; len];
1078 self.read_exact(&mut buf)?;
1079 if trim {
1080 let first_zero = buf.iter().position(|&b| b == 0);
1081 if let Some(pos) = first_zero {
1082 buf.truncate(pos);
1083 }
1084 }
1085 let s = decode_to_string(encoding, &buf, true)
1086 .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))?;
1087 Ok(s)
1088 }
1089
1090 fn read_u16string(&mut self) -> Result<Vec<u8>> {
1091 let mut buf = Vec::new();
1092 loop {
1093 let mut bytes = [0u8; 2];
1094 self.read_exact(&mut bytes)?;
1095 if bytes == [0, 0] {
1096 break;
1097 }
1098 buf.extend_from_slice(&bytes);
1099 }
1100 Ok(buf)
1101 }
1102
1103 fn read_exact_vec(&mut self, len: usize) -> Result<Vec<u8>> {
1104 let mut buf = vec![0u8; len];
1105 self.read_exact(&mut buf)?;
1106 Ok(buf)
1107 }
1108
1109 fn read_and_equal(&mut self, data: &[u8]) -> Result<()> {
1110 let mut buf = vec![0u8; data.len()];
1111 self.read_exact(&mut buf)?;
1112 if buf != data {
1113 return Err(std::io::Error::new(
1114 std::io::ErrorKind::InvalidData,
1115 "Data does not match",
1116 ));
1117 }
1118 Ok(())
1119 }
1120
1121 fn read_most(&mut self, buf: &mut [u8]) -> Result<usize> {
1122 let mut total_read = 0;
1123 while total_read < buf.len() {
1124 match self.read(&mut buf[total_read..]) {
1125 Ok(0) => break, Ok(n) => total_read += n,
1127 Err(e) => return Err(e),
1128 }
1129 }
1130 Ok(total_read)
1131 }
1132}
1133
1134pub trait WriteExt {
1136 fn write_u8(&mut self, value: u8) -> Result<()>;
1138 fn write_u16(&mut self, value: u16) -> Result<()>;
1140 fn write_u16_be(&mut self, value: u16) -> Result<()>;
1142 fn write_u32(&mut self, value: u32) -> Result<()>;
1144 fn write_u32_be(&mut self, value: u32) -> Result<()>;
1146 fn write_u64(&mut self, value: u64) -> Result<()>;
1148 fn write_u64_be(&mut self, value: u64) -> Result<()>;
1150 fn write_u128(&mut self, value: u128) -> Result<()>;
1152 fn write_u128_be(&mut self, value: u128) -> Result<()>;
1154 fn write_i8(&mut self, value: i8) -> Result<()>;
1156 fn write_i16(&mut self, value: i16) -> Result<()>;
1158 fn write_i16_be(&mut self, value: i16) -> Result<()>;
1160 fn write_i32(&mut self, value: i32) -> Result<()>;
1162 fn write_i32_be(&mut self, value: i32) -> Result<()>;
1164 fn write_i64(&mut self, value: i64) -> Result<()>;
1166 fn write_i64_be(&mut self, value: i64) -> Result<()>;
1168 fn write_i128(&mut self, value: i128) -> Result<()>;
1170 fn write_i128_be(&mut self, value: i128) -> Result<()>;
1172 fn write_f32(&mut self, value: f32) -> Result<()>;
1174 fn write_f32_be(&mut self, value: f32) -> Result<()>;
1176 fn write_f64(&mut self, value: f64) -> Result<()>;
1178 fn write_f64_be(&mut self, value: f64) -> Result<()>;
1180
1181 fn write_cstring(&mut self, value: &CString) -> Result<()>;
1183 fn write_fstring(
1190 &mut self,
1191 data: &str,
1192 len: usize,
1193 encoding: Encoding,
1194 padding: u8,
1195 truncate: bool,
1196 ) -> Result<()>;
1197 fn write_struct<V: StructPack>(
1199 &mut self,
1200 value: &V,
1201 big: bool,
1202 encoding: Encoding,
1203 info: &Option<Box<dyn std::any::Any>>,
1204 ) -> Result<()>;
1205 fn write_from<R: Read + Seek>(&mut self, reader: &mut R, offset: u64, len: u64) -> Result<()>;
1207}
1208
1209impl<T: Write> WriteExt for T {
1210 fn write_u8(&mut self, value: u8) -> Result<()> {
1211 self.write_all(&value.to_le_bytes())
1212 }
1213 fn write_u16(&mut self, value: u16) -> Result<()> {
1214 self.write_all(&value.to_le_bytes())
1215 }
1216 fn write_u16_be(&mut self, value: u16) -> Result<()> {
1217 self.write_all(&value.to_be_bytes())
1218 }
1219 fn write_u32(&mut self, value: u32) -> Result<()> {
1220 self.write_all(&value.to_le_bytes())
1221 }
1222 fn write_u32_be(&mut self, value: u32) -> Result<()> {
1223 self.write_all(&value.to_be_bytes())
1224 }
1225 fn write_u64(&mut self, value: u64) -> Result<()> {
1226 self.write_all(&value.to_le_bytes())
1227 }
1228 fn write_u64_be(&mut self, value: u64) -> Result<()> {
1229 self.write_all(&value.to_be_bytes())
1230 }
1231 fn write_u128(&mut self, value: u128) -> Result<()> {
1232 self.write_all(&value.to_le_bytes())
1233 }
1234 fn write_u128_be(&mut self, value: u128) -> Result<()> {
1235 self.write_all(&value.to_be_bytes())
1236 }
1237 fn write_i8(&mut self, value: i8) -> Result<()> {
1238 self.write_all(&value.to_le_bytes())
1239 }
1240 fn write_i16(&mut self, value: i16) -> Result<()> {
1241 self.write_all(&value.to_le_bytes())
1242 }
1243 fn write_i16_be(&mut self, value: i16) -> Result<()> {
1244 self.write_all(&value.to_be_bytes())
1245 }
1246 fn write_i32(&mut self, value: i32) -> Result<()> {
1247 self.write_all(&value.to_le_bytes())
1248 }
1249 fn write_i32_be(&mut self, value: i32) -> Result<()> {
1250 self.write_all(&value.to_be_bytes())
1251 }
1252 fn write_i64(&mut self, value: i64) -> Result<()> {
1253 self.write_all(&value.to_le_bytes())
1254 }
1255 fn write_i64_be(&mut self, value: i64) -> Result<()> {
1256 self.write_all(&value.to_be_bytes())
1257 }
1258 fn write_i128(&mut self, value: i128) -> Result<()> {
1259 self.write_all(&value.to_le_bytes())
1260 }
1261 fn write_i128_be(&mut self, value: i128) -> Result<()> {
1262 self.write_all(&value.to_be_bytes())
1263 }
1264 fn write_f32(&mut self, value: f32) -> Result<()> {
1265 self.write_all(&value.to_le_bytes())
1266 }
1267 fn write_f32_be(&mut self, value: f32) -> Result<()> {
1268 self.write_all(&value.to_be_bytes())
1269 }
1270 fn write_f64(&mut self, value: f64) -> Result<()> {
1271 self.write_all(&value.to_le_bytes())
1272 }
1273 fn write_f64_be(&mut self, value: f64) -> Result<()> {
1274 self.write_all(&value.to_be_bytes())
1275 }
1276
1277 fn write_cstring(&mut self, value: &CString) -> Result<()> {
1278 self.write_all(value.as_bytes_with_nul())
1279 }
1280
1281 fn write_fstring(
1282 &mut self,
1283 data: &str,
1284 len: usize,
1285 encoding: Encoding,
1286 padding: u8,
1287 truncate: bool,
1288 ) -> Result<()> {
1289 let encoded = encode_string(encoding, data, true).map_err(|e| {
1290 std::io::Error::new(
1291 std::io::ErrorKind::InvalidInput,
1292 format!("Encoding error: {}", e),
1293 )
1294 })?;
1295 let final_data = if encoded.len() > len {
1296 if truncate {
1297 &encoded[..len]
1298 } else {
1299 return Err(std::io::Error::new(
1300 std::io::ErrorKind::InvalidInput,
1301 "String length exceeds the specified length and truncation is disabled",
1302 ));
1303 }
1304 } else {
1305 &encoded
1306 };
1307 self.write_all(final_data)?;
1308 let padding_len = len.saturating_sub(final_data.len());
1309 if padding_len > 0 {
1310 for _ in 0..padding_len {
1311 self.write_u8(padding)?;
1312 }
1313 }
1314 Ok(())
1315 }
1316
1317 fn write_struct<V: StructPack>(
1318 &mut self,
1319 value: &V,
1320 big: bool,
1321 encoding: Encoding,
1322 info: &Option<Box<dyn std::any::Any>>,
1323 ) -> Result<()> {
1324 value
1325 .pack(self, big, encoding, info)
1326 .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))
1327 }
1328
1329 fn write_from<R: Read + Seek>(&mut self, reader: &mut R, offset: u64, len: u64) -> Result<()> {
1330 reader.seek(SeekFrom::Start(offset))?;
1331 let mut remaining = len;
1332 let mut buffer = [0u8; 8192];
1333 while remaining > 0 {
1334 let to_read = std::cmp::min(remaining, buffer.len() as u64) as usize;
1335 let bytes_read = reader.read(&mut buffer[..to_read])?;
1336 if bytes_read == 0 {
1337 break; }
1339 self.write_all(&buffer[..bytes_read])?;
1340 remaining -= bytes_read as u64;
1341 }
1342 Ok(())
1343 }
1344}
1345
1346pub trait WriteAt {
1348 fn write_at(&mut self, offset: u64, buf: &[u8]) -> Result<usize>;
1351 fn write_all_at(&mut self, offset: u64, buf: &[u8]) -> Result<()>;
1354
1355 fn write_u8_at(&mut self, offset: u64, value: u8) -> Result<()> {
1357 self.write_all_at(offset, &value.to_le_bytes())
1358 }
1359 fn write_u16_at(&mut self, offset: u64, value: u16) -> Result<()> {
1361 self.write_all_at(offset, &value.to_le_bytes())
1362 }
1363 fn write_u16_be_at(&mut self, offset: u64, value: u16) -> Result<()> {
1365 self.write_all_at(offset, &value.to_be_bytes())
1366 }
1367 fn write_u32_at(&mut self, offset: u64, value: u32) -> Result<()> {
1369 self.write_all_at(offset, &value.to_le_bytes())
1370 }
1371 fn write_u32_be_at(&mut self, offset: u64, value: u32) -> Result<()> {
1373 self.write_all_at(offset, &value.to_be_bytes())
1374 }
1375 fn write_u64_at(&mut self, offset: u64, value: u64) -> Result<()> {
1377 self.write_all_at(offset, &value.to_le_bytes())
1378 }
1379 fn write_u64_be_at(&mut self, offset: u64, value: u64) -> Result<()> {
1381 self.write_all_at(offset, &value.to_be_bytes())
1382 }
1383 fn write_u128_at(&mut self, offset: u64, value: u128) -> Result<()> {
1385 self.write_all_at(offset, &value.to_le_bytes())
1386 }
1387 fn write_u128_be_at(&mut self, offset: u64, value: u128) -> Result<()> {
1389 self.write_all_at(offset, &value.to_be_bytes())
1390 }
1391 fn write_i8_at(&mut self, offset: u64, value: i8) -> Result<()> {
1393 self.write_all_at(offset, &value.to_le_bytes())
1394 }
1395 fn write_i16_at(&mut self, offset: u64, value: i16) -> Result<()> {
1397 self.write_all_at(offset, &value.to_le_bytes())
1398 }
1399 fn write_i16_be_at(&mut self, offset: u64, value: i16) -> Result<()> {
1401 self.write_all_at(offset, &value.to_be_bytes())
1402 }
1403 fn write_i32_at(&mut self, offset: u64, value: i32) -> Result<()> {
1405 self.write_all_at(offset, &value.to_le_bytes())
1406 }
1407 fn write_i32_be_at(&mut self, offset: u64, value: i32) -> Result<()> {
1409 self.write_all_at(offset, &value.to_be_bytes())
1410 }
1411 fn write_i64_at(&mut self, offset: u64, value: i64) -> Result<()> {
1413 self.write_all_at(offset, &value.to_le_bytes())
1414 }
1415 fn write_i64_be_at(&mut self, offset: u64, value: i64) -> Result<()> {
1417 self.write_all_at(offset, &value.to_be_bytes())
1418 }
1419 fn write_i128_at(&mut self, offset: u64, value: i128) -> Result<()> {
1421 self.write_all_at(offset, &value.to_le_bytes())
1422 }
1423 fn write_i128_be_at(&mut self, offset: u64, value: i128) -> Result<()> {
1425 self.write_all_at(offset, &value.to_be_bytes())
1426 }
1427
1428 fn write_cstring_at(&mut self, offset: u64, value: &CString) -> Result<()> {
1430 self.write_all_at(offset, value.as_bytes_with_nul())
1431 }
1432}
1433
1434impl<T: Write + Seek> WriteAt for T {
1435 fn write_at(&mut self, offset: u64, buf: &[u8]) -> Result<usize> {
1436 let current_pos = self.stream_position()?;
1437 self.seek(SeekFrom::Start(offset as u64))?;
1438 let bytes_written = self.write(buf)?;
1439 self.seek(SeekFrom::Start(current_pos))?;
1440 Ok(bytes_written)
1441 }
1442
1443 fn write_all_at(&mut self, offset: u64, buf: &[u8]) -> Result<()> {
1444 let current_pos = self.stream_position()?;
1445 self.seek(SeekFrom::Start(offset as u64))?;
1446 self.write_all(buf)?;
1447 self.seek(SeekFrom::Start(current_pos))?;
1448 Ok(())
1449 }
1450}
1451
1452pub trait SeekExt {
1454 fn stream_length(&mut self) -> Result<u64>;
1456 fn align(&mut self, align: u64) -> Result<u64>;
1459 fn seek_to_end(&mut self) -> Result<u64>;
1461}
1462
1463impl<T: Seek> SeekExt for T {
1464 fn stream_length(&mut self) -> Result<u64> {
1465 let current_pos = self.stream_position()?;
1466 let length = self.seek(SeekFrom::End(0))?;
1467 self.seek(SeekFrom::Start(current_pos))?;
1468 Ok(length)
1469 }
1470
1471 fn align(&mut self, align: u64) -> Result<u64> {
1472 let current_pos = self.stream_position()?;
1473 let aligned_pos = (current_pos + align - 1) & !(align - 1);
1474 if aligned_pos != current_pos {
1475 self.seek(SeekFrom::Start(aligned_pos))?;
1476 }
1477 Ok(aligned_pos)
1478 }
1479
1480 fn seek_to_end(&mut self) -> Result<u64> {
1481 self.seek(SeekFrom::End(0))
1482 }
1483}
1484
1485#[derive(Clone)]
1486pub struct MemReader {
1488 pub data: Vec<u8>,
1490 pub pos: usize,
1492}
1493
1494#[derive(Clone)]
1496pub struct MemReaderRef<'a> {
1497 pub data: &'a [u8],
1499 pub pos: usize,
1501}
1502
1503impl std::fmt::Debug for MemReader {
1504 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1505 f.debug_struct("MemReader")
1506 .field("pos", &self.pos)
1507 .field("data_length", &self.data.len())
1508 .finish_non_exhaustive()
1509 }
1510}
1511
1512impl<'a> std::fmt::Debug for MemReaderRef<'a> {
1513 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1514 f.debug_struct("MemReaderRef")
1515 .field("pos", &self.pos)
1516 .field("data_length", &self.data.len())
1517 .finish_non_exhaustive()
1518 }
1519}
1520
1521impl MemReader {
1522 pub fn new(data: Vec<u8>) -> Self {
1524 MemReader { data, pos: 0 }
1525 }
1526
1527 pub fn to_ref<'a>(&'a self) -> MemReaderRef<'a> {
1529 MemReaderRef {
1530 data: &self.data,
1531 pos: self.pos,
1532 }
1533 }
1534
1535 pub fn is_eof(&self) -> bool {
1537 self.pos >= self.data.len()
1538 }
1539
1540 pub fn inner(self) -> Vec<u8> {
1542 self.data
1543 }
1544}
1545
1546impl<'a> MemReaderRef<'a> {
1547 pub fn new(data: &'a [u8]) -> Self {
1549 MemReaderRef { data, pos: 0 }
1550 }
1551
1552 pub fn is_eof(&self) -> bool {
1554 self.pos >= self.data.len()
1555 }
1556}
1557
1558impl Read for MemReader {
1559 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
1560 if self.pos >= self.data.len() {
1561 return Ok(0);
1562 }
1563 let bytes_to_read = buf.len().min(self.data.len() - self.pos);
1564 let mut bu = &self.data[self.pos..self.pos + bytes_to_read];
1565 bu.read(buf)?;
1566 self.pos += bytes_to_read;
1567 Ok(bytes_to_read)
1568 }
1569}
1570
1571impl Seek for MemReader {
1572 fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
1573 match pos {
1574 SeekFrom::Start(offset) => {
1575 if offset > self.data.len() as u64 {
1576 return Err(std::io::Error::new(
1577 std::io::ErrorKind::InvalidInput,
1578 "Seek position is beyond the end of the data",
1579 ));
1580 }
1581 self.pos = offset as usize;
1582 }
1583 SeekFrom::End(offset) => {
1584 let end_pos = self.data.len() as i64 + offset;
1585 if end_pos < 0 {
1586 return Err(std::io::Error::new(
1587 std::io::ErrorKind::InvalidInput,
1588 "Seek from end resulted in negative position",
1589 ));
1590 }
1591 self.pos = end_pos as usize;
1592 }
1593 SeekFrom::Current(offset) => {
1594 let new_pos = (self.pos as i64 + offset) as usize;
1595 if new_pos > self.data.len() {
1596 return Err(std::io::Error::new(
1597 std::io::ErrorKind::InvalidInput,
1598 "Seek position is beyond the end of the data",
1599 ));
1600 }
1601 self.pos = new_pos;
1602 }
1603 }
1604 Ok(self.pos as u64)
1605 }
1606
1607 fn stream_position(&mut self) -> Result<u64> {
1608 Ok(self.pos as u64)
1609 }
1610
1611 fn rewind(&mut self) -> Result<()> {
1612 self.pos = 0;
1613 Ok(())
1614 }
1615}
1616
1617impl CPeek for MemReader {
1618 fn cpeek(&self, buf: &mut [u8]) -> Result<usize> {
1619 self.to_ref().cpeek(buf)
1620 }
1621
1622 fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize> {
1623 self.to_ref().cpeek_at(offset, buf)
1624 }
1625
1626 fn cpeek_cstring(&self) -> Result<CString> {
1627 self.to_ref().cpeek_cstring()
1628 }
1629
1630 fn cpeek_u16string(&self) -> Result<Vec<u8>> {
1631 self.to_ref().cpeek_u16string()
1632 }
1633}
1634
1635impl<'a> Read for MemReaderRef<'a> {
1636 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
1637 if self.pos >= self.data.len() {
1638 return Ok(0);
1639 }
1640 let bytes_to_read = buf.len().min(self.data.len() - self.pos);
1641 let mut bu = &self.data[self.pos..self.pos + bytes_to_read];
1642 bu.read(buf)?;
1643 self.pos += bytes_to_read;
1644 Ok(bytes_to_read)
1645 }
1646}
1647
1648impl<'a> Seek for MemReaderRef<'a> {
1649 fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
1650 match pos {
1651 SeekFrom::Start(offset) => {
1652 if offset > self.data.len() as u64 {
1653 return Err(std::io::Error::new(
1654 std::io::ErrorKind::InvalidInput,
1655 "Seek position is beyond the end of the data",
1656 ));
1657 }
1658 self.pos = offset as usize;
1659 }
1660 SeekFrom::End(offset) => {
1661 let end_pos = self.data.len() as i64 + offset;
1662 if end_pos < 0 {
1663 return Err(std::io::Error::new(
1664 std::io::ErrorKind::InvalidInput,
1665 "Seek from end resulted in negative position",
1666 ));
1667 }
1668 self.pos = end_pos as usize;
1669 }
1670 SeekFrom::Current(offset) => {
1671 let new_pos = (self.pos as i64 + offset) as usize;
1672 if new_pos > self.data.len() {
1673 return Err(std::io::Error::new(
1674 std::io::ErrorKind::InvalidInput,
1675 "Seek position is beyond the end of the data",
1676 ));
1677 }
1678 self.pos = new_pos;
1679 }
1680 }
1681 Ok(self.pos as u64)
1682 }
1683
1684 fn stream_position(&mut self) -> Result<u64> {
1685 Ok(self.pos as u64)
1686 }
1687
1688 fn rewind(&mut self) -> Result<()> {
1689 self.pos = 0;
1690 Ok(())
1691 }
1692}
1693
1694impl<'a> CPeek for MemReaderRef<'a> {
1695 fn cpeek(&self, buf: &mut [u8]) -> Result<usize> {
1696 let len = self.data.len();
1697 let bytes_to_read = std::cmp::min(buf.len(), len - self.pos);
1698 buf[..bytes_to_read].copy_from_slice(&self.data[self.pos..self.pos + bytes_to_read]);
1699 Ok(bytes_to_read)
1700 }
1701
1702 fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize> {
1703 let len = self.data.len();
1704 let offset = offset as usize;
1705 if offset >= len {
1706 return Ok(0);
1707 }
1708 let bytes_to_read = std::cmp::min(buf.len(), len - offset);
1709 buf[..bytes_to_read].copy_from_slice(&self.data[offset..offset + bytes_to_read]);
1710 Ok(bytes_to_read)
1711 }
1712
1713 fn cpeek_cstring(&self) -> Result<CString> {
1714 let mut buf = Vec::new();
1715 for &byte in &self.data[self.pos..] {
1716 if byte == 0 {
1717 break;
1718 }
1719 buf.push(byte);
1720 }
1721 CString::new(buf).map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
1722 }
1723
1724 fn cpeek_u16string(&self) -> Result<Vec<u8>> {
1725 let mut buf = Vec::new();
1726 let mut i = self.pos;
1727 while i + 1 < self.data.len() {
1728 let bytes = &self.data[i..i + 2];
1729 if bytes == [0, 0] {
1730 break;
1731 }
1732 buf.extend_from_slice(bytes);
1733 i += 2;
1734 }
1735 Ok(buf)
1736 }
1737}
1738
1739pub struct MemWriter {
1741 pub data: Vec<u8>,
1743 pub pos: usize,
1745}
1746
1747impl MemWriter {
1748 pub fn new() -> Self {
1750 MemWriter {
1751 data: Vec::new(),
1752 pos: 0,
1753 }
1754 }
1755
1756 pub fn with_capacity(capacity: usize) -> Self {
1758 MemWriter {
1759 data: Vec::with_capacity(capacity),
1760 pos: 0,
1761 }
1762 }
1763
1764 pub fn from_vec(data: Vec<u8>) -> Self {
1766 MemWriter { data, pos: 0 }
1767 }
1768
1769 pub fn into_inner(self) -> Vec<u8> {
1771 self.data
1772 }
1773
1774 pub fn as_slice(&self) -> &[u8] {
1776 &self.data
1777 }
1778
1779 pub fn to_ref<'a>(&'a self) -> MemReaderRef<'a> {
1781 MemReaderRef {
1782 data: &self.data,
1783 pos: self.pos,
1784 }
1785 }
1786}
1787
1788impl std::fmt::Debug for MemWriter {
1789 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1790 f.debug_struct("MemWriter")
1791 .field("pos", &self.pos)
1792 .field("data_length", &self.data.len())
1793 .finish_non_exhaustive()
1794 }
1795}
1796
1797impl Write for MemWriter {
1798 fn write(&mut self, buf: &[u8]) -> Result<usize> {
1799 if self.pos + buf.len() > self.data.len() {
1800 self.data.resize(self.pos + buf.len(), 0);
1801 }
1802 let bytes_written = buf.len();
1803 self.data[self.pos..self.pos + bytes_written].copy_from_slice(buf);
1804 self.pos += bytes_written;
1805 Ok(bytes_written)
1806 }
1807
1808 fn flush(&mut self) -> Result<()> {
1809 Ok(())
1810 }
1811}
1812
1813impl Seek for MemWriter {
1814 fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
1818 match pos {
1819 SeekFrom::Start(offset) => {
1820 self.pos = offset as usize;
1821 }
1822 SeekFrom::End(offset) => {
1823 let end_pos = self.data.len() as i64 + offset;
1824 if end_pos < 0 {
1825 return Err(std::io::Error::new(
1826 std::io::ErrorKind::InvalidInput,
1827 "Seek from end resulted in negative position",
1828 ));
1829 }
1830 self.pos = end_pos as usize;
1831 }
1832 SeekFrom::Current(offset) => {
1833 let new_pos = self.pos as i64 + offset;
1834 if new_pos < 0 {
1835 return Err(std::io::Error::new(
1836 std::io::ErrorKind::InvalidInput,
1837 "Seek position is negative",
1838 ));
1839 }
1840 self.pos = new_pos as usize;
1841 }
1842 }
1843 Ok(self.pos as u64)
1844 }
1845
1846 fn stream_position(&mut self) -> Result<u64> {
1847 Ok(self.pos as u64)
1848 }
1849
1850 fn rewind(&mut self) -> Result<()> {
1851 self.pos = 0;
1852 Ok(())
1853 }
1854}
1855
1856impl CPeek for MemWriter {
1857 fn cpeek(&self, buf: &mut [u8]) -> Result<usize> {
1858 self.to_ref().cpeek(buf)
1859 }
1860
1861 fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize> {
1862 self.to_ref().cpeek_at(offset, buf)
1863 }
1864
1865 fn cpeek_cstring(&self) -> Result<CString> {
1866 self.to_ref().cpeek_cstring()
1867 }
1868
1869 fn cpeek_u16string(&self) -> Result<Vec<u8>> {
1870 self.to_ref().cpeek_u16string()
1871 }
1872}
1873
1874pub struct MemWriterRef<'a> {
1876 pub data: &'a mut [u8],
1878 pub pos: usize,
1880}
1881
1882impl<'a> MemWriterRef<'a> {
1883 pub fn new(data: &'a mut [u8]) -> Self {
1885 MemWriterRef { data, pos: 0 }
1886 }
1887}
1888
1889impl<'a> Read for MemWriterRef<'a> {
1890 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
1891 if self.pos >= self.data.len() {
1892 return Ok(0);
1893 }
1894 let bytes_to_read = buf.len().min(self.data.len() - self.pos);
1895 let mut bu = &self.data[self.pos..self.pos + bytes_to_read];
1896 bu.read(buf)?;
1897 self.pos += bytes_to_read;
1898 Ok(bytes_to_read)
1899 }
1900}
1901
1902impl<'a> Seek for MemWriterRef<'a> {
1903 fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
1904 match pos {
1905 SeekFrom::Start(offset) => {
1906 if offset > self.data.len() as u64 {
1907 return Err(std::io::Error::new(
1908 std::io::ErrorKind::InvalidInput,
1909 "Seek position is beyond the end of the data",
1910 ));
1911 }
1912 self.pos = offset as usize;
1913 }
1914 SeekFrom::End(offset) => {
1915 let end_pos = self.data.len() as i64 + offset;
1916 if end_pos < 0 {
1917 return Err(std::io::Error::new(
1918 std::io::ErrorKind::InvalidInput,
1919 "Seek from end resulted in negative position",
1920 ));
1921 }
1922 if end_pos as usize > self.data.len() {
1923 return Err(std::io::Error::new(
1924 std::io::ErrorKind::InvalidInput,
1925 "Seek position is beyond the end of the data",
1926 ));
1927 }
1928 self.pos = end_pos as usize;
1929 }
1930 SeekFrom::Current(offset) => {
1931 let new_pos = (self.pos as i64 + offset) as usize;
1932 if new_pos > self.data.len() {
1933 return Err(std::io::Error::new(
1934 std::io::ErrorKind::InvalidInput,
1935 "Seek position is beyond the end of the data",
1936 ));
1937 }
1938 self.pos = new_pos;
1939 }
1940 }
1941 Ok(self.pos as u64)
1942 }
1943
1944 fn stream_position(&mut self) -> Result<u64> {
1945 Ok(self.pos as u64)
1946 }
1947
1948 fn rewind(&mut self) -> Result<()> {
1949 self.pos = 0;
1950 Ok(())
1951 }
1952}
1953
1954impl Write for MemWriterRef<'_> {
1955 fn write(&mut self, buf: &[u8]) -> Result<usize> {
1956 if self.pos >= self.data.len() {
1957 return Ok(0);
1958 }
1959 let bytes_to_write = buf.len().min(self.data.len() - self.pos);
1960 self.data[self.pos..self.pos + bytes_to_write].copy_from_slice(&buf[..bytes_to_write]);
1961 self.pos += bytes_to_write;
1962 Ok(bytes_to_write)
1963 }
1964
1965 fn flush(&mut self) -> Result<()> {
1966 Ok(())
1967 }
1968}
1969
1970#[derive(Debug)]
1972pub struct StreamRegion<T: Seek> {
1973 stream: T,
1974 start_pos: u64,
1975 end_pos: u64,
1976 cur_pos: u64,
1977}
1978
1979impl<T: Seek> StreamRegion<T> {
1980 pub fn new(stream: T, start_pos: u64, end_pos: u64) -> Result<Self> {
1982 if start_pos > end_pos {
1983 return Err(std::io::Error::new(
1984 std::io::ErrorKind::InvalidInput,
1985 "Start position cannot be greater than end position",
1986 ));
1987 }
1988 Ok(Self {
1989 stream,
1990 start_pos,
1991 end_pos,
1992 cur_pos: 0,
1993 })
1994 }
1995
1996 pub fn with_size(mut stream: T, size: u64) -> Result<Self> {
2000 let start_pos = stream.stream_position()?;
2001 let end_pos = start_pos + size;
2002 Self::new(stream, start_pos, end_pos)
2003 }
2004
2005 pub fn with_start_pos(mut stream: T, start_pos: u64) -> Result<Self> {
2008 let end_pos = stream.stream_length()?;
2009 Self::new(stream, start_pos, end_pos)
2010 }
2011
2012 pub fn cur_pos(&self) -> u64 {
2014 self.cur_pos
2015 }
2016}
2017
2018impl<T: Read + Seek> Read for StreamRegion<T> {
2019 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
2020 if self.cur_pos + self.start_pos >= self.end_pos {
2021 return Ok(0); }
2023 self.stream
2024 .seek(SeekFrom::Start(self.start_pos + self.cur_pos))?;
2025 let bytes_to_read = (self.end_pos - self.start_pos - self.cur_pos) as usize;
2026 let m = buf.len().min(bytes_to_read);
2027 let readed = self.stream.read(&mut buf[..m])?;
2028 self.cur_pos += readed as u64;
2029 Ok(readed)
2030 }
2031}
2032
2033impl<T: Seek> Seek for StreamRegion<T> {
2034 fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
2035 let new_pos = match pos {
2036 SeekFrom::Start(offset) => self.start_pos + offset,
2037 SeekFrom::End(offset) => (self.end_pos as i64 + offset as i64) as u64,
2038 SeekFrom::Current(offset) => {
2039 (self.start_pos as i64 + self.cur_pos as i64 + offset as i64) as u64
2040 }
2041 };
2042 if new_pos < self.start_pos || new_pos > self.end_pos {
2043 return Err(std::io::Error::new(
2044 std::io::ErrorKind::InvalidInput,
2045 "Seek position out of bounds",
2046 ));
2047 }
2048 self.cur_pos = new_pos - self.start_pos;
2049 self.stream.seek(SeekFrom::Start(new_pos))?;
2050 Ok(self.cur_pos)
2051 }
2052
2053 fn stream_position(&mut self) -> Result<u64> {
2054 Ok(self.cur_pos)
2055 }
2056
2057 fn rewind(&mut self) -> Result<()> {
2058 self.cur_pos = 0;
2059 self.stream.seek(SeekFrom::Start(self.start_pos))?;
2060 Ok(())
2061 }
2062}
2063
2064impl<T: Seek + Write> Write for StreamRegion<T> {
2065 fn write(&mut self, buf: &[u8]) -> Result<usize> {
2066 if self.cur_pos + self.start_pos >= self.end_pos {
2067 return Ok(0); }
2069 self.stream
2070 .seek(SeekFrom::Start(self.start_pos + self.cur_pos))?;
2071 let bytes_to_write = (self.end_pos - self.start_pos - self.cur_pos) as usize;
2072 let m = buf.len().min(bytes_to_write);
2073 let written = self.stream.write(&buf[..m])?;
2074 self.cur_pos += written as u64;
2075 Ok(written)
2076 }
2077
2078 fn flush(&mut self) -> Result<()> {
2079 self.stream.flush()
2080 }
2081}
2082
2083struct RangeMap {
2084 original: (u64, u64),
2085 new: (u64, u64),
2086}
2087
2088pub struct BinaryPatcher<
2090 R: Read + Seek,
2091 W: Write + Seek,
2092 A: Fn(u64) -> Result<u64>,
2093 O: Fn(u64) -> Result<u64>,
2094> {
2095 pub input: R,
2096 pub output: W,
2097 input_len: u64,
2098 address_to_offset: A,
2099 offset_to_address: O,
2100 range_maps: Vec<RangeMap>,
2101}
2102
2103impl<R: Read + Seek, W: Write + Seek, A: Fn(u64) -> Result<u64>, O: Fn(u64) -> Result<u64>>
2104 BinaryPatcher<R, W, A, O>
2105{
2106 pub fn new(
2108 mut input: R,
2109 output: W,
2110 address_to_offset: A,
2111 offset_to_address: O,
2112 ) -> Result<Self> {
2113 let input_len = input.stream_length()?;
2114 Ok(BinaryPatcher {
2115 input,
2116 output,
2117 input_len,
2118 address_to_offset,
2119 offset_to_address,
2120 range_maps: Vec::new(),
2121 })
2122 }
2123
2124 pub fn copy_up_to(&mut self, original_offset: u64) -> Result<()> {
2126 let cur_pos = self.input.stream_position()?;
2127 if original_offset < cur_pos || original_offset > self.input_len {
2128 return Err(std::io::Error::new(
2129 std::io::ErrorKind::InvalidInput,
2130 "Original offset is out of bounds",
2131 ));
2132 }
2133 let bytes_to_copy = original_offset - cur_pos;
2134 std::io::copy(&mut (&mut self.input).take(bytes_to_copy), &mut self.output)?;
2135 Ok(())
2136 }
2137
2138 pub fn map_offset(&mut self, original_offset: u64) -> Result<u64> {
2140 if original_offset > self.input_len {
2141 return Err(std::io::Error::new(
2142 std::io::ErrorKind::InvalidInput,
2143 "Original offset is out of bounds",
2144 ));
2145 }
2146 let cur_pos = self.input.stream_position()?;
2147 if original_offset > cur_pos {
2148 return Err(std::io::Error::new(
2149 std::io::ErrorKind::InvalidInput,
2150 "Original offset is beyond current position",
2151 ));
2152 }
2153 let mut start = 0;
2154 let mut end = self.range_maps.len();
2155 while start < end {
2156 let pivot = (start + end) / 2;
2157 let range = &self.range_maps[pivot];
2158 if original_offset < range.original.0 {
2159 end = pivot;
2160 } else if original_offset == range.original.0 {
2161 return Ok(range.new.0);
2162 } else if original_offset >= range.original.1 {
2163 start = pivot + 1;
2164 } else {
2165 return Err(std::io::Error::new(
2166 std::io::ErrorKind::InvalidInput,
2167 "Can't map an offset inside a changed section",
2168 ));
2169 }
2170 }
2171 if start == 0 {
2172 return Ok(original_offset);
2173 }
2174 let index = start - 1;
2175 let range = &self.range_maps[index];
2176 let new_offset = original_offset + range.new.1 - range.original.1;
2177 let out_len = self.output.stream_length()?;
2178 if new_offset > out_len {
2179 return Err(std::io::Error::new(
2180 std::io::ErrorKind::InvalidInput,
2181 "Mapped offset is beyond the end of the output stream",
2182 ));
2183 }
2184 Ok(new_offset)
2185 }
2186
2187 pub fn replace_bytes(&mut self, original_length: u64, new_data: &[u8]) -> Result<()> {
2192 self.replace_bytes_with_write(original_length, |writer| writer.write_all(new_data))
2193 }
2194
2195 pub fn replace_bytes_with_write<F: Fn(&mut W) -> Result<()>>(
2200 &mut self,
2201 original_length: u64,
2202 write: F,
2203 ) -> Result<()> {
2204 let cur_pos = self.input.stream_position()?;
2205 if cur_pos + original_length > self.input_len {
2206 return Err(std::io::Error::new(
2207 std::io::ErrorKind::InvalidInput,
2208 "Original length exceeds input length",
2209 ));
2210 }
2211 let new_data_offset = self.output.stream_position()?;
2212 write(&mut self.output)?;
2213 let new_data_length = self.output.stream_position()? - new_data_offset;
2214 if new_data_length != original_length {
2215 self.range_maps.push(RangeMap {
2216 original: (cur_pos, cur_pos + original_length),
2217 new: (new_data_offset, new_data_offset + new_data_length),
2218 });
2219 }
2220 self.input
2221 .seek(SeekFrom::Start(cur_pos + original_length))?;
2222 Ok(())
2223 }
2224
2225 pub fn patch_u32(&mut self, original_offset: u64, value: u32) -> Result<()> {
2227 let input_pos = self.input.stream_position()?;
2228 if input_pos < original_offset + 4 {
2229 return Err(std::io::Error::new(
2230 std::io::ErrorKind::InvalidInput,
2231 "Original offset is out of bounds for u32 patching",
2232 ));
2233 }
2234 let new_offset = self.map_offset(original_offset)?;
2235 self.output.seek(SeekFrom::Start(new_offset))?;
2236 self.output.write_u32(value)?;
2237 self.output.seek(SeekFrom::End(0))?;
2238 Ok(())
2239 }
2240
2241 pub fn patch_u32_be(&mut self, original_offset: u64, value: u32) -> Result<()> {
2243 let input_pos = self.input.stream_position()?;
2244 if input_pos < original_offset + 4 {
2245 return Err(std::io::Error::new(
2246 std::io::ErrorKind::InvalidInput,
2247 "Original offset is out of bounds for u32 patching",
2248 ));
2249 }
2250 let new_offset = self.map_offset(original_offset)?;
2251 self.output.seek(SeekFrom::Start(new_offset))?;
2252 self.output.write_u32_be(value)?;
2253 self.output.seek(SeekFrom::End(0))?;
2254 Ok(())
2255 }
2256
2257 pub fn patch_u32_address(&mut self, original_offset: u64) -> Result<()> {
2259 let input_pos = self.input.stream_position()?;
2260 if input_pos < original_offset + 4 {
2261 return Err(std::io::Error::new(
2262 std::io::ErrorKind::InvalidInput,
2263 "Original offset is out of bounds for u32 address patching",
2264 ));
2265 }
2266 let original_address = self.input.peek_u32_at(original_offset)?;
2267 let new_offset = self.map_offset(original_offset)?;
2268 let offset = (self.address_to_offset)(original_address as u64)?;
2269 let offset = self.map_offset(offset)?;
2270 let new_addr = (self.offset_to_address)(offset)?;
2271 self.output.seek(SeekFrom::Start(new_offset))?;
2272 self.output.write_u32(new_addr as u32)?;
2273 self.output.seek(SeekFrom::End(0))?;
2274 Ok(())
2275 }
2276}
2277
2278#[derive(Debug)]
2280pub struct MutexWrapper<T> {
2281 inner: Arc<Mutex<T>>,
2282 pos: u64,
2283}
2284
2285impl<T> MutexWrapper<T> {
2286 pub fn new(inner: Arc<Mutex<T>>, pos: u64) -> Self {
2288 MutexWrapper { inner, pos }
2289 }
2290}
2291
2292impl<T: Read + Seek> Read for MutexWrapper<T> {
2293 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
2294 let mut lock = self.inner.lock().map_err(|_| {
2295 std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
2296 })?;
2297 lock.seek(SeekFrom::Start(self.pos))?;
2298 let readed = lock.read(buf)?;
2299 self.pos += readed as u64;
2300 Ok(readed)
2301 }
2302}
2303
2304impl<T: Read + Seek> Seek for MutexWrapper<T> {
2305 fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
2306 let mut lock = self.inner.lock().map_err(|_| {
2307 std::io::Error::new(std::io::ErrorKind::Other, "Failed to lock the mutex")
2308 })?;
2309 let new_pos = match pos {
2310 SeekFrom::Start(offset) => offset,
2311 SeekFrom::End(offset) => {
2312 let len = lock.stream_length()?;
2313 (len as i64 + offset as i64) as u64
2314 }
2315 SeekFrom::Current(offset) => (self.pos as i64 + offset as i64) as u64,
2316 };
2317 if new_pos > lock.stream_length()? {
2318 return Err(std::io::Error::new(
2319 std::io::ErrorKind::InvalidInput,
2320 "Seek position is beyond the end of the stream",
2321 ));
2322 }
2323 self.pos = new_pos;
2324 Ok(self.pos)
2325 }
2326
2327 fn stream_position(&mut self) -> Result<u64> {
2328 Ok(self.pos)
2329 }
2330
2331 fn rewind(&mut self) -> Result<()> {
2332 self.pos = 0;
2333 Ok(())
2334 }
2335}
2336
2337pub struct EmptyWriter;
2339
2340impl EmptyWriter {
2341 pub fn new() -> Self {
2343 Self {}
2344 }
2345}
2346
2347impl Write for EmptyWriter {
2348 fn write(&mut self, buf: &[u8]) -> Result<usize> {
2349 Ok(buf.len())
2350 }
2351
2352 fn flush(&mut self) -> Result<()> {
2353 Ok(())
2354 }
2355}
2356
2357#[derive(Debug)]
2358pub struct PrefixStream<T> {
2360 prefix: Vec<u8>,
2361 pos: usize,
2362 inner: T,
2363}
2364
2365impl<T> PrefixStream<T> {
2366 pub fn new(prefix: Vec<u8>, inner: T) -> Self {
2368 PrefixStream {
2369 prefix,
2370 pos: 0,
2371 inner,
2372 }
2373 }
2374}
2375
2376impl<T: Read> Read for PrefixStream<T> {
2377 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
2378 if self.pos < self.prefix.len() {
2379 let bytes_to_read = std::cmp::min(buf.len(), self.prefix.len() - self.pos);
2380 buf[..bytes_to_read].copy_from_slice(&self.prefix[self.pos..self.pos + bytes_to_read]);
2381 self.pos += bytes_to_read;
2382 Ok(bytes_to_read)
2383 } else {
2384 self.inner.read(buf)
2385 }
2386 }
2387}
2388
2389impl<T: Seek> Seek for PrefixStream<T> {
2390 fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
2391 let prefix_len = self.prefix.len() as u64;
2392 let new_pos = match pos {
2393 SeekFrom::Start(offset) => offset,
2394 SeekFrom::End(offset) => {
2395 let inner_len = self.inner.stream_length()?;
2396 if offset < 0 {
2397 if (-offset) as u64 > inner_len + prefix_len {
2398 return Err(std::io::Error::new(
2399 std::io::ErrorKind::InvalidInput,
2400 "Seek position is before the start of the stream",
2401 ));
2402 }
2403 inner_len + prefix_len - (-offset) as u64
2404 } else {
2405 inner_len + prefix_len + offset as u64
2406 }
2407 }
2408 SeekFrom::Current(offset) => {
2409 let current_pos = self.stream_position()?;
2410 if offset < 0 {
2411 if (-offset) as u64 > current_pos + prefix_len {
2412 return Err(std::io::Error::new(
2413 std::io::ErrorKind::InvalidInput,
2414 "Seek position is before the start of the stream",
2415 ));
2416 }
2417 prefix_len + current_pos - (-offset) as u64
2418 } else {
2419 prefix_len + current_pos + offset as u64
2420 }
2421 }
2422 };
2423 if new_pos < prefix_len {
2424 self.pos = new_pos as usize;
2425 self.inner.rewind()?;
2426 } else {
2427 self.pos = self.prefix.len();
2428 self.inner.seek(SeekFrom::Start(new_pos - prefix_len))?;
2429 }
2430 Ok(new_pos)
2431 }
2432
2433 fn stream_position(&mut self) -> Result<u64> {
2434 Ok(self.pos as u64 + self.inner.stream_position()?)
2435 }
2436
2437 fn rewind(&mut self) -> Result<()> {
2438 self.pos = 0;
2439 self.inner.rewind()?;
2440 Ok(())
2441 }
2442}
2443
2444#[derive(Debug)]
2446pub struct MultipleReadStream {
2447 streams: Vec<Box<dyn ReadSeek>>,
2448 stream_lengths: Vec<u64>,
2449 total_length: u64,
2450 pos: u64,
2451}
2452
2453impl MultipleReadStream {
2454 pub fn new() -> Self {
2456 MultipleReadStream {
2457 streams: Vec::new(),
2458 stream_lengths: Vec::new(),
2459 total_length: 0,
2460 pos: 0,
2461 }
2462 }
2463
2464 pub fn add_stream<T: ReadSeek + 'static>(&mut self, mut stream: T) -> Result<()> {
2466 let length = stream.stream_length()?;
2467 self.streams.push(Box::new(stream));
2468 self.stream_lengths.push(self.total_length);
2469 self.total_length += length;
2470 Ok(())
2471 }
2472
2473 pub fn add_stream_boxed(&mut self, mut stream: Box<dyn ReadSeek>) -> Result<()> {
2475 let length = stream.stream_length()?;
2476 self.streams.push(stream);
2477 self.stream_lengths.push(self.total_length);
2478 self.total_length += length;
2479 Ok(())
2480 }
2481}
2482
2483impl Read for MultipleReadStream {
2484 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
2485 if self.pos >= self.total_length {
2486 return Ok(0);
2487 }
2488 let (stream_index, stream_offset) = match self.stream_lengths.binary_search_by(|&len| {
2489 if len > self.pos {
2490 std::cmp::Ordering::Greater
2491 } else {
2492 std::cmp::Ordering::Less
2493 }
2494 }) {
2495 Ok(index) => (index, 0),
2496 Err(0) => (0, self.pos),
2497 Err(index) => (index - 1, self.pos - self.stream_lengths[index - 1]),
2498 };
2499 let stream = &mut self.streams[stream_index];
2500 stream.seek(SeekFrom::Start(stream_offset))?;
2501 let bytes_read = stream.read(buf)?;
2502 self.pos += bytes_read as u64;
2503 Ok(bytes_read)
2504 }
2505}
2506
2507impl Seek for MultipleReadStream {
2508 fn seek(&mut self, pos: SeekFrom) -> Result<u64> {
2509 let new_pos = match pos {
2510 SeekFrom::Start(offset) => offset,
2511 SeekFrom::End(offset) => {
2512 if offset < 0 {
2513 if (-offset) as u64 > self.total_length {
2514 return Err(std::io::Error::new(
2515 std::io::ErrorKind::InvalidInput,
2516 "Seek position is before the start of the stream",
2517 ));
2518 }
2519 self.total_length - (-offset) as u64
2520 } else {
2521 self.total_length + offset as u64
2522 }
2523 }
2524 SeekFrom::Current(offset) => {
2525 if offset < 0 {
2526 if (-offset) as u64 > self.pos {
2527 return Err(std::io::Error::new(
2528 std::io::ErrorKind::InvalidInput,
2529 "Seek position is before the start of the stream",
2530 ));
2531 }
2532 self.pos - (-offset) as u64
2533 } else {
2534 self.pos + offset as u64
2535 }
2536 }
2537 };
2538 if new_pos > self.total_length {
2539 return Err(std::io::Error::new(
2540 std::io::ErrorKind::InvalidInput,
2541 "Seek position is beyond the end of the stream",
2542 ));
2543 }
2544 self.pos = new_pos;
2545 Ok(self.pos)
2546 }
2547
2548 fn stream_position(&mut self) -> Result<u64> {
2549 Ok(self.pos)
2550 }
2551
2552 fn rewind(&mut self) -> Result<()> {
2553 self.pos = 0;
2554 Ok(())
2555 }
2556}
2557
2558pub struct TrackStream<'a, T> {
2559 inner: T,
2560 total: &'a mut u64,
2561}
2562
2563impl<'a, T> TrackStream<'a, T> {
2564 pub fn new(inner: T, total: &'a mut u64) -> Self {
2565 TrackStream { inner, total }
2566 }
2567}
2568
2569impl<'a, T: Read> Read for TrackStream<'a, T> {
2570 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
2571 let readed = self.inner.read(buf)?;
2572 *self.total += readed as u64;
2573 Ok(readed)
2574 }
2575}
2576
2577impl<'a, T: Write> Write for TrackStream<'a, T> {
2578 fn write(&mut self, buf: &[u8]) -> Result<usize> {
2579 let written = self.inner.write(buf)?;
2580 *self.total += written as u64;
2581 Ok(written)
2582 }
2583
2584 fn flush(&mut self) -> Result<()> {
2585 self.inner.flush()
2586 }
2587}
2588
2589#[derive(Debug)]
2591pub struct AlignedReader<const A: usize, T: Read> {
2592 inner: T,
2593 buffer: [u8; A],
2594 buffer_size: usize,
2595}
2596
2597impl<const A: usize, T: Read> AlignedReader<A, T> {
2598 pub fn new(inner: T) -> Self {
2600 AlignedReader {
2601 inner,
2602 buffer: [0; A],
2603 buffer_size: 0,
2604 }
2605 }
2606}
2607
2608impl<const A: usize, T: Read> Read for AlignedReader<A, T> {
2609 fn read(&mut self, buf: &mut [u8]) -> Result<usize> {
2610 let mut total_read = 0;
2611 let mut needed = buf.len();
2612 if needed <= self.buffer_size {
2613 buf[..needed].copy_from_slice(&self.buffer[..needed]);
2614 self.buffer.copy_within(needed..self.buffer_size, 0);
2615 self.buffer_size -= needed;
2616 return Ok(needed);
2617 }
2618 if self.buffer_size > 0 {
2619 buf[..self.buffer_size].copy_from_slice(&self.buffer[..self.buffer_size]);
2620 total_read += self.buffer_size;
2621 needed -= self.buffer_size;
2622 self.buffer_size = 0;
2623 }
2624 let read_len = needed / A * A;
2625 if read_len > 0 {
2626 let readed = self
2627 .inner
2628 .read(&mut buf[total_read..total_read + read_len])?;
2629 total_read += readed;
2630 needed -= readed;
2631 if readed < read_len {
2633 return Ok(total_read);
2634 }
2635 }
2636 if needed > 0 {
2637 let readed = self.inner.read(&mut self.buffer)?;
2638 let to_copy = needed.min(readed);
2639 buf[total_read..total_read + to_copy].copy_from_slice(&self.buffer[..to_copy]);
2640 total_read += to_copy;
2641 self.buffer_size = readed - to_copy;
2642 self.buffer.copy_within(to_copy..readed, 0);
2643 }
2644 Ok(total_read)
2645 }
2646}
2647
2648#[derive(Debug)]
2650pub struct AlignedWriter<const A: usize, T: Write> {
2651 inner: T,
2652 buffer: [u8; A],
2653 buffer_size: usize,
2654}
2655
2656impl<const A: usize, T: Write> AlignedWriter<A, T> {
2657 pub fn new(inner: T) -> Self {
2659 AlignedWriter {
2660 inner,
2661 buffer: [0; A],
2662 buffer_size: 0,
2663 }
2664 }
2665}
2666
2667impl<const A: usize, T: Write> Write for AlignedWriter<A, T> {
2668 fn write(&mut self, buf: &[u8]) -> Result<usize> {
2669 let mut total_writted = 0;
2670 let mut needed = buf.len();
2671 if self.buffer_size > 0 {
2672 let to_copy = (A - self.buffer_size).min(needed);
2673 self.buffer[self.buffer_size..self.buffer_size + to_copy]
2674 .copy_from_slice(&buf[..to_copy]);
2675 self.buffer_size += to_copy;
2676 total_writted += to_copy;
2677 needed -= to_copy;
2678 if self.buffer_size == A {
2679 let writed = self.inner.write(&self.buffer)?;
2680 if writed % A != 0 {
2681 return Err(std::io::Error::new(
2682 std::io::ErrorKind::WriteZero,
2683 "Failed to write all aligned bytes",
2684 ));
2685 }
2686 self.buffer_size -= writed;
2687 } else {
2688 return Ok(total_writted);
2689 }
2690 }
2691 let mut write_len = needed / A * A;
2692 while write_len > 0 {
2693 let writed = self
2694 .inner
2695 .write(&buf[total_writted..total_writted + write_len])?;
2696 if writed % A != 0 {
2697 return Err(std::io::Error::new(
2698 std::io::ErrorKind::WriteZero,
2699 "Failed to write all aligned bytes",
2700 ));
2701 }
2702 total_writted += writed;
2703 needed -= writed;
2704 write_len = needed / A * A;
2705 }
2706 if needed > 0 {
2707 self.buffer[..needed].copy_from_slice(&buf[total_writted..total_writted + needed]);
2708 self.buffer_size = needed;
2709 total_writted += needed;
2710 }
2711 Ok(total_writted)
2712 }
2713
2714 fn flush(&mut self) -> Result<()> {
2715 self.inner.flush()
2716 }
2717}
2718
2719impl<const A: usize, T: Write> Drop for AlignedWriter<A, T> {
2720 fn drop(&mut self) {
2721 if self.buffer_size > 0 {
2722 if let Err(err) = self.inner.write_all(&self.buffer[..self.buffer_size]) {
2723 eprintln!("Failed to flush AlignedWriter buffer: {}", err);
2724 crate::COUNTER.inc_error();
2725 }
2726 self.buffer_size = 0;
2727 }
2728 }
2729}