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