smb_fscc/
set_file_info.rs1use 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#[derive(BinRead, Debug, PartialEq, Eq)]
34pub struct SetFileFullEaInformation(FileFullEaInformationCommon);
35
36type 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 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 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#[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 #[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}