1 /*
2    Unix SMB/CIFS implementation.
3    SMB request interface structures
4    Copyright (C) Andrew Tridgell			2003
5    Copyright (C) James J Myers 2003 <myersjj@samba.org>
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21 
22 #ifndef __LIBCLI_RAW_INTERFACES_H__
23 #define __LIBCLI_RAW_INTERFACES_H__
24 
25 #include "smb.h"
26 
27 /* this structure is just a wrapper for a string, the only reason we
28    bother with this is that it allows us to check the length provided
29    on the wire in testsuite test code to ensure that we are
30    terminating names in the same way that win2003 is. The *ONLY* time
31    you should ever look at the 'private_length' field in this
32    structure is inside compliance test code, in all other cases just
33    use the null terminated char* as the definitive definition of the
34    string
35 
36    also note that this structure is only used in packets where there
37    is an explicit length provided on the wire (hence the name). That
38    length is placed in 'private_length'. For packets where the length
39    is always determined by NULL or packet termination a normal char*
40    is used in the structure definition.
41  */
42 struct smb_wire_string {
43 	uint32_t private_length;
44 	const char *s;
45 };
46 
47 /*
48  * SMB2 uses a 16Byte handle,
49  * (we can maybe use struct GUID later)
50  */
51 struct smb2_handle {
52 	uint64_t data[2];
53 };
54 
55 struct ntvfs_handle;
56 
57 /*
58  * a generic container for file handles or file pathes
59  * for qfileinfo/setfileinfo and qpathinfo/setpathinfo
60 */
61 union smb_handle_or_path {
62 	/*
63 	 * this is used for
64 	 * the qpathinfo and setpathinfo
65 	 * calls
66 	 */
67 	const char *path;
68 	/*
69 	 * this is used as file handle in SMB
70 	 */
71 	uint16_t fnum;
72 
73 	/*
74 	 * this is used as file handle in SMB2
75 	 */
76 	struct smb2_handle handle;
77 
78 	/*
79 	 * this is used as generic file handle for the NTVFS layer
80 	 */
81 	struct ntvfs_handle *ntvfs;
82 };
83 
84 /*
85  a generic container for file handles
86 */
87 union smb_handle {
88 	/*
89 	 * this is used as file handle in SMB
90 	 */
91 	uint16_t fnum;
92 
93 	/*
94 	 * this is used as file handle in SMB2
95 	 */
96 	struct smb2_handle handle;
97 
98 	/*
99 	 * this is used as generic file handle for the NTVFS layer
100 	 */
101 	struct ntvfs_handle *ntvfs;
102 };
103 
104 /*
105   this header defines the structures and unions used between the SMB
106   parser and the backends.
107 */
108 
109 /* struct used for SMBlseek call */
110 union smb_seek {
111 	struct {
112 		struct {
113 			union smb_handle file;
114 			uint16_t mode;
115 			int32_t  offset; /* signed */
116 		} in;
117 		struct {
118 			int32_t offset;
119 		} out;
120 	} lseek, generic;
121 };
122 
123 /* struct used in unlink() call */
124 union smb_unlink {
125 	struct {
126 		struct {
127 			const char *pattern;
128 			uint16_t attrib;
129 		} in;
130 	} unlink;
131 };
132 
133 
134 /* struct used in chkpath() call */
135 union smb_chkpath {
136 	struct {
137 		struct {
138 			const char *path;
139 		} in;
140 	} chkpath;
141 };
142 
143 enum smb_mkdir_level {RAW_MKDIR_GENERIC, RAW_MKDIR_MKDIR, RAW_MKDIR_T2MKDIR};
144 
145 /* union used in mkdir() call */
146 union smb_mkdir {
147 	/* generic level */
148 	struct {
149 		enum smb_mkdir_level level;
150 	} generic;
151 
152 	struct {
153 		enum smb_mkdir_level level;
154 		struct {
155 			const char *path;
156 		} in;
157 	} mkdir;
158 
159 	struct {
160 		enum smb_mkdir_level level;
161 		struct {
162 			const char *path;
163 			uint_t num_eas;
164 			struct ea_struct *eas;
165 		} in;
166 	} t2mkdir;
167 };
168 
169 /* struct used in rmdir() call */
170 struct smb_rmdir {
171 	struct {
172 		const char *path;
173 	} in;
174 };
175 
176 /* struct used in rename() call */
177 enum smb_rename_level {RAW_RENAME_RENAME, RAW_RENAME_NTRENAME};
178 
179 union smb_rename {
180 	struct {
181 		enum smb_rename_level level;
182 	} generic;
183 
184 	/* SMBrename interface */
185 	struct {
186 		enum smb_rename_level level;
187 
188 		struct {
189 			const char *pattern1;
190 			const char *pattern2;
191 			uint16_t attrib;
192 		} in;
193 	} rename;
194 
195 
196 	/* SMBntrename interface */
197 	struct {
198 		enum smb_rename_level level;
199 
200 		struct {
201 			uint16_t attrib;
202 			uint16_t flags; /* see RENAME_FLAG_* */
203 			uint32_t cluster_size;
204 			const char *old_name;
205 			const char *new_name;
206 		} in;
207 	} ntrename;
208 };
209 
210 enum smb_tcon_level {
211 	RAW_TCON_TCON,
212 	RAW_TCON_TCONX,
213 	RAW_TCON_SMB2
214 };
215 
216 /* union used in tree connect call */
217 union smb_tcon {
218 	/* generic interface */
219 	struct {
220 		enum smb_tcon_level level;
221 	} generic;
222 
223 	/* SMBtcon interface */
224 	struct {
225 		enum smb_tcon_level level;
226 
227 		struct {
228 			const char *service;
229 			const char *password;
230 			const char *dev;
231 		} in;
232 		struct {
233 			uint16_t max_xmit;
234 			uint16_t tid;
235 		} out;
236 	} tcon;
237 
238 	/* SMBtconX interface */
239 	struct {
240 		enum smb_tcon_level level;
241 
242 		struct {
243 			uint16_t flags;
244 			DATA_BLOB password;
245 			const char *path;
246 			const char *device;
247 		} in;
248 		struct {
249 			uint16_t options;
250 			char *dev_type;
251 			char *fs_type;
252 			uint16_t tid;
253 		} out;
254 	} tconx;
255 
256 	/* SMB2 TreeConnect */
257 	struct smb2_tree_connect {
258 		enum smb_tcon_level level;
259 
260 		struct {
261 			/* static body buffer 8 (0x08) bytes */
262 			/* uint16_t buffer_code; 0x09 = 0x08 + 1 */
263 			uint16_t unknown1; /* 0x0000 */
264 			/* uint16_t path_ofs */
265 			/* uint16_t path_size */
266 
267 			/* dynamic body */
268 			const char *path; /* as non-terminated UTF-16 on the wire */
269 		} in;
270 		struct {
271 			/* static body buffer 16 (0x10) bytes */
272 			/* uint16_t buffer_code;  0x10 */
273 			uint16_t unknown1; /* 0x02 */
274 			uint32_t unknown2; /* 0x00 */
275 			uint32_t unknown3; /* 0x00 */
276 			uint32_t access_mask;
277 
278 			/* extracted from the SMB2 header */
279 			uint32_t tid;
280 		} out;
281 	} smb2;
282 };
283 
284 
285 enum smb_sesssetup_level {
286 	RAW_SESSSETUP_OLD,
287 	RAW_SESSSETUP_NT1,
288 	RAW_SESSSETUP_SPNEGO,
289 	RAW_SESSSETUP_SMB2
290 };
291 
292 /* union used in session_setup call */
293 union smb_sesssetup {
294 	/* the pre-NT1 interface */
295 	struct {
296 		enum smb_sesssetup_level level;
297 
298 		struct {
299 			uint16_t bufsize;
300 			uint16_t mpx_max;
301 			uint16_t vc_num;
302 			uint32_t sesskey;
303 			DATA_BLOB password;
304 			const char *user;
305 			const char *domain;
306 			const char *os;
307 			const char *lanman;
308 		} in;
309 		struct {
310 			uint16_t action;
311 			uint16_t vuid;
312 			char *os;
313 			char *lanman;
314 			char *domain;
315 		} out;
316 	} old;
317 
318 	/* the NT1 interface */
319 	struct {
320 		enum smb_sesssetup_level level;
321 
322 		struct {
323 			uint16_t bufsize;
324 			uint16_t mpx_max;
325 			uint16_t vc_num;
326 			uint32_t sesskey;
327 			uint32_t capabilities;
328 			DATA_BLOB password1;
329 			DATA_BLOB password2;
330 			const char *user;
331 			const char *domain;
332 			const char *os;
333 			const char *lanman;
334 		} in;
335 		struct {
336 			uint16_t action;
337 			uint16_t vuid;
338 			char *os;
339 			char *lanman;
340 			char *domain;
341 		} out;
342 	} nt1;
343 
344 
345 	/* the SPNEGO interface */
346 	struct {
347 		enum smb_sesssetup_level level;
348 
349 		struct {
350 			uint16_t bufsize;
351 			uint16_t mpx_max;
352 			uint16_t vc_num;
353 			uint32_t sesskey;
354 			uint32_t capabilities;
355 			DATA_BLOB secblob;
356 			const char *os;
357 			const char *lanman;
358 			const char *workgroup;
359 		} in;
360 		struct {
361 			uint16_t action;
362 			DATA_BLOB secblob;
363 			char *os;
364 			char *lanman;
365 			char *workgroup;
366 			uint16_t vuid;
367 		} out;
368 	} spnego;
369 
370 	/* SMB2 SessionSetup */
371 	struct smb2_session_setup {
372 		enum smb_sesssetup_level level;
373 
374 		struct {
375 			/* NOTE: this was 0x11 = 0x10 + 1 in vista-CTP
376 			 * and changed in vista-beta2, but both server's
377 			 * can handle the 0x18 clients
378 			 */
379 			/* static body buffer 24 (0x18) bytes */
380 			/* uint16_t buffer_code;  0x19 = 0x18 + 1 */
381 			uint16_t _pad;
382 			uint32_t unknown2; /* 0x0000000F(vista-CTP) 0x00000007(vista-beta2) */
383 			uint32_t unknown3; /* 0x0000000 */
384 			/* uint16_t secblob_ofs */
385 			/* uint16_t secblob_size */
386 			uint64_t unknown4; /* 0x0000000000000000 only present in vista-beta2 */
387 
388 			/* dynamic body */
389 			DATA_BLOB secblob;
390 		} in;
391 		struct {
392 			/* static body buffer 8 (0x08) bytes */
393 			/* uint16_t buffer_code; 0x09 = 0x08 +1 */
394 			uint16_t _pad;
395 			/* uint16_t secblob_ofs */
396 			/* uint16_t secblob_size */
397 
398 			/* dynamic body */
399 			DATA_BLOB secblob;
400 
401 			/* extracted from the SMB2 header */
402 			uint64_t uid;
403 		} out;
404 	} smb2;
405 };
406 
407 /* Note that the specified enum values are identical to the actual info-levels used
408  * on the wire.
409  */
410 enum smb_fileinfo_level {
411 		     RAW_FILEINFO_GENERIC                    = 0xF000,
412 		     RAW_FILEINFO_GETATTR,                   /* SMBgetatr */
413 		     RAW_FILEINFO_GETATTRE,                  /* SMBgetattrE */
414 		     RAW_FILEINFO_SEC_DESC,                  /* NT_TRANSACT_QUERY_SECURITY_DESC */
415 		     RAW_FILEINFO_STANDARD                   = SMB_QFILEINFO_STANDARD,
416 		     RAW_FILEINFO_EA_SIZE                    = SMB_QFILEINFO_EA_SIZE,
417 		     RAW_FILEINFO_EA_LIST                    = SMB_QFILEINFO_EA_LIST,
418 		     RAW_FILEINFO_ALL_EAS                    = SMB_QFILEINFO_ALL_EAS,
419 		     RAW_FILEINFO_IS_NAME_VALID              = SMB_QFILEINFO_IS_NAME_VALID,
420 		     RAW_FILEINFO_BASIC_INFO                 = SMB_QFILEINFO_BASIC_INFO,
421 		     RAW_FILEINFO_STANDARD_INFO              = SMB_QFILEINFO_STANDARD_INFO,
422 		     RAW_FILEINFO_EA_INFO                    = SMB_QFILEINFO_EA_INFO,
423 		     RAW_FILEINFO_NAME_INFO                  = SMB_QFILEINFO_NAME_INFO,
424 		     RAW_FILEINFO_ALL_INFO                   = SMB_QFILEINFO_ALL_INFO,
425 		     RAW_FILEINFO_ALT_NAME_INFO              = SMB_QFILEINFO_ALT_NAME_INFO,
426 		     RAW_FILEINFO_STREAM_INFO                = SMB_QFILEINFO_STREAM_INFO,
427 		     RAW_FILEINFO_COMPRESSION_INFO           = SMB_QFILEINFO_COMPRESSION_INFO,
428 		     RAW_FILEINFO_UNIX_BASIC                 = SMB_QFILEINFO_UNIX_BASIC,
429 		     RAW_FILEINFO_UNIX_LINK                  = SMB_QFILEINFO_UNIX_LINK,
430 		     RAW_FILEINFO_BASIC_INFORMATION          = SMB_QFILEINFO_BASIC_INFORMATION,
431 		     RAW_FILEINFO_STANDARD_INFORMATION       = SMB_QFILEINFO_STANDARD_INFORMATION,
432 		     RAW_FILEINFO_INTERNAL_INFORMATION       = SMB_QFILEINFO_INTERNAL_INFORMATION,
433 		     RAW_FILEINFO_EA_INFORMATION             = SMB_QFILEINFO_EA_INFORMATION,
434 		     RAW_FILEINFO_ACCESS_INFORMATION         = SMB_QFILEINFO_ACCESS_INFORMATION,
435 		     RAW_FILEINFO_NAME_INFORMATION           = SMB_QFILEINFO_NAME_INFORMATION,
436 		     RAW_FILEINFO_POSITION_INFORMATION       = SMB_QFILEINFO_POSITION_INFORMATION,
437 		     RAW_FILEINFO_MODE_INFORMATION           = SMB_QFILEINFO_MODE_INFORMATION,
438 		     RAW_FILEINFO_ALIGNMENT_INFORMATION      = SMB_QFILEINFO_ALIGNMENT_INFORMATION,
439 		     RAW_FILEINFO_ALL_INFORMATION            = SMB_QFILEINFO_ALL_INFORMATION,
440 		     RAW_FILEINFO_ALT_NAME_INFORMATION       = SMB_QFILEINFO_ALT_NAME_INFORMATION,
441 		     RAW_FILEINFO_STREAM_INFORMATION         = SMB_QFILEINFO_STREAM_INFORMATION,
442 		     RAW_FILEINFO_COMPRESSION_INFORMATION    = SMB_QFILEINFO_COMPRESSION_INFORMATION,
443 		     RAW_FILEINFO_NETWORK_OPEN_INFORMATION   = SMB_QFILEINFO_NETWORK_OPEN_INFORMATION,
444 		     RAW_FILEINFO_ATTRIBUTE_TAG_INFORMATION  = SMB_QFILEINFO_ATTRIBUTE_TAG_INFORMATION,
445 		     /* SMB2 specific levels */
446 		     RAW_FILEINFO_SMB2_ALL_EAS               = 0x0f01,
447 		     RAW_FILEINFO_SMB2_ALL_INFORMATION       = 0x1201
448 };
449 
450 /* union used in qfileinfo() and qpathinfo() backend calls */
451 union smb_fileinfo {
452 	/* generic interface:
453 	 * matches RAW_FILEINFO_GENERIC */
454 	struct {
455 		enum smb_fileinfo_level level;
456 		struct {
457 			union smb_handle_or_path file;
458 		} in;
459 		struct {
460 			uint32_t attrib;
461 			uint32_t ea_size;
462 			uint_t num_eas;
463 			struct ea_struct {
464 				uint8_t flags;
465 				struct smb_wire_string name;
466 				DATA_BLOB value;
467 			} *eas;
468 			NTTIME create_time;
469 			NTTIME access_time;
470 			NTTIME write_time;
471 			NTTIME change_time;
472 			uint64_t alloc_size;
473 			uint64_t size;
474 			uint32_t nlink;
475 			struct smb_wire_string fname;
476 			struct smb_wire_string alt_fname;
477 			uint8_t delete_pending;
478 			uint8_t directory;
479 			uint64_t compressed_size;
480 			uint16_t format;
481 			uint8_t unit_shift;
482 			uint8_t chunk_shift;
483 			uint8_t cluster_shift;
484 			uint64_t file_id;
485 			uint32_t access_flags; /* seen 0x001f01ff from w2k3 */
486 			uint64_t position;
487 			uint32_t mode;
488 			uint32_t alignment_requirement;
489 			uint32_t reparse_tag;
490 			uint_t num_streams;
491 			struct stream_struct {
492 				uint64_t size;
493 				uint64_t alloc_size;
494 				struct smb_wire_string stream_name;
495 			} *streams;
496 		} out;
497 	} generic;
498 
499 
500 	/* SMBgetatr interface:
501 	 * matches RAW_FILEINFO_GETATTR */
502 	struct {
503 		enum smb_fileinfo_level level;
504 		struct {
505 			union smb_handle_or_path file;
506 		} in;
507 		struct {
508 			uint16_t attrib;
509 			uint32_t size;
510 			time_t write_time;
511 		} out;
512 	} getattr;
513 
514 	/* SMBgetattrE and  RAW_FILEINFO_STANDARD interface */
515 	struct {
516 		enum smb_fileinfo_level level;
517 		struct {
518 			union smb_handle_or_path file;
519 		} in;
520 		struct {
521 			time_t create_time;
522 			time_t access_time;
523 			time_t write_time;
524 			uint32_t size;
525 			uint32_t alloc_size;
526 			uint16_t attrib;
527 		} out;
528 	} getattre, standard;
529 
530 	/* trans2 RAW_FILEINFO_EA_SIZE interface */
531 	struct {
532 		enum smb_fileinfo_level level;
533 		struct {
534 			union smb_handle_or_path file;
535 		} in;
536 		struct {
537 			time_t create_time;
538 			time_t access_time;
539 			time_t write_time;
540 			uint32_t size;
541 			uint32_t alloc_size;
542 			uint16_t attrib;
543 			uint32_t ea_size;
544 		} out;
545 	} ea_size;
546 
547 	/* trans2 RAW_FILEINFO_EA_LIST interface */
548 	struct {
549 		enum smb_fileinfo_level level;
550 		struct {
551 			union smb_handle_or_path file;
552 			uint_t num_names;
553 			struct ea_name {
554 				struct smb_wire_string name;
555 			} *ea_names;
556 		} in;
557 
558 		struct smb_ea_list {
559 			uint_t num_eas;
560 			struct ea_struct *eas;
561 		} out;
562 	} ea_list;
563 
564 	/* trans2 RAW_FILEINFO_ALL_EAS and RAW_FILEINFO_FULL_EA_INFORMATION interfaces */
565 	struct {
566 		enum smb_fileinfo_level level;
567 		struct {
568 			union smb_handle_or_path file;
569 			/* SMB2 only - SMB2_CONTINUE_FLAG_* */
570 			uint8_t continue_flags;
571 		} in;
572 		struct smb_ea_list out;
573 	} all_eas;
574 
575 	/* trans2 qpathinfo RAW_FILEINFO_IS_NAME_VALID interface
576 	   only valid for a QPATHNAME call - no returned data */
577 	struct {
578 		enum smb_fileinfo_level level;
579 		struct {
580 			union smb_handle_or_path file;
581 		} in;
582 	} is_name_valid;
583 
584 	/* RAW_FILEINFO_BASIC_INFO and RAW_FILEINFO_BASIC_INFORMATION interfaces */
585 	struct {
586 		enum smb_fileinfo_level level;
587 		struct {
588 			union smb_handle_or_path file;
589 		} in;
590 		struct {
591 			NTTIME create_time;
592 			NTTIME access_time;
593 			NTTIME write_time;
594 			NTTIME change_time;
595 			uint32_t attrib;
596 		} out;
597 	} basic_info;
598 
599 
600 	/* RAW_FILEINFO_STANDARD_INFO and RAW_FILEINFO_STANDARD_INFORMATION interfaces */
601 	struct {
602 		enum smb_fileinfo_level level;
603 		struct {
604 			union smb_handle_or_path file;
605 		} in;
606 		struct {
607 			uint64_t alloc_size;
608 			uint64_t size;
609 			uint32_t nlink;
610 			BOOL delete_pending;
611 			BOOL directory;
612 		} out;
613 	} standard_info;
614 
615 	/* RAW_FILEINFO_EA_INFO and RAW_FILEINFO_EA_INFORMATION interfaces */
616 	struct {
617 		enum smb_fileinfo_level level;
618 		struct {
619 			union smb_handle_or_path file;
620 		} in;
621 		struct {
622 			uint32_t ea_size;
623 		} out;
624 	} ea_info;
625 
626 	/* RAW_FILEINFO_NAME_INFO and RAW_FILEINFO_NAME_INFORMATION interfaces */
627 	struct {
628 		enum smb_fileinfo_level level;
629 		struct {
630 			union smb_handle_or_path file;
631 		} in;
632 		struct {
633 			struct smb_wire_string fname;
634 		} out;
635 	} name_info;
636 
637 	/* RAW_FILEINFO_ALL_INFO and RAW_FILEINFO_ALL_INFORMATION interfaces */
638 	struct {
639 		enum smb_fileinfo_level level;
640 		struct {
641 			union smb_handle_or_path file;
642 		} in;
643 		struct {
644 			NTTIME create_time;
645 			NTTIME access_time;
646 			NTTIME write_time;
647 			NTTIME change_time;
648 			uint32_t attrib;
649 			uint64_t alloc_size;
650 			uint64_t size;
651 			uint32_t nlink;
652 			uint8_t delete_pending;
653 			uint8_t directory;
654 			uint32_t ea_size;
655 			struct smb_wire_string fname;
656 		} out;
657 	} all_info;
658 
659 	/* RAW_FILEINFO_SMB2_ALL_INFORMATION interface */
660 	struct {
661 		enum smb_fileinfo_level level;
662 		struct {
663 			union smb_handle_or_path file;
664 		} in;
665 		struct {
666 			NTTIME   create_time;
667 			NTTIME   access_time;
668 			NTTIME   write_time;
669 			NTTIME   change_time;
670 			uint32_t attrib;
671 			uint32_t unknown1;
672 			uint64_t alloc_size;
673 			uint64_t size;
674 			uint32_t nlink;
675 			uint8_t  delete_pending;
676 			uint8_t  directory;
677 			/* uint16_t _pad; */
678 			uint64_t file_id;
679 			uint32_t ea_size;
680 			uint32_t access_mask;
681 			uint64_t position;
682 			uint64_t mode;
683 			struct smb_wire_string fname;
684 		} out;
685 	} all_info2;
686 
687 	/* RAW_FILEINFO_ALT_NAME_INFO and RAW_FILEINFO_ALT_NAME_INFORMATION interfaces */
688 	struct {
689 		enum smb_fileinfo_level level;
690 		struct {
691 			union smb_handle_or_path file;
692 		} in;
693 		struct {
694 			struct smb_wire_string fname;
695 		} out;
696 	} alt_name_info;
697 
698 	/* RAW_FILEINFO_STREAM_INFO and RAW_FILEINFO_STREAM_INFORMATION interfaces */
699 	struct {
700 		enum smb_fileinfo_level level;
701 		struct {
702 			union smb_handle_or_path file;
703 		} in;
704 		struct stream_information {
705 			uint_t num_streams;
706 			struct stream_struct *streams;
707 		} out;
708 	} stream_info;
709 
710 	/* RAW_FILEINFO_COMPRESSION_INFO and RAW_FILEINFO_COMPRESSION_INFORMATION interfaces */
711 	struct {
712 		enum smb_fileinfo_level level;
713 		struct {
714 			union smb_handle_or_path file;
715 		} in;
716 		struct {
717 			uint64_t compressed_size;
718 			uint16_t format;
719 			uint8_t unit_shift;
720 			uint8_t chunk_shift;
721 			uint8_t cluster_shift;
722 		} out;
723 	} compression_info;
724 
725 	/* RAW_FILEINFO_UNIX_BASIC interface */
726 	struct {
727 		enum smb_fileinfo_level level;
728 		struct {
729 			union smb_handle_or_path file;
730 		} in;
731 		struct {
732 			uint64_t end_of_file;
733 			uint64_t num_bytes;
734 			NTTIME status_change_time;
735 			NTTIME access_time;
736 			NTTIME change_time;
737 			uint64_t uid;
738 			uint64_t gid;
739 			uint32_t file_type;
740 			uint64_t dev_major;
741 			uint64_t dev_minor;
742 			uint64_t unique_id;
743 			uint64_t permissions;
744 			uint64_t nlink;
745 		} out;
746 	} unix_basic_info;
747 
748 	/* RAW_FILEINFO_UNIX_LINK interface */
749 	struct {
750 		enum smb_fileinfo_level level;
751 		struct {
752 			union smb_handle_or_path file;
753 		} in;
754 		struct {
755 			struct smb_wire_string link_dest;
756 		} out;
757 	} unix_link_info;
758 
759 	/* RAW_FILEINFO_INTERNAL_INFORMATION interface */
760 	struct {
761 		enum smb_fileinfo_level level;
762 		struct {
763 			union smb_handle_or_path file;
764 		} in;
765 		struct {
766 			uint64_t file_id;
767 		} out;
768 	} internal_information;
769 
770 	/* RAW_FILEINFO_ACCESS_INFORMATION interface */
771 	struct {
772 		enum smb_fileinfo_level level;
773 		struct {
774 			union smb_handle_or_path file;
775 		} in;
776 		struct {
777 			uint32_t access_flags;
778 		} out;
779 	} access_information;
780 
781 	/* RAW_FILEINFO_POSITION_INFORMATION interface */
782 	struct {
783 		enum smb_fileinfo_level level;
784 		struct {
785 			union smb_handle_or_path file;
786 		} in;
787 		struct {
788 			uint64_t position;
789 		} out;
790 	} position_information;
791 
792 	/* RAW_FILEINFO_MODE_INFORMATION interface */
793 	struct {
794 		enum smb_fileinfo_level level;
795 		struct {
796 			union smb_handle_or_path file;
797 		} in;
798 		struct {
799 			uint32_t mode;
800 		} out;
801 	} mode_information;
802 
803 	/* RAW_FILEINFO_ALIGNMENT_INFORMATION interface */
804 	struct {
805 		enum smb_fileinfo_level level;
806 		struct {
807 			union smb_handle_or_path file;
808 		} in;
809 		struct {
810 			uint32_t alignment_requirement;
811 		} out;
812 	} alignment_information;
813 
814 	/* RAW_FILEINFO_NETWORK_OPEN_INFORMATION interface */
815 	struct {
816 		enum smb_fileinfo_level level;
817 		struct {
818 			union smb_handle_or_path file;
819 		} in;
820 		struct {
821 			NTTIME create_time;
822 			NTTIME access_time;
823 			NTTIME write_time;
824 			NTTIME change_time;
825 			uint64_t alloc_size;
826 			uint64_t size;
827 			uint32_t attrib;
828 		} out;
829 	} network_open_information;
830 
831 
832 	/* RAW_FILEINFO_ATTRIBUTE_TAG_INFORMATION interface */
833 	struct {
834 		enum smb_fileinfo_level level;
835 		struct {
836 			union smb_handle_or_path file;
837 		} in;
838 		struct {
839 			uint32_t attrib;
840 			uint32_t reparse_tag;
841 		} out;
842 	} attribute_tag_information;
843 
844 	/* RAW_FILEINFO_SEC_DESC */
845 	struct {
846 		enum smb_fileinfo_level level;
847 		struct {
848 			union smb_handle_or_path file;
849 			uint32_t secinfo_flags;
850 		} in;
851 		struct {
852 			struct security_descriptor *sd;
853 		} out;
854 	} query_secdesc;
855 };
856 
857 
858 enum smb_setfileinfo_level {
859 	RAW_SFILEINFO_GENERIC		      = 0xF000,
860 	RAW_SFILEINFO_SETATTR,		      /* SMBsetatr */
861 	RAW_SFILEINFO_SETATTRE,		      /* SMBsetattrE */
862 	RAW_SFILEINFO_SEC_DESC,               /* NT_TRANSACT_SET_SECURITY_DESC */
863 	RAW_SFILEINFO_STANDARD                = SMB_SFILEINFO_STANDARD,
864 	RAW_SFILEINFO_EA_SET                  = SMB_SFILEINFO_EA_SET,
865 	RAW_SFILEINFO_BASIC_INFO              = SMB_SFILEINFO_BASIC_INFO,
866 	RAW_SFILEINFO_DISPOSITION_INFO        = SMB_SFILEINFO_DISPOSITION_INFO,
867 	RAW_SFILEINFO_ALLOCATION_INFO         = SMB_SFILEINFO_ALLOCATION_INFO,
868 	RAW_SFILEINFO_END_OF_FILE_INFO        = SMB_SFILEINFO_END_OF_FILE_INFO,
869 	RAW_SFILEINFO_UNIX_BASIC              = SMB_SFILEINFO_UNIX_BASIC,
870 	RAW_SFILEINFO_UNIX_LINK               = SMB_SFILEINFO_UNIX_LINK,
871 	RAW_SFILEINFO_UNIX_HLINK	      = SMB_SFILEINFO_UNIX_HLINK,
872 	RAW_SFILEINFO_BASIC_INFORMATION       = SMB_SFILEINFO_BASIC_INFORMATION,
873 	RAW_SFILEINFO_RENAME_INFORMATION      = SMB_SFILEINFO_RENAME_INFORMATION,
874 	RAW_SFILEINFO_DISPOSITION_INFORMATION = SMB_SFILEINFO_DISPOSITION_INFORMATION,
875 	RAW_SFILEINFO_POSITION_INFORMATION    = SMB_SFILEINFO_POSITION_INFORMATION,
876 	RAW_SFILEINFO_MODE_INFORMATION        = SMB_SFILEINFO_MODE_INFORMATION,
877 	RAW_SFILEINFO_ALLOCATION_INFORMATION  = SMB_SFILEINFO_ALLOCATION_INFORMATION,
878 	RAW_SFILEINFO_END_OF_FILE_INFORMATION = SMB_SFILEINFO_END_OF_FILE_INFORMATION,
879 	RAW_SFILEINFO_1023                    = SMB_SFILEINFO_1023,
880 	RAW_SFILEINFO_1025                    = SMB_SFILEINFO_1025,
881 	RAW_SFILEINFO_1029                    = SMB_SFILEINFO_1029,
882 	RAW_SFILEINFO_1032                    = SMB_SFILEINFO_1032,
883 	RAW_SFILEINFO_1039                    = SMB_SFILEINFO_1039,
884 	RAW_SFILEINFO_1040                    = SMB_SFILEINFO_1040
885 };
886 
887 /* union used in setfileinfo() and setpathinfo() calls */
888 union smb_setfileinfo {
889 	/* generic interface */
890 	struct {
891 		enum smb_setfileinfo_level level;
892 		struct {
893 			union smb_handle_or_path file;
894 		} in;
895 	} generic;
896 
897 	/* RAW_SFILEINFO_SETATTR (SMBsetatr) interface - only via setpathinfo() */
898 	struct {
899 		enum smb_setfileinfo_level level;
900 		struct {
901 			union smb_handle_or_path file;
902 			uint16_t attrib;
903 			time_t write_time;
904 		} in;
905 	} setattr;
906 
907 	/* RAW_SFILEINFO_SETATTRE (SMBsetattrE) interface - only via setfileinfo()
908 	   also RAW_SFILEINFO_STANDARD */
909 	struct {
910 		enum smb_setfileinfo_level level;
911 		struct {
912 			union smb_handle_or_path file;
913 			time_t create_time;
914 			time_t access_time;
915 			time_t write_time;
916 			/* notice that size, alloc_size and attrib are not settable,
917 			   unlike the corresponding qfileinfo level */
918 		} in;
919 	} setattre, standard;
920 
921 	/* RAW_SFILEINFO_EA_SET interface */
922 	struct {
923 		enum smb_setfileinfo_level level;
924 		struct {
925 			union smb_handle_or_path file;
926 			uint_t num_eas;
927 			struct ea_struct *eas;
928 		} in;
929 	} ea_set;
930 
931 	/* RAW_SFILEINFO_BASIC_INFO and
932 	   RAW_SFILEINFO_BASIC_INFORMATION interfaces */
933 	struct {
934 		enum smb_setfileinfo_level level;
935 		struct {
936 			union smb_handle_or_path file;
937 			NTTIME create_time;
938 			NTTIME access_time;
939 			NTTIME write_time;
940 			NTTIME change_time;
941 			uint32_t attrib;
942 		} in;
943 	} basic_info;
944 
945 	/* RAW_SFILEINFO_DISPOSITION_INFO and
946 	   RAW_SFILEINFO_DISPOSITION_INFORMATION interfaces */
947 	struct {
948 		enum smb_setfileinfo_level level;
949 		struct {
950 			union smb_handle_or_path file;
951 			BOOL delete_on_close;
952 		} in;
953 	} disposition_info;
954 
955 	/* RAW_SFILEINFO_ALLOCATION_INFO and
956 	   RAW_SFILEINFO_ALLOCATION_INFORMATION interfaces */
957 	struct {
958 		enum smb_setfileinfo_level level;
959 		struct {
960 			union smb_handle_or_path file;
961 			/* w2k3 rounds this up to nearest 4096 */
962 			uint64_t alloc_size;
963 		} in;
964 	} allocation_info;
965 
966 	/* RAW_SFILEINFO_END_OF_FILE_INFO and
967 	   RAW_SFILEINFO_END_OF_FILE_INFORMATION interfaces */
968 	struct {
969 		enum smb_setfileinfo_level level;
970 		struct {
971 			union smb_handle_or_path file;
972 			uint64_t size;
973 		} in;
974 	} end_of_file_info;
975 
976 	/* RAW_SFILEINFO_RENAME_INFORMATION interface */
977 	struct {
978 		enum smb_setfileinfo_level level;
979 		struct {
980 			union smb_handle_or_path file;
981 			uint8_t overwrite;
982 			uint32_t root_fid;
983 			const char *new_name;
984 		} in;
985 	} rename_information;
986 
987 	/* RAW_SFILEINFO_POSITION_INFORMATION interface */
988 	struct {
989 		enum smb_setfileinfo_level level;
990 		struct {
991 			union smb_handle_or_path file;
992 			uint64_t position;
993 		} in;
994 	} position_information;
995 
996 	/* RAW_SFILEINFO_MODE_INFORMATION interface */
997 	struct {
998 		enum smb_setfileinfo_level level;
999 		struct {
1000 			union smb_handle_or_path file;
1001 			/* valid values seem to be 0, 2, 4 and 6 */
1002 			uint32_t mode;
1003 		} in;
1004 	} mode_information;
1005 
1006 
1007 
1008 	/* RAW_SFILEINFO_UNIX_BASIC interface */
1009 	struct {
1010 		enum smb_setfileinfo_level level;
1011 		struct {
1012 			union smb_handle_or_path file;
1013 			uint32_t mode; /* yuck - this field remains to fix compile of libcli/clifile.c */
1014 			uint64_t end_of_file;
1015 			uint64_t num_bytes;
1016 			NTTIME status_change_time;
1017 			NTTIME access_time;
1018 			NTTIME change_time;
1019 			uint64_t uid;
1020 			uint64_t gid;
1021 			uint32_t file_type;
1022 			uint64_t dev_major;
1023 			uint64_t dev_minor;
1024 			uint64_t unique_id;
1025 			uint64_t permissions;
1026 			uint64_t nlink;
1027 		} in;
1028 	} unix_basic;
1029 
1030 	/* RAW_SFILEINFO_UNIX_LINK, RAW_SFILEINFO_UNIX_HLINK interface */
1031 	struct {
1032 		enum smb_setfileinfo_level level;
1033 		struct {
1034 			union smb_handle_or_path file;
1035 			const char *link_dest;
1036 		} in;
1037 	} unix_link, unix_hlink;
1038 
1039 	/* RAW_FILEINFO_SET_SEC_DESC */
1040 	struct {
1041 		enum smb_setfileinfo_level level;
1042 		struct {
1043 			union smb_handle_or_path file;
1044 			uint32_t secinfo_flags;
1045 			struct security_descriptor *sd;
1046 		} in;
1047 	} set_secdesc;
1048 };
1049 
1050 
1051 enum smb_fsinfo_level {
1052 		   RAW_QFS_GENERIC                        = 0xF000,
1053 		   RAW_QFS_DSKATTR,                         /* SMBdskattr */
1054 		   RAW_QFS_ALLOCATION                     = SMB_QFS_ALLOCATION,
1055 		   RAW_QFS_VOLUME                         = SMB_QFS_VOLUME,
1056 		   RAW_QFS_VOLUME_INFO                    = SMB_QFS_VOLUME_INFO,
1057 		   RAW_QFS_SIZE_INFO                      = SMB_QFS_SIZE_INFO,
1058 		   RAW_QFS_DEVICE_INFO                    = SMB_QFS_DEVICE_INFO,
1059 		   RAW_QFS_ATTRIBUTE_INFO                 = SMB_QFS_ATTRIBUTE_INFO,
1060 		   RAW_QFS_UNIX_INFO                      = SMB_QFS_UNIX_INFO,
1061 		   RAW_QFS_VOLUME_INFORMATION		  = SMB_QFS_VOLUME_INFORMATION,
1062 		   RAW_QFS_SIZE_INFORMATION               = SMB_QFS_SIZE_INFORMATION,
1063 		   RAW_QFS_DEVICE_INFORMATION             = SMB_QFS_DEVICE_INFORMATION,
1064 		   RAW_QFS_ATTRIBUTE_INFORMATION          = SMB_QFS_ATTRIBUTE_INFORMATION,
1065 		   RAW_QFS_QUOTA_INFORMATION              = SMB_QFS_QUOTA_INFORMATION,
1066 		   RAW_QFS_FULL_SIZE_INFORMATION          = SMB_QFS_FULL_SIZE_INFORMATION,
1067 		   RAW_QFS_OBJECTID_INFORMATION           = SMB_QFS_OBJECTID_INFORMATION};
1068 
1069 
1070 /* union for fsinfo() backend call. Note that there are no in
1071    structures, as this call only contains out parameters */
1072 union smb_fsinfo {
1073 	/* generic interface */
1074 	struct {
1075 		enum smb_fsinfo_level level;
1076 		struct smb2_handle handle; /* only for smb2 */
1077 
1078 		struct {
1079 			uint32_t block_size;
1080 			uint64_t blocks_total;
1081 			uint64_t blocks_free;
1082 			uint32_t fs_id;
1083 			NTTIME create_time;
1084 			uint32_t serial_number;
1085 			uint32_t fs_attr;
1086 			uint32_t max_file_component_length;
1087 			uint32_t device_type;
1088 			uint32_t device_characteristics;
1089 			uint64_t quota_soft;
1090 			uint64_t quota_hard;
1091 			uint64_t quota_flags;
1092 			struct GUID guid;
1093 			char *volume_name;
1094 			char *fs_type;
1095 		} out;
1096 	} generic;
1097 
1098 	/* SMBdskattr interface */
1099 	struct {
1100 		enum smb_fsinfo_level level;
1101 
1102 		struct {
1103 			uint16_t units_total;
1104 			uint16_t blocks_per_unit;
1105 			uint16_t block_size;
1106 			uint16_t units_free;
1107 		} out;
1108 	} dskattr;
1109 
1110 	/* trans2 RAW_QFS_ALLOCATION interface */
1111 	struct {
1112 		enum smb_fsinfo_level level;
1113 
1114 		struct {
1115 			uint32_t fs_id;
1116 			uint32_t sectors_per_unit;
1117 			uint32_t total_alloc_units;
1118 			uint32_t avail_alloc_units;
1119 			uint16_t bytes_per_sector;
1120 		} out;
1121 	} allocation;
1122 
1123 	/* TRANS2 RAW_QFS_VOLUME interface */
1124 	struct {
1125 		enum smb_fsinfo_level level;
1126 
1127 		struct {
1128 			uint32_t serial_number;
1129 			struct smb_wire_string volume_name;
1130 		} out;
1131 	} volume;
1132 
1133 	/* TRANS2 RAW_QFS_VOLUME_INFO and RAW_QFS_VOLUME_INFORMATION interfaces */
1134 	struct {
1135 		enum smb_fsinfo_level level;
1136 		struct smb2_handle handle; /* only for smb2 */
1137 
1138 		struct {
1139 			NTTIME create_time;
1140 			uint32_t serial_number;
1141 			struct smb_wire_string volume_name;
1142 		} out;
1143 	} volume_info;
1144 
1145 	/* trans2 RAW_QFS_SIZE_INFO and RAW_QFS_SIZE_INFORMATION interfaces */
1146 	struct {
1147 		enum smb_fsinfo_level level;
1148 		struct smb2_handle handle; /* only for smb2 */
1149 
1150 		struct {
1151 			uint64_t total_alloc_units;
1152 			uint64_t avail_alloc_units; /* maps to call_avail_alloc_units */
1153 			uint32_t sectors_per_unit;
1154 			uint32_t bytes_per_sector;
1155 		} out;
1156 	} size_info;
1157 
1158 	/* TRANS2 RAW_QFS_DEVICE_INFO and RAW_QFS_DEVICE_INFORMATION interfaces */
1159 	struct {
1160 		enum smb_fsinfo_level level;
1161 		struct smb2_handle handle; /* only for smb2 */
1162 
1163 		struct {
1164 			uint32_t device_type;
1165 			uint32_t characteristics;
1166 		} out;
1167 	} device_info;
1168 
1169 
1170 	/* TRANS2 RAW_QFS_ATTRIBUTE_INFO and RAW_QFS_ATTRIBUTE_INFORMATION interfaces */
1171 	struct {
1172 		enum smb_fsinfo_level level;
1173 		struct smb2_handle handle; /* only for smb2 */
1174 
1175 		struct {
1176 			uint32_t fs_attr;
1177 			uint32_t max_file_component_length;
1178 			struct smb_wire_string fs_type;
1179 		} out;
1180 	} attribute_info;
1181 
1182 
1183 	/* TRANS2 RAW_QFS_UNIX_INFO interface */
1184 	struct {
1185 		enum smb_fsinfo_level level;
1186 
1187 		struct {
1188 			uint16_t major_version;
1189 			uint16_t minor_version;
1190 			uint64_t capability;
1191 		} out;
1192 	} unix_info;
1193 
1194 	/* trans2 RAW_QFS_QUOTA_INFORMATION interface */
1195 	struct {
1196 		enum smb_fsinfo_level level;
1197 		struct smb2_handle handle; /* only for smb2 */
1198 
1199 		struct {
1200 			uint64_t unknown[3];
1201 			uint64_t quota_soft;
1202 			uint64_t quota_hard;
1203 			uint64_t quota_flags;
1204 		} out;
1205 	} quota_information;
1206 
1207 	/* trans2 RAW_QFS_FULL_SIZE_INFORMATION interface */
1208 	struct {
1209 		enum smb_fsinfo_level level;
1210 		struct smb2_handle handle; /* only for smb2 */
1211 
1212 		struct {
1213 			uint64_t total_alloc_units;
1214 			uint64_t call_avail_alloc_units;
1215 			uint64_t actual_avail_alloc_units;
1216 			uint32_t sectors_per_unit;
1217 			uint32_t bytes_per_sector;
1218 		} out;
1219 	} full_size_information;
1220 
1221 	/* trans2 RAW_QFS_OBJECTID_INFORMATION interface */
1222 	struct {
1223 		enum smb_fsinfo_level level;
1224 		struct smb2_handle handle; /* only for smb2 */
1225 
1226 		struct {
1227 			struct GUID  guid;
1228 			uint64_t unknown[6];
1229 		} out;
1230 	} objectid_information;
1231 };
1232 
1233 
1234 
1235 enum smb_open_level {
1236 	RAW_OPEN_OPEN,
1237 	RAW_OPEN_OPENX,
1238 	RAW_OPEN_MKNEW,
1239 	RAW_OPEN_CREATE,
1240 	RAW_OPEN_CTEMP,
1241 	RAW_OPEN_SPLOPEN,
1242 	RAW_OPEN_NTCREATEX,
1243 	RAW_OPEN_T2OPEN,
1244 	RAW_OPEN_NTTRANS_CREATE,
1245 	RAW_OPEN_OPENX_READX,
1246 	RAW_OPEN_SMB2
1247 };
1248 
1249 /* the generic interface is defined to be equal to the NTCREATEX interface */
1250 #define RAW_OPEN_GENERIC RAW_OPEN_NTCREATEX
1251 
1252 /* union for open() backend call */
1253 union smb_open {
1254 /*
1255  * because the *.out.file structs are not aligned to the same offset for each level
1256  * we provide a hepler macro that should be used to find the current smb_handle structure
1257  */
1258 #define SMB_OPEN_OUT_FILE(op, file) do { \
1259 	switch (op->generic.level) { \
1260 	case RAW_OPEN_OPEN: \
1261 		file = &op->openold.out.file; \
1262 		break; \
1263 	case RAW_OPEN_OPENX: \
1264 		file = &op->openx.out.file; \
1265 		break; \
1266 	case RAW_OPEN_MKNEW: \
1267 		file = &op->mknew.out.file; \
1268 		break; \
1269 	case RAW_OPEN_CREATE: \
1270 		file = &op->create.out.file; \
1271 		break; \
1272 	case RAW_OPEN_CTEMP: \
1273 		file = &op->ctemp.out.file; \
1274 		break; \
1275 	case RAW_OPEN_SPLOPEN: \
1276 		file = &op->splopen.out.file; \
1277 		break; \
1278 	case RAW_OPEN_NTCREATEX: \
1279 		file = &op->ntcreatex.out.file; \
1280 		break; \
1281 	case RAW_OPEN_T2OPEN: \
1282 		file = &op->t2open.out.file; \
1283 		break; \
1284 	case RAW_OPEN_NTTRANS_CREATE: \
1285 		file = &op->nttrans.out.file; \
1286 		break; \
1287 	case RAW_OPEN_OPENX_READX: \
1288 		file = &op->openxreadx.out.file; \
1289 		break; \
1290 	case RAW_OPEN_SMB2: \
1291 		file = &op->smb2.out.file; \
1292 		break; \
1293 	default: \
1294 		/* this must be a programmer error */ \
1295 		file = NULL; \
1296 		break; \
1297 	} \
1298 } while (0)
1299 	/* SMBNTCreateX interface */
1300 	struct {
1301 		enum smb_open_level level;
1302 		struct {
1303 			uint32_t flags;
1304 			uint32_t root_fid;
1305 			uint32_t access_mask;
1306 			uint64_t alloc_size;
1307 			uint32_t file_attr;
1308 			uint32_t share_access;
1309 			uint32_t open_disposition;
1310 			uint32_t create_options;
1311 			uint32_t impersonation;
1312 			uint8_t  security_flags;
1313 			/* NOTE: fname can also be a pointer to a
1314 			 uint64_t file_id if create_options has the
1315 			 NTCREATEX_OPTIONS_OPEN_BY_FILE_ID flag set */
1316 			const char *fname;
1317 
1318 			/* these last 2 elements are only used in the
1319 			   NTTRANS varient of the call */
1320 			struct security_descriptor *sec_desc;
1321 			struct smb_ea_list *ea_list;
1322 		} in;
1323 		struct {
1324 			union smb_handle file;
1325 			uint8_t oplock_level;
1326 			uint32_t create_action;
1327 			NTTIME create_time;
1328 			NTTIME access_time;
1329 			NTTIME write_time;
1330 			NTTIME change_time;
1331 			uint32_t attrib;
1332 			uint64_t alloc_size;
1333 			uint64_t size;
1334 			uint16_t file_type;
1335 			uint16_t ipc_state;
1336 			uint8_t  is_directory;
1337 		} out;
1338 	} ntcreatex, nttrans, generic;
1339 
1340 	/* TRANS2_OPEN interface */
1341 	struct {
1342 		enum smb_open_level level;
1343 		struct {
1344 			uint16_t flags;
1345 			uint16_t open_mode;
1346 			uint16_t search_attrs;
1347 			uint16_t file_attrs;
1348 			time_t write_time;
1349 			uint16_t open_func;
1350 			uint32_t size;
1351 			uint32_t timeout;
1352 			const char *fname;
1353 			uint_t num_eas;
1354 			struct ea_struct *eas;
1355 		} in;
1356 		struct {
1357 			union smb_handle file;
1358 			uint16_t attrib;
1359 			time_t write_time;
1360 			uint32_t size;
1361 			uint16_t access;
1362 			uint16_t ftype;
1363 			uint16_t devstate;
1364 			uint16_t action;
1365 			uint32_t file_id;
1366 		} out;
1367 	} t2open;
1368 
1369 	/* SMBopen interface */
1370 	struct {
1371 		enum smb_open_level level;
1372 		struct {
1373 			uint16_t open_mode;
1374 			uint16_t search_attrs;
1375 			const char *fname;
1376 		} in;
1377 		struct {
1378 			union smb_handle file;
1379 			uint16_t attrib;
1380 			time_t write_time;
1381 			uint32_t size;
1382 			uint16_t rmode;
1383 		} out;
1384 	} openold;
1385 
1386 	/* SMBopenX interface */
1387 	struct {
1388 		enum smb_open_level level;
1389 		struct {
1390 			uint16_t flags;
1391 			uint16_t open_mode;
1392 			uint16_t search_attrs; /* not honoured by win2003 */
1393 			uint16_t file_attrs;
1394 			time_t write_time; /* not honoured by win2003 */
1395 			uint16_t open_func;
1396 			uint32_t size; /* note that this sets the
1397 					initial file size, not
1398 					just allocation size */
1399 			uint32_t timeout; /* not honoured by win2003 */
1400 			const char *fname;
1401 		} in;
1402 		struct {
1403 			union smb_handle file;
1404 			uint16_t attrib;
1405 			time_t write_time;
1406 			uint32_t size;
1407 			uint16_t access;
1408 			uint16_t ftype;
1409 			uint16_t devstate;
1410 			uint16_t action;
1411 			uint32_t unique_fid;
1412 			uint32_t access_mask;
1413 			uint32_t unknown;
1414 		} out;
1415 	} openx;
1416 
1417 	/* SMBmknew interface */
1418 	struct {
1419 		enum smb_open_level level;
1420 		struct {
1421 			uint16_t attrib;
1422 			time_t write_time;
1423 			const char *fname;
1424 		} in;
1425 		struct {
1426 			union smb_handle file;
1427 		} out;
1428 	} mknew, create;
1429 
1430 	/* SMBctemp interface */
1431 	struct {
1432 		enum smb_open_level level;
1433 		struct {
1434 			uint16_t attrib;
1435 			time_t write_time;
1436 			const char *directory;
1437 		} in;
1438 		struct {
1439 			union smb_handle file;
1440 			/* temp name, relative to directory */
1441 			char *name;
1442 		} out;
1443 	} ctemp;
1444 
1445 	/* SMBsplopen interface */
1446 	struct {
1447 		enum smb_open_level level;
1448 		struct {
1449 			uint16_t setup_length;
1450 			uint16_t mode;
1451 			const char *ident;
1452 		} in;
1453 		struct {
1454 			union smb_handle file;
1455 		} out;
1456 	} splopen;
1457 
1458 
1459 	/* chained OpenX/ReadX interface */
1460 	struct {
1461 		enum smb_open_level level;
1462 		struct {
1463 			uint16_t flags;
1464 			uint16_t open_mode;
1465 			uint16_t search_attrs; /* not honoured by win2003 */
1466 			uint16_t file_attrs;
1467 			time_t write_time; /* not honoured by win2003 */
1468 			uint16_t open_func;
1469 			uint32_t size; /* note that this sets the
1470 					initial file size, not
1471 					just allocation size */
1472 			uint32_t timeout; /* not honoured by win2003 */
1473 			const char *fname;
1474 
1475 			/* readx part */
1476 			uint64_t offset;
1477 			uint16_t mincnt;
1478 			uint32_t maxcnt;
1479 			uint16_t remaining;
1480 		} in;
1481 		struct {
1482 			union smb_handle file;
1483 			uint16_t attrib;
1484 			time_t write_time;
1485 			uint32_t size;
1486 			uint16_t access;
1487 			uint16_t ftype;
1488 			uint16_t devstate;
1489 			uint16_t action;
1490 			uint32_t unique_fid;
1491 			uint32_t access_mask;
1492 			uint32_t unknown;
1493 
1494 			/* readx part */
1495 			uint8_t *data;
1496 			uint16_t remaining;
1497 			uint16_t compaction_mode;
1498 			uint16_t nread;
1499 		} out;
1500 	} openxreadx;
1501 
1502 #define SMB2_CREATE_FLAG_REQUEST_OPLOCK           0x0100
1503 #define SMB2_CREATE_FLAG_REQUEST_EXCLUSIVE_OPLOCK 0x0800
1504 #define SMB2_CREATE_FLAG_GRANT_OPLOCK             0x0001
1505 #define SMB2_CREATE_FLAG_GRANT_EXCLUSIVE_OPLOCK   0x0080
1506 
1507 	/* SMB2 Create */
1508 	struct smb2_create {
1509 		enum smb_open_level level;
1510 		struct {
1511 			/* static body buffer 56 (0x38) bytes */
1512 			/* uint16_t buffer_code;  0x39 = 0x38 + 1 */
1513 			uint16_t oplock_flags; /* SMB2_CREATE_FLAG_* */
1514 			uint32_t impersonation;
1515 			uint32_t unknown3[4];
1516 			uint32_t access_mask;
1517 
1518 			uint32_t file_attr;
1519 			uint32_t share_access;
1520 			uint32_t open_disposition;
1521 			uint32_t create_options;
1522 
1523 			/* uint16_t fname_ofs */
1524 			/* uint16_t fname_size */
1525 			/* uint32_t blob_ofs; */
1526 			/* uint32_t blob_size; */
1527 
1528 			/* dynamic body */
1529 			const char *fname;
1530 
1531 			/* optional list of extended attributes */
1532 			struct smb_ea_list eas;
1533 		} in;
1534 		struct {
1535 			union smb_handle file;
1536 
1537 			/* static body buffer 88 (0x58) bytes */
1538 			/* uint16_t buffer_code;  0x59 = 0x58 + 1 */
1539 			uint16_t oplock_flags; /* SMB2_CREATE_FLAG_* */
1540 			uint32_t create_action;
1541 			NTTIME   create_time;
1542 			NTTIME   access_time;
1543 			NTTIME   write_time;
1544 			NTTIME   change_time;
1545 			uint64_t alloc_size;
1546 			uint64_t size;
1547 			uint32_t file_attr;
1548 			uint32_t _pad;
1549 			/* struct smb2_handle handle;*/
1550 			/* uint32_t blob_ofs; */
1551 			/* uint32_t blob_size; */
1552 
1553 			/* dynamic body */
1554 			DATA_BLOB blob;
1555 		} out;
1556 	} smb2;
1557 };
1558 
1559 
1560 
1561 enum smb_read_level {
1562 	RAW_READ_READBRAW,
1563 	RAW_READ_LOCKREAD,
1564 	RAW_READ_READ,
1565 	RAW_READ_READX,
1566 	RAW_READ_SMB2
1567 };
1568 
1569 #define RAW_READ_GENERIC RAW_READ_READX
1570 
1571 /* union for read() backend call
1572 
1573    note that .infoX.out.data will be allocated before the backend is
1574    called. It will be big enough to hold the maximum size asked for
1575 */
1576 union smb_read {
1577 	/* SMBreadX (and generic) interface */
1578 	struct {
1579 		enum smb_read_level level;
1580 		struct {
1581 			union smb_handle file;
1582 			uint64_t offset;
1583 			uint16_t mincnt;
1584 			uint32_t maxcnt;
1585 			uint16_t remaining;
1586 			BOOL read_for_execute;
1587 		} in;
1588 		struct {
1589 			uint8_t *data;
1590 			uint16_t remaining;
1591 			uint16_t compaction_mode;
1592 			uint32_t nread;
1593 		} out;
1594 	} readx, generic;
1595 
1596 	/* SMBreadbraw interface */
1597 	struct {
1598 		enum smb_read_level level;
1599 		struct {
1600 			union smb_handle file;
1601 			uint64_t offset;
1602 			uint16_t  maxcnt;
1603 			uint16_t  mincnt;
1604 			uint32_t  timeout;
1605 		} in;
1606 		struct {
1607 			uint8_t *data;
1608 			uint32_t nread;
1609 		} out;
1610 	} readbraw;
1611 
1612 
1613 	/* SMBlockandread interface */
1614 	struct {
1615 		enum smb_read_level level;
1616 		struct {
1617 			union smb_handle file;
1618 			uint16_t count;
1619 			uint32_t offset;
1620 			uint16_t remaining;
1621 		} in;
1622 		struct {
1623 			uint8_t *data;
1624 			uint16_t nread;
1625 		} out;
1626 	} lockread;
1627 
1628 	/* SMBread interface */
1629 	struct {
1630 		enum smb_read_level level;
1631 		struct {
1632 			union smb_handle file;
1633 			uint16_t count;
1634 			uint32_t offset;
1635 			uint16_t remaining;
1636 		} in;
1637 		struct {
1638 			uint8_t *data;
1639 			uint16_t nread;
1640 		} out;
1641 	} read;
1642 
1643 	/* SMB2 Read */
1644 	struct smb2_read {
1645 		enum smb_read_level level;
1646 		struct {
1647 			union smb_handle file;
1648 
1649 			/* static body buffer 48 (0x30) bytes */
1650 			/* uint16_t buffer_code;  0x31 = 0x30 + 1 */
1651 			uint16_t _pad;
1652 			uint32_t length;
1653 			uint64_t offset;
1654 			/* struct smb2_handle handle; */
1655 			uint64_t unknown1; /* 0x0000000000000000 */
1656 			uint64_t unknown2; /* 0x0000000000000000 */
1657 		} in;
1658 		struct {
1659 			/* static body buffer 16 (0x10) bytes */
1660 			/* uint16_t buffer_code;  0x11 = 0x10 + 1 */
1661 			/* uint16_t data_ofs; */
1662 			/* uint32_t data_size; */
1663 			uint64_t unknown1; /* 0x0000000000000000 */
1664 
1665 			/* dynamic body */
1666 			DATA_BLOB data;
1667 		} out;
1668 	} smb2;
1669 };
1670 
1671 
1672 enum smb_write_level {
1673 	RAW_WRITE_WRITEUNLOCK,
1674 	RAW_WRITE_WRITE,
1675 	RAW_WRITE_WRITEX,
1676 	RAW_WRITE_WRITECLOSE,
1677 	RAW_WRITE_SPLWRITE,
1678 	RAW_WRITE_SMB2
1679 };
1680 
1681 #define RAW_WRITE_GENERIC RAW_WRITE_WRITEX
1682 
1683 /* union for write() backend call
1684 */
1685 union smb_write {
1686 	/* SMBwriteX interface */
1687 	struct {
1688 		enum smb_write_level level;
1689 		struct {
1690 			union smb_handle file;
1691 			uint64_t offset;
1692 			uint16_t wmode;
1693 			uint16_t remaining;
1694 			uint32_t count;
1695 			const uint8_t *data;
1696 		} in;
1697 		struct {
1698 			uint32_t nwritten;
1699 			uint16_t remaining;
1700 		} out;
1701 	} writex, generic;
1702 
1703 	/* SMBwriteunlock interface */
1704 	struct {
1705 		enum smb_write_level level;
1706 		struct {
1707 			union smb_handle file;
1708 			uint16_t count;
1709 			uint32_t offset;
1710 			uint16_t remaining;
1711 			const uint8_t *data;
1712 		} in;
1713 		struct {
1714 			uint32_t nwritten;
1715 		} out;
1716 	} writeunlock;
1717 
1718 	/* SMBwrite interface */
1719 	struct {
1720 		enum smb_write_level level;
1721 		struct {
1722 			union smb_handle file;
1723 			uint16_t count;
1724 			uint32_t offset;
1725 			uint16_t remaining;
1726 			const uint8_t *data;
1727 		} in;
1728 		struct {
1729 			uint16_t nwritten;
1730 		} out;
1731 	} write;
1732 
1733 	/* SMBwriteclose interface */
1734 	struct {
1735 		enum smb_write_level level;
1736 		struct {
1737 			union smb_handle file;
1738 			uint16_t count;
1739 			uint32_t offset;
1740 			time_t mtime;
1741 			const uint8_t *data;
1742 		} in;
1743 		struct {
1744 			uint16_t nwritten;
1745 		} out;
1746 	} writeclose;
1747 
1748 	/* SMBsplwrite interface */
1749 	struct {
1750 		enum smb_write_level level;
1751 		struct {
1752 			union smb_handle file;
1753 			uint16_t count;
1754 			const uint8_t *data;
1755 		} in;
1756 	} splwrite;
1757 
1758 	/* SMB2 Write */
1759 	struct smb2_write {
1760 		enum smb_write_level level;
1761 		struct {
1762 			union smb_handle file;
1763 
1764 			/* static body buffer 48 (0x30) bytes */
1765 			/* uint16_t buffer_code;  0x31 = 0x30 + 1 */
1766 			/* uint16_t data_ofs; */
1767 			/* uint32_t data_size; */
1768 			uint64_t offset;
1769 			/* struct smb2_handle handle; */
1770 			uint64_t unknown1; /* 0xFFFFFFFFFFFFFFFF */
1771 			uint64_t unknown2; /* 0xFFFFFFFFFFFFFFFF */
1772 
1773 			/* dynamic body */
1774 			DATA_BLOB data;
1775 		} in;
1776 		struct {
1777 			/* static body buffer 17 (0x11) bytes */
1778 			/* uint16_t buffer_code;  0x11 = 0x10 + 1*/
1779 			uint16_t _pad;
1780 			uint32_t nwritten;
1781 			uint64_t unknown1; /* 0x0000000000000000 */
1782 		} out;
1783 	} smb2;
1784 };
1785 
1786 
1787 enum smb_lock_level {
1788 	RAW_LOCK_LOCK,
1789 	RAW_LOCK_UNLOCK,
1790 	RAW_LOCK_LOCKX,
1791 	RAW_LOCK_SMB2
1792 };
1793 
1794 /* the generic interface is defined to be equal to the lockingX interface */
1795 #define RAW_LOCK_GENERIC RAW_LOCK_LOCKX
1796 
1797 /* union for lock() backend call
1798 */
1799 union smb_lock {
1800 	/* SMBlockingX (and generic) interface */
1801 	struct {
1802 		enum smb_lock_level level;
1803 		struct {
1804 			union smb_handle file;
1805 			uint16_t mode;
1806 			uint32_t timeout;
1807 			uint16_t ulock_cnt;
1808 			uint16_t lock_cnt;
1809 			struct smb_lock_entry {
1810 				uint16_t pid;
1811 				uint64_t offset;
1812 				uint64_t count;
1813 			} *locks; /* unlocks are first in the arrray */
1814 		} in;
1815 	} lockx, generic;
1816 
1817 	/* SMBlock and SMBunlock interface */
1818 	struct {
1819 		enum smb_lock_level level;
1820 		struct {
1821 			union smb_handle file;
1822 			uint32_t count;
1823 			uint32_t offset;
1824 		} in;
1825 	} lock, unlock;
1826 
1827 	/* SMB2 Lock */
1828 	struct smb2_lock {
1829 		enum smb_lock_level level;
1830 		struct {
1831 			union smb_handle file;
1832 
1833 			/* static body buffer 48 (0x30) bytes */
1834 			/* uint16_t buffer_code;  0x30 */
1835 			uint16_t unknown1; /* must be 0x0001 */
1836 			uint32_t unknown2;
1837 			/* struct smb2_handle handle; */
1838 			uint64_t offset;
1839 			uint64_t count;
1840 			uint32_t unknown5;
1841 #define SMB2_LOCK_FLAG_NONE	0x00000000
1842 #define SMB2_LOCK_FLAG_EXCLUSIV	0x00000002
1843 #define SMB2_LOCK_FLAG_UNLOCK	0x00000004
1844 #define SMB2_LOCK_FLAGS_MASK	0x00000006
1845 			uint32_t flags;
1846 		} in;
1847 		struct {
1848 			/* static body buffer 4 (0x04) bytes */
1849 			/* uint16_t buffer_code;  0x04 */
1850 			uint16_t unknown1;
1851 		} out;
1852 	} smb2;
1853 };
1854 
1855 
1856 enum smb_close_level {
1857 	RAW_CLOSE_CLOSE,
1858 	RAW_CLOSE_SPLCLOSE,
1859 	RAW_CLOSE_SMB2
1860 };
1861 
1862 #define RAW_CLOSE_GENERIC RAW_CLOSE_CLOSE
1863 
1864 /*
1865   union for close() backend call
1866 */
1867 union smb_close {
1868 	/* SMBclose (and generic) interface */
1869 	struct {
1870 		enum smb_close_level level;
1871 		struct {
1872 			union smb_handle file;
1873 			time_t write_time;
1874 		} in;
1875 	} close, generic;
1876 
1877 	/* SMBsplclose interface - empty! */
1878 	struct {
1879 		enum smb_close_level level;
1880 		struct {
1881 			union smb_handle file;
1882 		} in;
1883 	} splclose;
1884 
1885 	/* SMB2 Close */
1886 	struct smb2_close {
1887 		enum smb_close_level level;
1888 		struct {
1889 			union smb_handle file;
1890 
1891 			/* static body buffer 24 (0x18) bytes */
1892 			/* uint16_t buffer_code;  0x18 */
1893 #define SMB2_CLOSE_FLAGS_FULL_INFORMATION (1<<0)
1894 			uint16_t flags; /* SMB2_CLOSE_FLAGS_* */
1895 			uint32_t _pad;
1896 		} in;
1897 		struct {
1898 			/* static body buffer 60 (0x3C) bytes */
1899 			/* uint16_t buffer_code;  0x3C */
1900 			uint16_t flags;
1901 			uint32_t _pad;
1902 			NTTIME   create_time;
1903 			NTTIME   access_time;
1904 			NTTIME   write_time;
1905 			NTTIME   change_time;
1906 			uint64_t alloc_size;
1907 			uint64_t size;
1908 			uint32_t file_attr;
1909 		} out;
1910 	} smb2;
1911 };
1912 
1913 
1914 enum smb_lpq_level {RAW_LPQ_GENERIC, RAW_LPQ_RETQ};
1915 
1916 /*
1917   union for lpq() backend
1918 */
1919 union smb_lpq {
1920 	/* generic interface */
1921 	struct {
1922 		enum smb_lpq_level level;
1923 
1924 	} generic;
1925 
1926 
1927 	/* SMBsplretq interface */
1928 	struct {
1929 		enum smb_lpq_level level;
1930 
1931 		struct {
1932 			uint16_t maxcount;
1933 			uint16_t startidx;
1934 		} in;
1935 		struct {
1936 			uint16_t count;
1937 			uint16_t restart_idx;
1938 			struct {
1939 				time_t time;
1940 				uint8_t status;
1941 				uint16_t job;
1942 				uint32_t size;
1943 				char *user;
1944 			} *queue;
1945 		} out;
1946 	} retq;
1947 };
1948 
1949 enum smb_ioctl_level {
1950 	RAW_IOCTL_IOCTL,
1951 	RAW_IOCTL_NTIOCTL,
1952 	RAW_IOCTL_SMB2,
1953 	RAW_IOCTL_SMB2_NO_HANDLE
1954 };
1955 
1956 /*
1957   union for ioctl() backend
1958 */
1959 union smb_ioctl {
1960 	/* generic interface */
1961 	struct {
1962 		enum smb_ioctl_level level;
1963 		struct {
1964 			union smb_handle file;
1965 		} in;
1966 	} generic;
1967 
1968 	/* struct for SMBioctl */
1969 	struct {
1970 		enum smb_ioctl_level level;
1971 		struct {
1972 			union smb_handle file;
1973 			uint32_t request;
1974 		} in;
1975 		struct {
1976 			DATA_BLOB blob;
1977 		} out;
1978 	} ioctl;
1979 
1980 
1981 	/* struct for NT ioctl call */
1982 	struct {
1983 		enum smb_ioctl_level level;
1984 		struct {
1985 			union smb_handle file;
1986 			uint32_t function;
1987 			BOOL fsctl;
1988 			uint8_t filter;
1989 			uint32_t max_data;
1990 			DATA_BLOB blob;
1991 		} in;
1992 		struct {
1993 			DATA_BLOB blob;
1994 		} out;
1995 	} ntioctl;
1996 
1997 	/* SMB2 Ioctl */
1998 	struct smb2_ioctl {
1999 		enum smb_ioctl_level level;
2000 		struct {
2001 			union smb_handle file;
2002 
2003 			/* static body buffer 56 (0x38) bytes */
2004 			/* uint16_t buffer_code;  0x39 = 0x38 + 1 */
2005 			uint16_t _pad;
2006 			uint32_t function;
2007 			/*struct smb2_handle handle;*/
2008 			/* uint32_t out_ofs; */
2009 			/* uint32_t out_size; */
2010 			uint32_t unknown2;
2011 			/* uint32_t in_ofs; */
2012 			/* uint32_t in_size; */
2013 			uint32_t max_response_size;
2014 			uint64_t flags;
2015 
2016 			/* dynamic body */
2017 			DATA_BLOB out;
2018 			DATA_BLOB in;
2019 		} in;
2020 		struct {
2021 			union smb_handle file;
2022 
2023 			/* static body buffer 48 (0x30) bytes */
2024 			/* uint16_t buffer_code;  0x31 = 0x30 + 1 */
2025 			uint16_t _pad;
2026 			uint32_t function;
2027 			/* struct smb2_handle handle; */
2028 			/* uint32_t in_ofs; */
2029 			/* uint32_t in_size; */
2030 			/* uint32_t out_ofs; */
2031 			/* uint32_t out_size; */
2032 			uint32_t unknown2;
2033 			uint32_t unknown3;
2034 
2035 			/* dynamic body */
2036 			DATA_BLOB in;
2037 			DATA_BLOB out;
2038 		} out;
2039 	} smb2;
2040 };
2041 
2042 enum smb_flush_level {
2043 	RAW_FLUSH_FLUSH,
2044 	RAW_FLUSH_ALL,
2045 	RAW_FLUSH_SMB2
2046 };
2047 
2048 union smb_flush {
2049 	/* struct for SMBflush */
2050 	struct {
2051 		enum smb_flush_level level;
2052 		struct {
2053 			union smb_handle file;
2054 		} in;
2055 	} flush, generic;
2056 
2057 	/* SMBflush with 0xFFFF wildcard fnum */
2058 	struct {
2059 		enum smb_flush_level level;
2060 	} flush_all;
2061 
2062 	/* SMB2 Flush */
2063 	struct smb2_flush {
2064 		enum smb_flush_level level;
2065 		struct {
2066 			union smb_handle file;
2067 			uint32_t unknown;
2068 		} in;
2069 	} smb2;
2070 };
2071 
2072 /* struct for SMBcopy */
2073 struct smb_copy {
2074 	struct {
2075 		uint16_t tid2;
2076 		uint16_t ofun;
2077 		uint16_t flags;
2078 		const char *path1;
2079 		const char *path2;
2080 	} in;
2081 	struct {
2082 		uint16_t count;
2083 	} out;
2084 };
2085 
2086 
2087 /* struct for transact/transact2 call */
2088 struct smb_trans2 {
2089 	struct {
2090 		uint16_t max_param;
2091 		uint16_t max_data;
2092 		uint8_t  max_setup;
2093 		uint16_t flags;
2094 		uint32_t timeout;
2095 		uint8_t  setup_count;
2096 		uint16_t *setup;
2097 		const char *trans_name; /* SMBtrans only */
2098 		DATA_BLOB params;
2099 		DATA_BLOB data;
2100 	} in;
2101 
2102 	struct {
2103 		uint8_t  setup_count;
2104 		uint16_t *setup;
2105 		DATA_BLOB params;
2106 		DATA_BLOB data;
2107 	} out;
2108 };
2109 
2110 /* struct for nttransact2 call */
2111 struct smb_nttrans {
2112 	struct {
2113 		uint8_t  max_setup;
2114 		uint32_t max_param;
2115 		uint32_t max_data;
2116 		uint32_t setup_count;
2117 		uint16_t function;
2118 		uint16_t *setup;
2119 		DATA_BLOB params;
2120 		DATA_BLOB data;
2121 	} in;
2122 
2123 	struct {
2124 		uint8_t  setup_count;
2125 		uint16_t *setup;
2126 		DATA_BLOB params;
2127 		DATA_BLOB data;
2128 	} out;
2129 };
2130 
2131 enum smb_notify_level {
2132 	RAW_NOTIFY_NTTRANS,
2133 	RAW_NOTIFY_SMB2
2134 };
2135 
2136 union smb_notify {
2137 	/* struct for nttrans change notify call */
2138 	struct {
2139 		enum smb_notify_level level;
2140 
2141 		struct {
2142 			union smb_handle file;
2143 			uint32_t buffer_size;
2144 			uint32_t completion_filter;
2145 			BOOL recursive;
2146 		} in;
2147 
2148 		struct {
2149 			uint32_t num_changes;
2150 			struct notify_changes {
2151 				uint32_t action;
2152 				struct smb_wire_string name;
2153 			} *changes;
2154 		} out;
2155 	} nttrans;
2156 
2157 	struct smb2_notify {
2158 		enum smb_notify_level level;
2159 
2160 		struct {
2161 			union smb_handle file;
2162 			/* static body buffer 32 (0x20) bytes */
2163 			/* uint16_t buffer_code;  0x32 */
2164 			uint16_t recursive;
2165 			uint32_t buffer_size;
2166 			/*struct  smb2_handle file;*/
2167 			uint32_t completion_filter;
2168 			uint32_t unknown;
2169 		} in;
2170 
2171 		struct {
2172 			/* static body buffer 8 (0x08) bytes */
2173 			/* uint16_t buffer_code; 0x09 = 0x08 + 1 */
2174 			/* uint16_t blob_ofs; */
2175 			/* uint16_t blob_size; */
2176 
2177 			/* dynamic body */
2178 			/*DATA_BLOB blob;*/
2179 
2180 			/* DATA_BLOB content */
2181 			uint32_t num_changes;
2182 			struct notify_changes *changes;
2183 		} out;
2184 	} smb2;
2185 };
2186 
2187 enum smb_search_level {
2188 	RAW_SEARCH_SEARCH,	/* SMBsearch */
2189 	RAW_SEARCH_FFIRST,	/* SMBffirst */
2190 	RAW_SEARCH_FUNIQUE,	/* SMBfunique */
2191 	RAW_SEARCH_TRANS2,	/* SMBtrans2 */
2192 	RAW_SEARCH_SMB2		/* SMB2 Find */
2193 };
2194 
2195 enum smb_search_data_level {
2196 	RAW_SEARCH_DATA_GENERIC			= 0x10000, /* only used in the smbcli_ code */
2197 	RAW_SEARCH_DATA_SEARCH,
2198 	RAW_SEARCH_DATA_STANDARD		= SMB_FIND_STANDARD,
2199 	RAW_SEARCH_DATA_EA_SIZE			= SMB_FIND_EA_SIZE,
2200 	RAW_SEARCH_DATA_EA_LIST			= SMB_FIND_EA_LIST,
2201 	RAW_SEARCH_DATA_DIRECTORY_INFO		= SMB_FIND_DIRECTORY_INFO,
2202 	RAW_SEARCH_DATA_FULL_DIRECTORY_INFO	= SMB_FIND_FULL_DIRECTORY_INFO,
2203 	RAW_SEARCH_DATA_NAME_INFO		= SMB_FIND_NAME_INFO,
2204 	RAW_SEARCH_DATA_BOTH_DIRECTORY_INFO	= SMB_FIND_BOTH_DIRECTORY_INFO,
2205 	RAW_SEARCH_DATA_ID_FULL_DIRECTORY_INFO	= SMB_FIND_ID_FULL_DIRECTORY_INFO,
2206 	RAW_SEARCH_DATA_ID_BOTH_DIRECTORY_INFO	= SMB_FIND_ID_BOTH_DIRECTORY_INFO,
2207 	RAW_SEARCH_DATA_UNIX_INFO		= SMB_FIND_UNIX_INFO
2208 };
2209 
2210 /* union for file search */
2211 union smb_search_first {
2212 	struct {
2213 		enum smb_search_level level;
2214 		enum smb_search_data_level data_level;
2215 	} generic;
2216 
2217 	/* search (old) findfirst interface.
2218 	   Also used for ffirst and funique. */
2219 	struct {
2220 		enum smb_search_level level;
2221 		enum smb_search_data_level data_level;
2222 
2223 		struct {
2224 			uint16_t max_count;
2225 			uint16_t search_attrib;
2226 			const char *pattern;
2227 		} in;
2228 		struct {
2229 			int16_t count;
2230 		} out;
2231 	} search_first;
2232 
2233 	/* trans2 findfirst interface */
2234 	struct {
2235 		enum smb_search_level level;
2236 		enum smb_search_data_level data_level;
2237 
2238 		struct {
2239 			uint16_t search_attrib;
2240 			uint16_t max_count;
2241 			uint16_t flags;
2242 			uint32_t storage_type;
2243 			const char *pattern;
2244 
2245 			/* the ea names are only used for RAW_SEARCH_EA_LIST */
2246 			uint_t num_names;
2247 			struct ea_name *ea_names;
2248 		} in;
2249 		struct {
2250 			uint16_t handle;
2251 			uint16_t count;
2252 			uint16_t end_of_search;
2253 		} out;
2254 	} t2ffirst;
2255 
2256 /*
2257   SMB2 uses different level numbers for the same old SMB trans2 search levels
2258 */
2259 #define SMB2_FIND_DIRECTORY_INFO         0x01
2260 #define SMB2_FIND_FULL_DIRECTORY_INFO    0x02
2261 #define SMB2_FIND_BOTH_DIRECTORY_INFO    0x03
2262 #define SMB2_FIND_NAME_INFO              0x0C
2263 #define SMB2_FIND_ID_BOTH_DIRECTORY_INFO 0x25
2264 #define SMB2_FIND_ID_FULL_DIRECTORY_INFO 0x26
2265 
2266 /* flags for RAW_FILEINFO_SMB2_ALL_EAS */
2267 #define SMB2_CONTINUE_FLAG_RESTART    0x01
2268 #define SMB2_CONTINUE_FLAG_SINGLE     0x02
2269 #define SMB2_CONTINUE_FLAG_NEW        0x10
2270 
2271 	/* SMB2 Find */
2272 	struct smb2_find {
2273 		enum smb_search_level level;
2274 		enum smb_search_data_level data_level;
2275 		struct {
2276 			union smb_handle file;
2277 
2278 			/* static body buffer 32 (0x20) bytes */
2279 			/* uint16_t buffer_code;  0x21 = 0x20 + 1 */
2280 			uint8_t level;
2281 			uint8_t continue_flags; /* SMB2_CONTINUE_FLAG_* */
2282 			uint32_t unknown; /* perhaps a continue token? */
2283 			/* struct smb2_handle handle; */
2284 			/* uint16_t pattern_ofs; */
2285 			/* uint16_t pattern_size; */
2286 			uint32_t max_response_size;
2287 
2288 			/* dynamic body */
2289 			const char *pattern;
2290 		} in;
2291 		struct {
2292 			/* static body buffer 8 (0x08) bytes */
2293 			/* uint16_t buffer_code;  0x08 */
2294 			/* uint16_t blob_ofs; */
2295 			/* uint32_t blob_size; */
2296 
2297 			/* dynamic body */
2298 			DATA_BLOB blob;
2299 		} out;
2300 	} smb2;
2301 };
2302 
2303 /* union for file search continue */
2304 union smb_search_next {
2305 	struct {
2306 		enum smb_search_level level;
2307 		enum smb_search_data_level data_level;
2308 	} generic;
2309 
2310 	/* search (old) findnext interface. Also used
2311 	   for ffirst when continuing */
2312 	struct {
2313 		enum smb_search_level level;
2314 		enum smb_search_data_level data_level;
2315 
2316 		struct {
2317 			uint16_t max_count;
2318 			uint16_t search_attrib;
2319 			struct smb_search_id {
2320 				uint8_t reserved;
2321 				char name[11];
2322 				uint8_t handle;
2323 				uint32_t server_cookie;
2324 				uint32_t client_cookie;
2325 			} id;
2326 		} in;
2327 		struct {
2328 			uint16_t count;
2329 		} out;
2330 	} search_next;
2331 
2332 	/* trans2 findnext interface */
2333 	struct {
2334 		enum smb_search_level level;
2335 		enum smb_search_data_level data_level;
2336 
2337 		struct {
2338 			uint16_t handle;
2339 			uint16_t max_count;
2340 			uint32_t resume_key;
2341 			uint16_t flags;
2342 			const char *last_name;
2343 
2344 			/* the ea names are only used for RAW_SEARCH_EA_LIST */
2345 			uint_t num_names;
2346 			struct ea_name *ea_names;
2347 		} in;
2348 		struct {
2349 			uint16_t count;
2350 			uint16_t end_of_search;
2351 		} out;
2352 	} t2fnext;
2353 
2354 	/* SMB2 Find */
2355 	struct smb2_find smb2;
2356 };
2357 
2358 /* union for search reply file data */
2359 union smb_search_data {
2360 	/*
2361 	 * search (old) findfirst
2362 	 * RAW_SEARCH_DATA_SEARCH
2363 	 */
2364 	struct {
2365 		uint16_t attrib;
2366 		time_t write_time;
2367 		uint32_t size;
2368 		struct smb_search_id id;
2369 		const char *name;
2370 	} search;
2371 
2372 	/* trans2 findfirst RAW_SEARCH_DATA_STANDARD level */
2373 	struct {
2374 		uint32_t resume_key;
2375 		time_t create_time;
2376 		time_t access_time;
2377 		time_t write_time;
2378 		uint32_t size;
2379 		uint32_t alloc_size;
2380 		uint16_t attrib;
2381 		struct smb_wire_string name;
2382 	} standard;
2383 
2384 	/* trans2 findfirst RAW_SEARCH_DATA_EA_SIZE level */
2385 	struct {
2386 		uint32_t resume_key;
2387 		time_t create_time;
2388 		time_t access_time;
2389 		time_t write_time;
2390 		uint32_t size;
2391 		uint32_t alloc_size;
2392 		uint16_t attrib;
2393 		uint32_t ea_size;
2394 		struct smb_wire_string name;
2395 	} ea_size;
2396 
2397 	/* trans2 findfirst RAW_SEARCH_DATA_EA_LIST level */
2398 	struct {
2399 		uint32_t resume_key;
2400 		time_t create_time;
2401 		time_t access_time;
2402 		time_t write_time;
2403 		uint32_t size;
2404 		uint32_t alloc_size;
2405 		uint16_t attrib;
2406 		struct smb_ea_list eas;
2407 		struct smb_wire_string name;
2408 	} ea_list;
2409 
2410 	/* RAW_SEARCH_DATA_DIRECTORY_INFO interface */
2411 	struct {
2412 		uint32_t file_index;
2413 		NTTIME create_time;
2414 		NTTIME access_time;
2415 		NTTIME write_time;
2416 		NTTIME change_time;
2417 		uint64_t  size;
2418 		uint64_t  alloc_size;
2419 		uint32_t   attrib;
2420 		struct smb_wire_string name;
2421 	} directory_info;
2422 
2423 	/* RAW_SEARCH_DATA_FULL_DIRECTORY_INFO interface */
2424 	struct {
2425 		uint32_t file_index;
2426 		NTTIME create_time;
2427 		NTTIME access_time;
2428 		NTTIME write_time;
2429 		NTTIME change_time;
2430 		uint64_t  size;
2431 		uint64_t  alloc_size;
2432 		uint32_t   attrib;
2433 		uint32_t   ea_size;
2434 		struct smb_wire_string name;
2435 	} full_directory_info;
2436 
2437 	/* RAW_SEARCH_DATA_NAME_INFO interface */
2438 	struct {
2439 		uint32_t file_index;
2440 		struct smb_wire_string name;
2441 	} name_info;
2442 
2443 	/* RAW_SEARCH_DATA_BOTH_DIRECTORY_INFO interface */
2444 	struct {
2445 		uint32_t file_index;
2446 		NTTIME create_time;
2447 		NTTIME access_time;
2448 		NTTIME write_time;
2449 		NTTIME change_time;
2450 		uint64_t  size;
2451 		uint64_t  alloc_size;
2452 		uint32_t   attrib;
2453 		uint32_t   ea_size;
2454 		struct smb_wire_string short_name;
2455 		struct smb_wire_string name;
2456 	} both_directory_info;
2457 
2458 	/* RAW_SEARCH_DATA_ID_FULL_DIRECTORY_INFO interface */
2459 	struct {
2460 		uint32_t file_index;
2461 		NTTIME create_time;
2462 		NTTIME access_time;
2463 		NTTIME write_time;
2464 		NTTIME change_time;
2465 		uint64_t size;
2466 		uint64_t alloc_size;
2467 		uint32_t attrib;
2468 		uint32_t ea_size;
2469 		uint64_t file_id;
2470 		struct smb_wire_string name;
2471 	} id_full_directory_info;
2472 
2473 	/* RAW_SEARCH_DATA_ID_BOTH_DIRECTORY_INFO interface */
2474 	struct {
2475 		uint32_t file_index;
2476 		NTTIME create_time;
2477 		NTTIME access_time;
2478 		NTTIME write_time;
2479 		NTTIME change_time;
2480 		uint64_t size;
2481 		uint64_t alloc_size;
2482 		uint32_t  attrib;
2483 		uint32_t  ea_size;
2484 		uint64_t file_id;
2485 		struct smb_wire_string short_name;
2486 		struct smb_wire_string name;
2487 	} id_both_directory_info;
2488 
2489 	/* RAW_SEARCH_DATA_UNIX_INFO interface */
2490 	struct {
2491 		uint32_t file_index;
2492 		uint64_t size;
2493 		uint64_t alloc_size;
2494 		NTTIME status_change_time;
2495 		NTTIME access_time;
2496 		NTTIME change_time;
2497 		uint64_t uid;
2498 		uint64_t gid;
2499 		uint32_t file_type;
2500 		uint64_t dev_major;
2501 		uint64_t dev_minor;
2502 		uint64_t unique_id;
2503 		uint64_t permissions;
2504 		uint64_t nlink;
2505 		const char *name;
2506 	} unix_info;
2507 };
2508 
2509 
2510 enum smb_search_close_level {RAW_FINDCLOSE_GENERIC, RAW_FINDCLOSE_FCLOSE, RAW_FINDCLOSE_FINDCLOSE};
2511 
2512 /* union for file search close */
2513 union smb_search_close {
2514 	struct {
2515 		enum smb_search_close_level level;
2516 	} generic;
2517 
2518 	/* SMBfclose (old search) interface */
2519 	struct {
2520 		enum smb_search_close_level level;
2521 
2522 		struct {
2523 			/* max_count and search_attrib are not used, but are present */
2524 			uint16_t max_count;
2525 			uint16_t search_attrib;
2526 			struct smb_search_id id;
2527 		} in;
2528 	} fclose;
2529 
2530 	/* SMBfindclose interface */
2531 	struct {
2532 		enum smb_search_close_level level;
2533 
2534 		struct {
2535 			uint16_t handle;
2536 		} in;
2537 	} findclose;
2538 };
2539 
2540 #endif /* __LIBCLI_RAW_INTERFACES_H__ */
2541