summaryrefslogtreecommitdiff
path: root/source4/libcli/smb2/negprot.c
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2005-11-11 05:53:54 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 13:46:09 -0500
commit555b45e12c281eb3980d15b12728c59c6b73c302 (patch)
tree8d415762a3a319796879d84cc149163dd87199e3 /source4/libcli/smb2/negprot.c
parent3d38b3dc06f5b9e67fe95d96443fddca66a92797 (diff)
downloadsamba-555b45e12c281eb3980d15b12728c59c6b73c302.tar.gz
samba-555b45e12c281eb3980d15b12728c59c6b73c302.tar.bz2
samba-555b45e12c281eb3980d15b12728c59c6b73c302.zip
r11665: started to put some meat on the structure used for the SMB2 library
the call definitions will be in smb2_calls.h, which will play a similar role that smb_interfaces.h plays for the old SMB protocol (This used to be commit 4ef3902a8a99a0b8caa81a07ba07830d7cbbc32c)
Diffstat (limited to 'source4/libcli/smb2/negprot.c')
-rw-r--r--source4/libcli/smb2/negprot.c53
1 files changed, 32 insertions, 21 deletions
diff --git a/source4/libcli/smb2/negprot.c b/source4/libcli/smb2/negprot.c
index 6b35373807..ffddf8a2f0 100644
--- a/source4/libcli/smb2/negprot.c
+++ b/source4/libcli/smb2/negprot.c
@@ -23,19 +23,23 @@
#include "includes.h"
#include "libcli/raw/libcliraw.h"
#include "libcli/smb2/smb2.h"
+#include "libcli/smb2/smb2_calls.h"
/*
send a negprot request
*/
-struct smb2_request *smb2_negprot_send(struct smb2_transport *transport)
+struct smb2_request *smb2_negprot_send(struct smb2_transport *transport,
+ struct smb2_negprot *io)
{
struct smb2_request *req;
+
req = smb2_request_init(transport, SMB2_OP_NEGPROT, 0x26);
if (req == NULL) return NULL;
- memset(req->out.body, 0, 0x26);
- SIVAL(req->out.body, 0, 0x00010024); /* unknown */
+ SIVAL(req->out.body, 0x00, io->in.unknown1);
+ SSVAL(req->out.body, 0x04, io->in.unknown2);
+ memcpy(req->out.body+0x06, io->in.unknown3, 32);
smb2_transport_send(req);
@@ -45,29 +49,35 @@ struct smb2_request *smb2_negprot_send(struct smb2_transport *transport)
/*
recv a negprot reply
*/
-NTSTATUS smb2_negprot_recv(struct smb2_request *req)
+NTSTATUS smb2_negprot_recv(struct smb2_request *req, TALLOC_CTX *mem_ctx,
+ struct smb2_negprot *io)
{
- NTTIME t1, t2;
- DATA_BLOB secblob;
- struct GUID guid;
- NTSTATUS status;
+ uint16_t blobsize;
if (!smb2_request_receive(req) ||
smb2_request_is_error(req)) {
return smb2_request_destroy(req);
}
- t1 = smbcli_pull_nttime(req->in.body, 0x28);
- t2 = smbcli_pull_nttime(req->in.body, 0x30);
-
- secblob = smb2_pull_blob(req, req->in.body+0x40, req->in.body_size - 0x40);
- status = smb2_pull_guid(req, req->in.body+0x08, &guid);
- NT_STATUS_NOT_OK_RETURN(status);
+ if (req->in.body_size < 0x40) {
+ return NT_STATUS_BUFFER_TOO_SMALL;
+ }
- printf("Negprot reply:\n");
- printf("t1 =%s\n", nt_time_string(req, t1));
- printf("t2 =%s\n", nt_time_string(req, t2));
- printf("guid=%s\n", GUID_string(req, &guid));
+ io->out.unknown1 = IVAL(req->in.body, 0x00);
+ io->out.unknown2 = IVAL(req->in.body, 0x04);
+ memcpy(io->out.sessid, req->in.body + 0x08, 16);
+ io->out.unknown3 = IVAL(req->in.body, 0x18);
+ io->out.unknown4 = SVAL(req->in.body, 0x1C);
+ io->out.unknown5 = IVAL(req->in.body, 0x1E);
+ io->out.unknown6 = IVAL(req->in.body, 0x22);
+ io->out.unknown7 = SVAL(req->in.body, 0x26);
+ io->out.current_time = smbcli_pull_nttime(req->in.body, 0x28);
+ io->out.boot_time = smbcli_pull_nttime(req->in.body, 0x30);
+ io->out.unknown8 = SVAL(req->in.body, 0x38);
+ blobsize = SVAL(req->in.body, 0x3A);
+ io->out.unknown9 = IVAL(req->in.body, 0x3C);
+ io->out.secblob = smb2_pull_blob(req, req->in.body+0x40, blobsize);
+ talloc_steal(mem_ctx, io->out.secblob.data);
return smb2_request_destroy(req);
}
@@ -75,8 +85,9 @@ NTSTATUS smb2_negprot_recv(struct smb2_request *req)
/*
sync negprot request
*/
-NTSTATUS smb2_negprot(struct smb2_transport *transport)
+NTSTATUS smb2_negprot(struct smb2_transport *transport,
+ TALLOC_CTX *mem_ctx, struct smb2_negprot *io)
{
- struct smb2_request *req = smb2_negprot_send(transport);
- return smb2_negprot_recv(req);
+ struct smb2_request *req = smb2_negprot_send(transport, io);
+ return smb2_negprot_recv(req, mem_ctx, io);
}