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, FileFullEaInformationCommon, 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// This is a wrapper around `FileFullEaInformationCommon` to implement `BinWrite` WITH NO ARGUMENTS for it.
30// This should ONLY be used when WRITING FOR SINGLE FILE INFRORMATION ENTRY!
31/// A [FileFullEaInformation](https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/0eb94f48-6aac-41df-a878-79f4dcfd8989)
32/// structure to be used when setting for extended attributes. You may use [super::QueryFileFullEaInformation] for querying.
33#[derive(BinRead, Debug, PartialEq, Eq)]
34pub struct SetFileFullEaInformation(FileFullEaInformationCommon);
35
36/// For internal use only - for file_info_classes! macro.
37/// Use [SetFileFullEaInformation] instead, or [super::QueryFileFullEaInformation] for querying.
38type FileFullEaInformation = SetFileFullEaInformation;
39
40impl BinWrite for SetFileFullEaInformation {
41    type Args<'a> = ();
42
43    fn write_options<W: std::io::Write + std::io::Seek>(
44        &self,
45        writer: &mut W,
46        endian: binrw::Endian,
47        _args: Self::Args<'_>,
48    ) -> BinResult<()> {
49        // last = true.
50        self.0.write_options(writer, endian, (true,))
51    }
52}
53
54#[binrw::binrw]
55#[derive(Debug, PartialEq, Eq)]
56pub struct FileEndOfFileInformation {
57    pub end_of_file: u64,
58}
59
60#[binrw::binrw]
61#[derive(Debug, PartialEq, Eq)]
62pub struct FileDispositionInformation {
63    /// **Note:** Default is TRUE
64    pub delete_pending: Boolean,
65}
66
67impl Default for FileDispositionInformation {
68    fn default() -> Self {
69        Self {
70            delete_pending: true.into(),
71        }
72    }
73}
74
75#[binrw::binrw]
76#[derive(Debug, PartialEq, Eq)]
77pub struct FileRenameInformation2 {
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    pub root_directory: u64,
86    #[bw(try_calc = file_name.size().try_into())]
87    _file_name_length: u32,
88    #[br(args(_file_name_length as u64))]
89    pub file_name: SizedWideString,
90}
91type FileRenameInformation = FileRenameInformation2;
92
93#[binrw::binrw]
94#[derive(Debug, PartialEq, Eq)]
95pub struct FileAllocationInformation {
96    pub allocation_size: u64,
97}
98
99/// 2.4.27.2 - FileLinkInformation for SMB2 protocol
100#[binrw::binrw]
101#[derive(Debug, PartialEq, Eq)]
102pub struct FileLinkInformation {
103    pub replace_if_exists: Boolean,
104    #[bw(calc = 0)]
105    _reserved: u8,
106    #[bw(calc = 0)]
107    _reserved2: u16,
108    #[bw(calc = 0)]
109    _reserved3: u32,
110    // "For network operations, this value must be zero"
111    #[bw(calc = 0)]
112    #[br(assert(root_directory == 0))]
113    root_directory: u64,
114    #[bw(try_calc = file_name.size().try_into())]
115    _file_name_length: u32,
116    #[br(args(_file_name_length as u64))]
117    pub file_name: SizedWideString,
118}
119
120#[binrw::binrw]
121#[derive(Debug, PartialEq, Eq)]
122pub struct FileShortNameInformation {
123    inner: FileNameInformation,
124}
125
126impl Deref for FileShortNameInformation {
127    type Target = FileNameInformation;
128
129    fn deref(&self) -> &Self::Target {
130        &self.inner
131    }
132}
133
134#[binrw::binrw]
135#[derive(Debug, PartialEq, Eq)]
136pub struct FileValidDataLengthInformation {
137    pub valid_data_length: u64,
138}