1a90cf9f2SGordon Ross /*
2a90cf9f2SGordon Ross * This file and its contents are supplied under the terms of the
3a90cf9f2SGordon Ross * Common Development and Distribution License ("CDDL"), version 1.0.
4a90cf9f2SGordon Ross * You may only use this file in accordance with the terms of version
5a90cf9f2SGordon Ross * 1.0 of the CDDL.
6a90cf9f2SGordon Ross *
7a90cf9f2SGordon Ross * A full copy of the text of the CDDL should have accompanied this
8a90cf9f2SGordon Ross * source. A copy of the CDDL is also available via the Internet at
9a90cf9f2SGordon Ross * http://www.illumos.org/license/CDDL.
10a90cf9f2SGordon Ross */
11a90cf9f2SGordon Ross
12a90cf9f2SGordon Ross /*
1325a9a7aaSGordon Ross * Copyright 2019 Nexenta by DDN, Inc. All rights reserved.
14516334b5SMatt Barden * Copyright 2022-2023 RackTop Systems, Inc.
15a90cf9f2SGordon Ross */
16a90cf9f2SGordon Ross
17a90cf9f2SGordon Ross /*
18a90cf9f2SGordon Ross * Dispatch function for SMB2_QUERY_INFO
19a90cf9f2SGordon Ross *
20a90cf9f2SGordon Ross * [MS-FSCC 2.4] If a file system does not support ...
21a90cf9f2SGordon Ross * an Information Classs, NT_STATUS_INVALID_PARAMETER...
22a90cf9f2SGordon Ross */
23a90cf9f2SGordon Ross
24a90cf9f2SGordon Ross #include <smbsrv/smb2_kproto.h>
25a90cf9f2SGordon Ross #include <smbsrv/smb_fsops.h>
26a90cf9f2SGordon Ross #include <smbsrv/ntifs.h>
27a90cf9f2SGordon Ross
28a90cf9f2SGordon Ross static uint32_t smb2_qif_basic(smb_request_t *, smb_queryinfo_t *);
29a90cf9f2SGordon Ross static uint32_t smb2_qif_standard(smb_request_t *, smb_queryinfo_t *);
30a90cf9f2SGordon Ross static uint32_t smb2_qif_internal(smb_request_t *, smb_queryinfo_t *);
31a90cf9f2SGordon Ross static uint32_t smb2_qif_ea_size(smb_request_t *, smb_queryinfo_t *);
32a90cf9f2SGordon Ross static uint32_t smb2_qif_access(smb_request_t *, smb_queryinfo_t *);
33a90cf9f2SGordon Ross static uint32_t smb2_qif_name(smb_request_t *, smb_queryinfo_t *);
343cfbf5beSGordon Ross static uint32_t smb2_qif_normalized_name(smb_request_t *, smb_queryinfo_t *);
35a90cf9f2SGordon Ross static uint32_t smb2_qif_position(smb_request_t *, smb_queryinfo_t *);
36a90cf9f2SGordon Ross static uint32_t smb2_qif_full_ea(smb_request_t *, smb_queryinfo_t *);
37a90cf9f2SGordon Ross static uint32_t smb2_qif_mode(smb_request_t *, smb_queryinfo_t *);
38a90cf9f2SGordon Ross static uint32_t smb2_qif_alignment(smb_request_t *, smb_queryinfo_t *);
39a90cf9f2SGordon Ross static uint32_t smb2_qif_all(smb_request_t *, smb_queryinfo_t *);
40a90cf9f2SGordon Ross static uint32_t smb2_qif_altname(smb_request_t *, smb_queryinfo_t *);
41a90cf9f2SGordon Ross static uint32_t smb2_qif_stream(smb_request_t *, smb_queryinfo_t *);
42a90cf9f2SGordon Ross static uint32_t smb2_qif_pipe(smb_request_t *, smb_queryinfo_t *);
43a90cf9f2SGordon Ross static uint32_t smb2_qif_pipe_lcl(smb_request_t *, smb_queryinfo_t *);
44a90cf9f2SGordon Ross static uint32_t smb2_qif_pipe_rem(smb_request_t *, smb_queryinfo_t *);
45a90cf9f2SGordon Ross static uint32_t smb2_qif_compr(smb_request_t *, smb_queryinfo_t *);
46a90cf9f2SGordon Ross static uint32_t smb2_qif_opens(smb_request_t *, smb_queryinfo_t *);
47a90cf9f2SGordon Ross static uint32_t smb2_qif_tags(smb_request_t *, smb_queryinfo_t *);
482266458aSGordon Ross static uint32_t smb2_qif_id_info(smb_request_t *, smb_queryinfo_t *);
49a90cf9f2SGordon Ross
50516334b5SMatt Barden /*
51516334b5SMatt Barden * MS-SMB2 3.3.5.20.1 says (in a windows behavior note) that
52516334b5SMatt Barden * 2012R2 and older fill in the FileNameInformation.
53516334b5SMatt Barden * Default to the new behavior.
54516334b5SMatt Barden */
55516334b5SMatt Barden boolean_t smb2_qif_all_get_name = B_FALSE;
56a90cf9f2SGordon Ross
57a90cf9f2SGordon Ross uint32_t
smb2_qinfo_file(smb_request_t * sr,smb_queryinfo_t * qi)58a90cf9f2SGordon Ross smb2_qinfo_file(smb_request_t *sr, smb_queryinfo_t *qi)
59a90cf9f2SGordon Ross {
60a90cf9f2SGordon Ross smb_ofile_t *of = sr->fid_ofile;
61a90cf9f2SGordon Ross uint_t mask = 0;
62a90cf9f2SGordon Ross boolean_t getstd = B_FALSE;
63a90cf9f2SGordon Ross boolean_t getname = B_FALSE;
64a90cf9f2SGordon Ross uint32_t status;
65a90cf9f2SGordon Ross
66a90cf9f2SGordon Ross /*
67a90cf9f2SGordon Ross * Which attributes do we need from the FS?
68a90cf9f2SGordon Ross */
69a90cf9f2SGordon Ross switch (qi->qi_InfoClass) {
70a90cf9f2SGordon Ross case FileBasicInformation:
71a90cf9f2SGordon Ross mask = SMB_AT_BASIC;
72a90cf9f2SGordon Ross break;
73a90cf9f2SGordon Ross case FileStandardInformation:
74a90cf9f2SGordon Ross mask = SMB_AT_STANDARD;
75a90cf9f2SGordon Ross getstd = B_TRUE;
76a90cf9f2SGordon Ross break;
77a90cf9f2SGordon Ross case FileInternalInformation:
78a90cf9f2SGordon Ross mask = SMB_AT_NODEID;
79a90cf9f2SGordon Ross break;
80a90cf9f2SGordon Ross case FileAllInformation:
81a90cf9f2SGordon Ross mask = SMB_AT_ALL;
82a90cf9f2SGordon Ross getstd = B_TRUE;
83516334b5SMatt Barden if (smb2_qif_all_get_name)
84cf56021bSGordon Ross getname = B_TRUE;
85a90cf9f2SGordon Ross break;
86a90cf9f2SGordon Ross
87a90cf9f2SGordon Ross case FileNameInformation:
883cfbf5beSGordon Ross case FileNormalizedNameInformation:
89a90cf9f2SGordon Ross getname = B_TRUE;
90a90cf9f2SGordon Ross break;
91a90cf9f2SGordon Ross
92a90cf9f2SGordon Ross case FileAlternateNameInformation:
93a90cf9f2SGordon Ross mask = SMB_AT_NODEID;
94a90cf9f2SGordon Ross getname = B_TRUE;
95a90cf9f2SGordon Ross break;
96a90cf9f2SGordon Ross
97a90cf9f2SGordon Ross case FileStreamInformation:
98a90cf9f2SGordon Ross mask = SMB_AT_STANDARD;
99d082c877SGordon Ross getstd = B_TRUE;
100a90cf9f2SGordon Ross break;
101a90cf9f2SGordon Ross
102a90cf9f2SGordon Ross case FileCompressionInformation:
103a90cf9f2SGordon Ross mask = SMB_AT_SIZE | SMB_AT_ALLOCSZ;
104a90cf9f2SGordon Ross break;
105a90cf9f2SGordon Ross
106a90cf9f2SGordon Ross case FileNetworkOpenInformation:
107a90cf9f2SGordon Ross mask = SMB_AT_BASIC | SMB_AT_STANDARD;
1082266458aSGordon Ross break;
1092266458aSGordon Ross
1102266458aSGordon Ross case FileIdInformation:
1112266458aSGordon Ross mask = SMB_AT_NODEID;
1122266458aSGordon Ross break;
113a90cf9f2SGordon Ross
114a90cf9f2SGordon Ross default:
115a90cf9f2SGordon Ross break;
116a90cf9f2SGordon Ross }
117a90cf9f2SGordon Ross
118a90cf9f2SGordon Ross qi->qi_attr.sa_mask = mask;
119a90cf9f2SGordon Ross qi->qi_node = of->f_node;
120a90cf9f2SGordon Ross if (mask & SMB_AT_ALL) {
121a90cf9f2SGordon Ross status = smb2_ofile_getattr(sr, of, &qi->qi_attr);
122a90cf9f2SGordon Ross if (status)
123a90cf9f2SGordon Ross return (status);
124a90cf9f2SGordon Ross }
125a90cf9f2SGordon Ross if (getstd) {
126a90cf9f2SGordon Ross status = smb2_ofile_getstd(of, qi);
127a90cf9f2SGordon Ross if (status)
128a90cf9f2SGordon Ross return (status);
129a90cf9f2SGordon Ross }
130a90cf9f2SGordon Ross if (getname) {
131a90cf9f2SGordon Ross status = smb2_ofile_getname(of, qi);
132a90cf9f2SGordon Ross if (status)
133a90cf9f2SGordon Ross return (status);
134a90cf9f2SGordon Ross }
135a90cf9f2SGordon Ross
136a90cf9f2SGordon Ross switch (qi->qi_InfoClass) {
137a90cf9f2SGordon Ross case FileBasicInformation:
138a90cf9f2SGordon Ross status = smb2_qif_basic(sr, qi);
139a90cf9f2SGordon Ross break;
140a90cf9f2SGordon Ross case FileStandardInformation:
141a90cf9f2SGordon Ross status = smb2_qif_standard(sr, qi);
142a90cf9f2SGordon Ross break;
143a90cf9f2SGordon Ross case FileInternalInformation:
144a90cf9f2SGordon Ross status = smb2_qif_internal(sr, qi);
145a90cf9f2SGordon Ross break;
146a90cf9f2SGordon Ross case FileEaInformation:
147a90cf9f2SGordon Ross status = smb2_qif_ea_size(sr, qi);
148a90cf9f2SGordon Ross break;
149a90cf9f2SGordon Ross case FileAccessInformation:
150a90cf9f2SGordon Ross status = smb2_qif_access(sr, qi);
151a90cf9f2SGordon Ross break;
152a90cf9f2SGordon Ross case FileNameInformation:
153a90cf9f2SGordon Ross status = smb2_qif_name(sr, qi);
154a90cf9f2SGordon Ross break;
1553cfbf5beSGordon Ross case FileNormalizedNameInformation:
1563cfbf5beSGordon Ross status = smb2_qif_normalized_name(sr, qi);
1573cfbf5beSGordon Ross break;
158a90cf9f2SGordon Ross case FilePositionInformation:
159a90cf9f2SGordon Ross status = smb2_qif_position(sr, qi);
160a90cf9f2SGordon Ross break;
161a90cf9f2SGordon Ross case FileFullEaInformation:
162a90cf9f2SGordon Ross status = smb2_qif_full_ea(sr, qi);
163a90cf9f2SGordon Ross break;
164a90cf9f2SGordon Ross case FileModeInformation:
165a90cf9f2SGordon Ross status = smb2_qif_mode(sr, qi);
166a90cf9f2SGordon Ross break;
167a90cf9f2SGordon Ross case FileAlignmentInformation:
168a90cf9f2SGordon Ross status = smb2_qif_alignment(sr, qi);
169a90cf9f2SGordon Ross break;
170a90cf9f2SGordon Ross case FileAllInformation:
171a90cf9f2SGordon Ross status = smb2_qif_all(sr, qi);
172a90cf9f2SGordon Ross break;
173a90cf9f2SGordon Ross case FileAlternateNameInformation:
174a90cf9f2SGordon Ross status = smb2_qif_altname(sr, qi);
175a90cf9f2SGordon Ross break;
176a90cf9f2SGordon Ross case FileStreamInformation:
177a90cf9f2SGordon Ross status = smb2_qif_stream(sr, qi);
178a90cf9f2SGordon Ross break;
179a90cf9f2SGordon Ross case FilePipeInformation:
180a90cf9f2SGordon Ross status = smb2_qif_pipe(sr, qi);
181a90cf9f2SGordon Ross break;
182a90cf9f2SGordon Ross case FilePipeLocalInformation:
183a90cf9f2SGordon Ross status = smb2_qif_pipe_lcl(sr, qi);
184a90cf9f2SGordon Ross break;
185a90cf9f2SGordon Ross case FilePipeRemoteInformation:
186a90cf9f2SGordon Ross status = smb2_qif_pipe_rem(sr, qi);
187a90cf9f2SGordon Ross break;
188a90cf9f2SGordon Ross case FileCompressionInformation:
189a90cf9f2SGordon Ross status = smb2_qif_compr(sr, qi);
190a90cf9f2SGordon Ross break;
191a90cf9f2SGordon Ross case FileNetworkOpenInformation:
192a90cf9f2SGordon Ross status = smb2_qif_opens(sr, qi);
193a90cf9f2SGordon Ross break;
194a90cf9f2SGordon Ross case FileAttributeTagInformation:
195a90cf9f2SGordon Ross status = smb2_qif_tags(sr, qi);
196a90cf9f2SGordon Ross break;
1972266458aSGordon Ross case FileIdInformation:
1982266458aSGordon Ross status = smb2_qif_id_info(sr, qi);
1992266458aSGordon Ross break;
200a90cf9f2SGordon Ross default:
201a90cf9f2SGordon Ross status = NT_STATUS_INVALID_INFO_CLASS;
202a90cf9f2SGordon Ross break;
203a90cf9f2SGordon Ross }
204a90cf9f2SGordon Ross
205a90cf9f2SGordon Ross return (status);
206a90cf9f2SGordon Ross }
207a90cf9f2SGordon Ross
208a90cf9f2SGordon Ross /*
209a90cf9f2SGordon Ross * FileAllInformation
210a90cf9f2SGordon Ross *
211a90cf9f2SGordon Ross * This returns a concatenation of:
212a90cf9f2SGordon Ross * FileBasicInformation
213a90cf9f2SGordon Ross * FileStandardInformation
214a90cf9f2SGordon Ross * FileInternalInformation
215a90cf9f2SGordon Ross * FileEaInformation
216*94893bd2SGordon Ross * FileAccessInformation
217a90cf9f2SGordon Ross * FilePositionInformation
218a90cf9f2SGordon Ross * FileModeInformation
219a90cf9f2SGordon Ross * FileAlignmentInformation
220a90cf9f2SGordon Ross * FileNameInformation
221cf56021bSGordon Ross *
222cf56021bSGordon Ross * Note: FileNameInformation is all zero on Win2016 and later.
223a90cf9f2SGordon Ross */
224a90cf9f2SGordon Ross static uint32_t
smb2_qif_all(smb_request_t * sr,smb_queryinfo_t * qi)225a90cf9f2SGordon Ross smb2_qif_all(smb_request_t *sr, smb_queryinfo_t *qi)
226a90cf9f2SGordon Ross {
227a90cf9f2SGordon Ross uint32_t status;
228a90cf9f2SGordon Ross
229a90cf9f2SGordon Ross status = smb2_qif_basic(sr, qi);
230a90cf9f2SGordon Ross if (status)
231a90cf9f2SGordon Ross return (status);
232a90cf9f2SGordon Ross status = smb2_qif_standard(sr, qi);
233a90cf9f2SGordon Ross if (status)
234a90cf9f2SGordon Ross return (status);
235a90cf9f2SGordon Ross status = smb2_qif_internal(sr, qi);
236a90cf9f2SGordon Ross if (status)
237a90cf9f2SGordon Ross return (status);
238a90cf9f2SGordon Ross status = smb2_qif_ea_size(sr, qi);
239*94893bd2SGordon Ross if (status)
240*94893bd2SGordon Ross return (status);
241*94893bd2SGordon Ross status = smb2_qif_access(sr, qi);
242a90cf9f2SGordon Ross if (status)
243a90cf9f2SGordon Ross return (status);
244a90cf9f2SGordon Ross status = smb2_qif_position(sr, qi);
245a90cf9f2SGordon Ross if (status)
246a90cf9f2SGordon Ross return (status);
247a90cf9f2SGordon Ross status = smb2_qif_mode(sr, qi);
248a90cf9f2SGordon Ross if (status)
249a90cf9f2SGordon Ross return (status);
250a90cf9f2SGordon Ross status = smb2_qif_alignment(sr, qi);
251a90cf9f2SGordon Ross if (status)
252a90cf9f2SGordon Ross return (status);
253a90cf9f2SGordon Ross
254516334b5SMatt Barden /* See smb2_qif_all_get_name */
255516334b5SMatt Barden if (qi->qi_namelen != 0) {
256516334b5SMatt Barden /* Win2012r2 and earlier fill it in. */
257cf56021bSGordon Ross status = smb2_qif_name(sr, qi);
258cf56021bSGordon Ross } else {
259516334b5SMatt Barden /* Win2016 and later just put zeros. */
260*94893bd2SGordon Ross int rc = smb_mbc_encodef(&sr->raw_data, "6.");
261cf56021bSGordon Ross status = (rc == 0) ? 0 : NT_STATUS_BUFFER_OVERFLOW;
262cf56021bSGordon Ross }
263cf56021bSGordon Ross
264cf56021bSGordon Ross return (status);
265a90cf9f2SGordon Ross }
266a90cf9f2SGordon Ross
267a90cf9f2SGordon Ross /*
268a90cf9f2SGordon Ross * FileBasicInformation
269a90cf9f2SGordon Ross * See also:
270a90cf9f2SGordon Ross * case SMB_QUERY_FILE_BASIC_INFO:
271a90cf9f2SGordon Ross * case SMB_FILE_BASIC_INFORMATION:
272a90cf9f2SGordon Ross */
273a90cf9f2SGordon Ross static uint32_t
smb2_qif_basic(smb_request_t * sr,smb_queryinfo_t * qi)274a90cf9f2SGordon Ross smb2_qif_basic(smb_request_t *sr, smb_queryinfo_t *qi)
275a90cf9f2SGordon Ross {
276a90cf9f2SGordon Ross smb_attr_t *sa = &qi->qi_attr;
27725a9a7aaSGordon Ross int rc;
278a90cf9f2SGordon Ross
279a90cf9f2SGordon Ross ASSERT((sa->sa_mask & SMB_AT_BASIC) == SMB_AT_BASIC);
280a90cf9f2SGordon Ross
28125a9a7aaSGordon Ross rc = smb_mbc_encodef(
282a90cf9f2SGordon Ross &sr->raw_data, "TTTTll",
283a90cf9f2SGordon Ross &sa->sa_crtime, /* T */
284a90cf9f2SGordon Ross &sa->sa_vattr.va_atime, /* T */
285a90cf9f2SGordon Ross &sa->sa_vattr.va_mtime, /* T */
286a90cf9f2SGordon Ross &sa->sa_vattr.va_ctime, /* T */
287a90cf9f2SGordon Ross sa->sa_dosattr, /* l */
288a90cf9f2SGordon Ross 0); /* reserved */ /* l */
28925a9a7aaSGordon Ross if (rc != 0)
29025a9a7aaSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
291a90cf9f2SGordon Ross
292a90cf9f2SGordon Ross return (0);
293a90cf9f2SGordon Ross }
294a90cf9f2SGordon Ross
295a90cf9f2SGordon Ross /*
296a90cf9f2SGordon Ross * FileStandardInformation
297a90cf9f2SGordon Ross * See also:
298a90cf9f2SGordon Ross * SMB_QUERY_FILE_STANDARD_INFO
299a90cf9f2SGordon Ross * SMB_FILE_STANDARD_INFORMATION
300a90cf9f2SGordon Ross */
301a90cf9f2SGordon Ross static uint32_t
smb2_qif_standard(smb_request_t * sr,smb_queryinfo_t * qi)302a90cf9f2SGordon Ross smb2_qif_standard(smb_request_t *sr, smb_queryinfo_t *qi)
303a90cf9f2SGordon Ross {
304a90cf9f2SGordon Ross smb_attr_t *sa = &qi->qi_attr;
30525a9a7aaSGordon Ross int rc;
306a90cf9f2SGordon Ross
307a90cf9f2SGordon Ross ASSERT((sa->sa_mask & SMB_AT_STANDARD) == SMB_AT_STANDARD);
308a90cf9f2SGordon Ross
30925a9a7aaSGordon Ross rc = smb_mbc_encodef(
310a90cf9f2SGordon Ross &sr->raw_data, "qqlbbw",
311a90cf9f2SGordon Ross sa->sa_allocsz, /* q */
312a90cf9f2SGordon Ross sa->sa_vattr.va_size, /* q */
313a90cf9f2SGordon Ross sa->sa_vattr.va_nlink, /* l */
314a90cf9f2SGordon Ross qi->qi_delete_on_close, /* b */
315a90cf9f2SGordon Ross qi->qi_isdir, /* b */
316a90cf9f2SGordon Ross 0); /* reserved */ /* w */
31725a9a7aaSGordon Ross if (rc != 0)
31825a9a7aaSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
319a90cf9f2SGordon Ross
320a90cf9f2SGordon Ross return (0);
321a90cf9f2SGordon Ross }
322a90cf9f2SGordon Ross
323a90cf9f2SGordon Ross /*
324a90cf9f2SGordon Ross * FileInternalInformation
325a90cf9f2SGordon Ross * See also:
326a90cf9f2SGordon Ross * SMB_FILE_INTERNAL_INFORMATION
327a90cf9f2SGordon Ross */
328a90cf9f2SGordon Ross static uint32_t
smb2_qif_internal(smb_request_t * sr,smb_queryinfo_t * qi)329a90cf9f2SGordon Ross smb2_qif_internal(smb_request_t *sr, smb_queryinfo_t *qi)
330a90cf9f2SGordon Ross {
331a90cf9f2SGordon Ross smb_attr_t *sa = &qi->qi_attr;
332d082c877SGordon Ross u_longlong_t nodeid;
33325a9a7aaSGordon Ross int rc;
334a90cf9f2SGordon Ross
335a90cf9f2SGordon Ross ASSERT((sa->sa_mask & SMB_AT_NODEID) == SMB_AT_NODEID);
336d082c877SGordon Ross nodeid = sa->sa_vattr.va_nodeid;
337d082c877SGordon Ross
338d082c877SGordon Ross if (smb2_aapl_use_file_ids == 0 &&
339d082c877SGordon Ross (sr->session->s_flags & SMB_SSN_AAPL_CCEXT) != 0)
340d082c877SGordon Ross nodeid = 0;
341a90cf9f2SGordon Ross
34225a9a7aaSGordon Ross rc = smb_mbc_encodef(
343a90cf9f2SGordon Ross &sr->raw_data, "q",
344d082c877SGordon Ross nodeid); /* q */
34525a9a7aaSGordon Ross if (rc != 0)
34625a9a7aaSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
347a90cf9f2SGordon Ross
348a90cf9f2SGordon Ross return (0);
349a90cf9f2SGordon Ross }
350a90cf9f2SGordon Ross
351a90cf9f2SGordon Ross /*
352a90cf9f2SGordon Ross * FileEaInformation
353a90cf9f2SGordon Ross * See also:
354a90cf9f2SGordon Ross * SMB_QUERY_FILE_EA_INFO
355a90cf9f2SGordon Ross * SMB_FILE_EA_INFORMATION
356a90cf9f2SGordon Ross */
357a90cf9f2SGordon Ross static uint32_t
smb2_qif_ea_size(smb_request_t * sr,smb_queryinfo_t * qi)358a90cf9f2SGordon Ross smb2_qif_ea_size(smb_request_t *sr, smb_queryinfo_t *qi)
359a90cf9f2SGordon Ross {
360a90cf9f2SGordon Ross _NOTE(ARGUNUSED(qi))
36125a9a7aaSGordon Ross int rc;
362a90cf9f2SGordon Ross
36325a9a7aaSGordon Ross rc = smb_mbc_encodef(
364a90cf9f2SGordon Ross &sr->raw_data, "l", 0);
36525a9a7aaSGordon Ross if (rc != 0)
36625a9a7aaSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
367a90cf9f2SGordon Ross
368a90cf9f2SGordon Ross return (0);
369a90cf9f2SGordon Ross }
370a90cf9f2SGordon Ross
371a90cf9f2SGordon Ross /*
372a90cf9f2SGordon Ross * FileFullEaInformation
373a90cf9f2SGordon Ross * We could put EAs in a named stream...
374a90cf9f2SGordon Ross */
375a90cf9f2SGordon Ross /* ARGSUSED */
376a90cf9f2SGordon Ross static uint32_t
smb2_qif_full_ea(smb_request_t * sr,smb_queryinfo_t * qi)377a90cf9f2SGordon Ross smb2_qif_full_ea(smb_request_t *sr, smb_queryinfo_t *qi)
378a90cf9f2SGordon Ross {
379a90cf9f2SGordon Ross return (NT_STATUS_NO_EAS_ON_FILE);
380a90cf9f2SGordon Ross }
381a90cf9f2SGordon Ross
382a90cf9f2SGordon Ross /*
383a90cf9f2SGordon Ross * FileAccessInformation
384a90cf9f2SGordon Ross */
385a90cf9f2SGordon Ross static uint32_t
smb2_qif_access(smb_request_t * sr,smb_queryinfo_t * qi)386a90cf9f2SGordon Ross smb2_qif_access(smb_request_t *sr, smb_queryinfo_t *qi)
387a90cf9f2SGordon Ross {
388a90cf9f2SGordon Ross _NOTE(ARGUNUSED(qi))
389a90cf9f2SGordon Ross smb_ofile_t *of = sr->fid_ofile;
39025a9a7aaSGordon Ross int rc;
391a90cf9f2SGordon Ross
39225a9a7aaSGordon Ross rc = smb_mbc_encodef(
393a90cf9f2SGordon Ross &sr->raw_data, "l",
394a90cf9f2SGordon Ross of->f_granted_access);
39525a9a7aaSGordon Ross if (rc != 0)
39625a9a7aaSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
397a90cf9f2SGordon Ross
398a90cf9f2SGordon Ross return (0);
399a90cf9f2SGordon Ross }
400a90cf9f2SGordon Ross
401a90cf9f2SGordon Ross /*
402a90cf9f2SGordon Ross * FileNameInformation
403a90cf9f2SGordon Ross * See also:
404a90cf9f2SGordon Ross * SMB_QUERY_FILE_NAME_INFO
405a90cf9f2SGordon Ross * SMB_FILE_NAME_INFORMATION
406*94893bd2SGordon Ross * MS-FSCC 2.1.7 FILE_NAME_INFORMATION
407a90cf9f2SGordon Ross */
408a90cf9f2SGordon Ross static uint32_t
smb2_qif_name(smb_request_t * sr,smb_queryinfo_t * qi)409a90cf9f2SGordon Ross smb2_qif_name(smb_request_t *sr, smb_queryinfo_t *qi)
410a90cf9f2SGordon Ross {
4113cfbf5beSGordon Ross char *name;
4123cfbf5beSGordon Ross uint32_t nlen;
41325a9a7aaSGordon Ross int rc;
414a90cf9f2SGordon Ross
4153cfbf5beSGordon Ross /* SMB2 leaves off the leading / */
4163cfbf5beSGordon Ross nlen = qi->qi_namelen;
4173cfbf5beSGordon Ross name = qi->qi_name;
4183cfbf5beSGordon Ross if (qi->qi_name[0] == '\\') {
4193cfbf5beSGordon Ross name++;
4203cfbf5beSGordon Ross nlen -= 2;
4213cfbf5beSGordon Ross }
422a90cf9f2SGordon Ross
42325a9a7aaSGordon Ross rc = smb_mbc_encodef(
424*94893bd2SGordon Ross &sr->raw_data, "lU",
4253cfbf5beSGordon Ross nlen, /* l */
4263cfbf5beSGordon Ross name); /* U */
4273cfbf5beSGordon Ross if (rc != 0)
4283cfbf5beSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
4293cfbf5beSGordon Ross
4303cfbf5beSGordon Ross return (0);
4313cfbf5beSGordon Ross }
4323cfbf5beSGordon Ross
4333cfbf5beSGordon Ross /*
4343cfbf5beSGordon Ross * FileNormalizedNameInformation
4353cfbf5beSGordon Ross */
4363cfbf5beSGordon Ross static uint32_t
smb2_qif_normalized_name(smb_request_t * sr,smb_queryinfo_t * qi)4373cfbf5beSGordon Ross smb2_qif_normalized_name(smb_request_t *sr, smb_queryinfo_t *qi)
4383cfbf5beSGordon Ross {
4393cfbf5beSGordon Ross char *name;
4403cfbf5beSGordon Ross uint32_t nlen;
4413cfbf5beSGordon Ross int rc;
4423cfbf5beSGordon Ross
4433cfbf5beSGordon Ross /* SMB2 leaves off the leading / */
4443cfbf5beSGordon Ross nlen = qi->qi_namelen;
4453cfbf5beSGordon Ross name = qi->qi_name;
4463cfbf5beSGordon Ross if (qi->qi_name[0] == '\\') {
4473cfbf5beSGordon Ross name++;
4483cfbf5beSGordon Ross nlen -= 2;
4493cfbf5beSGordon Ross }
4503cfbf5beSGordon Ross
4513cfbf5beSGordon Ross rc = smb_mbc_encodef(
4523cfbf5beSGordon Ross &sr->raw_data, "lU",
4533cfbf5beSGordon Ross nlen, /* l */
4543cfbf5beSGordon Ross name); /* U */
45525a9a7aaSGordon Ross if (rc != 0)
45625a9a7aaSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
457a90cf9f2SGordon Ross
458a90cf9f2SGordon Ross return (0);
459a90cf9f2SGordon Ross }
460a90cf9f2SGordon Ross
461a90cf9f2SGordon Ross /*
462a90cf9f2SGordon Ross * FilePositionInformation
463a90cf9f2SGordon Ross */
464a90cf9f2SGordon Ross static uint32_t
smb2_qif_position(smb_request_t * sr,smb_queryinfo_t * qi)465a90cf9f2SGordon Ross smb2_qif_position(smb_request_t *sr, smb_queryinfo_t *qi)
466a90cf9f2SGordon Ross {
467a90cf9f2SGordon Ross _NOTE(ARGUNUSED(qi))
468a90cf9f2SGordon Ross smb_ofile_t *of = sr->fid_ofile;
469a90cf9f2SGordon Ross uint64_t pos;
47025a9a7aaSGordon Ross int rc;
471a90cf9f2SGordon Ross
472a90cf9f2SGordon Ross mutex_enter(&of->f_mutex);
473a90cf9f2SGordon Ross pos = of->f_seek_pos;
474a90cf9f2SGordon Ross mutex_exit(&of->f_mutex);
475a90cf9f2SGordon Ross
47625a9a7aaSGordon Ross rc = smb_mbc_encodef(
477a90cf9f2SGordon Ross &sr->raw_data, "q", pos);
47825a9a7aaSGordon Ross if (rc != 0)
47925a9a7aaSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
480a90cf9f2SGordon Ross
481a90cf9f2SGordon Ross return (0);
482a90cf9f2SGordon Ross }
483a90cf9f2SGordon Ross
484a90cf9f2SGordon Ross /*
485a90cf9f2SGordon Ross * FileModeInformation [MS-FSA 2.4.24]
486a90cf9f2SGordon Ross */
487a90cf9f2SGordon Ross static uint32_t
smb2_qif_mode(smb_request_t * sr,smb_queryinfo_t * qi)488a90cf9f2SGordon Ross smb2_qif_mode(smb_request_t *sr, smb_queryinfo_t *qi)
489a90cf9f2SGordon Ross {
490a90cf9f2SGordon Ross _NOTE(ARGUNUSED(qi))
49136d5d64dSGordon Ross smb_ofile_t *of = sr->fid_ofile;
49236d5d64dSGordon Ross uint32_t mode;
49325a9a7aaSGordon Ross int rc;
494a90cf9f2SGordon Ross
49536d5d64dSGordon Ross /*
49636d5d64dSGordon Ross * See MS-FSA description of Open.Mode
49736d5d64dSGordon Ross * For now, we have these in...
49836d5d64dSGordon Ross */
49936d5d64dSGordon Ross mode = of->f_create_options &
50036d5d64dSGordon Ross (FILE_WRITE_THROUGH | FILE_SEQUENTIAL_ONLY |
50136d5d64dSGordon Ross FILE_NO_INTERMEDIATE_BUFFERING | FILE_DELETE_ON_CLOSE);
50236d5d64dSGordon Ross
50336d5d64dSGordon Ross /*
50436d5d64dSGordon Ross * The ofile level DoC flag is currently in of->f_flags
50536d5d64dSGordon Ross * (SMB_OFLAGS_SET_DELETE_ON_CLOSE) though probably it
50636d5d64dSGordon Ross * should be in f_create_options (and perhaps rename
50736d5d64dSGordon Ross * that field to f_mode or something closer to the
50836d5d64dSGordon Ross * Open.Mode terminology used in MS-FSA).
50936d5d64dSGordon Ross */
51036d5d64dSGordon Ross if (of->f_flags & SMB_OFLAGS_SET_DELETE_ON_CLOSE)
51136d5d64dSGordon Ross mode |= FILE_DELETE_ON_CLOSE;
51236d5d64dSGordon Ross
51325a9a7aaSGordon Ross rc = smb_mbc_encodef(
51436d5d64dSGordon Ross &sr->raw_data, "l", mode);
51525a9a7aaSGordon Ross if (rc != 0)
51625a9a7aaSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
517a90cf9f2SGordon Ross
518a90cf9f2SGordon Ross return (0);
519a90cf9f2SGordon Ross }
520a90cf9f2SGordon Ross
521a90cf9f2SGordon Ross /*
522a90cf9f2SGordon Ross * FileAlignmentInformation
523a90cf9f2SGordon Ross */
524a90cf9f2SGordon Ross static uint32_t
smb2_qif_alignment(smb_request_t * sr,smb_queryinfo_t * qi)525a90cf9f2SGordon Ross smb2_qif_alignment(smb_request_t *sr, smb_queryinfo_t *qi)
526a90cf9f2SGordon Ross {
527a90cf9f2SGordon Ross _NOTE(ARGUNUSED(qi))
52825a9a7aaSGordon Ross int rc;
529a90cf9f2SGordon Ross
53025a9a7aaSGordon Ross rc = smb_mbc_encodef(
531a90cf9f2SGordon Ross &sr->raw_data, "l", 0);
53225a9a7aaSGordon Ross if (rc != 0)
53325a9a7aaSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
534a90cf9f2SGordon Ross
535a90cf9f2SGordon Ross return (0);
536a90cf9f2SGordon Ross }
537a90cf9f2SGordon Ross
538a90cf9f2SGordon Ross /*
539a90cf9f2SGordon Ross * FileAlternateNameInformation
540a90cf9f2SGordon Ross * See also:
541a90cf9f2SGordon Ross * SMB_QUERY_FILE_ALT_NAME_INFO
542a90cf9f2SGordon Ross * SMB_FILE_ALT_NAME_INFORMATION
543a90cf9f2SGordon Ross */
544a90cf9f2SGordon Ross static uint32_t
smb2_qif_altname(smb_request_t * sr,smb_queryinfo_t * qi)545a90cf9f2SGordon Ross smb2_qif_altname(smb_request_t *sr, smb_queryinfo_t *qi)
546a90cf9f2SGordon Ross {
547a90cf9f2SGordon Ross smb_ofile_t *of = sr->fid_ofile;
54825a9a7aaSGordon Ross int rc;
549a90cf9f2SGordon Ross
550a90cf9f2SGordon Ross ASSERT(qi->qi_namelen > 0);
551a90cf9f2SGordon Ross ASSERT(qi->qi_attr.sa_mask & SMB_AT_NODEID);
552a90cf9f2SGordon Ross
553a90cf9f2SGordon Ross if (of->f_ftype != SMB_FTYPE_DISK)
554a90cf9f2SGordon Ross return (NT_STATUS_OBJECT_NAME_NOT_FOUND);
555a90cf9f2SGordon Ross if ((of->f_tree->t_flags & SMB_TREE_SHORTNAMES) == 0)
556a90cf9f2SGordon Ross return (NT_STATUS_OBJECT_NAME_NOT_FOUND);
557a90cf9f2SGordon Ross
558a90cf9f2SGordon Ross /* fill in qi->qi_shortname */
559a90cf9f2SGordon Ross smb_query_shortname(of->f_node, qi);
560a90cf9f2SGordon Ross
56125a9a7aaSGordon Ross rc = smb_mbc_encodef(
562a90cf9f2SGordon Ross &sr->raw_data, "%lU", sr,
563a90cf9f2SGordon Ross smb_wcequiv_strlen(qi->qi_shortname),
564a90cf9f2SGordon Ross qi->qi_shortname);
56525a9a7aaSGordon Ross if (rc != 0)
56625a9a7aaSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
567a90cf9f2SGordon Ross
568a90cf9f2SGordon Ross return (0);
569a90cf9f2SGordon Ross }
570a90cf9f2SGordon Ross
571a90cf9f2SGordon Ross /*
572a90cf9f2SGordon Ross * FileStreamInformation
573a90cf9f2SGordon Ross */
574a90cf9f2SGordon Ross static uint32_t
smb2_qif_stream(smb_request_t * sr,smb_queryinfo_t * qi)575a90cf9f2SGordon Ross smb2_qif_stream(smb_request_t *sr, smb_queryinfo_t *qi)
576a90cf9f2SGordon Ross {
577a90cf9f2SGordon Ross smb_ofile_t *of = sr->fid_ofile;
578a90cf9f2SGordon Ross smb_attr_t *attr = &qi->qi_attr;
579a90cf9f2SGordon Ross uint32_t status;
580a90cf9f2SGordon Ross
581a90cf9f2SGordon Ross ASSERT((attr->sa_mask & SMB_AT_STANDARD) == SMB_AT_STANDARD);
582a90cf9f2SGordon Ross if (of->f_ftype != SMB_FTYPE_DISK) {
583a90cf9f2SGordon Ross (void) smb_mbc_encodef(
584a90cf9f2SGordon Ross &sr->raw_data, "l", 0);
585a90cf9f2SGordon Ross return (0);
586a90cf9f2SGordon Ross }
587a90cf9f2SGordon Ross
588a90cf9f2SGordon Ross status = smb_query_stream_info(sr, &sr->raw_data, qi);
589a90cf9f2SGordon Ross return (status);
590a90cf9f2SGordon Ross }
591a90cf9f2SGordon Ross
592a90cf9f2SGordon Ross /*
593a90cf9f2SGordon Ross * FilePipeInformation
594a90cf9f2SGordon Ross */
595a90cf9f2SGordon Ross static uint32_t
smb2_qif_pipe(smb_request_t * sr,smb_queryinfo_t * qi)596a90cf9f2SGordon Ross smb2_qif_pipe(smb_request_t *sr, smb_queryinfo_t *qi)
597a90cf9f2SGordon Ross {
598a90cf9f2SGordon Ross _NOTE(ARGUNUSED(qi))
599a90cf9f2SGordon Ross smb_ofile_t *of = sr->fid_ofile;
600a90cf9f2SGordon Ross uint32_t pipe_mode;
601a90cf9f2SGordon Ross uint32_t nonblock;
60225a9a7aaSGordon Ross int rc;
603a90cf9f2SGordon Ross
604a90cf9f2SGordon Ross switch (of->f_ftype) {
605a90cf9f2SGordon Ross case SMB_FTYPE_BYTE_PIPE:
606a90cf9f2SGordon Ross pipe_mode = 0; /* FILE_PIPE_BYTE_STREAM_MODE */
607a90cf9f2SGordon Ross break;
608a90cf9f2SGordon Ross case SMB_FTYPE_MESG_PIPE:
609a90cf9f2SGordon Ross pipe_mode = 1; /* FILE_PIPE_MESSAGE_MODE */
610a90cf9f2SGordon Ross break;
611a90cf9f2SGordon Ross case SMB_FTYPE_DISK:
612a90cf9f2SGordon Ross case SMB_FTYPE_PRINTER:
613a90cf9f2SGordon Ross default:
614a90cf9f2SGordon Ross return (NT_STATUS_INVALID_PARAMETER);
615a90cf9f2SGordon Ross }
616a90cf9f2SGordon Ross nonblock = 0; /* XXX todo: Get this from the pipe handle. */
617a90cf9f2SGordon Ross
61825a9a7aaSGordon Ross rc = smb_mbc_encodef(
619a90cf9f2SGordon Ross &sr->raw_data, "ll",
620a90cf9f2SGordon Ross pipe_mode, nonblock);
62125a9a7aaSGordon Ross if (rc != 0)
62225a9a7aaSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
623a90cf9f2SGordon Ross
624a90cf9f2SGordon Ross return (0);
625a90cf9f2SGordon Ross }
626a90cf9f2SGordon Ross
627a90cf9f2SGordon Ross /*
628a90cf9f2SGordon Ross * FilePipeLocalInformation
629a90cf9f2SGordon Ross */
630a90cf9f2SGordon Ross /* ARGSUSED */
631a90cf9f2SGordon Ross static uint32_t
smb2_qif_pipe_lcl(smb_request_t * sr,smb_queryinfo_t * qi)632a90cf9f2SGordon Ross smb2_qif_pipe_lcl(smb_request_t *sr, smb_queryinfo_t *qi)
633a90cf9f2SGordon Ross {
634a90cf9f2SGordon Ross return (NT_STATUS_INVALID_PARAMETER); /* XXX todo */
635a90cf9f2SGordon Ross }
636a90cf9f2SGordon Ross
637a90cf9f2SGordon Ross /*
638a90cf9f2SGordon Ross * FilePipeRemoteInformation
639a90cf9f2SGordon Ross */
640a90cf9f2SGordon Ross /* ARGSUSED */
641a90cf9f2SGordon Ross static uint32_t
smb2_qif_pipe_rem(smb_request_t * sr,smb_queryinfo_t * qi)642a90cf9f2SGordon Ross smb2_qif_pipe_rem(smb_request_t *sr, smb_queryinfo_t *qi)
643a90cf9f2SGordon Ross {
644a90cf9f2SGordon Ross return (NT_STATUS_INVALID_PARAMETER); /* XXX todo */
645a90cf9f2SGordon Ross }
646a90cf9f2SGordon Ross
647a90cf9f2SGordon Ross /*
648a90cf9f2SGordon Ross * FileCompressionInformation
649a90cf9f2SGordon Ross * XXX: For now, just say "not compressed".
650a90cf9f2SGordon Ross */
651a90cf9f2SGordon Ross static uint32_t
smb2_qif_compr(smb_request_t * sr,smb_queryinfo_t * qi)652a90cf9f2SGordon Ross smb2_qif_compr(smb_request_t *sr, smb_queryinfo_t *qi)
653a90cf9f2SGordon Ross {
654a90cf9f2SGordon Ross smb_attr_t *sa = &qi->qi_attr;
655a90cf9f2SGordon Ross uint16_t CompressionFormat = 0; /* COMPRESSION_FORMAT_NONE */
65625a9a7aaSGordon Ross int rc;
657a90cf9f2SGordon Ross
658a90cf9f2SGordon Ross ASSERT(sa->sa_mask & SMB_AT_SIZE);
659a90cf9f2SGordon Ross
66025a9a7aaSGordon Ross rc = smb_mbc_encodef(
661a90cf9f2SGordon Ross &sr->raw_data, "qw6.",
662a90cf9f2SGordon Ross sa->sa_vattr.va_size, /* q */
663a90cf9f2SGordon Ross CompressionFormat); /* w */
66425a9a7aaSGordon Ross if (rc != 0)
66525a9a7aaSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
666a90cf9f2SGordon Ross
667a90cf9f2SGordon Ross return (0);
668a90cf9f2SGordon Ross }
669a90cf9f2SGordon Ross
670a90cf9f2SGordon Ross /*
671a90cf9f2SGordon Ross * FileNetworkOpenInformation
672a90cf9f2SGordon Ross */
673a90cf9f2SGordon Ross static uint32_t
smb2_qif_opens(smb_request_t * sr,smb_queryinfo_t * qi)674a90cf9f2SGordon Ross smb2_qif_opens(smb_request_t *sr, smb_queryinfo_t *qi)
675a90cf9f2SGordon Ross {
676a90cf9f2SGordon Ross smb_attr_t *sa = &qi->qi_attr;
67725a9a7aaSGordon Ross int rc;
678a90cf9f2SGordon Ross
67925a9a7aaSGordon Ross rc = smb_mbc_encodef(
680a90cf9f2SGordon Ross &sr->raw_data, "TTTTqqll",
681a90cf9f2SGordon Ross &sa->sa_crtime, /* T */
682a90cf9f2SGordon Ross &sa->sa_vattr.va_atime, /* T */
683a90cf9f2SGordon Ross &sa->sa_vattr.va_mtime, /* T */
684a90cf9f2SGordon Ross &sa->sa_vattr.va_ctime, /* T */
685a90cf9f2SGordon Ross sa->sa_allocsz, /* q */
686a90cf9f2SGordon Ross sa->sa_vattr.va_size, /* q */
687a90cf9f2SGordon Ross sa->sa_dosattr, /* l */
688a90cf9f2SGordon Ross 0); /* reserved */ /* l */
68925a9a7aaSGordon Ross if (rc != 0)
69025a9a7aaSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
691a90cf9f2SGordon Ross
692a90cf9f2SGordon Ross return (0);
693a90cf9f2SGordon Ross }
694a90cf9f2SGordon Ross
695a90cf9f2SGordon Ross /*
696a90cf9f2SGordon Ross * FileAttributeTagInformation
697a90cf9f2SGordon Ross *
698a90cf9f2SGordon Ross * If dattr includes FILE_ATTRIBUTE_REPARSE_POINT, the
699a90cf9f2SGordon Ross * second dword should be the reparse tag. Otherwise
700a90cf9f2SGordon Ross * the tag value should be set to zero.
701a90cf9f2SGordon Ross * We don't support reparse points, so we set the tag
702a90cf9f2SGordon Ross * to zero.
703a90cf9f2SGordon Ross */
704a90cf9f2SGordon Ross static uint32_t
smb2_qif_tags(smb_request_t * sr,smb_queryinfo_t * qi)705a90cf9f2SGordon Ross smb2_qif_tags(smb_request_t *sr, smb_queryinfo_t *qi)
706a90cf9f2SGordon Ross {
707a90cf9f2SGordon Ross _NOTE(ARGUNUSED(qi))
70825a9a7aaSGordon Ross int rc;
70925a9a7aaSGordon Ross
71025a9a7aaSGordon Ross rc = smb_mbc_encodef(
711a90cf9f2SGordon Ross &sr->raw_data, "ll", 0, 0);
71225a9a7aaSGordon Ross if (rc != 0)
71325a9a7aaSGordon Ross return (NT_STATUS_BUFFER_OVERFLOW);
714a90cf9f2SGordon Ross
715a90cf9f2SGordon Ross return (0);
716a90cf9f2SGordon Ross }
7172266458aSGordon Ross
7182266458aSGordon Ross /*
7192266458aSGordon Ross * FileIdInformation
7202266458aSGordon Ross *
7212266458aSGordon Ross * Returns a A FILE_ID_INFORMATION
7222266458aSGordon Ross * VolumeSerialNumber (8 bytes)
7232266458aSGordon Ross * FileId (16 bytes)
7242266458aSGordon Ross *
7252266458aSGordon Ross * Take the volume serial from the share root,
7262266458aSGordon Ross * and compose the FileId from the nodeid and fsid
7272266458aSGordon Ross * of the file (in case we crossed mounts)
7282266458aSGordon Ross */
7292266458aSGordon Ross static uint32_t
smb2_qif_id_info(smb_request_t * sr,smb_queryinfo_t * qi)7302266458aSGordon Ross smb2_qif_id_info(smb_request_t *sr, smb_queryinfo_t *qi)
7312266458aSGordon Ross {
7322266458aSGordon Ross smb_attr_t *sa = &qi->qi_attr;
7332266458aSGordon Ross smb_ofile_t *of = sr->fid_ofile;
7342266458aSGordon Ross smb_tree_t *tree = sr->tid_tree;
7352266458aSGordon Ross vfs_t *f_vfs; // file
7362266458aSGordon Ross vfs_t *s_vfs; // share
7372266458aSGordon Ross uint64_t nodeid;
7382266458aSGordon Ross int rc;
7392266458aSGordon Ross
7402266458aSGordon Ross ASSERT((sa->sa_mask & SMB_AT_NODEID) != 0);
7412266458aSGordon Ross if (of->f_ftype != SMB_FTYPE_DISK)
7422266458aSGordon Ross return (NT_STATUS_INVALID_INFO_CLASS);
7432266458aSGordon Ross
7442266458aSGordon Ross s_vfs = SMB_NODE_VFS(tree->t_snode);
7452266458aSGordon Ross f_vfs = SMB_NODE_VFS(of->f_node);
7462266458aSGordon Ross nodeid = (uint64_t)sa->sa_vattr.va_nodeid;
7472266458aSGordon Ross
7482266458aSGordon Ross rc = smb_mbc_encodef(
7492266458aSGordon Ross &sr->raw_data, "llqll",
7502266458aSGordon Ross s_vfs->vfs_fsid.val[0], /* l */
7512266458aSGordon Ross s_vfs->vfs_fsid.val[1], /* l */
7522266458aSGordon Ross nodeid, /* q */
7532266458aSGordon Ross f_vfs->vfs_fsid.val[0], /* l */
7542266458aSGordon Ross f_vfs->vfs_fsid.val[1]); /* l */
7552266458aSGordon Ross if (rc != 0)
7562266458aSGordon Ross return (NT_STATUS_INFO_LENGTH_MISMATCH);
7572266458aSGordon Ross
7582266458aSGordon Ross return (0);
7592266458aSGordon Ross }
760