smb_msg/ioctl/
common.rs

1use std::ops::{Deref, DerefMut};
2
3/// A trait that helps calculating the size of the buffer for IOCTL requests.
4// TODO: Make sure it is tested for all types of IOCTL requests.
5pub trait IoctlRequestContent {
6    /// Returns the size of the buffer for IOCTL requests -- the size of the ENCODED data, in bytes.
7    fn get_bin_size(&self) -> u32;
8}
9
10impl IoctlRequestContent for () {
11    fn get_bin_size(&self) -> u32 {
12        0
13    }
14}
15
16#[binrw::binrw]
17#[derive(Debug, PartialEq, Eq)]
18pub struct IoctlBuffer {
19    #[br(parse_with = binrw::helpers::until_eof)]
20    buffer: Vec<u8>,
21}
22
23impl From<Vec<u8>> for IoctlBuffer {
24    fn from(buffer: Vec<u8>) -> Self {
25        Self { buffer }
26    }
27}
28
29impl From<&[u8]> for IoctlBuffer {
30    fn from(buffer: &[u8]) -> Self {
31        Self {
32            buffer: buffer.to_vec(),
33        }
34    }
35}
36
37impl IoctlRequestContent for IoctlBuffer {
38    fn get_bin_size(&self) -> u32 {
39        self.len() as u32
40    }
41}
42
43impl Deref for IoctlBuffer {
44    type Target = Vec<u8>;
45
46    fn deref(&self) -> &Self::Target {
47        &self.buffer
48    }
49}
50
51impl DerefMut for IoctlBuffer {
52    fn deref_mut(&mut self) -> &mut Self::Target {
53        &mut self.buffer
54    }
55}