s3-selftest: introduce new net registry check check
[Samba/gebeck_regimport.git] / source4 / libcli / raw / interfaces.h
blob695c13fce635afe0eba323058f52834b9e007a7d
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 Copyright (C) James Peach 2007
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
22 #ifndef __LIBCLI_RAW_INTERFACES_H__
23 #define __LIBCLI_RAW_INTERFACES_H__
25 #include "source4/libcli/raw/smb.h"
26 #include "../libcli/smb/smb_common.h"
27 #include "librpc/gen_ndr/misc.h" /* for struct GUID */
29 /* this structure is just a wrapper for a string, the only reason we
30 bother with this is that it allows us to check the length provided
31 on the wire in testsuite test code to ensure that we are
32 terminating names in the same way that win2003 is. The *ONLY* time
33 you should ever look at the 'private_length' field in this
34 structure is inside compliance test code, in all other cases just
35 use the null terminated char* as the definitive definition of the
36 string
38 also note that this structure is only used in packets where there
39 is an explicit length provided on the wire (hence the name). That
40 length is placed in 'private_length'. For packets where the length
41 is always determined by NULL or packet termination a normal char*
42 is used in the structure definition.
44 struct smb_wire_string {
45 uint32_t private_length;
46 const char *s;
50 * SMB2 uses a 16Byte handle,
51 * (we can maybe use struct GUID later)
53 struct smb2_handle {
54 uint64_t data[2];
58 SMB2 lease structure (per MS-SMB2 2.2.13)
60 struct smb2_lease_key {
61 uint64_t data[2];
64 struct smb2_lease {
65 struct smb2_lease_key lease_key;
66 uint32_t lease_state;
67 uint32_t lease_flags; /* should be 0 */
68 uint64_t lease_duration; /* should be 0 */
71 struct smb2_lease_break {
72 struct smb2_lease current_lease;
73 uint32_t break_flags;
74 uint32_t new_lease_state;
75 uint32_t break_reason; /* should be 0 */
76 uint32_t access_mask_hint; /* should be 0 */
77 uint32_t share_mask_hint; /* should be 0 */
80 struct ntvfs_handle;
83 * a generic container for file handles or file pathes
84 * for qfileinfo/setfileinfo and qpathinfo/setpathinfo
86 union smb_handle_or_path {
88 * this is used for
89 * the qpathinfo and setpathinfo
90 * calls
92 const char *path;
94 * this is used as file handle in SMB
96 uint16_t fnum;
99 * this is used as file handle in SMB2
101 struct smb2_handle handle;
104 * this is used as generic file handle for the NTVFS layer
106 struct ntvfs_handle *ntvfs;
110 a generic container for file handles
112 union smb_handle {
114 * this is used as file handle in SMB
116 uint16_t fnum;
119 * this is used as file handle in SMB2
121 struct smb2_handle handle;
124 * this is used as generic file handle for the NTVFS layer
126 struct ntvfs_handle *ntvfs;
130 this header defines the structures and unions used between the SMB
131 parser and the backends.
134 /* struct used for SMBlseek call */
135 union smb_seek {
136 struct {
137 struct {
138 union smb_handle file;
139 uint16_t mode;
140 int32_t offset; /* signed */
141 } in;
142 struct {
143 int32_t offset;
144 } out;
145 } lseek, generic;
148 /* struct used in unlink() call */
149 union smb_unlink {
150 struct {
151 struct {
152 const char *pattern;
153 uint16_t attrib;
154 } in;
155 } unlink;
159 /* struct used in chkpath() call */
160 union smb_chkpath {
161 struct {
162 struct {
163 const char *path;
164 } in;
165 } chkpath;
168 enum smb_mkdir_level {RAW_MKDIR_GENERIC, RAW_MKDIR_MKDIR, RAW_MKDIR_T2MKDIR};
170 /* union used in mkdir() call */
171 union smb_mkdir {
172 /* generic level */
173 struct {
174 enum smb_mkdir_level level;
175 } generic;
177 struct {
178 enum smb_mkdir_level level;
179 struct {
180 const char *path;
181 } in;
182 } mkdir;
184 struct {
185 enum smb_mkdir_level level;
186 struct {
187 const char *path;
188 unsigned int num_eas;
189 struct ea_struct *eas;
190 } in;
191 } t2mkdir;
194 /* struct used in rmdir() call */
195 struct smb_rmdir {
196 struct {
197 const char *path;
198 } in;
201 /* struct used in rename() call */
202 enum smb_rename_level {RAW_RENAME_RENAME, RAW_RENAME_NTRENAME, RAW_RENAME_NTTRANS};
204 union smb_rename {
205 struct {
206 enum smb_rename_level level;
207 } generic;
209 /* SMBrename interface */
210 struct {
211 enum smb_rename_level level;
213 struct {
214 const char *pattern1;
215 const char *pattern2;
216 uint16_t attrib;
217 } in;
218 } rename;
221 /* SMBntrename interface */
222 struct {
223 enum smb_rename_level level;
225 struct {
226 uint16_t attrib;
227 uint16_t flags; /* see RENAME_FLAG_* */
228 uint32_t cluster_size;
229 const char *old_name;
230 const char *new_name;
231 } in;
232 } ntrename;
234 /* NT TRANS rename interface */
235 struct {
236 enum smb_rename_level level;
238 struct {
239 union smb_handle file;
240 uint16_t flags;/* see RENAME_REPLACE_IF_EXISTS */
241 const char *new_name;
242 } in;
243 } nttrans;
246 enum smb_tcon_level {
247 RAW_TCON_TCON,
248 RAW_TCON_TCONX,
249 RAW_TCON_SMB2
252 /* union used in tree connect call */
253 union smb_tcon {
254 /* generic interface */
255 struct {
256 enum smb_tcon_level level;
257 } generic;
259 /* SMBtcon interface */
260 struct {
261 enum smb_tcon_level level;
263 struct {
264 const char *service;
265 const char *password;
266 const char *dev;
267 } in;
268 struct {
269 uint16_t max_xmit;
270 uint16_t tid;
271 } out;
272 } tcon;
274 /* SMBtconX interface */
275 struct {
276 enum smb_tcon_level level;
278 struct {
279 uint16_t flags;
280 DATA_BLOB password;
281 const char *path;
282 const char *device;
283 } in;
284 struct {
285 uint16_t options;
286 char *dev_type;
287 char *fs_type;
288 uint16_t tid;
289 } out;
290 } tconx;
292 /* SMB2 TreeConnect */
293 struct smb2_tree_connect {
294 enum smb_tcon_level level;
296 struct {
297 /* static body buffer 8 (0x08) bytes */
298 uint16_t reserved;
299 /* uint16_t path_ofs */
300 /* uint16_t path_size */
301 /* dynamic body */
302 const char *path; /* as non-terminated UTF-16 on the wire */
303 } in;
304 struct {
305 /* static body buffer 16 (0x10) bytes */
306 /* uint16_t buffer_code; 0x10 */
307 uint8_t share_type;
308 uint8_t reserved;
309 uint32_t flags;
310 uint32_t capabilities;
311 uint32_t access_mask;
313 /* extracted from the SMB2 header */
314 uint32_t tid;
315 } out;
316 } smb2;
320 enum smb_sesssetup_level {
321 RAW_SESSSETUP_OLD,
322 RAW_SESSSETUP_NT1,
323 RAW_SESSSETUP_SPNEGO,
324 RAW_SESSSETUP_SMB2
327 /* union used in session_setup call */
328 union smb_sesssetup {
329 /* the pre-NT1 interface */
330 struct {
331 enum smb_sesssetup_level level;
333 struct {
334 uint16_t bufsize;
335 uint16_t mpx_max;
336 uint16_t vc_num;
337 uint32_t sesskey;
338 DATA_BLOB password;
339 const char *user;
340 const char *domain;
341 const char *os;
342 const char *lanman;
343 } in;
344 struct {
345 uint16_t action;
346 uint16_t vuid;
347 char *os;
348 char *lanman;
349 char *domain;
350 } out;
351 } old;
353 /* the NT1 interface */
354 struct {
355 enum smb_sesssetup_level level;
357 struct {
358 uint16_t bufsize;
359 uint16_t mpx_max;
360 uint16_t vc_num;
361 uint32_t sesskey;
362 uint32_t capabilities;
363 DATA_BLOB password1;
364 DATA_BLOB password2;
365 const char *user;
366 const char *domain;
367 const char *os;
368 const char *lanman;
369 } in;
370 struct {
371 uint16_t action;
372 uint16_t vuid;
373 char *os;
374 char *lanman;
375 char *domain;
376 } out;
377 } nt1;
380 /* the SPNEGO interface */
381 struct {
382 enum smb_sesssetup_level level;
384 struct {
385 uint16_t bufsize;
386 uint16_t mpx_max;
387 uint16_t vc_num;
388 uint32_t sesskey;
389 uint32_t capabilities;
390 DATA_BLOB secblob;
391 const char *os;
392 const char *lanman;
393 const char *workgroup;
394 } in;
395 struct {
396 uint16_t action;
397 DATA_BLOB secblob;
398 char *os;
399 char *lanman;
400 char *workgroup;
401 uint16_t vuid;
402 } out;
403 } spnego;
405 /* SMB2 SessionSetup */
406 struct smb2_session_setup {
407 enum smb_sesssetup_level level;
409 struct {
410 /* static body 24 (0x18) bytes */
411 uint8_t vc_number;
412 uint8_t security_mode;
413 uint32_t capabilities;
414 uint32_t channel;
415 /* uint16_t secblob_ofs */
416 /* uint16_t secblob_size */
417 uint64_t previous_sessionid;
418 /* dynamic body */
419 DATA_BLOB secblob;
420 } in;
421 struct {
422 /* body buffer 8 (0x08) bytes */
423 uint16_t session_flags;
424 /* uint16_t secblob_ofs */
425 /* uint16_t secblob_size */
426 /* dynamic body */
427 DATA_BLOB secblob;
429 /* extracted from the SMB2 header */
430 uint64_t uid;
431 } out;
432 } smb2;
435 /* Note that the specified enum values are identical to the actual info-levels used
436 * on the wire.
438 enum smb_fileinfo_level {
439 RAW_FILEINFO_GENERIC = 0xF000,
440 RAW_FILEINFO_GETATTR, /* SMBgetatr */
441 RAW_FILEINFO_GETATTRE, /* SMBgetattrE */
442 RAW_FILEINFO_SEC_DESC, /* NT_TRANSACT_QUERY_SECURITY_DESC */
443 RAW_FILEINFO_STANDARD = SMB_QFILEINFO_STANDARD,
444 RAW_FILEINFO_EA_SIZE = SMB_QFILEINFO_EA_SIZE,
445 RAW_FILEINFO_EA_LIST = SMB_QFILEINFO_EA_LIST,
446 RAW_FILEINFO_ALL_EAS = SMB_QFILEINFO_ALL_EAS,
447 RAW_FILEINFO_IS_NAME_VALID = SMB_QFILEINFO_IS_NAME_VALID,
448 RAW_FILEINFO_BASIC_INFO = SMB_QFILEINFO_BASIC_INFO,
449 RAW_FILEINFO_STANDARD_INFO = SMB_QFILEINFO_STANDARD_INFO,
450 RAW_FILEINFO_EA_INFO = SMB_QFILEINFO_EA_INFO,
451 RAW_FILEINFO_NAME_INFO = SMB_QFILEINFO_NAME_INFO,
452 RAW_FILEINFO_ALL_INFO = SMB_QFILEINFO_ALL_INFO,
453 RAW_FILEINFO_ALT_NAME_INFO = SMB_QFILEINFO_ALT_NAME_INFO,
454 RAW_FILEINFO_STREAM_INFO = SMB_QFILEINFO_STREAM_INFO,
455 RAW_FILEINFO_COMPRESSION_INFO = SMB_QFILEINFO_COMPRESSION_INFO,
456 RAW_FILEINFO_UNIX_BASIC = SMB_QFILEINFO_UNIX_BASIC,
457 RAW_FILEINFO_UNIX_INFO2 = SMB_QFILEINFO_UNIX_INFO2,
458 RAW_FILEINFO_UNIX_LINK = SMB_QFILEINFO_UNIX_LINK,
459 RAW_FILEINFO_BASIC_INFORMATION = SMB_QFILEINFO_BASIC_INFORMATION,
460 RAW_FILEINFO_STANDARD_INFORMATION = SMB_QFILEINFO_STANDARD_INFORMATION,
461 RAW_FILEINFO_INTERNAL_INFORMATION = SMB_QFILEINFO_INTERNAL_INFORMATION,
462 RAW_FILEINFO_EA_INFORMATION = SMB_QFILEINFO_EA_INFORMATION,
463 RAW_FILEINFO_ACCESS_INFORMATION = SMB_QFILEINFO_ACCESS_INFORMATION,
464 RAW_FILEINFO_NAME_INFORMATION = SMB_QFILEINFO_NAME_INFORMATION,
465 RAW_FILEINFO_POSITION_INFORMATION = SMB_QFILEINFO_POSITION_INFORMATION,
466 RAW_FILEINFO_MODE_INFORMATION = SMB_QFILEINFO_MODE_INFORMATION,
467 RAW_FILEINFO_ALIGNMENT_INFORMATION = SMB_QFILEINFO_ALIGNMENT_INFORMATION,
468 RAW_FILEINFO_ALL_INFORMATION = SMB_QFILEINFO_ALL_INFORMATION,
469 RAW_FILEINFO_ALT_NAME_INFORMATION = SMB_QFILEINFO_ALT_NAME_INFORMATION,
470 RAW_FILEINFO_STREAM_INFORMATION = SMB_QFILEINFO_STREAM_INFORMATION,
471 RAW_FILEINFO_COMPRESSION_INFORMATION = SMB_QFILEINFO_COMPRESSION_INFORMATION,
472 RAW_FILEINFO_NETWORK_OPEN_INFORMATION = SMB_QFILEINFO_NETWORK_OPEN_INFORMATION,
473 RAW_FILEINFO_ATTRIBUTE_TAG_INFORMATION = SMB_QFILEINFO_ATTRIBUTE_TAG_INFORMATION,
474 /* SMB2 specific levels */
475 RAW_FILEINFO_SMB2_ALL_EAS = 0x0f01,
476 RAW_FILEINFO_SMB2_ALL_INFORMATION = 0x1201
479 /* union used in qfileinfo() and qpathinfo() backend calls */
480 union smb_fileinfo {
481 /* generic interface:
482 * matches RAW_FILEINFO_GENERIC */
483 struct {
484 enum smb_fileinfo_level level;
485 struct {
486 union smb_handle_or_path file;
487 } in;
488 struct {
489 uint32_t attrib;
490 uint32_t ea_size;
491 unsigned int num_eas;
492 struct ea_struct {
493 uint8_t flags;
494 struct smb_wire_string name;
495 DATA_BLOB value;
496 } *eas;
497 NTTIME create_time;
498 NTTIME access_time;
499 NTTIME write_time;
500 NTTIME change_time;
501 uint64_t alloc_size;
502 uint64_t size;
503 uint32_t nlink;
504 struct smb_wire_string fname;
505 struct smb_wire_string alt_fname;
506 uint8_t delete_pending;
507 uint8_t directory;
508 uint64_t compressed_size;
509 uint16_t format;
510 uint8_t unit_shift;
511 uint8_t chunk_shift;
512 uint8_t cluster_shift;
513 uint64_t file_id;
514 uint32_t access_flags; /* seen 0x001f01ff from w2k3 */
515 uint64_t position;
516 uint32_t mode;
517 uint32_t alignment_requirement;
518 uint32_t reparse_tag;
519 unsigned int num_streams;
520 struct stream_struct {
521 uint64_t size;
522 uint64_t alloc_size;
523 struct smb_wire_string stream_name;
524 } *streams;
525 } out;
526 } generic;
529 /* SMBgetatr interface:
530 * matches RAW_FILEINFO_GETATTR */
531 struct {
532 enum smb_fileinfo_level level;
533 struct {
534 union smb_handle_or_path file;
535 } in;
536 struct {
537 uint16_t attrib;
538 uint32_t size;
539 time_t write_time;
540 } out;
541 } getattr;
543 /* SMBgetattrE and RAW_FILEINFO_STANDARD interface */
544 struct {
545 enum smb_fileinfo_level level;
546 struct {
547 union smb_handle_or_path file;
548 } in;
549 struct {
550 time_t create_time;
551 time_t access_time;
552 time_t write_time;
553 uint32_t size;
554 uint32_t alloc_size;
555 uint16_t attrib;
556 } out;
557 } getattre, standard;
559 /* trans2 RAW_FILEINFO_EA_SIZE interface */
560 struct {
561 enum smb_fileinfo_level level;
562 struct {
563 union smb_handle_or_path file;
564 } in;
565 struct {
566 time_t create_time;
567 time_t access_time;
568 time_t write_time;
569 uint32_t size;
570 uint32_t alloc_size;
571 uint16_t attrib;
572 uint32_t ea_size;
573 } out;
574 } ea_size;
576 /* trans2 RAW_FILEINFO_EA_LIST interface */
577 struct {
578 enum smb_fileinfo_level level;
579 struct {
580 union smb_handle_or_path file;
581 unsigned int num_names;
582 struct ea_name {
583 struct smb_wire_string name;
584 } *ea_names;
585 } in;
587 struct smb_ea_list {
588 unsigned int num_eas;
589 struct ea_struct *eas;
590 } out;
591 } ea_list;
593 /* trans2 RAW_FILEINFO_ALL_EAS and RAW_FILEINFO_FULL_EA_INFORMATION interfaces */
594 struct {
595 enum smb_fileinfo_level level;
596 struct {
597 union smb_handle_or_path file;
598 /* SMB2 only - SMB2_CONTINUE_FLAG_* */
599 uint8_t continue_flags;
600 } in;
601 struct smb_ea_list out;
602 } all_eas;
604 /* trans2 qpathinfo RAW_FILEINFO_IS_NAME_VALID interface
605 only valid for a QPATHNAME call - no returned data */
606 struct {
607 enum smb_fileinfo_level level;
608 struct {
609 union smb_handle_or_path file;
610 } in;
611 } is_name_valid;
613 /* RAW_FILEINFO_BASIC_INFO and RAW_FILEINFO_BASIC_INFORMATION interfaces */
614 struct {
615 enum smb_fileinfo_level level;
616 struct {
617 union smb_handle_or_path file;
618 } in;
619 struct {
620 NTTIME create_time;
621 NTTIME access_time;
622 NTTIME write_time;
623 NTTIME change_time;
624 uint32_t attrib;
625 } out;
626 } basic_info;
629 /* RAW_FILEINFO_STANDARD_INFO and RAW_FILEINFO_STANDARD_INFORMATION interfaces */
630 struct {
631 enum smb_fileinfo_level level;
632 struct {
633 union smb_handle_or_path file;
634 } in;
635 struct {
636 uint64_t alloc_size;
637 uint64_t size;
638 uint32_t nlink;
639 bool delete_pending;
640 bool directory;
641 } out;
642 } standard_info;
644 /* RAW_FILEINFO_EA_INFO and RAW_FILEINFO_EA_INFORMATION interfaces */
645 struct {
646 enum smb_fileinfo_level level;
647 struct {
648 union smb_handle_or_path file;
649 } in;
650 struct {
651 uint32_t ea_size;
652 } out;
653 } ea_info;
655 /* RAW_FILEINFO_NAME_INFO and RAW_FILEINFO_NAME_INFORMATION interfaces */
656 struct {
657 enum smb_fileinfo_level level;
658 struct {
659 union smb_handle_or_path file;
660 } in;
661 struct {
662 struct smb_wire_string fname;
663 } out;
664 } name_info;
666 /* RAW_FILEINFO_ALL_INFO and RAW_FILEINFO_ALL_INFORMATION interfaces */
667 struct {
668 enum smb_fileinfo_level level;
669 struct {
670 union smb_handle_or_path file;
671 } in;
672 struct {
673 NTTIME create_time;
674 NTTIME access_time;
675 NTTIME write_time;
676 NTTIME change_time;
677 uint32_t attrib;
678 uint64_t alloc_size;
679 uint64_t size;
680 uint32_t nlink;
681 uint8_t delete_pending;
682 uint8_t directory;
683 uint32_t ea_size;
684 struct smb_wire_string fname;
685 } out;
686 } all_info;
688 /* RAW_FILEINFO_SMB2_ALL_INFORMATION interface */
689 struct {
690 enum smb_fileinfo_level level;
691 struct {
692 union smb_handle_or_path file;
693 } in;
694 struct {
695 NTTIME create_time;
696 NTTIME access_time;
697 NTTIME write_time;
698 NTTIME change_time;
699 uint32_t attrib;
700 uint32_t unknown1;
701 uint64_t alloc_size;
702 uint64_t size;
703 uint32_t nlink;
704 uint8_t delete_pending;
705 uint8_t directory;
706 /* uint16_t _pad; */
707 uint64_t file_id;
708 uint32_t ea_size;
709 uint32_t access_mask;
710 uint64_t position;
711 uint32_t mode;
712 uint32_t alignment_requirement;
713 struct smb_wire_string fname;
714 } out;
715 } all_info2;
717 /* RAW_FILEINFO_ALT_NAME_INFO and RAW_FILEINFO_ALT_NAME_INFORMATION interfaces */
718 struct {
719 enum smb_fileinfo_level level;
720 struct {
721 union smb_handle_or_path file;
722 } in;
723 struct {
724 struct smb_wire_string fname;
725 } out;
726 } alt_name_info;
728 /* RAW_FILEINFO_STREAM_INFO and RAW_FILEINFO_STREAM_INFORMATION interfaces */
729 struct {
730 enum smb_fileinfo_level level;
731 struct {
732 union smb_handle_or_path file;
733 } in;
734 struct stream_information {
735 unsigned int num_streams;
736 struct stream_struct *streams;
737 } out;
738 } stream_info;
740 /* RAW_FILEINFO_COMPRESSION_INFO and RAW_FILEINFO_COMPRESSION_INFORMATION interfaces */
741 struct {
742 enum smb_fileinfo_level level;
743 struct {
744 union smb_handle_or_path file;
745 } in;
746 struct {
747 uint64_t compressed_size;
748 uint16_t format;
749 uint8_t unit_shift;
750 uint8_t chunk_shift;
751 uint8_t cluster_shift;
752 } out;
753 } compression_info;
755 /* RAW_FILEINFO_UNIX_BASIC interface */
756 struct {
757 enum smb_fileinfo_level level;
758 struct {
759 union smb_handle_or_path file;
760 } in;
761 struct {
762 uint64_t end_of_file;
763 uint64_t num_bytes;
764 NTTIME status_change_time;
765 NTTIME access_time;
766 NTTIME change_time;
767 uint64_t uid;
768 uint64_t gid;
769 uint32_t file_type;
770 uint64_t dev_major;
771 uint64_t dev_minor;
772 uint64_t unique_id;
773 uint64_t permissions;
774 uint64_t nlink;
775 } out;
776 } unix_basic_info;
778 /* RAW_FILEINFO_UNIX_INFO2 interface */
779 struct {
780 enum smb_fileinfo_level level;
781 struct {
782 union smb_handle_or_path file;
783 } in;
784 struct {
785 uint64_t end_of_file;
786 uint64_t num_bytes;
787 NTTIME status_change_time;
788 NTTIME access_time;
789 NTTIME change_time;
790 uint64_t uid;
791 uint64_t gid;
792 uint32_t file_type;
793 uint64_t dev_major;
794 uint64_t dev_minor;
795 uint64_t unique_id;
796 uint64_t permissions;
797 uint64_t nlink;
798 NTTIME create_time;
799 uint32_t file_flags;
800 uint32_t flags_mask;
801 } out;
802 } unix_info2;
804 /* RAW_FILEINFO_UNIX_LINK interface */
805 struct {
806 enum smb_fileinfo_level level;
807 struct {
808 union smb_handle_or_path file;
809 } in;
810 struct {
811 struct smb_wire_string link_dest;
812 } out;
813 } unix_link_info;
815 /* RAW_FILEINFO_INTERNAL_INFORMATION interface */
816 struct {
817 enum smb_fileinfo_level level;
818 struct {
819 union smb_handle_or_path file;
820 } in;
821 struct {
822 uint64_t file_id;
823 } out;
824 } internal_information;
826 /* RAW_FILEINFO_ACCESS_INFORMATION interface */
827 struct {
828 enum smb_fileinfo_level level;
829 struct {
830 union smb_handle_or_path file;
831 } in;
832 struct {
833 uint32_t access_flags;
834 } out;
835 } access_information;
837 /* RAW_FILEINFO_POSITION_INFORMATION interface */
838 struct {
839 enum smb_fileinfo_level level;
840 struct {
841 union smb_handle_or_path file;
842 } in;
843 struct {
844 uint64_t position;
845 } out;
846 } position_information;
848 /* RAW_FILEINFO_MODE_INFORMATION interface */
849 struct {
850 enum smb_fileinfo_level level;
851 struct {
852 union smb_handle_or_path file;
853 } in;
854 struct {
855 uint32_t mode;
856 } out;
857 } mode_information;
859 /* RAW_FILEINFO_ALIGNMENT_INFORMATION interface */
860 struct {
861 enum smb_fileinfo_level level;
862 struct {
863 union smb_handle_or_path file;
864 } in;
865 struct {
866 uint32_t alignment_requirement;
867 } out;
868 } alignment_information;
870 /* RAW_FILEINFO_NETWORK_OPEN_INFORMATION interface */
871 struct {
872 enum smb_fileinfo_level level;
873 struct {
874 union smb_handle_or_path file;
875 } in;
876 struct {
877 NTTIME create_time;
878 NTTIME access_time;
879 NTTIME write_time;
880 NTTIME change_time;
881 uint64_t alloc_size;
882 uint64_t size;
883 uint32_t attrib;
884 } out;
885 } network_open_information;
888 /* RAW_FILEINFO_ATTRIBUTE_TAG_INFORMATION interface */
889 struct {
890 enum smb_fileinfo_level level;
891 struct {
892 union smb_handle_or_path file;
893 } in;
894 struct {
895 uint32_t attrib;
896 uint32_t reparse_tag;
897 } out;
898 } attribute_tag_information;
900 /* RAW_FILEINFO_SEC_DESC */
901 struct {
902 enum smb_fileinfo_level level;
903 struct {
904 union smb_handle_or_path file;
905 uint32_t secinfo_flags;
906 } in;
907 struct {
908 struct security_descriptor *sd;
909 } out;
910 } query_secdesc;
914 enum smb_setfileinfo_level {
915 RAW_SFILEINFO_GENERIC = 0xF000,
916 RAW_SFILEINFO_SETATTR, /* SMBsetatr */
917 RAW_SFILEINFO_SETATTRE, /* SMBsetattrE */
918 RAW_SFILEINFO_SEC_DESC, /* NT_TRANSACT_SET_SECURITY_DESC */
919 RAW_SFILEINFO_STANDARD = SMB_SFILEINFO_STANDARD,
920 RAW_SFILEINFO_EA_SET = SMB_SFILEINFO_EA_SET,
921 RAW_SFILEINFO_BASIC_INFO = SMB_SFILEINFO_BASIC_INFO,
922 RAW_SFILEINFO_DISPOSITION_INFO = SMB_SFILEINFO_DISPOSITION_INFO,
923 RAW_SFILEINFO_ALLOCATION_INFO = SMB_SFILEINFO_ALLOCATION_INFO,
924 RAW_SFILEINFO_END_OF_FILE_INFO = SMB_SFILEINFO_END_OF_FILE_INFO,
925 RAW_SFILEINFO_UNIX_BASIC = SMB_SFILEINFO_UNIX_BASIC,
926 RAW_SFILEINFO_UNIX_INFO2 = SMB_SFILEINFO_UNIX_INFO2,
927 RAW_SFILEINFO_UNIX_LINK = SMB_SET_FILE_UNIX_LINK,
928 RAW_SFILEINFO_UNIX_HLINK = SMB_SET_FILE_UNIX_HLINK,
929 RAW_SFILEINFO_BASIC_INFORMATION = SMB_SFILEINFO_BASIC_INFORMATION,
930 RAW_SFILEINFO_RENAME_INFORMATION = SMB_SFILEINFO_RENAME_INFORMATION,
931 RAW_SFILEINFO_LINK_INFORMATION = SMB_SFILEINFO_LINK_INFORMATION,
932 RAW_SFILEINFO_DISPOSITION_INFORMATION = SMB_SFILEINFO_DISPOSITION_INFORMATION,
933 RAW_SFILEINFO_POSITION_INFORMATION = SMB_SFILEINFO_POSITION_INFORMATION,
934 RAW_SFILEINFO_FULL_EA_INFORMATION = SMB_SFILEINFO_FULL_EA_INFORMATION,
935 RAW_SFILEINFO_MODE_INFORMATION = SMB_SFILEINFO_MODE_INFORMATION,
936 RAW_SFILEINFO_ALLOCATION_INFORMATION = SMB_SFILEINFO_ALLOCATION_INFORMATION,
937 RAW_SFILEINFO_END_OF_FILE_INFORMATION = SMB_SFILEINFO_END_OF_FILE_INFORMATION,
938 RAW_SFILEINFO_PIPE_INFORMATION = SMB_SFILEINFO_PIPE_INFORMATION,
939 RAW_SFILEINFO_VALID_DATA_INFORMATION = SMB_SFILEINFO_VALID_DATA_INFORMATION,
940 RAW_SFILEINFO_SHORT_NAME_INFORMATION = SMB_SFILEINFO_SHORT_NAME_INFORMATION,
941 RAW_SFILEINFO_1025 = SMB_SFILEINFO_1025,
942 RAW_SFILEINFO_1027 = SMB_SFILEINFO_1027,
943 RAW_SFILEINFO_1029 = SMB_SFILEINFO_1029,
944 RAW_SFILEINFO_1030 = SMB_SFILEINFO_1030,
945 RAW_SFILEINFO_1031 = SMB_SFILEINFO_1031,
946 RAW_SFILEINFO_1032 = SMB_SFILEINFO_1032,
947 RAW_SFILEINFO_1036 = SMB_SFILEINFO_1036,
948 RAW_SFILEINFO_1041 = SMB_SFILEINFO_1041,
949 RAW_SFILEINFO_1042 = SMB_SFILEINFO_1042,
950 RAW_SFILEINFO_1043 = SMB_SFILEINFO_1043,
951 RAW_SFILEINFO_1044 = SMB_SFILEINFO_1044,
953 /* cope with breakage in SMB2 */
954 RAW_SFILEINFO_RENAME_INFORMATION_SMB2 = SMB_SFILEINFO_RENAME_INFORMATION|0x80000000,
957 /* union used in setfileinfo() and setpathinfo() calls */
958 union smb_setfileinfo {
959 /* generic interface */
960 struct {
961 enum smb_setfileinfo_level level;
962 struct {
963 union smb_handle_or_path file;
964 } in;
965 } generic;
967 /* RAW_SFILEINFO_SETATTR (SMBsetatr) interface - only via setpathinfo() */
968 struct {
969 enum smb_setfileinfo_level level;
970 struct {
971 union smb_handle_or_path file;
972 uint16_t attrib;
973 time_t write_time;
974 } in;
975 } setattr;
977 /* RAW_SFILEINFO_SETATTRE (SMBsetattrE) interface - only via setfileinfo()
978 also RAW_SFILEINFO_STANDARD */
979 struct {
980 enum smb_setfileinfo_level level;
981 struct {
982 union smb_handle_or_path file;
983 time_t create_time;
984 time_t access_time;
985 time_t write_time;
986 /* notice that size, alloc_size and attrib are not settable,
987 unlike the corresponding qfileinfo level */
988 } in;
989 } setattre, standard;
991 /* RAW_SFILEINFO_EA_SET interface */
992 struct {
993 enum smb_setfileinfo_level level;
994 struct {
995 union smb_handle_or_path file;
996 unsigned int num_eas;
997 struct ea_struct *eas;
998 } in;
999 } ea_set;
1001 /* RAW_SFILEINFO_BASIC_INFO and
1002 RAW_SFILEINFO_BASIC_INFORMATION interfaces */
1003 struct {
1004 enum smb_setfileinfo_level level;
1005 struct {
1006 union smb_handle_or_path file;
1007 NTTIME create_time;
1008 NTTIME access_time;
1009 NTTIME write_time;
1010 NTTIME change_time;
1011 uint32_t attrib;
1012 uint32_t reserved;
1013 } in;
1014 } basic_info;
1016 /* RAW_SFILEINFO_DISPOSITION_INFO and
1017 RAW_SFILEINFO_DISPOSITION_INFORMATION interfaces */
1018 struct {
1019 enum smb_setfileinfo_level level;
1020 struct {
1021 union smb_handle_or_path file;
1022 bool delete_on_close;
1023 } in;
1024 } disposition_info;
1026 /* RAW_SFILEINFO_ALLOCATION_INFO and
1027 RAW_SFILEINFO_ALLOCATION_INFORMATION interfaces */
1028 struct {
1029 enum smb_setfileinfo_level level;
1030 struct {
1031 union smb_handle_or_path file;
1032 /* w2k3 rounds this up to nearest 4096 */
1033 uint64_t alloc_size;
1034 } in;
1035 } allocation_info;
1037 /* RAW_SFILEINFO_END_OF_FILE_INFO and
1038 RAW_SFILEINFO_END_OF_FILE_INFORMATION interfaces */
1039 struct {
1040 enum smb_setfileinfo_level level;
1041 struct {
1042 union smb_handle_or_path file;
1043 uint64_t size;
1044 } in;
1045 } end_of_file_info;
1047 /* RAW_SFILEINFO_RENAME_INFORMATION interface */
1048 struct {
1049 enum smb_setfileinfo_level level;
1050 struct {
1051 union smb_handle_or_path file;
1052 uint8_t overwrite;
1053 uint64_t root_fid;
1054 const char *new_name;
1055 } in;
1056 } rename_information;
1058 /* RAW_SFILEINFO_LINK_INFORMATION interface */
1059 struct {
1060 enum smb_setfileinfo_level level;
1061 struct {
1062 union smb_handle_or_path file;
1063 uint8_t overwrite;
1064 uint64_t root_fid;
1065 const char *new_name;
1066 } in;
1067 } link_information;
1069 /* RAW_SFILEINFO_POSITION_INFORMATION interface */
1070 struct {
1071 enum smb_setfileinfo_level level;
1072 struct {
1073 union smb_handle_or_path file;
1074 uint64_t position;
1075 } in;
1076 } position_information;
1078 /* RAW_SFILEINFO_MODE_INFORMATION interface */
1079 struct {
1080 enum smb_setfileinfo_level level;
1081 struct {
1082 union smb_handle_or_path file;
1083 /* valid values seem to be 0, 2, 4 and 6 */
1084 uint32_t mode;
1085 } in;
1086 } mode_information;
1088 /* RAW_SFILEINFO_UNIX_BASIC interface */
1089 struct {
1090 enum smb_setfileinfo_level level;
1091 struct {
1092 union smb_handle_or_path file;
1093 uint32_t mode; /* yuck - this field remains to fix compile of libcli/clifile.c */
1094 uint64_t end_of_file;
1095 uint64_t num_bytes;
1096 NTTIME status_change_time;
1097 NTTIME access_time;
1098 NTTIME change_time;
1099 uint64_t uid;
1100 uint64_t gid;
1101 uint32_t file_type;
1102 uint64_t dev_major;
1103 uint64_t dev_minor;
1104 uint64_t unique_id;
1105 uint64_t permissions;
1106 uint64_t nlink;
1107 } in;
1108 } unix_basic;
1110 /* RAW_SFILEINFO_UNIX_INFO2 interface */
1111 struct {
1112 enum smb_setfileinfo_level level;
1113 struct {
1114 union smb_handle_or_path file;
1115 uint64_t end_of_file;
1116 uint64_t num_bytes;
1117 NTTIME status_change_time;
1118 NTTIME access_time;
1119 NTTIME change_time;
1120 uint64_t uid;
1121 uint64_t gid;
1122 uint32_t file_type;
1123 uint64_t dev_major;
1124 uint64_t dev_minor;
1125 uint64_t unique_id;
1126 uint64_t permissions;
1127 uint64_t nlink;
1128 NTTIME create_time;
1129 uint32_t file_flags;
1130 uint32_t flags_mask;
1131 } in;
1132 } unix_info2;
1134 /* RAW_SFILEINFO_UNIX_LINK, RAW_SFILEINFO_UNIX_HLINK interface */
1135 struct {
1136 enum smb_setfileinfo_level level;
1137 struct {
1138 union smb_handle_or_path file;
1139 const char *link_dest;
1140 } in;
1141 } unix_link, unix_hlink;
1143 /* RAW_FILEINFO_SET_SEC_DESC */
1144 struct {
1145 enum smb_setfileinfo_level level;
1146 struct {
1147 union smb_handle_or_path file;
1148 uint32_t secinfo_flags;
1149 struct security_descriptor *sd;
1150 } in;
1151 } set_secdesc;
1153 /* RAW_SFILEINFO_FULL_EA_INFORMATION */
1154 struct {
1155 enum smb_setfileinfo_level level;
1156 struct {
1157 union smb_handle_or_path file;
1158 struct smb_ea_list eas;
1159 } in;
1160 } full_ea_information;
1164 enum smb_fsinfo_level {
1165 RAW_QFS_GENERIC = 0xF000,
1166 RAW_QFS_DSKATTR, /* SMBdskattr */
1167 RAW_QFS_ALLOCATION = SMB_QFS_ALLOCATION,
1168 RAW_QFS_VOLUME = SMB_QFS_VOLUME,
1169 RAW_QFS_VOLUME_INFO = SMB_QFS_VOLUME_INFO,
1170 RAW_QFS_SIZE_INFO = SMB_QFS_SIZE_INFO,
1171 RAW_QFS_DEVICE_INFO = SMB_QFS_DEVICE_INFO,
1172 RAW_QFS_ATTRIBUTE_INFO = SMB_QFS_ATTRIBUTE_INFO,
1173 RAW_QFS_UNIX_INFO = SMB_QFS_UNIX_INFO,
1174 RAW_QFS_VOLUME_INFORMATION = SMB_QFS_VOLUME_INFORMATION,
1175 RAW_QFS_SIZE_INFORMATION = SMB_QFS_SIZE_INFORMATION,
1176 RAW_QFS_DEVICE_INFORMATION = SMB_QFS_DEVICE_INFORMATION,
1177 RAW_QFS_ATTRIBUTE_INFORMATION = SMB_QFS_ATTRIBUTE_INFORMATION,
1178 RAW_QFS_QUOTA_INFORMATION = SMB_QFS_QUOTA_INFORMATION,
1179 RAW_QFS_FULL_SIZE_INFORMATION = SMB_QFS_FULL_SIZE_INFORMATION,
1180 RAW_QFS_OBJECTID_INFORMATION = SMB_QFS_OBJECTID_INFORMATION};
1183 /* union for fsinfo() backend call. Note that there are no in
1184 structures, as this call only contains out parameters */
1185 union smb_fsinfo {
1186 /* generic interface */
1187 struct {
1188 enum smb_fsinfo_level level;
1189 struct smb2_handle handle; /* only for smb2 */
1191 struct {
1192 uint32_t block_size;
1193 uint64_t blocks_total;
1194 uint64_t blocks_free;
1195 uint32_t fs_id;
1196 NTTIME create_time;
1197 uint32_t serial_number;
1198 uint32_t fs_attr;
1199 uint32_t max_file_component_length;
1200 uint32_t device_type;
1201 uint32_t device_characteristics;
1202 uint64_t quota_soft;
1203 uint64_t quota_hard;
1204 uint64_t quota_flags;
1205 struct GUID guid;
1206 char *volume_name;
1207 char *fs_type;
1208 } out;
1209 } generic;
1211 /* SMBdskattr interface */
1212 struct {
1213 enum smb_fsinfo_level level;
1215 struct {
1216 uint16_t units_total;
1217 uint16_t blocks_per_unit;
1218 uint16_t block_size;
1219 uint16_t units_free;
1220 } out;
1221 } dskattr;
1223 /* trans2 RAW_QFS_ALLOCATION interface */
1224 struct {
1225 enum smb_fsinfo_level level;
1227 struct {
1228 uint32_t fs_id;
1229 uint32_t sectors_per_unit;
1230 uint32_t total_alloc_units;
1231 uint32_t avail_alloc_units;
1232 uint16_t bytes_per_sector;
1233 } out;
1234 } allocation;
1236 /* TRANS2 RAW_QFS_VOLUME interface */
1237 struct {
1238 enum smb_fsinfo_level level;
1240 struct {
1241 uint32_t serial_number;
1242 struct smb_wire_string volume_name;
1243 } out;
1244 } volume;
1246 /* TRANS2 RAW_QFS_VOLUME_INFO and RAW_QFS_VOLUME_INFORMATION interfaces */
1247 struct {
1248 enum smb_fsinfo_level level;
1249 struct smb2_handle handle; /* only for smb2 */
1251 struct {
1252 NTTIME create_time;
1253 uint32_t serial_number;
1254 struct smb_wire_string volume_name;
1255 } out;
1256 } volume_info;
1258 /* trans2 RAW_QFS_SIZE_INFO and RAW_QFS_SIZE_INFORMATION interfaces */
1259 struct {
1260 enum smb_fsinfo_level level;
1261 struct smb2_handle handle; /* only for smb2 */
1263 struct {
1264 uint64_t total_alloc_units;
1265 uint64_t avail_alloc_units; /* maps to call_avail_alloc_units */
1266 uint32_t sectors_per_unit;
1267 uint32_t bytes_per_sector;
1268 } out;
1269 } size_info;
1271 /* TRANS2 RAW_QFS_DEVICE_INFO and RAW_QFS_DEVICE_INFORMATION interfaces */
1272 struct {
1273 enum smb_fsinfo_level level;
1274 struct smb2_handle handle; /* only for smb2 */
1276 struct {
1277 uint32_t device_type;
1278 uint32_t characteristics;
1279 } out;
1280 } device_info;
1283 /* TRANS2 RAW_QFS_ATTRIBUTE_INFO and RAW_QFS_ATTRIBUTE_INFORMATION interfaces */
1284 struct {
1285 enum smb_fsinfo_level level;
1286 struct smb2_handle handle; /* only for smb2 */
1288 struct {
1289 uint32_t fs_attr;
1290 uint32_t max_file_component_length;
1291 struct smb_wire_string fs_type;
1292 } out;
1293 } attribute_info;
1296 /* TRANS2 RAW_QFS_UNIX_INFO interface */
1297 struct {
1298 enum smb_fsinfo_level level;
1300 struct {
1301 uint16_t major_version;
1302 uint16_t minor_version;
1303 uint64_t capability;
1304 } out;
1305 } unix_info;
1307 /* trans2 RAW_QFS_QUOTA_INFORMATION interface */
1308 struct {
1309 enum smb_fsinfo_level level;
1310 struct smb2_handle handle; /* only for smb2 */
1312 struct {
1313 uint64_t unknown[3];
1314 uint64_t quota_soft;
1315 uint64_t quota_hard;
1316 uint64_t quota_flags;
1317 } out;
1318 } quota_information;
1320 /* trans2 RAW_QFS_FULL_SIZE_INFORMATION interface */
1321 struct {
1322 enum smb_fsinfo_level level;
1323 struct smb2_handle handle; /* only for smb2 */
1325 struct {
1326 uint64_t total_alloc_units;
1327 uint64_t call_avail_alloc_units;
1328 uint64_t actual_avail_alloc_units;
1329 uint32_t sectors_per_unit;
1330 uint32_t bytes_per_sector;
1331 } out;
1332 } full_size_information;
1334 /* trans2 RAW_QFS_OBJECTID_INFORMATION interface */
1335 struct {
1336 enum smb_fsinfo_level level;
1337 struct smb2_handle handle; /* only for smb2 */
1339 struct {
1340 struct GUID guid;
1341 uint64_t unknown[6];
1342 } out;
1343 } objectid_information;
1348 enum smb_open_level {
1349 RAW_OPEN_OPEN,
1350 RAW_OPEN_OPENX,
1351 RAW_OPEN_MKNEW,
1352 RAW_OPEN_CREATE,
1353 RAW_OPEN_CTEMP,
1354 RAW_OPEN_SPLOPEN,
1355 RAW_OPEN_NTCREATEX,
1356 RAW_OPEN_T2OPEN,
1357 RAW_OPEN_NTTRANS_CREATE,
1358 RAW_OPEN_OPENX_READX,
1359 RAW_OPEN_NTCREATEX_READX,
1360 RAW_OPEN_SMB2
1363 /* the generic interface is defined to be equal to the NTCREATEX interface */
1364 #define RAW_OPEN_GENERIC RAW_OPEN_NTCREATEX
1366 /* union for open() backend call */
1367 union smb_open {
1369 * because the *.out.file structs are not aligned to the same offset for each level
1370 * we provide a hepler macro that should be used to find the current smb_handle structure
1372 #define SMB_OPEN_OUT_FILE(op, file) do { \
1373 switch (op->generic.level) { \
1374 case RAW_OPEN_OPEN: \
1375 file = &op->openold.out.file; \
1376 break; \
1377 case RAW_OPEN_OPENX: \
1378 file = &op->openx.out.file; \
1379 break; \
1380 case RAW_OPEN_MKNEW: \
1381 file = &op->mknew.out.file; \
1382 break; \
1383 case RAW_OPEN_CREATE: \
1384 file = &op->create.out.file; \
1385 break; \
1386 case RAW_OPEN_CTEMP: \
1387 file = &op->ctemp.out.file; \
1388 break; \
1389 case RAW_OPEN_SPLOPEN: \
1390 file = &op->splopen.out.file; \
1391 break; \
1392 case RAW_OPEN_NTCREATEX: \
1393 file = &op->ntcreatex.out.file; \
1394 break; \
1395 case RAW_OPEN_T2OPEN: \
1396 file = &op->t2open.out.file; \
1397 break; \
1398 case RAW_OPEN_NTTRANS_CREATE: \
1399 file = &op->nttrans.out.file; \
1400 break; \
1401 case RAW_OPEN_OPENX_READX: \
1402 file = &op->openxreadx.out.file; \
1403 break; \
1404 case RAW_OPEN_NTCREATEX_READX: \
1405 file = &op->ntcreatexreadx.out.file; \
1406 break; \
1407 case RAW_OPEN_SMB2: \
1408 file = &op->smb2.out.file; \
1409 break; \
1410 default: \
1411 /* this must be a programmer error */ \
1412 file = NULL; \
1413 break; \
1415 } while (0)
1416 /* SMBNTCreateX, nttrans and generic interface */
1417 struct {
1418 enum smb_open_level level;
1419 struct {
1420 uint32_t flags;
1421 union smb_handle root_fid;
1422 uint32_t access_mask;
1423 uint64_t alloc_size;
1424 uint32_t file_attr;
1425 uint32_t share_access;
1426 uint32_t open_disposition;
1427 uint32_t create_options;
1428 uint32_t impersonation;
1429 uint8_t security_flags;
1430 /* NOTE: fname can also be a pointer to a
1431 uint64_t file_id if create_options has the
1432 NTCREATEX_OPTIONS_OPEN_BY_FILE_ID flag set */
1433 const char *fname;
1435 /* these last 2 elements are only used in the
1436 NTTRANS varient of the call */
1437 struct security_descriptor *sec_desc;
1438 struct smb_ea_list *ea_list;
1440 /* some optional parameters from the SMB2 varient */
1441 bool query_maximal_access;
1443 /* private flags for internal use only */
1444 uint8_t private_flags;
1445 } in;
1446 struct {
1447 union smb_handle file;
1448 uint8_t oplock_level;
1449 uint32_t create_action;
1450 NTTIME create_time;
1451 NTTIME access_time;
1452 NTTIME write_time;
1453 NTTIME change_time;
1454 uint32_t attrib;
1455 uint64_t alloc_size;
1456 uint64_t size;
1457 uint16_t file_type;
1458 uint16_t ipc_state;
1459 uint8_t is_directory;
1461 /* optional return values matching SMB2 tagged
1462 values in the call */
1463 uint32_t maximal_access;
1464 } out;
1465 } ntcreatex, nttrans, generic;
1467 /* TRANS2_OPEN interface */
1468 struct {
1469 enum smb_open_level level;
1470 struct {
1471 uint16_t flags;
1472 uint16_t open_mode;
1473 uint16_t search_attrs;
1474 uint16_t file_attrs;
1475 time_t write_time;
1476 uint16_t open_func;
1477 uint32_t size;
1478 uint32_t timeout;
1479 const char *fname;
1480 unsigned int num_eas;
1481 struct ea_struct *eas;
1482 } in;
1483 struct {
1484 union smb_handle file;
1485 uint16_t attrib;
1486 time_t write_time;
1487 uint32_t size;
1488 uint16_t access;
1489 uint16_t ftype;
1490 uint16_t devstate;
1491 uint16_t action;
1492 uint32_t file_id;
1493 } out;
1494 } t2open;
1496 /* SMBopen interface */
1497 struct {
1498 enum smb_open_level level;
1499 struct {
1500 uint16_t open_mode;
1501 uint16_t search_attrs;
1502 const char *fname;
1503 } in;
1504 struct {
1505 union smb_handle file;
1506 uint16_t attrib;
1507 time_t write_time;
1508 uint32_t size;
1509 uint16_t rmode;
1510 } out;
1511 } openold;
1513 /* SMBopenX interface */
1514 struct {
1515 enum smb_open_level level;
1516 struct {
1517 uint16_t flags;
1518 uint16_t open_mode;
1519 uint16_t search_attrs; /* not honoured by win2003 */
1520 uint16_t file_attrs;
1521 time_t write_time; /* not honoured by win2003 */
1522 uint16_t open_func;
1523 uint32_t size; /* note that this sets the
1524 initial file size, not
1525 just allocation size */
1526 uint32_t timeout; /* not honoured by win2003 */
1527 const char *fname;
1528 } in;
1529 struct {
1530 union smb_handle file;
1531 uint16_t attrib;
1532 time_t write_time;
1533 uint32_t size;
1534 uint16_t access;
1535 uint16_t ftype;
1536 uint16_t devstate;
1537 uint16_t action;
1538 uint32_t unique_fid;
1539 uint32_t access_mask;
1540 uint32_t unknown;
1541 } out;
1542 } openx;
1544 /* SMBmknew interface */
1545 struct {
1546 enum smb_open_level level;
1547 struct {
1548 uint16_t attrib;
1549 time_t write_time;
1550 const char *fname;
1551 } in;
1552 struct {
1553 union smb_handle file;
1554 } out;
1555 } mknew, create;
1557 /* SMBctemp interface */
1558 struct {
1559 enum smb_open_level level;
1560 struct {
1561 uint16_t attrib;
1562 time_t write_time;
1563 const char *directory;
1564 } in;
1565 struct {
1566 union smb_handle file;
1567 /* temp name, relative to directory */
1568 char *name;
1569 } out;
1570 } ctemp;
1572 /* SMBsplopen interface */
1573 struct {
1574 enum smb_open_level level;
1575 struct {
1576 uint16_t setup_length;
1577 uint16_t mode;
1578 const char *ident;
1579 } in;
1580 struct {
1581 union smb_handle file;
1582 } out;
1583 } splopen;
1586 /* chained OpenX/ReadX interface */
1587 struct {
1588 enum smb_open_level level;
1589 struct {
1590 uint16_t flags;
1591 uint16_t open_mode;
1592 uint16_t search_attrs; /* not honoured by win2003 */
1593 uint16_t file_attrs;
1594 time_t write_time; /* not honoured by win2003 */
1595 uint16_t open_func;
1596 uint32_t size; /* note that this sets the
1597 initial file size, not
1598 just allocation size */
1599 uint32_t timeout; /* not honoured by win2003 */
1600 const char *fname;
1602 /* readx part */
1603 uint64_t offset;
1604 uint16_t mincnt;
1605 uint32_t maxcnt;
1606 uint16_t remaining;
1607 } in;
1608 struct {
1609 union smb_handle file;
1610 uint16_t attrib;
1611 time_t write_time;
1612 uint32_t size;
1613 uint16_t access;
1614 uint16_t ftype;
1615 uint16_t devstate;
1616 uint16_t action;
1617 uint32_t unique_fid;
1618 uint32_t access_mask;
1619 uint32_t unknown;
1621 /* readx part */
1622 uint8_t *data;
1623 uint16_t remaining;
1624 uint16_t compaction_mode;
1625 uint16_t nread;
1626 } out;
1627 } openxreadx;
1629 /* chained NTCreateX/ReadX interface */
1630 struct {
1631 enum smb_open_level level;
1632 struct {
1633 uint32_t flags;
1634 union smb_handle root_fid;
1635 uint32_t access_mask;
1636 uint64_t alloc_size;
1637 uint32_t file_attr;
1638 uint32_t share_access;
1639 uint32_t open_disposition;
1640 uint32_t create_options;
1641 uint32_t impersonation;
1642 uint8_t security_flags;
1643 /* NOTE: fname can also be a pointer to a
1644 uint64_t file_id if create_options has the
1645 NTCREATEX_OPTIONS_OPEN_BY_FILE_ID flag set */
1646 const char *fname;
1648 /* readx part */
1649 uint64_t offset;
1650 uint16_t mincnt;
1651 uint32_t maxcnt;
1652 uint16_t remaining;
1653 } in;
1654 struct {
1655 union smb_handle file;
1656 uint8_t oplock_level;
1657 uint32_t create_action;
1658 NTTIME create_time;
1659 NTTIME access_time;
1660 NTTIME write_time;
1661 NTTIME change_time;
1662 uint32_t attrib;
1663 uint64_t alloc_size;
1664 uint64_t size;
1665 uint16_t file_type;
1666 uint16_t ipc_state;
1667 uint8_t is_directory;
1669 /* readx part */
1670 uint8_t *data;
1671 uint16_t remaining;
1672 uint16_t compaction_mode;
1673 uint16_t nread;
1674 } out;
1675 } ntcreatexreadx;
1677 #define SMB2_CREATE_FLAG_REQUEST_OPLOCK 0x0100
1678 #define SMB2_CREATE_FLAG_REQUEST_EXCLUSIVE_OPLOCK 0x0800
1679 #define SMB2_CREATE_FLAG_GRANT_OPLOCK 0x0001
1680 #define SMB2_CREATE_FLAG_GRANT_EXCLUSIVE_OPLOCK 0x0080
1682 /* SMB2 Create */
1683 struct smb2_create {
1684 enum smb_open_level level;
1685 struct {
1686 /* static body buffer 56 (0x38) bytes */
1687 uint8_t security_flags; /* SMB2_SECURITY_* */
1688 uint8_t oplock_level; /* SMB2_OPLOCK_LEVEL_* */
1689 uint32_t impersonation_level; /* SMB2_IMPERSONATION_* */
1690 uint64_t create_flags;
1691 uint64_t reserved;
1692 uint32_t desired_access;
1693 uint32_t file_attributes;
1694 uint32_t share_access; /* NTCREATEX_SHARE_ACCESS_* */
1695 uint32_t create_disposition; /* NTCREATEX_DISP_* */
1696 uint32_t create_options; /* NTCREATEX_OPTIONS_* */
1698 /* uint16_t fname_ofs */
1699 /* uint16_t fname_size */
1700 /* uint32_t blob_ofs; */
1701 /* uint32_t blob_size; */
1703 /* dynamic body */
1704 const char *fname;
1706 /* now some optional parameters - encoded as tagged blobs */
1707 struct smb_ea_list eas;
1708 uint64_t alloc_size;
1709 struct security_descriptor *sec_desc;
1710 bool durable_open;
1711 struct smb2_handle *durable_handle;
1713 /* data for durable handle v2 */
1714 bool durable_open_v2;
1715 struct GUID create_guid;
1716 bool persistent_open;
1717 uint32_t timeout;
1718 struct smb2_handle *durable_handle_v2;
1720 bool query_maximal_access;
1721 NTTIME timewarp;
1722 bool query_on_disk_id;
1723 struct smb2_lease *lease_request;
1725 /* and any additional blobs the caller wants */
1726 struct smb2_create_blobs blobs;
1727 } in;
1728 struct {
1729 union smb_handle file;
1731 /* static body buffer 88 (0x58) bytes */
1732 /* uint16_t buffer_code; 0x59 = 0x58 + 1 */
1733 uint8_t oplock_level;
1734 uint8_t reserved;
1735 uint32_t create_action;
1736 NTTIME create_time;
1737 NTTIME access_time;
1738 NTTIME write_time;
1739 NTTIME change_time;
1740 uint64_t alloc_size;
1741 uint64_t size;
1742 uint32_t file_attr;
1743 uint32_t reserved2;
1744 /* struct smb2_handle handle;*/
1745 /* uint32_t blob_ofs; */
1746 /* uint32_t blob_size; */
1748 /* optional return values matching tagged values in the call */
1749 uint32_t maximal_access;
1750 uint8_t on_disk_id[32];
1751 struct smb2_lease lease_response;
1752 bool durable_open;
1754 /* durable handle v2 */
1755 bool durable_open_v2;
1756 bool persistent_open;
1757 uint32_t timeout;
1759 /* tagged blobs in the reply */
1760 struct smb2_create_blobs blobs;
1761 } out;
1762 } smb2;
1767 enum smb_read_level {
1768 RAW_READ_READBRAW,
1769 RAW_READ_LOCKREAD,
1770 RAW_READ_READ,
1771 RAW_READ_READX,
1772 RAW_READ_SMB2
1775 #define RAW_READ_GENERIC RAW_READ_READX
1777 /* union for read() backend call
1779 note that .infoX.out.data will be allocated before the backend is
1780 called. It will be big enough to hold the maximum size asked for
1782 union smb_read {
1783 /* SMBreadX (and generic) interface */
1784 struct {
1785 enum smb_read_level level;
1786 struct {
1787 union smb_handle file;
1788 uint64_t offset;
1789 uint32_t mincnt; /* enforced on SMB2, 16 bit on SMB */
1790 uint32_t maxcnt;
1791 uint16_t remaining;
1792 bool read_for_execute;
1793 } in;
1794 struct {
1795 uint8_t *data;
1796 uint16_t remaining;
1797 uint16_t compaction_mode;
1798 uint32_t nread;
1799 } out;
1800 } readx, generic;
1802 /* SMBreadbraw interface */
1803 struct {
1804 enum smb_read_level level;
1805 struct {
1806 union smb_handle file;
1807 uint64_t offset;
1808 uint16_t maxcnt;
1809 uint16_t mincnt;
1810 uint32_t timeout;
1811 } in;
1812 struct {
1813 uint8_t *data;
1814 uint32_t nread;
1815 } out;
1816 } readbraw;
1819 /* SMBlockandread interface */
1820 struct {
1821 enum smb_read_level level;
1822 struct {
1823 union smb_handle file;
1824 uint16_t count;
1825 uint32_t offset;
1826 uint16_t remaining;
1827 } in;
1828 struct {
1829 uint8_t *data;
1830 uint16_t nread;
1831 } out;
1832 } lockread;
1834 /* SMBread interface */
1835 struct {
1836 enum smb_read_level level;
1837 struct {
1838 union smb_handle file;
1839 uint16_t count;
1840 uint32_t offset;
1841 uint16_t remaining;
1842 } in;
1843 struct {
1844 uint8_t *data;
1845 uint16_t nread;
1846 } out;
1847 } read;
1849 /* SMB2 Read */
1850 struct smb2_read {
1851 enum smb_read_level level;
1852 struct {
1853 union smb_handle file;
1855 /* static body buffer 48 (0x30) bytes */
1856 /* uint16_t buffer_code; 0x31 = 0x30 + 1 */
1857 uint8_t _pad;
1858 uint8_t reserved;
1859 uint32_t length;
1860 uint64_t offset;
1861 /* struct smb2_handle handle; */
1862 uint32_t min_count;
1863 uint32_t channel;
1864 uint32_t remaining;
1865 /* the docs give no indication of what
1866 these channel variables are for */
1867 uint16_t channel_offset;
1868 uint16_t channel_length;
1869 } in;
1870 struct {
1871 /* static body buffer 16 (0x10) bytes */
1872 /* uint16_t buffer_code; 0x11 = 0x10 + 1 */
1873 /* uint8_t data_ofs; */
1874 /* uint8_t reserved; */
1875 /* uint32_t data_size; */
1876 uint32_t remaining;
1877 uint32_t reserved;
1879 /* dynamic body */
1880 DATA_BLOB data;
1881 } out;
1882 } smb2;
1886 enum smb_write_level {
1887 RAW_WRITE_WRITEUNLOCK,
1888 RAW_WRITE_WRITE,
1889 RAW_WRITE_WRITEX,
1890 RAW_WRITE_WRITECLOSE,
1891 RAW_WRITE_SPLWRITE,
1892 RAW_WRITE_SMB2
1895 #define RAW_WRITE_GENERIC RAW_WRITE_WRITEX
1897 /* union for write() backend call
1899 union smb_write {
1900 /* SMBwriteX interface */
1901 struct {
1902 enum smb_write_level level;
1903 struct {
1904 union smb_handle file;
1905 uint64_t offset;
1906 uint16_t wmode;
1907 uint16_t remaining;
1908 uint32_t count;
1909 const uint8_t *data;
1910 } in;
1911 struct {
1912 uint32_t nwritten;
1913 uint16_t remaining;
1914 } out;
1915 } writex, generic;
1917 /* SMBwriteunlock interface */
1918 struct {
1919 enum smb_write_level level;
1920 struct {
1921 union smb_handle file;
1922 uint16_t count;
1923 uint32_t offset;
1924 uint16_t remaining;
1925 const uint8_t *data;
1926 } in;
1927 struct {
1928 uint32_t nwritten;
1929 } out;
1930 } writeunlock;
1932 /* SMBwrite interface */
1933 struct {
1934 enum smb_write_level level;
1935 struct {
1936 union smb_handle file;
1937 uint16_t count;
1938 uint32_t offset;
1939 uint16_t remaining;
1940 const uint8_t *data;
1941 } in;
1942 struct {
1943 uint16_t nwritten;
1944 } out;
1945 } write;
1947 /* SMBwriteclose interface */
1948 struct {
1949 enum smb_write_level level;
1950 struct {
1951 union smb_handle file;
1952 uint16_t count;
1953 uint32_t offset;
1954 time_t mtime;
1955 const uint8_t *data;
1956 } in;
1957 struct {
1958 uint16_t nwritten;
1959 } out;
1960 } writeclose;
1962 /* SMBsplwrite interface */
1963 struct {
1964 enum smb_write_level level;
1965 struct {
1966 union smb_handle file;
1967 uint16_t count;
1968 const uint8_t *data;
1969 } in;
1970 } splwrite;
1972 /* SMB2 Write */
1973 struct smb2_write {
1974 enum smb_write_level level;
1975 struct {
1976 union smb_handle file;
1978 /* static body buffer 48 (0x30) bytes */
1979 /* uint16_t buffer_code; 0x31 = 0x30 + 1 */
1980 /* uint16_t data_ofs; */
1981 /* uint32_t data_size; */
1982 uint64_t offset;
1983 /* struct smb2_handle handle; */
1984 uint64_t unknown1; /* 0xFFFFFFFFFFFFFFFF */
1985 uint64_t unknown2; /* 0xFFFFFFFFFFFFFFFF */
1987 /* dynamic body */
1988 DATA_BLOB data;
1989 } in;
1990 struct {
1991 /* static body buffer 17 (0x11) bytes */
1992 /* uint16_t buffer_code; 0x11 = 0x10 + 1*/
1993 uint16_t _pad;
1994 uint32_t nwritten;
1995 uint64_t unknown1; /* 0x0000000000000000 */
1996 } out;
1997 } smb2;
2001 enum smb_lock_level {
2002 RAW_LOCK_LOCK,
2003 RAW_LOCK_UNLOCK,
2004 RAW_LOCK_LOCKX,
2005 RAW_LOCK_SMB2,
2006 RAW_LOCK_SMB2_BREAK
2009 #define RAW_LOCK_GENERIC RAW_LOCK_LOCKX
2011 /* union for lock() backend call
2013 union smb_lock {
2014 /* SMBlockingX and generic interface */
2015 struct {
2016 enum smb_lock_level level;
2017 struct {
2018 union smb_handle file;
2019 uint16_t mode;
2020 uint32_t timeout;
2021 uint16_t ulock_cnt;
2022 uint16_t lock_cnt;
2023 struct smb_lock_entry {
2024 uint32_t pid; /* 16 bits in SMB1 */
2025 uint64_t offset;
2026 uint64_t count;
2027 } *locks; /* unlocks are first in the arrray */
2028 } in;
2029 } generic, lockx;
2031 /* SMBlock and SMBunlock interface */
2032 struct {
2033 enum smb_lock_level level;
2034 struct {
2035 union smb_handle file;
2036 uint32_t count;
2037 uint32_t offset;
2038 } in;
2039 } lock, unlock;
2041 /* SMB2 Lock */
2042 struct smb2_lock {
2043 enum smb_lock_level level;
2044 struct {
2045 union smb_handle file;
2047 /* static body buffer 48 (0x30) bytes */
2048 /* uint16_t buffer_code; 0x30 */
2049 uint16_t lock_count;
2050 uint32_t lock_sequence;
2051 /* struct smb2_handle handle; */
2052 struct smb2_lock_element {
2053 uint64_t offset;
2054 uint64_t length;
2055 uint32_t flags;
2056 uint32_t reserved;
2057 } *locks;
2058 } in;
2059 struct {
2060 /* static body buffer 4 (0x04) bytes */
2061 /* uint16_t buffer_code; 0x04 */
2062 uint16_t reserved;
2063 } out;
2064 } smb2;
2066 /* SMB2 Break */
2067 struct smb2_break {
2068 enum smb_lock_level level;
2069 struct {
2070 union smb_handle file;
2072 /* static body buffer 24 (0x18) bytes */
2073 uint8_t oplock_level;
2074 uint8_t reserved;
2075 uint32_t reserved2;
2076 /* struct smb2_handle handle; */
2077 } in, out;
2078 } smb2_break;
2080 /* SMB2 Lease Break Ack (same opcode as smb2_break) */
2081 struct smb2_lease_break_ack {
2082 struct {
2083 uint32_t reserved;
2084 struct smb2_lease lease;
2085 } in, out;
2086 } smb2_lease_break_ack;
2090 enum smb_close_level {
2091 RAW_CLOSE_CLOSE,
2092 RAW_CLOSE_SPLCLOSE,
2093 RAW_CLOSE_SMB2,
2094 RAW_CLOSE_GENERIC,
2098 union for close() backend call
2100 union smb_close {
2101 /* generic interface */
2102 struct {
2103 enum smb_close_level level;
2104 struct {
2105 union smb_handle file;
2106 time_t write_time;
2107 uint16_t flags; /* SMB2_CLOSE_FLAGS_* */
2108 } in;
2109 struct {
2110 uint16_t flags;
2111 NTTIME create_time;
2112 NTTIME access_time;
2113 NTTIME write_time;
2114 NTTIME change_time;
2115 uint64_t alloc_size;
2116 uint64_t size;
2117 uint32_t file_attr;
2118 } out;
2119 } generic;
2121 /* SMBclose interface */
2122 struct {
2123 enum smb_close_level level;
2124 struct {
2125 union smb_handle file;
2126 time_t write_time;
2127 } in;
2128 } close;
2130 /* SMBsplclose interface - empty! */
2131 struct {
2132 enum smb_close_level level;
2133 struct {
2134 union smb_handle file;
2135 } in;
2136 } splclose;
2138 /* SMB2 Close */
2139 struct smb2_close {
2140 enum smb_close_level level;
2141 struct {
2142 union smb_handle file;
2144 /* static body buffer 24 (0x18) bytes */
2145 /* uint16_t buffer_code; 0x18 */
2146 uint16_t flags; /* SMB2_CLOSE_FLAGS_* */
2147 uint32_t _pad;
2148 } in;
2149 struct {
2150 /* static body buffer 60 (0x3C) bytes */
2151 /* uint16_t buffer_code; 0x3C */
2152 uint16_t flags;
2153 uint32_t _pad;
2154 NTTIME create_time;
2155 NTTIME access_time;
2156 NTTIME write_time;
2157 NTTIME change_time;
2158 uint64_t alloc_size;
2159 uint64_t size;
2160 uint32_t file_attr;
2161 } out;
2162 } smb2;
2166 enum smb_lpq_level {RAW_LPQ_GENERIC, RAW_LPQ_RETQ};
2169 union for lpq() backend
2171 union smb_lpq {
2172 /* generic interface */
2173 struct {
2174 enum smb_lpq_level level;
2176 } generic;
2179 /* SMBsplretq interface */
2180 struct {
2181 enum smb_lpq_level level;
2183 struct {
2184 uint16_t maxcount;
2185 uint16_t startidx;
2186 } in;
2187 struct {
2188 uint16_t count;
2189 uint16_t restart_idx;
2190 struct {
2191 time_t time;
2192 uint8_t status;
2193 uint16_t job;
2194 uint32_t size;
2195 char *user;
2196 } *queue;
2197 } out;
2198 } retq;
2201 enum smb_ioctl_level {
2202 RAW_IOCTL_IOCTL,
2203 RAW_IOCTL_NTIOCTL,
2204 RAW_IOCTL_SMB2,
2205 RAW_IOCTL_SMB2_NO_HANDLE
2208 /* 2.2.31 SMB2 IOCTL Request */
2209 #define SMB2_IOCTL_FLAG_IS_FSCTL 0x00000001
2212 union for ioctl() backend
2214 union smb_ioctl {
2215 /* generic interface */
2216 struct {
2217 enum smb_ioctl_level level;
2218 struct {
2219 union smb_handle file;
2220 } in;
2221 } generic;
2223 /* struct for SMBioctl */
2224 struct {
2225 enum smb_ioctl_level level;
2226 struct {
2227 union smb_handle file;
2228 uint32_t request;
2229 } in;
2230 struct {
2231 DATA_BLOB blob;
2232 } out;
2233 } ioctl;
2236 /* struct for NT ioctl call */
2237 struct {
2238 enum smb_ioctl_level level;
2239 struct {
2240 union smb_handle file;
2241 uint32_t function;
2242 bool fsctl;
2243 uint8_t filter;
2244 uint32_t max_data;
2245 DATA_BLOB blob;
2246 } in;
2247 struct {
2248 DATA_BLOB blob;
2249 } out;
2250 } ntioctl;
2252 /* SMB2 Ioctl */
2253 struct smb2_ioctl {
2254 enum smb_ioctl_level level;
2255 struct {
2256 union smb_handle file;
2258 /* static body buffer 56 (0x38) bytes */
2259 /* uint16_t buffer_code; 0x39 = 0x38 + 1 */
2260 uint16_t _pad;
2261 uint32_t function;
2262 /*struct smb2_handle handle;*/
2263 /* uint32_t out_ofs; */
2264 /* uint32_t out_size; */
2265 uint32_t unknown2;
2266 /* uint32_t in_ofs; */
2267 /* uint32_t in_size; */
2268 uint32_t max_response_size;
2269 uint64_t flags;
2271 /* dynamic body */
2272 DATA_BLOB out;
2273 DATA_BLOB in;
2274 } in;
2275 struct {
2276 union smb_handle file;
2278 /* static body buffer 48 (0x30) bytes */
2279 /* uint16_t buffer_code; 0x31 = 0x30 + 1 */
2280 uint16_t _pad;
2281 uint32_t function;
2282 /* struct smb2_handle handle; */
2283 /* uint32_t in_ofs; */
2284 /* uint32_t in_size; */
2285 /* uint32_t out_ofs; */
2286 /* uint32_t out_size; */
2287 uint32_t unknown2;
2288 uint32_t unknown3;
2290 /* dynamic body */
2291 DATA_BLOB in;
2292 DATA_BLOB out;
2293 } out;
2294 } smb2;
2297 enum smb_flush_level {
2298 RAW_FLUSH_FLUSH,
2299 RAW_FLUSH_ALL,
2300 RAW_FLUSH_SMB2
2303 union smb_flush {
2304 /* struct for SMBflush */
2305 struct {
2306 enum smb_flush_level level;
2307 struct {
2308 union smb_handle file;
2309 } in;
2310 } flush, generic;
2312 /* SMBflush with 0xFFFF wildcard fnum */
2313 struct {
2314 enum smb_flush_level level;
2315 } flush_all;
2317 /* SMB2 Flush */
2318 struct smb2_flush {
2319 enum smb_flush_level level;
2320 struct {
2321 union smb_handle file;
2322 uint16_t reserved1;
2323 uint32_t reserved2;
2324 } in;
2325 struct {
2326 uint16_t reserved;
2327 } out;
2328 } smb2;
2331 /* struct for SMBcopy */
2332 struct smb_copy {
2333 struct {
2334 uint16_t tid2;
2335 uint16_t ofun;
2336 uint16_t flags;
2337 const char *path1;
2338 const char *path2;
2339 } in;
2340 struct {
2341 uint16_t count;
2342 } out;
2346 /* struct for transact/transact2 call */
2347 struct smb_trans2 {
2348 struct {
2349 uint16_t max_param;
2350 uint16_t max_data;
2351 uint8_t max_setup;
2352 uint16_t flags;
2353 uint32_t timeout;
2354 uint8_t setup_count;
2355 uint16_t *setup;
2356 const char *trans_name; /* SMBtrans only */
2357 DATA_BLOB params;
2358 DATA_BLOB data;
2359 } in;
2361 struct {
2362 uint8_t setup_count;
2363 uint16_t *setup;
2364 DATA_BLOB params;
2365 DATA_BLOB data;
2366 } out;
2369 /* struct for nttransact2 call */
2370 struct smb_nttrans {
2371 struct {
2372 uint8_t max_setup;
2373 uint32_t max_param;
2374 uint32_t max_data;
2375 uint8_t setup_count;
2376 uint16_t function;
2377 uint8_t *setup;
2378 DATA_BLOB params;
2379 DATA_BLOB data;
2380 } in;
2382 struct {
2383 uint8_t setup_count; /* in units of 16 bit words */
2384 uint8_t *setup;
2385 DATA_BLOB params;
2386 DATA_BLOB data;
2387 } out;
2390 enum smb_notify_level {
2391 RAW_NOTIFY_NTTRANS,
2392 RAW_NOTIFY_SMB2
2395 union smb_notify {
2396 /* struct for nttrans change notify call */
2397 struct {
2398 enum smb_notify_level level;
2400 struct {
2401 union smb_handle file;
2402 uint32_t buffer_size;
2403 uint32_t completion_filter;
2404 bool recursive;
2405 } in;
2407 struct {
2408 uint32_t num_changes;
2409 struct notify_changes {
2410 uint32_t action;
2411 struct smb_wire_string name;
2412 } *changes;
2413 } out;
2414 } nttrans;
2416 struct smb2_notify {
2417 enum smb_notify_level level;
2419 struct {
2420 union smb_handle file;
2421 /* static body buffer 32 (0x20) bytes */
2422 /* uint16_t buffer_code; 0x32 */
2423 uint16_t recursive;
2424 uint32_t buffer_size;
2425 /*struct smb2_handle file;*/
2426 uint32_t completion_filter;
2427 uint32_t unknown;
2428 } in;
2430 struct {
2431 /* static body buffer 8 (0x08) bytes */
2432 /* uint16_t buffer_code; 0x09 = 0x08 + 1 */
2433 /* uint16_t blob_ofs; */
2434 /* uint16_t blob_size; */
2436 /* dynamic body */
2437 /*DATA_BLOB blob;*/
2439 /* DATA_BLOB content */
2440 uint32_t num_changes;
2441 struct notify_changes *changes;
2442 } out;
2443 } smb2;
2446 enum smb_search_level {
2447 RAW_SEARCH_SEARCH, /* SMBsearch */
2448 RAW_SEARCH_FFIRST, /* SMBffirst */
2449 RAW_SEARCH_FUNIQUE, /* SMBfunique */
2450 RAW_SEARCH_TRANS2, /* SMBtrans2 */
2451 RAW_SEARCH_SMB2 /* SMB2 Find */
2454 enum smb_search_data_level {
2455 RAW_SEARCH_DATA_GENERIC = 0x10000, /* only used in the smbcli_ code */
2456 RAW_SEARCH_DATA_SEARCH,
2457 RAW_SEARCH_DATA_STANDARD = SMB_FIND_STANDARD,
2458 RAW_SEARCH_DATA_EA_SIZE = SMB_FIND_EA_SIZE,
2459 RAW_SEARCH_DATA_EA_LIST = SMB_FIND_EA_LIST,
2460 RAW_SEARCH_DATA_DIRECTORY_INFO = SMB_FIND_DIRECTORY_INFO,
2461 RAW_SEARCH_DATA_FULL_DIRECTORY_INFO = SMB_FIND_FULL_DIRECTORY_INFO,
2462 RAW_SEARCH_DATA_NAME_INFO = SMB_FIND_NAME_INFO,
2463 RAW_SEARCH_DATA_BOTH_DIRECTORY_INFO = SMB_FIND_BOTH_DIRECTORY_INFO,
2464 RAW_SEARCH_DATA_ID_FULL_DIRECTORY_INFO = SMB_FIND_ID_FULL_DIRECTORY_INFO,
2465 RAW_SEARCH_DATA_ID_BOTH_DIRECTORY_INFO = SMB_FIND_ID_BOTH_DIRECTORY_INFO,
2466 RAW_SEARCH_DATA_UNIX_INFO = SMB_FIND_UNIX_INFO,
2467 RAW_SEARCH_DATA_UNIX_INFO2 = SMB_FIND_UNIX_INFO2
2470 /* union for file search */
2471 union smb_search_first {
2472 struct {
2473 enum smb_search_level level;
2474 enum smb_search_data_level data_level;
2475 } generic;
2477 /* search (old) findfirst interface.
2478 Also used for ffirst and funique. */
2479 struct {
2480 enum smb_search_level level;
2481 enum smb_search_data_level data_level;
2483 struct {
2484 uint16_t max_count;
2485 uint16_t search_attrib;
2486 const char *pattern;
2487 } in;
2488 struct {
2489 int16_t count;
2490 } out;
2491 } search_first;
2493 /* trans2 findfirst interface */
2494 struct {
2495 enum smb_search_level level;
2496 enum smb_search_data_level data_level;
2498 struct {
2499 uint16_t search_attrib;
2500 uint16_t max_count;
2501 uint16_t flags;
2502 uint32_t storage_type;
2503 const char *pattern;
2505 /* the ea names are only used for RAW_SEARCH_EA_LIST */
2506 unsigned int num_names;
2507 struct ea_name *ea_names;
2508 } in;
2509 struct {
2510 uint16_t handle;
2511 uint16_t count;
2512 uint16_t end_of_search;
2513 } out;
2514 } t2ffirst;
2516 /* SMB2 Find */
2517 struct smb2_find {
2518 enum smb_search_level level;
2519 enum smb_search_data_level data_level;
2520 struct {
2521 union smb_handle file;
2523 /* static body buffer 32 (0x20) bytes */
2524 /* uint16_t buffer_code; 0x21 = 0x20 + 1 */
2525 uint8_t level;
2526 uint8_t continue_flags; /* SMB2_CONTINUE_FLAG_* */
2527 uint32_t file_index;
2528 /* struct smb2_handle handle; */
2529 /* uint16_t pattern_ofs; */
2530 /* uint16_t pattern_size; */
2531 uint32_t max_response_size;
2533 /* dynamic body */
2534 const char *pattern;
2535 } in;
2536 struct {
2537 /* static body buffer 8 (0x08) bytes */
2538 /* uint16_t buffer_code; 0x08 */
2539 /* uint16_t blob_ofs; */
2540 /* uint32_t blob_size; */
2542 /* dynamic body */
2543 DATA_BLOB blob;
2544 } out;
2545 } smb2;
2548 /* union for file search continue */
2549 union smb_search_next {
2550 struct {
2551 enum smb_search_level level;
2552 enum smb_search_data_level data_level;
2553 } generic;
2555 /* search (old) findnext interface. Also used
2556 for ffirst when continuing */
2557 struct {
2558 enum smb_search_level level;
2559 enum smb_search_data_level data_level;
2561 struct {
2562 uint16_t max_count;
2563 uint16_t search_attrib;
2564 struct smb_search_id {
2565 uint8_t reserved;
2566 char name[11];
2567 uint8_t handle;
2568 uint32_t server_cookie;
2569 uint32_t client_cookie;
2570 } id;
2571 } in;
2572 struct {
2573 uint16_t count;
2574 } out;
2575 } search_next;
2577 /* trans2 findnext interface */
2578 struct {
2579 enum smb_search_level level;
2580 enum smb_search_data_level data_level;
2582 struct {
2583 uint16_t handle;
2584 uint16_t max_count;
2585 uint32_t resume_key;
2586 uint16_t flags;
2587 const char *last_name;
2589 /* the ea names are only used for RAW_SEARCH_EA_LIST */
2590 unsigned int num_names;
2591 struct ea_name *ea_names;
2592 } in;
2593 struct {
2594 uint16_t count;
2595 uint16_t end_of_search;
2596 } out;
2597 } t2fnext;
2599 /* SMB2 Find */
2600 struct smb2_find smb2;
2603 /* union for search reply file data */
2604 union smb_search_data {
2606 * search (old) findfirst
2607 * RAW_SEARCH_DATA_SEARCH
2609 struct {
2610 uint16_t attrib;
2611 time_t write_time;
2612 uint32_t size;
2613 struct smb_search_id id;
2614 const char *name;
2615 } search;
2617 /* trans2 findfirst RAW_SEARCH_DATA_STANDARD level */
2618 struct {
2619 uint32_t resume_key;
2620 time_t create_time;
2621 time_t access_time;
2622 time_t write_time;
2623 uint32_t size;
2624 uint32_t alloc_size;
2625 uint16_t attrib;
2626 struct smb_wire_string name;
2627 } standard;
2629 /* trans2 findfirst RAW_SEARCH_DATA_EA_SIZE level */
2630 struct {
2631 uint32_t resume_key;
2632 time_t create_time;
2633 time_t access_time;
2634 time_t write_time;
2635 uint32_t size;
2636 uint32_t alloc_size;
2637 uint16_t attrib;
2638 uint32_t ea_size;
2639 struct smb_wire_string name;
2640 } ea_size;
2642 /* trans2 findfirst RAW_SEARCH_DATA_EA_LIST level */
2643 struct {
2644 uint32_t resume_key;
2645 time_t create_time;
2646 time_t access_time;
2647 time_t write_time;
2648 uint32_t size;
2649 uint32_t alloc_size;
2650 uint16_t attrib;
2651 struct smb_ea_list eas;
2652 struct smb_wire_string name;
2653 } ea_list;
2655 /* RAW_SEARCH_DATA_DIRECTORY_INFO interface */
2656 struct {
2657 uint32_t file_index;
2658 NTTIME create_time;
2659 NTTIME access_time;
2660 NTTIME write_time;
2661 NTTIME change_time;
2662 uint64_t size;
2663 uint64_t alloc_size;
2664 uint32_t attrib;
2665 struct smb_wire_string name;
2666 } directory_info;
2668 /* RAW_SEARCH_DATA_FULL_DIRECTORY_INFO interface */
2669 struct {
2670 uint32_t file_index;
2671 NTTIME create_time;
2672 NTTIME access_time;
2673 NTTIME write_time;
2674 NTTIME change_time;
2675 uint64_t size;
2676 uint64_t alloc_size;
2677 uint32_t attrib;
2678 uint32_t ea_size;
2679 struct smb_wire_string name;
2680 } full_directory_info;
2682 /* RAW_SEARCH_DATA_NAME_INFO interface */
2683 struct {
2684 uint32_t file_index;
2685 struct smb_wire_string name;
2686 } name_info;
2688 /* RAW_SEARCH_DATA_BOTH_DIRECTORY_INFO interface */
2689 struct {
2690 uint32_t file_index;
2691 NTTIME create_time;
2692 NTTIME access_time;
2693 NTTIME write_time;
2694 NTTIME change_time;
2695 uint64_t size;
2696 uint64_t alloc_size;
2697 uint32_t attrib;
2698 uint32_t ea_size;
2699 struct smb_wire_string short_name;
2700 struct smb_wire_string name;
2701 } both_directory_info;
2703 /* RAW_SEARCH_DATA_ID_FULL_DIRECTORY_INFO interface */
2704 struct {
2705 uint32_t file_index;
2706 NTTIME create_time;
2707 NTTIME access_time;
2708 NTTIME write_time;
2709 NTTIME change_time;
2710 uint64_t size;
2711 uint64_t alloc_size;
2712 uint32_t attrib;
2713 uint32_t ea_size;
2714 uint64_t file_id;
2715 struct smb_wire_string name;
2716 } id_full_directory_info;
2718 /* RAW_SEARCH_DATA_ID_BOTH_DIRECTORY_INFO interface */
2719 struct {
2720 uint32_t file_index;
2721 NTTIME create_time;
2722 NTTIME access_time;
2723 NTTIME write_time;
2724 NTTIME change_time;
2725 uint64_t size;
2726 uint64_t alloc_size;
2727 uint32_t attrib;
2728 uint32_t ea_size;
2729 uint64_t file_id;
2730 struct smb_wire_string short_name;
2731 struct smb_wire_string name;
2732 } id_both_directory_info;
2734 /* RAW_SEARCH_DATA_UNIX_INFO interface */
2735 struct {
2736 uint32_t file_index;
2737 uint64_t size;
2738 uint64_t alloc_size;
2739 NTTIME status_change_time;
2740 NTTIME access_time;
2741 NTTIME change_time;
2742 uint64_t uid;
2743 uint64_t gid;
2744 uint32_t file_type;
2745 uint64_t dev_major;
2746 uint64_t dev_minor;
2747 uint64_t unique_id;
2748 uint64_t permissions;
2749 uint64_t nlink;
2750 const char *name;
2751 } unix_info;
2753 /* RAW_SEARCH_DATA_UNIX_INFO2 interface */
2754 struct {
2755 uint32_t file_index;
2756 uint64_t end_of_file;
2757 uint64_t num_bytes;
2758 NTTIME status_change_time;
2759 NTTIME access_time;
2760 NTTIME change_time;
2761 uint64_t uid;
2762 uint64_t gid;
2763 uint32_t file_type;
2764 uint64_t dev_major;
2765 uint64_t dev_minor;
2766 uint64_t unique_id;
2767 uint64_t permissions;
2768 uint64_t nlink;
2769 NTTIME create_time;
2770 uint32_t file_flags;
2771 uint32_t flags_mask;
2772 struct smb_wire_string name;
2773 } unix_info2;
2776 /* Callback function passed to the raw search interface. */
2777 typedef bool (*smbcli_search_callback)(void *private_data, const union smb_search_data *file);
2779 enum smb_search_close_level {RAW_FINDCLOSE_GENERIC, RAW_FINDCLOSE_FCLOSE, RAW_FINDCLOSE_FINDCLOSE};
2781 /* union for file search close */
2782 union smb_search_close {
2783 struct {
2784 enum smb_search_close_level level;
2785 } generic;
2787 /* SMBfclose (old search) interface */
2788 struct {
2789 enum smb_search_close_level level;
2791 struct {
2792 /* max_count and search_attrib are not used, but are present */
2793 uint16_t max_count;
2794 uint16_t search_attrib;
2795 struct smb_search_id id;
2796 } in;
2797 } fclose;
2799 /* SMBfindclose interface */
2800 struct {
2801 enum smb_search_close_level level;
2803 struct {
2804 uint16_t handle;
2805 } in;
2806 } findclose;
2811 struct for SMBecho call
2813 struct smb_echo {
2814 struct {
2815 uint16_t repeat_count;
2816 uint16_t size;
2817 uint8_t *data;
2818 } in;
2819 struct {
2820 uint16_t count;
2821 uint16_t sequence_number;
2822 uint16_t size;
2823 uint8_t *data;
2824 } out;
2828 struct for shadow copy volumes
2830 struct smb_shadow_copy {
2831 struct {
2832 union smb_handle file;
2833 uint32_t max_data;
2834 } in;
2835 struct {
2836 uint32_t num_volumes;
2837 uint32_t num_names;
2838 const char **names;
2839 } out;
2842 #endif /* __LIBCLI_RAW_INTERFACES_H__ */