2 * Routines for dcerpc endpoint mapper dissection
3 * Copyright 2001, Todd Sabin <tas@webspan.net>
5 * $Id: packet-dcerpc-epm.c,v 1.19 2003/01/28 06:39:39 tpot Exp $
7 * Ethereal - Network traffic analyzer
8 * By Gerald Combs <gerald@ethereal.com>
9 * Copyright 1998 Gerald Combs
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
34 #include <epan/packet.h>
35 #include "packet-dcerpc.h"
36 #include "packet-dcerpc-nt.h"
39 static int proto_epm = -1;
41 static int hf_epm_opnum = -1;
42 static int hf_epm_inquiry_type = -1;
43 static int hf_epm_object = -1;
44 static int hf_epm_if_id = -1;
45 static int hf_epm_ver_maj = -1;
46 static int hf_epm_ver_min = -1;
47 static int hf_epm_ver_opt = -1;
48 static int hf_epm_hnd = -1;
49 static int hf_epm_max_ents = -1;
50 static int hf_epm_num_ents = -1;
51 static int hf_epm_uuid = -1;
52 static int hf_epm_tower_length = -1;
53 static int hf_epm_tower_data = -1;
54 static int hf_epm_max_towers = -1;
55 static int hf_epm_num_towers = -1;
56 static int hf_epm_rc = -1;
57 static int hf_epm_replace = -1;
58 static int hf_epm_tower_num_floors = -1;
59 static int hf_epm_tower_rhs_len = -1;
60 static int hf_epm_tower_lhs_len = -1;
61 static int hf_epm_tower_proto_id = -1;
62 static int hf_epm_annotation = -1;
63 static int hf_epm_ann_offset = -1;
64 static int hf_epm_ann_len = -1;
65 static int hf_epm_proto_named_pipes = -1;
66 static int hf_epm_proto_netbios_name = -1;
67 static int hf_epm_proto_ip = -1;
68 static int hf_epm_proto_udp_port = -1;
69 static int hf_epm_proto_tcp_port = -1;
71 static gint ett_epm = -1;
72 static gint ett_epm_tower_floor = -1;
73 static gint ett_epm_entry = -1;
75 static e_uuid_t uuid_epm = { 0xe1af8308, 0x5d1f, 0x11c9, { 0x91, 0xa4, 0x08, 0x00, 0x2b, 0x14, 0xa0, 0xfa } };
76 static guint16 ver_epm = 3;
80 unsigned int tower_len,
81 [size_is(tower_len)] char tower[];
84 static int epm_dissect_tower (tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *drep);
88 epm_dissect_pointer_IF_ID(tvbuff_t *tvb, int offset,
89 packet_info *pinfo, proto_tree *tree,
94 di=pinfo->private_data;
95 offset = dissect_ndr_uuid_t (tvb, offset, pinfo, tree, drep,
97 offset = dissect_ndr_uint16 (tvb, offset, pinfo, tree, drep,
98 hf_epm_ver_maj, NULL);
99 offset = dissect_ndr_uint16 (tvb, offset, pinfo, tree, drep,
100 hf_epm_ver_min, NULL);
105 epm_dissect_pointer_UUID(tvbuff_t *tvb, int offset,
106 packet_info *pinfo, proto_tree *tree,
111 di=pinfo->private_data;
112 offset = dissect_ndr_uuid_t (tvb, offset, pinfo, tree, drep,
118 epm_dissect_ept_lookup_rqst (tvbuff_t *tvb, int offset,
119 packet_info *pinfo, proto_tree *tree,
122 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
123 hf_epm_inquiry_type, NULL);
125 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
126 epm_dissect_pointer_UUID, NDR_POINTER_PTR,
127 "Object:", hf_epm_object);
129 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
130 epm_dissect_pointer_IF_ID, NDR_POINTER_PTR,
131 "Interface:", hf_epm_if_id);
133 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
134 hf_epm_ver_opt, NULL);
136 offset = dissect_ndr_ctx_hnd (tvb, offset, pinfo, tree, drep,
139 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
140 hf_epm_max_ents, NULL);
146 epm_dissect_ept_entry_t(tvbuff_t *tvb, int offset,
147 packet_info *pinfo, proto_tree *parent_tree,
150 proto_item *item=NULL;
151 proto_tree *tree=NULL;
152 int old_offset=offset;
158 di=pinfo->private_data;
159 if(di->conformant_run){
164 item = proto_tree_add_text(parent_tree, tvb, offset, -1, "Entry:");
165 tree = proto_item_add_subtree(item, ett_epm_entry);
168 offset = dissect_ndr_uuid_t (tvb, offset, pinfo, tree, drep,
169 hf_epm_object, NULL);
171 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
172 epm_dissect_tower, NDR_POINTER_PTR,
173 "Tower pointer:", -1);
175 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
176 hf_epm_ann_offset, NULL);
177 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
178 hf_epm_ann_len, &len);
179 str=(const char *)tvb_get_ptr(tvb, offset, -1);
181 strlen=MIN(strlen,tvb_length_remaining(tvb, offset));
182 proto_tree_add_item(tree, hf_epm_annotation, tvb, offset, len, TRUE);
187 proto_item_append_text(item, " Service:%*s ", strlen, str);
188 proto_item_append_text(tree->parent, " Service:%*s ", strlen, str);
190 if (check_col(pinfo->cinfo, COL_INFO)) {
191 col_append_fstr(pinfo->cinfo, COL_INFO, ", Service:%*s", strlen, str);
195 proto_item_set_len(item, offset-old_offset);
200 epm_dissect_ept_entry_t_array(tvbuff_t *tvb, int offset,
201 packet_info *pinfo, proto_tree *tree,
204 offset = dissect_ndr_ucvarray(tvb, offset, pinfo, tree, drep,
205 epm_dissect_ept_entry_t);
211 epm_dissect_ept_lookup_resp (tvbuff_t *tvb, int offset,
212 packet_info *pinfo, proto_tree *tree,
215 offset = dissect_ndr_ctx_hnd (tvb, offset, pinfo, tree, drep,
218 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
219 hf_epm_num_ents, NULL);
221 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
222 epm_dissect_ept_entry_t_array, NDR_POINTER_REF,
225 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
233 epm_dissect_uuid (tvbuff_t *tvb, int offset,
234 packet_info *pinfo, proto_tree *tree,
237 offset = dissect_ndr_uuid_t (tvb, offset, pinfo, tree, drep,
245 static const value_string proto_id_vals[] = {
249 { 0x06, "OSI CLNS or DNA Routing"},
253 { 0x0a, "RPC connectionless protocol"},
254 { 0x0b, "RPC connection-oriented protocol"},
255 { 0x02, "DNA Session Control"},
256 { 0x03, "DNA Session Control V3"},
257 { 0x04, "DNA NSP Transport"},
258 { 0x0f, "Named Pipes"},
259 { 0x10, "Named Pipes"},
262 { 0x13, "Netware SPX"},
263 { 0x14, "Netware IPX"},
264 { 0x16, "Appletalk Stream"},
265 { 0x17, "Appletalk Datagram"},
266 { 0x18, "Appletalk"},
268 { 0x1a, "Vines SPP"},
269 { 0x1b, "Vines IPC"},
270 { 0x1c, "StreetTalk"},
271 { 0x20, "Unix Domain Socket"},
278 /* XXX this function assumes LE encoding. can not use the NDR routines
279 since they assume padding.
282 epm_dissect_tower_data (tvbuff_t *tvb, int offset,
283 packet_info *pinfo, proto_tree *tree,
286 guint16 num_floors, i;
289 di=pinfo->private_data;
290 if(di->conformant_run){
294 num_floors = tvb_get_letohs(tvb, offset);
295 proto_tree_add_uint(tree, hf_epm_tower_num_floors, tvb, offset, 2, num_floors);
298 for(i=1;i<=num_floors;i++){
299 proto_item *it = NULL;
300 proto_tree *tr = NULL;
301 int old_offset = offset;
306 it = proto_tree_add_text(tree, tvb, offset, 0, "Floor %d ", i);
307 tr = proto_item_add_subtree(it, ett_epm_tower_floor);
309 len = tvb_get_letohs(tvb, offset);
310 proto_tree_add_uint(tr, hf_epm_tower_lhs_len, tvb, offset, 2, len);
313 proto_id = tvb_get_guint8(tvb, offset);
314 proto_tree_add_uint(tr, hf_epm_tower_proto_id, tvb, offset, 1, proto_id);
317 case 0x0d: /* UUID */
318 dcerpc_tvb_get_uuid (tvb, offset+1, drep, &uuid);
319 proto_tree_add_string_format (tr, hf_epm_uuid, tvb, offset+1, 16, "",
320 "UUID: %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
321 uuid.Data1, uuid.Data2, uuid.Data3,
322 uuid.Data4[0], uuid.Data4[1],
323 uuid.Data4[2], uuid.Data4[3],
324 uuid.Data4[4], uuid.Data4[5],
325 uuid.Data4[6], uuid.Data4[7]);
326 proto_tree_add_text(tr, tvb, offset+17, 2, "Version %d.%d", tvb_get_guint8(tvb, offset+18), tvb_get_guint8(tvb, offset+17));
331 len = tvb_get_letohs(tvb, offset);
332 proto_tree_add_uint(tr, hf_epm_tower_rhs_len, tvb, offset, 2, len);
336 case 0x07: /* TCP this one is always big endian */
337 proto_tree_add_item(tr, hf_epm_proto_tcp_port, tvb, offset, 2, FALSE);
338 proto_item_append_text(tr, "TCP Port:%d", tvb_get_ntohs(tvb, offset));
341 case 0x08: /* UDP this one is always big endian */
342 proto_tree_add_item(tr, hf_epm_proto_udp_port, tvb, offset, 2, FALSE);
343 proto_item_append_text(tr, "UDP Port:%d", tvb_get_ntohs(tvb, offset));
346 case 0x09: /* IP this one is always big endian */
347 proto_tree_add_item(tr, hf_epm_proto_ip, tvb, offset, 4, TRUE);
348 proto_item_append_text(tr, "IP:%s", ip_to_str(tvb_get_ptr(tvb, offset, 4)));
351 case 0x0f: /* \\PIPE\xxx named pipe */
352 proto_tree_add_item(tr, hf_epm_proto_named_pipes, tvb, offset, len, TRUE);
353 proto_item_append_text(tr, "NamedPipe:%*s",MIN(len,tvb_length_remaining(tvb, offset)), tvb_get_ptr(tvb, offset, -1));
356 case 0x10: /* PIPENAME named pipe */
357 proto_tree_add_item(tr, hf_epm_proto_named_pipes, tvb, offset, len, TRUE);
358 proto_item_append_text(tr, "PIPE:%*s",MIN(len,tvb_length_remaining(tvb, offset)), tvb_get_ptr(tvb, offset, -1));
361 case 0x11: /* \\NETBIOS netbios name */
362 proto_tree_add_item(tr, hf_epm_proto_netbios_name, tvb, offset, len, TRUE);
363 proto_item_append_text(tr, "NetBIOS:%*s",MIN(len,tvb_length_remaining(tvb, offset)), tvb_get_ptr(tvb, offset, -1));
367 proto_tree_add_text(tr, tvb, offset, len, "not decoded yet");
372 proto_item_set_len(it, offset-old_offset);
378 unsigned int tower_len,
379 [size_is(tower_len)] char tower[];
383 epm_dissect_tower (tvbuff_t *tvb, int offset,
384 packet_info *pinfo, proto_tree *tree,
390 di=pinfo->private_data;
391 if(di->conformant_run){
395 /* first one is the header of the conformant array, second one is the
397 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
398 hf_epm_tower_length, &len);
399 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
400 hf_epm_tower_length, NULL);
401 offset = epm_dissect_tower_data(tvb, offset, pinfo, tree, drep);
406 epm_dissect_tower_pointer (tvbuff_t *tvb, int offset,
407 packet_info *pinfo, proto_tree *tree,
410 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
411 epm_dissect_tower, NDR_POINTER_PTR,
412 "Tower pointer:", -1);
416 epm_dissect_tower_array (tvbuff_t *tvb, int offset,
417 packet_info *pinfo, proto_tree *tree,
420 offset = dissect_ndr_ucvarray(tvb, offset, pinfo, tree, drep,
421 epm_dissect_tower_pointer);
427 epm_dissect_ept_map_rqst (tvbuff_t *tvb, int offset,
428 packet_info *pinfo, proto_tree *tree,
431 /* [in] handle_t h */
432 offset = dissect_ndr_ctx_hnd (tvb, offset, pinfo, tree, drep,
436 /* according to opengroup we should have an uuid pointer here.
437 in my w2k captures i can not see any such thing */
438 /* [in, ptr] uuid_p_t object */
439 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
440 epm_dissect_uuid, NDR_POINTER_PTR,
441 "UUID pointer:", -1, 1);
444 /* [in, ptr] twr_p_t map_tower */
445 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
446 epm_dissect_tower, NDR_POINTER_PTR,
447 "Tower pointer:", -1);
449 /* [in, out] ept_lookup_handle_t *entry_handle */
450 offset = dissect_ndr_ctx_hnd (tvb, offset, pinfo, tree, drep,
453 /* [in] unsigned32 max_towers */
454 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
455 hf_epm_max_towers, NULL);
461 epm_dissect_ept_map_resp (tvbuff_t *tvb, int offset,
462 packet_info *pinfo, proto_tree *tree,
465 /* [in, out] ept_lookup_handle_t *entry_handle */
466 offset = dissect_ndr_ctx_hnd (tvb, offset, pinfo, tree, drep,
469 /* [out, ptr] unsigned32 *num_towers */
470 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
471 hf_epm_num_towers, NULL);
473 /* [out, length_is(*num_towers), size_is(max_towers), ptr] twr_p_t towers[] */
474 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
475 epm_dissect_tower_array, NDR_POINTER_REF,
478 /* [out] error_status_t *status */
479 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
486 epm_dissect_ept_entry_t_ucarray(tvbuff_t *tvb, int offset,
487 packet_info *pinfo, proto_tree *tree,
490 offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
491 epm_dissect_ept_entry_t);
497 epm_dissect_ept_insert_rqst (tvbuff_t *tvb, int offset,
498 packet_info *pinfo, proto_tree *tree,
501 /* [in, out] ept_lookup_handle_t *entry_handle */
502 offset = dissect_ndr_ctx_hnd (tvb, offset, pinfo, tree, drep,
505 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
506 hf_epm_num_ents, NULL);
508 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
509 epm_dissect_ept_entry_t_ucarray, NDR_POINTER_REF,
512 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
513 hf_epm_replace, NULL);
521 epm_dissect_ept_insert_resp (tvbuff_t *tvb, int offset,
522 packet_info *pinfo, proto_tree *tree,
525 /* [out] error_status_t *status */
526 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
534 epm_dissect_ept_delete_rqst (tvbuff_t *tvb, int offset,
535 packet_info *pinfo, proto_tree *tree,
538 offset = dissect_ndr_ctx_hnd (tvb, offset, pinfo, tree, drep,
541 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
542 hf_epm_num_ents, NULL);
544 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
545 epm_dissect_ept_entry_t_ucarray, NDR_POINTER_REF,
554 epm_dissect_ept_delete_resp (tvbuff_t *tvb, int offset,
555 packet_info *pinfo, proto_tree *tree,
558 /* [out] error_status_t *status */
559 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
568 epm_dissect_ept_lookup_handle_free_rqst (tvbuff_t *tvb, int offset,
569 packet_info *pinfo, proto_tree *tree,
572 offset = dissect_ndr_ctx_hnd (tvb, offset, pinfo, tree, drep,
579 epm_dissect_ept_lookup_handle_free_resp (tvbuff_t *tvb, int offset,
580 packet_info *pinfo, proto_tree *tree,
583 offset = dissect_ndr_ctx_hnd (tvb, offset, pinfo, tree, drep,
586 offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
593 static dcerpc_sub_dissector epm_dissectors[] = {
595 epm_dissect_ept_insert_rqst,
596 epm_dissect_ept_insert_resp },
598 epm_dissect_ept_delete_rqst,
599 epm_dissect_ept_delete_resp },
601 epm_dissect_ept_lookup_rqst,
602 epm_dissect_ept_lookup_resp },
604 epm_dissect_ept_map_rqst,
605 epm_dissect_ept_map_resp },
606 { 4, "LookupHandleFree",
607 epm_dissect_ept_lookup_handle_free_rqst,
608 epm_dissect_ept_lookup_handle_free_resp },
609 { 5, "InqObject", NULL, NULL },
610 { 6, "MgmtDelete", NULL, NULL },
611 { 0, NULL, NULL, NULL }
614 static const value_string epm_opnum_vals[] = {
619 { 4, "LookupHandleFree" },
626 proto_register_epm (void)
628 static hf_register_info hf[] = {
630 { "Operation", "epm.opnum", FT_UINT16, BASE_DEC,
631 VALS(epm_opnum_vals), 0x0, "Operation", HFILL }},
632 { &hf_epm_inquiry_type,
633 { "Inquiry type", "epm.inq_type", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
635 { "Object", "epm.object", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
637 { "Interface", "epm.if_id", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL }},
639 { "Version Major", "epm.ver_maj", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
641 { "Version Minor", "epm.ver_min", FT_UINT16, BASE_DEC, NULL, 0x0, "", HFILL }},
643 { "Version Option", "epm.ver_opt", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
645 { "Handle", "epm.hnd", FT_BYTES, BASE_NONE, NULL, 0x0, "Context handle", HFILL }},
647 { "Max entries", "epm.max_ents", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
649 { "Num entries", "epm.num_ents", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
651 { "UUID", "epm.uuid", FT_STRING, BASE_NONE, NULL, 0x0, "UUID", HFILL }},
652 { &hf_epm_annotation,
653 { "Annotation", "epm.annotation", FT_STRING, BASE_NONE, NULL, 0x0, "Annotation", HFILL }},
654 { &hf_epm_proto_named_pipes,
655 { "Named Pipe", "epm.proto.named_pipe", FT_STRING, BASE_NONE, NULL, 0x0, "Name of the named pipe for this service", HFILL }},
656 { &hf_epm_proto_netbios_name,
657 { "NetBIOS Name", "epm.proto.netbios_name", FT_STRING, BASE_NONE, NULL, 0x0, "NetBIOS name where this service can be found", HFILL }},
658 { &hf_epm_tower_length,
659 { "Length", "epm.tower.len", FT_UINT32, BASE_DEC, NULL, 0x0, "Length of tower data", HFILL }},
660 { &hf_epm_tower_data,
661 { "Tower", "epm.tower", FT_BYTES, BASE_HEX, NULL, 0x0, "Tower data", HFILL }},
662 { &hf_epm_max_towers,
663 { "Max Towers", "epm.max_towers", FT_UINT32, BASE_DEC, NULL, 0x0, "Maximum number of towers to return", HFILL }},
664 { &hf_epm_num_towers,
665 { "Num Towers", "epm.num_towers", FT_UINT32, BASE_DEC, NULL, 0x0, "Number number of towers to return", HFILL }},
666 { &hf_epm_ann_offset,
667 { "Annotation offset", "epm.ann_offset", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
669 { "Annotation length", "epm.ann_len", FT_UINT32, BASE_DEC, NULL, 0x0, "", HFILL }},
671 { "Return code", "epm.rc", FT_UINT32, BASE_HEX, NULL, 0x0, "EPM return value", HFILL }},
673 { "Replace", "epm.replace", FT_UINT8, BASE_DEC, NULL, 0x0, "Replace existing objects?", HFILL }},
674 { &hf_epm_tower_num_floors,
675 { "Number of floors", "epm.tower.num_floors", FT_UINT16, BASE_DEC, NULL, 0x0, "Number of floors in tower", HFILL }},
676 { &hf_epm_proto_udp_port,
677 { "UDP Port", "epm.proto.udp_port", FT_UINT16, BASE_DEC, NULL, 0x0, "UDP Port where this service can be found", HFILL }},
678 { &hf_epm_proto_tcp_port,
679 { "TCP Port", "epm.proto.tcp_port", FT_UINT16, BASE_DEC, NULL, 0x0, "TCP Port where this service can be found", HFILL }},
680 { &hf_epm_tower_rhs_len,
681 { "RHS Length", "epm.tower.rhs.len", FT_UINT16, BASE_DEC, NULL, 0x0, "Length of RHS data", HFILL }},
682 { &hf_epm_tower_lhs_len,
683 { "LHS Length", "epm.tower.lhs.len", FT_UINT16, BASE_DEC, NULL, 0x0, "Length of LHS data", HFILL }},
685 { "IP", "epm.proto.ip", FT_IPv4, BASE_NONE, NULL, 0x0, "IP address where service is located", HFILL }},
686 { &hf_epm_tower_proto_id,
687 { "Protocol", "epm.tower.proto_id", FT_UINT8, BASE_HEX, VALS(proto_id_vals), 0x0, "Protocol identifier", HFILL }}
690 static gint *ett[] = {
692 &ett_epm_tower_floor,
695 proto_epm = proto_register_protocol ("DCE/RPC Endpoint Mapper", "EPM", "epm");
696 proto_register_field_array (proto_epm, hf, array_length (hf));
697 proto_register_subtree_array (ett, array_length (ett));
701 proto_reg_handoff_epm (void)
703 /* Register the protocol as dcerpc */
704 dcerpc_init_uuid (proto_epm, ett_epm, &uuid_epm, ver_epm, epm_dissectors, hf_epm_opnum);