diff options
author | Stefan Metzmacher <metze@samba.org> | 2006-05-20 10:46:38 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 14:08:11 -0500 |
commit | e306c5bf129a981693bd251d45597f1e584ee850 (patch) | |
tree | 54e78bf5ba441d9f780d1e987cd9ff72b0911f23 /source4/libcli | |
parent | 2de1d5f7a8c2a3a815d81c217c274d2d5f1768cb (diff) | |
download | samba-e306c5bf129a981693bd251d45597f1e584ee850.tar.gz samba-e306c5bf129a981693bd251d45597f1e584ee850.tar.bz2 samba-e306c5bf129a981693bd251d45597f1e584ee850.zip |
r15741: move smb2 request structures into the main smb request structs
as new levels
metze
(This used to be commit 91806353174704857dfcc15a730af7232cfde660)
Diffstat (limited to 'source4/libcli')
-rw-r--r-- | source4/libcli/raw/clisession.c | 7 | ||||
-rw-r--r-- | source4/libcli/raw/clitree.c | 7 | ||||
-rw-r--r-- | source4/libcli/raw/interfaces.h | 364 | ||||
-rw-r--r-- | source4/libcli/raw/rawfile.c | 10 | ||||
-rw-r--r-- | source4/libcli/raw/rawioctl.c | 6 | ||||
-rw-r--r-- | source4/libcli/raw/rawreadwrite.c | 13 | ||||
-rw-r--r-- | source4/libcli/raw/rawsearch.c | 1 | ||||
-rw-r--r-- | source4/libcli/smb2/close.c | 2 | ||||
-rw-r--r-- | source4/libcli/smb2/create.c | 2 | ||||
-rw-r--r-- | source4/libcli/smb2/find.c | 2 | ||||
-rw-r--r-- | source4/libcli/smb2/flush.c | 2 | ||||
-rw-r--r-- | source4/libcli/smb2/ioctl.c | 4 | ||||
-rw-r--r-- | source4/libcli/smb2/read.c | 2 | ||||
-rw-r--r-- | source4/libcli/smb2/smb2_calls.h | 265 | ||||
-rw-r--r-- | source4/libcli/smb2/write.c | 2 | ||||
-rw-r--r-- | source4/libcli/smb_composite/sesssetup.c | 5 |
16 files changed, 403 insertions, 291 deletions
diff --git a/source4/libcli/raw/clisession.c b/source4/libcli/raw/clisession.c index 2942279b12..9e114aece8 100644 --- a/source4/libcli/raw/clisession.c +++ b/source4/libcli/raw/clisession.c @@ -137,6 +137,9 @@ struct smbcli_request *smb_raw_sesssetup_send(struct smbcli_session *session, smbcli_req_append_string(req, parms->spnego.in.lanman, STR_TERMINATE); smbcli_req_append_string(req, parms->spnego.in.workgroup, STR_TERMINATE); break; + + case RAW_SESSSETUP_SMB2: + return NULL; } if (!smbcli_request_send(req)) { @@ -213,6 +216,10 @@ NTSTATUS smb_raw_sesssetup_recv(struct smbcli_request *req, p += smbcli_req_pull_string(req, mem_ctx, &parms->spnego.out.lanman, p, -1, STR_TERMINATE); p += smbcli_req_pull_string(req, mem_ctx, &parms->spnego.out.workgroup, p, -1, STR_TERMINATE); break; + + case RAW_SESSSETUP_SMB2: + req->status = NT_STATUS_INTERNAL_ERROR; + break; } failed: diff --git a/source4/libcli/raw/clitree.c b/source4/libcli/raw/clitree.c index 6e120ed615..51f2e12457 100644 --- a/source4/libcli/raw/clitree.c +++ b/source4/libcli/raw/clitree.c @@ -79,6 +79,9 @@ struct smbcli_request *smb_raw_tcon_send(struct smbcli_tree *tree, smbcli_req_append_string(req, parms->tconx.in.path, STR_TERMINATE | STR_UPPER); smbcli_req_append_string(req, parms->tconx.in.device, STR_TERMINATE | STR_ASCII); break; + + case RAW_TCON_SMB2: + return NULL; } if (!smbcli_request_send(req)) { @@ -125,6 +128,10 @@ NTSTATUS smb_raw_tcon_recv(struct smbcli_request *req, TALLOC_CTX *mem_ctx, p += smbcli_req_pull_string(req, mem_ctx, &parms->tconx.out.fs_type, p, -1, STR_TERMINATE); break; + + case RAW_TCON_SMB2: + req->status = NT_STATUS_INTERNAL_ERROR; + break; } failed: diff --git a/source4/libcli/raw/interfaces.h b/source4/libcli/raw/interfaces.h index 588237acb0..5fe64f064c 100644 --- a/source4/libcli/raw/interfaces.h +++ b/source4/libcli/raw/interfaces.h @@ -207,7 +207,11 @@ union smb_rename { } ntrename; }; -enum smb_tcon_level {RAW_TCON_TCON, RAW_TCON_TCONX}; +enum smb_tcon_level { + RAW_TCON_TCON, + RAW_TCON_TCONX, + RAW_TCON_SMB2 +}; /* union used in tree connect call */ union smb_tcon { @@ -248,10 +252,42 @@ union smb_tcon { uint16_t tid; } out; } tconx; + + /* SMB2 TreeConnect */ + struct smb2_tree_connect { + enum smb_tcon_level level; + + struct { + /* static body buffer 8 (0x08) bytes */ + /* uint16_t buffer_code; 0x09 = 0x08 + 1 */ + uint16_t unknown1; /* 0x0000 */ + /* uint16_t path_ofs */ + /* uint16_t path_size */ + + /* dynamic body */ + const char *path; /* as non-terminated UTF-16 on the wire */ + } in; + struct { + /* static body buffer 16 (0x10) bytes */ + /* uint16_t buffer_code; 0x10 */ + uint16_t unknown1; /* 0x02 */ + uint32_t unknown2; /* 0x00 */ + uint32_t unknown3; /* 0x00 */ + uint32_t access_mask; + + /* extracted from the SMB2 header */ + uint32_t tid; + } out; + } smb2; }; -enum smb_sesssetup_level {RAW_SESSSETUP_OLD, RAW_SESSSETUP_NT1, RAW_SESSSETUP_SPNEGO}; +enum smb_sesssetup_level { + RAW_SESSSETUP_OLD, + RAW_SESSSETUP_NT1, + RAW_SESSSETUP_SPNEGO, + RAW_SESSSETUP_SMB2 +}; /* union used in session_setup call */ union smb_sesssetup { @@ -330,6 +366,37 @@ union smb_sesssetup { uint16_t vuid; } out; } spnego; + + /* SMB2 SessionSetup */ + struct smb2_session_setup { + enum smb_sesssetup_level level; + + struct { + /* static body buffer 16 (0x10) bytes */ + /* uint16_t buffer_code; 0x11 = 0x10 + 1 */ + uint16_t _pad; + uint32_t unknown2; /* 0xF */ + uint32_t unknown3; /* 0x00 */ + /* uint16_t secblob_ofs */ + /* uint16_t secblob_size */ + + /* dynamic body */ + DATA_BLOB secblob; + } in; + struct { + /* static body buffer 8 (0x08) bytes */ + /* uint16_t buffer_code; 0x09 = 0x08 +1 */ + uint16_t _pad; + /* uint16_t secblob_ofs */ + /* uint16_t secblob_size */ + + /* dynamic body */ + DATA_BLOB secblob; + + /* extracted from the SMB2 header */ + uint64_t uid; + } out; + } smb2; }; /* Note that the specified enum values are identical to the actual info-levels used @@ -1161,12 +1228,18 @@ union smb_fsinfo { enum smb_open_level { - RAW_OPEN_OPEN, RAW_OPEN_OPENX, - RAW_OPEN_MKNEW, RAW_OPEN_CREATE, - RAW_OPEN_CTEMP, RAW_OPEN_SPLOPEN, - RAW_OPEN_NTCREATEX, RAW_OPEN_T2OPEN, - RAW_OPEN_NTTRANS_CREATE, - RAW_OPEN_OPENX_READX}; + RAW_OPEN_OPEN, + RAW_OPEN_OPENX, + RAW_OPEN_MKNEW, + RAW_OPEN_CREATE, + RAW_OPEN_CTEMP, + RAW_OPEN_SPLOPEN, + RAW_OPEN_NTCREATEX, + RAW_OPEN_T2OPEN, + RAW_OPEN_NTTRANS_CREATE, + RAW_OPEN_OPENX_READX, + RAW_OPEN_SMB2 +}; /* the generic interface is defined to be equal to the NTCREATEX interface */ #define RAW_OPEN_GENERIC RAW_OPEN_NTCREATEX @@ -1417,11 +1490,73 @@ union smb_open { uint16_t nread; } out; } openxreadx; + +#define SMB2_CREATE_FLAG_REQUEST_OPLOCK 0x0100 +#define SMB2_CREATE_FLAG_REQUEST_EXCLUSIVE_OPLOCK 0x0800 +#define SMB2_CREATE_FLAG_GRANT_OPLOCK 0x0001 +#define SMB2_CREATE_FLAG_GRANT_EXCLUSIVE_OPLOCK 0x0080 + + /* SMB2 Create */ + struct smb2_create { + enum smb_open_level level; + struct { + /* static body buffer 56 (0x38) bytes */ + /* uint16_t buffer_code; 0x39 = 0x38 + 1 */ + uint16_t oplock_flags; /* SMB2_CREATE_FLAG_* */ + uint32_t impersonation; + uint32_t unknown3[4]; + uint32_t access_mask; + + uint32_t file_attr; + uint32_t share_access; + uint32_t open_disposition; + uint32_t create_options; + + /* uint16_t fname_ofs */ + /* uint16_t fname_size */ + /* uint32_t blob_ofs; */ + /* uint32_t blob_size; */ + + /* dynamic body */ + const char *fname; + + /* optional list of extended attributes */ + struct smb_ea_list eas; + } in; + struct { + union smb_handle file; + + /* static body buffer 88 (0x58) bytes */ + /* uint16_t buffer_code; 0x59 = 0x58 + 1 */ + uint16_t oplock_flags; /* SMB2_CREATE_FLAG_* */ + uint32_t create_action; + NTTIME create_time; + NTTIME access_time; + NTTIME write_time; + NTTIME change_time; + uint64_t alloc_size; + uint64_t size; + uint32_t file_attr; + uint32_t _pad; + /* struct smb2_handle handle;*/ + /* uint32_t blob_ofs; */ + /* uint32_t blob_size; */ + + /* dynamic body */ + DATA_BLOB blob; + } out; + } smb2; }; -enum smb_read_level {RAW_READ_READBRAW, RAW_READ_LOCKREAD, RAW_READ_READ, RAW_READ_READX}; +enum smb_read_level { + RAW_READ_READBRAW, + RAW_READ_LOCKREAD, + RAW_READ_READ, + RAW_READ_READX, + RAW_READ_SMB2 +}; #define RAW_READ_GENERIC RAW_READ_READX @@ -1496,12 +1631,45 @@ union smb_read { uint16_t nread; } out; } read; + + /* SMB2 Read */ + struct smb2_read { + enum smb_read_level level; + struct { + union smb_handle file; + + /* static body buffer 48 (0x30) bytes */ + /* uint16_t buffer_code; 0x31 = 0x30 + 1 */ + uint16_t _pad; + uint32_t length; + uint64_t offset; + /* struct smb2_handle handle; */ + uint64_t unknown1; /* 0x0000000000000000 */ + uint64_t unknown2; /* 0x0000000000000000 */ + uint8_t _bug; + } in; + struct { + /* static body buffer 16 (0x10) bytes */ + /* uint16_t buffer_code; 0x11 = 0x10 + 1 */ + /* uint16_t data_ofs; */ + /* uint32_t data_size; */ + uint64_t unknown1; /* 0x0000000000000000 */ + + /* dynamic body */ + DATA_BLOB data; + } out; + } smb2; }; -enum smb_write_level {RAW_WRITE_WRITEUNLOCK, RAW_WRITE_WRITE, - RAW_WRITE_WRITEX, RAW_WRITE_WRITECLOSE, - RAW_WRITE_SPLWRITE}; +enum smb_write_level { + RAW_WRITE_WRITEUNLOCK, + RAW_WRITE_WRITE, + RAW_WRITE_WRITEX, + RAW_WRITE_WRITECLOSE, + RAW_WRITE_SPLWRITE, + RAW_WRITE_SMB2 +}; #define RAW_WRITE_GENERIC RAW_WRITE_WRITEX @@ -1579,6 +1747,34 @@ union smb_write { const uint8_t *data; } in; } splwrite; + + /* SMB2 Write */ + struct smb2_write { + enum smb_write_level level; + struct { + union smb_handle file; + + /* static body buffer 48 (0x30) bytes */ + /* uint16_t buffer_code; 0x31 = 0x30 + 1 */ + /* uint16_t data_ofs; */ + /* uint32_t data_size; */ + uint64_t offset; + /* struct smb2_handle handle; */ + uint64_t unknown1; /* 0xFFFFFFFFFFFFFFFF */ + uint64_t unknown2; /* 0xFFFFFFFFFFFFFFFF */ + + /* dynamic body */ + DATA_BLOB data; + } in; + struct { + /* static body buffer 17 (0x11) bytes */ + /* uint16_t buffer_code; 0x11 */ + uint16_t _pad; + uint32_t nwritten; + uint64_t unknown1; /* 0x0000000000000000 */ + uint8_t _bug; + } out; + } smb2; }; @@ -1619,7 +1815,11 @@ union smb_lock { }; -enum smb_close_level {RAW_CLOSE_CLOSE, RAW_CLOSE_SPLCLOSE}; +enum smb_close_level { + RAW_CLOSE_CLOSE, + RAW_CLOSE_SPLCLOSE, + RAW_CLOSE_SMB2 +}; #define RAW_CLOSE_GENERIC RAW_CLOSE_CLOSE @@ -1643,6 +1843,33 @@ union smb_close { union smb_handle file; } in; } splclose; + + /* SMB2 Close */ + struct smb2_close { + enum smb_close_level level; + struct { + union smb_handle file; + + /* static body buffer 24 (0x18) bytes */ + /* uint16_t buffer_code; 0x18 */ +#define SMB2_CLOSE_FLAGS_FULL_INFORMATION (1<<0) + uint16_t flags; /* SMB2_CLOSE_FLAGS_* */ + uint32_t _pad; + } in; + struct { + /* static body buffer 60 (0x3C) bytes */ + /* uint16_t buffer_code; 0x3C */ + uint16_t flags; + uint32_t _pad; + NTTIME create_time; + NTTIME access_time; + NTTIME write_time; + NTTIME change_time; + uint64_t alloc_size; + uint64_t size; + uint32_t file_attr; + } out; + } smb2; }; @@ -1681,7 +1908,11 @@ union smb_lpq { } retq; }; -enum smb_ioctl_level {RAW_IOCTL_IOCTL, RAW_IOCTL_NTIOCTL}; +enum smb_ioctl_level { + RAW_IOCTL_IOCTL, + RAW_IOCTL_NTIOCTL, + RAW_IOCTL_SMB2 +}; /* union for ioctl() backend @@ -1723,12 +1954,60 @@ union smb_ioctl { DATA_BLOB blob; } out; } ntioctl; + + /* SMB2 Ioctl */ + struct smb2_ioctl { + enum smb_ioctl_level level; + struct { + union smb_handle file; + + /* static body buffer 56 (0x38) bytes */ + /* uint16_t buffer_code; 0x39 = 0x38 + 1 */ + uint16_t _pad; + uint32_t function; + /*struct smb2_handle handle;*/ + /* uint32_t out_ofs; */ + /* uint32_t out_size; */ + uint32_t unknown2; + /* uint32_t in_ofs; */ + /* uint32_t in_size; */ + uint32_t max_response_size; + uint64_t flags; + + /* dynamic body */ + DATA_BLOB out; + DATA_BLOB in; + } in; + struct { + union smb_handle file; + + /* static body buffer 48 (0x30) bytes */ + /* uint16_t buffer_code; 0x31 = 0x30 + 1 */ + uint16_t _pad; + uint32_t function; + /* struct smb2_handle handle; */ + /* uint32_t in_ofs; */ + /* uint32_t in_size; */ + /* uint32_t out_ofs; */ + /* uint32_t out_size; */ + uint32_t unknown2; + uint32_t unknown3; + + /* dynamic body */ + DATA_BLOB in; + DATA_BLOB out; + } out; + } smb2; }; -enum smb_flush_level {RAW_FLUSH_FLUSH, RAW_FLUSH_ALL}; +enum smb_flush_level { + RAW_FLUSH_FLUSH, + RAW_FLUSH_ALL, + RAW_FLUSH_SMB2 +}; -/* struct for SMBflush */ union smb_flush { + /* struct for SMBflush */ struct { enum smb_flush_level level; struct { @@ -1736,11 +2015,20 @@ union smb_flush { } in; } flush, generic; + /* SMBflush with 0xFFFF wildcard fnum */ struct { enum smb_flush_level level; } flush_all; -}; + /* SMB2 Flush */ + struct smb2_flush { + enum smb_flush_level level; + struct { + union smb_handle file; + uint32_t unknown; + } in; + } smb2; +}; /* struct for SMBcopy */ struct smb_copy { @@ -1823,7 +2111,8 @@ struct smb_notify { enum smb_search_level {RAW_SEARCH_GENERIC = 0xF000, RAW_SEARCH_SEARCH, /* SMBsearch */ RAW_SEARCH_FFIRST, /* SMBffirst */ - RAW_SEARCH_FUNIQUE, /* SMBfunique */ + RAW_SEARCH_FUNIQUE, /* SMBfunique */ + RAW_SEARCH_SMB2, /* SMB2 Find */ RAW_SEARCH_STANDARD = SMB_FIND_STANDARD, RAW_SEARCH_EA_SIZE = SMB_FIND_EA_SIZE, RAW_SEARCH_EA_LIST = SMB_FIND_EA_LIST, @@ -1878,6 +2167,45 @@ union smb_search_first { uint16_t end_of_search; } out; } t2ffirst; + +/* + SMB2 uses different level numbers for the same old SMB search levels +*/ +#define SMB2_FIND_DIRECTORY_INFO 0x01 +#define SMB2_FIND_FULL_DIRECTORY_INFO 0x02 +#define SMB2_FIND_BOTH_DIRECTORY_INFO 0x03 +#define SMB2_FIND_NAME_INFO 0x0C +#define SMB2_FIND_ID_BOTH_DIRECTORY_INFO 0x25 +#define SMB2_FIND_ID_FULL_DIRECTORY_INFO 0x26 + /* SMB2 Find */ + struct smb2_find { + enum smb_search_level level; + struct { + union smb_handle file; + + /* static body buffer 32 (0x20) bytes */ + /* uint16_t buffer_code; 0x21 = 0x20 + 1 */ + uint8_t level; + uint8_t continue_flags; /* SMB2_CONTINUE_FLAG_* */ + uint32_t unknown; /* perhaps a continue token? */ + /* struct smb2_handle handle; */ + /* uint16_t pattern_ofs; */ + /* uint32_t pattern_size; */ + uint32_t max_response_size; + + /* dynamic body */ + const char *pattern; + } in; + struct { + /* static body buffer 8 (0x08) bytes */ + /* uint16_t buffer_code; 0x08 */ + /* uint16_t blob_ofs; */ + /* uint32_t blob_size; */ + + /* dynamic body */ + DATA_BLOB blob; + } out; + } smb2; }; /* union for file search continue */ diff --git a/source4/libcli/raw/rawfile.c b/source4/libcli/raw/rawfile.c index faa2cdbeb4..3aad05a748 100644 --- a/source4/libcli/raw/rawfile.c +++ b/source4/libcli/raw/rawfile.c @@ -545,6 +545,8 @@ struct smbcli_request *smb_raw_open_send(struct smbcli_tree *tree, union smb_ope SIVAL(req->out.vwv, VWV(10),parms->openxreadx.in.offset>>32); } break; + case RAW_OPEN_SMB2: + return NULL; } if (!smbcli_request_send(req)) { @@ -680,6 +682,9 @@ NTSTATUS smb_raw_open_recv(struct smbcli_request *req, TALLOC_CTX *mem_ctx, unio req->status = NT_STATUS_BUFFER_TOO_SMALL; } break; + case RAW_OPEN_SMB2: + req->status = NT_STATUS_INTERNAL_ERROR; + break; } failed: @@ -717,6 +722,9 @@ struct smbcli_request *smb_raw_close_send(struct smbcli_tree *tree, union smb_cl SSVAL(req->out.vwv, VWV(0), parms->splclose.in.file.fnum); SIVAL(req->out.vwv, VWV(1), 0); /* reserved */ break; + + case RAW_CLOSE_SMB2: + return NULL; } if (!req) return NULL; @@ -858,6 +866,8 @@ struct smbcli_request *smb_raw_flush_send(struct smbcli_tree *tree, union smb_fl case RAW_FLUSH_ALL: fnum = 0xFFFF; break; + case RAW_FLUSH_SMB2: + return NULL; } SETUP_REQUEST(SMBflush, 1, 0); diff --git a/source4/libcli/raw/rawioctl.c b/source4/libcli/raw/rawioctl.c index af48fcb566..0bd37785ac 100644 --- a/source4/libcli/raw/rawioctl.c +++ b/source4/libcli/raw/rawioctl.c @@ -132,6 +132,9 @@ struct smbcli_request *smb_raw_ioctl_send(struct smbcli_tree *tree, union smb_io case RAW_IOCTL_NTIOCTL: req = smb_raw_ntioctl_send(tree, parms); break; + + case RAW_IOCTL_SMB2: + return NULL; } return req; @@ -149,6 +152,9 @@ NTSTATUS smb_raw_ioctl_recv(struct smbcli_request *req, case RAW_IOCTL_NTIOCTL: return smb_raw_ntioctl_recv(req, mem_ctx, parms); + + case RAW_IOCTL_SMB2: + break; } return NT_STATUS_INVALID_LEVEL; } diff --git a/source4/libcli/raw/rawreadwrite.c b/source4/libcli/raw/rawreadwrite.c index 63a60ad545..7a47ce66f4 100644 --- a/source4/libcli/raw/rawreadwrite.c +++ b/source4/libcli/raw/rawreadwrite.c @@ -94,6 +94,9 @@ struct smbcli_request *smb_raw_read_send(struct smbcli_tree *tree, union smb_rea SSVAL(req->out.hdr, HDR_FLG2, flags2); } break; + + case RAW_READ_SMB2: + return NULL; } if (!smbcli_request_send(req)) { @@ -165,6 +168,10 @@ NTSTATUS smb_raw_read_recv(struct smbcli_request *req, union smb_read *parms) req->status = NT_STATUS_BUFFER_TOO_SMALL; } break; + + case RAW_READ_SMB2: + req->status = NT_STATUS_INTERNAL_ERROR; + break; } failed: @@ -261,6 +268,9 @@ struct smbcli_request *smb_raw_write_send(struct smbcli_tree *tree, union smb_wr memcpy(req->out.data, parms->splwrite.in.data, parms->splwrite.in.count); } break; + + case RAW_WRITE_SMB2: + return NULL; } if (!smbcli_request_send(req)) { @@ -303,6 +313,9 @@ NTSTATUS smb_raw_write_recv(struct smbcli_request *req, union smb_write *parms) break; case RAW_WRITE_SPLWRITE: break; + case RAW_WRITE_SMB2: + req->status = NT_STATUS_INTERNAL_ERROR; + break; } failed: diff --git a/source4/libcli/raw/rawsearch.c b/source4/libcli/raw/rawsearch.c index e844a33358..5e05d7c3c5 100644 --- a/source4/libcli/raw/rawsearch.c +++ b/source4/libcli/raw/rawsearch.c @@ -482,6 +482,7 @@ static int parse_trans2_search(struct smbcli_tree *tree, case RAW_SEARCH_SEARCH: case RAW_SEARCH_FFIRST: case RAW_SEARCH_FUNIQUE: + case RAW_SEARCH_SMB2: /* handled elsewhere */ return -1; diff --git a/source4/libcli/smb2/close.c b/source4/libcli/smb2/close.c index 4483f3c75b..9156e7d10d 100644 --- a/source4/libcli/smb2/close.c +++ b/source4/libcli/smb2/close.c @@ -37,7 +37,7 @@ struct smb2_request *smb2_close_send(struct smb2_tree *tree, struct smb2_close * SSVAL(req->out.body, 0x02, io->in.flags); SIVAL(req->out.body, 0x04, 0); /* pad */ - smb2_push_handle(req->out.body+0x08, &io->in.handle); + smb2_push_handle(req->out.body+0x08, &io->in.file.handle); smb2_transport_send(req); diff --git a/source4/libcli/smb2/create.c b/source4/libcli/smb2/create.c index 339258a0df..da21d090fd 100644 --- a/source4/libcli/smb2/create.c +++ b/source4/libcli/smb2/create.c @@ -144,7 +144,7 @@ NTSTATUS smb2_create_recv(struct smb2_request *req, TALLOC_CTX *mem_ctx, struct io->out.size = BVAL(req->in.body, 0x30); io->out.file_attr = IVAL(req->in.body, 0x38); io->out._pad = IVAL(req->in.body, 0x3C); - smb2_pull_handle(req->in.body+0x40, &io->out.handle); + smb2_pull_handle(req->in.body+0x40, &io->out.file.handle); status = smb2_pull_o32s32_blob(&req->in, mem_ctx, req->in.body+0x50, &io->out.blob); if (!NT_STATUS_IS_OK(status)) { smb2_request_destroy(req); diff --git a/source4/libcli/smb2/find.c b/source4/libcli/smb2/find.c index e811095f42..8f4d6c8301 100644 --- a/source4/libcli/smb2/find.c +++ b/source4/libcli/smb2/find.c @@ -39,7 +39,7 @@ struct smb2_request *smb2_find_send(struct smb2_tree *tree, struct smb2_find *io SCVAL(req->out.body, 0x02, io->in.level); SCVAL(req->out.body, 0x03, io->in.continue_flags); SIVAL(req->out.body, 0x04, io->in.unknown); - smb2_push_handle(req->out.body+0x08, &io->in.handle); + smb2_push_handle(req->out.body+0x08, &io->in.file.handle); status = smb2_push_o16s16_string(&req->out, 0x18, io->in.pattern); if (!NT_STATUS_IS_OK(status)) { diff --git a/source4/libcli/smb2/flush.c b/source4/libcli/smb2/flush.c index 596eb26009..0eb5ed7a3b 100644 --- a/source4/libcli/smb2/flush.c +++ b/source4/libcli/smb2/flush.c @@ -36,7 +36,7 @@ struct smb2_request *smb2_flush_send(struct smb2_tree *tree, struct smb2_flush * SSVAL(req->out.body, 0x02, 0); /* pad? */ SIVAL(req->out.body, 0x04, io->in.unknown); - smb2_push_handle(req->out.body+0x08, &io->in.handle); + smb2_push_handle(req->out.body+0x08, &io->in.file.handle); smb2_transport_send(req); diff --git a/source4/libcli/smb2/ioctl.c b/source4/libcli/smb2/ioctl.c index ffe029e16e..a3ac2d9f47 100644 --- a/source4/libcli/smb2/ioctl.c +++ b/source4/libcli/smb2/ioctl.c @@ -38,7 +38,7 @@ struct smb2_request *smb2_ioctl_send(struct smb2_tree *tree, struct smb2_ioctl * SSVAL(req->out.body, 0x02, 0); /* pad */ SIVAL(req->out.body, 0x04, io->in.function); - smb2_push_handle(req->out.body+0x08, &io->in.handle); + smb2_push_handle(req->out.body+0x08, &io->in.file.handle); status = smb2_push_o32s32_blob(&req->out, 0x18, io->in.out); if (!NT_STATUS_IS_OK(status)) { @@ -80,7 +80,7 @@ NTSTATUS smb2_ioctl_recv(struct smb2_request *req, io->out._pad = SVAL(req->in.body, 0x02); io->out.function = IVAL(req->in.body, 0x04); - smb2_pull_handle(req->in.body+0x08, &io->out.handle); + smb2_pull_handle(req->in.body+0x08, &io->out.file.handle); status = smb2_pull_o32s32_blob(&req->in, mem_ctx, req->in.body+0x18, &io->out.in); if (!NT_STATUS_IS_OK(status)) { diff --git a/source4/libcli/smb2/read.c b/source4/libcli/smb2/read.c index 82e9b13280..6806adb8f6 100644 --- a/source4/libcli/smb2/read.c +++ b/source4/libcli/smb2/read.c @@ -37,7 +37,7 @@ struct smb2_request *smb2_read_send(struct smb2_tree *tree, struct smb2_read *io SSVAL(req->out.body, 0x02, 0); /* pad */ SIVAL(req->out.body, 0x04, io->in.length); SBVAL(req->out.body, 0x08, io->in.offset); - smb2_push_handle(req->out.body+0x10, &io->in.handle); + smb2_push_handle(req->out.body+0x10, &io->in.file.handle); SBVAL(req->out.body, 0x20, io->in.unknown1); SBVAL(req->out.body, 0x28, io->in.unknown2); SCVAL(req->out.body, 0x30, io->in._bug); diff --git a/source4/libcli/smb2/smb2_calls.h b/source4/libcli/smb2/smb2_calls.h index b6f8fdef71..6bee0dec91 100644 --- a/source4/libcli/smb2/smb2_calls.h +++ b/source4/libcli/smb2/smb2_calls.h @@ -52,138 +52,6 @@ struct smb2_negprot { } out; }; -struct smb2_session_setup { - struct { - /* static body buffer 16 (0x10) bytes */ - /* uint16_t buffer_code; 0x11 = 0x10 + 1 */ - uint16_t _pad; - uint32_t unknown2; /* 0xF */ - uint32_t unknown3; /* 0x00 */ - /* uint16_t secblob_ofs */ - /* uint16_t secblob_size */ - - /* dynamic body */ - DATA_BLOB secblob; - } in; - struct { - /* static body buffer 8 (0x08) bytes */ - /* uint16_t buffer_code; 0x09 = 0x08 +1 */ - uint16_t _pad; - /* uint16_t secblob_ofs */ - /* uint16_t secblob_size */ - - /* dynamic body */ - DATA_BLOB secblob; - - /* extracted from the SMB2 header */ - uint64_t uid; - } out; -}; - -struct smb2_tree_connect { - struct { - /* static body buffer 8 (0x08) bytes */ - /* uint16_t buffer_code; 0x09 = 0x08 + 1 */ - uint16_t unknown1; /* 0x0000 */ - /* uint16_t path_ofs */ - /* uint16_t path_size */ - - /* dynamic body */ - const char *path; /* as non-terminated UTF-16 on the wire */ - } in; - struct { - /* static body buffer 16 (0x10) bytes */ - /* uint16_t buffer_code; 0x10 */ - uint16_t unknown1; /* 0x02 */ - uint32_t unknown2; /* 0x00 */ - uint32_t unknown3; /* 0x00 */ - uint32_t access_mask; - - /* extracted from the SMB2 header */ - uint32_t tid; - } out; -}; - -#define SMB2_CREATE_FLAG_REQUEST_OPLOCK 0x0100 -#define SMB2_CREATE_FLAG_REQUEST_EXCLUSIVE_OPLOCK 0x0800 -#define SMB2_CREATE_FLAG_GRANT_OPLOCK 0x0001 -#define SMB2_CREATE_FLAG_GRANT_EXCLUSIVE_OPLOCK 0x0080 - -struct smb2_create { - struct { - /* static body buffer 56 (0x38) bytes */ - /* uint16_t buffer_code; 0x39 = 0x38 + 1 */ - uint16_t oplock_flags; /* SMB2_CREATE_FLAG_* */ - uint32_t impersonation; - uint32_t unknown3[4]; - uint32_t access_mask; - - uint32_t file_attr; - uint32_t share_access; - uint32_t open_disposition; - uint32_t create_options; - - /* uint16_t fname_ofs */ - /* uint16_t fname_size */ - /* uint32_t blob_ofs; */ - /* uint32_t blob_size; */ - - /* dynamic body */ - const char *fname; - - /* optional list of extended attributes */ - struct smb_ea_list eas; - } in; - - struct { - /* static body buffer 88 (0x58) bytes */ - /* uint16_t buffer_code; 0x59 = 0x58 + 1 */ - uint16_t oplock_flags; /* SMB2_CREATE_FLAG_* */ - uint32_t create_action; - NTTIME create_time; - NTTIME access_time; - NTTIME write_time; - NTTIME change_time; - uint64_t alloc_size; - uint64_t size; - uint32_t file_attr; - uint32_t _pad; - struct smb2_handle handle; - /* uint32_t blob_ofs; */ - /* uint32_t blob_size; */ - - /* dynamic body */ - DATA_BLOB blob; - } out; -}; - - -#define SMB2_CLOSE_FLAGS_FULL_INFORMATION (1<<0) - -struct smb2_close { - struct { - /* static body buffer 24 (0x18) bytes */ - /* uint16_t buffer_code; 0x18 */ - uint16_t flags; /* SMB2_CLOSE_FLAGS_* */ - uint32_t _pad; - struct smb2_handle handle; - } in; - - struct { - /* static body buffer 60 (0x3C) bytes */ - /* uint16_t buffer_code; 0x3C */ - uint16_t flags; - uint32_t _pad; - NTTIME create_time; - NTTIME access_time; - NTTIME write_time; - NTTIME change_time; - uint64_t alloc_size; - uint64_t size; - uint32_t file_attr; - } out; -}; - /* getinfo classes */ #define SMB2_GETINFO_FILE 0x01 #define SMB2_GETINFO_FS 0x02 @@ -230,139 +98,6 @@ struct smb2_setinfo { } in; }; -struct smb2_write { - struct { - /* static body buffer 48 (0x30) bytes */ - /* uint16_t buffer_code; 0x31 = 0x30 + 1 */ - /* uint16_t data_ofs; */ - /* uint32_t data_size; */ - uint64_t offset; - struct smb2_handle handle; - uint64_t unknown1; /* 0xFFFFFFFFFFFFFFFF */ - uint64_t unknown2; /* 0xFFFFFFFFFFFFFFFF */ - - /* dynamic body */ - DATA_BLOB data; - } in; - - struct { - /* static body buffer 17 (0x11) bytes */ - /* uint16_t buffer_code; 0x11 */ - uint16_t _pad; - uint32_t nwritten; - uint64_t unknown1; /* 0x0000000000000000 */ - uint8_t _bug; - } out; -}; - -struct smb2_read { - struct { - /* static body buffer 48 (0x30) bytes */ - /* uint16_t buffer_code; 0x31 = 0x30 + 1 */ - uint16_t _pad; - uint32_t length; - uint64_t offset; - struct smb2_handle handle; - uint64_t unknown1; /* 0x0000000000000000 */ - uint64_t unknown2; /* 0x0000000000000000 */ - uint8_t _bug; - } in; - - struct { - /* static body buffer 16 (0x10) bytes */ - /* uint16_t buffer_code; 0x11 = 0x10 + 1 */ - /* uint16_t data_ofs; */ - /* uint32_t data_size; */ - uint64_t unknown1; /* 0x0000000000000000 */ - - /* dynamic body */ - DATA_BLOB data; - } out; -}; - -/* - SMB2 uses different level numbers for the same old SMB search levels -*/ -#define SMB2_FIND_DIRECTORY_INFO 0x01 -#define SMB2_FIND_FULL_DIRECTORY_INFO 0x02 -#define SMB2_FIND_BOTH_DIRECTORY_INFO 0x03 -#define SMB2_FIND_NAME_INFO 0x0C -#define SMB2_FIND_ID_BOTH_DIRECTORY_INFO 0x25 -#define SMB2_FIND_ID_FULL_DIRECTORY_INFO 0x26 - -struct smb2_find { - struct { - /* static body buffer 32 (0x20) bytes */ - /* uint16_t buffer_code; 0x21 = 0x20 + 1 */ - uint8_t level; - uint8_t continue_flags; /* SMB2_CONTINUE_FLAG_* */ - uint32_t unknown; /* perhaps a continue token? */ - struct smb2_handle handle; - /* uint16_t pattern_ofs; */ - /* uint32_t pattern_size; */ - uint32_t max_response_size; - - /* dynamic body */ - const char *pattern; - } in; - - struct { - /* static body buffer 8 (0x08) bytes */ - /* uint16_t buffer_code; 0x08 */ - /* uint16_t blob_ofs; */ - /* uint32_t blob_size; */ - - /* dynamic body */ - DATA_BLOB blob; - } out; -}; - -struct smb2_ioctl { - struct { - /* static body buffer 56 (0x38) bytes */ - /* uint16_t buffer_code; 0x39 = 0x38 + 1 */ - uint16_t _pad; - uint32_t function; - struct smb2_handle handle; - /* uint32_t out_ofs; */ - /* uint32_t out_size; */ - uint32_t unknown2; - /* uint32_t in_ofs; */ - /* uint32_t in_size; */ - uint32_t max_response_size; - uint64_t flags; - - /* dynamic body */ - DATA_BLOB out; - DATA_BLOB in; - } in; - - struct { - /* static body buffer 48 (0x30) bytes */ - /* uint16_t buffer_code; 0x31 = 0x30 + 1 */ - uint16_t _pad; - uint32_t function; - struct smb2_handle handle; - /* uint32_t in_ofs; */ - /* uint32_t in_size; */ - /* uint32_t out_ofs; */ - /* uint32_t out_size; */ - uint32_t unknown2; - uint32_t unknown3; - - /* dynamic body */ - DATA_BLOB in; - DATA_BLOB out; - } out; -}; - -struct smb2_flush { - struct { - uint32_t unknown; - struct smb2_handle handle; - } in; -}; - struct cli_credentials; struct event_context; #include "libcli/smb2/smb2_proto.h" diff --git a/source4/libcli/smb2/write.c b/source4/libcli/smb2/write.c index 1edce3f773..760aadcd8e 100644 --- a/source4/libcli/smb2/write.c +++ b/source4/libcli/smb2/write.c @@ -42,7 +42,7 @@ struct smb2_request *smb2_write_send(struct smb2_tree *tree, struct smb2_write * } SBVAL(req->out.body, 0x08, io->in.offset); - smb2_push_handle(req->out.body+0x10, &io->in.handle); + smb2_push_handle(req->out.body+0x10, &io->in.file.handle); SBVAL(req->out.body, 0x20, io->in.unknown1); SBVAL(req->out.body, 0x28, io->in.unknown2); diff --git a/source4/libcli/smb_composite/sesssetup.c b/source4/libcli/smb_composite/sesssetup.c index 1b7756a3f4..0bad2ff1ad 100644 --- a/source4/libcli/smb_composite/sesssetup.c +++ b/source4/libcli/smb_composite/sesssetup.c @@ -165,6 +165,11 @@ static void request_handler(struct smbcli_request *req) state->req->async.private = c; return; } + break; + + case RAW_SESSSETUP_SMB2: + c->status = NT_STATUS_INTERNAL_ERROR; + break; } /* enforce the local signing required flag */ |