Make dplay compile on Windows.
[obnox/wireshark/wip.git] / epan / dissectors / packet-dplay.c
1 /* packet-dplay.c
2  * This is a dissector for the DirectPlay protocol.
3  * Copyright 2006, 2007 by Kai Blin
4  *
5  * $Id$
6  *
7  * Wireshark - Network traffic analyzer
8  * By Gerald Combs <gerald@wireshark.org>
9  * Copyright 1998 Gerald Combs
10  *
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.
15  *
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.
20  *
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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
24  * USA.59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25  *
26  */
27
28 #ifdef HAVE_CONFIG_H
29 # include "config.h"
30 #endif
31
32 #include <epan/packet.h>
33 #include <epan/prefs.h>
34 #include <epan/emem.h>
35 #include <string.h>
36
37 /* function declarations */
38 void proto_reg_handoff_dplay(void);
39 static gboolean heur_dissect_dplay(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
40 static void dissect_dplay(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree);
41 static gint dissect_type1a_message(proto_tree *tree, tvbuff_t *tvb, gint offset);
42 static gint dissect_type2e_message(proto_tree *tree, tvbuff_t *tvb, gint offset);
43
44 static int proto_dplay = -1;
45 static dissector_handle_t dplay_handle;
46
47 /* Common data fields */
48 static int hf_dplay_size = -1;              /* Size of the whole data */
49 static int hf_dplay_ident = -1;             /* always 0xb0fa */
50 static int hf_dplay_saddr_af = -1;          /* AF_INET, as this dissector does not handle IPX yet */
51 static int hf_dplay_saddr_port = -1;        /* port to use for the reply to this packet */
52 static int hf_dplay_saddr_ip = -1;          /* IP to use for the reply to this packet, or 0.0.0.0,
53                                                then use the same IP as this packet used. */
54 static int hf_dplay_saddr_padding = -1;     /* null padding used in s_addr_in structures */
55 static int hf_dplay_play_str = -1;          /* always "play" without a null terminator */
56 static int hf_dplay_type = -1;              /* the dplay packet type */
57 static int hf_dplay_proto_version = -1;     /* 0x0b00 for dplay7, 0x0e00 for dplay9 */
58 static int hf_dplay_play_str_2 = -1;        /* packet type 0x0015 encapsulates another packet */
59 static int hf_dplay_type_2 = -1;            /* that also has a "play" string, a type and a */
60 static int hf_dplay_proto_version_2 = -1;   /* protocol version, same as above */
61 static const int DPLAY_HEADER_OFFSET = 28;  /* The dplay header is 28 bytes in size */
62
63 /* The following fields are not part of the header, but hopefully have the same
64  * meaning for all packets they show up in. */
65
66 static int hf_dplay_flags = -1; /* This is a 32bit field with some sort of a flag */
67 static int hf_dplay_flags_client_server = -1;
68 static int hf_dplay_flags_0002 = -1;
69 static int hf_dplay_flags_migrate_host = -1;
70 static int hf_dplay_flags_0008 = -1;
71 static int hf_dplay_flags_0010 = -1;
72 static int hf_dplay_flags_0020 = -1;
73 static int hf_dplay_flags_nodpnsvr = -1;
74 static int hf_dplay_flags_req_passwd = -1;
75 static int hf_dplay_flags_noenums = -1;
76 static int hf_dplay_flags_fast_sig = -1;
77 static int hf_dplay_flags_full_sig = -1;
78 static int hf_dplay_flags_0800 = -1;
79 static int hf_dplay_flags_1000 = -1;
80 static int hf_dplay_flags_encapsulate = -1;
81 static int hf_dplay_flags_4000 = -1;
82 static int hf_dplay_flags_8000 = -1;
83 #define DPLAY_FLAG_CLIENT_SERVER 0x0001
84 #define DPLAY_FLAG_0002 0x0002
85 #define DPLAY_FLAG_MIGRATE_HOST 0x0004
86 #define DPLAY_FLAG_0008 0x0008
87 #define DPLAY_FLAG_0010 0x0010
88 #define DPLAY_FLAG_0020 0x0020
89 #define DPLAY_FLAG_NODPSVR 0x0040
90 #define DPLAY_FLAG_REQ_PASSWD 0x0080
91 #define DPLAY_FLAG_NOENUMS 0x0100
92 #define DPLAY_FLAG_SIG_FAST 0x0200
93 #define DPLAY_FLAG_SIG_FULL 0x0400
94 #define DPLAY_FLAG_0800 0x0800
95 #define DPLAY_FLAG_1000 0x1000
96 #define DPLAY_FLAG_ENCAPSULATE 0x2000
97 #define DPLAY_FLAG_4000 0x4000
98 #define DPLAY_FLAG_8000 0x8000
99
100 static int hf_dplay_game_guid = -1; /* the GUID of the game */
101 static int hf_dplay_instance_guid = -1; /* The GUID of the game's instance object */
102
103 /* special fields, to be phased out in favour for more detailed information */
104 static int hf_dplay_data_type_0f = -1;
105 static int hf_dplay_data_type_1a = -1;
106 static int hf_dplay_data_type_29 = -1;
107
108 /* Message Type 0x0001 data fields */
109 static int hf_dplay_type_01_length_1 = -1;
110 static int hf_dplay_type_01_max_players = -1;
111 static int hf_dplay_type_01_curr_players = -1;
112 static int hf_dplay_type_01_magic_8_bytes = -1;
113 static int hf_dplay_type_01_dpid = -1;
114 static int hf_dplay_type_01_magic_20_bytes = -1;
115 static int hf_dplay_type_01_backslash = -1;
116 static int hf_dplay_type_01_game_name = -1;
117
118 /* Message Type 0x0002 data fields */
119 static int hf_dplay_type_02_game_guid = -1;
120 static int hf_dplay_type_02_ignored = -1;
121
122 /* Message Type 0x0005 data fields */
123 static int hf_dplay_type_05_request = -1;
124
125 /* Message Type 0x0007 data fields */
126 static int hf_dplay_type_07_dpid = -1;
127 static int hf_dplay_type_07_padding = -1;
128
129 /* Message Type 0x0008 data fields */
130 static int hf_dplay_type_08_padding_1 = -1;     /* 4 bytes */
131 static int hf_dplay_type_08_dpid_1 = -1;        /* 4 bytes */
132 static int hf_dplay_type_08_unknown_1 = -1;     /*20 bytes */
133 static int hf_dplay_type_08_dpid_2 = -1;        /* 4 bytes */
134 static int hf_dplay_type_08_string_1_len = -1;
135 static int hf_dplay_type_08_string_2_len = -1;
136 static int hf_dplay_type_08_unknown_2 = -1;     /*20 bytes */
137 static int hf_dplay_type_08_dpid_3 = -1;        /* 4 bytes */
138 static int hf_dplay_type_08_unknown_3 = -1;     /*12 bytes */
139 static int hf_dplay_type_08_string_1 = -1;
140 static int hf_dplay_type_08_string_2 = -1;
141 static int hf_dplay_type_08_saddr_af_1 = -1;    /* 2 bytes */
142 static int hf_dplay_type_08_saddr_port_1 = -1;  /* 2 bytes */
143 static int hf_dplay_type_08_saddr_ip_1 = -1;    /* 4 bytes */
144 static int hf_dplay_type_08_saddr_padd_1 = -1;  /* 8 bytes */
145 static int hf_dplay_type_08_saddr_af_2 = -1;    /* 2 bytes */
146 static int hf_dplay_type_08_saddr_port_2 = -1;  /* 2 bytes */
147 static int hf_dplay_type_08_saddr_ip_2 = -1;    /* 4 bytes */
148 static int hf_dplay_type_08_saddr_padd_2 = -1;  /* 8 bytes */
149 static int hf_dplay_type_08_padding_2 = -1;     /* 2 bytes */
150
151 /* Message Type 0x000b data fields */
152 static int hf_dplay_type_0b_padding_1 = -1;
153 static int hf_dplay_type_0b_dpid = -1;
154 static int hf_dplay_type_0b_padding_2 = -1;
155
156 /* Message Type 0x000d data fields */
157 static int hf_dplay_type_0d_padding_1 = -1;     /* 4 bytes */
158 static int hf_dplay_type_0d_dpid_1 = -1;        /* 4 bytes */
159 static int hf_dplay_type_0d_dpid_2 = -1;        /* 4 bytes */
160 static int hf_dplay_type_0d_padding_2 = -1;     /* 8 bytes */
161
162 /* Message Type 0x000e data fields */
163 static int hf_dplay_type_0e_padding_1 = -1;     /* 4 bytes */
164 static int hf_dplay_type_0e_dpid_1 = -1;        /* 4 bytes */
165 static int hf_dplay_type_0e_dpid_2 = -1;        /* 4 bytes */
166 static int hf_dplay_type_0e_padding_2 = -1;     /* 8 bytes */
167
168
169 /* Message Type 0x0013 data fields */
170 static int hf_dplay_type_13_padding_1 = -1;     /* 4 bytes */
171 static int hf_dplay_type_13_dpid_1 = -1;        /* 4 bytes */
172 static int hf_dplay_type_13_unknown_1 = -1;     /*20 bytes */
173 static int hf_dplay_type_13_dpid_2 = -1;        /* 4 bytes */
174 static int hf_dplay_type_13_unknown_2 = -1;     /*20 bytes */
175 static int hf_dplay_type_13_dpid_3 = -1;        /* 4 bytes */
176 static int hf_dplay_type_13_unknown_3 = -1;     /*12 bytes */
177 static int hf_dplay_type_13_saddr_af_1 = -1;    /* 2 bytes */
178 static int hf_dplay_type_13_saddr_port_1 = -1;  /* 2 bytes */
179 static int hf_dplay_type_13_saddr_ip_1 = -1;    /* 4 bytes */
180 static int hf_dplay_type_13_saddr_padd_1 = -1;  /* 8 bytes */
181 static int hf_dplay_type_13_saddr_af_2 = -1;    /* 2 bytes */
182 static int hf_dplay_type_13_saddr_port_2 = -1;  /* 2 bytes */
183 static int hf_dplay_type_13_saddr_ip_2 = -1;    /* 4 bytes */
184 static int hf_dplay_type_13_saddr_padd_2 = -1;  /* 8 bytes */
185 static int hf_dplay_type_13_padding_2 = -1;     /* 2 bytes */
186 static int hf_dplay_type_13_dpid_4 = -1;        /* 4 bytes */
187
188 /* Message Type 0x0015 data fields */
189 static int hf_dplay_container_guid = -1;
190 static int hf_dplay_type_15_padding_1 = -1;
191 static int hf_dplay_type_15_size_1 = -1;
192 static int hf_dplay_type_15_padding_2 = -1;
193 static int hf_dplay_type_15_unknown_1 = -1;
194 static int hf_dplay_type_15_size_2 = -1;
195 static int hf_dplay_type_15_padding_3 = -1;
196
197 /* Message Type 0x0016 data field */
198 static int hf_dplay_type_16_data = -1;
199
200 /* Message Type 0x0017 data field */
201 static int hf_dplay_type_17_data = -1;
202
203 /* Message Type 0x0029 data fields */
204 static int hf_dplay_type_29_unknown_uint32_01 = -1; /* seems to always be 3 */
205 static int hf_dplay_type_29_message_end_type = -1;  /* mostly 0, alternative packet ending on 1 */
206 static int hf_dplay_type_29_unknown_uint32_03 = -1;
207 static int hf_dplay_type_29_unknown_uint32_04 = -1;
208 static int hf_dplay_type_29_unknown_uint32_05 = -1;
209 static int hf_dplay_type_29_unknown_uint32_06 = -1;
210 static int hf_dplay_type_29_unknown_uint32_07 = -1;
211 static int hf_dplay_type_29_unknown_uint32_08 = -1;
212 static int hf_dplay_type_29_magic_16_bytes = -1;
213 static int hf_dplay_type_29_dpid_1 = -1;
214 static int hf_dplay_type_29_unknown_3 = -1;
215 static int hf_dplay_type_29_game_name = -1;
216 static int hf_dplay_type_29_unknown_uint32_10 = -1;
217 static int hf_dplay_type_29_unknown_uint32_11 = -1;
218 static int hf_dplay_type_29_dpid_2 = -1;
219 static int hf_dplay_type_29_unknown_uint32_12 = -1;
220 static int hf_dplay_type_29_unknown_uint32_13 = -1;
221 static int hf_dplay_type_29_saddr_field_len_1 = -1;
222 static int hf_dplay_type_29_saddr_af_1 = -1;
223 static int hf_dplay_type_29_saddr_port_1 = -1;
224 static int hf_dplay_type_29_saddr_ip_1 = -1;
225 static int hf_dplay_type_29_saddr_padd_1 = -1;
226 static int hf_dplay_type_29_saddr_af_2 = -1;
227 static int hf_dplay_type_29_saddr_port_2 = -1;
228 static int hf_dplay_type_29_saddr_ip_2 = -1;
229 static int hf_dplay_type_29_saddr_padd_2 = -1;
230 static int hf_dplay_type_29_unknown_uint32_14 = -1;
231 static int hf_dplay_type_29_unknown_uint32_15 = -1;
232 static int hf_dplay_type_29_dpid_3 = -1;
233 static int hf_dplay_type_29_unknown_uint32_16 = -1;
234 static int hf_dplay_type_29_unknown_uint32_17 = -1;
235 static int hf_dplay_type_29_saddr_field_len_2 = -1;
236 static int hf_dplay_type_29_saddr_af_3 = -1;
237 static int hf_dplay_type_29_saddr_port_3 = -1;
238 static int hf_dplay_type_29_saddr_ip_3 = -1;
239 static int hf_dplay_type_29_saddr_padd_3 = -1;
240 static int hf_dplay_type_29_saddr_af_4 = -1;
241 static int hf_dplay_type_29_saddr_port_4 = -1;
242 static int hf_dplay_type_29_saddr_ip_4 = -1;
243 static int hf_dplay_type_29_saddr_padd_4 = -1;
244 static int hf_dplay_type_29_unknown_uint32_18 = -1;
245 static int hf_dplay_type_29_unknown_uint32_19= -1;
246 static int hf_dplay_type_29_dpid_4 = -1;
247 static int hf_dplay_type_29_unknown_uint32_20 = -1;
248 static int hf_dplay_type_29_dpid_5 = -1;
249
250 /* Message Type 0x002e data fields */
251 static int hf_dplay_type_2e_padding_1 = -1;
252 static int hf_dplay_type_2e_dpid_1 = -1;
253 static int hf_dplay_type_2e_unknown_1 = -1;
254 static int hf_dplay_type_2e_dpid_2 = -1;
255 static int hf_dplay_type_2e_string_1_len = -1;
256 static int hf_dplay_type_2e_string_2_len = -1;
257 static int hf_dplay_type_2e_unknown_2 = -1;
258 static int hf_dplay_type_2e_dpid_3 = -1;
259 static int hf_dplay_type_2e_unknown_3 = -1;
260 static int hf_dplay_type_2e_string_1 = -1;
261 static int hf_dplay_type_2e_string_2 = -1;
262 static int hf_dplay_type_2e_saddr_af_1 = -1;
263 static int hf_dplay_type_2e_saddr_port_1 = -1;
264 static int hf_dplay_type_2e_saddr_ip_1 = -1;
265 static int hf_dplay_type_2e_saddr_padd_1 = -1;
266 static int hf_dplay_type_2e_saddr_af_2 = -1;
267 static int hf_dplay_type_2e_saddr_port_2 = -1;
268 static int hf_dplay_type_2e_saddr_ip_2 = -1;
269 static int hf_dplay_type_2e_saddr_padd_2 = -1;
270
271 /* Message Type 0x002f data fields */
272 static int hf_dplay_type_2f_dpid = -1;
273
274 /* Message Type 0x0038 data fields */
275 static int hf_dplay_type_38_padding_1 = -1;     /* 4 bytes */
276 static int hf_dplay_type_38_dpid_1 = -1;        /* 4 bytes */
277 static int hf_dplay_type_38_unknown_1 = -1;     /*20 bytes */
278 static int hf_dplay_type_38_dpid_2 = -1;        /* 4 bytes */
279 static int hf_dplay_type_38_string_1_len = -1;
280 static int hf_dplay_type_38_string_2_len = -1;
281 static int hf_dplay_type_38_unknown_2 = -1;     /*20 bytes */
282 static int hf_dplay_type_38_dpid_3 = -1;        /* 4 bytes */
283 static int hf_dplay_type_38_unknown_3 = -1;     /*12 bytes */
284 static int hf_dplay_type_38_string_1 = -1;
285 static int hf_dplay_type_38_string_2 = -1;
286 static int hf_dplay_type_38_saddr_af_1 = -1;    /* 2 bytes */
287 static int hf_dplay_type_38_saddr_port_1 = -1;  /* 2 bytes */
288 static int hf_dplay_type_38_saddr_ip_1 = -1;    /* 4 bytes */
289 static int hf_dplay_type_38_saddr_padd_1 = -1;  /* 8 bytes */
290 static int hf_dplay_type_38_saddr_af_2 = -1;    /* 2 bytes */
291 static int hf_dplay_type_38_saddr_port_2 = -1;  /* 2 bytes */
292 static int hf_dplay_type_38_saddr_ip_2 = -1;    /* 4 bytes */
293 static int hf_dplay_type_38_saddr_padd_2 = -1;  /* 8 bytes */
294
295 /* various */
296 static gint ett_dplay = -1;
297 static gint ett_dplay_header = -1;
298 static gint ett_dplay_data = -1;
299 static gint ett_dplay_enc_packet = -1;
300 static gint ett_dplay_flags = -1;
301 static gint ett_dplay_type08_saddr1 = -1;
302 static gint ett_dplay_type08_saddr2 = -1;
303 static gint ett_dplay_type13_saddr1 = -1;
304 static gint ett_dplay_type13_saddr2 = -1;
305 static gint ett_dplay_type29_saddr1 = -1;
306 static gint ett_dplay_type29_saddr2 = -1;
307 static gint ett_dplay_type29_saddr3 = -1;
308 static gint ett_dplay_type29_saddr4 = -1;
309 static gint ett_dplay_type2e_saddr1 = -1;
310 static gint ett_dplay_type2e_saddr2 = -1;
311 static gint ett_dplay_type38_saddr1 = -1;
312 static gint ett_dplay_type38_saddr2 = -1;
313
314 static const value_string dplay_type_val[] = {
315     { 0x0001, "Server Lobby information" },
316     { 0x0002, "Lobby broadcast" },
317     { 0x0004, "Request game information" },
318     { 0x0005, "ID request" },
319     { 0x0007, "ID reply" },
320     { 0x0008, "Player information" },
321     { 0x000b, "Connection shutdown" },
322     { 0x000d, "Begin transmission" },
323     { 0x000e, "End transmission" },
324     { 0x000f, "Game settings changed" },
325     { 0x0013, "Join game" },
326     { 0x0015, "Message container" },
327     { 0x0016, "Data send" },
328     { 0x0017, "Data ack" },
329     { 0x001a, "Type 0x001a" },
330     { 0x0029, "Game information" },
331     { 0x002e, "New player notification" },
332     { 0x002f, "New player confirmation" },
333     { 0x0038, "Player information new player"},
334     { 0     , NULL },
335 };
336
337 static const value_string dplay_af_val[] = {
338     { 0x0002, "AF_INET" },
339     { 0x0006, "AF_IPX" },
340     { 0     , NULL},
341 };
342
343 static const value_string dplay_proto_version_val[] = {
344     { 0x000b, "dplay7"},
345     { 0x000e, "dplay9"},
346     { 0     , NULL},
347 };
348
349 static const value_string dplay_type05_request[] = {
350     { 0x00000008, "eight"},
351     { 0x00000009, "nine"},
352     { 0         , NULL},
353 };
354
355 static const value_string dplay_type29_end_type[] = {
356     { 0x00000000, "sockaddr"},
357     { 0x00000001, "DPID"},
358     { 0         , NULL},
359 };
360
361 static const true_false_string tfs_dplay_flag = {
362     "present",
363     "absent"
364 };
365
366 /* borrowed from epan/dissectors/packets-smb-common.c */
367 static gint display_unicode_string(proto_tree *tree, gint hf_index, tvbuff_t *tvb, gint offset)
368 {
369     char *str, *p;
370     gint len;
371     gint charoffset;
372     guint16 character;
373
374     /* display a unicode string from the tree and return new offset */
375
376     /*
377      * Get the length of the string.
378      * XXX - is it a bug or a feature that this will throw an exception
379      * if we don't find the '\0'?  I think it's a feature.
380      */
381     len = 0;
382     while ((character = tvb_get_letohs(tvb, offset + len)) != '\0')
383         len += 2;
384     len += 2;   /* count the '\0' too */
385
386     /*
387      * Allocate a buffer for the string; "len" is the length in
388      * bytes, not the length in characters.
389      */
390     str = ep_alloc(len/2);
391
392     /*
393      * XXX - this assumes the string is just ISO 8859-1; we need
394      * to better handle multiple character sets in Wireshark,
395      * including Unicode/ISO 10646, and multiple encodings of
396      * that character set (UCS-2, UTF-8, etc.).
397      */
398     charoffset = offset;
399     p = str;
400     while ((character = tvb_get_letohs(tvb, charoffset)) != '\0') {
401         *p++ = (char) character;
402         charoffset += 2;
403     }
404     *p = '\0';
405
406     proto_tree_add_string(tree, hf_index, tvb, offset, len, str);
407
408     return  offset+len;
409 }
410
411 static gint dissect_dplay_header(proto_tree *tree, tvbuff_t *tvb, gint offset)
412 {
413     proto_tree_add_item(tree, hf_dplay_size, tvb, offset, 2, TRUE); offset += 2;
414     proto_tree_add_item(tree, hf_dplay_ident, tvb, offset, 2, FALSE); offset += 2;
415     proto_tree_add_item(tree, hf_dplay_saddr_af, tvb, offset, 2, TRUE); offset += 2;
416     proto_tree_add_item(tree, hf_dplay_saddr_port, tvb, offset, 2, FALSE); offset += 2;
417     proto_tree_add_item(tree, hf_dplay_saddr_ip, tvb, offset, 4, FALSE); offset += 4;
418     proto_tree_add_item(tree, hf_dplay_saddr_padding, tvb, offset, 8, FALSE); offset += 8;
419     proto_tree_add_item(tree, hf_dplay_play_str, tvb, offset, 4, TRUE); offset += 4;
420     proto_tree_add_item(tree, hf_dplay_type, tvb, offset, 2, TRUE); offset += 2;
421     proto_tree_add_item(tree, hf_dplay_proto_version, tvb, offset, 2, TRUE); offset += 2;
422     return offset;
423 }
424
425 static gint dissect_type01_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
426 {
427     gint data_len;
428     guint32 flags;
429     proto_item *flags_item = NULL;
430     proto_tree *flags_tree = NULL;
431
432     data_len = tvb_get_letohl(tvb, offset);
433     flags = tvb_get_letohl(tvb, offset+4);
434
435     proto_tree_add_item(tree, hf_dplay_type_01_length_1, tvb, offset, 4, TRUE); offset += 4;
436     flags_item = proto_tree_add_item(tree, hf_dplay_flags, tvb, offset, 4, TRUE);
437     flags_tree = proto_item_add_subtree(flags_item, ett_dplay_flags);
438     proto_tree_add_boolean(flags_tree, hf_dplay_flags_8000, tvb, offset, 4, flags);
439     proto_tree_add_boolean(flags_tree, hf_dplay_flags_4000, tvb, offset, 4, flags);
440     proto_tree_add_boolean(flags_tree, hf_dplay_flags_encapsulate, tvb, offset, 4, flags);
441     proto_tree_add_boolean(flags_tree, hf_dplay_flags_1000, tvb, offset, 4, flags);
442     proto_tree_add_boolean(flags_tree, hf_dplay_flags_0800, tvb, offset, 4, flags);
443     proto_tree_add_boolean(flags_tree, hf_dplay_flags_full_sig, tvb, offset, 4, flags);
444     proto_tree_add_boolean(flags_tree, hf_dplay_flags_fast_sig, tvb, offset, 4, flags);
445     proto_tree_add_boolean(flags_tree, hf_dplay_flags_noenums, tvb, offset, 4, flags);
446     proto_tree_add_boolean(flags_tree, hf_dplay_flags_req_passwd, tvb, offset, 4, flags);
447     proto_tree_add_boolean(flags_tree, hf_dplay_flags_nodpnsvr, tvb, offset, 4, flags);
448     proto_tree_add_boolean(flags_tree, hf_dplay_flags_0020, tvb, offset, 4, flags);
449     proto_tree_add_boolean(flags_tree, hf_dplay_flags_0010, tvb, offset, 4, flags);
450     proto_tree_add_boolean(flags_tree, hf_dplay_flags_0008, tvb, offset, 4, flags);
451     proto_tree_add_boolean(flags_tree, hf_dplay_flags_migrate_host, tvb, offset, 4, flags);
452     proto_tree_add_boolean(flags_tree, hf_dplay_flags_0002, tvb, offset, 4, flags);
453     proto_tree_add_boolean(flags_tree, hf_dplay_flags_client_server, tvb, offset, 4, flags);
454     offset += 4;
455
456     proto_tree_add_item(tree, hf_dplay_instance_guid, tvb, offset, 16, FALSE); offset += 16;
457     proto_tree_add_item(tree, hf_dplay_game_guid, tvb, offset, 16, FALSE); offset += 16;
458     proto_tree_add_item(tree, hf_dplay_type_01_max_players, tvb, offset, 4, TRUE); offset += 4;
459     proto_tree_add_item(tree, hf_dplay_type_01_curr_players, tvb, offset, 4, TRUE); offset += 4;
460     proto_tree_add_item(tree, hf_dplay_type_01_magic_8_bytes, tvb, offset, 8, FALSE); offset += 8;
461     proto_tree_add_item(tree, hf_dplay_type_01_dpid, tvb, offset, 4, FALSE); offset += 4;
462     proto_tree_add_item(tree, hf_dplay_type_01_magic_20_bytes, tvb, offset, 20, FALSE);offset += 20;
463     offset = display_unicode_string(tree, hf_dplay_type_01_backslash, tvb, offset);
464     offset = display_unicode_string(tree, hf_dplay_type_01_game_name, tvb, offset);
465     return offset;
466 }
467
468 static gint dissect_type02_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
469 {
470     proto_tree_add_item(tree, hf_dplay_type_02_game_guid, tvb, offset, 16, FALSE); offset += 16;
471     proto_tree_add_item(tree, hf_dplay_type_02_ignored, tvb, offset, 8, FALSE);
472     return offset;
473 }
474
475 static gint dissect_type05_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
476 {
477     proto_tree_add_item(tree, hf_dplay_type_05_request, tvb, offset, 4, TRUE); offset += 4;
478     return offset;
479 }
480
481 static gint dissect_type07_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
482 {
483     proto_tree_add_item(tree, hf_dplay_type_07_dpid, tvb, offset, 4, FALSE); offset += 4;
484     proto_tree_add_item(tree, hf_dplay_type_07_padding, tvb, offset, 36, FALSE); offset += 36;
485     return offset;
486 }
487
488 static gint dissect_type08_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
489 {
490     proto_item *first_saddr_item = NULL, *second_saddr_item = NULL;
491     proto_tree *first_saddr_tree = NULL, *second_saddr_tree = NULL;
492     gint string_1_len, string_2_len;
493
494     proto_tree_add_item(tree, hf_dplay_type_08_padding_1, tvb, offset, 4, FALSE); offset += 4;
495     proto_tree_add_item(tree, hf_dplay_type_08_dpid_1, tvb, offset, 4, FALSE); offset += 4;
496     proto_tree_add_item(tree, hf_dplay_type_08_unknown_1, tvb, offset, 20, FALSE); offset += 20;
497     proto_tree_add_item(tree, hf_dplay_type_08_dpid_2, tvb, offset, 4, FALSE); offset += 4;
498     string_1_len = tvb_get_letohl(tvb, offset);
499     proto_tree_add_item(tree, hf_dplay_type_08_string_1_len, tvb, offset, 4, TRUE); offset += 4;
500     string_2_len = tvb_get_letohl(tvb, offset);
501     proto_tree_add_item(tree, hf_dplay_type_08_string_2_len, tvb, offset, 4, TRUE); offset += 4;
502     proto_tree_add_item(tree, hf_dplay_type_08_unknown_2, tvb, offset, 12, FALSE); offset += 12;
503     proto_tree_add_item(tree, hf_dplay_type_08_dpid_3, tvb, offset, 4, FALSE); offset += 4;
504     proto_tree_add_item(tree, hf_dplay_type_08_unknown_3, tvb, offset, 12, FALSE); offset += 12;
505
506     if(string_1_len > 0)
507         offset = display_unicode_string(tree, hf_dplay_type_08_string_1, tvb, offset);
508     if(string_2_len > 0)
509         offset = display_unicode_string(tree, hf_dplay_type_08_string_2, tvb, offset);
510
511     first_saddr_item = proto_tree_add_text(tree, tvb, offset, 16,
512             "DirectPlay message type 0x0008 s_addr_in structure 1");
513     first_saddr_tree = proto_item_add_subtree(first_saddr_item, ett_dplay_type08_saddr1);
514
515     proto_tree_add_item(first_saddr_tree, hf_dplay_type_08_saddr_af_1, tvb, offset, 2, TRUE); offset += 2;
516     proto_tree_add_item(first_saddr_tree, hf_dplay_type_08_saddr_port_1, tvb, offset, 2, FALSE); offset += 2;
517     proto_tree_add_item(first_saddr_tree, hf_dplay_type_08_saddr_ip_1, tvb, offset, 4, FALSE); offset += 4;
518     proto_tree_add_item(first_saddr_tree, hf_dplay_type_08_saddr_padd_1, tvb, offset, 8, FALSE); offset += 8;
519
520     second_saddr_item = proto_tree_add_text(tree, tvb, offset, 16,
521             "DirectPlay message type 0x0008 s_addr_in structure 2");
522     second_saddr_tree = proto_item_add_subtree(second_saddr_item, ett_dplay_type08_saddr2);
523
524     proto_tree_add_item(second_saddr_tree, hf_dplay_type_08_saddr_af_2, tvb, offset, 2, TRUE); offset += 2;
525     proto_tree_add_item(second_saddr_tree, hf_dplay_type_08_saddr_port_2, tvb, offset, 2, FALSE); offset += 2;
526     proto_tree_add_item(second_saddr_tree, hf_dplay_type_08_saddr_ip_2, tvb, offset, 4, FALSE); offset += 4;
527     proto_tree_add_item(second_saddr_tree, hf_dplay_type_08_saddr_padd_2, tvb, offset, 8, FALSE); offset += 8;
528
529     proto_tree_add_item(tree, hf_dplay_type_08_padding_2, tvb, offset, 6, FALSE); offset += 6;
530
531     return offset;
532 }
533
534 static gint dissect_type0b_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
535 {
536     proto_tree_add_item(tree, hf_dplay_type_0b_padding_1, tvb, offset, 4, FALSE); offset += 4;
537     proto_tree_add_item(tree, hf_dplay_type_0b_dpid, tvb, offset, 4, FALSE); offset += 4;
538     proto_tree_add_item(tree, hf_dplay_type_0b_padding_2, tvb, offset, 12, FALSE); offset += 12;
539     return offset;
540 }
541
542 static gint dissect_type0d_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
543 {
544     proto_tree_add_item(tree, hf_dplay_type_0d_padding_1, tvb, offset, 4, FALSE); offset += 4;
545     proto_tree_add_item(tree, hf_dplay_type_0d_dpid_1, tvb, offset, 4, FALSE); offset += 4;
546     proto_tree_add_item(tree, hf_dplay_type_0d_dpid_2, tvb, offset, 4, FALSE); offset += 4;
547     proto_tree_add_item(tree, hf_dplay_type_0d_padding_2, tvb, offset, 8, FALSE); offset += 8;
548     return offset;
549 }
550
551 static gint dissect_type0e_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
552 {
553     proto_tree_add_item(tree, hf_dplay_type_0e_padding_1, tvb, offset, 4, FALSE); offset += 4;
554     proto_tree_add_item(tree, hf_dplay_type_0e_dpid_1, tvb, offset, 4, FALSE); offset += 4;
555     proto_tree_add_item(tree, hf_dplay_type_0e_dpid_2, tvb, offset, 4, FALSE); offset += 4;
556     proto_tree_add_item(tree, hf_dplay_type_0e_padding_2, tvb, offset, 8, FALSE); offset += 8;
557     return offset;
558 }
559
560 static gint dissect_type0f_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
561 {
562     proto_tree_add_item(tree, hf_dplay_data_type_0f, tvb, offset, -1, FALSE);
563     return offset;
564 }
565
566 static gint dissect_type13_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
567 {
568     proto_item *first_saddr_item = NULL, *second_saddr_item = NULL;
569     proto_tree *first_saddr_tree = NULL, *second_saddr_tree = NULL;
570
571     proto_tree_add_item(tree, hf_dplay_type_13_padding_1, tvb, offset, 4, FALSE); offset += 4;
572     proto_tree_add_item(tree, hf_dplay_type_13_dpid_1, tvb, offset, 4, FALSE); offset += 4;
573     proto_tree_add_item(tree, hf_dplay_type_13_unknown_1, tvb, offset, 20, FALSE); offset += 20;
574     proto_tree_add_item(tree, hf_dplay_type_13_dpid_2, tvb, offset, 4, FALSE); offset += 4;
575     proto_tree_add_item(tree, hf_dplay_type_13_unknown_2, tvb, offset, 20, FALSE); offset += 20;
576     proto_tree_add_item(tree, hf_dplay_type_13_dpid_3, tvb, offset, 4, FALSE); offset += 4;
577     proto_tree_add_item(tree, hf_dplay_type_13_unknown_3, tvb, offset, 12, FALSE); offset += 12;
578
579     first_saddr_item = proto_tree_add_text(tree, tvb, offset, 16,
580             "DirectPlay message type 0x0013 s_addr_in structure 1");
581     first_saddr_tree = proto_item_add_subtree(first_saddr_item, ett_dplay_type13_saddr1);
582
583     proto_tree_add_item(first_saddr_tree, hf_dplay_type_13_saddr_af_1, tvb, offset, 2, TRUE); offset += 2;
584     proto_tree_add_item(first_saddr_tree, hf_dplay_type_13_saddr_port_1, tvb, offset, 2, FALSE); offset += 2;
585     proto_tree_add_item(first_saddr_tree, hf_dplay_type_13_saddr_ip_1, tvb, offset, 4, FALSE); offset += 4;
586     proto_tree_add_item(first_saddr_tree, hf_dplay_type_13_saddr_padd_1, tvb, offset, 8, FALSE); offset += 8;
587
588     second_saddr_item = proto_tree_add_text(tree, tvb, offset, 16,
589             "DirectPlay message type 0x0013 s_addr_in structure 2");
590     second_saddr_tree = proto_item_add_subtree(second_saddr_item, ett_dplay_type13_saddr2);
591
592     proto_tree_add_item(second_saddr_tree, hf_dplay_type_13_saddr_af_2, tvb, offset, 2, TRUE); offset += 2;
593     proto_tree_add_item(second_saddr_tree, hf_dplay_type_13_saddr_port_2, tvb, offset, 2, FALSE); offset += 2;
594     proto_tree_add_item(second_saddr_tree, hf_dplay_type_13_saddr_ip_2, tvb, offset, 4, FALSE); offset += 4;
595     proto_tree_add_item(second_saddr_tree, hf_dplay_type_13_saddr_padd_2, tvb, offset, 8, FALSE); offset += 8;
596
597     proto_tree_add_item(tree, hf_dplay_type_13_padding_2, tvb, offset, 2, FALSE); offset += 2;
598     proto_tree_add_item(tree, hf_dplay_type_13_dpid_4, tvb, offset, 4, FALSE); offset += 4;
599
600     return offset;
601 }
602
603 static gint dissect_type15_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
604 {
605     guint16 second_message_type;
606     proto_item *enc_item = NULL;
607     proto_tree *enc_tree = NULL;
608     second_message_type = tvb_get_letohs(tvb, 72);
609
610     proto_tree_add_item(tree, hf_dplay_container_guid, tvb, offset, 16, FALSE); offset += 16;
611     proto_tree_add_item(tree, hf_dplay_type_15_padding_1, tvb, offset, 4, FALSE); offset += 4;
612     proto_tree_add_item(tree, hf_dplay_type_15_size_1, tvb, offset, 4, TRUE); offset += 4;
613     proto_tree_add_item(tree, hf_dplay_type_15_padding_2, tvb, offset, 4, FALSE); offset += 4;
614     proto_tree_add_item(tree, hf_dplay_type_15_unknown_1, tvb, offset, 4, TRUE); offset += 4;
615     proto_tree_add_item(tree, hf_dplay_type_15_size_2, tvb, offset, 4, TRUE); offset += 4;
616     proto_tree_add_item(tree, hf_dplay_type_15_padding_3, tvb, offset, 4, FALSE); offset += 4;
617
618     enc_item = proto_tree_add_text(tree, tvb, offset, -1, "DirectPlay encapsulated packet");
619     enc_tree = proto_item_add_subtree(enc_item, ett_dplay_enc_packet);
620
621     proto_tree_add_item(enc_tree, hf_dplay_play_str_2, tvb, offset, 4, FALSE); offset += 4;
622     proto_tree_add_item(enc_tree, hf_dplay_type_2, tvb, offset, 2, TRUE); offset += 2;
623     proto_tree_add_item(enc_tree, hf_dplay_proto_version_2, tvb, offset, 2, TRUE); offset += 2;
624
625     switch(second_message_type)
626     {
627         case 0x0005:
628             offset = dissect_type05_message(enc_tree, tvb, offset);
629             break;
630         case 0x0007:
631             offset = dissect_type05_message(enc_tree, tvb, offset);
632             break;
633         case 0x0008:
634             offset = dissect_type08_message(enc_tree, tvb, offset);
635             break;
636         case 0x000b:
637             offset = dissect_type0b_message(enc_tree, tvb, offset);
638             break;
639         case 0x0013:
640             offset = dissect_type13_message(enc_tree, tvb, offset);
641             break;
642         case 0x001a:
643             offset = dissect_type1a_message(enc_tree, tvb, offset);
644             break;
645         case 0x002e:
646             offset = dissect_type2e_message(enc_tree, tvb, offset);
647             break;
648     }
649
650     return offset;
651 }
652
653 static gint dissect_type16_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
654 {
655     proto_tree_add_item(tree, hf_dplay_type_16_data, tvb, offset, -1, FALSE);
656     return offset;
657 }
658
659 static gint dissect_type17_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
660 {
661     proto_tree_add_item(tree, hf_dplay_type_17_data, tvb, offset, -1, FALSE);
662     return offset;
663 }
664
665 static gint dissect_type1a_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
666 {
667     proto_tree_add_item(tree, hf_dplay_data_type_1a, tvb, offset, -1, FALSE);
668     return offset;
669 }
670
671 static gint dissect_type29_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
672 {
673     proto_item *flags_item = NULL, *first_saddr_item = NULL,
674                *second_saddr_item = NULL, *third_saddr_item = NULL,
675                *fourth_saddr_item = NULL;
676     proto_tree *flags_tree = NULL, *first_saddr_tree = NULL,
677                *second_saddr_tree = NULL, *third_saddr_tree = NULL,
678                *fourth_saddr_tree = NULL;
679     guint32 flags = tvb_get_letohl(tvb, offset+32);
680
681     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_01, tvb, offset, 4, TRUE); offset += 4;
682     proto_tree_add_item(tree, hf_dplay_type_29_message_end_type, tvb, offset, 4, TRUE); offset += 4;
683     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_03, tvb, offset, 4, TRUE); offset += 4;
684     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_04, tvb, offset, 4, TRUE); offset += 4;
685     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_05, tvb, offset, 4, TRUE); offset += 4;
686     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_06, tvb, offset, 4, TRUE); offset += 4;
687     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_07, tvb, offset, 4, TRUE); offset += 4;
688     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_08, tvb, offset, 4, TRUE); offset += 4;
689     flags_item = proto_tree_add_item(tree, hf_dplay_flags, tvb, offset, 4, TRUE);
690     flags_tree = proto_item_add_subtree(flags_item, ett_dplay_flags);
691     proto_tree_add_boolean(flags_tree, hf_dplay_flags_8000, tvb, offset, 4, flags);
692     proto_tree_add_boolean(flags_tree, hf_dplay_flags_4000, tvb, offset, 4, flags);
693     proto_tree_add_boolean(flags_tree, hf_dplay_flags_encapsulate, tvb, offset, 4, flags);
694     proto_tree_add_boolean(flags_tree, hf_dplay_flags_1000, tvb, offset, 4, flags);
695     proto_tree_add_boolean(flags_tree, hf_dplay_flags_0800, tvb, offset, 4, flags);
696     proto_tree_add_boolean(flags_tree, hf_dplay_flags_full_sig, tvb, offset, 4, flags);
697     proto_tree_add_boolean(flags_tree, hf_dplay_flags_fast_sig, tvb, offset, 4, flags);
698     proto_tree_add_boolean(flags_tree, hf_dplay_flags_noenums, tvb, offset, 4, flags);
699     proto_tree_add_boolean(flags_tree, hf_dplay_flags_req_passwd, tvb, offset, 4, flags);
700     proto_tree_add_boolean(flags_tree, hf_dplay_flags_nodpnsvr, tvb, offset, 4, flags);
701     proto_tree_add_boolean(flags_tree, hf_dplay_flags_0020, tvb, offset, 4, flags);
702     proto_tree_add_boolean(flags_tree, hf_dplay_flags_0010, tvb, offset, 4, flags);
703     proto_tree_add_boolean(flags_tree, hf_dplay_flags_0008, tvb, offset, 4, flags);
704     proto_tree_add_boolean(flags_tree, hf_dplay_flags_migrate_host, tvb, offset, 4, flags);
705     proto_tree_add_boolean(flags_tree, hf_dplay_flags_0002, tvb, offset, 4, flags);
706     proto_tree_add_boolean(flags_tree, hf_dplay_flags_client_server, tvb, offset, 4, flags);
707     offset += 4;
708
709     proto_tree_add_item(tree, hf_dplay_instance_guid, tvb, offset, 16, FALSE); offset += 16;
710     proto_tree_add_item(tree, hf_dplay_game_guid, tvb, offset, 16, FALSE); offset += 16;
711     proto_tree_add_item(tree, hf_dplay_type_29_magic_16_bytes, tvb, offset, 16, FALSE); offset += 16;
712     proto_tree_add_item(tree, hf_dplay_type_29_dpid_1, tvb, offset, 4, FALSE); offset += 4;
713     proto_tree_add_item(tree, hf_dplay_type_29_unknown_3, tvb, offset, 20, FALSE); offset += 20;
714     offset = display_unicode_string(tree, hf_dplay_type_29_game_name, tvb, offset);
715     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_10, tvb, offset, 4, TRUE); offset += 4;
716     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_11, tvb, offset, 4, TRUE); offset += 4;
717     proto_tree_add_item(tree, hf_dplay_type_29_dpid_2, tvb, offset, 4, FALSE); offset += 4;
718     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_12, tvb, offset, 4, TRUE); offset += 4;
719     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_13, tvb, offset, 4, TRUE); offset += 4;
720     proto_tree_add_item(tree, hf_dplay_type_29_saddr_field_len_1, tvb, offset, 1, FALSE); offset += 1;
721
722     first_saddr_item = proto_tree_add_text(tree, tvb, offset, 16,
723             "DirectPlay message type 0x0029 s_addr_in structure 1");
724     first_saddr_tree = proto_item_add_subtree(first_saddr_item, ett_dplay_type29_saddr1);
725
726     proto_tree_add_item(first_saddr_tree, hf_dplay_type_29_saddr_af_1, tvb, offset, 2, TRUE); offset += 2;
727     proto_tree_add_item(first_saddr_tree, hf_dplay_type_29_saddr_port_1, tvb, offset, 2, FALSE); offset += 2;
728     proto_tree_add_item(first_saddr_tree, hf_dplay_type_29_saddr_ip_1, tvb, offset, 4, FALSE); offset += 4;
729     proto_tree_add_item(first_saddr_tree, hf_dplay_type_29_saddr_padd_1, tvb, offset, 8, FALSE); offset += 8;
730
731     second_saddr_item = proto_tree_add_text(tree, tvb, offset, 16,
732             "DirectPlay message type 0x0029 s_addr_in structure 2");
733     second_saddr_tree = proto_item_add_subtree(second_saddr_item, ett_dplay_type29_saddr2);
734
735     proto_tree_add_item(second_saddr_tree, hf_dplay_type_29_saddr_af_2, tvb, offset, 2, TRUE); offset += 2;
736     proto_tree_add_item(second_saddr_tree, hf_dplay_type_29_saddr_port_2, tvb, offset, 2, FALSE); offset += 2;
737     proto_tree_add_item(second_saddr_tree, hf_dplay_type_29_saddr_ip_2, tvb, offset, 4, FALSE); offset += 4;
738     proto_tree_add_item(second_saddr_tree, hf_dplay_type_29_saddr_padd_2, tvb, offset, 8, FALSE); offset += 8;
739
740     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_14, tvb, offset, 4, TRUE); offset += 4;
741     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_15, tvb, offset, 4, TRUE); offset += 4;
742     proto_tree_add_item(tree, hf_dplay_type_29_dpid_3, tvb, offset, 4, FALSE); offset += 4;
743     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_16, tvb, offset, 4, TRUE); offset += 4;
744     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_17, tvb, offset, 4, TRUE); offset += 4;
745     proto_tree_add_item(tree, hf_dplay_type_29_saddr_field_len_2, tvb, offset, 1, FALSE); offset += 1;
746
747     third_saddr_item = proto_tree_add_text(tree, tvb, offset, 16,
748             "DirectPlay message type 0x0029 s_addr_in structure 3");
749     third_saddr_tree = proto_item_add_subtree(third_saddr_item,
750                     ett_dplay_type29_saddr3);
751
752     proto_tree_add_item(third_saddr_tree, hf_dplay_type_29_saddr_af_3, tvb, offset, 2, TRUE); offset += 2;
753     proto_tree_add_item(third_saddr_tree, hf_dplay_type_29_saddr_port_3, tvb, offset, 2, FALSE); offset += 2;
754     proto_tree_add_item(third_saddr_tree, hf_dplay_type_29_saddr_ip_3, tvb, offset, 4, FALSE); offset += 4;
755     proto_tree_add_item(third_saddr_tree, hf_dplay_type_29_saddr_padd_3, tvb, offset, 8, FALSE); offset += 8;
756
757     fourth_saddr_item = proto_tree_add_text(tree, tvb, offset, 16,
758             "DirectPlay message type 0x0029 s_addr_in structure 4");
759     fourth_saddr_tree = proto_item_add_subtree(fourth_saddr_item,
760                     ett_dplay_type29_saddr4);
761
762     proto_tree_add_item(fourth_saddr_tree, hf_dplay_type_29_saddr_af_4, tvb, offset, 2, TRUE); offset += 2;
763     proto_tree_add_item(fourth_saddr_tree, hf_dplay_type_29_saddr_port_4, tvb, offset, 2, FALSE); offset += 2;
764     proto_tree_add_item(fourth_saddr_tree, hf_dplay_type_29_saddr_ip_4, tvb, offset, 4, FALSE); offset += 4;
765     proto_tree_add_item(fourth_saddr_tree, hf_dplay_type_29_saddr_padd_4, tvb, offset, 8, FALSE); offset += 8;
766
767     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_18, tvb, offset, 4, TRUE); offset += 4;
768     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_19, tvb, offset, 4, TRUE); offset += 4;
769     proto_tree_add_item(tree, hf_dplay_type_29_dpid_4, tvb, offset, 4, FALSE); offset += 4;
770     proto_tree_add_item(tree, hf_dplay_type_29_unknown_uint32_20, tvb, offset, 4, TRUE); offset += 4;
771     proto_tree_add_item(tree, hf_dplay_type_29_dpid_5, tvb, offset, 4, FALSE); offset += 4;
772
773     /* still some parts missing here */
774     proto_tree_add_item(tree, hf_dplay_data_type_29, tvb, offset, -1, FALSE);
775     /* here we parse another saddr_field_len and two saddr structs */
776     return offset;
777 }
778
779 static gint dissect_type2e_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
780 {
781     proto_item *first_saddr_item = NULL, *second_saddr_item = NULL;
782     proto_tree *first_saddr_tree = NULL, *second_saddr_tree = NULL;
783     gint string_1_len, string_2_len;
784
785     proto_tree_add_item(tree, hf_dplay_type_2e_padding_1, tvb, offset, 4, FALSE); offset += 4;
786     proto_tree_add_item(tree, hf_dplay_type_2e_dpid_1, tvb, offset, 4, FALSE); offset += 4;
787     proto_tree_add_item(tree, hf_dplay_type_2e_unknown_1, tvb, offset, 20, FALSE); offset += 20;
788     proto_tree_add_item(tree, hf_dplay_type_2e_dpid_2, tvb, offset, 4, FALSE); offset += 4;
789     string_1_len = tvb_get_letohl(tvb, offset);
790     proto_tree_add_item(tree, hf_dplay_type_2e_string_1_len, tvb, offset, 4, TRUE); offset += 4;
791     string_2_len = tvb_get_letohl(tvb, offset);
792     proto_tree_add_item(tree, hf_dplay_type_2e_string_2_len, tvb, offset, 4, TRUE); offset += 4;
793     proto_tree_add_item(tree, hf_dplay_type_2e_unknown_2, tvb, offset, 12, FALSE); offset += 12;
794     proto_tree_add_item(tree, hf_dplay_type_2e_dpid_3, tvb, offset, 4, FALSE); offset += 4;
795     proto_tree_add_item(tree, hf_dplay_type_2e_unknown_3, tvb, offset, 12, FALSE); offset += 12;
796
797     if(string_1_len > 0)
798         offset = display_unicode_string(tree, hf_dplay_type_2e_string_1, tvb, offset);
799     if(string_2_len > 0)
800         offset = display_unicode_string(tree, hf_dplay_type_2e_string_2, tvb, offset);
801
802     first_saddr_item = proto_tree_add_text(tree, tvb, offset, 16,
803             "DirectPlay message type 0x002e s_addr_in structure 1");
804     first_saddr_tree = proto_item_add_subtree(first_saddr_item, ett_dplay_type2e_saddr1);
805
806     proto_tree_add_item(first_saddr_tree, hf_dplay_type_2e_saddr_af_1, tvb, offset, 2, TRUE); offset += 2;
807     proto_tree_add_item(first_saddr_tree, hf_dplay_type_2e_saddr_port_1, tvb, offset, 2, FALSE); offset += 2;
808     proto_tree_add_item(first_saddr_tree, hf_dplay_type_2e_saddr_ip_1, tvb, offset, 4, FALSE); offset += 4;
809     proto_tree_add_item(first_saddr_tree, hf_dplay_type_2e_saddr_padd_1, tvb, offset, 8, FALSE); offset += 8;
810
811     second_saddr_item = proto_tree_add_text(tree, tvb, offset, 16,
812             "DirectPlay message type 0x002e s_addr_in structure 2");
813     second_saddr_tree = proto_item_add_subtree(second_saddr_item, ett_dplay_type2e_saddr2);
814
815     proto_tree_add_item(second_saddr_tree, hf_dplay_type_2e_saddr_af_2, tvb, offset, 2, TRUE); offset += 2;
816     proto_tree_add_item(second_saddr_tree, hf_dplay_type_2e_saddr_port_2, tvb, offset, 2, FALSE); offset += 2;
817     proto_tree_add_item(second_saddr_tree, hf_dplay_type_2e_saddr_ip_2, tvb, offset, 4, FALSE); offset += 4;
818     proto_tree_add_item(second_saddr_tree, hf_dplay_type_2e_saddr_padd_2, tvb, offset, 8, FALSE); offset += 8;
819
820     return offset;
821 }
822
823 static gint dissect_type2f_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
824 {
825     proto_tree_add_item(tree, hf_dplay_type_2f_dpid, tvb, offset, 4, FALSE); offset += 4;
826     return offset;
827 }
828
829 static gint dissect_type38_message(proto_tree *tree, tvbuff_t *tvb, gint offset)
830 {
831     proto_item *first_saddr_item = NULL, *second_saddr_item = NULL;
832     proto_tree *first_saddr_tree = NULL, *second_saddr_tree = NULL;
833     gint string_1_len, string_2_len;
834
835     proto_tree_add_item(tree, hf_dplay_type_38_padding_1, tvb, offset, 4, FALSE); offset += 4;
836     proto_tree_add_item(tree, hf_dplay_type_38_dpid_1, tvb, offset, 4, FALSE); offset += 4;
837     proto_tree_add_item(tree, hf_dplay_type_38_unknown_1, tvb, offset, 20, FALSE); offset += 20;
838     proto_tree_add_item(tree, hf_dplay_type_38_dpid_2, tvb, offset, 4, FALSE); offset += 4;
839     string_1_len = tvb_get_letohl(tvb, offset);
840     proto_tree_add_item(tree, hf_dplay_type_38_string_1_len, tvb, offset, 4, TRUE); offset += 4;
841     string_2_len = tvb_get_letohl(tvb, offset);
842     proto_tree_add_item(tree, hf_dplay_type_38_string_2_len, tvb, offset, 4, TRUE); offset += 4;
843     proto_tree_add_item(tree, hf_dplay_type_38_unknown_2, tvb, offset, 12, FALSE); offset += 12;
844     proto_tree_add_item(tree, hf_dplay_type_38_dpid_3, tvb, offset, 4, FALSE); offset += 4;
845     proto_tree_add_item(tree, hf_dplay_type_38_unknown_3, tvb, offset, 12, FALSE); offset += 12;
846
847     if(string_1_len > 0)
848         offset = display_unicode_string(tree, hf_dplay_type_38_string_1, tvb, offset);
849     if(string_2_len > 0)
850         offset = display_unicode_string(tree, hf_dplay_type_38_string_2, tvb, offset);
851
852     first_saddr_item = proto_tree_add_text(tree, tvb, offset, 16,
853             "DirectPlay message type 0x0038 s_addr_in structure 1");
854     first_saddr_tree = proto_item_add_subtree(first_saddr_item, ett_dplay_type38_saddr1);
855
856     proto_tree_add_item(first_saddr_tree, hf_dplay_type_38_saddr_af_1, tvb, offset, 2, TRUE); offset += 2;
857     proto_tree_add_item(first_saddr_tree, hf_dplay_type_38_saddr_port_1, tvb, offset, 2, FALSE); offset += 2;
858     proto_tree_add_item(first_saddr_tree, hf_dplay_type_38_saddr_ip_1, tvb, offset, 4, FALSE); offset += 4;
859     proto_tree_add_item(first_saddr_tree, hf_dplay_type_38_saddr_padd_1, tvb, offset, 8, FALSE); offset += 8;
860
861     second_saddr_item = proto_tree_add_text(tree, tvb, offset, 16,
862             "DirectPlay message type 0x0038 s_addr_in structure 2");
863     second_saddr_tree = proto_item_add_subtree(second_saddr_item, ett_dplay_type38_saddr2);
864
865     proto_tree_add_item(second_saddr_tree, hf_dplay_type_38_saddr_af_2, tvb, offset, 2, TRUE); offset += 2;
866     proto_tree_add_item(second_saddr_tree, hf_dplay_type_38_saddr_port_2, tvb, offset, 2, FALSE); offset += 2;
867     proto_tree_add_item(second_saddr_tree, hf_dplay_type_38_saddr_ip_2, tvb, offset, 4, FALSE); offset += 4;
868     proto_tree_add_item(second_saddr_tree, hf_dplay_type_38_saddr_padd_2, tvb, offset, 8, FALSE); offset += 8;
869
870     return offset;
871 }
872
873 static void dissect_dplay(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
874 {
875     guint16 message_type;
876     guint16 second_message_type = -1;
877     guint16 proto_version;
878     guint16 packet_size;
879     guint32 dplay_id;
880     guint8 play_id[] = {'p','l','a','y'};
881
882     packet_size = tvb_get_letohs(tvb, 0);
883     dplay_id = tvb_get_letohl(tvb, 20);
884     message_type = tvb_get_letohs(tvb, 24);
885     proto_version = tvb_get_letohs(tvb, 26);
886
887     if(memcmp(play_id, (guint8 *)&dplay_id, 4) != 0)
888     {
889         if(check_col(pinfo->cinfo, COL_PROTOCOL))
890             col_set_str(pinfo->cinfo, COL_PROTOCOL, "DPLAY");
891         /* Clear out stuff in the info column */
892         if(check_col(pinfo->cinfo,COL_INFO))
893             col_clear(pinfo->cinfo,COL_INFO);
894         if(check_col(pinfo->cinfo,COL_INFO))
895             col_add_fstr(pinfo->cinfo,COL_INFO, "DPlay data packet");
896         return;
897     }
898
899     if(message_type == 0x0015)
900     {
901         second_message_type = tvb_get_letohs(tvb, 72);
902     }
903
904     if(check_col(pinfo->cinfo, COL_PROTOCOL))
905         col_set_str(pinfo->cinfo, COL_PROTOCOL, "DPLAY");
906     /* Clear out stuff in the info column */
907     if(check_col(pinfo->cinfo,COL_INFO))
908     {
909         col_clear(pinfo->cinfo,COL_INFO);
910     }
911
912     if(check_col(pinfo->cinfo,COL_INFO))
913     {
914         if(message_type == 0x0015)
915             col_add_fstr(pinfo->cinfo,COL_INFO, "%s: %s, holding a %s",
916                 val_to_str(proto_version, dplay_proto_version_val, "Unknown (0x%04x)"),
917                 val_to_str(message_type, dplay_type_val, "Unknown (0x%04x)"),
918                 val_to_str(second_message_type, dplay_type_val, "Unknown (0x%04x)"));
919         else
920             col_add_fstr(pinfo->cinfo,COL_INFO, "%s: %s",
921                 val_to_str(proto_version, dplay_proto_version_val, "Unknown (0x%04x)"),
922                 val_to_str(message_type, dplay_type_val, "Unknown (0x%04x)"));
923     }
924
925     if(tree)
926     {
927         proto_item *dplay_item = NULL;
928         proto_item *header_item = NULL;
929         proto_item *data_item = NULL;
930         proto_tree *dplay_tree = NULL;
931         proto_tree *dplay_header = NULL;
932         proto_tree *dplay_data = NULL;
933         gint offset = 0;
934
935         dplay_item = proto_tree_add_item(tree, proto_dplay, tvb, 0, -1, FALSE);
936         dplay_tree = proto_item_add_subtree(dplay_item, ett_dplay);
937         header_item = proto_tree_add_text(dplay_tree, tvb, offset, DPLAY_HEADER_OFFSET, "DirectPlay header");
938         dplay_header = proto_item_add_subtree(header_item, ett_dplay_header);
939
940         offset = dissect_dplay_header(dplay_header, tvb, offset);
941
942         /* Special handling for empty type 0x0004 packets */
943         if(message_type == 0x0004)
944             return;
945
946         data_item = proto_tree_add_text(dplay_tree, tvb, offset, -1, "DirectPlay data");
947         dplay_data = proto_item_add_subtree(data_item, ett_dplay_data);
948
949         switch(message_type)
950         {
951             case 0x0001:
952                 offset = dissect_type01_message(dplay_data, tvb, offset);
953                 break;
954             case 0x0002:
955                 offset = dissect_type02_message(dplay_data, tvb, offset);
956                 break;
957             case 0x0004:
958                 /* We should not get here. */
959                 break;
960             case 0x0005:
961                 offset = dissect_type05_message(dplay_data, tvb, offset);
962                 break;
963             case 0x0007:
964                 offset = dissect_type07_message(dplay_data, tvb, offset);
965                 break;
966             case 0x0008:
967                 offset = dissect_type08_message(dplay_data, tvb, offset);
968                 break;
969             case 0x000b:
970                 offset = dissect_type0b_message(dplay_data, tvb, offset);
971                 break;
972             case 0x000d:
973                 offset = dissect_type0d_message(dplay_data, tvb, offset);
974                 break;
975             case 0x000e:
976                 offset = dissect_type0e_message(dplay_data, tvb, offset);
977                 break;
978             case 0x000f:
979                 offset = dissect_type0f_message(dplay_data, tvb, offset);
980                 break;
981             case 0x0013:
982                 offset = dissect_type13_message(dplay_data, tvb, offset);
983                 break;
984             case 0x0015:
985                 offset = dissect_type15_message(dplay_data, tvb, offset);
986                 break;
987             case 0x0016:
988                 offset = dissect_type16_message(dplay_data, tvb, offset);
989                 break;
990             case 0x0017:
991                 offset = dissect_type17_message(dplay_data, tvb, offset);
992                 break;
993             case 0x001a:
994                 offset = dissect_type1a_message(dplay_data, tvb, offset);
995                 break;
996             case 0x0029:
997                 offset = dissect_type29_message(dplay_data, tvb, offset);
998                 break;
999             case 0x002e:
1000                 offset = dissect_type2e_message(dplay_data, tvb, offset);
1001                 break;
1002             case 0x002f:
1003                 offset = dissect_type2f_message(dplay_data, tvb, offset);
1004                 break;
1005             case 0x0038:
1006                 offset = dissect_type38_message(dplay_data, tvb, offset);
1007                 break;
1008         }
1009     }
1010
1011 }
1012
1013 static gboolean heur_dissect_dplay(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
1014 {
1015     if(!tvb_bytes_exist(tvb, 0, 4))
1016         return FALSE;
1017
1018     if( (tvb_get_guint8(tvb, 2) != 0xb0)
1019         || (tvb_get_guint8(tvb, 3) != 0xfa))
1020         return FALSE;
1021
1022     dissect_dplay(tvb, pinfo, tree);
1023     return TRUE;
1024 }
1025
1026 void proto_register_dplay()
1027 {
1028     static hf_register_info hf [] = {
1029     /* Common data fields */
1030     { &hf_dplay_size,
1031         { "DirectPlay package size", "dplay.size", FT_UINT16, BASE_DEC,
1032         NULL, 0x0, "", HFILL}},
1033     { &hf_dplay_ident,
1034         { "DirectPlay identifyer", "dplay.ident", FT_UINT16, BASE_HEX,
1035         NULL, 0x0, "", HFILL}},
1036     { &hf_dplay_saddr_af,
1037         { "DirectPlay s_addr_in address family", "dplay.saddr.af", FT_UINT16, BASE_HEX,
1038         VALS(dplay_af_val), 0x0, "", HFILL}},
1039     { &hf_dplay_saddr_port,
1040         { "DirectPlay s_addr_in port", "dplay.saddr.port", FT_UINT16, BASE_DEC,
1041         NULL, 0x0, "", HFILL}},
1042     { &hf_dplay_saddr_ip,
1043         { "DirectPlay s_addr_in ip address", "dplay.saddr.ip", FT_IPv4, BASE_NONE,
1044         NULL, 0x0, "", HFILL}},
1045     { &hf_dplay_saddr_padding,
1046         { "DirectPlay s_addr_in null padding", "dplay.saddr.padding", FT_BYTES, BASE_NONE,
1047         NULL, 0x0, "", HFILL}},
1048     { &hf_dplay_play_str,
1049         { "DirectPlay action string", "dplay.dplay_str", FT_STRING, BASE_NONE,
1050         NULL, 0x0, "", HFILL}},
1051     { &hf_dplay_type,
1052         { "DirectPlay type", "dplay.type", FT_UINT16, BASE_HEX,
1053         VALS(dplay_type_val), 0x0, "", HFILL}},
1054     { &hf_dplay_proto_version,
1055         { "DirectPlay protocol version", "dplay.proto.version", FT_UINT16, BASE_HEX,
1056         VALS(dplay_proto_version_val), 0x0, "", HFILL}},
1057     { &hf_dplay_play_str_2,
1058         { "DirectPlay second action string", "dplay.dplay_str_2", FT_STRING, BASE_NONE,
1059         NULL, 0x0, "", HFILL}},
1060     { &hf_dplay_type_2,
1061         { "DirectPlay second type", "dplay.type_2", FT_UINT16, BASE_HEX,
1062         VALS(dplay_type_val), 0x0, "", HFILL}},
1063     { &hf_dplay_proto_version_2,
1064         { "DirectPlay second protocol version", "dplay.proto.version_2", FT_UINT16, BASE_HEX,
1065         VALS(dplay_proto_version_val), 0x0, "", HFILL}},
1066     { &hf_dplay_flags,
1067         { "DirectPlay message flags", "dplay.flags", FT_UINT32, BASE_HEX,
1068         NULL, 0x0, "", HFILL}},
1069     { &hf_dplay_flags_client_server,
1070         { "DirectPlay client/server flag", "dplay.flags.client_server", FT_BOOLEAN, 32,
1071         TFS(&tfs_dplay_flag), DPLAY_FLAG_CLIENT_SERVER, "Client/Server", HFILL}},
1072     { &hf_dplay_flags_0002,
1073         { "DirectPlay message flag 0x0002", "dplay.flags.flag_0002", FT_BOOLEAN, 32,
1074         TFS(&tfs_dplay_flag), DPLAY_FLAG_0002, "Flag 0x0002", HFILL}},
1075     { &hf_dplay_flags_migrate_host,
1076         { "DirectPlay migrate host flag", "dplay.flags.migrate_host", FT_BOOLEAN, 32,
1077         TFS(&tfs_dplay_flag), DPLAY_FLAG_MIGRATE_HOST, "Migrate host", HFILL}},
1078     { &hf_dplay_flags_0008,
1079         { "DirectPlay message flag 0x0008", "dplay.flags.flag_0008", FT_BOOLEAN, 32,
1080         TFS(&tfs_dplay_flag), DPLAY_FLAG_0008, "Flag 0x0008", HFILL}},
1081     { &hf_dplay_flags_0010,
1082         { "DirectPlay message flag 0x0010", "dplay.flags.flag_0010", FT_BOOLEAN, 32,
1083         TFS(&tfs_dplay_flag), DPLAY_FLAG_0010, "Flag 0x0008", HFILL}},
1084     { &hf_dplay_flags_0020,
1085         { "DirectPlay message flag 0x0020", "dplay.flags.flag_0020", FT_BOOLEAN, 32,
1086         TFS(&tfs_dplay_flag), DPLAY_FLAG_0020, "Flag 0x0020", HFILL}},
1087     { &hf_dplay_flags_nodpnsvr,
1088         { "DirectPlay NODPSVR flag", "dplay.flags.nodpsvr", FT_BOOLEAN, 32,
1089         TFS(&tfs_dplay_flag), DPLAY_FLAG_NODPSVR, "nodpsvr", HFILL}},
1090     { &hf_dplay_flags_req_passwd,
1091         { "DirectPlay require password flag", "dplay.flags.req_passwd", FT_BOOLEAN, 32,
1092         TFS(&tfs_dplay_flag), DPLAY_FLAG_REQ_PASSWD, "Require Password", HFILL}},
1093     { &hf_dplay_flags_noenums,
1094         { "DirectPlay NOENUMS flag", "dplay.flags.noenums", FT_BOOLEAN, 32,
1095         TFS(&tfs_dplay_flag), DPLAY_FLAG_NOENUMS, "noenums", HFILL}},
1096     { &hf_dplay_flags_fast_sig,
1097         { "DirectPlay fast signed flag", "dplay.flags.fast_sig", FT_BOOLEAN, 32,
1098         TFS(&tfs_dplay_flag), DPLAY_FLAG_SIG_FAST, "Fast Signed", HFILL}},
1099     { &hf_dplay_flags_full_sig,
1100         { "DirectPlay full signed flag", "dplay.flags.full_sig", FT_BOOLEAN, 32,
1101         TFS(&tfs_dplay_flag), DPLAY_FLAG_SIG_FULL, "Full Signed", HFILL}},
1102     { &hf_dplay_flags_0800,
1103         { "DirectPlay message flag 0x0800", "dplay.flags.flag_0800", FT_BOOLEAN, 32,
1104         TFS(&tfs_dplay_flag), DPLAY_FLAG_0800, "Flag 0x0800", HFILL}},
1105     { &hf_dplay_flags_1000,
1106         { "DirectPlay message flag 0x1000", "dplay.flags.flag_1000", FT_BOOLEAN, 32,
1107         TFS(&tfs_dplay_flag), DPLAY_FLAG_1000, "Flag 0x1000", HFILL}},
1108     { &hf_dplay_flags_encapsulate,
1109         { "DirectPlay encapsulation flag", "dplay.flags.encapsulate", FT_BOOLEAN, 32,
1110         TFS(&tfs_dplay_flag), DPLAY_FLAG_ENCAPSULATE, "Flag 0x2000", HFILL}},
1111     { &hf_dplay_flags_4000,
1112         { "DirectPlay message flag 0x4000", "dplay.flags.flag_4000", FT_BOOLEAN, 32,
1113         TFS(&tfs_dplay_flag), DPLAY_FLAG_4000, "Flag 0x4000", HFILL}},
1114     { &hf_dplay_flags_8000,
1115         { "DirectPlay message flag 0x8000", "dplay.flags.flag_8000", FT_BOOLEAN, 32,
1116         TFS(&tfs_dplay_flag), DPLAY_FLAG_8000, "Flag 0x8000", HFILL}},
1117
1118     { &hf_dplay_instance_guid,
1119         { "DirectPlay instance guid", "dplay.instance.guid", FT_GUID, BASE_NONE,
1120         NULL, 0x0, "", HFILL}},
1121     { &hf_dplay_game_guid,
1122         { "DirectPlay game GUID", "dplay.game.guid", FT_GUID, BASE_NONE,
1123         NULL, 0x0, "", HFILL}},
1124
1125     /* special fields, to be phased out*/
1126     { &hf_dplay_data_type_0f,
1127         { "DirectPlay data for type 0f messages", "dplay.data.type_0f", FT_BYTES, BASE_HEX,
1128         NULL, 0x0, "", HFILL}},
1129     { &hf_dplay_data_type_1a,
1130         { "DirectPlay data for type 1a messages", "dplay.data.type_1a", FT_BYTES, BASE_HEX,
1131         NULL, 0x0, "", HFILL}},
1132     { &hf_dplay_data_type_29,
1133         { "DirectPlay data for type 29 messages", "dplay.data.type_29", FT_BYTES, BASE_HEX,
1134         NULL, 0x0, "", HFILL}},
1135
1136     /* Data fields for message type 0x0001 */
1137     { &hf_dplay_type_01_length_1,
1138         { "DirectPlay message type 0x0001 data length", "dplay.type_01.length_1", FT_UINT32, BASE_DEC,
1139         NULL, 0x0, "", HFILL}},
1140     { &hf_dplay_type_01_max_players,
1141         { "DirectPlay maximal players ", "dplay.type_01.max_players", FT_UINT32, BASE_DEC,
1142         NULL, 0x0, "", HFILL}},
1143     { &hf_dplay_type_01_curr_players,
1144         { "DirectPlay current players", "dplay.type_01.curr_players", FT_UINT32, BASE_DEC,
1145         NULL, 0x0, "", HFILL}},
1146     { &hf_dplay_type_01_magic_8_bytes,
1147         { "DirectPlay message type 0x0001 magic 8 bytes", "dplay.type_01.magic_8_bytes", FT_BYTES, BASE_HEX,
1148         NULL, 0x0, "", HFILL}},
1149     { &hf_dplay_type_01_dpid,
1150         { "DirectPlay Lobby server ID", "dplay.type_01.dpid", FT_BYTES, BASE_HEX,
1151         NULL, 0x0, "", HFILL}},
1152     { &hf_dplay_type_01_magic_20_bytes,
1153         { "DirectPlay message type 0x0001 magic 20 bytes", "dplay.type_01.magic_20_bytes", FT_BYTES, BASE_HEX,
1154         NULL, 0x0, "", HFILL}},
1155     { &hf_dplay_type_01_backslash,
1156         { "DirectPlay message type 0x0001 backslash", "dplay.type_01.backslash", FT_STRING, BASE_NONE,
1157         NULL, 0x0, "", HFILL}},
1158     { &hf_dplay_type_01_game_name,
1159         { "DirectPlay message type 0x0001 game_name", "dplay.type_01.game_name", FT_STRING, BASE_NONE,
1160         NULL, 0x0, "", HFILL}},
1161
1162     /* Data fields for message type 0x0002 */
1163     { &hf_dplay_type_02_game_guid,
1164         { "DirectPlay game GUID", "dplay.type02.game.guid", FT_GUID, BASE_NONE,
1165         NULL, 0x0, "", HFILL}},
1166     { &hf_dplay_type_02_ignored,
1167         { "DirectPlay message type 0x0002 ignored", "dplay.type02.ignored", FT_BYTES, BASE_HEX,
1168         NULL, 0x0, "", HFILL}},
1169
1170     /* Data fields for message type 0x0005 */
1171     { &hf_dplay_type_05_request,
1172         { "DirectPlay ID request", "dplay.type_05.request", FT_UINT32, BASE_HEX,
1173         VALS(dplay_type05_request), 0x0, "", HFILL}},
1174
1175     /* Data fields for message type 0x0007 */
1176     { &hf_dplay_type_07_dpid,
1177         { "DirectPlay ID", "dplay.type_07.dpid", FT_BYTES, BASE_HEX,
1178         NULL, 0x0, "", HFILL}},
1179     { &hf_dplay_type_07_padding,
1180         { "DirectPlay message type 0x0007 padding", "dplay.type_07.padding", FT_BYTES, BASE_HEX,
1181         NULL, 0x0, "", HFILL}},
1182
1183     /* Data fields for message type 0x0008 */
1184     { &hf_dplay_type_08_padding_1,
1185         { "DirectPlay message type 0x0008 padding 1", "dplay.type_08.padding_1", FT_BYTES, BASE_HEX,
1186         NULL, 0x0, "", HFILL}},
1187     { &hf_dplay_type_08_dpid_1,
1188         { "DirectPlay message type 0x0008 client DP ID", "dplay.type_08.dpid_1", FT_BYTES, BASE_HEX,
1189         NULL, 0x0, "", HFILL}},
1190     { &hf_dplay_type_08_unknown_1,
1191         { "DirectPlay message type 0x0008 unknown 1", "dplay.type_08.unknown_1", FT_BYTES, BASE_HEX,
1192         NULL, 0x0, "", HFILL}},
1193     { &hf_dplay_type_08_dpid_2,
1194         { "DirectPlay message type 0x0008 client DP ID", "dplay.type_08.dpid_2", FT_BYTES, BASE_HEX,
1195         NULL, 0x0, "", HFILL}},
1196     { &hf_dplay_type_08_string_1_len,
1197         { "DirectPlay message type 0x0008 string 1 length", "dplay.type_08.string_1.length", FT_UINT32,
1198         BASE_DEC, NULL, 0x0, "", HFILL}},
1199     { &hf_dplay_type_08_string_2_len,
1200         { "DirectPlay message type 0x0008 string 2 length", "dplay.type_08.string_2.length", FT_UINT32,
1201         BASE_DEC, NULL, 0x0, "", HFILL}},
1202     { &hf_dplay_type_08_unknown_2,
1203         { "DirectPlay message type 0x0008 unknown 2", "dplay.type_08.unknown_2", FT_BYTES, BASE_HEX,
1204         NULL, 0x0, "", HFILL}},
1205     { &hf_dplay_type_08_dpid_3,
1206         { "DirectPlay message type 0x0008 client DP ID", "dplay.type_08.dpid_3", FT_BYTES, BASE_HEX,
1207         NULL, 0x0, "", HFILL}},
1208     { &hf_dplay_type_08_unknown_3,
1209         { "DirectPlay message type 0x0008 unknown 3", "dplay.type_08.unknown_3", FT_BYTES, BASE_HEX,
1210         NULL, 0x0, "", HFILL}},
1211     { &hf_dplay_type_08_string_1,
1212         { "DirectPlay message type 0x0008 string 1", "dplay.type_08.string_1", FT_STRING, BASE_NONE,
1213         NULL, 0x0, "", HFILL}},
1214     { &hf_dplay_type_08_string_2,
1215         { "DirectPlay message type 0x0008 string 2", "dplay.type_08.string_2", FT_STRING, BASE_NONE,
1216         NULL, 0x0, "", HFILL}},
1217     { &hf_dplay_type_08_saddr_af_1,
1218         { "DirectPlay message type 0x0008 s_addr_in address family 1", "dplay.type_08.saddr.af_1", FT_UINT16,
1219             BASE_DEC, VALS(dplay_af_val), 0x0, "", HFILL}},
1220     { &hf_dplay_type_08_saddr_port_1,
1221         { "DirectPlay message type 0x0008 s_addr_in port 1", "dplay.type_08.saddr.port_1", FT_UINT16, BASE_DEC,
1222         NULL, 0x0, "", HFILL}},
1223     { &hf_dplay_type_08_saddr_ip_1,
1224         { "DirectPlay message type 0x0008 s_addr_in ip 1", "dplay.type_08.saddr.ip_1", FT_IPv4, BASE_NONE,
1225         NULL, 0x0, "", HFILL}},
1226     { &hf_dplay_type_08_saddr_padd_1,
1227         { "DirectPlay message type 0x0008 s_addr_in padding 1", "dplay.type_08.saddr.padd_1", FT_BYTES, BASE_HEX,
1228         NULL, 0x0, "", HFILL}},
1229     { &hf_dplay_type_08_saddr_af_2,
1230         { "DirectPlay message type 0x0008 s_addr_in address family 2", "dplay.type_08.saddr.af_2", FT_UINT16,
1231             BASE_DEC, VALS(dplay_af_val), 0x0, "", HFILL}},
1232     { &hf_dplay_type_08_saddr_port_2,
1233         { "DirectPlay message type 0x0008 s_addr_in port 2", "dplay.type_08.saddr.port_2", FT_UINT16, BASE_DEC,
1234         NULL, 0x0, "", HFILL}},
1235     { &hf_dplay_type_08_saddr_ip_2,
1236         { "DirectPlay message type 0x0008 s_addr_in ip 2", "dplay.type_08.saddr.ip_2", FT_IPv4, BASE_NONE,
1237         NULL, 0x0, "", HFILL}},
1238     { &hf_dplay_type_08_saddr_padd_2,
1239         { "DirectPlay message type 0x0008 s_addr_in padding 2", "dplay.type_08.saddr.padd_2", FT_BYTES, BASE_HEX,
1240         NULL, 0x0, "", HFILL}},
1241     { &hf_dplay_type_08_padding_2,
1242         { "DirectPlay message type 0x0008 padding 2", "dplay.type_08.padding_2", FT_BYTES, BASE_HEX,
1243         NULL, 0x0, "", HFILL}},
1244
1245     /* Data fields for message type 0x000b */
1246     { &hf_dplay_type_0b_padding_1,
1247         { "DirectPlay message type 0x000b padding 1", "dplay.type_0b.padding_1", FT_BYTES, BASE_HEX,
1248         NULL, 0x0, "", HFILL}},
1249     { &hf_dplay_type_0b_dpid,
1250         { "DirectPlay message type 0x000b DP ID", "dplay.type_0b.dpid", FT_BYTES, BASE_HEX,
1251         NULL, 0x0, "", HFILL}},
1252     { &hf_dplay_type_0b_padding_2,
1253         { "DirectPlay message type 0x000b padding 2", "dplay.type_0b.padding_2", FT_BYTES, BASE_HEX,
1254         NULL, 0x0, "", HFILL}},
1255
1256     /* Data fields for message type 0x000d */
1257     { &hf_dplay_type_0d_padding_1,
1258         { "DirectPlay message type 0x000d padding 1", "dplay.type_0d.padding_1", FT_BYTES, BASE_HEX,
1259         NULL, 0x0, "", HFILL}},
1260     { &hf_dplay_type_0d_dpid_1,
1261         { "DirectPlay message type 0x000d DP ID 1", "dplay.type_0d.dpid_1", FT_BYTES, BASE_HEX,
1262         NULL, 0x0, "", HFILL}},
1263     { &hf_dplay_type_0d_dpid_2,
1264         { "DirectPlay message type 0x000d DP ID 2", "dplay.type_0d.dpid_2", FT_BYTES, BASE_HEX,
1265         NULL, 0x0, "", HFILL}},
1266     { &hf_dplay_type_0d_padding_2,
1267         { "DirectPlay message type 0x000d padding 2", "dplay.type_0d.padding_2", FT_BYTES, BASE_HEX,
1268         NULL, 0x0, "", HFILL}},
1269
1270     /* Data fields for message type 0x000e */
1271     { &hf_dplay_type_0e_padding_1,
1272         { "DirectPlay message type 0x000e padding 1", "dplay.type_0e.padding_1", FT_BYTES, BASE_HEX,
1273         NULL, 0x0, "", HFILL}},
1274     { &hf_dplay_type_0e_dpid_1,
1275         { "DirectPlay message type 0x000e DP ID 1", "dplay.type_0e.dpid_1", FT_BYTES, BASE_HEX,
1276         NULL, 0x0, "", HFILL}},
1277     { &hf_dplay_type_0e_dpid_2,
1278         { "DirectPlay message type 0x000e DP ID 2", "dplay.type_0e.dpid_2", FT_BYTES, BASE_HEX,
1279         NULL, 0x0, "", HFILL}},
1280     { &hf_dplay_type_0e_padding_2,
1281         { "DirectPlay message type 0x000e padding 2", "dplay.type_0e.padding_2", FT_BYTES, BASE_HEX,
1282         NULL, 0x0, "", HFILL}},
1283
1284     /* Data fields for message type 0x0013 */
1285     { &hf_dplay_type_13_padding_1,
1286         { "DirectPlay message type 0x0013 padding 1", "dplay.type_13.padding_1", FT_BYTES, BASE_HEX,
1287         NULL, 0x0, "", HFILL}},
1288     { &hf_dplay_type_13_dpid_1,
1289         { "DirectPlay message type 0x0013 client DP ID", "dplay.type_13.dpid_1", FT_BYTES, BASE_HEX,
1290         NULL, 0x0, "", HFILL}},
1291     { &hf_dplay_type_13_unknown_1,
1292         { "DirectPlay message type 0x0013 unknown 1", "dplay.type_13.unknown_1", FT_BYTES, BASE_HEX,
1293         NULL, 0x0, "", HFILL}},
1294     { &hf_dplay_type_13_dpid_2,
1295         { "DirectPlay message type 0x0013 client DP ID", "dplay.type_13.dpid_2", FT_BYTES, BASE_HEX,
1296         NULL, 0x0, "", HFILL}},
1297     { &hf_dplay_type_13_unknown_2,
1298         { "DirectPlay message type 0x0013 unknown 2", "dplay.type_13.unknown_2", FT_BYTES, BASE_HEX,
1299         NULL, 0x0, "", HFILL}},
1300     { &hf_dplay_type_13_dpid_3,
1301         { "DirectPlay message type 0x0013 client DP ID", "dplay.type_13.dpid_3", FT_BYTES, BASE_HEX,
1302         NULL, 0x0, "", HFILL}},
1303     { &hf_dplay_type_13_unknown_3,
1304         { "DirectPlay message type 0x0013 unknown 3", "dplay.type_13.unknown_3", FT_BYTES, BASE_HEX,
1305         NULL, 0x0, "", HFILL}},
1306     { &hf_dplay_type_13_saddr_af_1,
1307         { "DirectPlay message type 0x0013 s_addr_in address family 1", "dplay.type_13.saddr.af_1", FT_UINT16,
1308             BASE_DEC, VALS(dplay_af_val), 0x0, "", HFILL}},
1309     { &hf_dplay_type_13_saddr_port_1,
1310         { "DirectPlay message type 0x0013 s_addr_in port 1", "dplay.type_13.saddr.port_1", FT_UINT16, BASE_DEC,
1311         NULL, 0x0, "", HFILL}},
1312     { &hf_dplay_type_13_saddr_ip_1,
1313         { "DirectPlay message type 0x0013 s_addr_in ip 1", "dplay.type_13.saddr.ip_1", FT_IPv4, BASE_NONE,
1314         NULL, 0x0, "", HFILL}},
1315     { &hf_dplay_type_13_saddr_padd_1,
1316         { "DirectPlay message type 0x0013 s_addr_in padding 1", "dplay.type_13.saddr.padd_1", FT_BYTES, BASE_HEX,
1317         NULL, 0x0, "", HFILL}},
1318     { &hf_dplay_type_13_saddr_af_2,
1319         { "DirectPlay message type 0x0013 s_addr_in address family 2", "dplay.type_13.saddr.af_2", FT_UINT16,
1320             BASE_DEC, VALS(dplay_af_val), 0x0, "", HFILL}},
1321     { &hf_dplay_type_13_saddr_port_2,
1322         { "DirectPlay message type 0x0013 s_addr_in port 2", "dplay.type_13.saddr.port_2", FT_UINT16, BASE_DEC,
1323         NULL, 0x0, "", HFILL}},
1324     { &hf_dplay_type_13_saddr_ip_2,
1325         { "DirectPlay message type 0x0013 s_addr_in ip 2", "dplay.type_13.saddr.ip_2", FT_IPv4, BASE_NONE,
1326         NULL, 0x0, "", HFILL}},
1327     { &hf_dplay_type_13_saddr_padd_2,
1328         { "DirectPlay message type 0x0013 s_addr_in padding 2", "dplay.type_13.saddr.padd_2", FT_BYTES, BASE_HEX,
1329         NULL, 0x0, "", HFILL}},
1330     { &hf_dplay_type_13_padding_2,
1331         { "DirectPlay message type 0x0013 padding 2", "dplay.type_13.padding_2", FT_BYTES, BASE_HEX,
1332         NULL, 0x0, "", HFILL}},
1333     { &hf_dplay_type_13_dpid_4,
1334         { "DirectPlay message type 0x0013 server DP ID", "dplay.type_13.dpid_4", FT_BYTES, BASE_HEX,
1335         NULL, 0x0, "", HFILL}},
1336
1337     /* Data fields for message type 0x0015 */
1338     { &hf_dplay_container_guid,
1339         { "DirectPlay container GUID", "dplay.container.guid", FT_GUID, BASE_NONE,
1340         NULL, 0x0, "", HFILL}},
1341     { &hf_dplay_type_15_padding_1,
1342         { "DirectPlay message type 0x0015 padding 1", "dplay.type_15.padding_1", FT_BYTES, BASE_HEX,
1343         NULL, 0x0, "", HFILL}},
1344     { &hf_dplay_type_15_size_1,
1345         { "DirectPlay encapsulated packet size 1", "dplay.type_15.encap_size_1", FT_UINT32, BASE_DEC,
1346         NULL, 0x0, "", HFILL}},
1347     { &hf_dplay_type_15_padding_2,
1348         { "DirectPlay message type 0x0015 padding 2", "dplay.type_15.padding_2", FT_BYTES, BASE_HEX,
1349         NULL, 0x0, "", HFILL}},
1350     { &hf_dplay_type_15_unknown_1,
1351         { "DirectPlay message type 0x0015 unknown", "dplay.type_15.unknown_1", FT_UINT32, BASE_DEC,
1352         NULL, 0x0, "", HFILL}},
1353     { &hf_dplay_type_15_size_2,
1354         { "DirectPlay encapsulated packet size 2", "dplay.type_15.encap_size_2", FT_UINT32, BASE_DEC,
1355         NULL, 0x0, "", HFILL}},
1356     { &hf_dplay_type_15_padding_3,
1357         { "DirectPlay message type 0x0015 padding 3", "dplay.type_15.padding_3", FT_BYTES, BASE_HEX,
1358         NULL, 0x0, "", HFILL}},
1359
1360     /* Data field for message type 0x0016 */
1361     { &hf_dplay_type_16_data,
1362         { "DirectPlay type 0x0016 message data", "dplay.data.type_16", FT_BYTES, BASE_HEX,
1363         NULL, 0x0, "", HFILL}},
1364
1365     /* Data field for message type 0x0017 */
1366     { &hf_dplay_type_17_data,
1367         { "DirectPlay type 0x0017 message data", "dplay.data.type_17", FT_BYTES, BASE_HEX,
1368         NULL, 0x0, "", HFILL}},
1369
1370     /* Data fields for message type 0x0029 */
1371     { &hf_dplay_type_29_unknown_uint32_01,
1372         { "DirectPlay message type 0x0029 unknown uint32 1 (3)", "dplay.type_29.unknown_uint32_01", FT_UINT32,
1373         BASE_DEC, NULL, 0x0, "", HFILL}},
1374     { &hf_dplay_type_29_message_end_type,
1375         { "DirectPlay message type 0x0029 message end type", "dplay.type_29.msg_end_type", FT_UINT32,
1376         BASE_DEC, VALS(dplay_type29_end_type), 0x0, "", HFILL}},
1377     { &hf_dplay_type_29_unknown_uint32_03,
1378         { "DirectPlay message type 0x0029 unknown uint32 3", "dplay.type_29.unknown_uint32_03", FT_UINT32,
1379         BASE_DEC, NULL, 0x0, "", HFILL}},
1380     { &hf_dplay_type_29_unknown_uint32_04,
1381         { "DirectPlay message type 0x0029 unknown uint32 4 (0)", "dplay.type_29.unknown_uint32_04", FT_UINT32,
1382         BASE_DEC, NULL, 0x0, "", HFILL}},
1383     { &hf_dplay_type_29_unknown_uint32_05,
1384         { "DirectPlay message type 0x0029 unknown uint32 5 (36)", "dplay.type_29.unknown_uint32_05", FT_UINT32,
1385         BASE_DEC, NULL, 0x0, "", HFILL}},
1386     { &hf_dplay_type_29_unknown_uint32_06,
1387         { "DirectPlay message type 0x0029 unknown uint32 6 (116)", "dplay.type_29.unknown_uint32_06", FT_UINT32,
1388         BASE_DEC, NULL, 0x0, "", HFILL}},
1389     { &hf_dplay_type_29_unknown_uint32_07,
1390         { "DirectPlay message type 0x0029 unknown uint32 7 (0)", "dplay.type_29.unknown_uint32_07", FT_UINT32,
1391         BASE_DEC, NULL, 0x0, "", HFILL}},
1392     { &hf_dplay_type_29_unknown_uint32_08,
1393         { "DirectPlay message type 0x0029 unknown uint32 8 (80)", "dplay.type_29.unknown_uint32_08", FT_UINT32,
1394         BASE_DEC, NULL, 0x0, "", HFILL}},
1395     { &hf_dplay_type_29_magic_16_bytes,
1396         { "DirectPlay message type 0x0029 magic 16 bytes", "dplay.type_29.magic_16_bytes", FT_BYTES, BASE_HEX,
1397         NULL, 0x0, "", HFILL}},
1398     { &hf_dplay_type_29_dpid_1,
1399         { "DirectPlay message type 0x0029 DPID", "dplay.type_29.dpid", FT_BYTES, BASE_HEX,
1400         NULL, 0x0, "", HFILL}},
1401     { &hf_dplay_type_29_unknown_3,
1402         { "DirectPlay message type 0x0029 unknown 3", "dplay.type_29.unknown_3", FT_BYTES, BASE_HEX,
1403         NULL, 0x0, "", HFILL}},
1404     { &hf_dplay_type_29_game_name,
1405         { "DirectPlay message type 0x0029 game name", "dplay.type_29.game_name", FT_STRING, BASE_NONE,
1406         NULL, 0x0, "", HFILL}},
1407     { &hf_dplay_type_29_unknown_uint32_10,
1408         { "DirectPlay message type 0x0029 unknown uint32 10", "dplay.type_29.unknown_uint32_10", FT_UINT32,
1409         BASE_DEC, NULL, 0x0, "", HFILL}},
1410     { &hf_dplay_type_29_unknown_uint32_11,
1411         { "DirectPlay message type 0x0029 unknown uint32 11", "dplay.type_29.unknown_uint32_11", FT_UINT32,
1412         BASE_DEC, NULL, 0x0, "", HFILL}},
1413     { &hf_dplay_type_29_dpid_2,
1414         { "DirectPlay message type 0x0029 DPID", "dplay.type_29.dpid", FT_BYTES, BASE_HEX,
1415         NULL, 0x0, "", HFILL}},
1416     { &hf_dplay_type_29_unknown_uint32_12,
1417         { "DirectPlay message type 0x0029 unknown uint32 12 (4)", "dplay.type_29.unknown_uint32_12", FT_UINT32,
1418         BASE_DEC, NULL, 0x0, "", HFILL}},
1419     { &hf_dplay_type_29_unknown_uint32_13,
1420         { "DirectPlay message type 0x0029 unknown uint32 13 (14)", "dplay.type_29.unknown_uint32_13", FT_UINT32,
1421         BASE_DEC, NULL, 0x0, "", HFILL}},
1422     { &hf_dplay_type_29_saddr_field_len_1,
1423         { "DirectPlay message type 0x0029 saddr field len 1", "dplay.type_29.saddr_field_len_1", FT_UINT8,
1424         BASE_DEC, NULL, 0x0, "", HFILL}},
1425     { &hf_dplay_type_29_saddr_af_1,
1426         { "DirectPlay message type 0x0029 s_addr_in address family 1", "dplay.type_29.saddr.af_1", FT_UINT16,
1427             BASE_DEC, VALS(dplay_af_val), 0x0, "", HFILL}},
1428     { &hf_dplay_type_29_saddr_port_1,
1429         { "DirectPlay message type 0x0029 s_addr_in port 1", "dplay.type_29.saddr.port_1", FT_UINT16, BASE_DEC,
1430         NULL, 0x0, "", HFILL}},
1431     { &hf_dplay_type_29_saddr_ip_1,
1432         { "DirectPlay message type 0x0029 s_addr_in ip 1", "dplay.type_29.saddr.ip_1", FT_IPv4, BASE_NONE,
1433         NULL, 0x0, "", HFILL}},
1434     { &hf_dplay_type_29_saddr_padd_1,
1435         { "DirectPlay message type 0x0029 s_addr_in padding 1", "dplay.type_29.saddr.padd_1", FT_BYTES, BASE_HEX,
1436         NULL, 0x0, "", HFILL}},
1437     { &hf_dplay_type_29_saddr_af_2,
1438         { "DirectPlay message type 0x0029 s_addr_in address family 2", "dplay.type_29.saddr.af_2", FT_UINT16,
1439             BASE_DEC, VALS(dplay_af_val), 0x0, "", HFILL}},
1440     { &hf_dplay_type_29_saddr_port_2,
1441         { "DirectPlay message type 0x0029 s_addr_in port 2", "dplay.type_29.saddr.port_2", FT_UINT16, BASE_DEC,
1442         NULL, 0x0, "", HFILL}},
1443     { &hf_dplay_type_29_saddr_ip_2,
1444         { "DirectPlay message type 0x0029 s_addr_in ip 2", "dplay.type_29.saddr.ip_2", FT_IPv4, BASE_NONE,
1445         NULL, 0x0, "", HFILL}},
1446     { &hf_dplay_type_29_saddr_padd_2,
1447         { "DirectPlay message type 0x0029 s_addr_in padding 2", "dplay.type_29.saddr.padd_2", FT_BYTES, BASE_HEX,
1448         NULL, 0x0, "", HFILL}},
1449     { &hf_dplay_type_29_unknown_uint32_14,
1450         { "DirectPlay message type 0x0029 unknown uint32 14 (16)", "dplay.type_29.unknown_uint32_14", FT_UINT32,
1451         BASE_DEC, NULL, 0x0, "", HFILL}},
1452     { &hf_dplay_type_29_unknown_uint32_15,
1453         { "DirectPlay message type 0x0029 unknown uint32 15 (15)", "dplay.type_29.unknown_uint32_15", FT_UINT32,
1454         BASE_DEC, NULL, 0x0, "", HFILL}},
1455     { &hf_dplay_type_29_dpid_3,
1456         { "DirectPlay message type 0x0029 DPID", "dplay.type_29.dpid", FT_BYTES, BASE_HEX,
1457         NULL, 0x0, "", HFILL}},
1458     { &hf_dplay_type_29_unknown_uint32_16,
1459         { "DirectPlay message type 0x0029 unknown uint32 16 (4)", "dplay.type_29.unknown_uint32_16", FT_UINT32,
1460         BASE_DEC, NULL, 0x0, "", HFILL}},
1461     { &hf_dplay_type_29_unknown_uint32_17,
1462         { "DirectPlay message type 0x0029 unknown uint32 17 (14)", "dplay.type_29.unknown_uint32_17", FT_UINT32,
1463         BASE_DEC, NULL, 0x0, "", HFILL}},
1464     { &hf_dplay_type_29_saddr_field_len_2,
1465         { "DirectPlay message type 0x0029 saddr field len 2", "dplay.type_29.saddr_field_len_2", FT_UINT8,
1466         BASE_DEC, NULL, 0x0, "", HFILL}},
1467     { &hf_dplay_type_29_saddr_af_3,
1468         { "DirectPlay message type 0x0029 s_addr_in address family 3", "dplay.type_29.saddr.af_3", FT_UINT16,
1469             BASE_DEC, VALS(dplay_af_val), 0x0, "", HFILL}},
1470     { &hf_dplay_type_29_saddr_port_3,
1471         { "DirectPlay message type 0x0029 s_addr_in port 3", "dplay.type_29.saddr.port_3", FT_UINT16, BASE_DEC,
1472         NULL, 0x0, "", HFILL}},
1473     { &hf_dplay_type_29_saddr_ip_3,
1474         { "DirectPlay message type 0x0029 s_addr_in ip 3", "dplay.type_29.saddr.ip_3", FT_IPv4, BASE_NONE,
1475         NULL, 0x0, "", HFILL}},
1476     { &hf_dplay_type_29_saddr_padd_3,
1477         { "DirectPlay message type 0x0029 s_addr_in padding 3", "dplay.type_29.saddr.padd_3", FT_BYTES, BASE_HEX,
1478         NULL, 0x0, "", HFILL}},
1479     { &hf_dplay_type_29_saddr_af_4,
1480         { "DirectPlay message type 0x0029 s_addr_in address family 4", "dplay.type_29.saddr.af_4", FT_UINT16,
1481             BASE_DEC, VALS(dplay_af_val), 0x0, "", HFILL}},
1482     { &hf_dplay_type_29_saddr_port_4,
1483         { "DirectPlay message type 0x0029 s_addr_in port 4", "dplay.type_29.saddr.port_4", FT_UINT16, BASE_DEC,
1484         NULL, 0x0, "", HFILL}},
1485     { &hf_dplay_type_29_saddr_ip_4,
1486         { "DirectPlay message type 0x0029 s_addr_in ip 4", "dplay.type_29.saddr.ip42", FT_IPv4, BASE_NONE,
1487         NULL, 0x0, "", HFILL}},
1488     { &hf_dplay_type_29_saddr_padd_4,
1489         { "DirectPlay message type 0x0029 s_addr_in padding 4", "dplay.type_29.saddr.padd_4", FT_BYTES, BASE_HEX,
1490         NULL, 0x0, "", HFILL}},
1491     { &hf_dplay_type_29_unknown_uint32_18,
1492         { "DirectPlay message type 0x0029 unknown uint32 18 (16)", "dplay.type_29.unknown_uint32_18", FT_UINT32,
1493         BASE_DEC, NULL, 0x0, "", HFILL}},
1494     { &hf_dplay_type_29_unknown_uint32_19,
1495         { "DirectPlay message type 0x0029 unknown uint32 19 (15)", "dplay.type_29.unknown_uint32_19", FT_UINT32,
1496         BASE_DEC, NULL, 0x0, "", HFILL}},
1497     { &hf_dplay_type_29_dpid_4,
1498         { "DirectPlay message type 0x0029 DPID", "dplay.type_29.dpid_4", FT_BYTES, BASE_HEX,
1499         NULL, 0x0, "", HFILL}},
1500     { &hf_dplay_type_29_unknown_uint32_20,
1501         { "DirectPlay message type 0x0029 unknown uint32 20", "dplay.type_29.unknown_uint32_20", FT_UINT32,
1502         BASE_DEC, NULL, 0x0, "", HFILL}},
1503     { &hf_dplay_type_29_dpid_5,
1504         { "DirectPlay message type 0x0029 DPID", "dplay.type_29.dpid_5", FT_BYTES, BASE_HEX,
1505         NULL, 0x0, "", HFILL}},
1506
1507     /* Data fields for message type 0x002e */
1508     { &hf_dplay_type_2e_padding_1,
1509         { "DirectPlay message type 0x002e padding 1", "dplay.type_2e.padding_1", FT_BYTES, BASE_HEX,
1510         NULL, 0x0, "", HFILL}},
1511     { &hf_dplay_type_2e_dpid_1,
1512         { "DirectPlay message type 0x002e client DP ID", "dplay.type_2e.dpid_1", FT_BYTES, BASE_HEX,
1513         NULL, 0x0, "", HFILL}},
1514     { &hf_dplay_type_2e_unknown_1,
1515         { "DirectPlay message type 0x002e unknown 1", "dplay.type_2e.unknown_1", FT_BYTES, BASE_HEX,
1516         NULL, 0x0, "", HFILL}},
1517     { &hf_dplay_type_2e_dpid_2,
1518         { "DirectPlay message type 0x002e client DP ID", "dplay.type_2e.dpid_2", FT_BYTES, BASE_HEX,
1519         NULL, 0x0, "", HFILL}},
1520     { &hf_dplay_type_2e_string_1_len,
1521         { "DirectPlay message type 0x002e string 1 length", "dplay.type_2e.string_1.length", FT_UINT32,
1522         BASE_DEC, NULL, 0x0, "", HFILL}},
1523     { &hf_dplay_type_2e_string_2_len,
1524         { "DirectPlay message type 0x002e string 2 length", "dplay.type_2e.string_2.length", FT_UINT32,
1525         BASE_DEC, NULL, 0x0, "", HFILL}},
1526     { &hf_dplay_type_2e_unknown_2,
1527         { "DirectPlay message type 0x002e unknown 2", "dplay.type_2e.unknown_2", FT_BYTES, BASE_HEX,
1528         NULL, 0x0, "", HFILL}},
1529     { &hf_dplay_type_2e_dpid_3,
1530         { "DirectPlay message type 0x002e client DP ID", "dplay.type_2e.dpid_3", FT_BYTES, BASE_HEX,
1531         NULL, 0x0, "", HFILL}},
1532     { &hf_dplay_type_2e_unknown_3,
1533         { "DirectPlay message type 0x002e unknown 3", "dplay.type_2e.unknown_3", FT_BYTES, BASE_HEX,
1534         NULL, 0x0, "", HFILL}},
1535     { &hf_dplay_type_2e_string_1,
1536         { "DirectPlay message type 0x002e string 1", "dplay.type_2e.string_1", FT_STRING, BASE_NONE,
1537         NULL, 0x0, "", HFILL}},
1538     { &hf_dplay_type_2e_string_2,
1539         { "DirectPlay message type 0x002e string 2", "dplay.type_2e.string_2", FT_STRING, BASE_NONE,
1540         NULL, 0x0, "", HFILL}},
1541     { &hf_dplay_type_2e_saddr_af_1,
1542         { "DirectPlay message type 0x002e s_addr_in address family 1", "dplay.type_2e.saddr.af_1", FT_UINT16,
1543             BASE_DEC, VALS(dplay_af_val), 0x0, "", HFILL}},
1544     { &hf_dplay_type_2e_saddr_port_1,
1545         { "DirectPlay message type 0x002e s_addr_in port 1", "dplay.type_2e.saddr.port_1", FT_UINT16, BASE_DEC,
1546         NULL, 0x0, "", HFILL}},
1547     { &hf_dplay_type_2e_saddr_ip_1,
1548         { "DirectPlay message type 0x002e s_addr_in ip 1", "dplay.type_2e.saddr.ip_1", FT_IPv4, BASE_NONE,
1549         NULL, 0x0, "", HFILL}},
1550     { &hf_dplay_type_2e_saddr_padd_1,
1551         { "DirectPlay message type 0x002e s_addr_in padding 1", "dplay.type_2e.saddr.padd_1", FT_BYTES, BASE_HEX,
1552         NULL, 0x0, "", HFILL}},
1553     { &hf_dplay_type_2e_saddr_af_2,
1554         { "DirectPlay message type 0x002e s_addr_in address family 2", "dplay.type_2e.saddr.af_2", FT_UINT16,
1555             BASE_DEC, VALS(dplay_af_val), 0x0, "", HFILL}},
1556     { &hf_dplay_type_2e_saddr_port_2,
1557         { "DirectPlay message type 0x002e s_addr_in port 2", "dplay.type_2e.saddr.port_2", FT_UINT16, BASE_DEC,
1558         NULL, 0x0, "", HFILL}},
1559     { &hf_dplay_type_2e_saddr_ip_2,
1560         { "DirectPlay message type 0x002e s_addr_in ip 2", "dplay.type_2e.saddr.ip_2", FT_IPv4, BASE_NONE,
1561         NULL, 0x0, "", HFILL}},
1562     { &hf_dplay_type_2e_saddr_padd_2,
1563         { "DirectPlay message type 0x002e s_addr_in padding 2", "dplay.type_2e.saddr.padd_2", FT_BYTES, BASE_HEX,
1564         NULL, 0x0, "", HFILL}},
1565
1566     /* Data fields for message type 0x002f */
1567     { &hf_dplay_type_2f_dpid,
1568         { "DirectPlay message type 0x002f DP ID", "dplay.type_29.dpid", FT_BYTES, BASE_HEX,
1569         NULL, 0x0, "", HFILL}},
1570
1571     /* Data fields for message type 0x0038 */
1572     { &hf_dplay_type_38_padding_1,
1573         { "DirectPlay message type 0x0038 padding 1", "dplay.type_38.padding_1", FT_BYTES, BASE_HEX,
1574         NULL, 0x0, "", HFILL}},
1575     { &hf_dplay_type_38_dpid_1,
1576         { "DirectPlay message type 0x0038 client DP ID", "dplay.type_38.dpid_1", FT_BYTES, BASE_HEX,
1577         NULL, 0x0, "", HFILL}},
1578     { &hf_dplay_type_38_unknown_1,
1579         { "DirectPlay message type 0x0038 unknown 1", "dplay.type_38.unknown_1", FT_BYTES, BASE_HEX,
1580         NULL, 0x0, "", HFILL}},
1581     { &hf_dplay_type_38_dpid_2,
1582         { "DirectPlay message type 0x0038 client DP ID", "dplay.type_38.dpid_2", FT_BYTES, BASE_HEX,
1583         NULL, 0x0, "", HFILL}},
1584     { &hf_dplay_type_38_string_1_len,
1585         { "DirectPlay message type 0x0038 string 1 length", "dplay.type_38.string_1.length", FT_UINT32,
1586         BASE_DEC, NULL, 0x0, "", HFILL}},
1587     { &hf_dplay_type_38_string_2_len,
1588         { "DirectPlay message type 0x0038 string 2 length", "dplay.type_38.string_2.length", FT_UINT32,
1589         BASE_DEC, NULL, 0x0, "", HFILL}},
1590     { &hf_dplay_type_38_unknown_2,
1591         { "DirectPlay message type 0x0038 unknown 2", "dplay.type_38.unknown_2", FT_BYTES, BASE_HEX,
1592         NULL, 0x0, "", HFILL}},
1593     { &hf_dplay_type_38_dpid_3,
1594         { "DirectPlay message type 0x0038 client DP ID", "dplay.type_38.dpid_3", FT_BYTES, BASE_HEX,
1595         NULL, 0x0, "", HFILL}},
1596     { &hf_dplay_type_38_unknown_3,
1597         { "DirectPlay message type 0x0038 unknown 3", "dplay.type_38.unknown_3", FT_BYTES, BASE_HEX,
1598         NULL, 0x0, "", HFILL}},
1599     { &hf_dplay_type_38_string_1,
1600         { "DirectPlay message type 0x0038 string 1", "dplay.type_38.string_1", FT_STRING, BASE_NONE,
1601         NULL, 0x0, "", HFILL}},
1602     { &hf_dplay_type_38_string_2,
1603         { "DirectPlay message type 0x0038 string 2", "dplay.type_38.string_2", FT_STRING, BASE_NONE,
1604         NULL, 0x0, "", HFILL}},
1605     { &hf_dplay_type_38_saddr_af_1,
1606         { "DirectPlay message type 0x0038 s_addr_in address family 1", "dplay.type_38.saddr.af_1", FT_UINT16,
1607             BASE_DEC, VALS(dplay_af_val), 0x0, "", HFILL}},
1608     { &hf_dplay_type_38_saddr_port_1,
1609         { "DirectPlay message type 0x0038 s_addr_in port 1", "dplay.type_38.saddr.port_1", FT_UINT16, BASE_DEC,
1610         NULL, 0x0, "", HFILL}},
1611     { &hf_dplay_type_38_saddr_ip_1,
1612         { "DirectPlay message type 0x0038 s_addr_in ip 1", "dplay.type_38.saddr.ip_1", FT_IPv4, BASE_NONE,
1613         NULL, 0x0, "", HFILL}},
1614     { &hf_dplay_type_38_saddr_padd_1,
1615         { "DirectPlay message type 0x0038 s_addr_in padding 1", "dplay.type_38.saddr.padd_1", FT_BYTES, BASE_HEX,
1616         NULL, 0x0, "", HFILL}},
1617     { &hf_dplay_type_38_saddr_af_2,
1618         { "DirectPlay message type 0x0038 s_addr_in address family 2", "dplay.type_38.saddr.af_2", FT_UINT16,
1619             BASE_DEC, VALS(dplay_af_val), 0x0, "", HFILL}},
1620     { &hf_dplay_type_38_saddr_port_2,
1621         { "DirectPlay message type 0x0038 s_addr_in port 2", "dplay.type_38.saddr.port_2", FT_UINT16, BASE_DEC,
1622         NULL, 0x0, "", HFILL}},
1623     { &hf_dplay_type_38_saddr_ip_2,
1624         { "DirectPlay message type 0x0038 s_addr_in ip 2", "dplay.type_38.saddr.ip_2", FT_IPv4, BASE_NONE,
1625         NULL, 0x0, "", HFILL}},
1626     { &hf_dplay_type_38_saddr_padd_2,
1627         { "DirectPlay message type 0x0038 s_addr_in padding 2", "dplay.type_38.saddr.padd_2", FT_BYTES, BASE_HEX,
1628         NULL, 0x0, "", HFILL}},
1629     };
1630
1631     static gint *ett[] = {
1632         &ett_dplay,
1633         &ett_dplay_header,
1634         &ett_dplay_data,
1635         &ett_dplay_flags,
1636         &ett_dplay_enc_packet,
1637         &ett_dplay_type08_saddr1,
1638         &ett_dplay_type08_saddr2,
1639         &ett_dplay_type13_saddr1,
1640         &ett_dplay_type13_saddr2,
1641         &ett_dplay_type29_saddr1,
1642         &ett_dplay_type29_saddr2,
1643         &ett_dplay_type29_saddr3,
1644         &ett_dplay_type29_saddr4,
1645         &ett_dplay_type2e_saddr1,
1646         &ett_dplay_type2e_saddr2,
1647         &ett_dplay_type38_saddr1,
1648         &ett_dplay_type38_saddr2,
1649     };
1650     module_t *dplay_module;
1651
1652     if(proto_dplay == -1)
1653     {
1654         proto_dplay = proto_register_protocol (
1655                 "DirectPlay Protocol",
1656                 "DPLAY",
1657                 "dplay"
1658                 );
1659         proto_register_field_array(proto_dplay, hf, array_length(hf));
1660         proto_register_subtree_array(ett, array_length(ett));
1661         dplay_module = prefs_register_protocol(proto_dplay, proto_reg_handoff_dplay);
1662     }
1663 }
1664
1665 void proto_reg_handoff_dplay(void)
1666 {
1667     static int initialized = FALSE;
1668
1669     if(!initialized)
1670     {
1671         initialized = TRUE;
1672         heur_dissector_add("udp", heur_dissect_dplay, proto_dplay);
1673         heur_dissector_add("tcp", heur_dissect_dplay, proto_dplay);
1674         dplay_handle = create_dissector_handle(dissect_dplay, proto_dplay);
1675     }
1676 }
1677