138c8a9a5SSteve French /* SPDX-License-Identifier: LGPL-2.1 */
238c8a9a5SSteve French /*
338c8a9a5SSteve French *
438c8a9a5SSteve French * Copyright (c) International Business Machines Corp., 2002,2009
538c8a9a5SSteve French * Author(s): Steve French (sfrench@us.ibm.com)
638c8a9a5SSteve French *
738c8a9a5SSteve French */
838c8a9a5SSteve French
938c8a9a5SSteve French #ifndef _CIFSPDU_H
1038c8a9a5SSteve French #define _CIFSPDU_H
1138c8a9a5SSteve French
1238c8a9a5SSteve French #include <net/sock.h>
1338c8a9a5SSteve French #include <asm/unaligned.h>
1438c8a9a5SSteve French #include "../common/smbfsctl.h"
1538c8a9a5SSteve French
1638c8a9a5SSteve French #define CIFS_PROT 0
1738c8a9a5SSteve French #define POSIX_PROT (CIFS_PROT+1)
1838c8a9a5SSteve French #define BAD_PROT 0xFFFF
1938c8a9a5SSteve French
2038c8a9a5SSteve French /* SMB command codes:
2138c8a9a5SSteve French * Note some commands have minimal (wct=0,bcc=0), or uninteresting, responses
2238c8a9a5SSteve French * (ie which include no useful data other than the SMB error code itself).
2338c8a9a5SSteve French * This can allow us to avoid response buffer allocations and copy in some cases
2438c8a9a5SSteve French */
2538c8a9a5SSteve French #define SMB_COM_CREATE_DIRECTORY 0x00 /* trivial response */
2638c8a9a5SSteve French #define SMB_COM_DELETE_DIRECTORY 0x01 /* trivial response */
2738c8a9a5SSteve French #define SMB_COM_CLOSE 0x04 /* triv req/rsp, timestamp ignored */
2838c8a9a5SSteve French #define SMB_COM_FLUSH 0x05 /* triv req/rsp */
2938c8a9a5SSteve French #define SMB_COM_DELETE 0x06 /* trivial response */
3038c8a9a5SSteve French #define SMB_COM_RENAME 0x07 /* trivial response */
3138c8a9a5SSteve French #define SMB_COM_QUERY_INFORMATION 0x08 /* aka getattr */
3238c8a9a5SSteve French #define SMB_COM_SETATTR 0x09 /* trivial response */
3338c8a9a5SSteve French #define SMB_COM_LOCKING_ANDX 0x24 /* trivial response */
3438c8a9a5SSteve French #define SMB_COM_COPY 0x29 /* trivial rsp, fail filename ignrd*/
3538c8a9a5SSteve French #define SMB_COM_ECHO 0x2B /* echo request */
3638c8a9a5SSteve French #define SMB_COM_OPEN_ANDX 0x2D /* Legacy open for old servers */
3738c8a9a5SSteve French #define SMB_COM_READ_ANDX 0x2E
3838c8a9a5SSteve French #define SMB_COM_WRITE_ANDX 0x2F
3938c8a9a5SSteve French #define SMB_COM_TRANSACTION2 0x32
4038c8a9a5SSteve French #define SMB_COM_TRANSACTION2_SECONDARY 0x33
4138c8a9a5SSteve French #define SMB_COM_FIND_CLOSE2 0x34 /* trivial response */
4238c8a9a5SSteve French #define SMB_COM_TREE_DISCONNECT 0x71 /* trivial response */
4338c8a9a5SSteve French #define SMB_COM_NEGOTIATE 0x72
4438c8a9a5SSteve French #define SMB_COM_SESSION_SETUP_ANDX 0x73
4538c8a9a5SSteve French #define SMB_COM_LOGOFF_ANDX 0x74 /* trivial response */
4638c8a9a5SSteve French #define SMB_COM_TREE_CONNECT_ANDX 0x75
4738c8a9a5SSteve French #define SMB_COM_NT_TRANSACT 0xA0
4838c8a9a5SSteve French #define SMB_COM_NT_TRANSACT_SECONDARY 0xA1
4938c8a9a5SSteve French #define SMB_COM_NT_CREATE_ANDX 0xA2
5038c8a9a5SSteve French #define SMB_COM_NT_CANCEL 0xA4 /* no response */
5138c8a9a5SSteve French #define SMB_COM_NT_RENAME 0xA5 /* trivial response */
5238c8a9a5SSteve French
5338c8a9a5SSteve French /* Transact2 subcommand codes */
5438c8a9a5SSteve French #define TRANS2_OPEN 0x00
5538c8a9a5SSteve French #define TRANS2_FIND_FIRST 0x01
5638c8a9a5SSteve French #define TRANS2_FIND_NEXT 0x02
5738c8a9a5SSteve French #define TRANS2_QUERY_FS_INFORMATION 0x03
5838c8a9a5SSteve French #define TRANS2_SET_FS_INFORMATION 0x04
5938c8a9a5SSteve French #define TRANS2_QUERY_PATH_INFORMATION 0x05
6038c8a9a5SSteve French #define TRANS2_SET_PATH_INFORMATION 0x06
6138c8a9a5SSteve French #define TRANS2_QUERY_FILE_INFORMATION 0x07
6238c8a9a5SSteve French #define TRANS2_SET_FILE_INFORMATION 0x08
6338c8a9a5SSteve French #define TRANS2_GET_DFS_REFERRAL 0x10
6438c8a9a5SSteve French #define TRANS2_REPORT_DFS_INCOSISTENCY 0x11
6538c8a9a5SSteve French
6638c8a9a5SSteve French /* SMB Transact (Named Pipe) subcommand codes */
6738c8a9a5SSteve French #define TRANS_SET_NMPIPE_STATE 0x0001
6838c8a9a5SSteve French #define TRANS_RAW_READ_NMPIPE 0x0011
6938c8a9a5SSteve French #define TRANS_QUERY_NMPIPE_STATE 0x0021
7038c8a9a5SSteve French #define TRANS_QUERY_NMPIPE_INFO 0x0022
7138c8a9a5SSteve French #define TRANS_PEEK_NMPIPE 0x0023
7238c8a9a5SSteve French #define TRANS_TRANSACT_NMPIPE 0x0026
7338c8a9a5SSteve French #define TRANS_RAW_WRITE_NMPIPE 0x0031
7438c8a9a5SSteve French #define TRANS_READ_NMPIPE 0x0036
7538c8a9a5SSteve French #define TRANS_WRITE_NMPIPE 0x0037
7638c8a9a5SSteve French #define TRANS_WAIT_NMPIPE 0x0053
7738c8a9a5SSteve French #define TRANS_CALL_NMPIPE 0x0054
7838c8a9a5SSteve French
7938c8a9a5SSteve French /* NT Transact subcommand codes */
8038c8a9a5SSteve French #define NT_TRANSACT_CREATE 0x01
8138c8a9a5SSteve French #define NT_TRANSACT_IOCTL 0x02
8238c8a9a5SSteve French #define NT_TRANSACT_SET_SECURITY_DESC 0x03
8338c8a9a5SSteve French #define NT_TRANSACT_NOTIFY_CHANGE 0x04
8438c8a9a5SSteve French #define NT_TRANSACT_RENAME 0x05
8538c8a9a5SSteve French #define NT_TRANSACT_QUERY_SECURITY_DESC 0x06
8638c8a9a5SSteve French #define NT_TRANSACT_GET_USER_QUOTA 0x07
8738c8a9a5SSteve French #define NT_TRANSACT_SET_USER_QUOTA 0x08
8838c8a9a5SSteve French
8938c8a9a5SSteve French #define MAX_CIFS_SMALL_BUFFER_SIZE 448 /* big enough for most */
9038c8a9a5SSteve French /* future chained NTCreateXReadX bigger, but for time being NTCreateX biggest */
9138c8a9a5SSteve French /* among the requests (NTCreateX response is bigger with wct of 34) */
9238c8a9a5SSteve French #define MAX_CIFS_HDR_SIZE 0x58 /* 4 len + 32 hdr + (2*24 wct) + 2 bct + 2 pad */
9338c8a9a5SSteve French #define CIFS_SMALL_PATH 120 /* allows for (448-88)/3 */
9438c8a9a5SSteve French
9538c8a9a5SSteve French /* internal cifs vfs structures */
9638c8a9a5SSteve French /*****************************************************************
9738c8a9a5SSteve French * All constants go here
9838c8a9a5SSteve French *****************************************************************
9938c8a9a5SSteve French */
10038c8a9a5SSteve French
10138c8a9a5SSteve French /*
10238c8a9a5SSteve French * Starting value for maximum SMB size negotiation
10338c8a9a5SSteve French */
10438c8a9a5SSteve French #define CIFS_MAX_MSGSIZE (4*4096)
10538c8a9a5SSteve French
10638c8a9a5SSteve French /*
10738c8a9a5SSteve French * Size of encrypted user password in bytes
10838c8a9a5SSteve French */
10938c8a9a5SSteve French #define CIFS_ENCPWD_SIZE (16)
11038c8a9a5SSteve French
11138c8a9a5SSteve French /*
11238c8a9a5SSteve French * Size of the crypto key returned on the negotiate SMB in bytes
11338c8a9a5SSteve French */
11438c8a9a5SSteve French #define CIFS_CRYPTO_KEY_SIZE (8)
11538c8a9a5SSteve French
11638c8a9a5SSteve French /*
11738c8a9a5SSteve French * Size of the ntlm client response
11838c8a9a5SSteve French */
11938c8a9a5SSteve French #define CIFS_AUTH_RESP_SIZE (24)
12038c8a9a5SSteve French
12138c8a9a5SSteve French /*
12238c8a9a5SSteve French * Size of the session key (crypto key encrypted with the password
12338c8a9a5SSteve French */
12438c8a9a5SSteve French #define CIFS_SESS_KEY_SIZE (16)
12538c8a9a5SSteve French
12638c8a9a5SSteve French #define CIFS_SERVER_CHALLENGE_SIZE (8)
12738c8a9a5SSteve French #define CIFS_HMAC_MD5_HASH_SIZE (16)
12838c8a9a5SSteve French #define CIFS_CPHTXT_SIZE (16)
12938c8a9a5SSteve French #define CIFS_NTHASH_SIZE (16)
13038c8a9a5SSteve French
13138c8a9a5SSteve French /*
13238c8a9a5SSteve French * Maximum user name length
13338c8a9a5SSteve French */
13438c8a9a5SSteve French #define CIFS_UNLEN (20)
13538c8a9a5SSteve French
13638c8a9a5SSteve French /*
13738c8a9a5SSteve French * Flags on SMB open
13838c8a9a5SSteve French */
13938c8a9a5SSteve French #define SMBOPEN_WRITE_THROUGH 0x4000
14038c8a9a5SSteve French #define SMBOPEN_DENY_ALL 0x0010
14138c8a9a5SSteve French #define SMBOPEN_DENY_WRITE 0x0020
14238c8a9a5SSteve French #define SMBOPEN_DENY_READ 0x0030
14338c8a9a5SSteve French #define SMBOPEN_DENY_NONE 0x0040
14438c8a9a5SSteve French #define SMBOPEN_READ 0x0000
14538c8a9a5SSteve French #define SMBOPEN_WRITE 0x0001
14638c8a9a5SSteve French #define SMBOPEN_READWRITE 0x0002
14738c8a9a5SSteve French #define SMBOPEN_EXECUTE 0x0003
14838c8a9a5SSteve French
14938c8a9a5SSteve French #define SMBOPEN_OCREATE 0x0010
15038c8a9a5SSteve French #define SMBOPEN_OTRUNC 0x0002
15138c8a9a5SSteve French #define SMBOPEN_OAPPEND 0x0001
15238c8a9a5SSteve French
15338c8a9a5SSteve French /*
15438c8a9a5SSteve French * SMB flag definitions
15538c8a9a5SSteve French */
15638c8a9a5SSteve French #define SMBFLG_EXTD_LOCK 0x01 /* server supports lock-read write-unlock smb */
15738c8a9a5SSteve French #define SMBFLG_RCV_POSTED 0x02 /* obsolete */
15838c8a9a5SSteve French #define SMBFLG_RSVD 0x04
15938c8a9a5SSteve French #define SMBFLG_CASELESS 0x08 /* all pathnames treated as caseless (off
16038c8a9a5SSteve French implies case sensitive file handling request) */
16138c8a9a5SSteve French #define SMBFLG_CANONICAL_PATH_FORMAT 0x10 /* obsolete */
16238c8a9a5SSteve French #define SMBFLG_OLD_OPLOCK 0x20 /* obsolete */
16338c8a9a5SSteve French #define SMBFLG_OLD_OPLOCK_NOTIFY 0x40 /* obsolete */
16438c8a9a5SSteve French #define SMBFLG_RESPONSE 0x80 /* this PDU is a response from server */
16538c8a9a5SSteve French
16638c8a9a5SSteve French /*
16738c8a9a5SSteve French * SMB flag2 definitions
16838c8a9a5SSteve French */
16938c8a9a5SSteve French #define SMBFLG2_KNOWS_LONG_NAMES cpu_to_le16(1) /* can send long (non-8.3)
17038c8a9a5SSteve French path names in response */
17138c8a9a5SSteve French #define SMBFLG2_KNOWS_EAS cpu_to_le16(2)
17238c8a9a5SSteve French #define SMBFLG2_SECURITY_SIGNATURE cpu_to_le16(4)
17338c8a9a5SSteve French #define SMBFLG2_COMPRESSED (8)
17438c8a9a5SSteve French #define SMBFLG2_SECURITY_SIGNATURE_REQUIRED (0x10)
17538c8a9a5SSteve French #define SMBFLG2_IS_LONG_NAME cpu_to_le16(0x40)
17638c8a9a5SSteve French #define SMBFLG2_REPARSE_PATH (0x400)
17738c8a9a5SSteve French #define SMBFLG2_EXT_SEC cpu_to_le16(0x800)
17838c8a9a5SSteve French #define SMBFLG2_DFS cpu_to_le16(0x1000)
17938c8a9a5SSteve French #define SMBFLG2_PAGING_IO cpu_to_le16(0x2000)
18038c8a9a5SSteve French #define SMBFLG2_ERR_STATUS cpu_to_le16(0x4000)
18138c8a9a5SSteve French #define SMBFLG2_UNICODE cpu_to_le16(0x8000)
18238c8a9a5SSteve French
18338c8a9a5SSteve French /*
18438c8a9a5SSteve French * These are the file access permission bits defined in CIFS for the
18538c8a9a5SSteve French * NTCreateAndX as well as the level 0x107
18638c8a9a5SSteve French * TRANS2_QUERY_PATH_INFORMATION API. The level 0x107, SMB_QUERY_FILE_ALL_INFO
18738c8a9a5SSteve French * responds with the AccessFlags.
18838c8a9a5SSteve French * The AccessFlags specifies the access permissions a caller has to the
18938c8a9a5SSteve French * file and can have any suitable combination of the following values:
19038c8a9a5SSteve French */
19138c8a9a5SSteve French
19238c8a9a5SSteve French #define FILE_READ_DATA 0x00000001 /* Data can be read from the file */
19338c8a9a5SSteve French #define FILE_WRITE_DATA 0x00000002 /* Data can be written to the file */
19438c8a9a5SSteve French #define FILE_APPEND_DATA 0x00000004 /* Data can be appended to the file */
19538c8a9a5SSteve French #define FILE_READ_EA 0x00000008 /* Extended attributes associated */
19638c8a9a5SSteve French /* with the file can be read */
19738c8a9a5SSteve French #define FILE_WRITE_EA 0x00000010 /* Extended attributes associated */
19838c8a9a5SSteve French /* with the file can be written */
19938c8a9a5SSteve French #define FILE_EXECUTE 0x00000020 /*Data can be read into memory from */
20038c8a9a5SSteve French /* the file using system paging I/O */
20138c8a9a5SSteve French #define FILE_DELETE_CHILD 0x00000040
20238c8a9a5SSteve French #define FILE_READ_ATTRIBUTES 0x00000080 /* Attributes associated with the */
20338c8a9a5SSteve French /* file can be read */
20438c8a9a5SSteve French #define FILE_WRITE_ATTRIBUTES 0x00000100 /* Attributes associated with the */
20538c8a9a5SSteve French /* file can be written */
20638c8a9a5SSteve French #define DELETE 0x00010000 /* The file can be deleted */
20738c8a9a5SSteve French #define READ_CONTROL 0x00020000 /* The access control list and */
20838c8a9a5SSteve French /* ownership associated with the */
20938c8a9a5SSteve French /* file can be read */
21038c8a9a5SSteve French #define WRITE_DAC 0x00040000 /* The access control list and */
21138c8a9a5SSteve French /* ownership associated with the */
21238c8a9a5SSteve French /* file can be written. */
21338c8a9a5SSteve French #define WRITE_OWNER 0x00080000 /* Ownership information associated */
21438c8a9a5SSteve French /* with the file can be written */
21538c8a9a5SSteve French #define SYNCHRONIZE 0x00100000 /* The file handle can waited on to */
21638c8a9a5SSteve French /* synchronize with the completion */
21738c8a9a5SSteve French /* of an input/output request */
21838c8a9a5SSteve French #define SYSTEM_SECURITY 0x01000000 /* The system access control list */
21938c8a9a5SSteve French /* can be read and changed */
22038c8a9a5SSteve French #define GENERIC_ALL 0x10000000
22138c8a9a5SSteve French #define GENERIC_EXECUTE 0x20000000
22238c8a9a5SSteve French #define GENERIC_WRITE 0x40000000
22338c8a9a5SSteve French #define GENERIC_READ 0x80000000
22438c8a9a5SSteve French /* In summary - Relevant file */
22538c8a9a5SSteve French /* access flags from CIFS are */
22638c8a9a5SSteve French /* file_read_data, file_write_data */
22738c8a9a5SSteve French /* file_execute, file_read_attributes*/
22838c8a9a5SSteve French /* write_dac, and delete. */
22938c8a9a5SSteve French
23038c8a9a5SSteve French #define FILE_READ_RIGHTS (FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES)
23138c8a9a5SSteve French #define FILE_WRITE_RIGHTS (FILE_WRITE_DATA | FILE_APPEND_DATA \
23238c8a9a5SSteve French | FILE_WRITE_EA | FILE_WRITE_ATTRIBUTES)
23338c8a9a5SSteve French #define FILE_EXEC_RIGHTS (FILE_EXECUTE)
23438c8a9a5SSteve French
23538c8a9a5SSteve French #define SET_FILE_READ_RIGHTS (FILE_READ_DATA | FILE_READ_EA | FILE_WRITE_EA \
23638c8a9a5SSteve French | FILE_READ_ATTRIBUTES \
23738c8a9a5SSteve French | FILE_WRITE_ATTRIBUTES \
23838c8a9a5SSteve French | DELETE | READ_CONTROL | WRITE_DAC \
23938c8a9a5SSteve French | WRITE_OWNER | SYNCHRONIZE)
24038c8a9a5SSteve French #define SET_FILE_WRITE_RIGHTS (FILE_WRITE_DATA | FILE_APPEND_DATA \
24138c8a9a5SSteve French | FILE_READ_EA | FILE_WRITE_EA \
24238c8a9a5SSteve French | FILE_READ_ATTRIBUTES \
24338c8a9a5SSteve French | FILE_WRITE_ATTRIBUTES \
24438c8a9a5SSteve French | DELETE | READ_CONTROL | WRITE_DAC \
24538c8a9a5SSteve French | WRITE_OWNER | SYNCHRONIZE)
24638c8a9a5SSteve French #define SET_FILE_EXEC_RIGHTS (FILE_READ_EA | FILE_WRITE_EA | FILE_EXECUTE \
24738c8a9a5SSteve French | FILE_READ_ATTRIBUTES \
24838c8a9a5SSteve French | FILE_WRITE_ATTRIBUTES \
24938c8a9a5SSteve French | DELETE | READ_CONTROL | WRITE_DAC \
25038c8a9a5SSteve French | WRITE_OWNER | SYNCHRONIZE)
25138c8a9a5SSteve French
25238c8a9a5SSteve French #define SET_MINIMUM_RIGHTS (FILE_READ_EA | FILE_READ_ATTRIBUTES \
25338c8a9a5SSteve French | READ_CONTROL | SYNCHRONIZE)
25438c8a9a5SSteve French
25538c8a9a5SSteve French
25638c8a9a5SSteve French /*
25738c8a9a5SSteve French * Invalid readdir handle
25838c8a9a5SSteve French */
25938c8a9a5SSteve French #define CIFS_NO_HANDLE 0xFFFF
26038c8a9a5SSteve French
26138c8a9a5SSteve French #define NO_CHANGE_64 0xFFFFFFFFFFFFFFFFULL
26238c8a9a5SSteve French
26338c8a9a5SSteve French /* IPC$ in ASCII */
26438c8a9a5SSteve French #define CIFS_IPC_RESOURCE "\x49\x50\x43\x24"
26538c8a9a5SSteve French
26638c8a9a5SSteve French /* IPC$ in Unicode */
26738c8a9a5SSteve French #define CIFS_IPC_UNICODE_RESOURCE "\x00\x49\x00\x50\x00\x43\x00\x24\x00\x00"
26838c8a9a5SSteve French
26938c8a9a5SSteve French /* Unicode Null terminate 2 bytes of 0 */
27038c8a9a5SSteve French #define UNICODE_NULL "\x00\x00"
27138c8a9a5SSteve French #define ASCII_NULL 0x00
27238c8a9a5SSteve French
27338c8a9a5SSteve French /*
27438c8a9a5SSteve French * Server type values (returned on EnumServer API
27538c8a9a5SSteve French */
27638c8a9a5SSteve French #define CIFS_SV_TYPE_DC 0x00000008
27738c8a9a5SSteve French #define CIFS_SV_TYPE_BACKDC 0x00000010
27838c8a9a5SSteve French
27938c8a9a5SSteve French /*
28038c8a9a5SSteve French * Alias type flags (From EnumAlias API call
28138c8a9a5SSteve French */
28238c8a9a5SSteve French #define CIFS_ALIAS_TYPE_FILE 0x0001
28338c8a9a5SSteve French #define CIFS_SHARE_TYPE_FILE 0x0000
28438c8a9a5SSteve French
28538c8a9a5SSteve French /*
28638c8a9a5SSteve French * File Attribute flags
28738c8a9a5SSteve French */
28838c8a9a5SSteve French #define ATTR_READONLY 0x0001
28938c8a9a5SSteve French #define ATTR_HIDDEN 0x0002
29038c8a9a5SSteve French #define ATTR_SYSTEM 0x0004
29138c8a9a5SSteve French #define ATTR_VOLUME 0x0008
29238c8a9a5SSteve French #define ATTR_DIRECTORY 0x0010
29338c8a9a5SSteve French #define ATTR_ARCHIVE 0x0020
29438c8a9a5SSteve French #define ATTR_DEVICE 0x0040
29538c8a9a5SSteve French #define ATTR_NORMAL 0x0080
29638c8a9a5SSteve French #define ATTR_TEMPORARY 0x0100
29738c8a9a5SSteve French #define ATTR_SPARSE 0x0200
29838c8a9a5SSteve French #define ATTR_REPARSE 0x0400
29938c8a9a5SSteve French #define ATTR_COMPRESSED 0x0800
30038c8a9a5SSteve French #define ATTR_OFFLINE 0x1000 /* ie file not immediately available -
30138c8a9a5SSteve French on offline storage */
30238c8a9a5SSteve French #define ATTR_NOT_CONTENT_INDEXED 0x2000
30338c8a9a5SSteve French #define ATTR_ENCRYPTED 0x4000
30438c8a9a5SSteve French #define ATTR_POSIX_SEMANTICS 0x01000000
30538c8a9a5SSteve French #define ATTR_BACKUP_SEMANTICS 0x02000000
30638c8a9a5SSteve French #define ATTR_DELETE_ON_CLOSE 0x04000000
30738c8a9a5SSteve French #define ATTR_SEQUENTIAL_SCAN 0x08000000
30838c8a9a5SSteve French #define ATTR_RANDOM_ACCESS 0x10000000
30938c8a9a5SSteve French #define ATTR_NO_BUFFERING 0x20000000
31038c8a9a5SSteve French #define ATTR_WRITE_THROUGH 0x80000000
31138c8a9a5SSteve French
31238c8a9a5SSteve French /* ShareAccess flags */
31338c8a9a5SSteve French #define FILE_NO_SHARE 0x00000000
31438c8a9a5SSteve French #define FILE_SHARE_READ 0x00000001
31538c8a9a5SSteve French #define FILE_SHARE_WRITE 0x00000002
31638c8a9a5SSteve French #define FILE_SHARE_DELETE 0x00000004
31738c8a9a5SSteve French #define FILE_SHARE_ALL 0x00000007
31838c8a9a5SSteve French
31938c8a9a5SSteve French /* CreateDisposition flags, similar to CreateAction as well */
32038c8a9a5SSteve French #define FILE_SUPERSEDE 0x00000000
32138c8a9a5SSteve French #define FILE_OPEN 0x00000001
32238c8a9a5SSteve French #define FILE_CREATE 0x00000002
32338c8a9a5SSteve French #define FILE_OPEN_IF 0x00000003
32438c8a9a5SSteve French #define FILE_OVERWRITE 0x00000004
32538c8a9a5SSteve French #define FILE_OVERWRITE_IF 0x00000005
32638c8a9a5SSteve French
32738c8a9a5SSteve French /* CreateOptions */
32838c8a9a5SSteve French #define CREATE_NOT_FILE 0x00000001 /* if set must not be file */
32938c8a9a5SSteve French #define CREATE_WRITE_THROUGH 0x00000002
33038c8a9a5SSteve French #define CREATE_SEQUENTIAL 0x00000004
33138c8a9a5SSteve French #define CREATE_NO_BUFFER 0x00000008 /* should not buffer on srv */
33238c8a9a5SSteve French #define CREATE_SYNC_ALERT 0x00000010 /* MBZ */
33338c8a9a5SSteve French #define CREATE_ASYNC_ALERT 0x00000020 /* MBZ */
33438c8a9a5SSteve French #define CREATE_NOT_DIR 0x00000040 /* if set must not be directory */
33538c8a9a5SSteve French #define CREATE_TREE_CONNECTION 0x00000080 /* should be zero */
33638c8a9a5SSteve French #define CREATE_COMPLETE_IF_OPLK 0x00000100 /* should be zero */
33738c8a9a5SSteve French #define CREATE_NO_EA_KNOWLEDGE 0x00000200
33838c8a9a5SSteve French #define CREATE_EIGHT_DOT_THREE 0x00000400 /* doc says this is obsolete
33938c8a9a5SSteve French "open for recovery" flag should
34038c8a9a5SSteve French be zero in any case */
34138c8a9a5SSteve French #define CREATE_OPEN_FOR_RECOVERY 0x00000400
34238c8a9a5SSteve French #define CREATE_RANDOM_ACCESS 0x00000800
34338c8a9a5SSteve French #define CREATE_DELETE_ON_CLOSE 0x00001000
34438c8a9a5SSteve French #define CREATE_OPEN_BY_ID 0x00002000
34538c8a9a5SSteve French #define CREATE_OPEN_BACKUP_INTENT 0x00004000
34638c8a9a5SSteve French #define CREATE_NO_COMPRESSION 0x00008000
34738c8a9a5SSteve French #define CREATE_RESERVE_OPFILTER 0x00100000 /* should be zero */
34838c8a9a5SSteve French #define OPEN_REPARSE_POINT 0x00200000
34938c8a9a5SSteve French #define OPEN_NO_RECALL 0x00400000
35038c8a9a5SSteve French #define OPEN_FREE_SPACE_QUERY 0x00800000 /* should be zero */
35138c8a9a5SSteve French #define CREATE_OPTIONS_MASK 0x007FFFFF
35238c8a9a5SSteve French #define CREATE_OPTION_READONLY 0x10000000
35338c8a9a5SSteve French #define CREATE_OPTION_SPECIAL 0x20000000 /* system. NB not sent over wire */
35438c8a9a5SSteve French
35538c8a9a5SSteve French /* ImpersonationLevel flags */
35638c8a9a5SSteve French #define SECURITY_ANONYMOUS 0
35738c8a9a5SSteve French #define SECURITY_IDENTIFICATION 1
35838c8a9a5SSteve French #define SECURITY_IMPERSONATION 2
35938c8a9a5SSteve French #define SECURITY_DELEGATION 3
36038c8a9a5SSteve French
36138c8a9a5SSteve French /* SecurityFlags */
36238c8a9a5SSteve French #define SECURITY_CONTEXT_TRACKING 0x01
36338c8a9a5SSteve French #define SECURITY_EFFECTIVE_ONLY 0x02
36438c8a9a5SSteve French
36538c8a9a5SSteve French /*
36638c8a9a5SSteve French * Default PID value, used in all SMBs where the PID is not important
36738c8a9a5SSteve French */
36838c8a9a5SSteve French #define CIFS_DFT_PID 0x1234
36938c8a9a5SSteve French
37038c8a9a5SSteve French /*
37138c8a9a5SSteve French * We use the same routine for Copy and Move SMBs. This flag is used to
37238c8a9a5SSteve French * distinguish
37338c8a9a5SSteve French */
37438c8a9a5SSteve French #define CIFS_COPY_OP 1
37538c8a9a5SSteve French #define CIFS_RENAME_OP 2
37638c8a9a5SSteve French
37738c8a9a5SSteve French #define GETU16(var) (*((__u16 *)var)) /* BB check for endian issues */
37838c8a9a5SSteve French #define GETU32(var) (*((__u32 *)var)) /* BB check for endian issues */
37938c8a9a5SSteve French
38038c8a9a5SSteve French struct smb_hdr {
38138c8a9a5SSteve French __be32 smb_buf_length; /* BB length is only two (rarely three) bytes,
38238c8a9a5SSteve French with one or two byte "type" preceding it that will be
38338c8a9a5SSteve French zero - we could mask the type byte off */
38438c8a9a5SSteve French __u8 Protocol[4];
38538c8a9a5SSteve French __u8 Command;
38638c8a9a5SSteve French union {
38738c8a9a5SSteve French struct {
38838c8a9a5SSteve French __u8 ErrorClass;
38938c8a9a5SSteve French __u8 Reserved;
39038c8a9a5SSteve French __le16 Error;
39138c8a9a5SSteve French } __attribute__((packed)) DosError;
39238c8a9a5SSteve French __le32 CifsError;
39338c8a9a5SSteve French } __attribute__((packed)) Status;
39438c8a9a5SSteve French __u8 Flags;
39538c8a9a5SSteve French __le16 Flags2; /* note: le */
39638c8a9a5SSteve French __le16 PidHigh;
39738c8a9a5SSteve French union {
39838c8a9a5SSteve French struct {
39938c8a9a5SSteve French __le32 SequenceNumber; /* le */
40038c8a9a5SSteve French __u32 Reserved; /* zero */
40138c8a9a5SSteve French } __attribute__((packed)) Sequence;
40238c8a9a5SSteve French __u8 SecuritySignature[8]; /* le */
40338c8a9a5SSteve French } __attribute__((packed)) Signature;
40438c8a9a5SSteve French __u8 pad[2];
40538c8a9a5SSteve French __u16 Tid;
40638c8a9a5SSteve French __le16 Pid;
40738c8a9a5SSteve French __u16 Uid;
40838c8a9a5SSteve French __le16 Mid;
40938c8a9a5SSteve French __u8 WordCount;
41038c8a9a5SSteve French } __attribute__((packed));
41138c8a9a5SSteve French
41238c8a9a5SSteve French /* given a pointer to an smb_hdr, retrieve a void pointer to the ByteCount */
41338c8a9a5SSteve French static inline void *
BCC(struct smb_hdr * smb)41438c8a9a5SSteve French BCC(struct smb_hdr *smb)
41538c8a9a5SSteve French {
41638c8a9a5SSteve French return (void *)smb + sizeof(*smb) + 2 * smb->WordCount;
41738c8a9a5SSteve French }
41838c8a9a5SSteve French
41938c8a9a5SSteve French /* given a pointer to an smb_hdr retrieve the pointer to the byte area */
42038c8a9a5SSteve French #define pByteArea(smb_var) (BCC(smb_var) + 2)
42138c8a9a5SSteve French
42238c8a9a5SSteve French /* get the unconverted ByteCount for a SMB packet and return it */
42338c8a9a5SSteve French static inline __u16
get_bcc(struct smb_hdr * hdr)42438c8a9a5SSteve French get_bcc(struct smb_hdr *hdr)
42538c8a9a5SSteve French {
42638c8a9a5SSteve French __le16 *bc_ptr = (__le16 *)BCC(hdr);
42738c8a9a5SSteve French
42838c8a9a5SSteve French return get_unaligned_le16(bc_ptr);
42938c8a9a5SSteve French }
43038c8a9a5SSteve French
43138c8a9a5SSteve French /* set the ByteCount for a SMB packet in little-endian */
43238c8a9a5SSteve French static inline void
put_bcc(__u16 count,struct smb_hdr * hdr)43338c8a9a5SSteve French put_bcc(__u16 count, struct smb_hdr *hdr)
43438c8a9a5SSteve French {
43538c8a9a5SSteve French __le16 *bc_ptr = (__le16 *)BCC(hdr);
43638c8a9a5SSteve French
43738c8a9a5SSteve French put_unaligned_le16(count, bc_ptr);
43838c8a9a5SSteve French }
43938c8a9a5SSteve French
44038c8a9a5SSteve French /*
44138c8a9a5SSteve French * Computer Name Length (since Netbios name was length 16 with last byte 0x20)
44238c8a9a5SSteve French * No longer as important, now that TCP names are more commonly used to
44338c8a9a5SSteve French * resolve hosts.
44438c8a9a5SSteve French */
44538c8a9a5SSteve French #define CNLEN 15
44638c8a9a5SSteve French
44738c8a9a5SSteve French /*
44838c8a9a5SSteve French * Share Name Length (SNLEN)
44938c8a9a5SSteve French * Note: This length was limited by the SMB used to get
45038c8a9a5SSteve French * the Share info. NetShareEnum only returned 13
45138c8a9a5SSteve French * chars, including the null termination.
45238c8a9a5SSteve French * This was removed because it no longer is limiting.
45338c8a9a5SSteve French */
45438c8a9a5SSteve French
45538c8a9a5SSteve French /*
45638c8a9a5SSteve French * Comment Length
45738c8a9a5SSteve French */
45838c8a9a5SSteve French #define MAXCOMMENTLEN 40
45938c8a9a5SSteve French
46038c8a9a5SSteve French /*
46138c8a9a5SSteve French * The OS/2 maximum path name
46238c8a9a5SSteve French */
46338c8a9a5SSteve French #define MAX_PATHCONF 256
46438c8a9a5SSteve French
46538c8a9a5SSteve French /*
46638c8a9a5SSteve French * SMB frame definitions (following must be packed structs)
46738c8a9a5SSteve French * See the SNIA CIFS Specification for details.
46838c8a9a5SSteve French *
46938c8a9a5SSteve French * The Naming convention is the lower case version of the
47038c8a9a5SSteve French * smb command code name for the struct and this is typedef to the
47138c8a9a5SSteve French * uppercase version of the same name with the prefix SMB_ removed
47238c8a9a5SSteve French * for brevity. Although typedefs are not commonly used for
47338c8a9a5SSteve French * structure definitions in the Linux kernel, their use in the
47438c8a9a5SSteve French * CIFS standards document, which this code is based on, may
47538c8a9a5SSteve French * make this one of the cases where typedefs for structures make
47638c8a9a5SSteve French * sense to improve readability for readers of the standards doc.
47738c8a9a5SSteve French * Typedefs can always be removed later if they are too distracting
47838c8a9a5SSteve French * and they are only used for the CIFSs PDUs themselves, not
47938c8a9a5SSteve French * internal cifs vfs structures
48038c8a9a5SSteve French *
48138c8a9a5SSteve French */
48238c8a9a5SSteve French
48338c8a9a5SSteve French typedef struct negotiate_req {
48438c8a9a5SSteve French struct smb_hdr hdr; /* wct = 0 */
48538c8a9a5SSteve French __le16 ByteCount;
48638c8a9a5SSteve French unsigned char DialectsArray[];
48738c8a9a5SSteve French } __attribute__((packed)) NEGOTIATE_REQ;
48838c8a9a5SSteve French
48938c8a9a5SSteve French #define MIN_TZ_ADJ (15 * 60) /* minimum grid for timezones in seconds */
49038c8a9a5SSteve French
49138c8a9a5SSteve French #define READ_RAW_ENABLE 1
49238c8a9a5SSteve French #define WRITE_RAW_ENABLE 2
49338c8a9a5SSteve French #define RAW_ENABLE (READ_RAW_ENABLE | WRITE_RAW_ENABLE)
49438c8a9a5SSteve French #define SMB1_CLIENT_GUID_SIZE (16)
49538c8a9a5SSteve French typedef struct negotiate_rsp {
49638c8a9a5SSteve French struct smb_hdr hdr; /* wct = 17 */
49738c8a9a5SSteve French __le16 DialectIndex; /* 0xFFFF = no dialect acceptable */
49838c8a9a5SSteve French __u8 SecurityMode;
49938c8a9a5SSteve French __le16 MaxMpxCount;
50038c8a9a5SSteve French __le16 MaxNumberVcs;
50138c8a9a5SSteve French __le32 MaxBufferSize;
50238c8a9a5SSteve French __le32 MaxRawSize;
50338c8a9a5SSteve French __le32 SessionKey;
50438c8a9a5SSteve French __le32 Capabilities; /* see below */
50538c8a9a5SSteve French __le32 SystemTimeLow;
50638c8a9a5SSteve French __le32 SystemTimeHigh;
50738c8a9a5SSteve French __le16 ServerTimeZone;
50838c8a9a5SSteve French __u8 EncryptionKeyLength;
50938c8a9a5SSteve French __u16 ByteCount;
51038c8a9a5SSteve French union {
51138c8a9a5SSteve French /* cap extended security off */
51238c8a9a5SSteve French DECLARE_FLEX_ARRAY(unsigned char, EncryptionKey);
51338c8a9a5SSteve French /* followed by Domain name - if extended security is off */
51438c8a9a5SSteve French /* followed by 16 bytes of server GUID */
51538c8a9a5SSteve French /* then security blob if cap_extended_security negotiated */
51638c8a9a5SSteve French struct {
51738c8a9a5SSteve French unsigned char GUID[SMB1_CLIENT_GUID_SIZE];
51838c8a9a5SSteve French unsigned char SecurityBlob[];
51938c8a9a5SSteve French } __attribute__((packed)) extended_response;
52038c8a9a5SSteve French } __attribute__((packed)) u;
52138c8a9a5SSteve French } __attribute__((packed)) NEGOTIATE_RSP;
52238c8a9a5SSteve French
52338c8a9a5SSteve French /* SecurityMode bits */
52438c8a9a5SSteve French #define SECMODE_USER 0x01 /* off indicates share level security */
52538c8a9a5SSteve French #define SECMODE_PW_ENCRYPT 0x02
52638c8a9a5SSteve French #define SECMODE_SIGN_ENABLED 0x04 /* SMB security signatures enabled */
52738c8a9a5SSteve French #define SECMODE_SIGN_REQUIRED 0x08 /* SMB security signatures required */
52838c8a9a5SSteve French
52938c8a9a5SSteve French /* Negotiate response Capabilities */
53038c8a9a5SSteve French #define CAP_RAW_MODE 0x00000001
53138c8a9a5SSteve French #define CAP_MPX_MODE 0x00000002
53238c8a9a5SSteve French #define CAP_UNICODE 0x00000004
53338c8a9a5SSteve French #define CAP_LARGE_FILES 0x00000008
53438c8a9a5SSteve French #define CAP_NT_SMBS 0x00000010 /* implies CAP_NT_FIND */
53538c8a9a5SSteve French #define CAP_RPC_REMOTE_APIS 0x00000020
53638c8a9a5SSteve French #define CAP_STATUS32 0x00000040
53738c8a9a5SSteve French #define CAP_LEVEL_II_OPLOCKS 0x00000080
53838c8a9a5SSteve French #define CAP_LOCK_AND_READ 0x00000100
53938c8a9a5SSteve French #define CAP_NT_FIND 0x00000200
54038c8a9a5SSteve French #define CAP_DFS 0x00001000
54138c8a9a5SSteve French #define CAP_INFOLEVEL_PASSTHRU 0x00002000
54238c8a9a5SSteve French #define CAP_LARGE_READ_X 0x00004000
54338c8a9a5SSteve French #define CAP_LARGE_WRITE_X 0x00008000
54438c8a9a5SSteve French #define CAP_LWIO 0x00010000 /* support fctl_srv_req_resume_key */
54538c8a9a5SSteve French #define CAP_UNIX 0x00800000
54638c8a9a5SSteve French #define CAP_COMPRESSED_DATA 0x02000000
54738c8a9a5SSteve French #define CAP_DYNAMIC_REAUTH 0x20000000
54838c8a9a5SSteve French #define CAP_PERSISTENT_HANDLES 0x40000000
54938c8a9a5SSteve French #define CAP_EXTENDED_SECURITY 0x80000000
55038c8a9a5SSteve French
55138c8a9a5SSteve French typedef union smb_com_session_setup_andx {
55238c8a9a5SSteve French struct { /* request format */
55338c8a9a5SSteve French struct smb_hdr hdr; /* wct = 12 */
55438c8a9a5SSteve French __u8 AndXCommand;
55538c8a9a5SSteve French __u8 AndXReserved;
55638c8a9a5SSteve French __le16 AndXOffset;
55738c8a9a5SSteve French __le16 MaxBufferSize;
55838c8a9a5SSteve French __le16 MaxMpxCount;
55938c8a9a5SSteve French __le16 VcNumber;
56038c8a9a5SSteve French __u32 SessionKey;
56138c8a9a5SSteve French __le16 SecurityBlobLength;
56238c8a9a5SSteve French __u32 Reserved;
56338c8a9a5SSteve French __le32 Capabilities; /* see below */
56438c8a9a5SSteve French __le16 ByteCount;
56538c8a9a5SSteve French unsigned char SecurityBlob[]; /* followed by */
56638c8a9a5SSteve French /* STRING NativeOS */
56738c8a9a5SSteve French /* STRING NativeLanMan */
56838c8a9a5SSteve French } __attribute__((packed)) req; /* NTLM request format (with
56938c8a9a5SSteve French extended security */
57038c8a9a5SSteve French
57138c8a9a5SSteve French struct { /* request format */
57238c8a9a5SSteve French struct smb_hdr hdr; /* wct = 13 */
57338c8a9a5SSteve French __u8 AndXCommand;
57438c8a9a5SSteve French __u8 AndXReserved;
57538c8a9a5SSteve French __le16 AndXOffset;
57638c8a9a5SSteve French __le16 MaxBufferSize;
57738c8a9a5SSteve French __le16 MaxMpxCount;
57838c8a9a5SSteve French __le16 VcNumber;
57938c8a9a5SSteve French __u32 SessionKey;
58038c8a9a5SSteve French __le16 CaseInsensitivePasswordLength; /* ASCII password len */
58138c8a9a5SSteve French __le16 CaseSensitivePasswordLength; /* Unicode password length*/
58238c8a9a5SSteve French __u32 Reserved; /* see below */
58338c8a9a5SSteve French __le32 Capabilities;
58438c8a9a5SSteve French __le16 ByteCount;
58538c8a9a5SSteve French unsigned char CaseInsensitivePassword[]; /* followed by: */
58638c8a9a5SSteve French /* unsigned char * CaseSensitivePassword; */
58738c8a9a5SSteve French /* STRING AccountName */
58838c8a9a5SSteve French /* STRING PrimaryDomain */
58938c8a9a5SSteve French /* STRING NativeOS */
59038c8a9a5SSteve French /* STRING NativeLanMan */
59138c8a9a5SSteve French } __attribute__((packed)) req_no_secext; /* NTLM request format (without
59238c8a9a5SSteve French extended security */
59338c8a9a5SSteve French
59438c8a9a5SSteve French struct { /* default (NTLM) response format */
59538c8a9a5SSteve French struct smb_hdr hdr; /* wct = 4 */
59638c8a9a5SSteve French __u8 AndXCommand;
59738c8a9a5SSteve French __u8 AndXReserved;
59838c8a9a5SSteve French __le16 AndXOffset;
59938c8a9a5SSteve French __le16 Action; /* see below */
60038c8a9a5SSteve French __le16 SecurityBlobLength;
60138c8a9a5SSteve French __u16 ByteCount;
60238c8a9a5SSteve French unsigned char SecurityBlob[]; /* followed by */
60338c8a9a5SSteve French /* unsigned char * NativeOS; */
60438c8a9a5SSteve French /* unsigned char * NativeLanMan; */
60538c8a9a5SSteve French /* unsigned char * PrimaryDomain; */
60638c8a9a5SSteve French } __attribute__((packed)) resp; /* NTLM response
60738c8a9a5SSteve French (with or without extended sec) */
60838c8a9a5SSteve French
60938c8a9a5SSteve French struct { /* request format */
61038c8a9a5SSteve French struct smb_hdr hdr; /* wct = 10 */
61138c8a9a5SSteve French __u8 AndXCommand;
61238c8a9a5SSteve French __u8 AndXReserved;
61338c8a9a5SSteve French __le16 AndXOffset;
61438c8a9a5SSteve French __le16 MaxBufferSize;
61538c8a9a5SSteve French __le16 MaxMpxCount;
61638c8a9a5SSteve French __le16 VcNumber;
61738c8a9a5SSteve French __u32 SessionKey;
61838c8a9a5SSteve French __le16 PasswordLength;
61938c8a9a5SSteve French __u32 Reserved; /* encrypt key len and offset */
62038c8a9a5SSteve French __le16 ByteCount;
62138c8a9a5SSteve French unsigned char AccountPassword[]; /* followed by */
62238c8a9a5SSteve French /* STRING AccountName */
62338c8a9a5SSteve French /* STRING PrimaryDomain */
62438c8a9a5SSteve French /* STRING NativeOS */
62538c8a9a5SSteve French /* STRING NativeLanMan */
62638c8a9a5SSteve French } __attribute__((packed)) old_req; /* pre-NTLM (LANMAN2.1) req format */
62738c8a9a5SSteve French
62838c8a9a5SSteve French struct { /* default (NTLM) response format */
62938c8a9a5SSteve French struct smb_hdr hdr; /* wct = 3 */
63038c8a9a5SSteve French __u8 AndXCommand;
63138c8a9a5SSteve French __u8 AndXReserved;
63238c8a9a5SSteve French __le16 AndXOffset;
63338c8a9a5SSteve French __le16 Action; /* see below */
63438c8a9a5SSteve French __u16 ByteCount;
63538c8a9a5SSteve French unsigned char NativeOS[]; /* followed by */
63638c8a9a5SSteve French /* unsigned char * NativeLanMan; */
63738c8a9a5SSteve French /* unsigned char * PrimaryDomain; */
63838c8a9a5SSteve French } __attribute__((packed)) old_resp; /* pre-NTLM (LANMAN2.1) response */
63938c8a9a5SSteve French } __attribute__((packed)) SESSION_SETUP_ANDX;
64038c8a9a5SSteve French
64138c8a9a5SSteve French /* format of NLTMv2 Response ie "case sensitive password" hash when NTLMv2 */
64238c8a9a5SSteve French
64338c8a9a5SSteve French #define NTLMSSP_SERVER_TYPE 1
64438c8a9a5SSteve French #define NTLMSSP_DOMAIN_TYPE 2
64538c8a9a5SSteve French #define NTLMSSP_FQ_DOMAIN_TYPE 3
64638c8a9a5SSteve French #define NTLMSSP_DNS_DOMAIN_TYPE 4
64738c8a9a5SSteve French #define NTLMSSP_DNS_PARENT_TYPE 5
64838c8a9a5SSteve French
64938c8a9a5SSteve French struct ntlmssp2_name {
65038c8a9a5SSteve French __le16 type;
65138c8a9a5SSteve French __le16 length;
65238c8a9a5SSteve French /* char name[length]; */
65338c8a9a5SSteve French } __attribute__((packed));
65438c8a9a5SSteve French
65538c8a9a5SSteve French struct ntlmv2_resp {
65638c8a9a5SSteve French union {
65738c8a9a5SSteve French char ntlmv2_hash[CIFS_ENCPWD_SIZE];
65838c8a9a5SSteve French struct {
65938c8a9a5SSteve French __u8 reserved[8];
66038c8a9a5SSteve French __u8 key[CIFS_SERVER_CHALLENGE_SIZE];
66138c8a9a5SSteve French } __attribute__((packed)) challenge;
66238c8a9a5SSteve French } __attribute__((packed));
66338c8a9a5SSteve French __le32 blob_signature;
66438c8a9a5SSteve French __u32 reserved;
66538c8a9a5SSteve French __le64 time;
66638c8a9a5SSteve French __u64 client_chal; /* random */
66738c8a9a5SSteve French __u32 reserved2;
66838c8a9a5SSteve French /* array of name entries could follow ending in minimum 4 byte struct */
66938c8a9a5SSteve French } __attribute__((packed));
67038c8a9a5SSteve French
67138c8a9a5SSteve French
67238c8a9a5SSteve French #define CIFS_NETWORK_OPSYS "CIFS VFS Client for Linux"
67338c8a9a5SSteve French
67438c8a9a5SSteve French /* Capabilities bits (for NTLM SessSetup request) */
67538c8a9a5SSteve French #define CAP_UNICODE 0x00000004
67638c8a9a5SSteve French #define CAP_LARGE_FILES 0x00000008
67738c8a9a5SSteve French #define CAP_NT_SMBS 0x00000010
67838c8a9a5SSteve French #define CAP_STATUS32 0x00000040
67938c8a9a5SSteve French #define CAP_LEVEL_II_OPLOCKS 0x00000080
68038c8a9a5SSteve French #define CAP_NT_FIND 0x00000200 /* reserved should be zero
68138c8a9a5SSteve French (because NT_SMBs implies the same thing?) */
68238c8a9a5SSteve French #define CAP_BULK_TRANSFER 0x20000000
68338c8a9a5SSteve French #define CAP_EXTENDED_SECURITY 0x80000000
68438c8a9a5SSteve French
68538c8a9a5SSteve French /* Action bits */
68638c8a9a5SSteve French #define GUEST_LOGIN 1
68738c8a9a5SSteve French
68838c8a9a5SSteve French typedef struct smb_com_tconx_req {
68938c8a9a5SSteve French struct smb_hdr hdr; /* wct = 4 */
69038c8a9a5SSteve French __u8 AndXCommand;
69138c8a9a5SSteve French __u8 AndXReserved;
69238c8a9a5SSteve French __le16 AndXOffset;
69338c8a9a5SSteve French __le16 Flags; /* see below */
69438c8a9a5SSteve French __le16 PasswordLength;
69538c8a9a5SSteve French __le16 ByteCount;
69638c8a9a5SSteve French unsigned char Password[]; /* followed by */
69738c8a9a5SSteve French /* STRING Path *//* \\server\share name */
69838c8a9a5SSteve French /* STRING Service */
69938c8a9a5SSteve French } __attribute__((packed)) TCONX_REQ;
70038c8a9a5SSteve French
70138c8a9a5SSteve French typedef struct smb_com_tconx_rsp {
70238c8a9a5SSteve French struct smb_hdr hdr; /* wct = 3 , not extended response */
70338c8a9a5SSteve French __u8 AndXCommand;
70438c8a9a5SSteve French __u8 AndXReserved;
70538c8a9a5SSteve French __le16 AndXOffset;
70638c8a9a5SSteve French __le16 OptionalSupport; /* see below */
70738c8a9a5SSteve French __u16 ByteCount;
70838c8a9a5SSteve French unsigned char Service[]; /* always ASCII, not Unicode */
70938c8a9a5SSteve French /* STRING NativeFileSystem */
71038c8a9a5SSteve French } __attribute__((packed)) TCONX_RSP;
71138c8a9a5SSteve French
71238c8a9a5SSteve French typedef struct smb_com_tconx_rsp_ext {
71338c8a9a5SSteve French struct smb_hdr hdr; /* wct = 7, extended response */
71438c8a9a5SSteve French __u8 AndXCommand;
71538c8a9a5SSteve French __u8 AndXReserved;
71638c8a9a5SSteve French __le16 AndXOffset;
71738c8a9a5SSteve French __le16 OptionalSupport; /* see below */
71838c8a9a5SSteve French __le32 MaximalShareAccessRights;
71938c8a9a5SSteve French __le32 GuestMaximalShareAccessRights;
72038c8a9a5SSteve French __u16 ByteCount;
72138c8a9a5SSteve French unsigned char Service[]; /* always ASCII, not Unicode */
72238c8a9a5SSteve French /* STRING NativeFileSystem */
72338c8a9a5SSteve French } __attribute__((packed)) TCONX_RSP_EXT;
72438c8a9a5SSteve French
72538c8a9a5SSteve French
72638c8a9a5SSteve French /* tree connect Flags */
72738c8a9a5SSteve French #define DISCONNECT_TID 0x0001
72838c8a9a5SSteve French #define TCON_EXTENDED_SIGNATURES 0x0004
72938c8a9a5SSteve French #define TCON_EXTENDED_SECINFO 0x0008
73038c8a9a5SSteve French
73138c8a9a5SSteve French /* OptionalSupport bits */
73238c8a9a5SSteve French #define SMB_SUPPORT_SEARCH_BITS 0x0001 /* "must have" directory search bits
73338c8a9a5SSteve French (exclusive searches supported) */
73438c8a9a5SSteve French #define SMB_SHARE_IS_IN_DFS 0x0002
73538c8a9a5SSteve French #define SMB_CSC_MASK 0x000C
73638c8a9a5SSteve French /* CSC flags defined as follows */
73738c8a9a5SSteve French #define SMB_CSC_CACHE_MANUAL_REINT 0x0000
73838c8a9a5SSteve French #define SMB_CSC_CACHE_AUTO_REINT 0x0004
73938c8a9a5SSteve French #define SMB_CSC_CACHE_VDO 0x0008
74038c8a9a5SSteve French #define SMB_CSC_NO_CACHING 0x000C
74138c8a9a5SSteve French #define SMB_UNIQUE_FILE_NAME 0x0010
74238c8a9a5SSteve French #define SMB_EXTENDED_SIGNATURES 0x0020
74338c8a9a5SSteve French
74438c8a9a5SSteve French /* services
74538c8a9a5SSteve French *
74638c8a9a5SSteve French * A: ie disk
74738c8a9a5SSteve French * LPT1: ie printer
74838c8a9a5SSteve French * IPC ie named pipe
74938c8a9a5SSteve French * COMM
75038c8a9a5SSteve French * ????? ie any type
75138c8a9a5SSteve French *
75238c8a9a5SSteve French */
75338c8a9a5SSteve French
75438c8a9a5SSteve French typedef struct smb_com_echo_req {
75538c8a9a5SSteve French struct smb_hdr hdr;
75638c8a9a5SSteve French __le16 EchoCount;
75738c8a9a5SSteve French __le16 ByteCount;
75838c8a9a5SSteve French char Data[];
75938c8a9a5SSteve French } __attribute__((packed)) ECHO_REQ;
76038c8a9a5SSteve French
76138c8a9a5SSteve French typedef struct smb_com_echo_rsp {
76238c8a9a5SSteve French struct smb_hdr hdr;
76338c8a9a5SSteve French __le16 SequenceNumber;
76438c8a9a5SSteve French __le16 ByteCount;
76538c8a9a5SSteve French char Data[];
76638c8a9a5SSteve French } __attribute__((packed)) ECHO_RSP;
76738c8a9a5SSteve French
76838c8a9a5SSteve French typedef struct smb_com_logoff_andx_req {
76938c8a9a5SSteve French struct smb_hdr hdr; /* wct = 2 */
77038c8a9a5SSteve French __u8 AndXCommand;
77138c8a9a5SSteve French __u8 AndXReserved;
77238c8a9a5SSteve French __u16 AndXOffset;
77338c8a9a5SSteve French __u16 ByteCount;
77438c8a9a5SSteve French } __attribute__((packed)) LOGOFF_ANDX_REQ;
77538c8a9a5SSteve French
77638c8a9a5SSteve French typedef struct smb_com_logoff_andx_rsp {
77738c8a9a5SSteve French struct smb_hdr hdr; /* wct = 2 */
77838c8a9a5SSteve French __u8 AndXCommand;
77938c8a9a5SSteve French __u8 AndXReserved;
78038c8a9a5SSteve French __u16 AndXOffset;
78138c8a9a5SSteve French __u16 ByteCount;
78238c8a9a5SSteve French } __attribute__((packed)) LOGOFF_ANDX_RSP;
78338c8a9a5SSteve French
78438c8a9a5SSteve French typedef union smb_com_tree_disconnect { /* as an altetnative can use flag on
78538c8a9a5SSteve French tree_connect PDU to effect disconnect */
78638c8a9a5SSteve French /* tdis is probably simplest SMB PDU */
78738c8a9a5SSteve French struct {
78838c8a9a5SSteve French struct smb_hdr hdr; /* wct = 0 */
78938c8a9a5SSteve French __u16 ByteCount; /* bcc = 0 */
79038c8a9a5SSteve French } __attribute__((packed)) req;
79138c8a9a5SSteve French struct {
79238c8a9a5SSteve French struct smb_hdr hdr; /* wct = 0 */
79338c8a9a5SSteve French __u16 ByteCount; /* bcc = 0 */
79438c8a9a5SSteve French } __attribute__((packed)) resp;
79538c8a9a5SSteve French } __attribute__((packed)) TREE_DISCONNECT;
79638c8a9a5SSteve French
79738c8a9a5SSteve French typedef struct smb_com_close_req {
79838c8a9a5SSteve French struct smb_hdr hdr; /* wct = 3 */
79938c8a9a5SSteve French __u16 FileID;
80038c8a9a5SSteve French __u32 LastWriteTime; /* should be zero or -1 */
80138c8a9a5SSteve French __u16 ByteCount; /* 0 */
80238c8a9a5SSteve French } __attribute__((packed)) CLOSE_REQ;
80338c8a9a5SSteve French
80438c8a9a5SSteve French typedef struct smb_com_close_rsp {
80538c8a9a5SSteve French struct smb_hdr hdr; /* wct = 0 */
80638c8a9a5SSteve French __u16 ByteCount; /* bct = 0 */
80738c8a9a5SSteve French } __attribute__((packed)) CLOSE_RSP;
80838c8a9a5SSteve French
80938c8a9a5SSteve French typedef struct smb_com_flush_req {
81038c8a9a5SSteve French struct smb_hdr hdr; /* wct = 1 */
81138c8a9a5SSteve French __u16 FileID;
81238c8a9a5SSteve French __u16 ByteCount; /* 0 */
81338c8a9a5SSteve French } __attribute__((packed)) FLUSH_REQ;
81438c8a9a5SSteve French
81538c8a9a5SSteve French typedef struct smb_com_findclose_req {
81638c8a9a5SSteve French struct smb_hdr hdr; /* wct = 1 */
81738c8a9a5SSteve French __u16 FileID;
81838c8a9a5SSteve French __u16 ByteCount; /* 0 */
81938c8a9a5SSteve French } __attribute__((packed)) FINDCLOSE_REQ;
82038c8a9a5SSteve French
82138c8a9a5SSteve French /* OpenFlags */
82238c8a9a5SSteve French #define REQ_MORE_INFO 0x00000001 /* legacy (OPEN_AND_X) only */
82338c8a9a5SSteve French #define REQ_OPLOCK 0x00000002
82438c8a9a5SSteve French #define REQ_BATCHOPLOCK 0x00000004
82538c8a9a5SSteve French #define REQ_OPENDIRONLY 0x00000008
82638c8a9a5SSteve French #define REQ_EXTENDED_INFO 0x00000010
82738c8a9a5SSteve French
82838c8a9a5SSteve French /* File type */
82938c8a9a5SSteve French #define DISK_TYPE 0x0000
83038c8a9a5SSteve French #define BYTE_PIPE_TYPE 0x0001
83138c8a9a5SSteve French #define MESSAGE_PIPE_TYPE 0x0002
83238c8a9a5SSteve French #define PRINTER_TYPE 0x0003
83338c8a9a5SSteve French #define COMM_DEV_TYPE 0x0004
83438c8a9a5SSteve French #define UNKNOWN_TYPE 0xFFFF
83538c8a9a5SSteve French
83638c8a9a5SSteve French /* Device Type or File Status Flags */
83738c8a9a5SSteve French #define NO_EAS 0x0001
83838c8a9a5SSteve French #define NO_SUBSTREAMS 0x0002
83938c8a9a5SSteve French #define NO_REPARSETAG 0x0004
84038c8a9a5SSteve French /* following flags can apply if pipe */
84138c8a9a5SSteve French #define ICOUNT_MASK 0x00FF
84238c8a9a5SSteve French #define PIPE_READ_MODE 0x0100
84338c8a9a5SSteve French #define NAMED_PIPE_TYPE 0x0400
84438c8a9a5SSteve French #define PIPE_END_POINT 0x4000
84538c8a9a5SSteve French #define BLOCKING_NAMED_PIPE 0x8000
84638c8a9a5SSteve French
84738c8a9a5SSteve French typedef struct smb_com_open_req { /* also handles create */
84838c8a9a5SSteve French struct smb_hdr hdr; /* wct = 24 */
84938c8a9a5SSteve French __u8 AndXCommand;
85038c8a9a5SSteve French __u8 AndXReserved;
85138c8a9a5SSteve French __le16 AndXOffset;
85238c8a9a5SSteve French __u8 Reserved; /* Must Be Zero */
85338c8a9a5SSteve French __le16 NameLength;
85438c8a9a5SSteve French __le32 OpenFlags;
85538c8a9a5SSteve French __u32 RootDirectoryFid;
85638c8a9a5SSteve French __le32 DesiredAccess;
85738c8a9a5SSteve French __le64 AllocationSize;
85838c8a9a5SSteve French __le32 FileAttributes;
85938c8a9a5SSteve French __le32 ShareAccess;
86038c8a9a5SSteve French __le32 CreateDisposition;
86138c8a9a5SSteve French __le32 CreateOptions;
86238c8a9a5SSteve French __le32 ImpersonationLevel;
86338c8a9a5SSteve French __u8 SecurityFlags;
86438c8a9a5SSteve French __le16 ByteCount;
86538c8a9a5SSteve French char fileName[];
86638c8a9a5SSteve French } __attribute__((packed)) OPEN_REQ;
86738c8a9a5SSteve French
86838c8a9a5SSteve French /* open response: oplock levels */
86938c8a9a5SSteve French #define OPLOCK_NONE 0
87038c8a9a5SSteve French #define OPLOCK_EXCLUSIVE 1
87138c8a9a5SSteve French #define OPLOCK_BATCH 2
87238c8a9a5SSteve French #define OPLOCK_READ 3 /* level 2 oplock */
87338c8a9a5SSteve French
87438c8a9a5SSteve French /* open response for CreateAction shifted left */
87538c8a9a5SSteve French #define CIFS_CREATE_ACTION 0x20000 /* file created */
87638c8a9a5SSteve French
87738c8a9a5SSteve French typedef struct smb_com_open_rsp {
87838c8a9a5SSteve French struct smb_hdr hdr; /* wct = 34 BB */
87938c8a9a5SSteve French __u8 AndXCommand;
88038c8a9a5SSteve French __u8 AndXReserved;
88138c8a9a5SSteve French __le16 AndXOffset;
88238c8a9a5SSteve French __u8 OplockLevel;
88338c8a9a5SSteve French __u16 Fid;
88438c8a9a5SSteve French __le32 CreateAction;
885*39ad3d61SGustavo A. R. Silva struct_group_attr(common_attributes, __packed,
88638c8a9a5SSteve French __le64 CreationTime;
88738c8a9a5SSteve French __le64 LastAccessTime;
88838c8a9a5SSteve French __le64 LastWriteTime;
88938c8a9a5SSteve French __le64 ChangeTime;
89038c8a9a5SSteve French __le32 FileAttributes;
8915ca51814SDmitry Antipov );
89238c8a9a5SSteve French __le64 AllocationSize;
89338c8a9a5SSteve French __le64 EndOfFile;
89438c8a9a5SSteve French __le16 FileType;
89538c8a9a5SSteve French __le16 DeviceState;
89638c8a9a5SSteve French __u8 DirectoryFlag;
89738c8a9a5SSteve French __u16 ByteCount; /* bct = 0 */
89838c8a9a5SSteve French } __attribute__((packed)) OPEN_RSP;
89938c8a9a5SSteve French
90038c8a9a5SSteve French typedef struct smb_com_open_rsp_ext {
90138c8a9a5SSteve French struct smb_hdr hdr; /* wct = 42 but meaningless due to MS bug? */
90238c8a9a5SSteve French __u8 AndXCommand;
90338c8a9a5SSteve French __u8 AndXReserved;
90438c8a9a5SSteve French __le16 AndXOffset;
90538c8a9a5SSteve French __u8 OplockLevel;
90638c8a9a5SSteve French __u16 Fid;
90738c8a9a5SSteve French __le32 CreateAction;
90838c8a9a5SSteve French __le64 CreationTime;
90938c8a9a5SSteve French __le64 LastAccessTime;
91038c8a9a5SSteve French __le64 LastWriteTime;
91138c8a9a5SSteve French __le64 ChangeTime;
91238c8a9a5SSteve French __le32 FileAttributes;
91338c8a9a5SSteve French __le64 AllocationSize;
91438c8a9a5SSteve French __le64 EndOfFile;
91538c8a9a5SSteve French __le16 FileType;
91638c8a9a5SSteve French __le16 DeviceState;
91738c8a9a5SSteve French __u8 DirectoryFlag;
91838c8a9a5SSteve French __u8 VolumeGUID[16];
91938c8a9a5SSteve French __u64 FileId; /* note no endian conversion - is opaque UniqueID */
92038c8a9a5SSteve French __le32 MaximalAccessRights;
92138c8a9a5SSteve French __le32 GuestMaximalAccessRights;
92238c8a9a5SSteve French __u16 ByteCount; /* bct = 0 */
92338c8a9a5SSteve French } __attribute__((packed)) OPEN_RSP_EXT;
92438c8a9a5SSteve French
92538c8a9a5SSteve French
92638c8a9a5SSteve French /* format of legacy open request */
92738c8a9a5SSteve French typedef struct smb_com_openx_req {
92838c8a9a5SSteve French struct smb_hdr hdr; /* wct = 15 */
92938c8a9a5SSteve French __u8 AndXCommand;
93038c8a9a5SSteve French __u8 AndXReserved;
93138c8a9a5SSteve French __le16 AndXOffset;
93238c8a9a5SSteve French __le16 OpenFlags;
93338c8a9a5SSteve French __le16 Mode;
93438c8a9a5SSteve French __le16 Sattr; /* search attributes */
93538c8a9a5SSteve French __le16 FileAttributes; /* dos attrs */
93638c8a9a5SSteve French __le32 CreateTime; /* os2 format */
93738c8a9a5SSteve French __le16 OpenFunction;
93838c8a9a5SSteve French __le32 EndOfFile;
93938c8a9a5SSteve French __le32 Timeout;
94038c8a9a5SSteve French __le32 Reserved;
94138c8a9a5SSteve French __le16 ByteCount; /* file name follows */
94238c8a9a5SSteve French char fileName[];
94338c8a9a5SSteve French } __attribute__((packed)) OPENX_REQ;
94438c8a9a5SSteve French
94538c8a9a5SSteve French typedef struct smb_com_openx_rsp {
94638c8a9a5SSteve French struct smb_hdr hdr; /* wct = 15 */
94738c8a9a5SSteve French __u8 AndXCommand;
94838c8a9a5SSteve French __u8 AndXReserved;
94938c8a9a5SSteve French __le16 AndXOffset;
95038c8a9a5SSteve French __u16 Fid;
95138c8a9a5SSteve French __le16 FileAttributes;
95238c8a9a5SSteve French __le32 LastWriteTime; /* os2 format */
95338c8a9a5SSteve French __le32 EndOfFile;
95438c8a9a5SSteve French __le16 Access;
95538c8a9a5SSteve French __le16 FileType;
95638c8a9a5SSteve French __le16 IPCState;
95738c8a9a5SSteve French __le16 Action;
95838c8a9a5SSteve French __u32 FileId;
95938c8a9a5SSteve French __u16 Reserved;
96038c8a9a5SSteve French __u16 ByteCount;
96138c8a9a5SSteve French } __attribute__((packed)) OPENX_RSP;
96238c8a9a5SSteve French
96338c8a9a5SSteve French /* For encoding of POSIX Open Request - see trans2 function 0x209 data struct */
96438c8a9a5SSteve French
96538c8a9a5SSteve French /* Legacy write request for older servers */
96638c8a9a5SSteve French typedef struct smb_com_writex_req {
96738c8a9a5SSteve French struct smb_hdr hdr; /* wct = 12 */
96838c8a9a5SSteve French __u8 AndXCommand;
96938c8a9a5SSteve French __u8 AndXReserved;
97038c8a9a5SSteve French __le16 AndXOffset;
97138c8a9a5SSteve French __u16 Fid;
97238c8a9a5SSteve French __le32 OffsetLow;
97338c8a9a5SSteve French __u32 Reserved; /* Timeout */
97438c8a9a5SSteve French __le16 WriteMode; /* 1 = write through */
97538c8a9a5SSteve French __le16 Remaining;
97638c8a9a5SSteve French __le16 Reserved2;
97738c8a9a5SSteve French __le16 DataLengthLow;
97838c8a9a5SSteve French __le16 DataOffset;
97938c8a9a5SSteve French __le16 ByteCount;
98038c8a9a5SSteve French __u8 Pad; /* BB check for whether padded to DWORD
98138c8a9a5SSteve French boundary and optimum performance here */
98238c8a9a5SSteve French char Data[];
98338c8a9a5SSteve French } __attribute__((packed)) WRITEX_REQ;
98438c8a9a5SSteve French
98538c8a9a5SSteve French typedef struct smb_com_write_req {
98638c8a9a5SSteve French struct smb_hdr hdr; /* wct = 14 */
98738c8a9a5SSteve French __u8 AndXCommand;
98838c8a9a5SSteve French __u8 AndXReserved;
98938c8a9a5SSteve French __le16 AndXOffset;
99038c8a9a5SSteve French __u16 Fid;
99138c8a9a5SSteve French __le32 OffsetLow;
99238c8a9a5SSteve French __u32 Reserved;
99338c8a9a5SSteve French __le16 WriteMode;
99438c8a9a5SSteve French __le16 Remaining;
99538c8a9a5SSteve French __le16 DataLengthHigh;
99638c8a9a5SSteve French __le16 DataLengthLow;
99738c8a9a5SSteve French __le16 DataOffset;
99838c8a9a5SSteve French __le32 OffsetHigh;
99938c8a9a5SSteve French __le16 ByteCount;
100038c8a9a5SSteve French __u8 Pad; /* BB check for whether padded to DWORD
100138c8a9a5SSteve French boundary and optimum performance here */
100238c8a9a5SSteve French char Data[];
100338c8a9a5SSteve French } __attribute__((packed)) WRITE_REQ;
100438c8a9a5SSteve French
100538c8a9a5SSteve French typedef struct smb_com_write_rsp {
100638c8a9a5SSteve French struct smb_hdr hdr; /* wct = 6 */
100738c8a9a5SSteve French __u8 AndXCommand;
100838c8a9a5SSteve French __u8 AndXReserved;
100938c8a9a5SSteve French __le16 AndXOffset;
101038c8a9a5SSteve French __le16 Count;
101138c8a9a5SSteve French __le16 Remaining;
101238c8a9a5SSteve French __le16 CountHigh;
101338c8a9a5SSteve French __u16 Reserved;
101438c8a9a5SSteve French __u16 ByteCount;
101538c8a9a5SSteve French } __attribute__((packed)) WRITE_RSP;
101638c8a9a5SSteve French
101738c8a9a5SSteve French /* legacy read request for older servers */
101838c8a9a5SSteve French typedef struct smb_com_readx_req {
101938c8a9a5SSteve French struct smb_hdr hdr; /* wct = 10 */
102038c8a9a5SSteve French __u8 AndXCommand;
102138c8a9a5SSteve French __u8 AndXReserved;
102238c8a9a5SSteve French __le16 AndXOffset;
102338c8a9a5SSteve French __u16 Fid;
102438c8a9a5SSteve French __le32 OffsetLow;
102538c8a9a5SSteve French __le16 MaxCount;
102638c8a9a5SSteve French __le16 MinCount; /* obsolete */
102738c8a9a5SSteve French __le32 Reserved;
102838c8a9a5SSteve French __le16 Remaining;
102938c8a9a5SSteve French __le16 ByteCount;
103038c8a9a5SSteve French } __attribute__((packed)) READX_REQ;
103138c8a9a5SSteve French
103238c8a9a5SSteve French typedef struct smb_com_read_req {
103338c8a9a5SSteve French struct smb_hdr hdr; /* wct = 12 */
103438c8a9a5SSteve French __u8 AndXCommand;
103538c8a9a5SSteve French __u8 AndXReserved;
103638c8a9a5SSteve French __le16 AndXOffset;
103738c8a9a5SSteve French __u16 Fid;
103838c8a9a5SSteve French __le32 OffsetLow;
103938c8a9a5SSteve French __le16 MaxCount;
104038c8a9a5SSteve French __le16 MinCount; /* obsolete */
104138c8a9a5SSteve French __le32 MaxCountHigh;
104238c8a9a5SSteve French __le16 Remaining;
104338c8a9a5SSteve French __le32 OffsetHigh;
104438c8a9a5SSteve French __le16 ByteCount;
104538c8a9a5SSteve French } __attribute__((packed)) READ_REQ;
104638c8a9a5SSteve French
104738c8a9a5SSteve French typedef struct smb_com_read_rsp {
104838c8a9a5SSteve French struct smb_hdr hdr; /* wct = 12 */
104938c8a9a5SSteve French __u8 AndXCommand;
105038c8a9a5SSteve French __u8 AndXReserved;
105138c8a9a5SSteve French __le16 AndXOffset;
105238c8a9a5SSteve French __le16 Remaining;
105338c8a9a5SSteve French __le16 DataCompactionMode;
105438c8a9a5SSteve French __le16 Reserved;
105538c8a9a5SSteve French __le16 DataLength;
105638c8a9a5SSteve French __le16 DataOffset;
105738c8a9a5SSteve French __le16 DataLengthHigh;
105838c8a9a5SSteve French __u64 Reserved2;
105938c8a9a5SSteve French __u16 ByteCount;
106038c8a9a5SSteve French /* read response data immediately follows */
106138c8a9a5SSteve French } __attribute__((packed)) READ_RSP;
106238c8a9a5SSteve French
106338c8a9a5SSteve French typedef struct locking_andx_range {
106438c8a9a5SSteve French __le16 Pid;
106538c8a9a5SSteve French __le16 Pad;
106638c8a9a5SSteve French __le32 OffsetHigh;
106738c8a9a5SSteve French __le32 OffsetLow;
106838c8a9a5SSteve French __le32 LengthHigh;
106938c8a9a5SSteve French __le32 LengthLow;
107038c8a9a5SSteve French } __attribute__((packed)) LOCKING_ANDX_RANGE;
107138c8a9a5SSteve French
107238c8a9a5SSteve French #define LOCKING_ANDX_SHARED_LOCK 0x01
107338c8a9a5SSteve French #define LOCKING_ANDX_OPLOCK_RELEASE 0x02
107438c8a9a5SSteve French #define LOCKING_ANDX_CHANGE_LOCKTYPE 0x04
107538c8a9a5SSteve French #define LOCKING_ANDX_CANCEL_LOCK 0x08
107638c8a9a5SSteve French #define LOCKING_ANDX_LARGE_FILES 0x10 /* always on for us */
107738c8a9a5SSteve French
107838c8a9a5SSteve French typedef struct smb_com_lock_req {
107938c8a9a5SSteve French struct smb_hdr hdr; /* wct = 8 */
108038c8a9a5SSteve French __u8 AndXCommand;
108138c8a9a5SSteve French __u8 AndXReserved;
108238c8a9a5SSteve French __le16 AndXOffset;
108338c8a9a5SSteve French __u16 Fid;
108438c8a9a5SSteve French __u8 LockType;
108538c8a9a5SSteve French __u8 OplockLevel;
108638c8a9a5SSteve French __le32 Timeout;
108738c8a9a5SSteve French __le16 NumberOfUnlocks;
108838c8a9a5SSteve French __le16 NumberOfLocks;
108938c8a9a5SSteve French __le16 ByteCount;
109038c8a9a5SSteve French LOCKING_ANDX_RANGE Locks[];
109138c8a9a5SSteve French } __attribute__((packed)) LOCK_REQ;
109238c8a9a5SSteve French
109338c8a9a5SSteve French /* lock type */
109438c8a9a5SSteve French #define CIFS_RDLCK 0
109538c8a9a5SSteve French #define CIFS_WRLCK 1
109638c8a9a5SSteve French #define CIFS_UNLCK 2
109738c8a9a5SSteve French typedef struct cifs_posix_lock {
109838c8a9a5SSteve French __le16 lock_type; /* 0 = Read, 1 = Write, 2 = Unlock */
109938c8a9a5SSteve French __le16 lock_flags; /* 1 = Wait (only valid for setlock) */
110038c8a9a5SSteve French __le32 pid;
110138c8a9a5SSteve French __le64 start;
110238c8a9a5SSteve French __le64 length;
110338c8a9a5SSteve French /* BB what about additional owner info to identify network client */
110438c8a9a5SSteve French } __attribute__((packed)) CIFS_POSIX_LOCK;
110538c8a9a5SSteve French
110638c8a9a5SSteve French typedef struct smb_com_lock_rsp {
110738c8a9a5SSteve French struct smb_hdr hdr; /* wct = 2 */
110838c8a9a5SSteve French __u8 AndXCommand;
110938c8a9a5SSteve French __u8 AndXReserved;
111038c8a9a5SSteve French __le16 AndXOffset;
111138c8a9a5SSteve French __u16 ByteCount;
111238c8a9a5SSteve French } __attribute__((packed)) LOCK_RSP;
111338c8a9a5SSteve French
111438c8a9a5SSteve French typedef struct smb_com_rename_req {
111538c8a9a5SSteve French struct smb_hdr hdr; /* wct = 1 */
111638c8a9a5SSteve French __le16 SearchAttributes; /* target file attributes */
111738c8a9a5SSteve French __le16 ByteCount;
111838c8a9a5SSteve French __u8 BufferFormat; /* 4 = ASCII or Unicode */
111938c8a9a5SSteve French unsigned char OldFileName[];
112038c8a9a5SSteve French /* followed by __u8 BufferFormat2 */
112138c8a9a5SSteve French /* followed by NewFileName */
112238c8a9a5SSteve French } __attribute__((packed)) RENAME_REQ;
112338c8a9a5SSteve French
112438c8a9a5SSteve French /* copy request flags */
112538c8a9a5SSteve French #define COPY_MUST_BE_FILE 0x0001
112638c8a9a5SSteve French #define COPY_MUST_BE_DIR 0x0002
112738c8a9a5SSteve French #define COPY_TARGET_MODE_ASCII 0x0004 /* if not set, binary */
112838c8a9a5SSteve French #define COPY_SOURCE_MODE_ASCII 0x0008 /* if not set, binary */
112938c8a9a5SSteve French #define COPY_VERIFY_WRITES 0x0010
113038c8a9a5SSteve French #define COPY_TREE 0x0020
113138c8a9a5SSteve French
113238c8a9a5SSteve French typedef struct smb_com_copy_req {
113338c8a9a5SSteve French struct smb_hdr hdr; /* wct = 3 */
113438c8a9a5SSteve French __u16 Tid2;
113538c8a9a5SSteve French __le16 OpenFunction;
113638c8a9a5SSteve French __le16 Flags;
113738c8a9a5SSteve French __le16 ByteCount;
113838c8a9a5SSteve French __u8 BufferFormat; /* 4 = ASCII or Unicode */
113938c8a9a5SSteve French unsigned char OldFileName[];
114038c8a9a5SSteve French /* followed by __u8 BufferFormat2 */
114138c8a9a5SSteve French /* followed by NewFileName string */
114238c8a9a5SSteve French } __attribute__((packed)) COPY_REQ;
114338c8a9a5SSteve French
114438c8a9a5SSteve French typedef struct smb_com_copy_rsp {
114538c8a9a5SSteve French struct smb_hdr hdr; /* wct = 1 */
114638c8a9a5SSteve French __le16 CopyCount; /* number of files copied */
114738c8a9a5SSteve French __u16 ByteCount; /* may be zero */
114838c8a9a5SSteve French __u8 BufferFormat; /* 0x04 - only present if errored file follows */
114938c8a9a5SSteve French unsigned char ErrorFileName[]; /* only present if error in copy */
115038c8a9a5SSteve French } __attribute__((packed)) COPY_RSP;
115138c8a9a5SSteve French
115238c8a9a5SSteve French #define CREATE_HARD_LINK 0x103
115338c8a9a5SSteve French #define MOVEFILE_COPY_ALLOWED 0x0002
115438c8a9a5SSteve French #define MOVEFILE_REPLACE_EXISTING 0x0001
115538c8a9a5SSteve French
115638c8a9a5SSteve French typedef struct smb_com_nt_rename_req { /* A5 - also used for create hardlink */
115738c8a9a5SSteve French struct smb_hdr hdr; /* wct = 4 */
115838c8a9a5SSteve French __le16 SearchAttributes; /* target file attributes */
115938c8a9a5SSteve French __le16 Flags; /* spec says Information Level */
116038c8a9a5SSteve French __le32 ClusterCount;
116138c8a9a5SSteve French __le16 ByteCount;
116238c8a9a5SSteve French __u8 BufferFormat; /* 4 = ASCII or Unicode */
116338c8a9a5SSteve French unsigned char OldFileName[];
116438c8a9a5SSteve French /* followed by __u8 BufferFormat2 */
116538c8a9a5SSteve French /* followed by NewFileName */
116638c8a9a5SSteve French } __attribute__((packed)) NT_RENAME_REQ;
116738c8a9a5SSteve French
116838c8a9a5SSteve French typedef struct smb_com_rename_rsp {
116938c8a9a5SSteve French struct smb_hdr hdr; /* wct = 0 */
117038c8a9a5SSteve French __u16 ByteCount; /* bct = 0 */
117138c8a9a5SSteve French } __attribute__((packed)) RENAME_RSP;
117238c8a9a5SSteve French
117338c8a9a5SSteve French typedef struct smb_com_delete_file_req {
117438c8a9a5SSteve French struct smb_hdr hdr; /* wct = 1 */
117538c8a9a5SSteve French __le16 SearchAttributes;
117638c8a9a5SSteve French __le16 ByteCount;
117738c8a9a5SSteve French __u8 BufferFormat; /* 4 = ASCII */
117838c8a9a5SSteve French unsigned char fileName[];
117938c8a9a5SSteve French } __attribute__((packed)) DELETE_FILE_REQ;
118038c8a9a5SSteve French
118138c8a9a5SSteve French typedef struct smb_com_delete_file_rsp {
118238c8a9a5SSteve French struct smb_hdr hdr; /* wct = 0 */
118338c8a9a5SSteve French __u16 ByteCount; /* bct = 0 */
118438c8a9a5SSteve French } __attribute__((packed)) DELETE_FILE_RSP;
118538c8a9a5SSteve French
118638c8a9a5SSteve French typedef struct smb_com_delete_directory_req {
118738c8a9a5SSteve French struct smb_hdr hdr; /* wct = 0 */
118838c8a9a5SSteve French __le16 ByteCount;
118938c8a9a5SSteve French __u8 BufferFormat; /* 4 = ASCII */
119038c8a9a5SSteve French unsigned char DirName[];
119138c8a9a5SSteve French } __attribute__((packed)) DELETE_DIRECTORY_REQ;
119238c8a9a5SSteve French
119338c8a9a5SSteve French typedef struct smb_com_delete_directory_rsp {
119438c8a9a5SSteve French struct smb_hdr hdr; /* wct = 0 */
119538c8a9a5SSteve French __u16 ByteCount; /* bct = 0 */
119638c8a9a5SSteve French } __attribute__((packed)) DELETE_DIRECTORY_RSP;
119738c8a9a5SSteve French
119838c8a9a5SSteve French typedef struct smb_com_create_directory_req {
119938c8a9a5SSteve French struct smb_hdr hdr; /* wct = 0 */
120038c8a9a5SSteve French __le16 ByteCount;
120138c8a9a5SSteve French __u8 BufferFormat; /* 4 = ASCII */
120238c8a9a5SSteve French unsigned char DirName[];
120338c8a9a5SSteve French } __attribute__((packed)) CREATE_DIRECTORY_REQ;
120438c8a9a5SSteve French
120538c8a9a5SSteve French typedef struct smb_com_create_directory_rsp {
120638c8a9a5SSteve French struct smb_hdr hdr; /* wct = 0 */
120738c8a9a5SSteve French __u16 ByteCount; /* bct = 0 */
120838c8a9a5SSteve French } __attribute__((packed)) CREATE_DIRECTORY_RSP;
120938c8a9a5SSteve French
121038c8a9a5SSteve French typedef struct smb_com_query_information_req {
121138c8a9a5SSteve French struct smb_hdr hdr; /* wct = 0 */
121238c8a9a5SSteve French __le16 ByteCount; /* 1 + namelen + 1 */
121338c8a9a5SSteve French __u8 BufferFormat; /* 4 = ASCII */
121438c8a9a5SSteve French unsigned char FileName[];
121538c8a9a5SSteve French } __attribute__((packed)) QUERY_INFORMATION_REQ;
121638c8a9a5SSteve French
121738c8a9a5SSteve French typedef struct smb_com_query_information_rsp {
121838c8a9a5SSteve French struct smb_hdr hdr; /* wct = 10 */
121938c8a9a5SSteve French __le16 attr;
122038c8a9a5SSteve French __le32 last_write_time;
122138c8a9a5SSteve French __le32 size;
122238c8a9a5SSteve French __u16 reserved[5];
122338c8a9a5SSteve French __le16 ByteCount; /* bcc = 0 */
122438c8a9a5SSteve French } __attribute__((packed)) QUERY_INFORMATION_RSP;
122538c8a9a5SSteve French
122638c8a9a5SSteve French typedef struct smb_com_setattr_req {
122738c8a9a5SSteve French struct smb_hdr hdr; /* wct = 8 */
122838c8a9a5SSteve French __le16 attr;
122938c8a9a5SSteve French __le16 time_low;
123038c8a9a5SSteve French __le16 time_high;
123138c8a9a5SSteve French __le16 reserved[5]; /* must be zero */
123238c8a9a5SSteve French __u16 ByteCount;
123338c8a9a5SSteve French __u8 BufferFormat; /* 4 = ASCII */
123438c8a9a5SSteve French unsigned char fileName[];
123538c8a9a5SSteve French } __attribute__((packed)) SETATTR_REQ;
123638c8a9a5SSteve French
123738c8a9a5SSteve French typedef struct smb_com_setattr_rsp {
123838c8a9a5SSteve French struct smb_hdr hdr; /* wct = 0 */
123938c8a9a5SSteve French __u16 ByteCount; /* bct = 0 */
124038c8a9a5SSteve French } __attribute__((packed)) SETATTR_RSP;
124138c8a9a5SSteve French
124238c8a9a5SSteve French /* empty wct response to setattr */
124338c8a9a5SSteve French
124438c8a9a5SSteve French /*******************************************************/
124538c8a9a5SSteve French /* NT Transact structure definitions follow */
124638c8a9a5SSteve French /* Currently only ioctl, acl (get security descriptor) */
124738c8a9a5SSteve French /* and notify are implemented */
124838c8a9a5SSteve French /*******************************************************/
124938c8a9a5SSteve French typedef struct smb_com_ntransact_req {
125038c8a9a5SSteve French struct smb_hdr hdr; /* wct >= 19 */
125138c8a9a5SSteve French __u8 MaxSetupCount;
125238c8a9a5SSteve French __u16 Reserved;
125338c8a9a5SSteve French __le32 TotalParameterCount;
125438c8a9a5SSteve French __le32 TotalDataCount;
125538c8a9a5SSteve French __le32 MaxParameterCount;
125638c8a9a5SSteve French __le32 MaxDataCount;
125738c8a9a5SSteve French __le32 ParameterCount;
125838c8a9a5SSteve French __le32 ParameterOffset;
125938c8a9a5SSteve French __le32 DataCount;
126038c8a9a5SSteve French __le32 DataOffset;
126138c8a9a5SSteve French __u8 SetupCount; /* four setup words follow subcommand */
126238c8a9a5SSteve French /* SNIA spec incorrectly included spurious pad here */
126338c8a9a5SSteve French __le16 SubCommand; /* 2 = IOCTL/FSCTL */
126438c8a9a5SSteve French /* SetupCount words follow then */
126538c8a9a5SSteve French __le16 ByteCount;
126638c8a9a5SSteve French __u8 Pad[3];
126738c8a9a5SSteve French __u8 Parms[];
126838c8a9a5SSteve French } __attribute__((packed)) NTRANSACT_REQ;
126938c8a9a5SSteve French
127038c8a9a5SSteve French typedef struct smb_com_ntransact_rsp {
127138c8a9a5SSteve French struct smb_hdr hdr; /* wct = 18 */
127238c8a9a5SSteve French __u8 Reserved[3];
127338c8a9a5SSteve French __le32 TotalParameterCount;
127438c8a9a5SSteve French __le32 TotalDataCount;
127538c8a9a5SSteve French __le32 ParameterCount;
127638c8a9a5SSteve French __le32 ParameterOffset;
127738c8a9a5SSteve French __le32 ParameterDisplacement;
127838c8a9a5SSteve French __le32 DataCount;
127938c8a9a5SSteve French __le32 DataOffset;
128038c8a9a5SSteve French __le32 DataDisplacement;
128138c8a9a5SSteve French __u8 SetupCount; /* 0 */
128238c8a9a5SSteve French __u16 ByteCount;
128338c8a9a5SSteve French /* __u8 Pad[3]; */
128438c8a9a5SSteve French /* parms and data follow */
128538c8a9a5SSteve French } __attribute__((packed)) NTRANSACT_RSP;
128638c8a9a5SSteve French
128738c8a9a5SSteve French /* See MS-SMB 2.2.7.2.1.1 */
128838c8a9a5SSteve French struct srv_copychunk {
128938c8a9a5SSteve French __le64 SourceOffset;
129038c8a9a5SSteve French __le64 DestinationOffset;
129138c8a9a5SSteve French __le32 CopyLength;
129238c8a9a5SSteve French __u32 Reserved;
129338c8a9a5SSteve French } __packed;
129438c8a9a5SSteve French
129538c8a9a5SSteve French typedef struct smb_com_transaction_ioctl_req {
129638c8a9a5SSteve French struct smb_hdr hdr; /* wct = 23 */
129738c8a9a5SSteve French __u8 MaxSetupCount;
129838c8a9a5SSteve French __u16 Reserved;
129938c8a9a5SSteve French __le32 TotalParameterCount;
130038c8a9a5SSteve French __le32 TotalDataCount;
130138c8a9a5SSteve French __le32 MaxParameterCount;
130238c8a9a5SSteve French __le32 MaxDataCount;
130338c8a9a5SSteve French __le32 ParameterCount;
130438c8a9a5SSteve French __le32 ParameterOffset;
130538c8a9a5SSteve French __le32 DataCount;
130638c8a9a5SSteve French __le32 DataOffset;
130738c8a9a5SSteve French __u8 SetupCount; /* four setup words follow subcommand */
130838c8a9a5SSteve French /* SNIA spec incorrectly included spurious pad here */
130938c8a9a5SSteve French __le16 SubCommand; /* 2 = IOCTL/FSCTL */
131038c8a9a5SSteve French __le32 FunctionCode;
131138c8a9a5SSteve French __u16 Fid;
131238c8a9a5SSteve French __u8 IsFsctl; /* 1 = File System Control 0 = device control (IOCTL) */
131338c8a9a5SSteve French __u8 IsRootFlag; /* 1 = apply command to root of share (must be DFS) */
131438c8a9a5SSteve French __le16 ByteCount;
131538c8a9a5SSteve French __u8 Pad[3];
131638c8a9a5SSteve French __u8 Data[];
131738c8a9a5SSteve French } __attribute__((packed)) TRANSACT_IOCTL_REQ;
131838c8a9a5SSteve French
131938c8a9a5SSteve French typedef struct smb_com_transaction_compr_ioctl_req {
132038c8a9a5SSteve French struct smb_hdr hdr; /* wct = 23 */
132138c8a9a5SSteve French __u8 MaxSetupCount;
132238c8a9a5SSteve French __u16 Reserved;
132338c8a9a5SSteve French __le32 TotalParameterCount;
132438c8a9a5SSteve French __le32 TotalDataCount;
132538c8a9a5SSteve French __le32 MaxParameterCount;
132638c8a9a5SSteve French __le32 MaxDataCount;
132738c8a9a5SSteve French __le32 ParameterCount;
132838c8a9a5SSteve French __le32 ParameterOffset;
132938c8a9a5SSteve French __le32 DataCount;
133038c8a9a5SSteve French __le32 DataOffset;
133138c8a9a5SSteve French __u8 SetupCount; /* four setup words follow subcommand */
133238c8a9a5SSteve French /* SNIA spec incorrectly included spurious pad here */
133338c8a9a5SSteve French __le16 SubCommand; /* 2 = IOCTL/FSCTL */
133438c8a9a5SSteve French __le32 FunctionCode;
133538c8a9a5SSteve French __u16 Fid;
133638c8a9a5SSteve French __u8 IsFsctl; /* 1 = File System Control 0 = device control (IOCTL) */
133738c8a9a5SSteve French __u8 IsRootFlag; /* 1 = apply command to root of share (must be DFS) */
133838c8a9a5SSteve French __le16 ByteCount;
133938c8a9a5SSteve French __u8 Pad[3];
134038c8a9a5SSteve French __le16 compression_state; /* See below for valid flags */
134138c8a9a5SSteve French } __attribute__((packed)) TRANSACT_COMPR_IOCTL_REQ;
134238c8a9a5SSteve French
134338c8a9a5SSteve French /* compression state flags */
134438c8a9a5SSteve French #define COMPRESSION_FORMAT_NONE 0x0000
134538c8a9a5SSteve French #define COMPRESSION_FORMAT_DEFAULT 0x0001
134638c8a9a5SSteve French #define COMPRESSION_FORMAT_LZNT1 0x0002
134738c8a9a5SSteve French
134838c8a9a5SSteve French typedef struct smb_com_transaction_ioctl_rsp {
134938c8a9a5SSteve French struct smb_hdr hdr; /* wct = 19 */
135038c8a9a5SSteve French __u8 Reserved[3];
135138c8a9a5SSteve French __le32 TotalParameterCount;
135238c8a9a5SSteve French __le32 TotalDataCount;
135338c8a9a5SSteve French __le32 ParameterCount;
135438c8a9a5SSteve French __le32 ParameterOffset;
135538c8a9a5SSteve French __le32 ParameterDisplacement;
135638c8a9a5SSteve French __le32 DataCount;
135738c8a9a5SSteve French __le32 DataOffset;
135838c8a9a5SSteve French __le32 DataDisplacement;
135938c8a9a5SSteve French __u8 SetupCount; /* 1 */
136038c8a9a5SSteve French __le16 ReturnedDataLen;
1361d5c959a1SPaulo Alcantara __le16 ByteCount;
136238c8a9a5SSteve French } __attribute__((packed)) TRANSACT_IOCTL_RSP;
136338c8a9a5SSteve French
136438c8a9a5SSteve French #define CIFS_ACL_OWNER 1
136538c8a9a5SSteve French #define CIFS_ACL_GROUP 2
136638c8a9a5SSteve French #define CIFS_ACL_DACL 4
136738c8a9a5SSteve French #define CIFS_ACL_SACL 8
136838c8a9a5SSteve French
136938c8a9a5SSteve French typedef struct smb_com_transaction_qsec_req {
137038c8a9a5SSteve French struct smb_hdr hdr; /* wct = 19 */
137138c8a9a5SSteve French __u8 MaxSetupCount;
137238c8a9a5SSteve French __u16 Reserved;
137338c8a9a5SSteve French __le32 TotalParameterCount;
137438c8a9a5SSteve French __le32 TotalDataCount;
137538c8a9a5SSteve French __le32 MaxParameterCount;
137638c8a9a5SSteve French __le32 MaxDataCount;
137738c8a9a5SSteve French __le32 ParameterCount;
137838c8a9a5SSteve French __le32 ParameterOffset;
137938c8a9a5SSteve French __le32 DataCount;
138038c8a9a5SSteve French __le32 DataOffset;
138138c8a9a5SSteve French __u8 SetupCount; /* no setup words follow subcommand */
138238c8a9a5SSteve French /* SNIA spec incorrectly included spurious pad here */
138338c8a9a5SSteve French __le16 SubCommand; /* 6 = QUERY_SECURITY_DESC */
138438c8a9a5SSteve French __le16 ByteCount; /* bcc = 3 + 8 */
138538c8a9a5SSteve French __u8 Pad[3];
138638c8a9a5SSteve French __u16 Fid;
138738c8a9a5SSteve French __u16 Reserved2;
138838c8a9a5SSteve French __le32 AclFlags;
138938c8a9a5SSteve French } __attribute__((packed)) QUERY_SEC_DESC_REQ;
139038c8a9a5SSteve French
139138c8a9a5SSteve French
139238c8a9a5SSteve French typedef struct smb_com_transaction_ssec_req {
139338c8a9a5SSteve French struct smb_hdr hdr; /* wct = 19 */
139438c8a9a5SSteve French __u8 MaxSetupCount;
139538c8a9a5SSteve French __u16 Reserved;
139638c8a9a5SSteve French __le32 TotalParameterCount;
139738c8a9a5SSteve French __le32 TotalDataCount;
139838c8a9a5SSteve French __le32 MaxParameterCount;
139938c8a9a5SSteve French __le32 MaxDataCount;
140038c8a9a5SSteve French __le32 ParameterCount;
140138c8a9a5SSteve French __le32 ParameterOffset;
140238c8a9a5SSteve French __le32 DataCount;
140338c8a9a5SSteve French __le32 DataOffset;
140438c8a9a5SSteve French __u8 SetupCount; /* no setup words follow subcommand */
140538c8a9a5SSteve French /* SNIA spec incorrectly included spurious pad here */
140638c8a9a5SSteve French __le16 SubCommand; /* 3 = SET_SECURITY_DESC */
140738c8a9a5SSteve French __le16 ByteCount; /* bcc = 3 + 8 */
140838c8a9a5SSteve French __u8 Pad[3];
140938c8a9a5SSteve French __u16 Fid;
141038c8a9a5SSteve French __u16 Reserved2;
141138c8a9a5SSteve French __le32 AclFlags;
141238c8a9a5SSteve French } __attribute__((packed)) SET_SEC_DESC_REQ;
141338c8a9a5SSteve French
141438c8a9a5SSteve French typedef struct smb_com_transaction_change_notify_req {
141538c8a9a5SSteve French struct smb_hdr hdr; /* wct = 23 */
141638c8a9a5SSteve French __u8 MaxSetupCount;
141738c8a9a5SSteve French __u16 Reserved;
141838c8a9a5SSteve French __le32 TotalParameterCount;
141938c8a9a5SSteve French __le32 TotalDataCount;
142038c8a9a5SSteve French __le32 MaxParameterCount;
142138c8a9a5SSteve French __le32 MaxDataCount;
142238c8a9a5SSteve French __le32 ParameterCount;
142338c8a9a5SSteve French __le32 ParameterOffset;
142438c8a9a5SSteve French __le32 DataCount;
142538c8a9a5SSteve French __le32 DataOffset;
142638c8a9a5SSteve French __u8 SetupCount; /* four setup words follow subcommand */
142738c8a9a5SSteve French /* SNIA spec incorrectly included spurious pad here */
142838c8a9a5SSteve French __le16 SubCommand;/* 4 = Change Notify */
142938c8a9a5SSteve French __le32 CompletionFilter; /* operation to monitor */
143038c8a9a5SSteve French __u16 Fid;
143138c8a9a5SSteve French __u8 WatchTree; /* 1 = Monitor subdirectories */
143238c8a9a5SSteve French __u8 Reserved2;
143338c8a9a5SSteve French __le16 ByteCount;
143438c8a9a5SSteve French /* __u8 Pad[3];*/
143538c8a9a5SSteve French /* __u8 Data[];*/
143638c8a9a5SSteve French } __attribute__((packed)) TRANSACT_CHANGE_NOTIFY_REQ;
143738c8a9a5SSteve French
143838c8a9a5SSteve French /* BB eventually change to use generic ntransact rsp struct
143938c8a9a5SSteve French and validation routine */
144038c8a9a5SSteve French typedef struct smb_com_transaction_change_notify_rsp {
144138c8a9a5SSteve French struct smb_hdr hdr; /* wct = 18 */
144238c8a9a5SSteve French __u8 Reserved[3];
144338c8a9a5SSteve French __le32 TotalParameterCount;
144438c8a9a5SSteve French __le32 TotalDataCount;
144538c8a9a5SSteve French __le32 ParameterCount;
144638c8a9a5SSteve French __le32 ParameterOffset;
144738c8a9a5SSteve French __le32 ParameterDisplacement;
144838c8a9a5SSteve French __le32 DataCount;
144938c8a9a5SSteve French __le32 DataOffset;
145038c8a9a5SSteve French __le32 DataDisplacement;
145138c8a9a5SSteve French __u8 SetupCount; /* 0 */
145238c8a9a5SSteve French __u16 ByteCount;
145338c8a9a5SSteve French /* __u8 Pad[3]; */
145438c8a9a5SSteve French } __attribute__((packed)) TRANSACT_CHANGE_NOTIFY_RSP;
145538c8a9a5SSteve French /* Completion Filter flags for Notify */
145638c8a9a5SSteve French #define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001
145738c8a9a5SSteve French #define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002
145838c8a9a5SSteve French #define FILE_NOTIFY_CHANGE_NAME 0x00000003
145938c8a9a5SSteve French #define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004
146038c8a9a5SSteve French #define FILE_NOTIFY_CHANGE_SIZE 0x00000008
146138c8a9a5SSteve French #define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
146238c8a9a5SSteve French #define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020
146338c8a9a5SSteve French #define FILE_NOTIFY_CHANGE_CREATION 0x00000040
146438c8a9a5SSteve French #define FILE_NOTIFY_CHANGE_EA 0x00000080
146538c8a9a5SSteve French #define FILE_NOTIFY_CHANGE_SECURITY 0x00000100
146638c8a9a5SSteve French #define FILE_NOTIFY_CHANGE_STREAM_NAME 0x00000200
146738c8a9a5SSteve French #define FILE_NOTIFY_CHANGE_STREAM_SIZE 0x00000400
146838c8a9a5SSteve French #define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
146938c8a9a5SSteve French
147038c8a9a5SSteve French #define FILE_ACTION_ADDED 0x00000001
147138c8a9a5SSteve French #define FILE_ACTION_REMOVED 0x00000002
147238c8a9a5SSteve French #define FILE_ACTION_MODIFIED 0x00000003
147338c8a9a5SSteve French #define FILE_ACTION_RENAMED_OLD_NAME 0x00000004
147438c8a9a5SSteve French #define FILE_ACTION_RENAMED_NEW_NAME 0x00000005
147538c8a9a5SSteve French #define FILE_ACTION_ADDED_STREAM 0x00000006
147638c8a9a5SSteve French #define FILE_ACTION_REMOVED_STREAM 0x00000007
147738c8a9a5SSteve French #define FILE_ACTION_MODIFIED_STREAM 0x00000008
147838c8a9a5SSteve French
147938c8a9a5SSteve French /* response contains array of the following structures */
148038c8a9a5SSteve French struct file_notify_information {
148138c8a9a5SSteve French __le32 NextEntryOffset;
148238c8a9a5SSteve French __le32 Action;
148338c8a9a5SSteve French __le32 FileNameLength;
148438c8a9a5SSteve French __u8 FileName[];
148538c8a9a5SSteve French } __attribute__((packed));
148638c8a9a5SSteve French
148738c8a9a5SSteve French /* For IO_REPARSE_TAG_SYMLINK */
148838c8a9a5SSteve French struct reparse_symlink_data {
148938c8a9a5SSteve French __le32 ReparseTag;
149038c8a9a5SSteve French __le16 ReparseDataLength;
149138c8a9a5SSteve French __u16 Reserved;
149238c8a9a5SSteve French __le16 SubstituteNameOffset;
149338c8a9a5SSteve French __le16 SubstituteNameLength;
149438c8a9a5SSteve French __le16 PrintNameOffset;
149538c8a9a5SSteve French __le16 PrintNameLength;
149638c8a9a5SSteve French __le32 Flags;
149738c8a9a5SSteve French char PathBuffer[];
149838c8a9a5SSteve French } __attribute__((packed));
149938c8a9a5SSteve French
150038c8a9a5SSteve French /* Flag above */
150138c8a9a5SSteve French #define SYMLINK_FLAG_RELATIVE 0x00000001
150238c8a9a5SSteve French
150338c8a9a5SSteve French /* For IO_REPARSE_TAG_NFS */
150438c8a9a5SSteve French #define NFS_SPECFILE_LNK 0x00000000014B4E4C
150538c8a9a5SSteve French #define NFS_SPECFILE_CHR 0x0000000000524843
150638c8a9a5SSteve French #define NFS_SPECFILE_BLK 0x00000000004B4C42
150738c8a9a5SSteve French #define NFS_SPECFILE_FIFO 0x000000004F464946
150838c8a9a5SSteve French #define NFS_SPECFILE_SOCK 0x000000004B434F53
150938c8a9a5SSteve French struct reparse_posix_data {
151038c8a9a5SSteve French __le32 ReparseTag;
151138c8a9a5SSteve French __le16 ReparseDataLength;
151238c8a9a5SSteve French __u16 Reserved;
151338c8a9a5SSteve French __le64 InodeType; /* LNK, FIFO, CHR etc. */
1514df32e887SPaulo Alcantara __u8 DataBuffer[];
151538c8a9a5SSteve French } __attribute__((packed));
151638c8a9a5SSteve French
151738c8a9a5SSteve French struct cifs_quota_data {
151838c8a9a5SSteve French __u32 rsrvd1; /* 0 */
151938c8a9a5SSteve French __u32 sid_size;
152038c8a9a5SSteve French __u64 rsrvd2; /* 0 */
152138c8a9a5SSteve French __u64 space_used;
152238c8a9a5SSteve French __u64 soft_limit;
152338c8a9a5SSteve French __u64 hard_limit;
152438c8a9a5SSteve French char sid[]; /* variable size? */
152538c8a9a5SSteve French } __attribute__((packed));
152638c8a9a5SSteve French
152738c8a9a5SSteve French /* quota sub commands */
152838c8a9a5SSteve French #define QUOTA_LIST_CONTINUE 0
152938c8a9a5SSteve French #define QUOTA_LIST_START 0x100
153038c8a9a5SSteve French #define QUOTA_FOR_SID 0x101
153138c8a9a5SSteve French
153238c8a9a5SSteve French struct trans2_req {
153338c8a9a5SSteve French /* struct smb_hdr hdr precedes. Set wct = 14+ */
153438c8a9a5SSteve French __le16 TotalParameterCount;
153538c8a9a5SSteve French __le16 TotalDataCount;
153638c8a9a5SSteve French __le16 MaxParameterCount;
153738c8a9a5SSteve French __le16 MaxDataCount;
153838c8a9a5SSteve French __u8 MaxSetupCount;
153938c8a9a5SSteve French __u8 Reserved;
154038c8a9a5SSteve French __le16 Flags;
154138c8a9a5SSteve French __le32 Timeout;
154238c8a9a5SSteve French __u16 Reserved2;
154338c8a9a5SSteve French __le16 ParameterCount;
154438c8a9a5SSteve French __le16 ParameterOffset;
154538c8a9a5SSteve French __le16 DataCount;
154638c8a9a5SSteve French __le16 DataOffset;
154738c8a9a5SSteve French __u8 SetupCount;
154838c8a9a5SSteve French __u8 Reserved3;
154938c8a9a5SSteve French __le16 SubCommand; /* 1st setup word - SetupCount words follow */
155038c8a9a5SSteve French __le16 ByteCount;
155138c8a9a5SSteve French } __attribute__((packed));
155238c8a9a5SSteve French
155338c8a9a5SSteve French struct smb_t2_req {
155438c8a9a5SSteve French struct smb_hdr hdr;
155538c8a9a5SSteve French struct trans2_req t2_req;
155638c8a9a5SSteve French } __attribute__((packed));
155738c8a9a5SSteve French
155838c8a9a5SSteve French struct trans2_resp {
155938c8a9a5SSteve French /* struct smb_hdr hdr precedes. Note wct = 10 + setup count */
156038c8a9a5SSteve French __le16 TotalParameterCount;
156138c8a9a5SSteve French __le16 TotalDataCount;
156238c8a9a5SSteve French __u16 Reserved;
156338c8a9a5SSteve French __le16 ParameterCount;
156438c8a9a5SSteve French __le16 ParameterOffset;
156538c8a9a5SSteve French __le16 ParameterDisplacement;
156638c8a9a5SSteve French __le16 DataCount;
156738c8a9a5SSteve French __le16 DataOffset;
156838c8a9a5SSteve French __le16 DataDisplacement;
156938c8a9a5SSteve French __u8 SetupCount;
157038c8a9a5SSteve French __u8 Reserved1;
157138c8a9a5SSteve French /* SetupWords[SetupCount];
157238c8a9a5SSteve French __u16 ByteCount;
157338c8a9a5SSteve French __u16 Reserved2;*/
157438c8a9a5SSteve French /* data area follows */
157538c8a9a5SSteve French } __attribute__((packed));
157638c8a9a5SSteve French
157738c8a9a5SSteve French struct smb_t2_rsp {
157838c8a9a5SSteve French struct smb_hdr hdr;
157938c8a9a5SSteve French struct trans2_resp t2_rsp;
158038c8a9a5SSteve French } __attribute__((packed));
158138c8a9a5SSteve French
158238c8a9a5SSteve French /* PathInfo/FileInfo infolevels */
158338c8a9a5SSteve French #define SMB_INFO_STANDARD 1
158438c8a9a5SSteve French #define SMB_SET_FILE_EA 2
158538c8a9a5SSteve French #define SMB_QUERY_FILE_EA_SIZE 2
158638c8a9a5SSteve French #define SMB_INFO_QUERY_EAS_FROM_LIST 3
158738c8a9a5SSteve French #define SMB_INFO_QUERY_ALL_EAS 4
158838c8a9a5SSteve French #define SMB_INFO_IS_NAME_VALID 6
158938c8a9a5SSteve French #define SMB_QUERY_FILE_BASIC_INFO 0x101
159038c8a9a5SSteve French #define SMB_QUERY_FILE_STANDARD_INFO 0x102
159138c8a9a5SSteve French #define SMB_QUERY_FILE_EA_INFO 0x103
159238c8a9a5SSteve French #define SMB_QUERY_FILE_NAME_INFO 0x104
159338c8a9a5SSteve French #define SMB_QUERY_FILE_ALLOCATION_INFO 0x105
159438c8a9a5SSteve French #define SMB_QUERY_FILE_END_OF_FILEINFO 0x106
159538c8a9a5SSteve French #define SMB_QUERY_FILE_ALL_INFO 0x107
159638c8a9a5SSteve French #define SMB_QUERY_ALT_NAME_INFO 0x108
159738c8a9a5SSteve French #define SMB_QUERY_FILE_STREAM_INFO 0x109
159838c8a9a5SSteve French #define SMB_QUERY_FILE_COMPRESSION_INFO 0x10B
159938c8a9a5SSteve French #define SMB_QUERY_FILE_UNIX_BASIC 0x200
160038c8a9a5SSteve French #define SMB_QUERY_FILE_UNIX_LINK 0x201
160138c8a9a5SSteve French #define SMB_QUERY_POSIX_ACL 0x204
160238c8a9a5SSteve French #define SMB_QUERY_XATTR 0x205 /* e.g. system EA name space */
160338c8a9a5SSteve French #define SMB_QUERY_ATTR_FLAGS 0x206 /* append,immutable etc. */
160438c8a9a5SSteve French #define SMB_QUERY_POSIX_PERMISSION 0x207
160538c8a9a5SSteve French #define SMB_QUERY_POSIX_LOCK 0x208
160638c8a9a5SSteve French /* #define SMB_POSIX_OPEN 0x209 */
160738c8a9a5SSteve French /* #define SMB_POSIX_UNLINK 0x20a */
160838c8a9a5SSteve French #define SMB_QUERY_FILE__UNIX_INFO2 0x20b
160938c8a9a5SSteve French #define SMB_QUERY_FILE_INTERNAL_INFO 0x3ee
161038c8a9a5SSteve French #define SMB_QUERY_FILE_ACCESS_INFO 0x3f0
161138c8a9a5SSteve French #define SMB_QUERY_FILE_NAME_INFO2 0x3f1 /* 0x30 bytes */
161238c8a9a5SSteve French #define SMB_QUERY_FILE_POSITION_INFO 0x3f6
161338c8a9a5SSteve French #define SMB_QUERY_FILE_MODE_INFO 0x3f8
161438c8a9a5SSteve French #define SMB_QUERY_FILE_ALGN_INFO 0x3f9
161538c8a9a5SSteve French
161638c8a9a5SSteve French
161738c8a9a5SSteve French #define SMB_SET_FILE_BASIC_INFO 0x101
161838c8a9a5SSteve French #define SMB_SET_FILE_DISPOSITION_INFO 0x102
161938c8a9a5SSteve French #define SMB_SET_FILE_ALLOCATION_INFO 0x103
162038c8a9a5SSteve French #define SMB_SET_FILE_END_OF_FILE_INFO 0x104
162138c8a9a5SSteve French #define SMB_SET_FILE_UNIX_BASIC 0x200
162238c8a9a5SSteve French #define SMB_SET_FILE_UNIX_LINK 0x201
162338c8a9a5SSteve French #define SMB_SET_FILE_UNIX_HLINK 0x203
162438c8a9a5SSteve French #define SMB_SET_POSIX_ACL 0x204
162538c8a9a5SSteve French #define SMB_SET_XATTR 0x205
162638c8a9a5SSteve French #define SMB_SET_ATTR_FLAGS 0x206 /* append, immutable etc. */
162738c8a9a5SSteve French #define SMB_SET_POSIX_LOCK 0x208
162838c8a9a5SSteve French #define SMB_POSIX_OPEN 0x209
162938c8a9a5SSteve French #define SMB_POSIX_UNLINK 0x20a
163038c8a9a5SSteve French #define SMB_SET_FILE_UNIX_INFO2 0x20b
163138c8a9a5SSteve French #define SMB_SET_FILE_BASIC_INFO2 0x3ec
163238c8a9a5SSteve French #define SMB_SET_FILE_RENAME_INFORMATION 0x3f2 /* BB check if qpathinfo too */
163338c8a9a5SSteve French #define SMB_FILE_ALL_INFO2 0x3fa
163438c8a9a5SSteve French #define SMB_SET_FILE_ALLOCATION_INFO2 0x3fb
163538c8a9a5SSteve French #define SMB_SET_FILE_END_OF_FILE_INFO2 0x3fc
163638c8a9a5SSteve French #define SMB_FILE_MOVE_CLUSTER_INFO 0x407
163738c8a9a5SSteve French #define SMB_FILE_QUOTA_INFO 0x408
163838c8a9a5SSteve French #define SMB_FILE_REPARSEPOINT_INFO 0x409
163938c8a9a5SSteve French #define SMB_FILE_MAXIMUM_INFO 0x40d
164038c8a9a5SSteve French
164138c8a9a5SSteve French /* Find File infolevels */
164238c8a9a5SSteve French #define SMB_FIND_FILE_INFO_STANDARD 0x001
164338c8a9a5SSteve French #define SMB_FIND_FILE_QUERY_EA_SIZE 0x002
164438c8a9a5SSteve French #define SMB_FIND_FILE_QUERY_EAS_FROM_LIST 0x003
164538c8a9a5SSteve French #define SMB_FIND_FILE_DIRECTORY_INFO 0x101
164638c8a9a5SSteve French #define SMB_FIND_FILE_FULL_DIRECTORY_INFO 0x102
164738c8a9a5SSteve French #define SMB_FIND_FILE_NAMES_INFO 0x103
164838c8a9a5SSteve French #define SMB_FIND_FILE_BOTH_DIRECTORY_INFO 0x104
164938c8a9a5SSteve French #define SMB_FIND_FILE_ID_FULL_DIR_INFO 0x105
165038c8a9a5SSteve French #define SMB_FIND_FILE_ID_BOTH_DIR_INFO 0x106
165138c8a9a5SSteve French #define SMB_FIND_FILE_UNIX 0x202
165238c8a9a5SSteve French /* #define SMB_FIND_FILE_POSIX_INFO 0x064 */
165338c8a9a5SSteve French
165438c8a9a5SSteve French typedef struct smb_com_transaction2_qpi_req {
165538c8a9a5SSteve French struct smb_hdr hdr; /* wct = 14+ */
165638c8a9a5SSteve French __le16 TotalParameterCount;
165738c8a9a5SSteve French __le16 TotalDataCount;
165838c8a9a5SSteve French __le16 MaxParameterCount;
165938c8a9a5SSteve French __le16 MaxDataCount;
166038c8a9a5SSteve French __u8 MaxSetupCount;
166138c8a9a5SSteve French __u8 Reserved;
166238c8a9a5SSteve French __le16 Flags;
166338c8a9a5SSteve French __le32 Timeout;
166438c8a9a5SSteve French __u16 Reserved2;
166538c8a9a5SSteve French __le16 ParameterCount;
166638c8a9a5SSteve French __le16 ParameterOffset;
166738c8a9a5SSteve French __le16 DataCount;
166838c8a9a5SSteve French __le16 DataOffset;
166938c8a9a5SSteve French __u8 SetupCount;
167038c8a9a5SSteve French __u8 Reserved3;
167138c8a9a5SSteve French __le16 SubCommand; /* one setup word */
167238c8a9a5SSteve French __le16 ByteCount;
167338c8a9a5SSteve French __u8 Pad;
167438c8a9a5SSteve French __le16 InformationLevel;
167538c8a9a5SSteve French __u32 Reserved4;
167638c8a9a5SSteve French char FileName[];
167738c8a9a5SSteve French } __attribute__((packed)) TRANSACTION2_QPI_REQ;
167838c8a9a5SSteve French
167938c8a9a5SSteve French typedef struct smb_com_transaction2_qpi_rsp {
168038c8a9a5SSteve French struct smb_hdr hdr; /* wct = 10 + SetupCount */
168138c8a9a5SSteve French struct trans2_resp t2;
168238c8a9a5SSteve French __u16 ByteCount;
168338c8a9a5SSteve French __u16 Reserved2; /* parameter word is present for infolevels > 100 */
168438c8a9a5SSteve French } __attribute__((packed)) TRANSACTION2_QPI_RSP;
168538c8a9a5SSteve French
168638c8a9a5SSteve French typedef struct smb_com_transaction2_spi_req {
168738c8a9a5SSteve French struct smb_hdr hdr; /* wct = 15 */
168838c8a9a5SSteve French __le16 TotalParameterCount;
168938c8a9a5SSteve French __le16 TotalDataCount;
169038c8a9a5SSteve French __le16 MaxParameterCount;
169138c8a9a5SSteve French __le16 MaxDataCount;
169238c8a9a5SSteve French __u8 MaxSetupCount;
169338c8a9a5SSteve French __u8 Reserved;
169438c8a9a5SSteve French __le16 Flags;
169538c8a9a5SSteve French __le32 Timeout;
169638c8a9a5SSteve French __u16 Reserved2;
169738c8a9a5SSteve French __le16 ParameterCount;
169838c8a9a5SSteve French __le16 ParameterOffset;
169938c8a9a5SSteve French __le16 DataCount;
170038c8a9a5SSteve French __le16 DataOffset;
170138c8a9a5SSteve French __u8 SetupCount;
170238c8a9a5SSteve French __u8 Reserved3;
170338c8a9a5SSteve French __le16 SubCommand; /* one setup word */
170438c8a9a5SSteve French __le16 ByteCount;
170538c8a9a5SSteve French __u8 Pad;
170638c8a9a5SSteve French __u16 Pad1;
170738c8a9a5SSteve French __le16 InformationLevel;
170838c8a9a5SSteve French __u32 Reserved4;
170938c8a9a5SSteve French char FileName[];
171038c8a9a5SSteve French } __attribute__((packed)) TRANSACTION2_SPI_REQ;
171138c8a9a5SSteve French
171238c8a9a5SSteve French typedef struct smb_com_transaction2_spi_rsp {
171338c8a9a5SSteve French struct smb_hdr hdr; /* wct = 10 + SetupCount */
171438c8a9a5SSteve French struct trans2_resp t2;
171538c8a9a5SSteve French __u16 ByteCount;
171638c8a9a5SSteve French __u16 Reserved2; /* parameter word is present for infolevels > 100 */
171738c8a9a5SSteve French } __attribute__((packed)) TRANSACTION2_SPI_RSP;
171838c8a9a5SSteve French
171938c8a9a5SSteve French struct set_file_rename {
172038c8a9a5SSteve French __le32 overwrite; /* 1 = overwrite dest */
172138c8a9a5SSteve French __u32 root_fid; /* zero */
172238c8a9a5SSteve French __le32 target_name_len;
172338c8a9a5SSteve French char target_name[]; /* Must be unicode */
172438c8a9a5SSteve French } __attribute__((packed));
172538c8a9a5SSteve French
172638c8a9a5SSteve French struct smb_com_transaction2_sfi_req {
172738c8a9a5SSteve French struct smb_hdr hdr; /* wct = 15 */
172838c8a9a5SSteve French __le16 TotalParameterCount;
172938c8a9a5SSteve French __le16 TotalDataCount;
173038c8a9a5SSteve French __le16 MaxParameterCount;
173138c8a9a5SSteve French __le16 MaxDataCount;
173238c8a9a5SSteve French __u8 MaxSetupCount;
173338c8a9a5SSteve French __u8 Reserved;
173438c8a9a5SSteve French __le16 Flags;
173538c8a9a5SSteve French __le32 Timeout;
173638c8a9a5SSteve French __u16 Reserved2;
173738c8a9a5SSteve French __le16 ParameterCount;
173838c8a9a5SSteve French __le16 ParameterOffset;
173938c8a9a5SSteve French __le16 DataCount;
174038c8a9a5SSteve French __le16 DataOffset;
174138c8a9a5SSteve French __u8 SetupCount;
174238c8a9a5SSteve French __u8 Reserved3;
174338c8a9a5SSteve French __le16 SubCommand; /* one setup word */
174438c8a9a5SSteve French __le16 ByteCount;
174538c8a9a5SSteve French __u8 Pad;
174638c8a9a5SSteve French __u16 Pad1;
174738c8a9a5SSteve French __u16 Fid;
174838c8a9a5SSteve French __le16 InformationLevel;
174938c8a9a5SSteve French __u16 Reserved4;
175038c8a9a5SSteve French __u8 payload[];
175138c8a9a5SSteve French } __attribute__((packed));
175238c8a9a5SSteve French
175338c8a9a5SSteve French struct smb_com_transaction2_sfi_rsp {
175438c8a9a5SSteve French struct smb_hdr hdr; /* wct = 10 + SetupCount */
175538c8a9a5SSteve French struct trans2_resp t2;
175638c8a9a5SSteve French __u16 ByteCount;
175738c8a9a5SSteve French __u16 Reserved2; /* parameter word reserved - present for infolevels > 100 */
175838c8a9a5SSteve French } __attribute__((packed));
175938c8a9a5SSteve French
176038c8a9a5SSteve French struct smb_t2_qfi_req {
176138c8a9a5SSteve French struct smb_hdr hdr;
176238c8a9a5SSteve French struct trans2_req t2;
176338c8a9a5SSteve French __u8 Pad;
176438c8a9a5SSteve French __u16 Fid;
176538c8a9a5SSteve French __le16 InformationLevel;
176638c8a9a5SSteve French } __attribute__((packed));
176738c8a9a5SSteve French
176838c8a9a5SSteve French struct smb_t2_qfi_rsp {
176938c8a9a5SSteve French struct smb_hdr hdr; /* wct = 10 + SetupCount */
177038c8a9a5SSteve French struct trans2_resp t2;
177138c8a9a5SSteve French __u16 ByteCount;
177238c8a9a5SSteve French __u16 Reserved2; /* parameter word reserved - present for infolevels > 100 */
177338c8a9a5SSteve French } __attribute__((packed));
177438c8a9a5SSteve French
177538c8a9a5SSteve French /*
177638c8a9a5SSteve French * Flags on T2 FINDFIRST and FINDNEXT
177738c8a9a5SSteve French */
177838c8a9a5SSteve French #define CIFS_SEARCH_CLOSE_ALWAYS 0x0001
177938c8a9a5SSteve French #define CIFS_SEARCH_CLOSE_AT_END 0x0002
178038c8a9a5SSteve French #define CIFS_SEARCH_RETURN_RESUME 0x0004
178138c8a9a5SSteve French #define CIFS_SEARCH_CONTINUE_FROM_LAST 0x0008
178238c8a9a5SSteve French #define CIFS_SEARCH_BACKUP_SEARCH 0x0010
178338c8a9a5SSteve French
178438c8a9a5SSteve French /*
178538c8a9a5SSteve French * Size of the resume key on FINDFIRST and FINDNEXT calls
178638c8a9a5SSteve French */
178738c8a9a5SSteve French #define CIFS_SMB_RESUME_KEY_SIZE 4
178838c8a9a5SSteve French
178938c8a9a5SSteve French typedef struct smb_com_transaction2_ffirst_req {
179038c8a9a5SSteve French struct smb_hdr hdr; /* wct = 15 */
179138c8a9a5SSteve French __le16 TotalParameterCount;
179238c8a9a5SSteve French __le16 TotalDataCount;
179338c8a9a5SSteve French __le16 MaxParameterCount;
179438c8a9a5SSteve French __le16 MaxDataCount;
179538c8a9a5SSteve French __u8 MaxSetupCount;
179638c8a9a5SSteve French __u8 Reserved;
179738c8a9a5SSteve French __le16 Flags;
179838c8a9a5SSteve French __le32 Timeout;
179938c8a9a5SSteve French __u16 Reserved2;
180038c8a9a5SSteve French __le16 ParameterCount;
180138c8a9a5SSteve French __le16 ParameterOffset;
180238c8a9a5SSteve French __le16 DataCount;
180338c8a9a5SSteve French __le16 DataOffset;
180438c8a9a5SSteve French __u8 SetupCount; /* one */
180538c8a9a5SSteve French __u8 Reserved3;
180638c8a9a5SSteve French __le16 SubCommand; /* TRANS2_FIND_FIRST */
180738c8a9a5SSteve French __le16 ByteCount;
180838c8a9a5SSteve French __u8 Pad;
180938c8a9a5SSteve French __le16 SearchAttributes;
181038c8a9a5SSteve French __le16 SearchCount;
181138c8a9a5SSteve French __le16 SearchFlags;
181238c8a9a5SSteve French __le16 InformationLevel;
181338c8a9a5SSteve French __le32 SearchStorageType;
181438c8a9a5SSteve French char FileName[];
181538c8a9a5SSteve French } __attribute__((packed)) TRANSACTION2_FFIRST_REQ;
181638c8a9a5SSteve French
181738c8a9a5SSteve French typedef struct smb_com_transaction2_ffirst_rsp {
181838c8a9a5SSteve French struct smb_hdr hdr; /* wct = 10 */
181938c8a9a5SSteve French struct trans2_resp t2;
182038c8a9a5SSteve French __u16 ByteCount;
182138c8a9a5SSteve French } __attribute__((packed)) TRANSACTION2_FFIRST_RSP;
182238c8a9a5SSteve French
182338c8a9a5SSteve French typedef struct smb_com_transaction2_ffirst_rsp_parms {
182438c8a9a5SSteve French __u16 SearchHandle;
182538c8a9a5SSteve French __le16 SearchCount;
182638c8a9a5SSteve French __le16 EndofSearch;
182738c8a9a5SSteve French __le16 EAErrorOffset;
182838c8a9a5SSteve French __le16 LastNameOffset;
182938c8a9a5SSteve French } __attribute__((packed)) T2_FFIRST_RSP_PARMS;
183038c8a9a5SSteve French
183138c8a9a5SSteve French typedef struct smb_com_transaction2_fnext_req {
183238c8a9a5SSteve French struct smb_hdr hdr; /* wct = 15 */
183338c8a9a5SSteve French __le16 TotalParameterCount;
183438c8a9a5SSteve French __le16 TotalDataCount;
183538c8a9a5SSteve French __le16 MaxParameterCount;
183638c8a9a5SSteve French __le16 MaxDataCount;
183738c8a9a5SSteve French __u8 MaxSetupCount;
183838c8a9a5SSteve French __u8 Reserved;
183938c8a9a5SSteve French __le16 Flags;
184038c8a9a5SSteve French __le32 Timeout;
184138c8a9a5SSteve French __u16 Reserved2;
184238c8a9a5SSteve French __le16 ParameterCount;
184338c8a9a5SSteve French __le16 ParameterOffset;
184438c8a9a5SSteve French __le16 DataCount;
184538c8a9a5SSteve French __le16 DataOffset;
184638c8a9a5SSteve French __u8 SetupCount; /* one */
184738c8a9a5SSteve French __u8 Reserved3;
184838c8a9a5SSteve French __le16 SubCommand; /* TRANS2_FIND_NEXT */
184938c8a9a5SSteve French __le16 ByteCount;
185038c8a9a5SSteve French __u8 Pad;
185138c8a9a5SSteve French __u16 SearchHandle;
185238c8a9a5SSteve French __le16 SearchCount;
185338c8a9a5SSteve French __le16 InformationLevel;
185438c8a9a5SSteve French __u32 ResumeKey;
185538c8a9a5SSteve French __le16 SearchFlags;
185638c8a9a5SSteve French char ResumeFileName[];
185738c8a9a5SSteve French } __attribute__((packed)) TRANSACTION2_FNEXT_REQ;
185838c8a9a5SSteve French
185938c8a9a5SSteve French typedef struct smb_com_transaction2_fnext_rsp {
186038c8a9a5SSteve French struct smb_hdr hdr; /* wct = 10 */
186138c8a9a5SSteve French struct trans2_resp t2;
186238c8a9a5SSteve French __u16 ByteCount;
186338c8a9a5SSteve French } __attribute__((packed)) TRANSACTION2_FNEXT_RSP;
186438c8a9a5SSteve French
186538c8a9a5SSteve French typedef struct smb_com_transaction2_fnext_rsp_parms {
186638c8a9a5SSteve French __le16 SearchCount;
186738c8a9a5SSteve French __le16 EndofSearch;
186838c8a9a5SSteve French __le16 EAErrorOffset;
186938c8a9a5SSteve French __le16 LastNameOffset;
187038c8a9a5SSteve French } __attribute__((packed)) T2_FNEXT_RSP_PARMS;
187138c8a9a5SSteve French
187238c8a9a5SSteve French /* QFSInfo Levels */
187338c8a9a5SSteve French #define SMB_INFO_ALLOCATION 1
187438c8a9a5SSteve French #define SMB_INFO_VOLUME 2
187538c8a9a5SSteve French #define SMB_QUERY_FS_VOLUME_INFO 0x102
187638c8a9a5SSteve French #define SMB_QUERY_FS_SIZE_INFO 0x103
187738c8a9a5SSteve French #define SMB_QUERY_FS_DEVICE_INFO 0x104
187838c8a9a5SSteve French #define SMB_QUERY_FS_ATTRIBUTE_INFO 0x105
187938c8a9a5SSteve French #define SMB_QUERY_CIFS_UNIX_INFO 0x200
188038c8a9a5SSteve French #define SMB_QUERY_POSIX_FS_INFO 0x201
188138c8a9a5SSteve French #define SMB_QUERY_POSIX_WHO_AM_I 0x202
188238c8a9a5SSteve French #define SMB_REQUEST_TRANSPORT_ENCRYPTION 0x203
188338c8a9a5SSteve French #define SMB_QUERY_FS_PROXY 0x204 /* WAFS enabled. Returns structure
188438c8a9a5SSteve French FILE_SYSTEM__UNIX_INFO to tell
188538c8a9a5SSteve French whether new NTIOCTL available
188638c8a9a5SSteve French (0xACE) for WAN friendly SMB
188738c8a9a5SSteve French operations to be carried */
188838c8a9a5SSteve French #define SMB_QUERY_LABEL_INFO 0x3ea
188938c8a9a5SSteve French #define SMB_QUERY_FS_QUOTA_INFO 0x3ee
189038c8a9a5SSteve French #define SMB_QUERY_FS_FULL_SIZE_INFO 0x3ef
189138c8a9a5SSteve French #define SMB_QUERY_OBJECTID_INFO 0x3f0
189238c8a9a5SSteve French
189338c8a9a5SSteve French typedef struct smb_com_transaction2_qfsi_req {
189438c8a9a5SSteve French struct smb_hdr hdr; /* wct = 14+ */
189538c8a9a5SSteve French __le16 TotalParameterCount;
189638c8a9a5SSteve French __le16 TotalDataCount;
189738c8a9a5SSteve French __le16 MaxParameterCount;
189838c8a9a5SSteve French __le16 MaxDataCount;
189938c8a9a5SSteve French __u8 MaxSetupCount;
190038c8a9a5SSteve French __u8 Reserved;
190138c8a9a5SSteve French __le16 Flags;
190238c8a9a5SSteve French __le32 Timeout;
190338c8a9a5SSteve French __u16 Reserved2;
190438c8a9a5SSteve French __le16 ParameterCount;
190538c8a9a5SSteve French __le16 ParameterOffset;
190638c8a9a5SSteve French __le16 DataCount;
190738c8a9a5SSteve French __le16 DataOffset;
190838c8a9a5SSteve French __u8 SetupCount;
190938c8a9a5SSteve French __u8 Reserved3;
191038c8a9a5SSteve French __le16 SubCommand; /* one setup word */
191138c8a9a5SSteve French __le16 ByteCount;
191238c8a9a5SSteve French __u8 Pad;
191338c8a9a5SSteve French __le16 InformationLevel;
191438c8a9a5SSteve French } __attribute__((packed)) TRANSACTION2_QFSI_REQ;
191538c8a9a5SSteve French
191638c8a9a5SSteve French typedef struct smb_com_transaction_qfsi_rsp {
191738c8a9a5SSteve French struct smb_hdr hdr; /* wct = 10 + SetupCount */
191838c8a9a5SSteve French struct trans2_resp t2;
191938c8a9a5SSteve French __u16 ByteCount;
192038c8a9a5SSteve French __u8 Pad; /* may be three bytes? *//* followed by data area */
192138c8a9a5SSteve French } __attribute__((packed)) TRANSACTION2_QFSI_RSP;
192238c8a9a5SSteve French
192338c8a9a5SSteve French typedef struct whoami_rsp_data { /* Query level 0x202 */
192438c8a9a5SSteve French __u32 flags; /* 0 = Authenticated user 1 = GUEST */
192538c8a9a5SSteve French __u32 mask; /* which flags bits server understands ie 0x0001 */
192638c8a9a5SSteve French __u64 unix_user_id;
192738c8a9a5SSteve French __u64 unix_user_gid;
192838c8a9a5SSteve French __u32 number_of_supplementary_gids; /* may be zero */
192938c8a9a5SSteve French __u32 number_of_sids; /* may be zero */
193038c8a9a5SSteve French __u32 length_of_sid_array; /* in bytes - may be zero */
193138c8a9a5SSteve French __u32 pad; /* reserved - MBZ */
193238c8a9a5SSteve French /* __u64 gid_array[0]; */ /* may be empty */
193338c8a9a5SSteve French /* __u8 * psid_list */ /* may be empty */
193438c8a9a5SSteve French } __attribute__((packed)) WHOAMI_RSP_DATA;
193538c8a9a5SSteve French
193638c8a9a5SSteve French /* SETFSInfo Levels */
193738c8a9a5SSteve French #define SMB_SET_CIFS_UNIX_INFO 0x200
193838c8a9a5SSteve French /* level 0x203 is defined above in list of QFS info levels */
193938c8a9a5SSteve French /* #define SMB_REQUEST_TRANSPORT_ENCRYPTION 0x203 */
194038c8a9a5SSteve French
194138c8a9a5SSteve French /* Level 0x200 request structure follows */
194238c8a9a5SSteve French typedef struct smb_com_transaction2_setfsi_req {
194338c8a9a5SSteve French struct smb_hdr hdr; /* wct = 15 */
194438c8a9a5SSteve French __le16 TotalParameterCount;
194538c8a9a5SSteve French __le16 TotalDataCount;
194638c8a9a5SSteve French __le16 MaxParameterCount;
194738c8a9a5SSteve French __le16 MaxDataCount;
194838c8a9a5SSteve French __u8 MaxSetupCount;
194938c8a9a5SSteve French __u8 Reserved;
195038c8a9a5SSteve French __le16 Flags;
195138c8a9a5SSteve French __le32 Timeout;
195238c8a9a5SSteve French __u16 Reserved2;
195338c8a9a5SSteve French __le16 ParameterCount; /* 4 */
195438c8a9a5SSteve French __le16 ParameterOffset;
195538c8a9a5SSteve French __le16 DataCount; /* 12 */
195638c8a9a5SSteve French __le16 DataOffset;
195738c8a9a5SSteve French __u8 SetupCount; /* one */
195838c8a9a5SSteve French __u8 Reserved3;
195938c8a9a5SSteve French __le16 SubCommand; /* TRANS2_SET_FS_INFORMATION */
196038c8a9a5SSteve French __le16 ByteCount;
196138c8a9a5SSteve French __u8 Pad;
196238c8a9a5SSteve French __u16 FileNum; /* Parameters start. */
196338c8a9a5SSteve French __le16 InformationLevel;/* Parameters end. */
196438c8a9a5SSteve French __le16 ClientUnixMajor; /* Data start. */
196538c8a9a5SSteve French __le16 ClientUnixMinor;
196638c8a9a5SSteve French __le64 ClientUnixCap; /* Data end */
196738c8a9a5SSteve French } __attribute__((packed)) TRANSACTION2_SETFSI_REQ;
196838c8a9a5SSteve French
196938c8a9a5SSteve French /* level 0x203 request structure follows */
197038c8a9a5SSteve French typedef struct smb_com_transaction2_setfs_enc_req {
197138c8a9a5SSteve French struct smb_hdr hdr; /* wct = 15 */
197238c8a9a5SSteve French __le16 TotalParameterCount;
197338c8a9a5SSteve French __le16 TotalDataCount;
197438c8a9a5SSteve French __le16 MaxParameterCount;
197538c8a9a5SSteve French __le16 MaxDataCount;
197638c8a9a5SSteve French __u8 MaxSetupCount;
197738c8a9a5SSteve French __u8 Reserved;
197838c8a9a5SSteve French __le16 Flags;
197938c8a9a5SSteve French __le32 Timeout;
198038c8a9a5SSteve French __u16 Reserved2;
198138c8a9a5SSteve French __le16 ParameterCount; /* 4 */
198238c8a9a5SSteve French __le16 ParameterOffset;
198338c8a9a5SSteve French __le16 DataCount; /* 12 */
198438c8a9a5SSteve French __le16 DataOffset;
198538c8a9a5SSteve French __u8 SetupCount; /* one */
198638c8a9a5SSteve French __u8 Reserved3;
198738c8a9a5SSteve French __le16 SubCommand; /* TRANS2_SET_FS_INFORMATION */
198838c8a9a5SSteve French __le16 ByteCount;
198938c8a9a5SSteve French __u8 Pad;
199038c8a9a5SSteve French __u16 Reserved4; /* Parameters start. */
199138c8a9a5SSteve French __le16 InformationLevel;/* Parameters end. */
199238c8a9a5SSteve French /* NTLMSSP Blob, Data start. */
199338c8a9a5SSteve French } __attribute__((packed)) TRANSACTION2_SETFSI_ENC_REQ;
199438c8a9a5SSteve French
199538c8a9a5SSteve French /* response for setfsinfo levels 0x200 and 0x203 */
199638c8a9a5SSteve French typedef struct smb_com_transaction2_setfsi_rsp {
199738c8a9a5SSteve French struct smb_hdr hdr; /* wct = 10 */
199838c8a9a5SSteve French struct trans2_resp t2;
199938c8a9a5SSteve French __u16 ByteCount;
200038c8a9a5SSteve French } __attribute__((packed)) TRANSACTION2_SETFSI_RSP;
200138c8a9a5SSteve French
200238c8a9a5SSteve French typedef struct smb_com_transaction2_get_dfs_refer_req {
200338c8a9a5SSteve French struct smb_hdr hdr; /* wct = 15 */
200438c8a9a5SSteve French __le16 TotalParameterCount;
200538c8a9a5SSteve French __le16 TotalDataCount;
200638c8a9a5SSteve French __le16 MaxParameterCount;
200738c8a9a5SSteve French __le16 MaxDataCount;
200838c8a9a5SSteve French __u8 MaxSetupCount;
200938c8a9a5SSteve French __u8 Reserved;
201038c8a9a5SSteve French __le16 Flags;
201138c8a9a5SSteve French __le32 Timeout;
201238c8a9a5SSteve French __u16 Reserved2;
201338c8a9a5SSteve French __le16 ParameterCount;
201438c8a9a5SSteve French __le16 ParameterOffset;
201538c8a9a5SSteve French __le16 DataCount;
201638c8a9a5SSteve French __le16 DataOffset;
201738c8a9a5SSteve French __u8 SetupCount;
201838c8a9a5SSteve French __u8 Reserved3;
201938c8a9a5SSteve French __le16 SubCommand; /* one setup word */
202038c8a9a5SSteve French __le16 ByteCount;
202138c8a9a5SSteve French __u8 Pad[3]; /* Win2K has sent 0x0F01 (max response length
202238c8a9a5SSteve French perhaps?) followed by one byte pad - doesn't
202338c8a9a5SSteve French seem to matter though */
202438c8a9a5SSteve French __le16 MaxReferralLevel;
202538c8a9a5SSteve French char RequestFileName[];
202638c8a9a5SSteve French } __attribute__((packed)) TRANSACTION2_GET_DFS_REFER_REQ;
202738c8a9a5SSteve French
202838c8a9a5SSteve French #define DFS_VERSION cpu_to_le16(0x0003)
202938c8a9a5SSteve French
203038c8a9a5SSteve French /* DFS server target type */
203138c8a9a5SSteve French #define DFS_TYPE_LINK 0x0000 /* also for sysvol targets */
203238c8a9a5SSteve French #define DFS_TYPE_ROOT 0x0001
203338c8a9a5SSteve French
203438c8a9a5SSteve French /* Referral Entry Flags */
203538c8a9a5SSteve French #define DFS_NAME_LIST_REF 0x0200 /* set for domain or DC referral responses */
203638c8a9a5SSteve French #define DFS_TARGET_SET_BOUNDARY 0x0400 /* only valid with version 4 dfs req */
203738c8a9a5SSteve French
203838c8a9a5SSteve French typedef struct dfs_referral_level_3 { /* version 4 is same, + one flag bit */
203938c8a9a5SSteve French __le16 VersionNumber; /* must be 3 or 4 */
204038c8a9a5SSteve French __le16 Size;
204138c8a9a5SSteve French __le16 ServerType; /* 0x0001 = root targets; 0x0000 = link targets */
204238c8a9a5SSteve French __le16 ReferralEntryFlags;
204338c8a9a5SSteve French __le32 TimeToLive;
204438c8a9a5SSteve French __le16 DfsPathOffset;
204538c8a9a5SSteve French __le16 DfsAlternatePathOffset;
204638c8a9a5SSteve French __le16 NetworkAddressOffset; /* offset of the link target */
204738c8a9a5SSteve French __u8 ServiceSiteGuid[16]; /* MBZ, ignored */
204838c8a9a5SSteve French } __attribute__((packed)) REFERRAL3;
204938c8a9a5SSteve French
205038c8a9a5SSteve French struct get_dfs_referral_rsp {
205138c8a9a5SSteve French __le16 PathConsumed;
205238c8a9a5SSteve French __le16 NumberOfReferrals;
205338c8a9a5SSteve French __le32 DFSFlags;
205438c8a9a5SSteve French REFERRAL3 referrals[]; /* array of level 3 dfs_referral structures */
205538c8a9a5SSteve French /* followed by the strings pointed to by the referral structures */
205638c8a9a5SSteve French } __packed;
205738c8a9a5SSteve French
205838c8a9a5SSteve French typedef struct smb_com_transaction_get_dfs_refer_rsp {
205938c8a9a5SSteve French struct smb_hdr hdr; /* wct = 10 */
206038c8a9a5SSteve French struct trans2_resp t2;
206138c8a9a5SSteve French __u16 ByteCount;
206238c8a9a5SSteve French __u8 Pad;
206338c8a9a5SSteve French struct get_dfs_referral_rsp dfs_data;
206438c8a9a5SSteve French } __packed TRANSACTION2_GET_DFS_REFER_RSP;
206538c8a9a5SSteve French
206638c8a9a5SSteve French /* DFS Flags */
206738c8a9a5SSteve French #define DFSREF_REFERRAL_SERVER 0x00000001 /* all targets are DFS roots */
206838c8a9a5SSteve French #define DFSREF_STORAGE_SERVER 0x00000002 /* no further ref requests needed */
206938c8a9a5SSteve French #define DFSREF_TARGET_FAILBACK 0x00000004 /* only for DFS referral version 4 */
207038c8a9a5SSteve French
207138c8a9a5SSteve French /*
207238c8a9a5SSteve French ************************************************************************
207338c8a9a5SSteve French * All structs for everything above the SMB PDUs themselves
207438c8a9a5SSteve French * (such as the T2 level specific data) go here
207538c8a9a5SSteve French ************************************************************************
207638c8a9a5SSteve French */
207738c8a9a5SSteve French
207838c8a9a5SSteve French /*
207938c8a9a5SSteve French * Information on a server
208038c8a9a5SSteve French */
208138c8a9a5SSteve French
208238c8a9a5SSteve French struct serverInfo {
208338c8a9a5SSteve French char name[16];
208438c8a9a5SSteve French unsigned char versionMajor;
208538c8a9a5SSteve French unsigned char versionMinor;
208638c8a9a5SSteve French unsigned long type;
208738c8a9a5SSteve French unsigned int commentOffset;
208838c8a9a5SSteve French } __attribute__((packed));
208938c8a9a5SSteve French
209038c8a9a5SSteve French /*
209138c8a9a5SSteve French * The following structure is the format of the data returned on a NetShareEnum
209238c8a9a5SSteve French * with level "90" (x5A)
209338c8a9a5SSteve French */
209438c8a9a5SSteve French
209538c8a9a5SSteve French struct shareInfo {
209638c8a9a5SSteve French char shareName[13];
209738c8a9a5SSteve French char pad;
209838c8a9a5SSteve French unsigned short type;
209938c8a9a5SSteve French unsigned int commentOffset;
210038c8a9a5SSteve French } __attribute__((packed));
210138c8a9a5SSteve French
210238c8a9a5SSteve French struct aliasInfo {
210338c8a9a5SSteve French char aliasName[9];
210438c8a9a5SSteve French char pad;
210538c8a9a5SSteve French unsigned int commentOffset;
210638c8a9a5SSteve French unsigned char type[2];
210738c8a9a5SSteve French } __attribute__((packed));
210838c8a9a5SSteve French
210938c8a9a5SSteve French struct aliasInfo92 {
211038c8a9a5SSteve French int aliasNameOffset;
211138c8a9a5SSteve French int serverNameOffset;
211238c8a9a5SSteve French int shareNameOffset;
211338c8a9a5SSteve French } __attribute__((packed));
211438c8a9a5SSteve French
211538c8a9a5SSteve French typedef struct {
211638c8a9a5SSteve French __le64 TotalAllocationUnits;
211738c8a9a5SSteve French __le64 FreeAllocationUnits;
211838c8a9a5SSteve French __le32 SectorsPerAllocationUnit;
211938c8a9a5SSteve French __le32 BytesPerSector;
212038c8a9a5SSteve French } __attribute__((packed)) FILE_SYSTEM_INFO; /* size info, level 0x103 */
212138c8a9a5SSteve French
212238c8a9a5SSteve French typedef struct {
212338c8a9a5SSteve French __le32 fsid;
212438c8a9a5SSteve French __le32 SectorsPerAllocationUnit;
212538c8a9a5SSteve French __le32 TotalAllocationUnits;
212638c8a9a5SSteve French __le32 FreeAllocationUnits;
212738c8a9a5SSteve French __le16 BytesPerSector;
212838c8a9a5SSteve French } __attribute__((packed)) FILE_SYSTEM_ALLOC_INFO;
212938c8a9a5SSteve French
213038c8a9a5SSteve French typedef struct {
213138c8a9a5SSteve French __le16 MajorVersionNumber;
213238c8a9a5SSteve French __le16 MinorVersionNumber;
213338c8a9a5SSteve French __le64 Capability;
213438c8a9a5SSteve French } __attribute__((packed)) FILE_SYSTEM_UNIX_INFO; /* Unix extension level 0x200*/
213538c8a9a5SSteve French
213638c8a9a5SSteve French /* Version numbers for CIFS UNIX major and minor. */
213738c8a9a5SSteve French #define CIFS_UNIX_MAJOR_VERSION 1
213838c8a9a5SSteve French #define CIFS_UNIX_MINOR_VERSION 0
213938c8a9a5SSteve French
214038c8a9a5SSteve French /* Linux/Unix extensions capability flags */
214138c8a9a5SSteve French #define CIFS_UNIX_FCNTL_CAP 0x00000001 /* support for fcntl locks */
214238c8a9a5SSteve French #define CIFS_UNIX_POSIX_ACL_CAP 0x00000002 /* support getfacl/setfacl */
214338c8a9a5SSteve French #define CIFS_UNIX_XATTR_CAP 0x00000004 /* support new namespace */
214438c8a9a5SSteve French #define CIFS_UNIX_EXTATTR_CAP 0x00000008 /* support chattr/chflag */
214538c8a9a5SSteve French #define CIFS_UNIX_POSIX_PATHNAMES_CAP 0x00000010 /* Allow POSIX path chars */
214638c8a9a5SSteve French #define CIFS_UNIX_POSIX_PATH_OPS_CAP 0x00000020 /* Allow new POSIX path based
214738c8a9a5SSteve French calls including posix open
214838c8a9a5SSteve French and posix unlink */
214938c8a9a5SSteve French #define CIFS_UNIX_LARGE_READ_CAP 0x00000040 /* support reads >128K (up to 0xFFFF00 */
215038c8a9a5SSteve French #define CIFS_UNIX_LARGE_WRITE_CAP 0x00000080
215138c8a9a5SSteve French #define CIFS_UNIX_TRANSPORT_ENCRYPTION_CAP 0x00000100 /* can do SPNEGO crypt */
215238c8a9a5SSteve French #define CIFS_UNIX_TRANSPORT_ENCRYPTION_MANDATORY_CAP 0x00000200 /* must do */
215338c8a9a5SSteve French #define CIFS_UNIX_PROXY_CAP 0x00000400 /* Proxy cap: 0xACE ioctl and QFS PROXY call */
215438c8a9a5SSteve French #ifdef CONFIG_CIFS_POSIX
215538c8a9a5SSteve French /* presumably don't need the 0x20 POSIX_PATH_OPS_CAP since we never send
215638c8a9a5SSteve French LockingX instead of posix locking call on unix sess (and we do not expect
215738c8a9a5SSteve French LockingX to use different (ie Windows) semantics than posix locking on
215838c8a9a5SSteve French the same session (if WINE needs to do this later, we can add this cap
215938c8a9a5SSteve French back in later */
216038c8a9a5SSteve French /* #define CIFS_UNIX_CAP_MASK 0x000000fb */
216138c8a9a5SSteve French #define CIFS_UNIX_CAP_MASK 0x000003db
216238c8a9a5SSteve French #else
216338c8a9a5SSteve French #define CIFS_UNIX_CAP_MASK 0x00000013
216438c8a9a5SSteve French #endif /* CONFIG_CIFS_POSIX */
216538c8a9a5SSteve French
216638c8a9a5SSteve French
216738c8a9a5SSteve French #define CIFS_POSIX_EXTENSIONS 0x00000010 /* support for new QFSInfo */
216838c8a9a5SSteve French
216938c8a9a5SSteve French typedef struct {
217038c8a9a5SSteve French /* For undefined recommended transfer size return -1 in that field */
217138c8a9a5SSteve French __le32 OptimalTransferSize; /* bsize on some os, iosize on other os */
217238c8a9a5SSteve French __le32 BlockSize;
217338c8a9a5SSteve French /* The next three fields are in terms of the block size.
217438c8a9a5SSteve French (above). If block size is unknown, 4096 would be a
217538c8a9a5SSteve French reasonable block size for a server to report.
217638c8a9a5SSteve French Note that returning the blocks/blocksavail removes need
217738c8a9a5SSteve French to make a second call (to QFSInfo level 0x103 to get this info.
217838c8a9a5SSteve French UserBlockAvail is typically less than or equal to BlocksAvail,
217938c8a9a5SSteve French if no distinction is made return the same value in each */
218038c8a9a5SSteve French __le64 TotalBlocks;
218138c8a9a5SSteve French __le64 BlocksAvail; /* bfree */
218238c8a9a5SSteve French __le64 UserBlocksAvail; /* bavail */
218338c8a9a5SSteve French /* For undefined Node fields or FSID return -1 */
218438c8a9a5SSteve French __le64 TotalFileNodes;
218538c8a9a5SSteve French __le64 FreeFileNodes;
218638c8a9a5SSteve French __le64 FileSysIdentifier; /* fsid */
218738c8a9a5SSteve French /* NB Namelen comes from FILE_SYSTEM_ATTRIBUTE_INFO call */
218838c8a9a5SSteve French /* NB flags can come from FILE_SYSTEM_DEVICE_INFO call */
218938c8a9a5SSteve French } __attribute__((packed)) FILE_SYSTEM_POSIX_INFO;
219038c8a9a5SSteve French
219138c8a9a5SSteve French /* DeviceType Flags */
219238c8a9a5SSteve French #define FILE_DEVICE_CD_ROM 0x00000002
219338c8a9a5SSteve French #define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
219438c8a9a5SSteve French #define FILE_DEVICE_DFS 0x00000006
219538c8a9a5SSteve French #define FILE_DEVICE_DISK 0x00000007
219638c8a9a5SSteve French #define FILE_DEVICE_DISK_FILE_SYSTEM 0x00000008
219738c8a9a5SSteve French #define FILE_DEVICE_FILE_SYSTEM 0x00000009
219838c8a9a5SSteve French #define FILE_DEVICE_NAMED_PIPE 0x00000011
219938c8a9a5SSteve French #define FILE_DEVICE_NETWORK 0x00000012
220038c8a9a5SSteve French #define FILE_DEVICE_NETWORK_FILE_SYSTEM 0x00000014
220138c8a9a5SSteve French #define FILE_DEVICE_NULL 0x00000015
220238c8a9a5SSteve French #define FILE_DEVICE_PARALLEL_PORT 0x00000016
220338c8a9a5SSteve French #define FILE_DEVICE_PRINTER 0x00000018
220438c8a9a5SSteve French #define FILE_DEVICE_SERIAL_PORT 0x0000001b
220538c8a9a5SSteve French #define FILE_DEVICE_STREAMS 0x0000001e
220638c8a9a5SSteve French #define FILE_DEVICE_TAPE 0x0000001f
220738c8a9a5SSteve French #define FILE_DEVICE_TAPE_FILE_SYSTEM 0x00000020
220838c8a9a5SSteve French #define FILE_DEVICE_VIRTUAL_DISK 0x00000024
220938c8a9a5SSteve French #define FILE_DEVICE_NETWORK_REDIRECTOR 0x00000028
221038c8a9a5SSteve French
221138c8a9a5SSteve French /* Device Characteristics */
221238c8a9a5SSteve French #define FILE_REMOVABLE_MEDIA 0x00000001
221338c8a9a5SSteve French #define FILE_READ_ONLY_DEVICE 0x00000002
221438c8a9a5SSteve French #define FILE_FLOPPY_DISKETTE 0x00000004
221538c8a9a5SSteve French #define FILE_WRITE_ONCE_MEDIA 0x00000008
221638c8a9a5SSteve French #define FILE_REMOTE_DEVICE 0x00000010
221738c8a9a5SSteve French #define FILE_DEVICE_IS_MOUNTED 0x00000020
221838c8a9a5SSteve French #define FILE_VIRTUAL_VOLUME 0x00000040
221938c8a9a5SSteve French #define FILE_DEVICE_SECURE_OPEN 0x00000100
222038c8a9a5SSteve French #define FILE_CHARACTERISTIC_TS_DEVICE 0x00001000
222138c8a9a5SSteve French #define FILE_CHARACTERISTIC_WEBDAV_DEVICE 0x00002000
222238c8a9a5SSteve French #define FILE_PORTABLE_DEVICE 0x00004000
222338c8a9a5SSteve French #define FILE_DEVICE_ALLOW_APPCONTAINER_TRAVERSAL 0x00020000
222438c8a9a5SSteve French
222538c8a9a5SSteve French typedef struct {
222638c8a9a5SSteve French __le32 DeviceType;
222738c8a9a5SSteve French __le32 DeviceCharacteristics;
222838c8a9a5SSteve French } __attribute__((packed)) FILE_SYSTEM_DEVICE_INFO; /* device info level 0x104 */
222938c8a9a5SSteve French
223038c8a9a5SSteve French /* minimum includes first three fields, and empty FS Name */
223138c8a9a5SSteve French #define MIN_FS_ATTR_INFO_SIZE 12
223238c8a9a5SSteve French
223338c8a9a5SSteve French
223438c8a9a5SSteve French /* List of FileSystemAttributes - see 2.5.1 of MS-FSCC */
223538c8a9a5SSteve French #define FILE_SUPPORTS_SPARSE_VDL 0x10000000 /* faster nonsparse extend */
223638c8a9a5SSteve French #define FILE_SUPPORTS_BLOCK_REFCOUNTING 0x08000000 /* allow ioctl dup extents */
223738c8a9a5SSteve French #define FILE_SUPPORT_INTEGRITY_STREAMS 0x04000000
223838c8a9a5SSteve French #define FILE_SUPPORTS_USN_JOURNAL 0x02000000
223938c8a9a5SSteve French #define FILE_SUPPORTS_OPEN_BY_FILE_ID 0x01000000
224038c8a9a5SSteve French #define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
224138c8a9a5SSteve French #define FILE_SUPPORTS_HARD_LINKS 0x00400000
224238c8a9a5SSteve French #define FILE_SUPPORTS_TRANSACTIONS 0x00200000
224338c8a9a5SSteve French #define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000
224438c8a9a5SSteve French #define FILE_READ_ONLY_VOLUME 0x00080000
224538c8a9a5SSteve French #define FILE_NAMED_STREAMS 0x00040000
224638c8a9a5SSteve French #define FILE_SUPPORTS_ENCRYPTION 0x00020000
224738c8a9a5SSteve French #define FILE_SUPPORTS_OBJECT_IDS 0x00010000
224838c8a9a5SSteve French #define FILE_VOLUME_IS_COMPRESSED 0x00008000
224938c8a9a5SSteve French #define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100
225038c8a9a5SSteve French #define FILE_SUPPORTS_REPARSE_POINTS 0x00000080
225138c8a9a5SSteve French #define FILE_SUPPORTS_SPARSE_FILES 0x00000040
225238c8a9a5SSteve French #define FILE_VOLUME_QUOTAS 0x00000020
225338c8a9a5SSteve French #define FILE_FILE_COMPRESSION 0x00000010
225438c8a9a5SSteve French #define FILE_PERSISTENT_ACLS 0x00000008
225538c8a9a5SSteve French #define FILE_UNICODE_ON_DISK 0x00000004
225638c8a9a5SSteve French #define FILE_CASE_PRESERVED_NAMES 0x00000002
225738c8a9a5SSteve French #define FILE_CASE_SENSITIVE_SEARCH 0x00000001
225838c8a9a5SSteve French typedef struct {
225938c8a9a5SSteve French __le32 Attributes;
226038c8a9a5SSteve French __le32 MaxPathNameComponentLength;
226138c8a9a5SSteve French __le32 FileSystemNameLen;
226238c8a9a5SSteve French char FileSystemName[52]; /* do not have to save this - get subset? */
226338c8a9a5SSteve French } __attribute__((packed)) FILE_SYSTEM_ATTRIBUTE_INFO;
226438c8a9a5SSteve French
226538c8a9a5SSteve French /******************************************************************************/
226638c8a9a5SSteve French /* QueryFileInfo/QueryPathinfo (also for SetPath/SetFile) data buffer formats */
226738c8a9a5SSteve French /******************************************************************************/
226838c8a9a5SSteve French typedef struct { /* data block encoding of response to level 263 QPathInfo */
2269*39ad3d61SGustavo A. R. Silva struct_group_attr(common_attributes, __packed,
227038c8a9a5SSteve French __le64 CreationTime;
227138c8a9a5SSteve French __le64 LastAccessTime;
227238c8a9a5SSteve French __le64 LastWriteTime;
227338c8a9a5SSteve French __le64 ChangeTime;
227438c8a9a5SSteve French __le32 Attributes;
22755ca51814SDmitry Antipov );
227638c8a9a5SSteve French __u32 Pad1;
227738c8a9a5SSteve French __le64 AllocationSize;
227838c8a9a5SSteve French __le64 EndOfFile; /* size ie offset to first free byte in file */
227938c8a9a5SSteve French __le32 NumberOfLinks; /* hard links */
228038c8a9a5SSteve French __u8 DeletePending;
228138c8a9a5SSteve French __u8 Directory;
228238c8a9a5SSteve French __u16 Pad2;
228338c8a9a5SSteve French __le64 IndexNumber;
228438c8a9a5SSteve French __le32 EASize;
228538c8a9a5SSteve French __le32 AccessFlags;
228638c8a9a5SSteve French __u64 IndexNumber1;
228738c8a9a5SSteve French __le64 CurrentByteOffset;
228838c8a9a5SSteve French __le32 Mode;
228938c8a9a5SSteve French __le32 AlignmentRequirement;
229038c8a9a5SSteve French __le32 FileNameLength;
229138c8a9a5SSteve French union {
229238c8a9a5SSteve French char __pad;
229338c8a9a5SSteve French DECLARE_FLEX_ARRAY(char, FileName);
229438c8a9a5SSteve French };
229538c8a9a5SSteve French } __attribute__((packed)) FILE_ALL_INFO; /* level 0x107 QPathInfo */
229638c8a9a5SSteve French
229738c8a9a5SSteve French typedef struct {
229838c8a9a5SSteve French __le64 AllocationSize;
229938c8a9a5SSteve French __le64 EndOfFile; /* size ie offset to first free byte in file */
230038c8a9a5SSteve French __le32 NumberOfLinks; /* hard links */
230138c8a9a5SSteve French __u8 DeletePending;
230238c8a9a5SSteve French __u8 Directory;
230338c8a9a5SSteve French __u16 Pad;
230438c8a9a5SSteve French } __attribute__((packed)) FILE_STANDARD_INFO; /* level 0x102 QPathInfo */
230538c8a9a5SSteve French
230638c8a9a5SSteve French
230738c8a9a5SSteve French /* defines for enumerating possible values of the Unix type field below */
230838c8a9a5SSteve French #define UNIX_FILE 0
230938c8a9a5SSteve French #define UNIX_DIR 1
231038c8a9a5SSteve French #define UNIX_SYMLINK 2
231138c8a9a5SSteve French #define UNIX_CHARDEV 3
231238c8a9a5SSteve French #define UNIX_BLOCKDEV 4
231338c8a9a5SSteve French #define UNIX_FIFO 5
231438c8a9a5SSteve French #define UNIX_SOCKET 6
231538c8a9a5SSteve French typedef struct {
231638c8a9a5SSteve French __le64 EndOfFile;
231738c8a9a5SSteve French __le64 NumOfBytes;
231838c8a9a5SSteve French __le64 LastStatusChange; /*SNIA specs DCE time for the 3 time fields */
231938c8a9a5SSteve French __le64 LastAccessTime;
232038c8a9a5SSteve French __le64 LastModificationTime;
232138c8a9a5SSteve French __le64 Uid;
232238c8a9a5SSteve French __le64 Gid;
232338c8a9a5SSteve French __le32 Type;
232438c8a9a5SSteve French __le64 DevMajor;
232538c8a9a5SSteve French __le64 DevMinor;
232638c8a9a5SSteve French __le64 UniqueId;
232738c8a9a5SSteve French __le64 Permissions;
232838c8a9a5SSteve French __le64 Nlinks;
232938c8a9a5SSteve French } __attribute__((packed)) FILE_UNIX_BASIC_INFO; /* level 0x200 QPathInfo */
233038c8a9a5SSteve French
233138c8a9a5SSteve French typedef struct {
233238c8a9a5SSteve French DECLARE_FLEX_ARRAY(char, LinkDest);
233338c8a9a5SSteve French } __attribute__((packed)) FILE_UNIX_LINK_INFO; /* level 0x201 QPathInfo */
233438c8a9a5SSteve French
233538c8a9a5SSteve French /* The following three structures are needed only for
233638c8a9a5SSteve French setting time to NT4 and some older servers via
233738c8a9a5SSteve French the primitive DOS time format */
233838c8a9a5SSteve French typedef struct {
233938c8a9a5SSteve French __u16 Day:5;
234038c8a9a5SSteve French __u16 Month:4;
234138c8a9a5SSteve French __u16 Year:7;
234238c8a9a5SSteve French } __attribute__((packed)) SMB_DATE;
234338c8a9a5SSteve French
234438c8a9a5SSteve French typedef struct {
234538c8a9a5SSteve French __u16 TwoSeconds:5;
234638c8a9a5SSteve French __u16 Minutes:6;
234738c8a9a5SSteve French __u16 Hours:5;
234838c8a9a5SSteve French } __attribute__((packed)) SMB_TIME;
234938c8a9a5SSteve French
235038c8a9a5SSteve French typedef struct {
235138c8a9a5SSteve French __le16 CreationDate; /* SMB Date see above */
235238c8a9a5SSteve French __le16 CreationTime; /* SMB Time */
235338c8a9a5SSteve French __le16 LastAccessDate;
235438c8a9a5SSteve French __le16 LastAccessTime;
235538c8a9a5SSteve French __le16 LastWriteDate;
235638c8a9a5SSteve French __le16 LastWriteTime;
235738c8a9a5SSteve French __le32 DataSize; /* File Size (EOF) */
235838c8a9a5SSteve French __le32 AllocationSize;
235938c8a9a5SSteve French __le16 Attributes; /* verify not u32 */
236038c8a9a5SSteve French __le32 EASize;
236138c8a9a5SSteve French } __attribute__((packed)) FILE_INFO_STANDARD; /* level 1 SetPath/FileInfo */
236238c8a9a5SSteve French
236338c8a9a5SSteve French typedef struct {
236438c8a9a5SSteve French __le64 CreationTime;
236538c8a9a5SSteve French __le64 LastAccessTime;
236638c8a9a5SSteve French __le64 LastWriteTime;
236738c8a9a5SSteve French __le64 ChangeTime;
236838c8a9a5SSteve French __le32 Attributes;
236938c8a9a5SSteve French __u32 Pad;
237038c8a9a5SSteve French } __attribute__((packed)) FILE_BASIC_INFO; /* size info, level 0x101 */
237138c8a9a5SSteve French
237238c8a9a5SSteve French struct file_allocation_info {
237338c8a9a5SSteve French __le64 AllocationSize; /* Note old Samba srvr rounds this up too much */
237438c8a9a5SSteve French } __packed; /* size used on disk, for level 0x103 for set, 0x105 for query */
237538c8a9a5SSteve French
237638c8a9a5SSteve French struct file_end_of_file_info {
237738c8a9a5SSteve French __le64 FileSize; /* offset to end of file */
237838c8a9a5SSteve French } __attribute__((packed)); /* size info, level 0x104 for set, 0x106 for query */
237938c8a9a5SSteve French
238038c8a9a5SSteve French struct file_alt_name_info {
238138c8a9a5SSteve French DECLARE_FLEX_ARRAY(__u8, alt_name);
238238c8a9a5SSteve French } __attribute__((packed)); /* level 0x0108 */
238338c8a9a5SSteve French
238438c8a9a5SSteve French struct file_stream_info {
238538c8a9a5SSteve French __le32 number_of_streams; /* BB check sizes and verify location */
238638c8a9a5SSteve French /* followed by info on streams themselves
238738c8a9a5SSteve French u64 size;
238838c8a9a5SSteve French u64 allocation_size
238938c8a9a5SSteve French stream info */
239038c8a9a5SSteve French }; /* level 0x109 */
239138c8a9a5SSteve French
239238c8a9a5SSteve French struct file_compression_info {
239338c8a9a5SSteve French __le64 compressed_size;
239438c8a9a5SSteve French __le16 format;
239538c8a9a5SSteve French __u8 unit_shift;
239638c8a9a5SSteve French __u8 ch_shift;
239738c8a9a5SSteve French __u8 cl_shift;
239838c8a9a5SSteve French __u8 pad[3];
239938c8a9a5SSteve French } __attribute__((packed)); /* level 0x10b */
240038c8a9a5SSteve French
240138c8a9a5SSteve French /* POSIX ACL set/query path info structures */
240238c8a9a5SSteve French #define CIFS_ACL_VERSION 1
240338c8a9a5SSteve French struct cifs_posix_ace { /* access control entry (ACE) */
240438c8a9a5SSteve French __u8 cifs_e_tag;
240538c8a9a5SSteve French __u8 cifs_e_perm;
240638c8a9a5SSteve French __le64 cifs_uid; /* or gid */
240738c8a9a5SSteve French } __attribute__((packed));
240838c8a9a5SSteve French
240938c8a9a5SSteve French struct cifs_posix_acl { /* access conrol list (ACL) */
241038c8a9a5SSteve French __le16 version;
241138c8a9a5SSteve French __le16 access_entry_count; /* access ACL - count of entries */
241238c8a9a5SSteve French __le16 default_entry_count; /* default ACL - count of entries */
241338c8a9a5SSteve French struct cifs_posix_ace ace_array[];
241438c8a9a5SSteve French /* followed by struct cifs_posix_ace default_ace_array[] */
241538c8a9a5SSteve French } __attribute__((packed)); /* level 0x204 */
241638c8a9a5SSteve French
241738c8a9a5SSteve French /* types of access control entries already defined in posix_acl.h */
241838c8a9a5SSteve French /* #define CIFS_POSIX_ACL_USER_OBJ 0x01
241938c8a9a5SSteve French #define CIFS_POSIX_ACL_USER 0x02
242038c8a9a5SSteve French #define CIFS_POSIX_ACL_GROUP_OBJ 0x04
242138c8a9a5SSteve French #define CIFS_POSIX_ACL_GROUP 0x08
242238c8a9a5SSteve French #define CIFS_POSIX_ACL_MASK 0x10
242338c8a9a5SSteve French #define CIFS_POSIX_ACL_OTHER 0x20 */
242438c8a9a5SSteve French
242538c8a9a5SSteve French /* types of perms */
242638c8a9a5SSteve French /* #define CIFS_POSIX_ACL_EXECUTE 0x01
242738c8a9a5SSteve French #define CIFS_POSIX_ACL_WRITE 0x02
242838c8a9a5SSteve French #define CIFS_POSIX_ACL_READ 0x04 */
242938c8a9a5SSteve French
243038c8a9a5SSteve French /* end of POSIX ACL definitions */
243138c8a9a5SSteve French
243238c8a9a5SSteve French /* POSIX Open Flags */
243338c8a9a5SSteve French #define SMB_O_RDONLY 0x1
243438c8a9a5SSteve French #define SMB_O_WRONLY 0x2
243538c8a9a5SSteve French #define SMB_O_RDWR 0x4
243638c8a9a5SSteve French #define SMB_O_CREAT 0x10
243738c8a9a5SSteve French #define SMB_O_EXCL 0x20
243838c8a9a5SSteve French #define SMB_O_TRUNC 0x40
243938c8a9a5SSteve French #define SMB_O_APPEND 0x80
244038c8a9a5SSteve French #define SMB_O_SYNC 0x100
244138c8a9a5SSteve French #define SMB_O_DIRECTORY 0x200
244238c8a9a5SSteve French #define SMB_O_NOFOLLOW 0x400
244338c8a9a5SSteve French #define SMB_O_DIRECT 0x800
244438c8a9a5SSteve French
244538c8a9a5SSteve French typedef struct {
244638c8a9a5SSteve French __le32 OpenFlags; /* same as NT CreateX */
244738c8a9a5SSteve French __le32 PosixOpenFlags;
244838c8a9a5SSteve French __le64 Permissions;
244938c8a9a5SSteve French __le16 Level; /* reply level requested (see QPathInfo levels) */
245038c8a9a5SSteve French } __attribute__((packed)) OPEN_PSX_REQ; /* level 0x209 SetPathInfo data */
245138c8a9a5SSteve French
245238c8a9a5SSteve French typedef struct {
245338c8a9a5SSteve French __le16 OplockFlags;
245438c8a9a5SSteve French __u16 Fid;
245538c8a9a5SSteve French __le32 CreateAction;
245638c8a9a5SSteve French __le16 ReturnedLevel;
245738c8a9a5SSteve French __le16 Pad;
245838c8a9a5SSteve French /* struct following varies based on requested level */
245938c8a9a5SSteve French } __attribute__((packed)) OPEN_PSX_RSP; /* level 0x209 SetPathInfo data */
246038c8a9a5SSteve French
246138c8a9a5SSteve French #define SMB_POSIX_UNLINK_FILE_TARGET 0
246238c8a9a5SSteve French #define SMB_POSIX_UNLINK_DIRECTORY_TARGET 1
246338c8a9a5SSteve French
246438c8a9a5SSteve French struct unlink_psx_rq { /* level 0x20a SetPathInfo */
246538c8a9a5SSteve French __le16 type;
246638c8a9a5SSteve French } __attribute__((packed));
246738c8a9a5SSteve French
246838c8a9a5SSteve French struct file_internal_info {
246938c8a9a5SSteve French __le64 UniqueId; /* inode number */
247038c8a9a5SSteve French } __attribute__((packed)); /* level 0x3ee */
247138c8a9a5SSteve French
247238c8a9a5SSteve French struct file_mode_info {
247338c8a9a5SSteve French __le32 Mode;
247438c8a9a5SSteve French } __attribute__((packed)); /* level 0x3f8 */
247538c8a9a5SSteve French
247638c8a9a5SSteve French struct file_attrib_tag {
247738c8a9a5SSteve French __le32 Attribute;
247838c8a9a5SSteve French __le32 ReparseTag;
247938c8a9a5SSteve French } __attribute__((packed)); /* level 0x40b */
248038c8a9a5SSteve French
248138c8a9a5SSteve French
248238c8a9a5SSteve French /********************************************************/
248338c8a9a5SSteve French /* FindFirst/FindNext transact2 data buffer formats */
248438c8a9a5SSteve French /********************************************************/
248538c8a9a5SSteve French
248638c8a9a5SSteve French typedef struct {
248738c8a9a5SSteve French __le32 NextEntryOffset;
248838c8a9a5SSteve French __u32 ResumeKey; /* as with FileIndex - no need to convert */
248938c8a9a5SSteve French FILE_UNIX_BASIC_INFO basic;
249038c8a9a5SSteve French union {
249138c8a9a5SSteve French char __pad;
249238c8a9a5SSteve French DECLARE_FLEX_ARRAY(char, FileName);
249338c8a9a5SSteve French };
249438c8a9a5SSteve French } __attribute__((packed)) FILE_UNIX_INFO; /* level 0x202 */
249538c8a9a5SSteve French
249638c8a9a5SSteve French typedef struct {
249738c8a9a5SSteve French __le32 NextEntryOffset;
249838c8a9a5SSteve French __u32 FileIndex;
249938c8a9a5SSteve French __le64 CreationTime;
250038c8a9a5SSteve French __le64 LastAccessTime;
250138c8a9a5SSteve French __le64 LastWriteTime;
250238c8a9a5SSteve French __le64 ChangeTime;
250338c8a9a5SSteve French __le64 EndOfFile;
250438c8a9a5SSteve French __le64 AllocationSize;
250538c8a9a5SSteve French __le32 ExtFileAttributes;
250638c8a9a5SSteve French __le32 FileNameLength;
250738c8a9a5SSteve French char FileName[];
250838c8a9a5SSteve French } __attribute__((packed)) FILE_DIRECTORY_INFO; /* level 0x101 FF resp data */
250938c8a9a5SSteve French
251038c8a9a5SSteve French typedef struct {
251138c8a9a5SSteve French __le32 NextEntryOffset;
251238c8a9a5SSteve French __u32 FileIndex;
251338c8a9a5SSteve French __le64 CreationTime;
251438c8a9a5SSteve French __le64 LastAccessTime;
251538c8a9a5SSteve French __le64 LastWriteTime;
251638c8a9a5SSteve French __le64 ChangeTime;
251738c8a9a5SSteve French __le64 EndOfFile;
251838c8a9a5SSteve French __le64 AllocationSize;
251938c8a9a5SSteve French __le32 ExtFileAttributes;
252038c8a9a5SSteve French __le32 FileNameLength;
252138c8a9a5SSteve French __le32 EaSize; /* length of the xattrs */
252238c8a9a5SSteve French char FileName[];
252338c8a9a5SSteve French } __attribute__((packed)) FILE_FULL_DIRECTORY_INFO; /* level 0x102 rsp data */
252438c8a9a5SSteve French
252538c8a9a5SSteve French typedef struct {
252638c8a9a5SSteve French __le32 NextEntryOffset;
252738c8a9a5SSteve French __u32 FileIndex;
252838c8a9a5SSteve French __le64 CreationTime;
252938c8a9a5SSteve French __le64 LastAccessTime;
253038c8a9a5SSteve French __le64 LastWriteTime;
253138c8a9a5SSteve French __le64 ChangeTime;
253238c8a9a5SSteve French __le64 EndOfFile;
253338c8a9a5SSteve French __le64 AllocationSize;
253438c8a9a5SSteve French __le32 ExtFileAttributes;
253538c8a9a5SSteve French __le32 FileNameLength;
253638c8a9a5SSteve French __le32 EaSize; /* EA size */
253738c8a9a5SSteve French __le32 Reserved;
253838c8a9a5SSteve French __le64 UniqueId; /* inode num - le since Samba puts ino in low 32 bit*/
253938c8a9a5SSteve French char FileName[];
254038c8a9a5SSteve French } __attribute__((packed)) SEARCH_ID_FULL_DIR_INFO; /* level 0x105 FF rsp data */
254138c8a9a5SSteve French
254238c8a9a5SSteve French typedef struct {
254338c8a9a5SSteve French __le32 NextEntryOffset;
254438c8a9a5SSteve French __u32 FileIndex;
254538c8a9a5SSteve French __le64 CreationTime;
254638c8a9a5SSteve French __le64 LastAccessTime;
254738c8a9a5SSteve French __le64 LastWriteTime;
254838c8a9a5SSteve French __le64 ChangeTime;
254938c8a9a5SSteve French __le64 EndOfFile;
255038c8a9a5SSteve French __le64 AllocationSize;
255138c8a9a5SSteve French __le32 ExtFileAttributes;
255238c8a9a5SSteve French __le32 FileNameLength;
255338c8a9a5SSteve French __le32 EaSize; /* length of the xattrs */
255438c8a9a5SSteve French __u8 ShortNameLength;
255538c8a9a5SSteve French __u8 Reserved;
255638c8a9a5SSteve French __u8 ShortName[24];
255738c8a9a5SSteve French char FileName[];
255838c8a9a5SSteve French } __attribute__((packed)) FILE_BOTH_DIRECTORY_INFO; /* level 0x104 FFrsp data */
255938c8a9a5SSteve French
256038c8a9a5SSteve French typedef struct {
256138c8a9a5SSteve French __u32 ResumeKey;
256238c8a9a5SSteve French __le16 CreationDate; /* SMB Date */
256338c8a9a5SSteve French __le16 CreationTime; /* SMB Time */
256438c8a9a5SSteve French __le16 LastAccessDate;
256538c8a9a5SSteve French __le16 LastAccessTime;
256638c8a9a5SSteve French __le16 LastWriteDate;
256738c8a9a5SSteve French __le16 LastWriteTime;
256838c8a9a5SSteve French __le32 DataSize; /* File Size (EOF) */
256938c8a9a5SSteve French __le32 AllocationSize;
257038c8a9a5SSteve French __le16 Attributes; /* verify not u32 */
257138c8a9a5SSteve French __u8 FileNameLength;
257238c8a9a5SSteve French char FileName[];
257338c8a9a5SSteve French } __attribute__((packed)) FIND_FILE_STANDARD_INFO; /* level 0x1 FF resp data */
257438c8a9a5SSteve French
257538c8a9a5SSteve French
257638c8a9a5SSteve French struct win_dev {
2577d6120327SSteve French unsigned char type[8]; /* IntxCHR or IntxBLK or LnxFIFO*/
257838c8a9a5SSteve French __le64 major;
257938c8a9a5SSteve French __le64 minor;
258038c8a9a5SSteve French } __attribute__((packed));
258138c8a9a5SSteve French
258238c8a9a5SSteve French struct fea {
258338c8a9a5SSteve French unsigned char EA_flags;
258438c8a9a5SSteve French __u8 name_len;
258538c8a9a5SSteve French __le16 value_len;
258638c8a9a5SSteve French char name[];
258738c8a9a5SSteve French /* optionally followed by value */
258838c8a9a5SSteve French } __attribute__((packed));
258938c8a9a5SSteve French /* flags for _FEA.fEA */
259038c8a9a5SSteve French #define FEA_NEEDEA 0x80 /* need EA bit */
259138c8a9a5SSteve French
259238c8a9a5SSteve French struct fealist {
259338c8a9a5SSteve French __le32 list_len;
259438c8a9a5SSteve French struct fea list;
259538c8a9a5SSteve French } __attribute__((packed));
259638c8a9a5SSteve French
259738c8a9a5SSteve French /* used to hold an arbitrary blob of data */
259838c8a9a5SSteve French struct data_blob {
259938c8a9a5SSteve French __u8 *data;
260038c8a9a5SSteve French size_t length;
260138c8a9a5SSteve French void (*free) (struct data_blob *data_blob);
260238c8a9a5SSteve French } __attribute__((packed));
260338c8a9a5SSteve French
260438c8a9a5SSteve French
260538c8a9a5SSteve French #ifdef CONFIG_CIFS_POSIX
260638c8a9a5SSteve French /*
260738c8a9a5SSteve French For better POSIX semantics from Linux client, (even better
260838c8a9a5SSteve French than the existing CIFS Unix Extensions) we need updated PDUs for:
260938c8a9a5SSteve French
261038c8a9a5SSteve French 1) PosixCreateX - to set and return the mode, inode#, device info and
261138c8a9a5SSteve French perhaps add a CreateDevice - to create Pipes and other special .inodes
261238c8a9a5SSteve French Also note POSIX open flags
261338c8a9a5SSteve French 2) Close - to return the last write time to do cache across close
261438c8a9a5SSteve French more safely
261538c8a9a5SSteve French 3) FindFirst return unique inode number - what about resume key, two
261638c8a9a5SSteve French forms short (matches readdir) and full (enough info to cache inodes)
261738c8a9a5SSteve French 4) Mkdir - set mode
261838c8a9a5SSteve French
261938c8a9a5SSteve French And under consideration:
262038c8a9a5SSteve French 5) FindClose2 (return nanosecond timestamp ??)
262138c8a9a5SSteve French 6) Use nanosecond timestamps throughout all time fields if
262238c8a9a5SSteve French corresponding attribute flag is set
262338c8a9a5SSteve French 7) sendfile - handle based copy
262438c8a9a5SSteve French
262538c8a9a5SSteve French what about fixing 64 bit alignment
262638c8a9a5SSteve French
262738c8a9a5SSteve French There are also various legacy SMB/CIFS requests used as is
262838c8a9a5SSteve French
262938c8a9a5SSteve French From existing Lanman and NTLM dialects:
263038c8a9a5SSteve French --------------------------------------
263138c8a9a5SSteve French NEGOTIATE
263238c8a9a5SSteve French SESSION_SETUP_ANDX (BB which?)
263338c8a9a5SSteve French TREE_CONNECT_ANDX (BB which wct?)
263438c8a9a5SSteve French TREE_DISCONNECT (BB add volume timestamp on response)
263538c8a9a5SSteve French LOGOFF_ANDX
263638c8a9a5SSteve French DELETE (note delete open file behavior)
263738c8a9a5SSteve French DELETE_DIRECTORY
263838c8a9a5SSteve French READ_AND_X
263938c8a9a5SSteve French WRITE_AND_X
264038c8a9a5SSteve French LOCKING_AND_X (note posix lock semantics)
264138c8a9a5SSteve French RENAME (note rename across dirs and open file rename posix behaviors)
264238c8a9a5SSteve French NT_RENAME (for hardlinks) Is this good enough for all features?
264338c8a9a5SSteve French FIND_CLOSE2
264438c8a9a5SSteve French TRANSACTION2 (18 cases)
264538c8a9a5SSteve French SMB_SET_FILE_END_OF_FILE_INFO2 SMB_SET_PATH_END_OF_FILE_INFO2
264638c8a9a5SSteve French (BB verify that never need to set allocation size)
264738c8a9a5SSteve French SMB_SET_FILE_BASIC_INFO2 (setting times - BB can it be done via
264838c8a9a5SSteve French Unix ext?)
264938c8a9a5SSteve French
265038c8a9a5SSteve French COPY (note support for copy across directories) - FUTURE, OPTIONAL
265138c8a9a5SSteve French setting/getting OS/2 EAs - FUTURE (BB can this handle
265238c8a9a5SSteve French setting Linux xattrs perfectly) - OPTIONAL
265338c8a9a5SSteve French dnotify - FUTURE, OPTIONAL
265438c8a9a5SSteve French quota - FUTURE, OPTIONAL
265538c8a9a5SSteve French
265638c8a9a5SSteve French Note that various requests implemented for NT interop such as
265738c8a9a5SSteve French NT_TRANSACT (IOCTL) QueryReparseInfo
265838c8a9a5SSteve French are unneeded to servers compliant with the CIFS POSIX extensions
265938c8a9a5SSteve French
266038c8a9a5SSteve French From CIFS Unix Extensions:
266138c8a9a5SSteve French -------------------------
266238c8a9a5SSteve French T2 SET_PATH_INFO (SMB_SET_FILE_UNIX_LINK) for symlinks
266338c8a9a5SSteve French T2 SET_PATH_INFO (SMB_SET_FILE_BASIC_INFO2)
266438c8a9a5SSteve French T2 QUERY_PATH_INFO (SMB_QUERY_FILE_UNIX_LINK)
266538c8a9a5SSteve French T2 QUERY_PATH_INFO (SMB_QUERY_FILE_UNIX_BASIC) BB check for missing
266638c8a9a5SSteve French inode fields
266738c8a9a5SSteve French Actually a need QUERY_FILE_UNIX_INFO
266838c8a9a5SSteve French since has inode num
266938c8a9a5SSteve French BB what about a) blksize/blkbits/blocks
267038c8a9a5SSteve French b) i_version
267138c8a9a5SSteve French c) i_rdev
267238c8a9a5SSteve French d) notify mask?
267338c8a9a5SSteve French e) generation
267438c8a9a5SSteve French f) size_seqcount
267538c8a9a5SSteve French T2 FIND_FIRST/FIND_NEXT FIND_FILE_UNIX
267638c8a9a5SSteve French TRANS2_GET_DFS_REFERRAL - OPTIONAL but recommended
267738c8a9a5SSteve French T2_QFS_INFO QueryDevice/AttributeInfo - OPTIONAL
267838c8a9a5SSteve French */
267938c8a9a5SSteve French
268038c8a9a5SSteve French /* xsymlink is a symlink format (used by MacOS) that can be used
268138c8a9a5SSteve French to save symlink info in a regular file when
268238c8a9a5SSteve French mounted to operating systems that do not
268338c8a9a5SSteve French support the cifs Unix extensions or EAs (for xattr
268438c8a9a5SSteve French based symlinks). For such a file to be recognized
268538c8a9a5SSteve French as containing symlink data:
268638c8a9a5SSteve French
268738c8a9a5SSteve French 1) file size must be 1067,
268838c8a9a5SSteve French 2) signature must begin file data,
268938c8a9a5SSteve French 3) length field must be set to ASCII representation
269038c8a9a5SSteve French of a number which is less than or equal to 1024,
269138c8a9a5SSteve French 4) md5 must match that of the path data */
269238c8a9a5SSteve French
269338c8a9a5SSteve French struct xsymlink {
269438c8a9a5SSteve French /* 1067 bytes */
269538c8a9a5SSteve French char signature[4]; /* XSym */ /* not null terminated */
269638c8a9a5SSteve French char cr0; /* \n */
269738c8a9a5SSteve French /* ASCII representation of length (4 bytes decimal) terminated by \n not null */
269838c8a9a5SSteve French char length[4];
269938c8a9a5SSteve French char cr1; /* \n */
270038c8a9a5SSteve French /* md5 of valid subset of path ie path[0] through path[length-1] */
270138c8a9a5SSteve French __u8 md5[32];
270238c8a9a5SSteve French char cr2; /* \n */
270338c8a9a5SSteve French /* if room left, then end with \n then 0x20s by convention but not required */
270438c8a9a5SSteve French char path[1024];
270538c8a9a5SSteve French } __attribute__((packed));
270638c8a9a5SSteve French
270738c8a9a5SSteve French typedef struct file_xattr_info {
270838c8a9a5SSteve French /* BB do we need another field for flags? BB */
270938c8a9a5SSteve French __u32 xattr_name_len;
271038c8a9a5SSteve French __u32 xattr_value_len;
271138c8a9a5SSteve French char xattr_name[];
271238c8a9a5SSteve French /* followed by xattr_value[xattr_value_len], no pad */
271338c8a9a5SSteve French } __packed FILE_XATTR_INFO; /* extended attribute info level 0x205 */
271438c8a9a5SSteve French
271538c8a9a5SSteve French /* flags for lsattr and chflags commands removed arein uapi/linux/fs.h */
271638c8a9a5SSteve French
271738c8a9a5SSteve French typedef struct file_chattr_info {
271838c8a9a5SSteve French __le64 mask; /* list of all possible attribute bits */
271938c8a9a5SSteve French __le64 mode; /* list of actual attribute bits on this inode */
272038c8a9a5SSteve French } __packed FILE_CHATTR_INFO; /* ext attributes (chattr, chflags) level 0x206 */
272138c8a9a5SSteve French #endif /* POSIX */
272238c8a9a5SSteve French #endif /* _CIFSPDU_H */
2723