msg_tool\ext/
io.rs

1//!Extensions for IO operations.
2use 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
8/// A trait to help to peek data from a reader.
9pub trait Peek {
10    /// Peeks data from the reader into the provided buffer.
11    /// Returns the number of bytes read.
12    fn peek(&mut self, buf: &mut [u8]) -> Result<usize>;
13    /// Peeks data from the reader into the provided buffer.
14    /// Returns an error if the buffer is not filled completely.
15    fn peek_exact(&mut self, buf: &mut [u8]) -> Result<()>;
16    /// Peeks data from the reader at a specific offset into the provided buffer.
17    /// Returns the number of bytes read.
18    fn peek_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<usize>;
19    /// Peeks data from the reader at a specific offset into the provided buffer.
20    /// Returns an error if the buffer is not filled completely.
21    fn peek_exact_at(&mut self, offset: u64, buf: &mut [u8]) -> Result<()>;
22    /// Peeks data from the reader at a specific offset into a vector.
23    /// Returns the vector containing the data read.
24    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    /// Peeks data from the reader at a specific offset into a vector.
33    /// Returns an error if the buffer is not filled completely.
34    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    /// Peeks a [u8] from the reader.
41    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    /// Peeks a [u16] from the reader in little-endian order.
47    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    /// Peeks a [u16] from the reader in big-endian order.
53    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    /// Peeks a [u32] from the reader in little-endian order.
59    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    /// Peeks a [u32] from the reader in big-endian order.
65    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    /// Peeks a [u64] from the reader in little-endian order.
71    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    /// Peeks a [u64] from the reader in big-endian order.
77    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    /// Peeks a [u128] from the reader in little-endian order.
83    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    /// Peeks a [u128] from the reader in big-endian order.
89    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    /// Peeks an [i8] from the reader.
95    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    /// Peeks an [i16] from the reader in little-endian order.
101    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    /// Peeks an [i16] from the reader in big-endian order.
107    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    /// Peeks an [i32] from the reader in little-endian order.
113    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    /// Peeks an [i32] from the reader in big-endian order.
119    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    /// Peeks an [i64] from the reader in little-endian order.
125    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    /// Peeks an [i64] from the reader in big-endian order.
131    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    /// Peeks an [i128] from the reader in little-endian order.
137    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    /// Peeks an [i128] from the reader in big-endian order.
143    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    /// Peeks a [u8] at a specific offset from the reader.
149    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    /// Peeks a [u16] at a specific offset from the reader in little-endian order.
155    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    /// Peeks a [u16] at a specific offset from the reader in big-endian order.
161    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    /// Peeks a [u32] at a specific offset from the reader in little-endian order.
167    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    /// Peeks a [u32] at a specific offset from the reader in big-endian order.
173    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    /// Peeks a [u64] at a specific offset from the reader in little-endian order.
179    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    /// Peeks a [u64] at a specific offset from the reader in big-endian order.
185    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    /// Peeks a [u128] at a specific offset from the reader in little-endian order.
191    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    /// Peeks a [u128] at a specific offset from the reader in big-endian order.
197    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    /// Peeks an [i8] at a specific offset from the reader.
203    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    /// Peeks an [i16] at a specific offset from the reader in little-endian order.
209    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    /// Peeks an [i16] at a specific offset from the reader in big-endian order.
215    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    /// Peeks an [i32] at a specific offset from the reader in little-endian order.
221    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    /// Peeks an [i32] at a specific offset from the reader in big-endian order.
227    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    /// Peeks an [i64] at a specific offset from the reader in little-endian order.
233    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    /// Peeks an [i64] at a specific offset from the reader in big-endian order.
239    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    /// Peeks an [i128] at a specific offset from the reader in little-endian order.
245    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    /// Peeks an [i128] at a specific offset from the reader in big-endian order.
251    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    /// Peeks a C-style string (null-terminated) from the reader.
258    fn peek_cstring(&mut self) -> Result<CString>;
259    /// Peeks a C-style string (null-terminated) from the reader at a specific offset.
260    fn peek_cstring_at(&mut self, offset: u64) -> Result<CString>;
261
262    /// Reads a struct from the reader.
263    /// The struct must implement the `StructUnpack` trait.
264    ///
265    /// * `big` indicates whether the struct is in big-endian format.
266    /// * `encoding` specifies the encoding to use for string fields in the struct.
267    /// Returns the unpacked struct.
268    fn read_struct<T: StructUnpack>(&mut self, big: bool, encoding: Encoding) -> Result<T>;
269    /// Reads a vector of structs from the reader.
270    /// The structs must implement the `StructUnpack` trait.
271    ///
272    /// * `count` is the number of structs to read.
273    /// * `big` indicates whether the structs are in big-endian format.
274    /// * `encoding` specifies the encoding to use for string fields in the structs.
275    /// Returns a vector of unpacked structs.
276    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    /// Peeks data and checks if it matches the provided data.
290    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    /// Peeks data at a specific offset and checks if it matches the provided data.
302    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
383/// A trait to help to peek data from a reader in a thread-safe manner.
384pub trait CPeek {
385    /// Peeks data from the reader into the provided buffer.
386    /// Returns the number of bytes read.
387    fn cpeek(&self, buf: &mut [u8]) -> Result<usize>;
388    /// Peeks data from the reader into the provided buffer.
389    /// Returns an error if the buffer is not filled completely.
390    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    /// Peeks data from the reader at a specific offset into the provided buffer.
401    /// Returns the number of bytes read.
402    fn cpeek_at(&self, offset: u64, buf: &mut [u8]) -> Result<usize>;
403    /// Peeks data from the reader at a specific offset into the provided buffer.
404    /// Returns an error if the buffer is not filled completely.
405    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    /// Peeks data from the reader at a specific offset into a vector.
416    /// Returns the vector containing the data read.
417    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    /// Peeks data from the reader at a specific offset into a vector.
426    /// Returns an error if the buffer is not filled completely.
427    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    /// Peeks a [u8] from the reader.
434    fn cpeek_u8(&self) -> Result<u8> {
435        let mut buf = [0u8; 1];
436        self.cpeek_exact(&mut buf)?;
437        Ok(buf[0])
438    }
439    /// Peeks a [u16] from the reader in little-endian order.
440    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    /// Peeks a [u16] from the reader in big-endian order.
446    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    /// Peeks a [u32] from the reader in little-endian order.
452    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    /// Peeks a [u32] from the reader in big-endian order.
458    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    /// Peeks a [u64] from the reader in little-endian order.
464    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    /// Peeks a [u64] from the reader in big-endian order.
470    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    /// Peeks a [u128] from the reader in little-endian order.
476    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    /// Peeks a [u128] from the reader in big-endian order.
482    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    /// Peeks an [i8] from the reader.
488    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    /// Peeks an [i16] from the reader in little-endian order.
494    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    /// Peeks an [i16] from the reader in big-endian order.
500    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    /// Peeks an [i32] from the reader in little-endian order.
506    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    /// Peeks an [i32] from the reader in big-endian order.
512    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    /// Peeks an [i64] from the reader in little-endian order.
518    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    /// Peeks an [i64] from the reader in big-endian order.
524    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    /// Peeks an [i128] from the reader in little-endian order.
530    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    /// Peeks an [i128] from the reader in big-endian order.
536    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    /// Peeks a [u8] at a specific offset from the reader.
542    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    /// Peeks a [u16] at a specific offset from the reader in little-endian order.
548    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    /// Peeks a [u16] at a specific offset from the reader in big-endian order.
554    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    /// Peeks a [u32] at a specific offset from the reader in little-endian order.
560    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    /// Peeks a [u32] at a specific offset from the reader in big-endian order.
566    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    /// Peeks a [u64] at a specific offset from the reader in little-endian order.
572    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    /// Peeks a [u64] at a specific offset from the reader in big-endian order.
578    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    /// Peeks a [u128] at a specific offset from the reader in little-endian order.
584    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    /// Peeks a [u128] at a specific offset from the reader in big-endian order.
590    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    /// Peeks an [i8] at a specific offset from the reader.
596    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    /// Peeks an [i16] at a specific offset from the reader in little-endian order.
602    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    /// Peeks an [i16] at a specific offset from the reader in big-endian order.
608    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    /// Peeks an [i32] at a specific offset from the reader in little-endian order.
614    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    /// Peeks an [i32] at a specific offset from the reader in big-endian order.
620    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    /// Peeks an [i64] at a specific offset from the reader in little-endian order.
626    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    /// Peeks an [i64] at a specific offset from the reader in big-endian order.
632    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    /// Peeks an [i128] at a specific offset from the reader in little-endian order.
638    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    /// Peeks an [i128] at a specific offset from the reader in big-endian order.
644    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    /// Peeks a C-style string (null-terminated) from the reader.
651    fn cpeek_cstring(&self) -> Result<CString>;
652
653    /// Peeks a C-style string (null-terminated) from the reader at a specific offset.
654    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    /// Peeks data and checks if it matches the provided data.
666    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    /// Peeks data at a specific offset and checks if it matches the provided data.
678    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
714/// A trait to help to read data from a reader.
715pub trait ReadExt {
716    /// Reads a [u8] from the reader.
717    fn read_u8(&mut self) -> Result<u8>;
718    /// Reads a [u16] from the reader in little-endian order.
719    fn read_u16(&mut self) -> Result<u16>;
720    /// Reads a [u16] from the reader in big-endian order.
721    fn read_u16_be(&mut self) -> Result<u16>;
722    /// Reads a [u32] from the reader in little-endian order.
723    fn read_u32(&mut self) -> Result<u32>;
724    /// Reads a [u32] from the reader in big-endian order.
725    fn read_u32_be(&mut self) -> Result<u32>;
726    /// Reads a [u64] from the reader in little-endian order.
727    fn read_u64(&mut self) -> Result<u64>;
728    /// Reads a [u64] from the reader in big-endian order.
729    fn read_u64_be(&mut self) -> Result<u64>;
730    /// Reads a [u128] from the reader in little-endian order.
731    fn read_u128(&mut self) -> Result<u128>;
732    /// Reads a [u128] from the reader in big-endian order.
733    fn read_u128_be(&mut self) -> Result<u128>;
734    /// Reads an [i8] from the reader.
735    fn read_i8(&mut self) -> Result<i8>;
736    /// Reads an [i16] from the reader in little-endian order.
737    fn read_i16(&mut self) -> Result<i16>;
738    /// Reads an [i16] from the reader in big-endian order.
739    fn read_i16_be(&mut self) -> Result<i16>;
740    /// Reads an [i32] from the reader in little-endian order.
741    fn read_i32(&mut self) -> Result<i32>;
742    /// Reads an [i32] from the reader in big-endian order.
743    fn read_i32_be(&mut self) -> Result<i32>;
744    /// Reads an [i64] from the reader in little-endian order.
745    fn read_i64(&mut self) -> Result<i64>;
746    /// Reads an [i64] from the reader in big-endian order.
747    fn read_i64_be(&mut self) -> Result<i64>;
748    /// Reads an [i128] from the reader in little-endian order.
749    fn read_i128(&mut self) -> Result<i128>;
750    /// Reads an [i128] from the reader in big-endian order.
751    fn read_i128_be(&mut self) -> Result<i128>;
752    /// Reads a [f32] from the reader in little-endian order.
753    fn read_f32(&mut self) -> Result<f32>;
754    /// Reads a [f32] from the reader in big-endian order.
755    fn read_f32_be(&mut self) -> Result<f32>;
756    /// Reads a [f64] from the reader in little-endian order.
757    fn read_f64(&mut self) -> Result<f64>;
758    /// Reads a [f64] from the reader in big-endian order.
759    fn read_f64_be(&mut self) -> Result<f64>;
760
761    /// Reads a C-style string (null-terminated) from the reader.
762    fn read_cstring(&mut self) -> Result<CString>;
763    /// Reads a C-style string (null-terminated) from the reader with maximum length.
764    /// * `len` is the maximum length of the string to read.
765    /// * `encoding` specifies the encoding to use for the string.
766    /// * `trim` indicates whether to trim the string after the first null byte.
767    fn read_fstring(&mut self, len: usize, encoding: Encoding, trim: bool) -> Result<String>;
768
769    /// Reads some data from the reader into a vector.
770    fn read_exact_vec(&mut self, len: usize) -> Result<Vec<u8>>;
771
772    /// Reads data and checks if it matches the provided data.
773    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
933/// A trait to help to write data to a writer.
934pub trait WriteExt {
935    /// Writes a [u8] to the writer.
936    fn write_u8(&mut self, value: u8) -> Result<()>;
937    /// Writes a [u16] to the writer in little-endian order.
938    fn write_u16(&mut self, value: u16) -> Result<()>;
939    /// Writes a [u16] to the writer in big-endian order.
940    fn write_u16_be(&mut self, value: u16) -> Result<()>;
941    /// Writes a [u32] to the writer in little-endian order.
942    fn write_u32(&mut self, value: u32) -> Result<()>;
943    /// Writes a [u32] to the writer in big-endian order.
944    fn write_u32_be(&mut self, value: u32) -> Result<()>;
945    /// Writes a [u64] to the writer in little-endian order.
946    fn write_u64(&mut self, value: u64) -> Result<()>;
947    /// Writes a [u64] to the writer in big-endian order.
948    fn write_u64_be(&mut self, value: u64) -> Result<()>;
949    /// Writes a [u128] to the writer in little-endian order.
950    fn write_u128(&mut self, value: u128) -> Result<()>;
951    /// Writes a [u128] to the writer in big-endian order.
952    fn write_u128_be(&mut self, value: u128) -> Result<()>;
953    /// Writes an [i8] to the writer.
954    fn write_i8(&mut self, value: i8) -> Result<()>;
955    /// Writes an [i16] to the writer in little-endian order.
956    fn write_i16(&mut self, value: i16) -> Result<()>;
957    /// Writes an [i16] to the writer in big-endian order.
958    fn write_i16_be(&mut self, value: i16) -> Result<()>;
959    /// Writes an [i32] to the writer in little-endian order.
960    fn write_i32(&mut self, value: i32) -> Result<()>;
961    /// Writes an [i32] to the writer in big-endian order.
962    fn write_i32_be(&mut self, value: i32) -> Result<()>;
963    /// Writes an [i64] to the writer in little-endian order.
964    fn write_i64(&mut self, value: i64) -> Result<()>;
965    /// Writes an [i64] to the writer in big-endian order.
966    fn write_i64_be(&mut self, value: i64) -> Result<()>;
967    /// Writes an [i128] to the writer in little-endian order.
968    fn write_i128(&mut self, value: i128) -> Result<()>;
969    /// Writes an [i128] to the writer in big-endian order.
970    fn write_i128_be(&mut self, value: i128) -> Result<()>;
971
972    /// Writes a C-style string (null-terminated) to the writer.
973    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
1037/// A trait to help to write data to a writer at a specific offset.
1038pub trait WriteAt {
1039    /// Writes data to the writer at a specific offset.
1040    /// Returns the number of bytes written.
1041    fn write_at(&mut self, offset: u64, buf: &[u8]) -> Result<usize>;
1042    /// Writes all data to the writer at a specific offset.
1043    /// Returns an error if the write fails.
1044    fn write_all_at(&mut self, offset: u64, buf: &[u8]) -> Result<()>;
1045
1046    /// Writes a [u8] at a specific offset.
1047    fn write_u8_at(&mut self, offset: u64, value: u8) -> Result<()> {
1048        self.write_all_at(offset, &value.to_le_bytes())
1049    }
1050    /// Writes a [u16] at a specific offset in little-endian order.
1051    fn write_u16_at(&mut self, offset: u64, value: u16) -> Result<()> {
1052        self.write_all_at(offset, &value.to_le_bytes())
1053    }
1054    /// Writes a [u16] at a specific offset in big-endian order.
1055    fn write_u16_be_at(&mut self, offset: u64, value: u16) -> Result<()> {
1056        self.write_all_at(offset, &value.to_be_bytes())
1057    }
1058    /// Writes a [u32] at a specific offset in little-endian order.
1059    fn write_u32_at(&mut self, offset: u64, value: u32) -> Result<()> {
1060        self.write_all_at(offset, &value.to_le_bytes())
1061    }
1062    /// Writes a [u32] at a specific offset in big-endian order.
1063    fn write_u32_be_at(&mut self, offset: u64, value: u32) -> Result<()> {
1064        self.write_all_at(offset, &value.to_be_bytes())
1065    }
1066    /// Writes a [u64] at a specific offset in little-endian order.
1067    fn write_u64_at(&mut self, offset: u64, value: u64) -> Result<()> {
1068        self.write_all_at(offset, &value.to_le_bytes())
1069    }
1070    /// Writes a [u64] at a specific offset in big-endian order.
1071    fn write_u64_be_at(&mut self, offset: u64, value: u64) -> Result<()> {
1072        self.write_all_at(offset, &value.to_be_bytes())
1073    }
1074    /// Writes a [u128] at a specific offset in little-endian order.
1075    fn write_u128_at(&mut self, offset: u64, value: u128) -> Result<()> {
1076        self.write_all_at(offset, &value.to_le_bytes())
1077    }
1078    /// Writes a [u128] at a specific offset in big-endian order.
1079    fn write_u128_be_at(&mut self, offset: u64, value: u128) -> Result<()> {
1080        self.write_all_at(offset, &value.to_be_bytes())
1081    }
1082    /// Writes an [i8] at a specific offset.
1083    fn write_i8_at(&mut self, offset: u64, value: i8) -> Result<()> {
1084        self.write_all_at(offset, &value.to_le_bytes())
1085    }
1086    /// Writes an [i16] at a specific offset in little-endian order.
1087    fn write_i16_at(&mut self, offset: u64, value: i16) -> Result<()> {
1088        self.write_all_at(offset, &value.to_le_bytes())
1089    }
1090    /// Writes an [i16] at a specific offset in big-endian order.
1091    fn write_i16_be_at(&mut self, offset: u64, value: i16) -> Result<()> {
1092        self.write_all_at(offset, &value.to_be_bytes())
1093    }
1094    /// Writes an [i32] at a specific offset in little-endian order.
1095    fn write_i32_at(&mut self, offset: u64, value: i32) -> Result<()> {
1096        self.write_all_at(offset, &value.to_le_bytes())
1097    }
1098    /// Writes an [i32] at a specific offset in big-endian order.
1099    fn write_i32_be_at(&mut self, offset: u64, value: i32) -> Result<()> {
1100        self.write_all_at(offset, &value.to_be_bytes())
1101    }
1102    /// Writes an [i64] at a specific offset in little-endian order.
1103    fn write_i64_at(&mut self, offset: u64, value: i64) -> Result<()> {
1104        self.write_all_at(offset, &value.to_le_bytes())
1105    }
1106    /// Writes an [i64] at a specific offset in big-endian order.
1107    fn write_i64_be_at(&mut self, offset: u64, value: i64) -> Result<()> {
1108        self.write_all_at(offset, &value.to_be_bytes())
1109    }
1110    /// Writes an [i128] at a specific offset in little-endian order.
1111    fn write_i128_at(&mut self, offset: u64, value: i128) -> Result<()> {
1112        self.write_all_at(offset, &value.to_le_bytes())
1113    }
1114    /// Writes an [i128] at a specific offset in big-endian order.
1115    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    /// Writes a C-style string (null-terminated) at a specific offset.
1120    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
1143/// A trait to help to seek in a stream.
1144pub trait SeekExt {
1145    /// Returns the length of the stream.
1146    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
1158/// A memory reader that can read data from a vector of bytes.
1159pub struct MemReader {
1160    /// The data to read from.
1161    pub data: Vec<u8>,
1162    /// The current position in the data.
1163    pub pos: usize,
1164}
1165
1166/// A memory reader that can read data from a slice of bytes.
1167#[derive(Clone)]
1168pub struct MemReaderRef<'a> {
1169    /// The data to read from.
1170    pub data: &'a [u8],
1171    /// The current position in the data.
1172    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    /// Creates a new `MemReader` with the given data.
1195    pub fn new(data: Vec<u8>) -> Self {
1196        MemReader { data, pos: 0 }
1197    }
1198
1199    /// Creates a new [MemReaderRef] from the current data and position.
1200    pub fn to_ref<'a>(&'a self) -> MemReaderRef<'a> {
1201        MemReaderRef {
1202            data: &self.data,
1203            pos: self.pos,
1204        }
1205    }
1206
1207    /// Checks if the reader has reached the end of the data.
1208    pub fn is_eof(&self) -> bool {
1209        self.pos >= self.data.len()
1210    }
1211
1212    /// Returns the inner data of the reader.
1213    pub fn inner(self) -> Vec<u8> {
1214        self.data
1215    }
1216}
1217
1218impl<'a> MemReaderRef<'a> {
1219    /// Creates a new `MemReaderRef` with the given data.
1220    pub fn new(data: &'a [u8]) -> Self {
1221        MemReaderRef { data, pos: 0 }
1222    }
1223
1224    /// Checks if the reader has reached the end of the data.
1225    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
1393/// A memory writer that can write data to a vector of bytes.
1394pub struct MemWriter {
1395    /// The data to write to.
1396    pub data: Vec<u8>,
1397    /// The current position in the data.
1398    pub pos: usize,
1399}
1400
1401impl MemWriter {
1402    /// Creates a new `MemWriter` with an empty data vector.
1403    pub fn new() -> Self {
1404        MemWriter {
1405            data: Vec::new(),
1406            pos: 0,
1407        }
1408    }
1409
1410    /// Creates a new `MemWriter` with the given data.
1411    pub fn from_vec(data: Vec<u8>) -> Self {
1412        MemWriter { data, pos: 0 }
1413    }
1414
1415    /// Returns the inner data of the writer.
1416    pub fn into_inner(self) -> Vec<u8> {
1417        self.data
1418    }
1419
1420    /// Returns a reference to the inner data of the writer.
1421    pub fn as_slice(&self) -> &[u8] {
1422        &self.data
1423    }
1424
1425    /// Returns a new `MemReaderRef` that references the current data and position.
1426    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
1513/// A region of a stream that can be read/write and seeked within a specified range.
1514pub 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    /// Creates a new `StreamRegion` with the specified stream and position range.
1523    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    /// Creates a new `StreamRegion` with the specified stream and size.
1539    ///
1540    /// The start position is the current position of the stream, and the end position is calculated as `start_pos + size`.
1541    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    /// Creates a new `StreamRegion` with the specified stream and start position.
1548    /// The end position is determined by the length of the stream.
1549    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); // EOF
1559        }
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
1605/// A binary patcher that can be used to apply patches to binary data.
1606pub 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    /// Creates a new `BinaryPatcher` with the specified input and output streams.
1624    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    /// Copies data from the input stream to the output stream up to the specified address of original stream.
1642    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    /// Maps an original offset to a new offset in the output stream.
1656    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    /// Replaces bytes in the output stream with new data, starting from the current position in the input stream.
1705    ///
1706    /// * `original_length` - The length of the original data to be replaced.
1707    /// * `new_data` - The new data to write to the output stream.
1708    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    /// Replaces bytes in the output stream with new data, starting from the current position in the input stream.
1713    ///
1714    /// * `original_length` - The length of the original data to be replaced.
1715    /// * `write` - A function that writes the new data to the output stream.
1716    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    /// Patches a u32 address in the output stream at the specified original offset.
1743    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}