summaryrefslogtreecommitdiff
path: root/source4/libcli
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2006-05-20 10:46:38 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 14:08:11 -0500
commite306c5bf129a981693bd251d45597f1e584ee850 (patch)
tree54e78bf5ba441d9f780d1e987cd9ff72b0911f23 /source4/libcli
parent2de1d5f7a8c2a3a815d81c217c274d2d5f1768cb (diff)
downloadsamba-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.c7
-rw-r--r--source4/libcli/raw/clitree.c7
-rw-r--r--source4/libcli/raw/interfaces.h364
-rw-r--r--source4/libcli/raw/rawfile.c10
-rw-r--r--source4/libcli/raw/rawioctl.c6
-rw-r--r--source4/libcli/raw/rawreadwrite.c13
-rw-r--r--source4/libcli/raw/rawsearch.c1
-rw-r--r--source4/libcli/smb2/close.c2
-rw-r--r--source4/libcli/smb2/create.c2
-rw-r--r--source4/libcli/smb2/find.c2
-rw-r--r--source4/libcli/smb2/flush.c2
-rw-r--r--source4/libcli/smb2/ioctl.c4
-rw-r--r--source4/libcli/smb2/read.c2
-rw-r--r--source4/libcli/smb2/smb2_calls.h265
-rw-r--r--source4/libcli/smb2/write.c2
-rw-r--r--source4/libcli/smb_composite/sesssetup.c5
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 */