Index: epan/dissectors/packet-dcerpc.c =================================================================== --- epan/dissectors/packet-dcerpc.c (revision 31579) +++ epan/dissectors/packet-dcerpc.c (working copy) @@ -1428,7 +1428,7 @@ buffer_len = size_is * (guint32)len; /* Adjust offset */ - if (offset % size_is) + if (!di->no_align && (offset % size_is)) offset += size_is - (offset % size_is); if (size_is == sizeof(guint16)) { @@ -1615,7 +1615,7 @@ buffer_len = size_is * (guint32)len; /* Adjust offset */ - if (offset % size_is) + if (!di->no_align && (offset % size_is)) offset += size_is - (offset % size_is); if (size_is == sizeof(guint16)) { Index: epan/dissectors/packet-dcerpc.h =================================================================== --- epan/dissectors/packet-dcerpc.h (revision 31579) +++ epan/dissectors/packet-dcerpc.h (working copy) @@ -325,6 +325,7 @@ guint16 smb_fid; /* FID for DCERPC over SMB */ guint8 ptype; /* packet type: PDU_REQ, PDU_RESP, ... */ gboolean conformant_run; + gboolean no_align; /* are data aligned? (default yes) */ gint32 conformant_eaten; /* how many bytes did the conformant run eat?*/ guint32 array_max_count; /* max_count for conformant arrays */ guint32 array_max_count_offset; Index: epan/dissectors/packet-dcerpc-ndr.c =================================================================== --- epan/dissectors/packet-dcerpc-ndr.c (revision 31579) +++ epan/dissectors/packet-dcerpc-ndr.c (working copy) @@ -129,7 +129,7 @@ } - if (offset % 2) { + if (!di->no_align && (offset % 2)) { offset++; } return dissect_dcerpc_uint16 (tvb, offset, pinfo, @@ -151,7 +151,7 @@ } - if (offset % 2) { + if (!di->no_align && (offset % 2)) { offset++; } offset=dissect_dcerpc_uint16 (tvb, offset, pinfo, @@ -207,7 +207,7 @@ } - if (offset % 4) { + if (!di->no_align && (offset % 4)) { offset += 4 - (offset % 4); } return dissect_dcerpc_uint32 (tvb, offset, pinfo, @@ -277,7 +277,7 @@ } - if (offset % 4) { + if (!di->no_align && (offset % 4)) { offset += 4 - (offset % 4); } offset=dissect_dcerpc_uint32 (tvb, offset, pinfo, @@ -337,7 +337,7 @@ return offset; } - if (offset % 4) { + if (!di->no_align && (offset % 4)) { offset += 4 - (offset % 4); } return dissect_dcerpc_uint64 (tvb, offset, pinfo, @@ -360,7 +360,7 @@ return offset; } - if (offset % 8) { + if (!di->no_align && (offset % 8)) { offset += 8 - (offset % 8); } return dissect_dcerpc_uint64 (tvb, offset, pinfo, @@ -381,7 +381,7 @@ return offset; } - if (offset % 8) { + if (!di->no_align && (offset % 8)) { offset += 8 - (offset % 8); } offset=dissect_dcerpc_uint64 (tvb, offset, pinfo, @@ -437,7 +437,7 @@ return offset; } - if (offset % 4) { + if (!di->no_align && (offset % 4)) { offset += 4 - (offset % 4); } return dissect_dcerpc_float(tvb, offset, pinfo, @@ -459,7 +459,7 @@ return offset; } - if (offset % 8) { + if (!di->no_align && (offset % 8)) { offset += 8 - (offset % 8); } return dissect_dcerpc_double(tvb, offset, pinfo, @@ -481,7 +481,7 @@ } - if (offset % 4) { + if (!di->no_align && (offset % 4)) { offset += 4 - (offset % 4); } return dissect_dcerpc_time_t (tvb, offset, pinfo, @@ -502,7 +502,7 @@ } /* uuid's are aligned to 4 bytes, due to initial uint32 in struct */ - if (offset % 4) { + if (!di->no_align && (offset % 4)) { offset += 4 - (offset % 4); } return dissect_dcerpc_uuid_t (tvb, offset, pinfo, @@ -532,7 +532,7 @@ return offset; } - if (offset % 4) { + if (!di->no_align && (offset % 4)) { offset += 4 - (offset % 4); } ctx_hnd.attributes = dcerpc_tvb_get_ntohl (tvb, offset, drep);