Ethereal-dev: [ethereal-dev] Some fixes/mods for packet-smb.c
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Mark Burton <markb@xxxxxxxxxx>
Date: Wed, 24 May 2000 21:54:48 +0100
Hi,
I enclose a patch (from the current CVS) that fixes various problems
and adds a little more functionality to packet-smb.c. I hope someone
will incorporate it into the source.
Regards,
Mark
Index: packet-smb.c
===================================================================
RCS file: /cvsroot/ethereal/packet-smb.c,v
retrieving revision 1.65
diff -c -r1.65 packet-smb.c
*** packet-smb.c 2000/05/11 08:15:46 1.65
--- packet-smb.c 2000/05/24 17:56:45
***************
*** 1084,1089 ****
--- 1084,1098 ----
offset += 2; /* Skip Data Length */
+ if (ByteCount > 0 && tree) {
+
+ if(END_OF_FRAME >= ByteCount)
+ proto_tree_add_text(tree, NullTVB, offset, ByteCount, "Data (%u bytes)", ByteCount);
+ else
+ proto_tree_add_text(tree, NullTVB, offset, END_OF_FRAME, "Data (first %u bytes)", END_OF_FRAME);
+
+ }
+
}
if (dirn == 0) { /* Response(s) dissect code */
***************
*** 1383,1388 ****
--- 1392,1398 ----
{
guint8 WordCount;
guint8 BufferFormat;
+ guint16 SearchAttributes;
guint16 ByteCount;
const char *FileName;
***************
*** 1400,1405 ****
--- 1410,1426 ----
offset += 1; /* Skip Word Count (WCT) */
+ /* Build display for: SearchAttributes */
+
+ SearchAttributes = GSHORT(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 2, "Search Attributes: %u", SearchAttributes);
+ }
+
+ offset += 2; /* Skip SearchAttributes */
+
/* Build display for: Byte Count (BCC) */
ByteCount = GSHORT(pd, offset);
***************
*** 2281,2298 ****
if (ByteCount > 0) {
! /* Build display for: ANSI Password */
! ANSIPassword = pd + offset;
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, ANSIAccountPasswordLength, "ANSI Password: %s", format_text(ANSIPassword, ANSIAccountPasswordLength));
! }
! offset += ANSIAccountPasswordLength; /* Skip ANSI Password */
! if (ANSIAccountPasswordLength == 0) offset++; /* Add 1 */
/* Build display for: UNICODE Password */
--- 2302,2321 ----
if (ByteCount > 0) {
! /* Build display for: ANSI Password */
! ANSIPassword = pd + offset;
! if (ANSIAccountPasswordLength > 0) {
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, ANSIAccountPasswordLength, "ANSI Password: %s", format_text(ANSIPassword, ANSIAccountPasswordLength));
! }
!
! offset += ANSIAccountPasswordLength; /* Skip ANSI Password */
! }
/* Build display for: UNICODE Password */
***************
*** 3426,3431 ****
--- 3449,3455 ----
}
+
void
dissect_checkdir_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, int errcode, int dirn)
***************
*** 5278,5283 ****
--- 5302,5644 ----
}
void
+ dissect_read_andx_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, int errcode, int dirn)
+
+ {
+ guint8 WordCount;
+ guint8 AndXReserved;
+ guint8 AndXCommand = 0xFF;
+ guint16 ByteCount;
+ guint16 AndXOffset = 0;
+ guint16 FID;
+ guint16 DataCompactionMode;
+ guint16 DataLength;
+ guint16 DataOffset;
+ guint16 Remaining;
+ guint16 MaxCount;
+ guint16 MinCount;
+ guint16 Reserved;
+ guint32 Offset;
+ guint32 OffsetHigh;
+ int i;
+
+ if (dirn == 1) { /* 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: AndXCommand */
+
+ AndXCommand = GBYTE(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 1, "AndXCommand: %u", AndXCommand);
+
+ }
+
+ offset += 1; /* Skip AndXCommand */
+
+ /* Build display for: AndXReserved */
+
+ AndXReserved = GBYTE(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 1, "AndXReserved: %u", AndXReserved);
+
+ }
+
+ offset += 1; /* Skip AndXReserved */
+
+ /* Build display for: AndXOffset */
+
+ AndXOffset = GSHORT(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 2, "AndXOffset: %u", AndXOffset);
+
+ }
+
+ offset += 2; /* Skip AndXOffset */
+
+ /* Build display for: FID */
+
+ FID = GSHORT(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 2, "FID: %u", FID);
+
+ }
+
+ offset += 2; /* Skip FID */
+
+ /* Build display for: Offset */
+
+ Offset = GWORD(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 4, "Offset: %u", Offset);
+
+ }
+
+ offset += 4; /* Skip Offset */
+
+ /* 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: Min Count */
+
+ MinCount = GSHORT(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 2, "Min Count: %u", MinCount);
+
+ }
+
+ offset += 2; /* Skip Min Count */
+
+ /* Build display for: Reserved */
+
+ Reserved = GWORD(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 4, "Reserved: %u", Reserved);
+
+ }
+
+ offset += 4; /* Skip Reserved */
+
+ /* Build display for: Remaining */
+
+ Remaining = GSHORT(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 2, "Remaining: %u", Remaining);
+
+ }
+
+ offset += 2; /* Skip Remaining */
+
+ if (WordCount == 12) {
+
+ /* Build display for: Offset High */
+
+ OffsetHigh = GWORD(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 4, "Offset High: %u", OffsetHigh);
+
+ }
+
+ offset += 4; /* Skip Offset High */
+ }
+
+ /* 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) */
+
+
+ if (AndXCommand != 0xFF) {
+
+ (dissect[AndXCommand])(pd, SMB_offset + AndXOffset, fd, parent, tree, si, max_data, SMB_offset, errcode, dirn);
+
+ }
+
+ }
+
+ if (dirn == 0) { /* 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: AndXCommand */
+
+ AndXCommand = GBYTE(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 1, "AndXCommand: %u", AndXCommand);
+
+ }
+
+ offset += 1; /* Skip AndXCommand */
+
+ /* Build display for: AndXReserved */
+
+ AndXReserved = GBYTE(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 1, "AndXReserved: %u", AndXReserved);
+
+ }
+
+ offset += 1; /* Skip AndXReserved */
+
+ /* Build display for: AndXOffset */
+
+ AndXOffset = GSHORT(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 2, "AndXOffset: %u", AndXOffset);
+
+ }
+
+ offset += 2; /* Skip AndXOffset */
+
+ /* Build display for: Remaining */
+
+ Remaining = GSHORT(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 2, "Remaining: %u", Remaining);
+
+ }
+
+ offset += 2; /* Skip Remaining */
+
+ /* Build display for: Data Compaction Mode */
+
+ DataCompactionMode = GSHORT(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 2, "Data Compaction Mode: %u", DataCompactionMode);
+
+ }
+
+ offset += 2; /* Skip Data Compaction Mode */
+
+ /* Build display for: Reserved */
+
+ Reserved = GSHORT(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 2, "Reserved: %u", Reserved);
+
+ }
+
+ offset += 2; /* Skip Reserved */
+
+ /* 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 */
+
+ /* Build display for: Data Offset */
+
+ DataOffset = GSHORT(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 2, "Data Offset: %u", DataOffset);
+
+ }
+
+ offset += 2; /* Skip Data Offset */
+
+ /* Build display for: Reserved[5] */
+
+ for(i = 1; i <= 5; ++i) {
+
+ Reserved = GSHORT(pd, offset);
+
+ if (tree) {
+
+ proto_tree_add_text(tree, NullTVB, offset, 2, "Reserved%u: %u", i, Reserved);
+
+ }
+ offset += 2;
+ }
+
+ /* 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 data */
+
+ if (tree) {
+
+ offset = SMB_offset + DataOffset;
+ if(END_OF_FRAME >= DataLength)
+ proto_tree_add_text(tree, NullTVB, offset, DataLength, "Data (%u bytes)", DataLength);
+ else
+ proto_tree_add_text(tree, NullTVB, offset, END_OF_FRAME, "Data (first %u bytes)", END_OF_FRAME);
+
+ }
+
+ if (AndXCommand != 0xFF) {
+
+ (dissect[AndXCommand])(pd, SMB_offset + AndXOffset, fd, parent, tree, si, max_data, SMB_offset, errcode, dirn);
+
+ }
+
+ }
+
+ }
+
+ void
dissect_logoff_andx_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, int errcode, int dirn)
{
***************
*** 8195,8200 ****
--- 8556,8562 ----
"TRANS2_FIND_FIRST2",
"TRANS2_FIND_NEXT2",
"TRANS2_QUERY_FS_INFORMATION",
+ "no such command",
"TRANS2_QUERY_PATH_INFORMATION",
"TRANS2_SET_PATH_INFORMATION",
"TRANS2_QUERY_FILE_INFORMATION",
***************
*** 8233,8240 ****
guint8 SetupCount;
guint8 Reserved3;
guint8 Reserved1;
- guint8 Pad2;
- guint8 Pad1;
guint8 MaxSetupCount;
guint8 Data;
guint32 Timeout;
--- 8595,8600 ----
***************
*** 8561,8579 ****
}
! if (offset % 2) {
! /* Build display for: Pad1 */
! Pad1 = GBYTE(pd, offset);
if (tree) {
-
- proto_tree_add_text(tree, NullTVB, offset, 1, "Pad1: %u", Pad1);
}
!
! offset += 1; /* Skip Pad1 */
}
--- 8921,8938 ----
}
! if (offset < (SMB_offset + ParameterOffset)) {
! int pad1Count = SMB_offset + ParameterOffset - offset;
! /* Build display for: Pad1 */
if (tree) {
+ proto_tree_add_text(tree, NullTVB, offset, pad1Count, "Pad1: %s", format_text(pd + offset, pad1Count));
}
!
! offset += pad1Count; /* Skip Pad1 */
}
***************
*** 8591,8609 ****
}
! if (offset % 2) {
/* Build display for: Pad2 */
- Pad2 = GBYTE(pd, offset);
-
if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 1, "Pad2: %u", Pad2);
}
! offset += 1; /* Skip Pad2 */
}
--- 8950,8968 ----
}
! if (DataCount > 0 && offset < (SMB_offset + DataOffset)) {
!
! int pad2Count = SMB_offset + DataOffset - offset;
/* Build display for: Pad2 */
if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, pad2Count, "Pad2: %s", format_text(pd + offset, pad2Count));
}
! offset += pad2Count; /* Skip Pad2 */
}
***************
*** 8778,8795 ****
offset += 1; /* Skip Reserved3 */
! /* Build display for: Setup */
! Setup = GSHORT(pd, offset);
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 2, "Setup: %u", Setup);
! }
! offset += 2; /* Skip Setup */
/* Build display for: Byte Count (BCC) */
ByteCount = GSHORT(pd, offset);
--- 9137,9163 ----
offset += 1; /* Skip Reserved3 */
! if (SetupCount > 0) {
! int i = SetupCount;
! Setup = GSHORT(pd, offset);
! for (i = 1; i <= SetupCount; i++) {
!
! Setup = GSHORT(pd, offset);
! if (tree) {
!
! proto_tree_add_text(tree, NullTVB, offset, 2, "Setup%i: %u", i, Setup);
! }
+ offset += 2; /* Skip Setup */
+
+ }
+ }
+
/* Build display for: Byte Count (BCC) */
ByteCount = GSHORT(pd, offset);
***************
*** 8802,8818 ****
offset += 2; /* Skip Byte Count (BCC) */
! /* Build display for: Pad1 */
! Pad1 = GBYTE(pd, offset);
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 1, "Pad1: %u", Pad1);
! }
! offset += 1; /* Skip Pad1 */
/* Build display for: Parameter */
--- 9170,9189 ----
offset += 2; /* Skip Byte Count (BCC) */
! if (offset < (SMB_offset + ParameterOffset)) {
! int pad1Count = SMB_offset + ParameterOffset - offset;
! /* Build display for: Pad1 */
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, pad1Count, "Pad1: %s", format_text(pd + offset, pad1Count));
! }
! offset += pad1Count; /* Skip Pad1 */
!
! }
/* Build display for: Parameter */
***************
*** 8828,8845 ****
}
! /* Build display for: Pad2 */
! Pad2 = GBYTE(pd, offset);
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 1, "Pad2: %u", Pad2);
! }
! offset += 1; /* Skip Pad2 */
/* Build display for: Data */
if (DataCount > 0) {
--- 9199,9220 ----
}
! if (DataCount > 0 && offset < (SMB_offset + DataOffset)) {
! int pad2Count = SMB_offset + DataOffset - offset;
!
! /* Build display for: Pad2 */
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, pad2Count, "Pad2: %s", format_text(pd + offset, pad2Count));
! }
! offset += pad2Count; /* Skip Pad2 */
+ }
+
/* Build display for: Data */
if (DataCount > 0) {
***************
*** 8865,8871 ****
char *TransactNameCopy;
char *trans_type = NULL, *trans_cmd, *loc_of_slash = NULL;
int index;
- guint8 Pad2;
const gchar *Data;
if (!TransactName)
--- 9240,9245 ----
***************
*** 8908,8927 ****
offset = SMB_offset + ParameterOffset + ParameterCount; /* Skip Parameters */
}
! if (offset % 2) {
/* Build display for: Pad2 */
- Pad2 = GBYTE(pd, offset);
-
if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 1, "Pad2: %u: %u", Pad2, offset);
}
! offset += 1; /* Skip Pad2 */
}
--- 9282,9301 ----
offset = SMB_offset + ParameterOffset + ParameterCount; /* Skip Parameters */
}
+
+ if (DataCount > 0 && offset < (SMB_offset + DataOffset)) {
! int pad2Count = SMB_offset + DataOffset - offset;
/* Build display for: Pad2 */
if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, pad2Count, "Pad2: %s", format_text(pd + offset, pad2Count));
}
! offset += pad2Count; /* Skip Pad2 */
}
***************
*** 8954,8960 ****
guint8 SetupCount;
guint8 Reserved3;
guint8 Reserved1;
- guint8 Pad1;
guint8 MaxSetupCount;
guint32 Timeout;
guint16 TotalParameterCount;
--- 9328,9333 ----
***************
*** 9297,9315 ****
offset += TNlen; /* Skip Transact Name */
if (si.unicode) offset += 2; /* There are two more extraneous bytes there*/
! if (offset % 2) {
! /* Build display for: Pad1 */
! Pad1 = GBYTE(pd, offset);
if (tree) {
-
- proto_tree_add_text(tree, NullTVB, offset, 1, "Pad1: %u", Pad1);
}
!
! offset += 1; /* Skip Pad1 */
}
--- 9670,9687 ----
offset += TNlen; /* Skip Transact Name */
if (si.unicode) offset += 2; /* There are two more extraneous bytes there*/
! if (offset < (SMB_offset + ParameterOffset)) {
! int pad1Count = SMB_offset + ParameterOffset - offset;
! /* Build display for: Pad1 */
if (tree) {
+ proto_tree_add_text(tree, NullTVB, offset, pad1Count, "Pad1: %s", format_text(pd + offset, pad1Count));
}
!
! offset += pad1Count; /* Skip Pad1 */
}
***************
*** 9480,9497 ****
if (SetupCount > 0) {
! /* Hmmm, should code for all setup words ... */
Setup = GSHORT(pd, offset);
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 2, "Setup: %u", Setup);
! }
! offset += 2; /* Skip Setup */
}
/* Build display for: Byte Count (BCC) */
--- 9852,9875 ----
if (SetupCount > 0) {
! int i = SetupCount;
Setup = GSHORT(pd, offset);
! for (i = 1; i <= SetupCount; i++) {
!
! Setup = GSHORT(pd, offset);
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 2, "Setup%i: %u", i, Setup);
!
! }
! offset += 2; /* Skip Setup */
+ }
+
}
/* Build display for: Byte Count (BCC) */
***************
*** 9508,9524 ****
/* Build display for: Pad1 */
! if (offset % 2) {
! Pad1 = GBYTE(pd, offset);
! if (tree) {
! proto_tree_add_text(tree, NullTVB, offset, 1, "Pad1: %u", Pad1);
}
! offset += 1; /* Skip Pad1 */
}
--- 9886,9903 ----
/* Build display for: Pad1 */
! if (offset < (SMB_offset + ParameterOffset)) {
! int pad1Count = SMB_offset + ParameterOffset - offset;
! /* Build display for: Pad1 */
! if (tree) {
+ proto_tree_add_text(tree, NullTVB, offset, pad1Count, "Pad1: %s", format_text(pd + offset, pad1Count));
}
! offset += pad1Count; /* Skip Pad1 */
}
***************
*** 9534,9541 ****
void (*dissect[256])(const u_char *, int, frame_data *, proto_tree *, proto_tree *, struct smb_info, int, int, int, int) = {
! dissect_unknown_smb, /* unknown SMB 0x00 */
! dissect_unknown_smb, /* unknown SMB 0x01 */
dissect_unknown_smb, /* SMBopen open a file */
dissect_create_file_smb, /* SMBcreate create a file */
dissect_close_smb, /* SMBclose close a file */
--- 9913,9920 ----
void (*dissect[256])(const u_char *, int, frame_data *, proto_tree *, proto_tree *, struct smb_info, int, int, int, int) = {
! dissect_createdir_smb, /* unknown SMB 0x00 */
! dissect_deletedir_smb, /* unknown SMB 0x01 */
dissect_unknown_smb, /* SMBopen open a file */
dissect_create_file_smb, /* SMBcreate create a file */
dissect_close_smb, /* SMBclose close a file */
***************
*** 9580,9586 ****
dissect_unknown_smb, /* SMBecho echo */
dissect_unknown_smb, /* SMBwriteclose write a file and then close it */
dissect_open_andx_smb, /* SMBopenX open and X */
! dissect_unknown_smb, /* SMBreadX read and X */
dissect_unknown_smb, /* SMBwriteX write and X */
dissect_unknown_smb, /* unknown SMB 0x30 */
dissect_unknown_smb, /* unknown SMB 0x31 */
--- 9959,9965 ----
dissect_unknown_smb, /* SMBecho echo */
dissect_unknown_smb, /* SMBwriteclose write a file and then close it */
dissect_open_andx_smb, /* SMBopenX open and X */
! dissect_read_andx_smb, /* SMBreadX read and X */
dissect_unknown_smb, /* SMBwriteX write and X */
dissect_unknown_smb, /* unknown SMB 0x30 */
dissect_unknown_smb, /* unknown SMB 0x31 */
***************
*** 9880,9886 ****
{SMBE_useSTD, "Temporarily unable to use raw mode, use standard mode"},
{SMBE_contMPX, "Resume MPX mode"},
{SMBE_badPW, "Bad Password???"},
! {SMBE_nosupport, "Operation not supported???"},
{ 0, 0}
};
--- 10259,10265 ----
{SMBE_useSTD, "Temporarily unable to use raw mode, use standard mode"},
{SMBE_contMPX, "Resume MPX mode"},
{SMBE_badPW, "Bad Password???"},
! {SMBE_nosupport, "Operation not supported"},
{ 0, 0}
};
***************
*** 9909,9915 ****
{0, 0}
};
! char *decode_smb_error(guint8 errcls, guint8 errcode)
{
switch (errcls) {
--- 10288,10294 ----
{0, 0}
};
! char *decode_smb_error(guint8 errcls, guint16 errcode)
{
switch (errcls) {
***************
*** 9951,9956 ****
--- 10330,10336 ----
proto_item *ti, *tf;
guint8 cmd, errcls, errcode1, flags;
guint16 flags2, errcode, tid, pid, uid, mid;
+ guint32 status;
int SMB_offset = offset;
struct smb_info si;
***************
*** 9993,10032 ****
offset += 1;
! /* Next, look at the error class, SMB_RETCLASS */
! errcls = pd[offset];
! if (tree) {
- proto_tree_add_text(smb_tree, NullTVB, offset, 1, "Error Class: %s",
- val_to_str((guint8)pd[offset], errcls_types, "Unknown Error Class (%x)"));
}
! offset += 1;
! /* Error code, SMB_HEINFO ... */
! errcode1 = pd[offset];
! if (tree) {
! proto_tree_add_text(smb_tree, NullTVB, offset, 1, "Reserved: %i", errcode1);
! }
! offset += 1;
! errcode = GSHORT(pd, offset);
! if (tree) {
! proto_tree_add_text(smb_tree, NullTVB, offset, 2, "Error Code: %s",
! decode_smb_error(errcls, errcode));
! }
! offset += 2;
/* Now for the flags: Bit 0 = 0 means cmd, 0 = 1 means resp */
--- 10373,10433 ----
offset += 1;
! /* Handle error code */
! if (GSHORT(pd, SMB_offset + 10) & 0x4000) {
! /* handle NT 32 bit error code */
! errcode = 0; /* better than a random number */
! status = GWORD(pd, offset);
! if (tree) {
!
! proto_tree_add_text(smb_tree, NullTVB, offset, 4, "Status: 0x%08x",
! status);
!
! }
!
! offset += 4;
}
+ else {
+ /* handle DOS error code & class */
! /* Next, look at the error class, SMB_RETCLASS */
! errcls = pd[offset];
! if (tree) {
! proto_tree_add_text(smb_tree, NullTVB, offset, 1, "Error Class: %s",
! val_to_str((guint8)pd[offset], errcls_types, "Unknown Error Class (%x)"));
! }
! offset += 1;
! /* Error code, SMB_HEINFO ... */
! errcode1 = pd[offset];
! if (tree) {
! proto_tree_add_text(smb_tree, NullTVB, offset, 1, "Reserved: %i", errcode1);
! }
! offset += 1;
! errcode = GSHORT(pd, offset);
!
! if (tree) {
!
! proto_tree_add_text(smb_tree, NullTVB, offset, 2, "Error Code: %s",
! decode_smb_error(errcls, errcode));
!
! }
!
! offset += 2;
! }
/* Now for the flags: Bit 0 = 0 means cmd, 0 = 1 means resp */
- Follow-Ups:
- Re: [ethereal-dev] Some fixes/mods for packet-smb.c
- From: Guy Harris
- Re: [ethereal-dev] Some fixes/mods for packet-smb.c
- Prev by Date: Re: [ethereal-dev] #6
- Next by Date: [ethereal-dev] RE: [ethereal-users] Win95, Sqaures instead of english
- Previous by thread: Re: [ethereal-dev] #6
- Next by thread: Re: [ethereal-dev] Some fixes/mods for packet-smb.c
- Index(es):





