diff options
Diffstat (limited to 'packet-smb.c')
-rw-r--r-- | packet-smb.c | 780 |
1 files changed, 350 insertions, 430 deletions
diff --git a/packet-smb.c b/packet-smb.c index d68d048e7a..2cd3e4f997 100644 --- a/packet-smb.c +++ b/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)", |