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:
Guy Harris 2001-11-09 06:43:38 +00:00
parent c7fbf7f888
commit e6b12dd801
1 changed files with 350 additions and 430 deletions

View File

@ -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)",