Tvbuffification of SMB print commands, from Ronnie Sahlberg.
Fix up some SMBs I missed when adding the byte-count checks. svn path=/trunk/; revision=4183
This commit is contained in:
parent
c7fbf7f888
commit
e6b12dd801
780
packet-smb.c
780
packet-smb.c
|
@ -2,7 +2,7 @@
|
|||
* Routines for smb packet dissection
|
||||
* Copyright 1999, Richard Sharpe <rsharpe@ns.aus.com>
|
||||
*
|
||||
* $Id: packet-smb.c,v 1.139 2001/11/08 10:57:09 guy Exp $
|
||||
* $Id: packet-smb.c,v 1.140 2001/11/09 06:43:38 guy Exp $
|
||||
*
|
||||
* Ethereal - Network traffic analyzer
|
||||
* By Gerald Combs <gerald@ethereal.com>
|
||||
|
@ -375,6 +375,18 @@ static int hf_smb_device_type = -1;
|
|||
static int hf_smb_is_directory = -1;
|
||||
static int hf_smb_next_entry_offset = -1;
|
||||
static int hf_smb_change_time = -1;
|
||||
static int hf_smb_setup_len = -1;
|
||||
static int hf_smb_print_mode = -1;
|
||||
static int hf_smb_print_identifier = -1;
|
||||
static int hf_smb_restart_index = -1;
|
||||
static int hf_smb_print_queue_date = -1;
|
||||
static int hf_smb_print_queue_dos_date = -1;
|
||||
static int hf_smb_print_queue_dos_time = -1;
|
||||
static int hf_smb_print_status = -1;
|
||||
static int hf_smb_print_spool_file_number = -1;
|
||||
static int hf_smb_print_spool_file_size = -1;
|
||||
static int hf_smb_print_spool_file_name = -1;
|
||||
static int hf_smb_start_index = -1;
|
||||
|
||||
static gint ett_smb = -1;
|
||||
static gint ett_smb_hdr = -1;
|
||||
|
@ -422,6 +434,7 @@ static gint ett_smb_nt_trans_setup = -1;
|
|||
static gint ett_smb_nt_notify_completion_filter = -1;
|
||||
static gint ett_smb_nt_ioctl_flags = -1;
|
||||
static gint ett_smb_security_information_mask = -1;
|
||||
static gint ett_smb_print_queue_entry = -1;
|
||||
|
||||
|
||||
static char *decode_smb_name(unsigned char);
|
||||
|
@ -3667,6 +3680,9 @@ dissect_locking_andx_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
|
|||
guint32 to;
|
||||
proto_item *litem = NULL;
|
||||
proto_tree *ltree = NULL;
|
||||
proto_item *it = NULL;
|
||||
proto_tree *tr = NULL;
|
||||
int old_offset = offset;
|
||||
|
||||
WORD_COUNT;
|
||||
|
||||
|
@ -3739,9 +3755,7 @@ dissect_locking_andx_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
|
|||
|
||||
/* unlocks */
|
||||
if(un){
|
||||
proto_item *it = NULL;
|
||||
proto_tree *tr = NULL;
|
||||
int old_offset = offset;
|
||||
old_offset = offset;
|
||||
|
||||
it = proto_tree_add_text(tree, tvb, offset, 0,
|
||||
"Unlocks");
|
||||
|
@ -3756,20 +3770,24 @@ dissect_locking_andx_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
|
|||
ltree = proto_item_add_subtree(litem, ett_smb_unlock);
|
||||
|
||||
/* PID */
|
||||
CHECK_BYTE_COUNT(2);
|
||||
proto_tree_add_item(ltree, hf_smb_pid, tvb, offset, 2, TRUE);
|
||||
offset += 2;
|
||||
COUNT_BYTES(2);
|
||||
|
||||
/* 2 reserved bytes */
|
||||
CHECK_BYTE_COUNT(2);
|
||||
proto_tree_add_item(ltree, hf_smb_reserved, tvb, offset, 2, TRUE);
|
||||
offset += 2;
|
||||
COUNT_BYTES(2);
|
||||
|
||||
/* offset */
|
||||
CHECK_BYTE_COUNT(8);
|
||||
proto_tree_add_item(ltree, hf_smb_lock_long_offset, tvb, offset, 8, TRUE);
|
||||
offset += 8;
|
||||
COUNT_BYTES(8);
|
||||
|
||||
/* length */
|
||||
CHECK_BYTE_COUNT(8);
|
||||
proto_tree_add_item(ltree, hf_smb_lock_long_length, tvb, offset, 8, TRUE);
|
||||
offset += 8;
|
||||
COUNT_BYTES(8);
|
||||
} else {
|
||||
/* normal lock format */
|
||||
litem = proto_tree_add_text(tr, tvb, offset, 10,
|
||||
|
@ -3777,26 +3795,28 @@ dissect_locking_andx_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
|
|||
ltree = proto_item_add_subtree(litem, ett_smb_unlock);
|
||||
|
||||
/* PID */
|
||||
CHECK_BYTE_COUNT(2);
|
||||
proto_tree_add_item(ltree, hf_smb_pid, tvb, offset, 2, TRUE);
|
||||
offset += 2;
|
||||
COUNT_BYTES(2);
|
||||
|
||||
/* offset */
|
||||
CHECK_BYTE_COUNT(4);
|
||||
proto_tree_add_item(ltree, hf_smb_offset, tvb, offset, 4, TRUE);
|
||||
offset += 4;
|
||||
COUNT_BYTES(4);
|
||||
|
||||
/* lock count */
|
||||
CHECK_BYTE_COUNT(4);
|
||||
proto_tree_add_item(ltree, hf_smb_count, tvb, offset, 4, TRUE);
|
||||
offset += 4;
|
||||
COUNT_BYTES(4);
|
||||
}
|
||||
}
|
||||
proto_item_set_len(it, offset-old_offset);
|
||||
it = NULL;
|
||||
}
|
||||
|
||||
/* locks */
|
||||
if(ln){
|
||||
proto_item *it = NULL;
|
||||
proto_tree *tr = NULL;
|
||||
int old_offset = offset;
|
||||
old_offset = offset;
|
||||
|
||||
it = proto_tree_add_text(tree, tvb, offset, 0,
|
||||
"Locks");
|
||||
|
@ -3811,20 +3831,24 @@ dissect_locking_andx_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
|
|||
ltree = proto_item_add_subtree(litem, ett_smb_lock);
|
||||
|
||||
/* PID */
|
||||
CHECK_BYTE_COUNT(2);
|
||||
proto_tree_add_item(ltree, hf_smb_pid, tvb, offset, 2, TRUE);
|
||||
offset += 2;
|
||||
COUNT_BYTES(2);
|
||||
|
||||
/* 2 reserved bytes */
|
||||
CHECK_BYTE_COUNT(2);
|
||||
proto_tree_add_item(ltree, hf_smb_reserved, tvb, offset, 2, TRUE);
|
||||
offset += 2;
|
||||
COUNT_BYTES(2);
|
||||
|
||||
/* offset */
|
||||
CHECK_BYTE_COUNT(8);
|
||||
proto_tree_add_item(ltree, hf_smb_lock_long_offset, tvb, offset, 8, TRUE);
|
||||
offset += 8;
|
||||
COUNT_BYTES(8);
|
||||
|
||||
/* length */
|
||||
CHECK_BYTE_COUNT(8);
|
||||
proto_tree_add_item(ltree, hf_smb_lock_long_length, tvb, offset, 8, TRUE);
|
||||
offset += 8;
|
||||
COUNT_BYTES(8);
|
||||
} else {
|
||||
/* normal lock format */
|
||||
litem = proto_tree_add_text(tr, tvb, offset, 10,
|
||||
|
@ -3832,23 +3856,36 @@ dissect_locking_andx_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
|
|||
ltree = proto_item_add_subtree(litem, ett_smb_unlock);
|
||||
|
||||
/* PID */
|
||||
CHECK_BYTE_COUNT(2);
|
||||
proto_tree_add_item(ltree, hf_smb_pid, tvb, offset, 2, TRUE);
|
||||
offset += 2;
|
||||
COUNT_BYTES(2);
|
||||
|
||||
/* offset */
|
||||
CHECK_BYTE_COUNT(4);
|
||||
proto_tree_add_item(ltree, hf_smb_offset, tvb, offset, 4, TRUE);
|
||||
offset += 4;
|
||||
COUNT_BYTES(4);
|
||||
|
||||
/* lock count */
|
||||
CHECK_BYTE_COUNT(4);
|
||||
proto_tree_add_item(ltree, hf_smb_count, tvb, offset, 4, TRUE);
|
||||
offset += 4;
|
||||
COUNT_BYTES(4);
|
||||
}
|
||||
}
|
||||
proto_item_set_len(it, offset-old_offset);
|
||||
it = NULL;
|
||||
}
|
||||
|
||||
END_OF_SMB
|
||||
|
||||
if (it != NULL) {
|
||||
/*
|
||||
* We ran out of byte count in the middle of dissecting
|
||||
* the locks or the unlocks; set the site of the item
|
||||
* we were dissecting.
|
||||
*/
|
||||
proto_item_set_len(it, offset-old_offset);
|
||||
}
|
||||
|
||||
/* call AndXCommand (if there are any) */
|
||||
dissect_smb_command(tvb, pinfo, tree, andxoffset, smb_tree, cmd);
|
||||
|
||||
|
@ -6300,6 +6337,243 @@ dissect_nt_transaction_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
|
|||
NT Transaction command ends here
|
||||
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
|
||||
|
||||
static const value_string print_mode_vals[] = {
|
||||
{0, "Text Mode"},
|
||||
{1, "Graphics Mode"},
|
||||
{0, NULL}
|
||||
};
|
||||
|
||||
static int
|
||||
dissect_open_print_file_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, proto_tree *smb_tree)
|
||||
{
|
||||
int fn_len;
|
||||
const char *fn;
|
||||
guint8 wc;
|
||||
guint16 bc;
|
||||
|
||||
WORD_COUNT;
|
||||
|
||||
/* setup len */
|
||||
proto_tree_add_item(tree, hf_smb_setup_len, tvb, offset, 2, TRUE);
|
||||
offset += 2;
|
||||
|
||||
/* print mode */
|
||||
proto_tree_add_item(tree, hf_smb_print_mode, tvb, offset, 2, TRUE);
|
||||
offset += 2;
|
||||
|
||||
BYTE_COUNT;
|
||||
|
||||
/* buffer format */
|
||||
CHECK_BYTE_COUNT(1);
|
||||
proto_tree_add_item(tree, hf_smb_buffer_format, tvb, offset, 1, TRUE);
|
||||
COUNT_BYTES(1);
|
||||
|
||||
/* print identifier */
|
||||
fn = get_unicode_or_ascii_string_tvb(tvb, &offset, pinfo, &fn_len, TRUE, FALSE, &bc);
|
||||
if (fn == NULL)
|
||||
goto endofcommand;
|
||||
proto_tree_add_string(tree, hf_smb_print_identifier, tvb, offset, fn_len,
|
||||
fn);
|
||||
COUNT_BYTES(fn_len);
|
||||
|
||||
END_OF_SMB
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
dissect_write_print_file_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, proto_tree *smb_tree)
|
||||
{
|
||||
int cnt;
|
||||
guint8 wc;
|
||||
guint16 bc;
|
||||
|
||||
WORD_COUNT;
|
||||
|
||||
/* fid */
|
||||
proto_tree_add_item(tree, hf_smb_fid, tvb, offset, 2, TRUE);
|
||||
offset += 2;
|
||||
|
||||
BYTE_COUNT;
|
||||
|
||||
/* buffer format */
|
||||
CHECK_BYTE_COUNT(1);
|
||||
proto_tree_add_item(tree, hf_smb_buffer_format, tvb, offset, 1, TRUE);
|
||||
COUNT_BYTES(1);
|
||||
|
||||
/* data len */
|
||||
CHECK_BYTE_COUNT(2);
|
||||
cnt = tvb_get_letohs(tvb, offset);
|
||||
proto_tree_add_uint(tree, hf_smb_data_len, tvb, offset, 2, cnt);
|
||||
COUNT_BYTES(2);
|
||||
|
||||
/* file data */
|
||||
offset = dissect_file_data(tvb, pinfo, tree, offset, cnt, cnt);
|
||||
|
||||
END_OF_SMB
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
|
||||
static const value_string print_status_vals[] = {
|
||||
{1, "Held or Stopped"},
|
||||
{2, "Printing"},
|
||||
{3, "Awaiting print"},
|
||||
{4, "In intercept"},
|
||||
{5, "File had error"},
|
||||
{6, "Printer error"},
|
||||
{0, NULL}
|
||||
};
|
||||
|
||||
static int
|
||||
dissect_get_print_queue_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, proto_tree *smb_tree)
|
||||
{
|
||||
guint8 wc;
|
||||
guint16 bc;
|
||||
|
||||
WORD_COUNT;
|
||||
|
||||
/* max count */
|
||||
proto_tree_add_item(tree, hf_smb_max_count, tvb, offset, 2, TRUE);
|
||||
offset += 2;
|
||||
|
||||
/* start index */
|
||||
proto_tree_add_item(tree, hf_smb_start_index, tvb, offset, 2, TRUE);
|
||||
offset += 2;
|
||||
|
||||
BYTE_COUNT;
|
||||
|
||||
END_OF_SMB
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
static int
|
||||
dissect_print_queue_element(tvbuff_t *tvb, packet_info *pinfo,
|
||||
proto_tree *parent_tree, int offset, guint16 *bc, gboolean *trunc)
|
||||
{
|
||||
proto_item *item = NULL;
|
||||
proto_tree *tree = NULL;
|
||||
int fn_len;
|
||||
const char *fn;
|
||||
|
||||
if(parent_tree){
|
||||
item = proto_tree_add_text(parent_tree, tvb, offset, 28,
|
||||
"Queue entry");
|
||||
tree = proto_item_add_subtree(item, ett_smb_print_queue_entry);
|
||||
}
|
||||
|
||||
/* queued time */
|
||||
if (*bc < 4) {
|
||||
*trunc = TRUE;
|
||||
return offset;
|
||||
}
|
||||
offset = dissect_smb_datetime(tvb, pinfo, tree, offset,
|
||||
hf_smb_print_queue_date,
|
||||
hf_smb_print_queue_dos_date, hf_smb_print_queue_dos_time, FALSE);
|
||||
*bc -= 4;
|
||||
|
||||
/* status */
|
||||
if (*bc < 1) {
|
||||
*trunc = TRUE;
|
||||
return offset;
|
||||
}
|
||||
proto_tree_add_item(tree, hf_smb_print_status, tvb, offset, 1, TRUE);
|
||||
offset += 1;
|
||||
*bc -= 1;
|
||||
|
||||
/* spool file number */
|
||||
if (*bc < 2) {
|
||||
*trunc = TRUE;
|
||||
return offset;
|
||||
}
|
||||
proto_tree_add_item(tree, hf_smb_print_spool_file_number, tvb, offset, 2, TRUE);
|
||||
offset += 2;
|
||||
*bc -= 2;
|
||||
|
||||
/* spool file size */
|
||||
if (*bc < 4) {
|
||||
*trunc = TRUE;
|
||||
return offset;
|
||||
}
|
||||
proto_tree_add_item(tree, hf_smb_print_spool_file_size, tvb, offset, 4, TRUE);
|
||||
offset += 4;
|
||||
*bc -= 4;
|
||||
|
||||
/* reserved byte */
|
||||
if (*bc < 1) {
|
||||
*trunc = TRUE;
|
||||
return offset;
|
||||
}
|
||||
proto_tree_add_item(tree, hf_smb_reserved, tvb, offset, 1, TRUE);
|
||||
offset += 1;
|
||||
*bc -= 1;
|
||||
|
||||
/* file name */
|
||||
fn_len = 16;
|
||||
fn = get_unicode_or_ascii_string_tvb(tvb, &offset, pinfo, &fn_len, TRUE, TRUE, bc);
|
||||
if (fn == NULL) {
|
||||
*trunc = TRUE;
|
||||
return offset;
|
||||
}
|
||||
proto_tree_add_string(tree, hf_smb_print_spool_file_name, tvb, offset, 16,
|
||||
fn);
|
||||
offset += fn_len;
|
||||
*bc -= fn_len;
|
||||
|
||||
*trunc = FALSE;
|
||||
return offset;
|
||||
}
|
||||
|
||||
static int
|
||||
dissect_get_print_queue_response(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset, proto_tree *smb_tree)
|
||||
{
|
||||
guint16 cnt=0, len;
|
||||
guint8 wc;
|
||||
guint16 bc;
|
||||
gboolean trunc;
|
||||
|
||||
WORD_COUNT;
|
||||
|
||||
/* count */
|
||||
cnt = tvb_get_letohs(tvb, offset);
|
||||
proto_tree_add_uint(tree, hf_smb_count, tvb, offset, 2, cnt);
|
||||
offset += 2;
|
||||
|
||||
/* restart index */
|
||||
proto_tree_add_item(tree, hf_smb_restart_index, tvb, offset, 2, TRUE);
|
||||
offset += 2;
|
||||
|
||||
BYTE_COUNT;
|
||||
|
||||
/* buffer format */
|
||||
CHECK_BYTE_COUNT(1);
|
||||
proto_tree_add_item(tree, hf_smb_buffer_format, tvb, offset, 1, TRUE);
|
||||
COUNT_BYTES(1);
|
||||
|
||||
/* data len */
|
||||
CHECK_BYTE_COUNT(2);
|
||||
len = tvb_get_letohs(tvb, offset);
|
||||
proto_tree_add_uint(tree, hf_smb_data_len, tvb, offset, 2, len);
|
||||
COUNT_BYTES(2);
|
||||
|
||||
/* queue elements */
|
||||
while(cnt--){
|
||||
offset = dissect_print_queue_element(tvb, pinfo, tree, offset,
|
||||
&bc, &trunc);
|
||||
if (trunc)
|
||||
goto endofcommand;
|
||||
}
|
||||
|
||||
END_OF_SMB
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
typedef struct _smb_function {
|
||||
|
@ -6510,11 +6784,10 @@ smb_function smb_dissector[256] = {
|
|||
/* 0xbd */ {NULL, NULL},
|
||||
/* 0xbe */ {NULL, NULL},
|
||||
/* 0xbf */ {NULL, NULL},
|
||||
|
||||
/* 0xc0 */ {NULL, NULL},
|
||||
/* 0xc1 */ {NULL, NULL},
|
||||
/* 0xc0 Open Print File*/ {dissect_open_print_file_request, dissect_fid},
|
||||
/* 0xc1 Write Print File*/ {dissect_write_print_file_request, dissect_empty},
|
||||
/* 0xc2 Close Print File*/ {dissect_fid, dissect_empty},
|
||||
/* 0xc3 */ {NULL, NULL},
|
||||
/* 0xc3 Get Print Queue*/ {dissect_get_print_queue_request, dissect_get_print_queue_response},
|
||||
/* 0xc4 */ {NULL, NULL},
|
||||
/* 0xc5 */ {NULL, NULL},
|
||||
/* 0xc6 */ {NULL, NULL},
|
||||
|
@ -7572,408 +7845,6 @@ get_unicode_or_ascii_string_tvb(tvbuff_t *tvb, int *offsetp,
|
|||
|
||||
|
||||
|
||||
|
||||
void
|
||||
dissect_open_print_file_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *parent, proto_tree *tree, struct smb_info si, int max_data, int SMB_offset)
|
||||
|
||||
{
|
||||
static const value_string Mode_0x03[] = {
|
||||
{ 0, "Text mode (DOS expands TABs)"},
|
||||
{ 1, "Graphics mode"},
|
||||
{ 0, NULL}
|
||||
};
|
||||
proto_tree *Mode_tree;
|
||||
proto_item *ti;
|
||||
guint8 WordCount;
|
||||
guint8 BufferFormat;
|
||||
guint16 SetupLength;
|
||||
guint16 Mode;
|
||||
guint16 FID;
|
||||
guint16 ByteCount;
|
||||
const char *IdentifierString;
|
||||
int string_len;
|
||||
|
||||
if (si.request) {
|
||||
/* Request(s) dissect code */
|
||||
|
||||
/* Build display for: Word Count (WCT) */
|
||||
|
||||
WordCount = GBYTE(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 1, "Word Count (WCT): %u", WordCount);
|
||||
|
||||
}
|
||||
|
||||
offset += 1; /* Skip Word Count (WCT) */
|
||||
|
||||
/* Build display for: Setup Length */
|
||||
|
||||
SetupLength = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "Setup Length: %u", SetupLength);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip Setup Length */
|
||||
|
||||
/* Build display for: Mode */
|
||||
|
||||
Mode = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
ti = proto_tree_add_text(tree, NullTVB, offset, 2, "Mode: 0x%02x", Mode);
|
||||
Mode_tree = proto_item_add_subtree(ti, ett_smb_mode);
|
||||
proto_tree_add_text(Mode_tree, NullTVB, offset, 2, "%s",
|
||||
decode_enumerated_bitfield(Mode, 0x03, 16, Mode_0x03, "%s"));
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip Mode */
|
||||
|
||||
/* Build display for: Byte Count (BCC) */
|
||||
|
||||
ByteCount = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "Byte Count (BCC): %u", ByteCount);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip Byte Count (BCC) */
|
||||
|
||||
/* Build display for: Buffer Format */
|
||||
|
||||
BufferFormat = GBYTE(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 1, "Buffer Format: %s (%u)",
|
||||
val_to_str(BufferFormat, buffer_format_vals, "Unknown"),
|
||||
BufferFormat);
|
||||
|
||||
}
|
||||
|
||||
offset += 1; /* Skip Buffer Format */
|
||||
|
||||
/* Build display for: Identifier String */
|
||||
|
||||
IdentifierString = get_unicode_or_ascii_string(pd, &offset, SMB_offset, si.unicode, &string_len);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, string_len, "Identifier String: %s", IdentifierString);
|
||||
|
||||
}
|
||||
|
||||
offset += string_len; /* Skip Identifier String */
|
||||
|
||||
} else {
|
||||
/* Response(s) dissect code */
|
||||
|
||||
/* Build display for: Word Count (WCT) */
|
||||
|
||||
WordCount = GBYTE(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 1, "Word Count (WCT): %u", WordCount);
|
||||
|
||||
}
|
||||
|
||||
offset += 1; /* Skip Word Count (WCT) */
|
||||
|
||||
/* Build display for: FID */
|
||||
|
||||
FID = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "FID: 0x%04x", FID);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip FID */
|
||||
|
||||
/* Build display for: Byte Count (BCC) */
|
||||
|
||||
ByteCount = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "Byte Count (BCC): %u", ByteCount);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip Byte Count (BCC) */
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
dissect_get_print_queue_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *parent, proto_tree *tree, struct smb_info si, int max_data, int SMB_offset)
|
||||
|
||||
{
|
||||
guint8 WordCount;
|
||||
guint8 BufferFormat;
|
||||
guint16 StartIndex;
|
||||
guint16 RestartIndex;
|
||||
guint16 MaxCount;
|
||||
guint16 DataLength;
|
||||
guint16 Count;
|
||||
guint16 ByteCount;
|
||||
|
||||
if (si.request) {
|
||||
/* Request(s) dissect code */
|
||||
|
||||
/* Build display for: Word Count */
|
||||
|
||||
WordCount = GBYTE(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 1, "Word Count (WCT): %u", WordCount);
|
||||
|
||||
}
|
||||
|
||||
offset += 1; /* Skip Word Count */
|
||||
|
||||
/* Build display for: Max Count */
|
||||
|
||||
MaxCount = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "Max Count: %u", MaxCount);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip Max Count */
|
||||
|
||||
/* Build display for: Start Index */
|
||||
|
||||
StartIndex = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "Start Index: %u", StartIndex);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip Start Index */
|
||||
|
||||
/* Build display for: Byte Count (BCC) */
|
||||
|
||||
ByteCount = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "Byte Count (BCC): %u", ByteCount);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip Byte Count (BCC) */
|
||||
|
||||
} else {
|
||||
/* Response(s) dissect code */
|
||||
|
||||
/* Build display for: Word Count (WCT) */
|
||||
|
||||
WordCount = GBYTE(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 1, "Word Count (WCT): %u", WordCount);
|
||||
|
||||
}
|
||||
|
||||
offset += 1; /* Skip Word Count (WCT) */
|
||||
|
||||
if (WordCount != 0) {
|
||||
|
||||
/* Build display for: Count */
|
||||
|
||||
Count = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "Count: %u", Count);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip Count */
|
||||
|
||||
/* Build display for: Restart Index */
|
||||
|
||||
RestartIndex = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "Restart Index: %u", RestartIndex);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip Restart Index */
|
||||
|
||||
/* Build display for: Byte Count (BCC) */
|
||||
|
||||
}
|
||||
|
||||
ByteCount = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "Byte Count (BCC): %u", ByteCount);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip Byte Count (BCC) */
|
||||
|
||||
/* Build display for: Buffer Format */
|
||||
|
||||
BufferFormat = GBYTE(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 1, "Buffer Format: %s (%u)",
|
||||
val_to_str(BufferFormat, buffer_format_vals, "Unknown"),
|
||||
BufferFormat);
|
||||
|
||||
}
|
||||
|
||||
offset += 1; /* Skip Buffer Format */
|
||||
|
||||
/* Build display for: Data Length */
|
||||
|
||||
DataLength = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "Data Length: %u", DataLength);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip Data Length */
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
dissect_write_print_file_smb(const u_char *pd, int offset, frame_data *fd, proto_tree *parent, proto_tree *tree, struct smb_info si, int max_data, int SMB_offset)
|
||||
|
||||
{
|
||||
guint8 WordCount;
|
||||
guint8 BufferFormat;
|
||||
guint16 FID;
|
||||
guint16 DataLength;
|
||||
guint16 ByteCount;
|
||||
|
||||
if (si.request) {
|
||||
/* Request(s) dissect code */
|
||||
|
||||
/* Build display for: Word Count (WCT) */
|
||||
|
||||
WordCount = GBYTE(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 1, "Word Count (WCT): %u", WordCount);
|
||||
|
||||
}
|
||||
|
||||
offset += 1; /* Skip Word Count (WCT) */
|
||||
|
||||
/* Build display for: FID */
|
||||
|
||||
FID = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "FID: 0x%04x", FID);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip FID */
|
||||
|
||||
/* Build display for: Byte Count (BCC) */
|
||||
|
||||
ByteCount = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "Byte Count (BCC): %u", ByteCount);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip Byte Count (BCC) */
|
||||
|
||||
/* Build display for: Buffer Format */
|
||||
|
||||
BufferFormat = GBYTE(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 1, "Buffer Format: %s (%u)",
|
||||
val_to_str(BufferFormat, buffer_format_vals, "Unknown"),
|
||||
BufferFormat);
|
||||
|
||||
}
|
||||
|
||||
offset += 1; /* Skip Buffer Format */
|
||||
|
||||
/* Build display for: Data Length */
|
||||
|
||||
DataLength = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "Data Length: %u", DataLength);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip Data Length */
|
||||
|
||||
} else {
|
||||
/* Response(s) dissect code */
|
||||
|
||||
/* Build display for: Word Count (WCT) */
|
||||
|
||||
WordCount = GBYTE(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 1, "Word Count (WCT): %u", WordCount);
|
||||
|
||||
}
|
||||
|
||||
offset += 1; /* Skip Word Count (WCT) */
|
||||
|
||||
/* Build display for: Byte Count (BCC) */
|
||||
|
||||
ByteCount = GSHORT(pd, offset);
|
||||
|
||||
if (tree) {
|
||||
|
||||
proto_tree_add_text(tree, NullTVB, offset, 2, "Byte Count (BCC): %u", ByteCount);
|
||||
|
||||
}
|
||||
|
||||
offset += 2; /* Skip Byte Count (BCC) */
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
static const value_string trans2_cmd_vals[] = {
|
||||
{ 0x00, "TRANS2_OPEN" },
|
||||
{ 0x01, "TRANS2_FIND_FIRST2" },
|
||||
|
@ -9733,10 +9604,10 @@ static void (*dissect[256])(const u_char *, int, frame_data *, proto_tree *, pro
|
|||
dissect_unknown_smb, /* unknown SMB 0xbe */
|
||||
dissect_unknown_smb, /* unknown SMB 0xbf */
|
||||
|
||||
dissect_open_print_file_smb,/* SMBsplopen open a print spool file */
|
||||
dissect_write_print_file_smb,/* SMBsplwr write to a print spool file */
|
||||
dissect_unknown_smb,
|
||||
dissect_get_print_queue_smb, /* SMBsplretq return print queue */
|
||||
dissect_unknown_smb,
|
||||
dissect_unknown_smb,
|
||||
dissect_unknown_smb,
|
||||
dissect_unknown_smb, /* unknown SMB 0xc4 */
|
||||
dissect_unknown_smb, /* unknown SMB 0xc5 */
|
||||
dissect_unknown_smb, /* unknown SMB 0xc6 */
|
||||
|
@ -12274,6 +12145,54 @@ proto_register_smb(void)
|
|||
{ "Change", "smb.change.time", FT_ABSOLUTE_TIME, BASE_NONE,
|
||||
NULL, 0, "Last Change Time", HFILL }},
|
||||
|
||||
{ &hf_smb_setup_len,
|
||||
{ "Setup Len", "smb.print.setup.len", FT_UINT16, BASE_DEC,
|
||||
NULL, 0, "Length of prionter setup data", HFILL }},
|
||||
|
||||
{ &hf_smb_print_mode,
|
||||
{ "Mode", "smb.print.mode", FT_UINT16, BASE_DEC,
|
||||
VALS(print_mode_vals), 0, "Text or Graphics mode", HFILL }},
|
||||
|
||||
{ &hf_smb_print_identifier,
|
||||
{ "Identifier", "smb.print.identifier", FT_STRING, BASE_NONE,
|
||||
NULL, 0, "Identifier string for this print job", HFILL }},
|
||||
|
||||
{ &hf_smb_restart_index,
|
||||
{ "Restart Index", "smb.print.restart_index", FT_UINT16, BASE_DEC,
|
||||
NULL, 0, "Index of entry after last returned", HFILL }},
|
||||
|
||||
{ &hf_smb_print_queue_date,
|
||||
{ "Queued", "smb.print.queued.date", FT_ABSOLUTE_TIME, BASE_NONE,
|
||||
NULL, 0, "Date when this entry was queued", HFILL }},
|
||||
|
||||
{ &hf_smb_print_queue_dos_date,
|
||||
{ "Queued Date", "smb.print.queued.smb.date", FT_UINT16, BASE_HEX,
|
||||
NULL, 0, "Date when this print job was queued, SMB_DATE format", HFILL }},
|
||||
|
||||
{ &hf_smb_print_queue_dos_time,
|
||||
{ "Queued Time", "smb.print.queued.smb.time", FT_UINT16, BASE_HEX,
|
||||
NULL, 0, "Time when this print job was queued, SMB_TIME format", HFILL }},
|
||||
|
||||
{ &hf_smb_print_status,
|
||||
{ "Status", "smb.print.status", FT_UINT8, BASE_HEX,
|
||||
VALS(print_status_vals), 0, "Status of this entry", HFILL }},
|
||||
|
||||
{ &hf_smb_print_spool_file_number,
|
||||
{ "Spool File Number", "smb.print.spool.file_number", FT_UINT16, BASE_DEC,
|
||||
NULL, 0, "Spool File Number, assigned by the spooler", HFILL }},
|
||||
|
||||
{ &hf_smb_print_spool_file_size,
|
||||
{ "Spool File Size", "smb.print.spool.file_size", FT_UINT32, BASE_DEC,
|
||||
NULL, 0, "Number of bytes in spool file", HFILL }},
|
||||
|
||||
{ &hf_smb_print_spool_file_name,
|
||||
{ "Name", "smb.print.spool.name", FT_BYTES, BASE_HEX,
|
||||
NULL, 0, "Name of client that submitted this job", HFILL }},
|
||||
|
||||
{ &hf_smb_start_index,
|
||||
{ "Start Index", "smb.print.start_index", FT_UINT16, BASE_DEC,
|
||||
NULL, 0, "First queue entry to return", HFILL }},
|
||||
|
||||
|
||||
};
|
||||
static gint *ett[] = {
|
||||
|
@ -12323,6 +12242,7 @@ proto_register_smb(void)
|
|||
&ett_smb_nt_notify_completion_filter,
|
||||
&ett_smb_nt_ioctl_flags,
|
||||
&ett_smb_security_information_mask,
|
||||
&ett_smb_print_queue_entry,
|
||||
};
|
||||
|
||||
proto_smb = proto_register_protocol("SMB (Server Message Block Protocol)",
|
||||
|
|
Loading…
Reference in New Issue