Skip to content

Commit c519aa7

Browse files
committed
Switch to SMB2_FILEID for file IDs instead of GUIDs
1 parent dc11c3b commit c519aa7

File tree

11 files changed

+84
-38
lines changed

11 files changed

+84
-38
lines changed

smb/src/packets/guid.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ impl TryFrom<&[u8; 16]> for Guid {
3939
}
4040
}
4141

42+
impl Into<[u8; 16]> for Guid {
43+
fn into(self) -> [u8; 16] {
44+
let mut cursor = Cursor::new(Vec::new());
45+
self.write(&mut cursor).unwrap();
46+
cursor.into_inner().try_into().unwrap()
47+
}
48+
}
49+
4250
impl FromStr for Guid {
4351
type Err = ();
4452

smb/src/packets/smb2/create.rs

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Create & Close (files) requests and responses.
22
3-
use std::io::SeekFrom;
3+
use std::io::{Cursor, SeekFrom};
44

55
use super::super::binrw_util::prelude::*;
66
use super::super::guid::Guid;
@@ -10,6 +10,36 @@ use binrw::io::TakeSeekExt;
1010
use binrw::prelude::*;
1111
use modular_bitfield::prelude::*;
1212

13+
/// 2.2.14.1: SMB2_FILEID
14+
#[binrw::binrw]
15+
#[derive(Debug, PartialEq, Eq, Clone, Copy, Default)]
16+
pub struct FileId {
17+
pub persistent: u64,
18+
pub volatile: u64,
19+
}
20+
21+
impl FileId {
22+
pub const EMPTY: FileId = FileId {
23+
persistent: 0,
24+
volatile: 0,
25+
};
26+
}
27+
28+
impl From<[u8; 16]> for FileId {
29+
fn from(data: [u8; 16]) -> Self {
30+
let mut cursor = Cursor::new(data);
31+
Self::read_le(&mut cursor).unwrap()
32+
}
33+
}
34+
35+
impl From<Guid> for FileId {
36+
fn from(guid: Guid) -> Self {
37+
let mut cursor = Cursor::new(Vec::new());
38+
guid.write_le(&mut cursor).unwrap();
39+
<Self as From<[u8; 16]>>::from(cursor.into_inner().try_into().unwrap())
40+
}
41+
}
42+
1343
#[binrw::binrw]
1444
#[derive(Debug)]
1545
pub struct CreateRequest {
@@ -145,7 +175,7 @@ pub struct CreateResponse {
145175
#[bw(calc = 0)]
146176
#[br(assert(_reserved2 == 0))]
147177
_reserved2: u32,
148-
pub file_id: Guid,
178+
pub file_id: FileId,
149179
// assert it's 8-aligned
150180
#[br(assert(create_contexts_offset.value & 0x7 == 0))]
151181
#[bw(calc = PosMarker::default())]
@@ -512,7 +542,7 @@ pub struct DurableHandleV2Flags {
512542
#[binrw::binrw]
513543
#[derive(Debug, PartialEq, Eq)]
514544
pub struct DurableHandleReconnectV2 {
515-
file_id: Guid,
545+
file_id: FileId,
516546
create_guid: Guid,
517547
flags: DurableHandleV2Flags,
518548
}
@@ -632,7 +662,7 @@ pub struct CloseRequest {
632662
#[bw(calc = 0)]
633663
#[br(assert(_reserved == 0))]
634664
_reserved: u32,
635-
pub file_id: Guid,
665+
pub file_id: FileId,
636666
}
637667

638668
#[binrw::binrw]

smb/src/packets/smb2/file.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use binrw::prelude::*;
66
use modular_bitfield::prelude::*;
77

88
use super::super::binrw_util::prelude::*;
9-
use super::super::guid::Guid;
109
use super::header::Header;
10+
use super::FileId;
1111

1212
#[binrw::binrw]
1313
#[derive(Debug)]
@@ -21,7 +21,7 @@ pub struct FlushRequest {
2121
#[bw(calc = 0)]
2222
#[br(assert(_reserved2 == 0))]
2323
_reserved2: u32,
24-
pub file_id: Guid,
24+
pub file_id: FileId,
2525
}
2626

2727
#[binrw::binrw]
@@ -45,7 +45,7 @@ pub struct ReadRequest {
4545
pub flags: ReadFlags,
4646
pub length: u32,
4747
pub offset: u64,
48-
pub file_id: Guid,
48+
pub file_id: FileId,
4949
pub minimum_count: u32,
5050
// Currently, we do not have support for RDMA.
5151
// Therefore, all the related fields are set to zero.
@@ -137,7 +137,7 @@ pub struct WriteRequest {
137137
#[bw(try_calc = buffer.len().try_into())]
138138
_length: u32,
139139
pub offset: u64,
140-
pub file_id: Guid,
140+
pub file_id: FileId,
141141
// Again, RDMA off, all 0.
142142
#[bw(calc = CommunicationChannel::None)]
143143
#[br(assert(channel == CommunicationChannel::None))]

smb/src/packets/smb2/info/query.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
//! Get/Set Info Request/Response
22
3-
use crate::packets::smb2::{SecurityDescriptor, SID};
3+
use crate::packets::smb2::{FileId, SecurityDescriptor, SID};
44
use crate::query_info_data;
55
use binrw::{io::TakeSeekExt, prelude::*};
66
use modular_bitfield::prelude::*;
77
use std::io::{Cursor, SeekFrom};
88

9-
use super::super::{super::binrw_util::prelude::*, super::guid::Guid, fscc::*};
9+
use super::super::{super::binrw_util::prelude::*, fscc::*};
1010
use super::common::*;
1111

1212
#[binrw::binrw]
@@ -29,7 +29,7 @@ pub struct QueryInfoRequest {
2929
input_buffer_length: PosMarker<u32>,
3030
pub additional_information: AdditionalInfo,
3131
pub flags: QueryInfoFlags,
32-
pub file_id: Guid,
32+
pub file_id: FileId,
3333
#[br(map_stream = |s| s.take_seek(input_buffer_length.value as u64))]
3434
#[br(args(&info_class, info_type))]
3535
#[bw(write_with = PosMarker::write_aoff_size_a, args(&_input_buffer_offset, &input_buffer_length, (info_class, *info_type)))]
@@ -276,7 +276,7 @@ mod tests {
276276
.with_dacl_security_information(true)
277277
.with_sacl_security_information(true),
278278
flags: QueryInfoFlags::new(),
279-
file_id: Guid::from_str("0000002b-000d-0000-3100-00000d000000").unwrap(),
279+
file_id: Guid::from_str("0000002b-000d-0000-3100-00000d000000").unwrap().into(),
280280
data: GetInfoRequestData::None(()),
281281
}));
282282
assert_eq!(

smb/src/packets/smb2/info/set.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
//! SMB2 Set Info Request/Response messages.
22
3+
use crate::packets::smb2::FileId;
34
use crate::{packets::smb2::SecurityDescriptor, query_info_data};
45

56
use super::common::*;
67
use super::{
78
super::{
8-
super::{binrw_util::prelude::*, guid::Guid},
9+
super::binrw_util::prelude::*,
910
fscc::*,
1011
},
1112
QueryQuotaInfo,
@@ -30,7 +31,7 @@ pub struct SetInfoRequest {
3031
#[br(assert(_reserved == 0))]
3132
_reserved: u16,
3233
pub additional_information: AdditionalInfo,
33-
pub file_id: Guid,
34+
pub file_id: FileId,
3435
#[br(map_stream = |s| s.take_seek(buffer_length.value as u64))]
3536
#[br(args(info_type))]
3637
#[bw(write_with = PosMarker::write_aoff_size, args(&_buffer_offset, &buffer_length))]
@@ -46,7 +47,7 @@ query_info_data! {
4647
}
4748

4849
impl SetInfoData {
49-
pub fn to_req(self, info_class: SetFileInfoClass, file_id: Guid) -> SetInfoRequest {
50+
pub fn to_req(self, info_class: SetFileInfoClass, file_id: FileId) -> SetInfoRequest {
5051
SetInfoRequest {
5152
info_class: info_class,
5253
additional_information: AdditionalInfo::new(),
@@ -66,6 +67,8 @@ pub struct SetInfoResponse {
6667

6768
#[cfg(test)]
6869
mod tests {
70+
use std::str::FromStr;
71+
6972
use crate::packets::smb2::*;
7073

7174
use super::*;
@@ -79,8 +82,12 @@ mod tests {
7982
});
8083

8184
let cls = set_info.class();
82-
let req = SetInfoData::from(RawSetInfoData::<SetFileInfo>::from(set_info))
83-
.to_req(cls, "00000042-000e-0000-0500-10000e000000".parse().unwrap());
85+
let req = SetInfoData::from(RawSetInfoData::<SetFileInfo>::from(set_info)).to_req(
86+
cls,
87+
Guid::from_str("00000042-000e-0000-0500-10000e000000")
88+
.unwrap()
89+
.into(),
90+
);
8491
let req_data = encode_content(Content::SetInfoRequest(req));
8592
assert_eq!(
8693
req_data,

smb/src/packets/smb2/ioctl.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use binrw::prelude::*;
22
use modular_bitfield::prelude::*;
33
use std::io::SeekFrom;
44

5-
use super::super::guid::Guid;
5+
use super::FileId;
66
use crate::packets::binrw_util::prelude::*;
77

88
#[binrw::binrw]
@@ -15,7 +15,7 @@ pub struct IoctlRequest {
1515
#[br(assert(_reserved == 0))]
1616
_reserved: u16,
1717
pub ctl_code: u32,
18-
pub file_id: Guid,
18+
pub file_id: FileId,
1919
#[bw(calc = PosMarker::default())]
2020
_input_offset: PosMarker<u32>,
2121
#[bw(try_calc = buffer.len().try_into())]
@@ -57,7 +57,7 @@ pub struct IoctlResponse {
5757
#[br(assert(_reserved == 0))]
5858
_reserved: u16,
5959
pub ctl_code: u32,
60-
pub file_id: Guid,
60+
pub file_id: FileId,
6161
#[bw(calc = PosMarker::default())]
6262
input_offset: PosMarker<u32>,
6363
#[bw(assert(out_buffer.len() == 0))] // there is an exception for pass-through operations.

smb/src/packets/smb2/lock.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::super::guid::Guid;
1+
use super::FileId;
22
use binrw::prelude::*;
33
use modular_bitfield::prelude::*;
44

@@ -11,7 +11,7 @@ pub struct LockRequest {
1111
#[bw(try_calc = locks.len().try_into())]
1212
lock_count: u16,
1313
pub lock_sequence: LockSequence,
14-
pub file_id: Guid,
14+
pub file_id: FileId,
1515
#[br(count = lock_count)]
1616
pub locks: Vec<LockElement>,
1717
}

smb/src/packets/smb2/notify.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ use binrw::io::TakeSeekExt;
44
use binrw::prelude::*;
55
use modular_bitfield::prelude::*;
66

7-
use super::super::guid::Guid;
8-
use super::fscc::*;
7+
use super::{fscc::*, FileId};
98
use crate::packets::binrw_util::prelude::*;
109

1110
#[binrw::binrw]
@@ -16,7 +15,7 @@ pub struct ChangeNotifyRequest {
1615
_structure_size: u16,
1716
flags: NotifyFlags,
1817
output_buffer_length: u32,
19-
file_id: Guid,
18+
file_id: FileId,
2019
completion_filter: NotifyFilter,
2120
#[br(assert(_reserved == 0))]
2221
#[bw(calc = 0)]
@@ -74,7 +73,7 @@ pub struct ChangeNotifyResponse {
7473
mod tests {
7574
use std::io::Cursor;
7675

77-
use crate::packets::smb2::*;
76+
use crate::packets::{guid::Guid, smb2::*};
7877

7978
use super::*;
8079

@@ -83,7 +82,10 @@ mod tests {
8382
let request = ChangeNotifyRequest {
8483
flags: NotifyFlags::new(),
8584
output_buffer_length: 2048,
86-
file_id: "000005d1-000c-0000-1900-00000c000000".parse().unwrap(),
85+
file_id: "000005d1-000c-0000-1900-00000c000000"
86+
.parse::<Guid>()
87+
.unwrap()
88+
.into(),
8789
completion_filter: NotifyFilter::new()
8890
.with_file_name(true)
8991
.with_dir_name(true)

smb/src/packets/smb2/oplock.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use super::super::guid::Guid;
1+
use super::{super::guid::Guid, FileId};
22
use binrw::prelude::*;
33
use modular_bitfield::prelude::*;
44

@@ -15,7 +15,7 @@ pub struct OplockBreakMsg {
1515
#[bw(calc = 0)]
1616
#[br(assert(reserved2 == 0))]
1717
reserved2: u32,
18-
file_id: Guid,
18+
file_id: FileId,
1919
}
2020

2121
#[binrw::binrw]

smb/src/packets/smb2/query_dir.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,8 @@ use binrw::prelude::*;
77
use modular_bitfield::prelude::*;
88

99
use super::super::binrw_util::prelude::*;
10-
use super::super::guid::Guid;
1110

12-
use super::fscc::*;
11+
use super::{fscc::*, FileId};
1312

1413
#[binrw::binrw]
1514
#[derive(Debug)]
@@ -23,7 +22,7 @@ pub struct QueryDirectoryRequest {
2322
// Otherwise, it MUST be set to zero and the server MUST ignore it.
2423
#[bw(assert(flags.index_specified() || *file_index == 0))]
2524
pub file_index: u32,
26-
pub file_id: Guid,
25+
pub file_id: FileId,
2726
#[bw(calc = PosMarker::default())]
2827
pub file_name_offset: PosMarker<u16>,
2928
#[bw(try_calc = file_name.size().try_into())]

0 commit comments

Comments
 (0)