From Jamie Fournier: DCE/RPC RS_MISC dissector
[obnox/wireshark/wip.git] / packet-dcerpc-rs_misc.c
1 /* packet-dcerpc-rs_misc.c\r
2  *\r
3  * Routines for dcerpc RS-MISC\r
4  * Copyright 2002, Jaime Fournier <jafour1@yahoo.com>\r
5  * This information is based off the released idl files from opengroup.\r
6  * ftp://ftp.opengroup.org/pub/dce122/dce/src/security.tar.gz security/idl/rs_misc.idl\r
7  *      \r
8  * $Id: packet-dcerpc-rs_misc.c,v 1.1 2002/09/10 11:01:21 sahlberg Exp $\r
9  *\r
10  * Ethereal - Network traffic analyzer\r
11  * By Gerald Combs <gerald@ethereal.com>\r
12  * Copyright 1998 Gerald Combs\r
13  *\r
14  * This program is free software; you can redistribute it and/or\r
15  * modify it under the terms of the GNU General Public License\r
16  * as published by the Free Software Foundation; either version 2\r
17  * of the License, or (at your option) any later version.\r
18  *\r
19  * This program is distributed in the hope that it will be useful,\r
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
22  * GNU General Public License for more details.\r
23  *\r
24  * You should have received a copy of the GNU General Public License\r
25  * along with this program; if not, write to the Free Software\r
26  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\r
27  */\r
28 \r
29 #ifdef HAVE_CONFIG_H\r
30 #include "config.h"\r
31 #endif\r
32 \r
33 \r
34 #ifdef HAVE_SYS_TYPES_H\r
35 #include <sys/types.h>\r
36 #endif\r
37 \r
38 #include <string.h>\r
39 \r
40 #include <glib.h>\r
41 #include <epan/packet.h>\r
42 #include "packet-dcerpc.h"\r
43 \r
44 \r
45 static int proto_rs_misc = -1;\r
46 static int hf_rs_misc_opnum = -1;\r
47 static int hf_rs_misc_login_get_info_rqst_var = -1;\r
48 static int hf_rs_misc_login_get_info_rqst_key_size = -1;\r
49 static int hf_rs_misc_login_get_info_rqst_key_t = -1;\r
50 \r
51 \r
52 static gint ett_rs_misc = -1;\r
53 \r
54 \r
55 static e_uuid_t uuid_rs_misc = { 0x4c878280, 0x5000, 0x0000, { 0x0d, 0x00, 0x02, 0x87, 0x14, 0x00, 0x00, 0x00 } };\r
56 static guint16  ver_rs_misc = 1;\r
57 \r
58 \r
59 static int\r
60 rs_misc_dissect_login_get_info_rqst (tvbuff_t *tvb, int offset,\r
61         packet_info *pinfo, proto_tree *tree, char *drep)\r
62 {\r
63 \r
64         guint32 key_size;\r
65         char *key_t = NULL;\r
66 \r
67         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep, \r
68                         hf_rs_misc_login_get_info_rqst_var, NULL);\r
69         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,\r
70                         hf_rs_misc_login_get_info_rqst_key_size, &key_size);\r
71 \r
72         if (key_size){ /* Not able to yet decipher the OTHER versions of this call just yet. */\r
73 \r
74                 proto_tree_add_string (tree, hf_rs_misc_login_get_info_rqst_key_t, tvb, offset, hf_rs_misc_login_get_info_rqst_key_size, tvb_get_ptr (tvb, offset, key_size));\r
75                 key_t = (char *)tvb_get_ptr(tvb,offset,key_size);\r
76                 offset += key_size;\r
77 \r
78                 if (check_col(pinfo->cinfo, COL_INFO)) {\r
79                         col_append_fstr(pinfo->cinfo, COL_INFO,\r
80                                 "rs_login_get_info Request for: %s ", key_t);\r
81                 }\r
82         } else {\r
83                 if (check_col(pinfo->cinfo, COL_INFO)) {\r
84                         col_append_str(pinfo->cinfo, COL_INFO, \r
85                                 "rs_login_get_info Request (other)");\r
86                 }\r
87         }\r
88 \r
89         return offset;\r
90 };\r
91 \r
92 \r
93 static dcerpc_sub_dissector rs_misc_dissectors[] = {\r
94         { 0, "rs_login_get_info", rs_misc_dissect_login_get_info_rqst, NULL},\r
95         { 1, "rs_wait_until_consistent", NULL, NULL},\r
96         { 2, "rs_check_consistency", NULL, NULL},\r
97         { 0, NULL, NULL, NULL }\r
98 };\r
99 \r
100 static const value_string rs_misc_opnum_vals[] = {\r
101         { 0, "rs_login_get_info" },\r
102         { 1, "rs_wait_until_consistent" },\r
103         { 2, "rs_check_consistency" },\r
104         { 0, NULL },\r
105 };\r
106 \r
107 void\r
108 proto_register_rs_misc (void)\r
109 {\r
110         static hf_register_info hf[] = {\r
111         { &hf_rs_misc_opnum,\r
112                 { "Operation", "rs_misc.opnum", FT_UINT16, BASE_DEC,\r
113                 VALS(rs_misc_opnum_vals), 0x0, "Operation", HFILL }},\r
114         { &hf_rs_misc_login_get_info_rqst_var,\r
115                 { "Var", "rs_misc.login_get_info_rqst_var", FT_UINT32, BASE_DEC,\r
116                 NULL, 0x0, "", HFILL }},\r
117         { &hf_rs_misc_login_get_info_rqst_key_size,\r
118                 { "Key Size", "rs_misc.login_get_info_rqst_key_size", FT_UINT32, BASE_DEC,\r
119                 NULL, 0x0, "", HFILL }},\r
120         { &hf_rs_misc_login_get_info_rqst_key_t,\r
121                 { "Key", "rs.misc_login_get_info_rqst_key_t", FT_STRING, BASE_NONE,\r
122                 NULL, 0x0, "", HFILL }}\r
123         };\r
124 \r
125         static gint *ett[] = {\r
126                 &ett_rs_misc,\r
127         };\r
128         proto_rs_misc = proto_register_protocol ("DCE/RPC RS_MISC", "rs_misc", "rs_misc");\r
129         proto_register_field_array (proto_rs_misc, hf, array_length (hf));\r
130         proto_register_subtree_array (ett, array_length (ett));\r
131 }\r
132 \r
133 void\r
134 proto_reg_handoff_rs_misc (void)\r
135 {\r
136         /* Register the protocol as dcerpc */\r
137         dcerpc_init_uuid (proto_rs_misc, ett_rs_misc, &uuid_rs_misc, ver_rs_misc, rs_misc_dissectors, hf_rs_misc_opnum);\r
138 }\r