Skip to main content

wireforge_app/smb2/
header.rs

1use super::types::Smb2Command;
2pub const SMB2_HEADER_LEN: usize = 64;
3#[derive(Debug, Clone)]
4pub struct Smb2Header<'a> { buf: &'a [u8] }
5impl<'a> Smb2Header<'a> {
6    pub fn parse(buf:&'a[u8])->Option<Self>{
7        if buf.len() < SMB2_HEADER_LEN { return None; }
8        if &buf[4..8] != b"\xfeSMB" { return None; }
9        Some(Self{buf})
10    }
11    pub fn command(&self)->Smb2Command { Smb2Command::from(u16::from_le_bytes([self.buf[12],self.buf[13]])) }
12    pub fn status(&self)->u32 { u32::from_le_bytes([self.buf[8],self.buf[9],self.buf[10],self.buf[11]]) }
13    pub fn credits(&self)->u16 { u16::from_le_bytes([self.buf[14],self.buf[15]]) }
14    pub fn message_id(&self)->u64 { u64::from_le_bytes(self.buf[24..32].try_into().unwrap()) }
15    pub fn session_id(&self)->u64 { u64::from_le_bytes(self.buf[40..48].try_into().unwrap()) }
16    pub fn body(&self)->&'a[u8] { &self.buf[SMB2_HEADER_LEN..] }
17}
18
19#[cfg(test)]mod tests{use super::*;
20    #[test]fn parse_smb2_header(){
21        let mut hdr=[0u8;64];hdr[4..8].copy_from_slice(b"\xfeSMB");hdr[12]=0; // Negotiate
22        let h=Smb2Header::parse(&hdr).unwrap();
23        assert_eq!(h.command(),Smb2Command::Negotiate);
24    }
25}