smb_fscc/
set_file_info.rs

1use std::ops::Deref;
2
3use crate::file_info_classes;
4
5use smb_dtyp::binrw_util::prelude::{Boolean, SizedWideString};
6
7use super::{
8    FileBasicInformation, FileFullEaInformation, FileModeInformation, FileNameInformation,
9    FilePipeInformation, FilePositionInformation,
10};
11
12file_info_classes! {
13    pub SetFileInfo {
14        pub Allocation = 19,
15        pub Basic = 4,
16        pub Disposition = 13,
17        pub EndOfFile = 20,
18        pub FullEa = 15,
19        pub Link = 11,
20        pub Mode = 16,
21        pub Pipe = 23,
22        pub Position = 14,
23        pub Rename = 10,
24        pub ShortName = 40,
25        pub ValidDataLength = 39,
26    }, Write
27}
28
29#[binrw::binrw]
30#[derive(Debug, PartialEq, Eq)]
31pub struct FileEndOfFileInformation {
32    pub end_of_file: u64,
33}
34
35#[binrw::binrw]
36#[derive(Debug, PartialEq, Eq)]
37pub struct FileDispositionInformation {
38    /// **Note:** Default is TRUE
39    pub delete_pending: Boolean,
40}
41
42impl Default for FileDispositionInformation {
43    fn default() -> Self {
44        Self {
45            delete_pending: true.into(),
46        }
47    }
48}
49
50#[binrw::binrw]
51#[derive(Debug, PartialEq, Eq)]
52pub struct FileRenameInformation2 {
53    pub replace_if_exists: Boolean,
54    #[bw(calc = 0)]
55    _reserved: u8,
56    #[bw(calc = 0)]
57    _reserved2: u16,
58    #[bw(calc = 0)]
59    _reserved3: u32,
60    pub root_directory: u64,
61    #[bw(try_calc = file_name.size().try_into())]
62    _file_name_length: u32,
63    #[br(args(_file_name_length as u64))]
64    pub file_name: SizedWideString,
65}
66type FileRenameInformation = FileRenameInformation2;
67
68#[binrw::binrw]
69#[derive(Debug, PartialEq, Eq)]
70pub struct FileAllocationInformation {
71    pub allocation_size: u64,
72}
73
74/// 2.4.27.2 - FileLinkInformation for SMB2 protocol
75#[binrw::binrw]
76#[derive(Debug, PartialEq, Eq)]
77pub struct FileLinkInformation {
78    pub replace_if_exists: Boolean,
79    #[bw(calc = 0)]
80    _reserved: u8,
81    #[bw(calc = 0)]
82    _reserved2: u16,
83    #[bw(calc = 0)]
84    _reserved3: u32,
85    // "For network operations, this value must be zero"
86    #[bw(calc = 0)]
87    #[br(assert(root_directory == 0))]
88    root_directory: u64,
89    #[bw(try_calc = file_name.size().try_into())]
90    _file_name_length: u32,
91    #[br(args(_file_name_length as u64))]
92    pub file_name: SizedWideString,
93}
94
95#[binrw::binrw]
96#[derive(Debug, PartialEq, Eq)]
97pub struct FileShortNameInformation {
98    inner: FileNameInformation,
99}
100
101impl Deref for FileShortNameInformation {
102    type Target = FileNameInformation;
103
104    fn deref(&self) -> &Self::Target {
105        &self.inner
106    }
107}
108
109#[binrw::binrw]
110#[derive(Debug, PartialEq, Eq)]
111pub struct FileValidDataLengthInformation {
112    pub valid_data_length: u64,
113}