From Chris Waters: export "find_dissector_table()" and add
[metze/wireshark/wip.git] / packet-dcerpc-srvsvc.c
1 /* packet-dcerpc-srvsvc.c
2  * Routines for SMB \\PIPE\\srvsvc packet disassembly
3  * Copyright 2001-2002, Tim Potter <tpot@samba.org>
4  * Copyright 2002, Richard Sharpe <rsharpe@ns.aus.com>
5  *   decode srvsvc calls where Samba knows them ...
6  * Copyright 2002, Ronnie Sahlberg
7  *   rewrote entire dissector
8  *
9  * 2002, some share information levels implemented based on samba
10  * sources.
11  *
12  *
13  * $Id: packet-dcerpc-srvsvc.c,v 1.44 2002/09/05 00:17:05 tpot Exp $
14  *
15  * Ethereal - Network traffic analyzer
16  * By Gerald Combs <gerald@ethereal.com>
17  * Copyright 1998 Gerald Combs
18  *
19  * This program is free software; you can redistribute it and/or
20  * modify it under the terms of the GNU General Public License
21  * as published by the Free Software Foundation; either version 2
22  * of the License, or (at your option) any later version.
23  *
24  * This program is distributed in the hope that it will be useful,
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27  * GNU General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License
30  * along with this program; if not, write to the Free Software
31  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
32  */
33
34 /* The IDL file for this interface can be extracted by grepping for IDL */
35
36
37 #ifdef HAVE_CONFIG_H
38 #include "config.h"
39 #endif
40
41 #include <glib.h>
42 #include <epan/packet.h>
43 #include "packet-dcerpc.h"
44 #include "packet-dcerpc-srvsvc.h"
45 #include "packet-dcerpc-lsa.h"
46 #include "packet-dcerpc-nt.h"
47 #include "packet-smb-common.h"
48 #include "smb.h"
49
50 static int proto_dcerpc_srvsvc = -1;
51 static int hf_srvsvc_opnum = -1;
52 static int hf_srvsvc_reserved = -1;
53 static int hf_srvsvc_server = -1;
54 static int hf_srvsvc_emulated_server = -1;
55 static int hf_srvsvc_alerts = -1;
56 static int hf_srvsvc_guest = -1;
57 static int hf_srvsvc_transport = -1;
58 static int hf_srvsvc_session = -1;
59 static int hf_srvsvc_session_num_opens = -1;
60 static int hf_srvsvc_session_time = -1;
61 static int hf_srvsvc_session_idle_time = -1;
62 static int hf_srvsvc_session_user_flags = -1;
63 static int hf_srvsvc_qualifier = -1;
64 static int hf_srvsvc_computer = -1;
65 static int hf_srvsvc_user = -1;
66 static int hf_srvsvc_path = -1;
67 static int hf_srvsvc_share_passwd = -1;
68 static int hf_srvsvc_share_alternate_name = -1;
69 static int hf_srvsvc_file_id = -1;
70 static int hf_srvsvc_perm = -1;
71 static int hf_srvsvc_policy = -1;
72 static int hf_srvsvc_file_num_locks = -1;
73 static int hf_srvsvc_con_id = -1;
74 static int hf_srvsvc_max_uses = -1;
75 static int hf_srvsvc_cur_uses = -1;
76 static int hf_srvsvc_con_time = -1;
77 static int hf_srvsvc_con_type = -1;
78 static int hf_srvsvc_con_num_opens = -1;
79 static int hf_srvsvc_chrqpri = -1;
80 static int hf_srvsvc_chrqnumusers = -1;
81 static int hf_srvsvc_chrqnumahead = -1;
82 static int hf_srvsvc_chrdev = -1;
83 static int hf_srvsvc_chrdevq = -1;
84 static int hf_srvsvc_chrdev_time = -1;
85 static int hf_srvsvc_chrdev_status = -1;
86 static int hf_srvsvc_chrdev_opcode = -1;
87 static int hf_srvsvc_info_level = -1;
88 static int hf_srvsvc_rc = -1;
89 static int hf_srvsvc_platform_id = -1;
90 static int hf_srvsvc_ver_major = -1;
91 static int hf_srvsvc_ver_minor = -1;
92 static int hf_srvsvc_server_type = -1;
93 static int hf_srvsvc_client_type = -1;
94 static int hf_srvsvc_comment = -1;
95 static int hf_srvsvc_users = -1;
96 static int hf_srvsvc_disc = -1;
97 static int hf_srvsvc_hidden = -1;
98 static int hf_srvsvc_announce = -1;
99 static int hf_srvsvc_anndelta = -1;
100 static int hf_srvsvc_licences = -1;
101 static int hf_srvsvc_user_path = -1;
102 static int hf_srvsvc_share = -1;
103 static int hf_srvsvc_share_type = -1;
104 static int hf_srvsvc_num_entries = -1;
105 static int hf_srvsvc_preferred_len = -1;
106 static int hf_srvsvc_parm_error = -1;
107 static int hf_srvsvc_enum_handle = -1;
108 static int hf_srvsvc_ulist_mtime = -1;
109 static int hf_srvsvc_glist_mtime = -1;
110 static int hf_srvsvc_alist_mtime = -1;
111 static int hf_srvsvc_security = -1;
112 static int hf_srvsvc_dfs_root_flags = -1;
113 static int hf_srvsvc_numadmin = -1;
114 static int hf_srvsvc_lanmask = -1;
115 static int hf_srvsvc_chdevs = -1;
116 static int hf_srvsvc_chdevqs = -1;
117 static int hf_srvsvc_chdevjobs = -1;
118 static int hf_srvsvc_connections = -1;
119 static int hf_srvsvc_shares = -1;
120 static int hf_srvsvc_openfiles = -1;
121 static int hf_srvsvc_sessopens = -1;
122 static int hf_srvsvc_sessvcs = -1;
123 static int hf_srvsvc_sessreqs = -1;
124 static int hf_srvsvc_opensearch = -1;
125 static int hf_srvsvc_activelocks = -1;
126 static int hf_srvsvc_sizreqbufs = -1;
127 static int hf_srvsvc_numbigbufs = -1;
128 static int hf_srvsvc_numfiletasks = -1;
129 static int hf_srvsvc_alertsched = -1;
130 static int hf_srvsvc_erroralert = -1;
131 static int hf_srvsvc_logonalert = -1;
132 static int hf_srvsvc_accessalert = -1;
133 static int hf_srvsvc_diskalert = -1;
134 static int hf_srvsvc_netioalert = -1;
135 static int hf_srvsvc_maxauditsz = -1;
136 static int hf_srvsvc_srvheuristics = -1;
137 static int hf_srvsvc_auditedevents = -1;
138 static int hf_srvsvc_auditprofile = -1;
139 static int hf_srvsvc_autopath = -1;
140 static int hf_srvsvc_initworkitems = -1;
141 static int hf_srvsvc_maxworkitems = -1;
142 static int hf_srvsvc_rawworkitems = -1;
143 static int hf_srvsvc_irpstacksize = -1;
144 static int hf_srvsvc_maxrawbuflen = -1;
145 static int hf_srvsvc_maxpagedmemoryusage = -1;
146 static int hf_srvsvc_maxnonpagedmemoryusage = -1;
147 static int hf_srvsvc_enablesoftcompat = -1;
148 static int hf_srvsvc_enableforcedlogoff = -1;
149 static int hf_srvsvc_timesource = -1;
150 static int hf_srvsvc_acceptdownlevelapis = -1;
151 static int hf_srvsvc_lmannounce = -1;
152 static int hf_srvsvc_domain = -1;
153 static int hf_srvsvc_maxcopyreadlen = -1;
154 static int hf_srvsvc_maxcopywritelen = -1;
155 static int hf_srvsvc_minkeepsearch = -1;
156 static int hf_srvsvc_maxkeepsearch = -1;
157 static int hf_srvsvc_minkeepcomplsearch = -1;
158 static int hf_srvsvc_maxkeepcomplsearch = -1;
159 static int hf_srvsvc_threadcountadd = -1;
160 static int hf_srvsvc_numblockthreads = -1;
161 static int hf_srvsvc_scavtimeout = -1;
162 static int hf_srvsvc_minrcvqueue = -1;
163 static int hf_srvsvc_minfreeworkitems = -1;
164 static int hf_srvsvc_xactmemsize = -1;
165 static int hf_srvsvc_threadpriority = -1;
166 static int hf_srvsvc_maxmpxct = -1;
167 static int hf_srvsvc_oplockbreakwait = -1;
168 static int hf_srvsvc_oplockbreakresponsewait = -1;
169 static int hf_srvsvc_enableoplocks = -1;
170 static int hf_srvsvc_enableoplockforceclose = -1;
171 static int hf_srvsvc_enablefcbopens = -1;
172 static int hf_srvsvc_enableraw = -1;
173 static int hf_srvsvc_enablesharednetdrives = -1;
174 static int hf_srvsvc_minfreeconnections = -1;
175 static int hf_srvsvc_maxfreeconnections = -1;
176 static int hf_srvsvc_initsesstable = -1;
177 static int hf_srvsvc_initconntable = -1;
178 static int hf_srvsvc_initfiletable = -1;
179 static int hf_srvsvc_initsearchtable = -1;
180 static int hf_srvsvc_errortreshold = -1;
181 static int hf_srvsvc_networkerrortreshold = -1;
182 static int hf_srvsvc_diskspacetreshold = -1;
183 static int hf_srvsvc_maxlinkdelay = -1;
184 static int hf_srvsvc_minlinkthroughput = -1;
185 static int hf_srvsvc_linkinfovalidtime = -1;
186 static int hf_srvsvc_scavqosinfoupdatetime = -1;
187 static int hf_srvsvc_maxworkitemidletime = -1;
188 static int hf_srvsvc_disk_name = -1;
189 static int hf_srvsvc_disk_name_len = -1;
190 static int hf_srvsvc_service = -1;
191 static int hf_srvsvc_service_options = -1;
192 static int hf_srvsvc_transport_numberofvcs = -1;
193 static int hf_srvsvc_transport_name = -1;
194 static int hf_srvsvc_transport_address = -1;
195 static int hf_srvsvc_transport_address_len = -1;
196 static int hf_srvsvc_transport_networkaddress = -1;
197 static int hf_srvsvc_service_bits = -1;
198 static int hf_srvsvc_service_bits_of_interest = -1;
199 static int hf_srvsvc_update_immediately = -1;
200 static int hf_srvsvc_path_flags = -1;
201 static int hf_srvsvc_share_flags = -1;
202 static int hf_srvsvc_path_type = -1;
203 static int hf_srvsvc_outbuflen = -1;
204 static int hf_srvsvc_prefix = -1;
205 static int hf_srvsvc_hnd = -1;
206 static int hf_srvsvc_server_stat_start = -1;
207 static int hf_srvsvc_server_stat_fopens = -1;
208 static int hf_srvsvc_server_stat_devopens = -1;
209 static int hf_srvsvc_server_stat_jobsqueued = -1;
210 static int hf_srvsvc_server_stat_sopens = -1;
211 static int hf_srvsvc_server_stat_stimeouts = -1;
212 static int hf_srvsvc_server_stat_serrorout = -1;
213 static int hf_srvsvc_server_stat_pwerrors = -1;
214 static int hf_srvsvc_server_stat_permerrors = -1;
215 static int hf_srvsvc_server_stat_syserrors = -1;
216 static int hf_srvsvc_server_stat_bytessent = -1;
217 static int hf_srvsvc_server_stat_bytesrcvd = -1;
218 static int hf_srvsvc_server_stat_avresponse = -1;
219 static int hf_srvsvc_server_stat_reqbufneed = -1;
220 static int hf_srvsvc_server_stat_bigbufneed = -1;
221 static int hf_srvsvc_tod_elapsed = -1;
222 static int hf_srvsvc_tod_msecs = -1;
223 static int hf_srvsvc_tod_hours = -1;
224 static int hf_srvsvc_tod_mins = -1;
225 static int hf_srvsvc_tod_secs = -1;
226 static int hf_srvsvc_tod_hunds = -1;
227 static int hf_srvsvc_tod_timezone = -1;
228 static int hf_srvsvc_tod_tinterval = -1;
229 static int hf_srvsvc_tod_day = -1;
230 static int hf_srvsvc_tod_month = -1;
231 static int hf_srvsvc_tod_year = -1;
232 static int hf_srvsvc_tod_weekday = -1;
233 static int hf_srvsvc_path_len = -1;
234
235 static gint ett_dcerpc_srvsvc = -1;
236 static gint ett_srvsvc_share_info_1 = -1;
237 static gint ett_srvsvc_share_info_2 = -1;
238 static gint ett_srvsvc_share_info_501 = -1;
239 static gint ett_srvsvc_share_info_502 = -1;
240
241
242
243 /*
244  IDL [ uuid(4b324fc8-1670-01d3-1278-5a47bf6ee188),
245  IDL   version(3.0),
246  IDL   implicit_handle(handle_t rpc_binding)
247  IDL ] interface srvsvc
248  IDL {
249 */
250 static e_uuid_t uuid_dcerpc_srvsvc = {
251         0x4b324fc8, 0x1670, 0x01d3,
252         { 0x12, 0x78, 0x5a, 0x47, 0xbf, 0x6e, 0xe1, 0x88 }
253 };
254
255 static guint16 ver_dcerpc_srvsvc = 3;
256
257 static int
258 srvsvc_dissect_pointer_long(tvbuff_t *tvb, int offset,
259                              packet_info *pinfo, proto_tree *tree,
260                              char *drep)
261 {
262         dcerpc_info *di;
263
264         di=pinfo->private_data;
265         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
266                                      di->hf_index, NULL);
267         return offset;
268 }
269
270 static int
271 srvsvc_dissect_ENUM_HANDLE(tvbuff_t *tvb, int offset,
272                            packet_info *pinfo, proto_tree *tree,
273                            char *drep)
274 {
275
276   offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
277                               hf_srvsvc_enum_handle, 0);
278   return offset;
279
280 }
281
282 static int
283 srvsvc_dissect_pointer_UNICODE_STRING(tvbuff_t *tvb, int offset,
284                                       packet_info *pinfo, proto_tree *tree,
285                                       char *drep)
286 {
287         dcerpc_info *di;
288
289         di=pinfo->private_data;
290         if(di->conformant_run){
291                 /*just a run to handle conformant arrays, nothing to dissect */
292                 return offset;
293         }
294
295         offset = dissect_ndr_nt_UNICODE_STRING_str(tvb, offset, pinfo, tree,
296                                                    drep);
297         return offset;
298 }
299
300
301
302
303
304 /*
305  * IDL typedef struct {
306  * IDL   [string] [unique] wchar_t *dev;
307  * IDL } CHARDEV_INFO_0;
308  */
309 static int
310 srvsvc_dissect_CHARDEV_INFO_0(tvbuff_t *tvb, int offset,
311                                      packet_info *pinfo, proto_tree *tree,
312                                      char *drep)
313 {
314         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
315                 srvsvc_dissect_pointer_UNICODE_STRING,
316                 NDR_POINTER_UNIQUE, "Char Device",
317                 hf_srvsvc_chrdev, 0);
318
319         return offset;
320 }
321 static int
322 srvsvc_dissect_CHARDEV_INFO_0_array(tvbuff_t *tvb, int offset,
323                                      packet_info *pinfo, proto_tree *tree,
324                                      char *drep)
325 {
326         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
327                         srvsvc_dissect_CHARDEV_INFO_0);
328
329         return offset;
330 }
331
332 /*
333  * IDL typedef struct {
334  * IDL   long EntriesRead;
335  * IDL   [size_is(EntriesRead)] [unique] CHARDEV_INFO_0 *devs;
336  * IDL } CHARDEV_INFO_0_CONTAINER;
337  */
338 static int
339 srvsvc_dissect_CHARDEV_INFO_0_CONTAINER(tvbuff_t *tvb, int offset,
340                                      packet_info *pinfo, proto_tree *tree,
341                                      char *drep)
342 {
343         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
344                 hf_srvsvc_num_entries, NULL);
345
346         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
347                 srvsvc_dissect_CHARDEV_INFO_0_array, NDR_POINTER_UNIQUE,
348                 "CHARDEV_INFO_0 array:", -1, 0);
349
350         return offset;
351 }
352
353 /*
354  * IDL typedef struct {
355  * IDL   [string] [unique] wchar_t *dev;
356  * IDL   long status;
357  * IDL   [string] [unique] wchar_t *user;
358  * IDL   long time;
359  * IDL } CHARDEV_INFO_1;
360  */
361 static int
362 srvsvc_dissect_CHARDEV_INFO_1(tvbuff_t *tvb, int offset,
363                                      packet_info *pinfo, proto_tree *tree,
364                                      char *drep)
365 {
366         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
367                 srvsvc_dissect_pointer_UNICODE_STRING,
368                 NDR_POINTER_UNIQUE, "Char Device",
369                 hf_srvsvc_chrdev, 0);
370
371         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
372                 hf_srvsvc_chrdev_status, 0);
373
374         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
375                 srvsvc_dissect_pointer_UNICODE_STRING,
376                 NDR_POINTER_UNIQUE, "User",
377                 hf_srvsvc_user, 0);
378
379         /* XXX dont know how to decode this time field */
380         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
381                 hf_srvsvc_chrdev_time, 0);
382
383         return offset;
384 }
385 static int
386 srvsvc_dissect_CHARDEV_INFO_1_array(tvbuff_t *tvb, int offset,
387                                      packet_info *pinfo, proto_tree *tree,
388                                      char *drep)
389 {
390         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
391                         srvsvc_dissect_CHARDEV_INFO_1);
392
393         return offset;
394 }
395
396 /*
397  * IDL typedef struct {
398  * IDL   long EntriesRead;
399  * IDL   [size_is(EntriesRead)] [unique] CHARDEV_INFO_1 *devs;
400  * IDL } CHARDEV_INFO_1_CONTAINER;
401  */
402 static int
403 srvsvc_dissect_CHARDEV_INFO_1_CONTAINER(tvbuff_t *tvb, int offset,
404                                      packet_info *pinfo, proto_tree *tree,
405                                      char *drep)
406 {
407         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
408                 hf_srvsvc_num_entries, NULL);
409
410         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
411                 srvsvc_dissect_CHARDEV_INFO_1_array, NDR_POINTER_UNIQUE,
412                 "CHARDEV_INFO_1 array:", -1, 3);
413
414         return offset;
415 }
416
417 /*
418  * IDL typedef [switch_type(long)] union {
419  * IDL   [case(0)] [unique] CHARDEV_INFO_0_CONTAINER *dev0;
420  * IDL   [case(1)] [unique] CHARDEV_INFO_1_CONTAINER *dev1;
421  * IDL } CHARDEV_ENUM_UNION;
422  */
423 static int
424 srvsvc_dissect_CHARDEV_ENUM_UNION(tvbuff_t *tvb, int offset,
425                                      packet_info *pinfo, proto_tree *tree,
426                                      char *drep)
427 {
428         guint32 level;
429
430         ALIGN_TO_4_BYTES;
431
432         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf_srvsvc_info_level, &level);
433
434         switch(level){
435         case 0:
436                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
437                         srvsvc_dissect_CHARDEV_INFO_0_CONTAINER,
438                         NDR_POINTER_UNIQUE, "CHARDEV_INFO_0_CONTAINER:",
439                         -1, 0);
440                 break;
441         case 1:
442                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
443                         srvsvc_dissect_CHARDEV_INFO_1_CONTAINER,
444                         NDR_POINTER_UNIQUE, "CHARDEV_INFO_1_CONTAINER:",
445                         -1, 0);
446                 break;
447         }
448
449         return offset;
450 }
451
452 /*
453  * IDL typedef struct {
454  * IDL   long Level;
455  * IDL   CHARDEV_ENUM_UNION devs;
456  * IDL } CHARDEV_ENUM_STRUCT;
457  */
458 static int
459 srvsvc_dissect_CHARDEV_ENUM_STRUCT(tvbuff_t *tvb, int offset,
460                                      packet_info *pinfo, proto_tree *tree,
461                                      char *drep)
462 {
463         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
464                         hf_srvsvc_info_level, 0);
465
466         offset = srvsvc_dissect_CHARDEV_ENUM_UNION(tvb, offset, pinfo, tree, drep);
467
468         return offset;
469 }
470
471 /*
472  * IDL typedef [switch_type(long)] union {
473  * IDL   [case(0)] [unique] CHARDEV_INFO_0 *dev0;
474  * IDL   [case(1)] [unique] CHARDEV_INFO_1 *dev1;
475  * IDL } CHARDEV_INFO_UNION;
476  */
477 static int
478 srvsvc_dissect_CHARDEV_INFO_UNION(tvbuff_t *tvb, int offset,
479                                      packet_info *pinfo, proto_tree *tree,
480                                      char *drep)
481 {
482         guint32 level;
483
484         ALIGN_TO_4_BYTES;
485
486         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf_srvsvc_info_level, &level);
487
488         switch(level){
489         case 0:
490                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
491                         srvsvc_dissect_CHARDEV_INFO_0,
492                         NDR_POINTER_UNIQUE, "CHARDEV_INFO_0:",
493                         -1, 0);
494                 break;
495         case 1:
496                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
497                         srvsvc_dissect_CHARDEV_INFO_1,
498                         NDR_POINTER_UNIQUE, "CHARDEV_INFO_1:",
499                         -1, 0);
500                 break;
501         }
502
503         return offset;
504 }
505
506 /*
507  * IDL long NetrCharDevEnum(
508  * IDL      [in] [string] [unique] wchar_t *ServerName,
509  * IDL      [in] [out] [ref] CHARDEV_ENUM_STRUCT *devs,
510  * IDL      [in] long PreferredMaximumLength,
511  * IDL      [out] long num_entries,
512  * IDL      [in] [out] [unique] long *ResumeHandle
513  * IDL );
514 */
515 static int
516 srvsvc_dissect_netrchardevenum_rqst(tvbuff_t *tvb, int offset,
517                                      packet_info *pinfo, proto_tree *tree,
518                                      char *drep)
519 {
520         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
521                 srvsvc_dissect_pointer_UNICODE_STRING,
522                 NDR_POINTER_UNIQUE, "Server",
523                 hf_srvsvc_server, 0);
524
525         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
526                 srvsvc_dissect_CHARDEV_ENUM_STRUCT,
527                 NDR_POINTER_REF, "CHARDEV_ENUM_STRUCT",
528                 -1, 0);
529
530         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
531                 hf_srvsvc_preferred_len, 0);
532
533         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
534                 srvsvc_dissect_ENUM_HANDLE,
535                 NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
536
537         return offset;
538 }
539 static int
540 srvsvc_dissect_netrchardevenum_reply(tvbuff_t *tvb, int offset,
541                                      packet_info *pinfo, proto_tree *tree,
542                                      char *drep)
543 {
544         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
545                         srvsvc_dissect_CHARDEV_ENUM_STRUCT,
546                         NDR_POINTER_REF, "CHARDEV_ENUM_STRUCT",
547                         -1, 0);
548
549         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
550                         hf_srvsvc_num_entries, NULL);
551
552         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
553                         srvsvc_dissect_ENUM_HANDLE,
554                         NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
555
556         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
557                         hf_srvsvc_rc, NULL);
558
559         return offset;
560 }
561
562
563 /*
564  * IDL long NetrCharDevGetInfo(
565  * IDL      [in] [string] [unique] wchar_t *ServerName,
566  * IDL      [in] [string] [ref] wchar_t *DevName,
567  * IDL      [in] long Level ,
568  * IDL      [out] [ref] CHARDEV_INFO_STRUCT *dev
569  * IDL );
570 */
571 static int
572 srvsvc_dissect_netrchardevgetinfo_rqst(tvbuff_t *tvb, int offset,
573                                      packet_info *pinfo, proto_tree *tree,
574                                      char *drep)
575 {
576         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
577                 srvsvc_dissect_pointer_UNICODE_STRING,
578                 NDR_POINTER_UNIQUE, "Server",
579                 hf_srvsvc_server, 0);
580
581         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
582                 srvsvc_dissect_pointer_UNICODE_STRING,
583                 NDR_POINTER_REF, "Char Device",
584                 hf_srvsvc_chrdev, 0);
585
586         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
587                         hf_srvsvc_info_level, 0);
588
589         return offset;
590 }
591 static int
592 srvsvc_dissect_netrchardevgetinfo_reply(tvbuff_t *tvb, int offset,
593                                      packet_info *pinfo, proto_tree *tree,
594                                      char *drep)
595 {
596         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
597                         srvsvc_dissect_CHARDEV_INFO_UNION,
598                         NDR_POINTER_REF, "CHARDEV_INFO_UNION", -1, 0);
599
600         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
601                         hf_srvsvc_rc, NULL);
602
603         return offset;
604 }
605
606 /*
607  * IDL long NetrCharDevControl(
608  * IDL      [in] [string] [unique] wchar_t *ServerName,
609  * IDL      [in] [string] [ref] wchar_t *DevName,
610  * IDL      [in] long Opcode
611  * IDL );
612 */
613 static int
614 srvsvc_dissect_netrchardevcontrol_rqst(tvbuff_t *tvb, int offset,
615                                      packet_info *pinfo, proto_tree *tree,
616                                      char *drep)
617 {
618         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
619                 srvsvc_dissect_pointer_UNICODE_STRING,
620                 NDR_POINTER_UNIQUE, "Server",
621                 hf_srvsvc_server, 0);
622
623         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
624                 srvsvc_dissect_pointer_UNICODE_STRING,
625                 NDR_POINTER_REF, "Char Device",
626                 hf_srvsvc_chrdev, 0);
627
628         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
629                         hf_srvsvc_chrdev_opcode, 0);
630
631         return offset;
632 }
633 static int
634 srvsvc_dissect_netrchardevcontrol_reply(tvbuff_t *tvb, int offset,
635                                      packet_info *pinfo, proto_tree *tree,
636                                      char *drep)
637 {
638         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
639                         hf_srvsvc_rc, NULL);
640
641         return offset;
642 }
643
644
645
646 /*
647  * IDL typedef struct {
648  * IDL   [string] [unique] wchar_t *dev;
649  * IDL } CHARDEVQ_INFO_0;
650  */
651 static int
652 srvsvc_dissect_CHARDEVQ_INFO_0(tvbuff_t *tvb, int offset,
653                                      packet_info *pinfo, proto_tree *tree,
654                                      char *drep)
655 {
656         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
657                 srvsvc_dissect_pointer_UNICODE_STRING,
658                 NDR_POINTER_UNIQUE, "Char QDevice",
659                 hf_srvsvc_chrdev, 0);
660
661         return offset;
662 }
663 static int
664 srvsvc_dissect_CHARDEVQ_INFO_0_array(tvbuff_t *tvb, int offset,
665                                      packet_info *pinfo, proto_tree *tree,
666                                      char *drep)
667 {
668         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
669                         srvsvc_dissect_CHARDEVQ_INFO_0);
670
671         return offset;
672 }
673
674 /*
675  * IDL typedef struct {
676  * IDL   long EntriesRead;
677  * IDL   [size_is(EntriesRead)] [unique] CHARDEVQ_INFO_0 *devs;
678  * IDL } CHARDEVQ_INFO_0_CONTAINER;
679  */
680 static int
681 srvsvc_dissect_CHARDEVQ_INFO_0_CONTAINER(tvbuff_t *tvb, int offset,
682                                      packet_info *pinfo, proto_tree *tree,
683                                      char *drep)
684 {
685         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
686                 hf_srvsvc_num_entries, NULL);
687
688         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
689                 srvsvc_dissect_CHARDEVQ_INFO_0_array, NDR_POINTER_UNIQUE,
690                 "CHARDEVQ_INFO_0 array:", -1, 0);
691
692         return offset;
693 }
694
695 /*
696  * IDL typedef struct {
697  * IDL   [string] [unique] wchar_t *dev;
698  * IDL   long priority;
699  * IDL   [string] [unique] wchar_t *devs;
700  * IDL   long users;
701  * IDL   long num_ahead;
702  * IDL } CHARDEVQ_INFO_1;
703  */
704 static int
705 srvsvc_dissect_CHARDEVQ_INFO_1(tvbuff_t *tvb, int offset,
706                                      packet_info *pinfo, proto_tree *tree,
707                                      char *drep)
708 {
709         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
710                 srvsvc_dissect_pointer_UNICODE_STRING,
711                 NDR_POINTER_UNIQUE, "Char Device",
712                 hf_srvsvc_chrdev, 0);
713
714         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
715                 hf_srvsvc_chrqpri, 0);
716
717         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
718                 srvsvc_dissect_pointer_UNICODE_STRING,
719                 NDR_POINTER_UNIQUE, "Char Devices",
720                 hf_srvsvc_chrdevq, 0);
721
722         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
723                 hf_srvsvc_chrqnumusers, 0);
724
725         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
726                 hf_srvsvc_chrqnumahead, 0);
727
728         return offset;
729 }
730 static int
731 srvsvc_dissect_CHARDEVQ_INFO_1_array(tvbuff_t *tvb, int offset,
732                                      packet_info *pinfo, proto_tree *tree,
733                                      char *drep)
734 {
735         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
736                         srvsvc_dissect_CHARDEVQ_INFO_1);
737
738         return offset;
739 }
740
741 /*
742  * IDL typedef struct {
743  * IDL   long EntriesRead;
744  * IDL   [size_is(EntriesRead)] [unique] CHARDEVQ_INFO_1 *devs;
745  * IDL } CHARDEVQ_INFO_1_CONTAINER;
746  */
747 static int
748 srvsvc_dissect_CHARDEVQ_INFO_1_CONTAINER(tvbuff_t *tvb, int offset,
749                                      packet_info *pinfo, proto_tree *tree,
750                                      char *drep)
751 {
752         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
753                 hf_srvsvc_num_entries, NULL);
754
755         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
756                 srvsvc_dissect_CHARDEVQ_INFO_1_array, NDR_POINTER_UNIQUE,
757                 "CHARDEVQ_INFO_1 array:", -1, 3);
758
759         return offset;
760 }
761
762 /*
763  * IDL typedef [switch_type(long)] union {
764  * IDL   [case(0)] [unique] CHARDEVQ_INFO_0_CONTAINER *dev0;
765  * IDL   [case(1)] [unique] CHARDEVQ_INFO_1_CONTAINER *dev1;
766  * IDL } CHARDEVQ_ENUM_UNION;
767  */
768 static int
769 srvsvc_dissect_CHARDEVQ_ENUM_UNION(tvbuff_t *tvb, int offset,
770                                      packet_info *pinfo, proto_tree *tree,
771                                      char *drep)
772 {
773         guint32 level;
774
775         ALIGN_TO_4_BYTES;
776
777         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf_srvsvc_info_level, &level);
778
779         switch(level){
780         case 0:
781                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
782                         srvsvc_dissect_CHARDEVQ_INFO_0_CONTAINER,
783                         NDR_POINTER_UNIQUE, "CHARDEVQ_INFO_0_CONTAINER:",
784                         -1, 0);
785                 break;
786         case 1:
787                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
788                         srvsvc_dissect_CHARDEVQ_INFO_1_CONTAINER,
789                         NDR_POINTER_UNIQUE, "CHARDEVQ_INFO_1_CONTAINER:",
790                         -1, 0);
791                 break;
792         }
793
794         return offset;
795 }
796
797 /*
798  * IDL typedef struct {
799  * IDL   long Level;
800  * IDL   CHARDEVQ_ENUM_UNION devs;
801  * IDL } CHARDEVQ_ENUM_STRUCT;
802  */
803 static int
804 srvsvc_dissect_CHARDEVQ_ENUM_STRUCT(tvbuff_t *tvb, int offset,
805                                      packet_info *pinfo, proto_tree *tree,
806                                      char *drep)
807 {
808         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
809                         hf_srvsvc_info_level, 0);
810
811         offset = srvsvc_dissect_CHARDEVQ_ENUM_UNION(tvb, offset, pinfo, tree, drep);
812
813         return offset;
814 }
815
816 /*
817  * IDL typedef [switch_type(long)] union {
818  * IDL   [case(0)] [unique] CHARDEVQ_INFO_0 *dev0;
819  * IDL   [case(1)] [unique] CHARDEVQ_INFO_1 *dev1;
820  * IDL } CHARDEVQ_INFO;
821  */
822 static int
823 srvsvc_dissect_CHARDEVQ_INFO(tvbuff_t *tvb, int offset,
824                                      packet_info *pinfo, proto_tree *tree,
825                                      char *drep)
826 {
827         guint32 level;
828
829         ALIGN_TO_4_BYTES;
830
831         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf_srvsvc_info_level, &level);
832
833         switch(level){
834         case 0:
835                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
836                         srvsvc_dissect_CHARDEVQ_INFO_0,
837                         NDR_POINTER_UNIQUE, "CHARDEVQ_INFO_0:",
838                         -1, 0);
839                 break;
840         case 1:
841                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
842                         srvsvc_dissect_CHARDEVQ_INFO_1,
843                         NDR_POINTER_UNIQUE, "CHARDEVQ_INFO_1:",
844                         -1, 0);
845                 break;
846         }
847
848         return offset;
849 }
850
851
852 /*
853  * IDL long NetrCharDevQEnum(
854  * IDL      [in] [string] [unique] wchar_t *ServerName,
855  * IDL      [in] [string] [unique] wchar_t *UserName,
856  * IDL      [in] [out] [ref] CHARDEVQ_ENUM_STRUCT *devs,
857  * IDL      [in] long PreferredMaximumLength,
858  * IDL      [out] long num_entries,
859  * IDL      [in] [out] [unique] long *ResumeHandle
860  * IDL );
861 */
862 static int
863 srvsvc_dissect_netrchardevqenum_rqst(tvbuff_t *tvb, int offset,
864                                      packet_info *pinfo, proto_tree *tree,
865                                      char *drep)
866 {
867         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
868                 srvsvc_dissect_pointer_UNICODE_STRING,
869                 NDR_POINTER_UNIQUE, "Server",
870                 hf_srvsvc_server, 0);
871
872         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
873                 srvsvc_dissect_pointer_UNICODE_STRING,
874                 NDR_POINTER_UNIQUE, "User",
875                 hf_srvsvc_user, 0);
876
877         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
878                 srvsvc_dissect_CHARDEVQ_ENUM_STRUCT,
879                 NDR_POINTER_REF, "CHARDEVQ_ENUM_STRUCT",
880                 -1, 0);
881
882         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
883                 hf_srvsvc_preferred_len, 0);
884
885         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
886                 srvsvc_dissect_ENUM_HANDLE,
887                 NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
888
889         return offset;
890 }
891 static int
892 srvsvc_dissect_netrchardevqenum_reply(tvbuff_t *tvb, int offset,
893                                      packet_info *pinfo, proto_tree *tree,
894                                      char *drep)
895 {
896         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
897                         srvsvc_dissect_CHARDEVQ_ENUM_STRUCT,
898                         NDR_POINTER_REF, "CHARDEVQ_ENUM_STRUCT",
899                         -1, 0);
900
901         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
902                         hf_srvsvc_num_entries, NULL);
903
904         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
905                         srvsvc_dissect_ENUM_HANDLE,
906                         NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
907
908         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
909                         hf_srvsvc_rc, NULL);
910
911         return offset;
912 }
913
914 /*
915  * IDL long NetrCharDevQGetInfo(
916  * IDL      [in] [string] [unique] wchar_t *ServerName,
917  * IDL      [in] [string] [ref] wchar_t *QueueName,
918  * IDL      [in] [string] [ref] wchar_t *UserName,
919  * IDL      [in] long Level,
920  * IDL      [out] [ref] CHARDEVQ_INFO *devq
921  * IDL );
922 */
923 static int
924 srvsvc_dissect_netrchardevqgetinfo_rqst(tvbuff_t *tvb, int offset,
925                                      packet_info *pinfo, proto_tree *tree,
926                                      char *drep)
927 {
928         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
929                 srvsvc_dissect_pointer_UNICODE_STRING,
930                 NDR_POINTER_UNIQUE, "Server",
931                 hf_srvsvc_server, 0);
932
933         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
934                 srvsvc_dissect_pointer_UNICODE_STRING,
935                 NDR_POINTER_REF, "Device Queue",
936                 hf_srvsvc_chrdevq, 0);
937
938         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
939                 srvsvc_dissect_pointer_UNICODE_STRING,
940                 NDR_POINTER_REF, "User",
941                 hf_srvsvc_user, 0);
942
943         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
944                 hf_srvsvc_info_level, NULL);
945
946         return offset;
947 }
948 static int
949 srvsvc_dissect_netrchardevqgetinfo_reply(tvbuff_t *tvb, int offset,
950                                      packet_info *pinfo, proto_tree *tree,
951                                      char *drep)
952 {
953         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
954                         srvsvc_dissect_CHARDEVQ_INFO,
955                         NDR_POINTER_REF, "CHARDEVQ_INFO:", -1, 0);
956
957         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
958                         hf_srvsvc_rc, NULL);
959
960         return offset;
961 }
962
963 /*
964  * IDL long NetrCharDevQSetInfo(
965  * IDL      [in] [string] [unique] wchar_t *ServerName,
966  * IDL      [in] [string] [ref] wchar_t *QueueName,
967  * IDL      [in] long Level,
968  * IDL      [in] [ref] CHARDEVQ_INFO *dev,
969  * IDL      [in] [out] [unique] long *ParmError
970  * IDL );
971 */
972 static int
973 srvsvc_dissect_netrchardevqsetinfo_rqst(tvbuff_t *tvb, int offset,
974                                      packet_info *pinfo, proto_tree *tree,
975                                      char *drep)
976 {
977         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
978                 srvsvc_dissect_pointer_UNICODE_STRING,
979                 NDR_POINTER_UNIQUE, "Server",
980                 hf_srvsvc_server, 0);
981
982         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
983                 srvsvc_dissect_pointer_UNICODE_STRING,
984                 NDR_POINTER_REF, "Device Queue",
985                 hf_srvsvc_chrdevq, 0);
986
987         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
988                 hf_srvsvc_info_level, NULL);
989
990         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
991                 srvsvc_dissect_CHARDEVQ_INFO,
992                 NDR_POINTER_REF, "CHARDEVQ_INFO",
993                 -1, 0);
994
995         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
996                         srvsvc_dissect_pointer_long, NDR_POINTER_UNIQUE,
997                         "Parameter Error:", hf_srvsvc_parm_error, 0);
998
999         return offset;
1000 }
1001 static int
1002 srvsvc_dissect_netrchardevqsetinfo_reply(tvbuff_t *tvb, int offset,
1003                                      packet_info *pinfo, proto_tree *tree,
1004                                      char *drep)
1005 {
1006         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1007                         srvsvc_dissect_pointer_long, NDR_POINTER_UNIQUE,
1008                         "Parameter Error:", hf_srvsvc_parm_error, 0);
1009
1010         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
1011                         hf_srvsvc_rc, NULL);
1012
1013         return offset;
1014 }
1015
1016 /*
1017  * IDL long NetrCharDevQPurge(
1018  * IDL      [in] [string] [unique] wchar_t *ServerName,
1019  * IDL      [in] [string] [ref] wchar_t *QueueName
1020  * IDL );
1021 */
1022 static int
1023 srvsvc_dissect_netrchardevqpurge_rqst(tvbuff_t *tvb, int offset,
1024                                      packet_info *pinfo, proto_tree *tree,
1025                                      char *drep)
1026 {
1027         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1028                 srvsvc_dissect_pointer_UNICODE_STRING,
1029                 NDR_POINTER_UNIQUE, "Server",
1030                 hf_srvsvc_server, 0);
1031
1032         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1033                 srvsvc_dissect_pointer_UNICODE_STRING,
1034                 NDR_POINTER_REF, "Device Queue",
1035                 hf_srvsvc_chrdevq, 0);
1036
1037         return offset;
1038 }
1039 static int
1040 srvsvc_dissect_netrchardevqpurge_reply(tvbuff_t *tvb, int offset,
1041                                      packet_info *pinfo, proto_tree *tree,
1042                                      char *drep)
1043 {
1044         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
1045                         hf_srvsvc_rc, NULL);
1046
1047         return offset;
1048 }
1049
1050 /*
1051  * IDL long NetrCharDevQPurge(
1052  * IDL      [in] [string] [unique] wchar_t *ServerName,
1053  * IDL      [in] [string] [ref] wchar_t *QueueName
1054  * IDL      [in] [string] [ref] wchar_t *ComputerName
1055  * IDL );
1056 */
1057 static int
1058 srvsvc_dissect_netrchardevqpurgeself_rqst(tvbuff_t *tvb, int offset,
1059                                      packet_info *pinfo, proto_tree *tree,
1060                                      char *drep)
1061 {
1062         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1063                 srvsvc_dissect_pointer_UNICODE_STRING,
1064                 NDR_POINTER_UNIQUE, "Server",
1065                 hf_srvsvc_server, 0);
1066
1067         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1068                 srvsvc_dissect_pointer_UNICODE_STRING,
1069                 NDR_POINTER_REF, "Device Queue",
1070                 hf_srvsvc_chrdevq, 0);
1071
1072         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1073                 srvsvc_dissect_pointer_UNICODE_STRING,
1074                 NDR_POINTER_REF, "Computer",
1075                 hf_srvsvc_computer, 0);
1076
1077         return offset;
1078 }
1079 static int
1080 srvsvc_dissect_netrchardevqpurgeself_reply(tvbuff_t *tvb, int offset,
1081                                      packet_info *pinfo, proto_tree *tree,
1082                                      char *drep)
1083 {
1084         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
1085                         hf_srvsvc_rc, NULL);
1086
1087         return offset;
1088 }
1089
1090
1091
1092 /*
1093  * IDL typedef struct {
1094  * IDL   long con_id;
1095  * IDL } CONNECT_INFO_0;
1096  */
1097 static int
1098 srvsvc_dissect_CONNECT_INFO_0(tvbuff_t *tvb, int offset,
1099                                      packet_info *pinfo, proto_tree *tree,
1100                                      char *drep)
1101 {
1102         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1103                                      hf_srvsvc_con_id, NULL);
1104
1105         return offset;
1106 }
1107 static int
1108 srvsvc_dissect_CONNECT_INFO_0_array(tvbuff_t *tvb, int offset,
1109                                      packet_info *pinfo, proto_tree *tree,
1110                                      char *drep)
1111 {
1112         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
1113                         srvsvc_dissect_CONNECT_INFO_0);
1114
1115         return offset;
1116 }
1117
1118 /*
1119  * IDL typedef struct {
1120  * IDL   long EntriesRead;
1121  * IDL   [size_is(EntriesRead)] [unique] CONNECT_INFO_0 *cons;
1122  * IDL } CONNECT_INFO_0_CONTAINER;
1123  */
1124 static int
1125 srvsvc_dissect_CONNECT_INFO_0_CONTAINER(tvbuff_t *tvb, int offset,
1126                                      packet_info *pinfo, proto_tree *tree,
1127                                      char *drep)
1128 {
1129         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1130                 hf_srvsvc_num_entries, NULL);
1131
1132         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1133                 srvsvc_dissect_CONNECT_INFO_0_array, NDR_POINTER_UNIQUE,
1134                 "CONNECT_INFO_0 array:", -1, 0);
1135
1136         return offset;
1137 }
1138
1139
1140 /*
1141  * IDL typedef struct {
1142  * IDL   long conid;
1143  * IDL   long type;
1144  * IDL   long num_opens;
1145  * IDL   long users;
1146  * IDL   long time;
1147  * IDL   [string] [unique] wchar_t *username;
1148  * IDL   [string] [unique] wchar_t *share;
1149  * IDL } CONNECT_INFO_1;
1150  */
1151 static int
1152 srvsvc_dissect_CONNECT_INFO_1(tvbuff_t *tvb, int offset,
1153                                      packet_info *pinfo, proto_tree *tree,
1154                                      char *drep)
1155 {
1156         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1157                                      hf_srvsvc_con_id, NULL);
1158
1159         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1160                                      hf_srvsvc_con_type, NULL);
1161
1162         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1163                                      hf_srvsvc_con_num_opens, NULL);
1164
1165         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1166                                      hf_srvsvc_users, NULL);
1167
1168         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1169                                      hf_srvsvc_con_time, NULL);
1170
1171         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1172                 srvsvc_dissect_pointer_UNICODE_STRING,
1173                 NDR_POINTER_UNIQUE, "User",
1174                 hf_srvsvc_user, 0);
1175
1176         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1177                 srvsvc_dissect_pointer_UNICODE_STRING,
1178                 NDR_POINTER_UNIQUE, "Share",
1179                 hf_srvsvc_share, 0);
1180
1181         return offset;
1182 }
1183 static int
1184 srvsvc_dissect_CONNECT_INFO_1_array(tvbuff_t *tvb, int offset,
1185                                      packet_info *pinfo, proto_tree *tree,
1186                                      char *drep)
1187 {
1188         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
1189                         srvsvc_dissect_CONNECT_INFO_1);
1190
1191         return offset;
1192 }
1193
1194 /*
1195  * IDL typedef struct {
1196  * IDL   long EntriesRead;
1197  * IDL   [size_is(EntriesRead)] [unique] CONNECT_INFO_0 *cons;
1198  * IDL } CONNECT_INFO_1_CONTAINER;
1199  */
1200 static int
1201 srvsvc_dissect_CONNECT_INFO_1_CONTAINER(tvbuff_t *tvb, int offset,
1202                                      packet_info *pinfo, proto_tree *tree,
1203                                      char *drep)
1204 {
1205         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1206                 hf_srvsvc_num_entries, NULL);
1207
1208         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1209                 srvsvc_dissect_CONNECT_INFO_1_array, NDR_POINTER_UNIQUE,
1210                 "CONNECT_INFO_1 array:", -1, 0);
1211
1212         return offset;
1213 }
1214
1215
1216 /*
1217  * IDL typedef [switch_type(long)] union {
1218  * IDL   [case(0)] [unique] CONNECT_INFO_0_CONTAINER *con0;
1219  * IDL   [case(1)] [unique] CONNECT_INFO_1_CONTAINER *con1;
1220  * IDL } CONNECT_ENUM_UNION;
1221  */
1222 static int
1223 srvsvc_dissect_CONNECT_ENUM_UNION(tvbuff_t *tvb, int offset,
1224                                      packet_info *pinfo, proto_tree *tree,
1225                                      char *drep)
1226 {
1227         guint32 level;
1228
1229         ALIGN_TO_4_BYTES;
1230
1231         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf_srvsvc_info_level, &level);
1232
1233         switch(level){
1234         case 0:
1235                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1236                         srvsvc_dissect_CONNECT_INFO_0_CONTAINER,
1237                         NDR_POINTER_UNIQUE, "CONNECT_INFO_0_CONTAINER:",
1238                         -1, 0);
1239                 break;
1240         case 1:
1241                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1242                         srvsvc_dissect_CONNECT_INFO_1_CONTAINER,
1243                         NDR_POINTER_UNIQUE, "CONNECT_INFO_1_CONTAINER:",
1244                         -1, 0);
1245                 break;
1246         }
1247
1248         return offset;
1249 }
1250
1251
1252 /*
1253  * IDL typedef struct {
1254  * IDL   long Level;
1255  * IDL   CONNECT_ENUM_UNION devs;
1256  * IDL } CONNECT_ENUM_STRUCT;
1257  */
1258 static int
1259 srvsvc_dissect_CONNECT_ENUM_STRUCT(tvbuff_t *tvb, int offset,
1260                                      packet_info *pinfo, proto_tree *tree,
1261                                      char *drep)
1262 {
1263         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1264                         hf_srvsvc_info_level, 0);
1265
1266         offset = srvsvc_dissect_CONNECT_ENUM_UNION(tvb, offset, pinfo, tree, drep);
1267
1268         return offset;
1269 }
1270
1271
1272 /*
1273  * IDL long NetrConnectionEnum(
1274  * IDL      [in] [string] [unique] wchar_t *ServerName,
1275  * IDL      [in] [string] [unique] wchar_t *Qualifier,
1276  * IDL      [in] [out] [ref] CONNECT_ENUM_STRUCT *con,
1277  * IDL      [in] long MaxLen,
1278  * IDL      [in] long num_connections,
1279  * IDL      [in] [out] [unique] long *ResumeHandle
1280  * IDL );
1281 */
1282 static int
1283 srvsvc_dissect_netrconnectionenum_rqst(tvbuff_t *tvb, int offset,
1284                                      packet_info *pinfo, proto_tree *tree,
1285                                      char *drep)
1286 {
1287         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1288                 srvsvc_dissect_pointer_UNICODE_STRING,
1289                 NDR_POINTER_UNIQUE, "Server",
1290                 hf_srvsvc_server, 0);
1291
1292         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1293                 srvsvc_dissect_pointer_UNICODE_STRING,
1294                 NDR_POINTER_UNIQUE, "Qualifier",
1295                 hf_srvsvc_qualifier, 0);
1296
1297         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1298                 srvsvc_dissect_CONNECT_ENUM_STRUCT,
1299                 NDR_POINTER_REF, "CONNECT_ENUM_STRUCT:",
1300                 -1, 0);
1301
1302         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1303                 hf_srvsvc_preferred_len, 0);
1304
1305         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1306                 srvsvc_dissect_ENUM_HANDLE,
1307                 NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
1308
1309         return offset;
1310 }
1311 static int
1312 srvsvc_dissect_netrconnectionenum_reply(tvbuff_t *tvb, int offset,
1313                                      packet_info *pinfo, proto_tree *tree,
1314                                      char *drep)
1315 {
1316         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1317                         srvsvc_dissect_CONNECT_ENUM_STRUCT,
1318                         NDR_POINTER_REF, "CONNECT_ENUM_STRUCT:",
1319                         -1, 0);
1320
1321         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1322                         hf_srvsvc_num_entries, NULL);
1323
1324         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1325                         srvsvc_dissect_ENUM_HANDLE,
1326                         NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
1327
1328         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
1329                         hf_srvsvc_rc, NULL);
1330
1331         return offset;
1332 }
1333
1334 /*
1335  * IDL typedef struct {
1336  * IDL   long fileid;
1337  * IDL } FILE_INFO_2;
1338  */
1339 static int
1340 srvsvc_dissect_FILE_INFO_2(tvbuff_t *tvb, int offset,
1341                                      packet_info *pinfo, proto_tree *tree,
1342                                      char *drep)
1343 {
1344         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1345                                      hf_srvsvc_file_id, NULL);
1346
1347         return offset;
1348 }
1349 static int
1350 srvsvc_dissect_FILE_INFO_2_array(tvbuff_t *tvb, int offset,
1351                                      packet_info *pinfo, proto_tree *tree,
1352                                      char *drep)
1353 {
1354         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
1355                         srvsvc_dissect_FILE_INFO_2);
1356
1357         return offset;
1358 }
1359
1360 /*
1361  * IDL typedef struct {
1362  * IDL   long EntriesRead;
1363  * IDL   [size_is(EntriesRead)] [unique] FILE_INFO_2 *files;
1364  * IDL } FILE_INFO_2_CONTAINER;
1365  */
1366 static int
1367 srvsvc_dissect_FILE_INFO_2_CONTAINER(tvbuff_t *tvb, int offset,
1368                                      packet_info *pinfo, proto_tree *tree,
1369                                      char *drep)
1370 {
1371         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1372                 hf_srvsvc_num_entries, NULL);
1373
1374         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1375                 srvsvc_dissect_FILE_INFO_2_array, NDR_POINTER_UNIQUE,
1376                 "FILE_INFO_2 array:", -1, 0);
1377
1378         return offset;
1379 }
1380
1381
1382 /*
1383  * IDL typedef struct {
1384  * IDL   long file_id;
1385  * IDL   long permissions;
1386  * IDL   long num_locks;
1387  * IDL   [string] [unique] wchar_t *pathname;
1388  * IDL   [string] [unique] wchar_t *username;
1389  * IDL } FILE_INFO_3;
1390  */
1391 static int
1392 srvsvc_dissect_FILE_INFO_3(tvbuff_t *tvb, int offset,
1393                                      packet_info *pinfo, proto_tree *tree,
1394                                      char *drep)
1395 {
1396         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1397                                      hf_srvsvc_file_id, NULL);
1398
1399         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1400                                      hf_srvsvc_perm, NULL);
1401
1402         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1403                                      hf_srvsvc_file_num_locks, NULL);
1404
1405         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1406                 srvsvc_dissect_pointer_UNICODE_STRING,
1407                 NDR_POINTER_UNIQUE, "Path",
1408                 hf_srvsvc_path, 0);
1409
1410         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1411                 srvsvc_dissect_pointer_UNICODE_STRING,
1412                 NDR_POINTER_UNIQUE, "User",
1413                 hf_srvsvc_user, 0);
1414
1415         return offset;
1416 }
1417 static int
1418 srvsvc_dissect_FILE_INFO_3_array(tvbuff_t *tvb, int offset,
1419                                      packet_info *pinfo, proto_tree *tree,
1420                                      char *drep)
1421 {
1422         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
1423                         srvsvc_dissect_FILE_INFO_3);
1424
1425         return offset;
1426 }
1427
1428 /*
1429  * IDL typedef struct {
1430  * IDL   long EntriesRead;
1431  * IDL   [size_is(EntriesRead)] [unique] FILE_INFO_3 *files;
1432  * IDL } FILE_INFO_3_CONTAINER;
1433  */
1434 static int
1435 srvsvc_dissect_FILE_INFO_3_CONTAINER(tvbuff_t *tvb, int offset,
1436                                      packet_info *pinfo, proto_tree *tree,
1437                                      char *drep)
1438 {
1439         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1440                 hf_srvsvc_num_entries, NULL);
1441
1442         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1443                 srvsvc_dissect_FILE_INFO_3_array, NDR_POINTER_UNIQUE,
1444                 "CHARDEV_INFO_3 array:", -1, 0);
1445
1446         return offset;
1447 }
1448
1449
1450 /*
1451  * IDL typedef [switch_type(long)] union {
1452  * IDL   [case(2)] [unique] FILE_INFO_2_CONTAINER *file0;
1453  * IDL   [case(3)] [unique] FILE_INFO_3_CONTAINER *file1;
1454  * IDL } FILE_ENUM_UNION;
1455  */
1456 static int
1457 srvsvc_dissect_FILE_ENUM_UNION(tvbuff_t *tvb, int offset,
1458                                      packet_info *pinfo, proto_tree *tree,
1459                                      char *drep)
1460 {
1461         guint32 level;
1462
1463         ALIGN_TO_4_BYTES;
1464
1465         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf_srvsvc_info_level, &level);
1466
1467         switch(level){
1468         case 2:
1469                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1470                         srvsvc_dissect_FILE_INFO_2_CONTAINER,
1471                         NDR_POINTER_UNIQUE, "FILE_INFO_2_CONTAINER:",
1472                         -1, 0);
1473                 break;
1474         case 3:
1475                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1476                         srvsvc_dissect_FILE_INFO_3_CONTAINER,
1477                         NDR_POINTER_UNIQUE, "FILE_INFO_3_CONTAINER:",
1478                         -1, 0);
1479                 break;
1480         }
1481
1482         return offset;
1483 }
1484
1485 /*
1486  * IDL typedef [switch_type(long)] union {
1487  * IDL   [case(2)] [unique] FILE_INFO_2 *file0;
1488  * IDL   [case(3)] [unique] FILE_INFO_3 *file1;
1489  * IDL } FILE_INFO_UNION;
1490  */
1491 static int
1492 srvsvc_dissect_FILE_INFO_UNION(tvbuff_t *tvb, int offset,
1493                                      packet_info *pinfo, proto_tree *tree,
1494                                      char *drep)
1495 {
1496         guint32 level;
1497
1498         ALIGN_TO_4_BYTES;
1499
1500         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf_srvsvc_info_level, &level);
1501
1502         switch(level){
1503         case 2:
1504                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1505                         srvsvc_dissect_FILE_INFO_2,
1506                         NDR_POINTER_UNIQUE, "FILE_INFO_2:",
1507                         -1, 0);
1508                 break;
1509         case 3:
1510                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1511                         srvsvc_dissect_FILE_INFO_3,
1512                         NDR_POINTER_UNIQUE, "FILE_INFO_3:",
1513                         -1, 0);
1514                 break;
1515         }
1516
1517         return offset;
1518 }
1519
1520
1521 /*
1522  * IDL typedef struct {
1523  * IDL   long Level;
1524  * IDL   FILE_ENUM_UNION files;
1525  * IDL } FILE_ENUM_STRUCT;
1526  */
1527 static int
1528 srvsvc_dissect_FILE_ENUM_STRUCT(tvbuff_t *tvb, int offset,
1529                                      packet_info *pinfo, proto_tree *tree,
1530                                      char *drep)
1531 {
1532         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1533                         hf_srvsvc_info_level, 0);
1534
1535         offset = srvsvc_dissect_FILE_ENUM_UNION(tvb, offset, pinfo, tree, drep);
1536
1537         return offset;
1538 }
1539
1540
1541 /*
1542  * IDL long NetrFileEnum(
1543  * IDL      [in] [string] [unique] wchar_t *ServerName,
1544  * IDL      [in] [string] [unique] wchar_t *Path,
1545  * IDL      [in] [string] [unique] wchar_t *UserName,
1546  * IDL      [in] [out] [ref] FILE_ENUM_STRUCT *file,
1547  * IDL      [in] long MaxLen,
1548  * IDL      [out] long num_entries,
1549  * IDL      [in] [out] [unique] long *ResumeHandle
1550  * IDL );
1551 */
1552 static int
1553 srvsvc_dissect_netrfileenum_rqst(tvbuff_t *tvb, int offset,
1554                                      packet_info *pinfo, proto_tree *tree,
1555                                      char *drep)
1556 {
1557         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1558                 srvsvc_dissect_pointer_UNICODE_STRING,
1559                 NDR_POINTER_UNIQUE, "Server",
1560                 hf_srvsvc_server, 0);
1561
1562         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1563                 srvsvc_dissect_pointer_UNICODE_STRING,
1564                 NDR_POINTER_UNIQUE, "Path",
1565                 hf_srvsvc_path, 0);
1566
1567         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1568                 srvsvc_dissect_pointer_UNICODE_STRING,
1569                 NDR_POINTER_UNIQUE, "User",
1570                 hf_srvsvc_user, 0);
1571
1572         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1573                 srvsvc_dissect_FILE_ENUM_STRUCT,
1574                 NDR_POINTER_REF, "FILE_ENUM_STRUCT:",
1575                 -1, 0);
1576
1577         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1578                 hf_srvsvc_preferred_len, 0);
1579
1580         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1581                 srvsvc_dissect_ENUM_HANDLE,
1582                 NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
1583
1584         return offset;
1585 }
1586 static int
1587 srvsvc_dissect_netrfileenum_reply(tvbuff_t *tvb, int offset,
1588                                      packet_info *pinfo, proto_tree *tree,
1589                                      char *drep)
1590 {
1591         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1592                         srvsvc_dissect_FILE_ENUM_STRUCT,
1593                         NDR_POINTER_REF, "FILE_ENUM_STRUCT:",
1594                         -1, 0);
1595
1596         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1597                         hf_srvsvc_num_entries, NULL);
1598
1599         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1600                         srvsvc_dissect_ENUM_HANDLE,
1601                         NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
1602
1603         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
1604                         hf_srvsvc_rc, NULL);
1605
1606         return offset;
1607 }
1608
1609
1610 /*
1611  * IDL long NetrFileGetInfo(
1612  * IDL      [in] [string] [unique] wchar_t *ServerName,
1613  * IDL      [in] long fileid,
1614  * IDL      [in] long level,
1615  * IDL      [out] [ref] FILE_INFO_UNION *file
1616  * IDL );
1617 */
1618 static int
1619 srvsvc_dissect_netrfilegetinfo_rqst(tvbuff_t *tvb, int offset,
1620                                      packet_info *pinfo, proto_tree *tree,
1621                                      char *drep)
1622 {
1623         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1624                 srvsvc_dissect_pointer_UNICODE_STRING,
1625                 NDR_POINTER_UNIQUE, "Server",
1626                 hf_srvsvc_server, 0);
1627
1628         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1629                                      hf_srvsvc_file_id, NULL);
1630
1631         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1632                         hf_srvsvc_info_level, 0);
1633
1634         return offset;
1635 }
1636 static int
1637 srvsvc_dissect_netrfilegetinfo_reply(tvbuff_t *tvb, int offset,
1638                                      packet_info *pinfo, proto_tree *tree,
1639                                      char *drep)
1640 {
1641         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1642                         srvsvc_dissect_FILE_INFO_UNION,
1643                         NDR_POINTER_REF, "FILE_INFO_UNION:", -1, 0);
1644
1645         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
1646                         hf_srvsvc_rc, NULL);
1647
1648         return offset;
1649 }
1650
1651
1652 /*
1653  * IDL long NetrFileClose(
1654  * IDL      [in] [string] [unique] wchar_t *ServerName,
1655  * IDL      [in] long fileid,
1656  * IDL );
1657 */
1658 static int
1659 srvsvc_dissect_netrfileclose_rqst(tvbuff_t *tvb, int offset,
1660                                      packet_info *pinfo, proto_tree *tree,
1661                                      char *drep)
1662 {
1663         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1664                 srvsvc_dissect_pointer_UNICODE_STRING,
1665                 NDR_POINTER_UNIQUE, "Server",
1666                 hf_srvsvc_server, 0);
1667
1668         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1669                                      hf_srvsvc_file_id, NULL);
1670
1671         return offset;
1672 }
1673 static int
1674 srvsvc_dissect_netrfileclose_reply(tvbuff_t *tvb, int offset,
1675                                      packet_info *pinfo, proto_tree *tree,
1676                                      char *drep)
1677 {
1678         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
1679                         hf_srvsvc_rc, NULL);
1680
1681         return offset;
1682 }
1683
1684 /*
1685  * IDL typedef struct {
1686  * IDL   [string] [unique] wchar_t *ses;
1687  * IDL } SESSION_INFO_0;
1688  */
1689 static int
1690 srvsvc_dissect_SESSION_INFO_0(tvbuff_t *tvb, int offset,
1691                                      packet_info *pinfo, proto_tree *tree,
1692                                      char *drep)
1693 {
1694         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1695                 srvsvc_dissect_pointer_UNICODE_STRING,
1696                 NDR_POINTER_UNIQUE, "Session",
1697                 hf_srvsvc_session, 0);
1698
1699         return offset;
1700 }
1701 static int
1702 srvsvc_dissect_SESSION_INFO_0_array(tvbuff_t *tvb, int offset,
1703                                      packet_info *pinfo, proto_tree *tree,
1704                                      char *drep)
1705 {
1706         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
1707                         srvsvc_dissect_SESSION_INFO_0);
1708
1709         return offset;
1710 }
1711
1712 /*
1713  * IDL typedef struct {
1714  * IDL   long EntriesRead;
1715  * IDL   [size_is(EntriesRead)] [unique] SESSION_INFO_0 *ses;
1716  * IDL } SESSION_INFO_0_CONTAINER;
1717  */
1718 static int
1719 srvsvc_dissect_SESSION_INFO_0_CONTAINER(tvbuff_t *tvb, int offset,
1720                                      packet_info *pinfo, proto_tree *tree,
1721                                      char *drep)
1722 {
1723         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1724                 hf_srvsvc_num_entries, NULL);
1725
1726         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1727                 srvsvc_dissect_SESSION_INFO_0_array, NDR_POINTER_UNIQUE,
1728                 "SESSION_INFO_0 array:", -1, 0);
1729
1730         return offset;
1731 }
1732
1733 /*
1734  * IDL typedef struct {
1735  * IDL   [string] [unique] wchar_t *ses;
1736  * IDL   [string] [unique] wchar_t *user;
1737  * IDL   long num_open;
1738  * IDL   long time;
1739  * IDL   long idle_time;
1740  * IDL   long user_flags
1741  * IDL } SESSION_INFO_1;
1742  */
1743 static int
1744 srvsvc_dissect_SESSION_INFO_1(tvbuff_t *tvb, int offset,
1745                                      packet_info *pinfo, proto_tree *tree,
1746                                      char *drep)
1747 {
1748         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1749                 srvsvc_dissect_pointer_UNICODE_STRING,
1750                 NDR_POINTER_UNIQUE, "Session",
1751                 hf_srvsvc_session, 0);
1752
1753         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1754                 srvsvc_dissect_pointer_UNICODE_STRING,
1755                 NDR_POINTER_UNIQUE, "User",
1756                 hf_srvsvc_user, 0);
1757
1758         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1759                                      hf_srvsvc_session_num_opens, NULL);
1760
1761         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1762                                      hf_srvsvc_session_time, NULL);
1763
1764         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1765                                      hf_srvsvc_session_idle_time, NULL);
1766
1767         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1768                                      hf_srvsvc_session_user_flags, NULL);
1769
1770         return offset;
1771 }
1772 static int
1773 srvsvc_dissect_SESSION_INFO_1_array(tvbuff_t *tvb, int offset,
1774                                      packet_info *pinfo, proto_tree *tree,
1775                                      char *drep)
1776 {
1777         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
1778                         srvsvc_dissect_SESSION_INFO_1);
1779
1780         return offset;
1781 }
1782
1783 /*
1784  * IDL typedef struct {
1785  * IDL   long EntriesRead;
1786  * IDL   [size_is(EntriesRead)] [unique] SESSION_INFO_1 *ses;
1787  * IDL } SESSION_INFO_1_CONTAINER;
1788  */
1789 static int
1790 srvsvc_dissect_SESSION_INFO_1_CONTAINER(tvbuff_t *tvb, int offset,
1791                                      packet_info *pinfo, proto_tree *tree,
1792                                      char *drep)
1793 {
1794         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1795                 hf_srvsvc_num_entries, NULL);
1796
1797         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1798                 srvsvc_dissect_SESSION_INFO_1_array, NDR_POINTER_UNIQUE,
1799                 "SESSION_INFO_1 array:", -1, 0);
1800
1801         return offset;
1802 }
1803
1804 /*
1805  * IDL typedef struct {
1806  * IDL   [string] [unique] wchar_t *ses;
1807  * IDL   [string] [unique] wchar_t *user;
1808  * IDL   long num_open;
1809  * IDL   long time;
1810  * IDL   long idle_time;
1811  * IDL   long user_flags
1812  * IDL   [string] [unique] wchar_t *clienttype;
1813  * IDL } SESSION_INFO_2;
1814  */
1815 static int
1816 srvsvc_dissect_SESSION_INFO_2(tvbuff_t *tvb, int offset,
1817                                      packet_info *pinfo, proto_tree *tree,
1818                                      char *drep)
1819 {
1820         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1821                 srvsvc_dissect_pointer_UNICODE_STRING,
1822                 NDR_POINTER_UNIQUE, "Session",
1823                 hf_srvsvc_session, 0);
1824
1825         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1826                 srvsvc_dissect_pointer_UNICODE_STRING,
1827                 NDR_POINTER_UNIQUE, "User",
1828                 hf_srvsvc_user, 0);
1829
1830         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1831                                      hf_srvsvc_session_num_opens, NULL);
1832
1833         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1834                                      hf_srvsvc_session_time, NULL);
1835
1836         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1837                                      hf_srvsvc_session_idle_time, NULL);
1838
1839         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1840                                      hf_srvsvc_session_user_flags, NULL);
1841
1842         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1843                 srvsvc_dissect_pointer_UNICODE_STRING,
1844                 NDR_POINTER_UNIQUE, "Client Type:",
1845                 hf_srvsvc_client_type, 0);
1846
1847         return offset;
1848 }
1849 static int
1850 srvsvc_dissect_SESSION_INFO_2_array(tvbuff_t *tvb, int offset,
1851                                      packet_info *pinfo, proto_tree *tree,
1852                                      char *drep)
1853 {
1854         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
1855                         srvsvc_dissect_SESSION_INFO_2);
1856
1857         return offset;
1858 }
1859
1860 /*
1861  * IDL typedef struct {
1862  * IDL   long EntriesRead;
1863  * IDL   [size_is(EntriesRead)] [unique] SESSION_INFO_2 *ses;
1864  * IDL } SESSION_INFO_2_CONTAINER;
1865  */
1866 static int
1867 srvsvc_dissect_SESSION_INFO_2_CONTAINER(tvbuff_t *tvb, int offset,
1868                                      packet_info *pinfo, proto_tree *tree,
1869                                      char *drep)
1870 {
1871         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1872                 hf_srvsvc_num_entries, NULL);
1873
1874         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1875                 srvsvc_dissect_SESSION_INFO_2_array, NDR_POINTER_UNIQUE,
1876                 "SESSION_INFO_2 array:", -1, 0);
1877
1878         return offset;
1879 }
1880
1881 /*
1882  * IDL typedef struct {
1883  * IDL   [string] [unique] wchar_t *ses;
1884  * IDL   [string] [unique] wchar_t *user;
1885  * IDL   long time;
1886  * IDL   long idle_time;
1887  * IDL } SESSION_INFO_10;
1888  */
1889 static int
1890 srvsvc_dissect_SESSION_INFO_10(tvbuff_t *tvb, int offset,
1891                                      packet_info *pinfo, proto_tree *tree,
1892                                      char *drep)
1893 {
1894         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1895                 srvsvc_dissect_pointer_UNICODE_STRING,
1896                 NDR_POINTER_UNIQUE, "Session",
1897                 hf_srvsvc_session, 0);
1898
1899         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1900                 srvsvc_dissect_pointer_UNICODE_STRING,
1901                 NDR_POINTER_UNIQUE, "User",
1902                 hf_srvsvc_user, 0);
1903
1904         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1905                                      hf_srvsvc_session_time, NULL);
1906
1907         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1908                                      hf_srvsvc_session_idle_time, NULL);
1909
1910         return offset;
1911 }
1912 static int
1913 srvsvc_dissect_SESSION_INFO_10_array(tvbuff_t *tvb, int offset,
1914                                      packet_info *pinfo, proto_tree *tree,
1915                                      char *drep)
1916 {
1917         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
1918                         srvsvc_dissect_SESSION_INFO_10);
1919
1920         return offset;
1921 }
1922
1923 /*
1924  * IDL typedef struct {
1925  * IDL   long EntriesRead;
1926  * IDL   [size_is(EntriesRead)] [unique] SESSION_INFO_10 *ses;
1927  * IDL } SESSION_INFO_10_CONTAINER;
1928  */
1929 static int
1930 srvsvc_dissect_SESSION_INFO_10_CONTAINER(tvbuff_t *tvb, int offset,
1931                                      packet_info *pinfo, proto_tree *tree,
1932                                      char *drep)
1933 {
1934         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
1935                 hf_srvsvc_num_entries, NULL);
1936
1937         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1938                 srvsvc_dissect_SESSION_INFO_10_array, NDR_POINTER_UNIQUE,
1939                 "SESSION_INFO_10 array:", -1, 0);
1940
1941         return offset;
1942 }
1943
1944 /*
1945  * IDL typedef struct {
1946  * IDL   [string] [unique] wchar_t *ses;
1947  * IDL   [string] [unique] wchar_t *user;
1948  * IDL   long num_open;
1949  * IDL   long time;
1950  * IDL   long idle_time;
1951  * IDL   long user_flags
1952  * IDL   [string] [unique] wchar_t *clienttype;
1953  * IDL   [string] [unique] wchar_t *transport;
1954  * IDL } SESSION_INFO_502;
1955  */
1956 static int
1957 srvsvc_dissect_SESSION_INFO_502(tvbuff_t *tvb, int offset,
1958                                      packet_info *pinfo, proto_tree *tree,
1959                                      char *drep)
1960 {
1961         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1962                 srvsvc_dissect_pointer_UNICODE_STRING,
1963                 NDR_POINTER_UNIQUE, "Session",
1964                 hf_srvsvc_session, 0);
1965
1966         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1967                 srvsvc_dissect_pointer_UNICODE_STRING,
1968                 NDR_POINTER_UNIQUE, "User",
1969                 hf_srvsvc_user, 0);
1970
1971         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1972                                      hf_srvsvc_session_num_opens, NULL);
1973
1974         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1975                                      hf_srvsvc_session_time, NULL);
1976
1977         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1978                                      hf_srvsvc_session_idle_time, NULL);
1979
1980         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
1981                                      hf_srvsvc_session_user_flags, NULL);
1982
1983         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1984                 srvsvc_dissect_pointer_UNICODE_STRING,
1985                 NDR_POINTER_UNIQUE, "Client Type:",
1986                 hf_srvsvc_client_type, 0);
1987
1988         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
1989                 srvsvc_dissect_pointer_UNICODE_STRING,
1990                 NDR_POINTER_UNIQUE, "Transport:",
1991                 hf_srvsvc_transport, 0);
1992
1993         return offset;
1994 }
1995 static int
1996 srvsvc_dissect_SESSION_INFO_502_array(tvbuff_t *tvb, int offset,
1997                                      packet_info *pinfo, proto_tree *tree,
1998                                      char *drep)
1999 {
2000         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
2001                         srvsvc_dissect_SESSION_INFO_502);
2002
2003         return offset;
2004 }
2005
2006 /*
2007  * IDL typedef struct {
2008  * IDL   long EntriesRead;
2009  * IDL   [size_is(EntriesRead)] [unique] SESSION_INFO_502 *ses;
2010  * IDL } SESSION_INFO_502_CONTAINER;
2011  */
2012 static int
2013 srvsvc_dissect_SESSION_INFO_502_CONTAINER(tvbuff_t *tvb, int offset,
2014                                      packet_info *pinfo, proto_tree *tree,
2015                                      char *drep)
2016 {
2017         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2018                 hf_srvsvc_num_entries, NULL);
2019
2020         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2021                 srvsvc_dissect_SESSION_INFO_502_array, NDR_POINTER_UNIQUE,
2022                 "SESSION_INFO_502 array:", -1, 0);
2023
2024         return offset;
2025 }
2026
2027 /*
2028  * IDL typedef [switch_type(long)] union {
2029  * IDL   [case(0)] [unique] SESSION_INFO_0_CONTAINER *ses0;
2030  * IDL   [case(1)] [unique] SESSION_INFO_1_CONTAINER *ses1;
2031  * IDL   [case(2)] [unique] SESSION_INFO_2_CONTAINER *ses2;
2032  * IDL   [case(10)] [unique] SESSION_INFO_10_CONTAINER *ses10;
2033  * IDL   [case(502)] [unique] SESSION_INFO_502_CONTAINER *ses502;
2034  * IDL } SESSION_ENUM_UNION;
2035  */
2036 static int
2037 srvsvc_dissect_SESSION_ENUM_UNION(tvbuff_t *tvb, int offset,
2038                                      packet_info *pinfo, proto_tree *tree,
2039                                      char *drep)
2040 {
2041         guint32 level;
2042
2043         ALIGN_TO_4_BYTES;
2044
2045         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf_srvsvc_info_level, &level);
2046
2047         switch(level){
2048         case 0:
2049                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2050                         srvsvc_dissect_SESSION_INFO_0_CONTAINER,
2051                         NDR_POINTER_UNIQUE, "SESSION_INFO_0_CONTAINER:",
2052                         -1, 0);
2053                 break;
2054         case 1:
2055                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2056                         srvsvc_dissect_SESSION_INFO_1_CONTAINER,
2057                         NDR_POINTER_UNIQUE, "SESSION_INFO_1_CONTAINER:",
2058                         -1, 0);
2059                 break;
2060         case 2:
2061                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2062                         srvsvc_dissect_SESSION_INFO_2_CONTAINER,
2063                         NDR_POINTER_UNIQUE, "SESSION_INFO_2_CONTAINER:",
2064                         -1, 0);
2065                 break;
2066         case 10:
2067                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2068                         srvsvc_dissect_SESSION_INFO_10_CONTAINER,
2069                         NDR_POINTER_UNIQUE, "SESSION_INFO_10_CONTAINER:",
2070                         -1, 0);
2071                 break;
2072         case 502:
2073                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2074                         srvsvc_dissect_SESSION_INFO_502_CONTAINER,
2075                         NDR_POINTER_UNIQUE, "SESSION_INFO_502_CONTAINER:",
2076                         -1, 0);
2077                 break;
2078         }
2079
2080         return offset;
2081 }
2082
2083 /*
2084  * IDL typedef struct {
2085  * IDL   long Level;
2086  * IDL   SESSION_ENUM_UNION ses;
2087  * IDL } SESSION_ENUM_STRUCT;
2088  */
2089 static int
2090 srvsvc_dissect_SESSION_ENUM_STRUCT(tvbuff_t *tvb, int offset,
2091                                      packet_info *pinfo, proto_tree *tree,
2092                                      char *drep)
2093 {
2094         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2095                         hf_srvsvc_info_level, 0);
2096
2097         offset = srvsvc_dissect_SESSION_ENUM_UNION(tvb, offset, pinfo, tree, drep);
2098
2099         return offset;
2100 }
2101
2102
2103 /*
2104  * IDL long NetrSessionEnum(
2105  * IDL      [in] [string] [unique] wchar_t *ServerName,
2106  * IDL      [in] [string] [unique] wchar_t *ClientName,
2107  * IDL      [in] [string] [unique] wchar_t *UserName,
2108  * IDL      [in] [out] [ref] SESSION_ENUM_STRUCT *ses,
2109  * IDL      [in] long maxlen,
2110  * IDL      [out] long num_sessions,
2111  * IDL      [in] [out] [unique] long *resumehandle,
2112  * IDL );
2113 */
2114 static int
2115 srvsvc_dissect_netrsessionenum_rqst(tvbuff_t *tvb, int offset,
2116                                      packet_info *pinfo, proto_tree *tree,
2117                                      char *drep)
2118 {
2119         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2120                 srvsvc_dissect_pointer_UNICODE_STRING,
2121                 NDR_POINTER_UNIQUE, "Server",
2122                 hf_srvsvc_server, 0);
2123
2124         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2125                 srvsvc_dissect_pointer_UNICODE_STRING,
2126                 NDR_POINTER_UNIQUE, "Computer",
2127                 hf_srvsvc_computer, 0);
2128
2129         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2130                 srvsvc_dissect_pointer_UNICODE_STRING,
2131                 NDR_POINTER_UNIQUE, "User",
2132                 hf_srvsvc_user, 0);
2133
2134         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2135                 srvsvc_dissect_SESSION_ENUM_STRUCT,
2136                 NDR_POINTER_REF, "SESSION_ENUM_STRUCT",
2137                 -1, 0);
2138
2139         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2140                 hf_srvsvc_preferred_len, 0);
2141
2142         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2143                 srvsvc_dissect_ENUM_HANDLE,
2144                 NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
2145
2146         return offset;
2147 }
2148 static int
2149 srvsvc_dissect_netrsessionenum_reply(tvbuff_t *tvb, int offset,
2150                                      packet_info *pinfo, proto_tree *tree,
2151                                      char *drep)
2152 {
2153         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2154                 srvsvc_dissect_SESSION_ENUM_STRUCT,
2155                 NDR_POINTER_REF, "SESSION_ENUM_STRUCT",
2156                 -1, 0);
2157
2158         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2159                 hf_srvsvc_num_entries, NULL);
2160
2161         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2162                         srvsvc_dissect_ENUM_HANDLE,
2163                         NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
2164
2165         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
2166                         hf_srvsvc_rc, NULL);
2167
2168         return offset;
2169 }
2170
2171
2172 /*
2173  * IDL long NetrSessionDel(
2174  * IDL      [in] [string] [unique] wchar_t *ServerName,
2175  * IDL      [in] [string] [ref] wchar_t *ClientName,
2176  * IDL      [in] [string] [ref] wchar_t *UserName,
2177  * IDL );
2178 */
2179 static int
2180 srvsvc_dissect_netrsessiondel_rqst(tvbuff_t *tvb, int offset,
2181                                      packet_info *pinfo, proto_tree *tree,
2182                                      char *drep)
2183 {
2184         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2185                 srvsvc_dissect_pointer_UNICODE_STRING,
2186                 NDR_POINTER_UNIQUE, "Server",
2187                 hf_srvsvc_server, 0);
2188
2189         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2190                 srvsvc_dissect_pointer_UNICODE_STRING,
2191                 NDR_POINTER_REF, "Computer",
2192                 hf_srvsvc_computer, 0);
2193
2194         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2195                 srvsvc_dissect_pointer_UNICODE_STRING,
2196                 NDR_POINTER_REF, "User",
2197                 hf_srvsvc_user, 0);
2198
2199         return offset;
2200 }
2201 static int
2202 srvsvc_dissect_netrsessiondel_reply(tvbuff_t *tvb, int offset,
2203                                      packet_info *pinfo, proto_tree *tree,
2204                                      char *drep)
2205 {
2206         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
2207                         hf_srvsvc_rc, NULL);
2208
2209         return offset;
2210 }
2211
2212
2213 /*
2214  * IDL typedef struct {
2215  * IDL   [string] [unique] wchar_t *share;
2216  * IDL } SHARE_INFO_0;
2217  */
2218 static int
2219 srvsvc_dissect_SHARE_INFO_0(tvbuff_t *tvb, int offset,
2220                                      packet_info *pinfo, proto_tree *tree,
2221                                      char *drep)
2222 {
2223         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2224                 srvsvc_dissect_pointer_UNICODE_STRING,
2225                 NDR_POINTER_UNIQUE, "Share",
2226                 hf_srvsvc_share, 0);
2227
2228         return offset;
2229 }
2230 static int
2231 srvsvc_dissect_SHARE_INFO_0_array(tvbuff_t *tvb, int offset,
2232                                      packet_info *pinfo, proto_tree *tree,
2233                                      char *drep)
2234 {
2235         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
2236                         srvsvc_dissect_SHARE_INFO_0);
2237
2238         return offset;
2239 }
2240
2241 /*
2242  * IDL typedef struct {
2243  * IDL   long EntriesRead;
2244  * IDL   [size_is(EntriesRead)] [unique] SHARE_INFO_0 *shares;
2245  * IDL } SHARE_INFO_0_CONTAINER;
2246  */
2247 static int
2248 srvsvc_dissect_SHARE_INFO_0_CONTAINER(tvbuff_t *tvb, int offset,
2249                                      packet_info *pinfo, proto_tree *tree,
2250                                      char *drep)
2251 {
2252         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2253                 hf_srvsvc_num_entries, NULL);
2254
2255         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2256                 srvsvc_dissect_SHARE_INFO_0_array, NDR_POINTER_UNIQUE,
2257                 "SHARE_INFO_0 array:", -1, 0);
2258
2259         return offset;
2260 }
2261
2262 /*
2263   IDL typedef struct {
2264   IDL    [unique] [string] wchar_t *share;
2265   IDL    long type;
2266   IDL    [unique] [string] wchar_t *comment;
2267   IDL } SHARE_INFO_1;
2268 */
2269 static int
2270 srvsvc_dissect_SHARE_INFO_1(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *parent_tree, char *drep)
2271 {
2272         proto_item *item = NULL;
2273         proto_tree *tree = NULL;
2274
2275         dcerpc_info *di;
2276
2277         di=pinfo->private_data;
2278         if (parent_tree) {
2279                 item = proto_tree_add_text(parent_tree, tvb, offset, -1, "Share");
2280                 tree = proto_item_add_subtree(item, ett_srvsvc_share_info_1);
2281         }
2282
2283         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2284                 srvsvc_dissect_pointer_UNICODE_STRING, NDR_POINTER_UNIQUE,
2285                 "Share", hf_srvsvc_share, di->levels);
2286
2287         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2288                 hf_srvsvc_share_type, NULL);
2289
2290         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2291                 srvsvc_dissect_pointer_UNICODE_STRING, NDR_POINTER_UNIQUE,
2292                 "Comment", hf_srvsvc_comment, 0);
2293
2294         return offset;
2295 }
2296 static int
2297 srvsvc_dissect_SHARE_INFO_1_array(tvbuff_t *tvb, int offset,
2298                                      packet_info *pinfo, proto_tree *tree,
2299                                      char *drep)
2300 {
2301         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
2302                         srvsvc_dissect_SHARE_INFO_1);
2303
2304         return offset;
2305 }
2306
2307 /*
2308  * IDL typedef struct {
2309  * IDL   long EntriesRead;
2310  * IDL   [size_is(EntriesRead)] [unique] SHARE_INFO_1 *shares;
2311  * IDL } SHARE_INFO_1_CONTAINER;
2312  */
2313 static int
2314 srvsvc_dissect_SHARE_INFO_1_CONTAINER(tvbuff_t *tvb, int offset,
2315                                      packet_info *pinfo, proto_tree *tree,
2316                                      char *drep)
2317 {
2318         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2319                 hf_srvsvc_num_entries, NULL);
2320
2321         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2322                 srvsvc_dissect_SHARE_INFO_1_array, NDR_POINTER_UNIQUE,
2323                 "SHARE_INFO_1 array:", -1, 3);
2324
2325         return offset;
2326 }
2327
2328 /*
2329   IDL typedef struct {
2330   IDL    [unique] [string] wchar_t *share;
2331   IDL    long type;
2332   IDL    [unique] [string] wchar_t *comment;
2333   IDL    long permissions;
2334   IDL    long max_uses;
2335   IDL    long current_uses;
2336   IDL    [unique] [string] wchar_t *path;
2337   IDL    [unique] [string] wchar_t *passwd;
2338   IDL } SHARE_INFO_2;
2339 */
2340 static int
2341 srvsvc_dissect_SHARE_INFO_2(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *parent_tree, char *drep)
2342 {
2343         proto_item *item = NULL;
2344         proto_tree *tree = NULL;
2345
2346         dcerpc_info *di;
2347
2348         di=pinfo->private_data;
2349         if (parent_tree) {
2350                 item = proto_tree_add_text(parent_tree, tvb, offset, -1, "Share");
2351                 tree = proto_item_add_subtree(item, ett_srvsvc_share_info_2);
2352         }
2353
2354         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2355                 srvsvc_dissect_pointer_UNICODE_STRING, NDR_POINTER_UNIQUE,
2356                 "Share", hf_srvsvc_share, di->levels);
2357
2358         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2359                 hf_srvsvc_share_type, NULL);
2360
2361         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2362                 srvsvc_dissect_pointer_UNICODE_STRING, NDR_POINTER_UNIQUE,
2363                 "Comment", hf_srvsvc_comment, 0);
2364
2365         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
2366                                      hf_srvsvc_perm, NULL);
2367
2368         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
2369                                      hf_srvsvc_max_uses, NULL);
2370
2371         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
2372                                      hf_srvsvc_cur_uses, NULL);
2373
2374         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2375                 srvsvc_dissect_pointer_UNICODE_STRING,
2376                 NDR_POINTER_UNIQUE, "Path",
2377                 hf_srvsvc_path, 0);
2378
2379         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2380                 srvsvc_dissect_pointer_UNICODE_STRING,
2381                 NDR_POINTER_UNIQUE, "Passwd",
2382                 hf_srvsvc_share_passwd, 0);
2383
2384         return offset;
2385 }
2386 static int
2387 srvsvc_dissect_SHARE_INFO_2_array(tvbuff_t *tvb, int offset,
2388                                      packet_info *pinfo, proto_tree *tree,
2389                                      char *drep)
2390 {
2391         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
2392                         srvsvc_dissect_SHARE_INFO_2);
2393
2394         return offset;
2395 }
2396
2397 /*
2398  * IDL typedef struct {
2399  * IDL   long EntriesRead;
2400  * IDL   [size_is(EntriesRead)] [unique] SHARE_INFO_2 *shares;
2401  * IDL } SHARE_INFO_2_CONTAINER;
2402  */
2403 static int
2404 srvsvc_dissect_SHARE_INFO_2_CONTAINER(tvbuff_t *tvb, int offset,
2405                                      packet_info *pinfo, proto_tree *tree,
2406                                      char *drep)
2407 {
2408         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2409                 hf_srvsvc_num_entries, NULL);
2410
2411         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2412                 srvsvc_dissect_SHARE_INFO_2_array, NDR_POINTER_UNIQUE,
2413                 "SHARE_INFO_2 array:", -1, 0);
2414
2415         return offset;
2416 }
2417
2418 /*
2419   IDL typedef struct {
2420   IDL    [unique] [string] wchar_t *share;
2421   IDL    long type;
2422   IDL    [unique] [string] wchar_t *comment;
2423   IDL    long policy;
2424   IDL } SHARE_INFO_501;
2425 */
2426 static int
2427 srvsvc_dissect_SHARE_INFO_501(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *parent_tree, char *drep)
2428 {
2429         proto_item *item = NULL;
2430         proto_tree *tree = NULL;
2431
2432         dcerpc_info *di;
2433
2434         di=pinfo->private_data;
2435         if (parent_tree) {
2436                 item = proto_tree_add_text(parent_tree, tvb, offset, -1, "Share");
2437                 tree = proto_item_add_subtree(item, ett_srvsvc_share_info_501);
2438         }
2439
2440         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2441                 srvsvc_dissect_pointer_UNICODE_STRING, NDR_POINTER_UNIQUE,
2442                 "Share", hf_srvsvc_share, di->levels);
2443
2444         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2445                 hf_srvsvc_share_type, NULL);
2446
2447         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2448                 srvsvc_dissect_pointer_UNICODE_STRING, NDR_POINTER_UNIQUE,
2449                 "Comment", hf_srvsvc_comment, 0);
2450
2451         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2452                 hf_srvsvc_policy, NULL);
2453
2454         return offset;
2455 }
2456 static int
2457 srvsvc_dissect_SHARE_INFO_501_array(tvbuff_t *tvb, int offset,
2458                                      packet_info *pinfo, proto_tree *tree,
2459                                      char *drep)
2460 {
2461         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
2462                         srvsvc_dissect_SHARE_INFO_501);
2463
2464         return offset;
2465 }
2466
2467 /*
2468  * IDL typedef struct {
2469  * IDL   long EntriesRead;
2470  * IDL   [size_is(EntriesRead)] [unique] SHARE_INFO_501 *shares;
2471  * IDL } SHARE_INFO_501_CONTAINER;
2472  */
2473 static int
2474 srvsvc_dissect_SHARE_INFO_501_CONTAINER(tvbuff_t *tvb, int offset,
2475                                      packet_info *pinfo, proto_tree *tree,
2476                                      char *drep)
2477 {
2478         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2479                 hf_srvsvc_num_entries, NULL);
2480
2481         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2482                 srvsvc_dissect_SHARE_INFO_501_array, NDR_POINTER_UNIQUE,
2483                 "SHARE_INFO_501 array:", -1, 0);
2484
2485         return offset;
2486 }
2487
2488
2489 /*
2490   IDL typedef struct {
2491   IDL    [unique] [string] wchar_t *share;
2492   IDL    long type;
2493   IDL    [unique] [string] wchar_t *comment;
2494   IDL    long permissions;
2495   IDL    long max_uses;
2496   IDL    long current_uses;
2497   IDL    [unique] [string] wchar_t *path;
2498   IDL    [unique] [string] wchar_t *passwd;
2499   IDL    long reserved;
2500   IDL    SECDESC [unique] *securitysecriptor; 4byte-len followed by bytestring
2501   IDL } SHARE_INFO_502;
2502 */
2503 static int
2504 srvsvc_dissect_SHARE_INFO_502(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *parent_tree, char *drep)
2505 {
2506         proto_item *item = NULL;
2507         proto_tree *tree = NULL;
2508
2509         dcerpc_info *di;
2510
2511         di=pinfo->private_data;
2512         if (parent_tree) {
2513                 item = proto_tree_add_text(parent_tree, tvb, offset, -1, "Share");
2514                 tree = proto_item_add_subtree(item, ett_srvsvc_share_info_502);
2515         }
2516
2517         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2518                 srvsvc_dissect_pointer_UNICODE_STRING, NDR_POINTER_UNIQUE,
2519                 "Share", hf_srvsvc_share, di->levels);
2520
2521         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2522                 hf_srvsvc_share_type, NULL);
2523
2524         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2525                 srvsvc_dissect_pointer_UNICODE_STRING, NDR_POINTER_UNIQUE,
2526                 "Comment", hf_srvsvc_comment, 0);
2527
2528         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
2529                                      hf_srvsvc_perm, NULL);
2530
2531         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
2532                                      hf_srvsvc_max_uses, NULL);
2533
2534         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
2535                                      hf_srvsvc_cur_uses, NULL);
2536
2537         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2538                 srvsvc_dissect_pointer_UNICODE_STRING,
2539                 NDR_POINTER_UNIQUE, "Path",
2540                 hf_srvsvc_path, 0);
2541
2542         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2543                 srvsvc_dissect_pointer_UNICODE_STRING,
2544                 NDR_POINTER_UNIQUE, "Passwd",
2545                 hf_srvsvc_share_passwd, 0);
2546
2547         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
2548                                      hf_srvsvc_reserved, NULL);
2549
2550         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2551                         lsa_dissect_LSA_SECURITY_DESCRIPTOR_data, NDR_POINTER_UNIQUE,
2552                         "LSA SECURITY DESCRIPTOR data:", -1, 0);
2553
2554         return offset;
2555 }
2556 static int
2557 srvsvc_dissect_SHARE_INFO_502_array(tvbuff_t *tvb, int offset,
2558                                      packet_info *pinfo, proto_tree *tree,
2559                                      char *drep)
2560 {
2561         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
2562                         srvsvc_dissect_SHARE_INFO_502);
2563
2564         return offset;
2565 }
2566
2567 /*
2568  * IDL typedef struct {
2569  * IDL   long EntriesRead;
2570  * IDL   [size_is(EntriesRead)] [unique] SHARE_INFO_502 *shares;
2571  * IDL } SHARE_INFO_502_CONTAINER;
2572  */
2573 static int
2574 srvsvc_dissect_SHARE_INFO_502_CONTAINER(tvbuff_t *tvb, int offset,
2575                                      packet_info *pinfo, proto_tree *tree,
2576                                      char *drep)
2577 {
2578         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2579                 hf_srvsvc_num_entries, NULL);
2580
2581         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2582                 srvsvc_dissect_SHARE_INFO_502_array, NDR_POINTER_UNIQUE,
2583                 "SHARE_INFO_502 array:", -1, 0);
2584
2585         return offset;
2586 }
2587
2588 /*
2589   IDL typedef struct {
2590   IDL    [unique] [string] wchar_t *comment;
2591   IDL } SHARE_INFO_1004;
2592 */
2593 static int
2594 srvsvc_dissect_SHARE_INFO_1004(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *drep)
2595 {
2596         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2597                 srvsvc_dissect_pointer_UNICODE_STRING, NDR_POINTER_UNIQUE,
2598                 "Comment", hf_srvsvc_comment, 0);
2599
2600         return offset;
2601 }
2602 static int
2603 srvsvc_dissect_SHARE_INFO_1004_array(tvbuff_t *tvb, int offset,
2604                                      packet_info *pinfo, proto_tree *tree,
2605                                      char *drep)
2606 {
2607         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
2608                         srvsvc_dissect_SHARE_INFO_1004);
2609
2610         return offset;
2611 }
2612
2613 /*
2614  * IDL typedef struct {
2615  * IDL   long EntriesRead;
2616  * IDL   [size_is(EntriesRead)] [unique] SHARE_INFO_1004 *shares;
2617  * IDL } SHARE_INFO_1004_CONTAINER;
2618  */
2619 static int
2620 srvsvc_dissect_SHARE_INFO_1004_CONTAINER(tvbuff_t *tvb, int offset,
2621                                      packet_info *pinfo, proto_tree *tree,
2622                                      char *drep)
2623 {
2624         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2625                 hf_srvsvc_num_entries, NULL);
2626
2627         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2628                 srvsvc_dissect_SHARE_INFO_1004_array, NDR_POINTER_UNIQUE,
2629                 "SHARE_INFO_1004 array:", -1, 0);
2630
2631         return offset;
2632 }
2633
2634 /*
2635   IDL typedef struct {
2636   IDL    long dfs_root_flags;
2637   IDL } SHARE_INFO_1005;
2638 */
2639 static int
2640 srvsvc_dissect_SHARE_INFO_1005(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *drep)
2641 {
2642         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
2643                                      hf_srvsvc_dfs_root_flags, NULL);
2644
2645         return offset;
2646 }
2647 static int
2648 srvsvc_dissect_SHARE_INFO_1005_array(tvbuff_t *tvb, int offset,
2649                                      packet_info *pinfo, proto_tree *tree,
2650                                      char *drep)
2651 {
2652         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
2653                         srvsvc_dissect_SHARE_INFO_1005);
2654
2655         return offset;
2656 }
2657
2658 /*
2659  * IDL typedef struct {
2660  * IDL   long EntriesRead;
2661  * IDL   [size_is(EntriesRead)] [unique] SHARE_INFO_1005 *shares;
2662  * IDL } SHARE_INFO_1005_CONTAINER;
2663  */
2664 static int
2665 srvsvc_dissect_SHARE_INFO_1005_CONTAINER(tvbuff_t *tvb, int offset,
2666                                      packet_info *pinfo, proto_tree *tree,
2667                                      char *drep)
2668 {
2669         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2670                 hf_srvsvc_num_entries, NULL);
2671
2672         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2673                 srvsvc_dissect_SHARE_INFO_1005_array, NDR_POINTER_UNIQUE,
2674                 "SHARE_INFO_1005 array:", -1, 0);
2675
2676         return offset;
2677 }
2678
2679
2680 /*
2681   IDL typedef struct {
2682   IDL    long max_uses;
2683   IDL } SHARE_INFO_1006;
2684 */
2685 static int
2686 srvsvc_dissect_SHARE_INFO_1006(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *drep)
2687 {
2688         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
2689                                      hf_srvsvc_max_uses, NULL);
2690
2691         return offset;
2692 }
2693 static int
2694 srvsvc_dissect_SHARE_INFO_1006_array(tvbuff_t *tvb, int offset,
2695                                      packet_info *pinfo, proto_tree *tree,
2696                                      char *drep)
2697 {
2698         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
2699                         srvsvc_dissect_SHARE_INFO_1006);
2700
2701         return offset;
2702 }
2703
2704 /*
2705  * IDL typedef struct {
2706  * IDL   long EntriesRead;
2707  * IDL   [size_is(EntriesRead)] [unique] SHARE_INFO_1006 *shares;
2708  * IDL } SHARE_INFO_1006_CONTAINER;
2709  */
2710 static int
2711 srvsvc_dissect_SHARE_INFO_1006_CONTAINER(tvbuff_t *tvb, int offset,
2712                                      packet_info *pinfo, proto_tree *tree,
2713                                      char *drep)
2714 {
2715         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2716                 hf_srvsvc_num_entries, NULL);
2717
2718         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2719                 srvsvc_dissect_SHARE_INFO_1006_array, NDR_POINTER_UNIQUE,
2720                 "SHARE_INFO_1006 array:", -1, 0);
2721
2722         return offset;
2723 }
2724
2725
2726 /*
2727   IDL typedef struct {
2728   IDL    long flags;
2729   IDL    [unique] [string] wchar_t *alternate_directory_name;
2730   IDL } SHARE_INFO_1007;
2731 */
2732 static int
2733 srvsvc_dissect_SHARE_INFO_1007(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *drep)
2734 {
2735         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
2736                                      hf_srvsvc_share_flags, NULL);
2737
2738         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2739                 srvsvc_dissect_pointer_UNICODE_STRING,
2740                 NDR_POINTER_UNIQUE, "Alternate Name",
2741                 hf_srvsvc_share_alternate_name, 0);
2742
2743         return offset;
2744 }
2745 static int
2746 srvsvc_dissect_SHARE_INFO_1007_array(tvbuff_t *tvb, int offset,
2747                                      packet_info *pinfo, proto_tree *tree,
2748                                      char *drep)
2749 {
2750         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
2751                         srvsvc_dissect_SHARE_INFO_1007);
2752
2753         return offset;
2754 }
2755
2756 /*
2757  * IDL typedef struct {
2758  * IDL   long EntriesRead;
2759  * IDL   [size_is(EntriesRead)] [unique] SHARE_INFO_1007 *shares;
2760  * IDL } SHARE_INFO_1007_CONTAINER;
2761  */
2762 static int
2763 srvsvc_dissect_SHARE_INFO_1007_CONTAINER(tvbuff_t *tvb, int offset,
2764                                      packet_info *pinfo, proto_tree *tree,
2765                                      char *drep)
2766 {
2767         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2768                 hf_srvsvc_num_entries, NULL);
2769
2770         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2771                 srvsvc_dissect_SHARE_INFO_1007_array, NDR_POINTER_UNIQUE,
2772                 "SHARE_INFO_1007 array:", -1, 0);
2773
2774         return offset;
2775 }
2776
2777 /*
2778   IDL typedef struct {
2779   IDL    SECDESC [unique] *securitysecriptor; 4byte-len followed by bytestring
2780   IDL } SHARE_INFO_1501;
2781 */
2782 static int
2783 srvsvc_dissect_SHARE_INFO_1501(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *drep)
2784 {
2785         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2786                         lsa_dissect_LSA_SECURITY_DESCRIPTOR_data, NDR_POINTER_UNIQUE,
2787                         "LSA SECURITY DESCRIPTOR data:", -1, 0);
2788
2789         return offset;
2790 }
2791 static int
2792 srvsvc_dissect_SHARE_INFO_1501_array(tvbuff_t *tvb, int offset,
2793                                      packet_info *pinfo, proto_tree *tree,
2794                                      char *drep)
2795 {
2796         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
2797                         srvsvc_dissect_SHARE_INFO_1501);
2798
2799         return offset;
2800 }
2801
2802 /*
2803  * IDL typedef struct {
2804  * IDL   long EntriesRead;
2805  * IDL   [size_is(EntriesRead)] [unique] SHARE_INFO_1501 *shares;
2806  * IDL } SHARE_INFO_1501_CONTAINER;
2807  */
2808 static int
2809 srvsvc_dissect_SHARE_INFO_1501_CONTAINER(tvbuff_t *tvb, int offset,
2810                                      packet_info *pinfo, proto_tree *tree,
2811                                      char *drep)
2812 {
2813         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2814                 hf_srvsvc_num_entries, NULL);
2815
2816         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2817                 srvsvc_dissect_SHARE_INFO_1501_array, NDR_POINTER_UNIQUE,
2818                 "SHARE_INFO_1501 array:", -1, 0);
2819
2820         return offset;
2821 }
2822
2823
2824 /*
2825  * IDL typedef [switch_type(long)] union {
2826  * IDL   [case(0)] [unique] SHARE_INFO_0 *share0;
2827  * IDL   [case(1)] [unique] SHARE_INFO_1 *share1;
2828  * IDL   [case(2)] [unique] SHARE_INFO_2 *share2;
2829  * IDL   [case(501)] [unique] SHARE_INFO_501 *share501;
2830  * IDL   [case(502)] [unique] SHARE_INFO_502 *share502;
2831  * IDL   [case(1004)] [unique] SHARE_INFO_1004 *share1004;
2832  * IDL   [case(1005)] [unique] SHARE_INFO_1005 *share1005;
2833  * IDL   [case(1006)] [unique] SHARE_INFO_1006 *share1006;
2834  * IDL   [case(1007)] [unique] SHARE_INFO_1007 *share1007;
2835  * IDL   [case(1501)] [unique] SHARE_INFO_1501 *share1501;
2836  * IDL } SHARE_INFO_UNION;
2837  */
2838 static int
2839 srvsvc_dissect_SHARE_INFO_UNION(tvbuff_t *tvb, int offset,
2840                                      packet_info *pinfo, proto_tree *tree,
2841                                      char *drep)
2842 {
2843         guint32 level;
2844
2845         ALIGN_TO_4_BYTES;
2846
2847         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf_srvsvc_info_level, &level);
2848
2849         switch(level){
2850         case 0:
2851                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2852                         srvsvc_dissect_SHARE_INFO_0,
2853                         NDR_POINTER_UNIQUE, "SHARE_INFO_0:",
2854                         -1, 0);
2855                 break;
2856         case 1:
2857                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2858                         srvsvc_dissect_SHARE_INFO_1,
2859                         NDR_POINTER_UNIQUE, "SHARE_INFO_1:",
2860                         -1, 0);
2861                 break;
2862         case 2:
2863                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2864                         srvsvc_dissect_SHARE_INFO_2,
2865                         NDR_POINTER_UNIQUE, "SHARE_INFO_2:",
2866                         -1, 0);
2867                 break;
2868         case 501:
2869                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2870                         srvsvc_dissect_SHARE_INFO_501,
2871                         NDR_POINTER_UNIQUE, "SHARE_INFO_501:",
2872                         -1, 0);
2873                 break;
2874         case 502:
2875                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2876                         srvsvc_dissect_SHARE_INFO_502,
2877                         NDR_POINTER_UNIQUE, "SHARE_INFO_502:",
2878                         -1, 0);
2879                 break;
2880         case 1004:
2881                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2882                         srvsvc_dissect_SHARE_INFO_1004,
2883                         NDR_POINTER_UNIQUE, "SHARE_INFO_1004:",
2884                         -1, 0);
2885                 break;
2886         case 1005:
2887                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2888                         srvsvc_dissect_SHARE_INFO_1005,
2889                         NDR_POINTER_UNIQUE, "SHARE_INFO_1005:",
2890                         -1, 0);
2891                 break;
2892         case 1006:
2893                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2894                         srvsvc_dissect_SHARE_INFO_1006,
2895                         NDR_POINTER_UNIQUE, "SHARE_INFO_1006:",
2896                         -1, 0);
2897                 break;
2898         case 1007:
2899                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2900                         srvsvc_dissect_SHARE_INFO_1007,
2901                         NDR_POINTER_UNIQUE, "SHARE_INFO_1007:",
2902                         -1, 0);
2903                 break;
2904         case 1501:
2905                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2906                         srvsvc_dissect_SHARE_INFO_1501,
2907                         NDR_POINTER_UNIQUE, "SHARE_INFO_1501:",
2908                         -1, 0);
2909                 break;
2910         }
2911
2912         return offset;
2913 }
2914
2915
2916 /*
2917  * IDL long NetrShareAdd(
2918  * IDL      [in] [string] [unique] wchar_t *ServerName,
2919  * IDL      [in] long Level,
2920  * IDL      [in] [ref] SHARE_INFO_UNION *share,
2921  * IDL      [in] [out] [unique] long *ParmError
2922  * IDL );
2923 */
2924 static int
2925 srvsvc_dissect_netrshareadd_rqst(tvbuff_t *tvb, int offset,
2926                                      packet_info *pinfo, proto_tree *tree,
2927                                      char *drep)
2928 {
2929         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2930                 srvsvc_dissect_pointer_UNICODE_STRING,
2931                 NDR_POINTER_UNIQUE, "Server",
2932                 hf_srvsvc_server, 0);
2933
2934         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
2935                         hf_srvsvc_info_level, 0);
2936
2937         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2938                 srvsvc_dissect_SHARE_INFO_UNION,
2939                 NDR_POINTER_REF, "SHARE_INFO_UNION:",
2940                 -1, 0);
2941
2942         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2943                         srvsvc_dissect_pointer_long, NDR_POINTER_UNIQUE,
2944                         "Parameter Error:", hf_srvsvc_parm_error, 0);
2945
2946         return offset;
2947 }
2948 static int
2949 srvsvc_dissect_netrshareadd_reply(tvbuff_t *tvb, int offset,
2950                                      packet_info *pinfo, proto_tree *tree,
2951                                      char *drep)
2952 {
2953         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2954                         srvsvc_dissect_pointer_long, NDR_POINTER_UNIQUE,
2955                         "Parameter Error:", hf_srvsvc_parm_error, 0);
2956
2957         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
2958                         hf_srvsvc_rc, NULL);
2959
2960         return offset;
2961 }
2962
2963
2964 /*
2965  * IDL typedef [switch_type(long)] union {
2966  * IDL   [case(0)] [unique] SHARE_INFO_0_CONTAINER *share0;
2967  * IDL   [case(1)] [unique] SHARE_INFO_1_CONTAINER *share1;
2968  * IDL   [case(2)] [unique] SHARE_INFO_2_CONTAINER *share2;
2969  * IDL   [case(501)] [unique] SHARE_INFO_501_CONTAINER *share501;
2970  * IDL   [case(502)] [unique] SHARE_INFO_502_CONTAINER *share502;
2971  * IDL   [case(1004)] [unique] SHARE_INFO_1004_CONTAINER *share1004;
2972  * IDL   [case(1005)] [unique] SHARE_INFO_1005_CONTAINER *share1005;
2973  * IDL   [case(1006)] [unique] SHARE_INFO_1006_CONTAINER *share1006;
2974  * IDL   [case(1007)] [unique] SHARE_INFO_1007_CONTAINER *share1007;
2975  * IDL   [case(1501)] [unique] SHARE_INFO_1501_CONTAINER *share1501;
2976  * IDL } SHARE_ENUM_UNION;
2977  */
2978 static int
2979 srvsvc_dissect_SHARE_ENUM_UNION(tvbuff_t *tvb, int offset,
2980                                      packet_info *pinfo, proto_tree *tree,
2981                                      char *drep)
2982 {
2983         guint32 level;
2984
2985         ALIGN_TO_4_BYTES;
2986
2987         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf_srvsvc_info_level, &level);
2988
2989         switch(level){
2990         case 0:
2991                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2992                         srvsvc_dissect_SHARE_INFO_0_CONTAINER,
2993                         NDR_POINTER_UNIQUE, "SHARE_INFO_0_CONTAINER:",
2994                         -1, 0);
2995                 break;
2996         case 1:
2997                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
2998                         srvsvc_dissect_SHARE_INFO_1_CONTAINER,
2999                         NDR_POINTER_UNIQUE, "SHARE_INFO_1_CONTAINER:",
3000                         -1, 0);
3001                 break;
3002         case 2:
3003                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3004                         srvsvc_dissect_SHARE_INFO_2_CONTAINER,
3005                         NDR_POINTER_UNIQUE, "SHARE_INFO_2_CONTAINER:",
3006                         -1, 0);
3007                 break;
3008         case 501:
3009                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3010                         srvsvc_dissect_SHARE_INFO_501_CONTAINER,
3011                         NDR_POINTER_UNIQUE, "SHARE_INFO_501_CONTAINER:",
3012                         -1, 0);
3013                 break;
3014         case 502:
3015                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3016                         srvsvc_dissect_SHARE_INFO_502_CONTAINER,
3017                         NDR_POINTER_UNIQUE, "SHARE_INFO_502_CONTAINER:",
3018                         -1, 0);
3019                 break;
3020         case 1004:
3021                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3022                         srvsvc_dissect_SHARE_INFO_1004_CONTAINER,
3023                         NDR_POINTER_UNIQUE, "SHARE_INFO_1004_CONTAINER:",
3024                         -1, 0);
3025                 break;
3026         case 1005:
3027                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3028                         srvsvc_dissect_SHARE_INFO_1005_CONTAINER,
3029                         NDR_POINTER_UNIQUE, "SHARE_INFO_1005_CONTAINER:",
3030                         -1, 0);
3031                 break;
3032         case 1006:
3033                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3034                         srvsvc_dissect_SHARE_INFO_1006_CONTAINER,
3035                         NDR_POINTER_UNIQUE, "SHARE_INFO_1006_CONTAINER:",
3036                         -1, 0);
3037                 break;
3038         case 1007:
3039                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3040                         srvsvc_dissect_SHARE_INFO_1007_CONTAINER,
3041                         NDR_POINTER_UNIQUE, "SHARE_INFO_1007_CONTAINER:",
3042                         -1, 0);
3043                 break;
3044         case 1501:
3045                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3046                         srvsvc_dissect_SHARE_INFO_1501_CONTAINER,
3047                         NDR_POINTER_UNIQUE, "SHARE_INFO_1501_CONTAINER:",
3048                         -1, 0);
3049                 break;
3050         }
3051
3052         return offset;
3053 }
3054
3055 /*
3056  * IDL typedef struct {
3057  * IDL   long Level;
3058  * IDL   SHARE_ENUM_UNION shares;
3059  * IDL } SHARE_ENUM_STRUCT;
3060  */
3061 static int
3062 srvsvc_dissect_SHARE_ENUM_STRUCT(tvbuff_t *tvb, int offset,
3063                                      packet_info *pinfo, proto_tree *tree,
3064                                      char *drep)
3065 {
3066         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3067                         hf_srvsvc_info_level, 0);
3068
3069         offset = srvsvc_dissect_SHARE_ENUM_UNION(tvb, offset, pinfo, tree, drep);
3070
3071         return offset;
3072 }
3073
3074 /*
3075  * IDL long NetrShareEnum(
3076  * IDL      [in] [string] [unique] wchar_t *ServerName,
3077  * IDL      [in] [out] [ref] SHARE_ENUM_STRUCT *share,
3078  * IDL      [in] long MaxLen,
3079  * IDL      [out] long Entries,
3080  * IDL      [in] [out] [unique] *ResumeHandle
3081  * IDL );
3082  */
3083 static int
3084 srvsvc_dissect_netrshareenum_rqst(tvbuff_t *tvb, int offset,
3085                                      packet_info *pinfo, proto_tree *tree,
3086                                      char *drep)
3087 {
3088         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3089                         srvsvc_dissect_pointer_UNICODE_STRING,
3090                         NDR_POINTER_UNIQUE, "Server",
3091                         hf_srvsvc_server, 0);
3092
3093         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3094                         srvsvc_dissect_SHARE_ENUM_STRUCT,
3095                         NDR_POINTER_REF, "Shares",
3096                         -1, 0);
3097
3098         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3099                         hf_srvsvc_preferred_len, 0);
3100
3101         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3102                         srvsvc_dissect_ENUM_HANDLE,
3103                         NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
3104
3105         return offset;
3106 }
3107
3108 static int
3109 srvsvc_dissect_netrshareenum_reply(tvbuff_t *tvb, int offset,
3110                                       packet_info *pinfo, proto_tree *tree,
3111                                       char *drep)
3112 {
3113         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3114                         srvsvc_dissect_SHARE_ENUM_STRUCT,
3115                         NDR_POINTER_REF, "Shares",
3116                         -1, 0);
3117
3118         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3119                         hf_srvsvc_num_entries, NULL);
3120
3121         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3122                         srvsvc_dissect_ENUM_HANDLE,
3123                         NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
3124
3125         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
3126                         hf_srvsvc_rc, NULL);
3127
3128         return offset;
3129 }
3130
3131 /*
3132  * IDL long NetrShareGetInfo(
3133  * IDL      [in] [string] [unique] wchar_t *ServerName,
3134  * IDL      [in] [string] [ref] wchar_t *ShareName,
3135  * IDL      [in] long Level,
3136  * IDL      [out] [ref] SHARE_INFO_UNION *share
3137  * IDL );
3138  */
3139 static int
3140 srvsvc_dissect_netrsharegetinfo_rqst(tvbuff_t *tvb, int offset,
3141                                      packet_info *pinfo, proto_tree *tree,
3142                                      char *drep)
3143 {
3144         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3145                         srvsvc_dissect_pointer_UNICODE_STRING,
3146                         NDR_POINTER_UNIQUE, "Server",
3147                         hf_srvsvc_server, 0);
3148
3149         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3150                         srvsvc_dissect_pointer_UNICODE_STRING,
3151                         NDR_POINTER_REF, "Share",
3152                         hf_srvsvc_share, 0);
3153
3154         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3155                         hf_srvsvc_info_level, 0);
3156
3157         return offset;
3158 }
3159
3160 static int
3161 srvsvc_dissect_netrsharegetinfo_reply(tvbuff_t *tvb, int offset,
3162                                       packet_info *pinfo, proto_tree *tree,
3163                                       char *drep)
3164 {
3165         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3166                         srvsvc_dissect_SHARE_INFO_UNION,
3167                         NDR_POINTER_REF, "Share",
3168                         -1, 0);
3169
3170         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
3171                         hf_srvsvc_rc, NULL);
3172
3173         return offset;
3174 }
3175
3176 /*
3177  * IDL long NetrShareSetInfo(
3178  * IDL      [in] [string] [unique] wchar_t *ServerName,
3179  * IDL      [in] [string] [ref] wchar_t *ShareName,
3180  * IDL      [in] long Level,
3181  * IDL      [in] [ref] SHARE_INFO_UNION *share
3182  * IDL      [in] [out] [unique] long *ParmError,
3183  * IDL );
3184  */
3185 static int
3186 srvsvc_dissect_netrsharesetinfo_rqst(tvbuff_t *tvb, int offset,
3187                                      packet_info *pinfo, proto_tree *tree,
3188                                      char *drep)
3189 {
3190         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3191                         srvsvc_dissect_pointer_UNICODE_STRING,
3192                         NDR_POINTER_UNIQUE, "Server",
3193                         hf_srvsvc_server, 0);
3194
3195         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3196                         srvsvc_dissect_pointer_UNICODE_STRING,
3197                         NDR_POINTER_REF, "Share",
3198                         hf_srvsvc_share, 0);
3199
3200         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3201                         hf_srvsvc_info_level, 0);
3202
3203         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3204                         srvsvc_dissect_SHARE_INFO_UNION,
3205                         NDR_POINTER_REF, "Share",
3206                         -1, 0);
3207
3208         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3209                         srvsvc_dissect_pointer_long, NDR_POINTER_UNIQUE,
3210                         "Parameter Error:", hf_srvsvc_parm_error, 0);
3211
3212         return offset;
3213 }
3214 static int
3215 srvsvc_dissect_netrsharesetinfo_reply(tvbuff_t *tvb, int offset,
3216                                      packet_info *pinfo, proto_tree *tree,
3217                                      char *drep)
3218 {
3219         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3220                         srvsvc_dissect_pointer_long, NDR_POINTER_UNIQUE,
3221                         "Parameter Error:", hf_srvsvc_parm_error, 0);
3222
3223         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
3224                         hf_srvsvc_rc, NULL);
3225
3226         return offset;
3227 }
3228
3229 /*
3230  * IDL long NetrShareDel(
3231  * IDL      [in] [string] [unique] wchar_t *ServerName,
3232  * IDL      [in] [string] [ref] wchar_t *ShareName,
3233  * IDL      [in] long Reserved,
3234  * IDL );
3235  */
3236 static int
3237 srvsvc_dissect_netrsharedel_rqst(tvbuff_t *tvb, int offset,
3238                                      packet_info *pinfo, proto_tree *tree,
3239                                      char *drep)
3240 {
3241         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3242                         srvsvc_dissect_pointer_UNICODE_STRING,
3243                         NDR_POINTER_UNIQUE, "Server",
3244                         hf_srvsvc_server, 0);
3245
3246         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3247                         srvsvc_dissect_pointer_UNICODE_STRING,
3248                         NDR_POINTER_REF, "Share",
3249                         hf_srvsvc_share, 0);
3250
3251         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
3252                                      hf_srvsvc_reserved, NULL);
3253
3254         return offset;
3255 }
3256 static int
3257 srvsvc_dissect_netrsharedel_reply(tvbuff_t *tvb, int offset,
3258                                      packet_info *pinfo, proto_tree *tree,
3259                                      char *drep)
3260 {
3261         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
3262                         hf_srvsvc_rc, NULL);
3263
3264         return offset;
3265 }
3266
3267 /*
3268  * IDL long NetrShareDelSticky(
3269  * IDL      [in] [string] [unique] wchar_t *ServerName,
3270  * IDL      [in] [string] [ref] wchar_t *ShareName,
3271  * IDL      [in] long Reserved,
3272  * IDL );
3273  */
3274 static int
3275 srvsvc_dissect_netrsharedelsticky_rqst(tvbuff_t *tvb, int offset,
3276                                      packet_info *pinfo, proto_tree *tree,
3277                                      char *drep)
3278 {
3279         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3280                         srvsvc_dissect_pointer_UNICODE_STRING,
3281                         NDR_POINTER_UNIQUE, "Server",
3282                         hf_srvsvc_server, 0);
3283
3284         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3285                         srvsvc_dissect_pointer_UNICODE_STRING,
3286                         NDR_POINTER_REF, "Share",
3287                         hf_srvsvc_share, 0);
3288
3289         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
3290                                      hf_srvsvc_reserved, NULL);
3291
3292         return offset;
3293 }
3294 static int
3295 srvsvc_dissect_netrsharedelsticky_reply(tvbuff_t *tvb, int offset,
3296                                      packet_info *pinfo, proto_tree *tree,
3297                                      char *drep)
3298 {
3299         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
3300                         hf_srvsvc_rc, NULL);
3301
3302         return offset;
3303 }
3304
3305 /*
3306  * IDL long NetrShareCheck(
3307  * IDL      [in] [string] [unique] wchar_t *ServerName,
3308  * IDL      [in] [string] [ref] wchar_t *DeviceName,
3309  * IDL      [out] long type
3310  * IDL );
3311  */
3312 static int
3313 srvsvc_dissect_netrsharecheck_rqst(tvbuff_t *tvb, int offset,
3314                                      packet_info *pinfo, proto_tree *tree,
3315                                      char *drep)
3316 {
3317         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3318                         srvsvc_dissect_pointer_UNICODE_STRING,
3319                         NDR_POINTER_UNIQUE, "Server",
3320                         hf_srvsvc_server, 0);
3321
3322         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3323                 srvsvc_dissect_pointer_UNICODE_STRING,
3324                 NDR_POINTER_UNIQUE, "Char Device",
3325                 hf_srvsvc_chrdev, 0);
3326
3327         return offset;
3328 }
3329 static int
3330 srvsvc_dissect_netrsharecheck_reply(tvbuff_t *tvb, int offset,
3331                                      packet_info *pinfo, proto_tree *tree,
3332                                      char *drep)
3333 {
3334         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3335                         hf_srvsvc_share_type, NULL);
3336
3337         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
3338                         hf_srvsvc_rc, NULL);
3339
3340         return offset;
3341 }
3342
3343 /*
3344  * IDL typedef struct {
3345  * IDL   long platform_id;
3346  * IDL   [string] [unique] wchar_t *server;
3347  * IDL } SERVER_INFO_100;
3348  */
3349 static int
3350 srvsvc_dissect_SERVER_INFO_100(tvbuff_t *tvb, int offset,
3351                                    packet_info *pinfo, proto_tree *tree,
3352                                    char *drep)
3353 {
3354         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3355                         hf_srvsvc_platform_id, NULL);
3356
3357         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3358                         srvsvc_dissect_pointer_UNICODE_STRING,
3359                         NDR_POINTER_UNIQUE, "Server",
3360                         hf_srvsvc_server, 0);
3361
3362         return offset;
3363 }
3364
3365 /*
3366  * IDL typedef struct {
3367  * IDL   long platform_id;
3368  * IDL   [string] [unique] wchar_t *server;
3369  * IDL   long ver_major;
3370  * IDL   long ver_minor;
3371  * IDL   long type;
3372  * IDL   [string] [unique] wchar_t *comment;
3373  * IDL } SERVER_INFO_101;
3374  */
3375 static int
3376 srvsvc_dissect_SERVER_INFO_101(tvbuff_t *tvb, int offset,
3377                                    packet_info *pinfo, proto_tree *tree,
3378                                    char *drep)
3379 {
3380         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3381                         hf_srvsvc_platform_id, NULL);
3382
3383         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3384                         srvsvc_dissect_pointer_UNICODE_STRING,
3385                         NDR_POINTER_UNIQUE, "Server",
3386                         hf_srvsvc_server, 0);
3387
3388         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3389                         hf_srvsvc_ver_major, NULL);
3390
3391         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3392                         hf_srvsvc_ver_minor, NULL);
3393
3394         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3395                         hf_srvsvc_server_type, NULL);
3396
3397         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3398                         srvsvc_dissect_pointer_UNICODE_STRING,
3399                         NDR_POINTER_UNIQUE, "Comment",
3400                         hf_srvsvc_comment, 0);
3401
3402         return offset;
3403 }
3404
3405 /*
3406  * IDL typedef struct {
3407  * IDL   long platform_id;
3408  * IDL   [string] [unique] wchar_t *server;
3409  * IDL   long ver_major;
3410  * IDL   long ver_minor;
3411  * IDL   long type;
3412  * IDL   [string] [unique] wchar_t *comment;
3413  * IDL   long users;
3414  * IDL   long disc;
3415  * IDL   long hidden;
3416  * IDL   long announce;
3417  * IDL   long anndelta;
3418  * IDL   long licences;
3419  * IDL   [string] [unique] wchar_t *userpath;
3420  * IDL } SERVER_INFO_102;
3421  */
3422 static int
3423 srvsvc_dissect_SERVER_INFO_102(tvbuff_t *tvb, int offset,
3424                                    packet_info *pinfo, proto_tree *tree,
3425                                    char *drep)
3426 {
3427         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3428                         hf_srvsvc_platform_id, NULL);
3429
3430         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3431                         srvsvc_dissect_pointer_UNICODE_STRING,
3432                         NDR_POINTER_UNIQUE, "Server",
3433                         hf_srvsvc_server, 0);
3434
3435         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3436                         hf_srvsvc_ver_major, NULL);
3437
3438         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3439                         hf_srvsvc_ver_minor, NULL);
3440
3441         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3442                         hf_srvsvc_server_type, NULL);
3443
3444         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3445                         srvsvc_dissect_pointer_UNICODE_STRING,
3446                         NDR_POINTER_UNIQUE, "Comment",
3447                         hf_srvsvc_comment, 0);
3448
3449         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3450                         hf_srvsvc_users, NULL);
3451
3452         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3453                         hf_srvsvc_disc, NULL);
3454
3455         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3456                         hf_srvsvc_hidden, NULL);
3457
3458         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3459                         hf_srvsvc_announce, NULL);
3460
3461         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3462                         hf_srvsvc_anndelta, NULL);
3463
3464         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3465                         hf_srvsvc_licences, NULL);
3466
3467         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3468                         srvsvc_dissect_pointer_UNICODE_STRING,
3469                         NDR_POINTER_UNIQUE, "User Path",
3470                         hf_srvsvc_user_path, 0);
3471
3472         return offset;
3473 }
3474
3475 /*
3476  * IDL typedef struct {
3477  * IDL   long ulist_mtime;
3478  * IDL   long glist_mtime;
3479  * IDL   long alist_mtime;
3480  * IDL   [string] [unique] wchar_t *alerts;
3481  * IDL   long security;
3482  * IDL   long numadmin;
3483  * IDL   long lanmask;
3484  * IDL   [string] [unique] wchar_t *guestaccount;
3485  * IDL   long chdevs;
3486  * IDL   long chdevqs;
3487  * IDL   long chdevjobs;
3488  * IDL   long connections;
3489  * IDL   long shares;
3490  * IDL   long openfiles;
3491  * IDL   long sessopens;
3492  * IDL   long sessvcs;
3493  * IDL   long sessreqs;
3494  * IDL   long opensearch;
3495  * IDL   long activelocks;
3496  * IDL   long sizreqbufs
3497  * IDL   long numbigbufs
3498  * IDL   long numfiletasks;
3499  * IDL   long alertsched;
3500  * IDL   long erroralert;
3501  * IDL   long logonalert;
3502  * IDL   long accessalert;
3503  * IDL   long diskalert;
3504  * IDL   long netioalert;
3505  * IDL   long maxauditsz;
3506  * IDL   [string] [unique] wchar_t *srvheuristics;
3507  * IDL } SERVER_INFO_402;
3508  */
3509 static int
3510 srvsvc_dissect_SERVER_INFO_402(tvbuff_t *tvb, int offset,
3511                                    packet_info *pinfo, proto_tree *tree,
3512                                    char *drep)
3513 {
3514         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3515                         hf_srvsvc_ulist_mtime, NULL);
3516
3517         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3518                         hf_srvsvc_glist_mtime, NULL);
3519
3520         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3521                         hf_srvsvc_alist_mtime, NULL);
3522
3523         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3524                         srvsvc_dissect_pointer_UNICODE_STRING,
3525                         NDR_POINTER_UNIQUE, "Alerts",
3526                         hf_srvsvc_alerts, 0);
3527
3528         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3529                         hf_srvsvc_security, NULL);
3530
3531         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3532                         hf_srvsvc_numadmin, NULL);
3533
3534         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3535                         hf_srvsvc_lanmask, NULL);
3536
3537         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3538                         srvsvc_dissect_pointer_UNICODE_STRING,
3539                         NDR_POINTER_UNIQUE, "Guest",
3540                         hf_srvsvc_guest, 0);
3541
3542         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3543                         hf_srvsvc_chdevs, NULL);
3544
3545         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3546                         hf_srvsvc_chdevqs, NULL);
3547
3548         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3549                         hf_srvsvc_chdevjobs, NULL);
3550
3551         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3552                         hf_srvsvc_connections, NULL);
3553
3554         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3555                         hf_srvsvc_shares, NULL);
3556
3557         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3558                         hf_srvsvc_openfiles, NULL);
3559
3560         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3561                         hf_srvsvc_sessopens, NULL);
3562
3563         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3564                         hf_srvsvc_sessvcs, NULL);
3565
3566         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3567                         hf_srvsvc_sessreqs, NULL);
3568
3569         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3570                         hf_srvsvc_opensearch, NULL);
3571
3572         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3573                         hf_srvsvc_activelocks, NULL);
3574
3575         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3576                         hf_srvsvc_sizreqbufs, NULL);
3577
3578         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3579                         hf_srvsvc_numbigbufs, NULL);
3580
3581         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3582                         hf_srvsvc_numfiletasks, NULL);
3583
3584         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3585                         hf_srvsvc_alertsched, NULL);
3586
3587         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3588                         hf_srvsvc_erroralert, NULL);
3589
3590         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3591                         hf_srvsvc_logonalert, NULL);
3592
3593         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3594                         hf_srvsvc_accessalert, NULL);
3595
3596         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3597                         hf_srvsvc_diskalert, NULL);
3598
3599         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3600                         hf_srvsvc_netioalert, NULL);
3601
3602         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3603                         hf_srvsvc_maxauditsz, NULL);
3604
3605         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3606                         srvsvc_dissect_pointer_UNICODE_STRING,
3607                         NDR_POINTER_UNIQUE, "Server Heuristics",
3608                         hf_srvsvc_srvheuristics, 0);
3609
3610         return offset;
3611 }
3612
3613 /*
3614  * IDL typedef struct {
3615  * IDL   long ulist_mtime;
3616  * IDL   long glist_mtime;
3617  * IDL   long alist_mtime;
3618  * IDL   [string] [unique] wchar_t *alerts;
3619  * IDL   long security;
3620  * IDL   long numadmin;
3621  * IDL   long lanmask;
3622  * IDL   [string] [unique] wchar_t *guestaccount;
3623  * IDL   long chdevs;
3624  * IDL   long chdevqs;
3625  * IDL   long chdevjobs;
3626  * IDL   long connections;
3627  * IDL   long shares;
3628  * IDL   long openfiles;
3629  * IDL   long sessopens;
3630  * IDL   long sessvcs;
3631  * IDL   long sessreqs;
3632  * IDL   long opensearch;
3633  * IDL   long activelocks;
3634  * IDL   long sizreqbufs
3635  * IDL   long numbigbufs
3636  * IDL   long numfiletasks;
3637  * IDL   long alertsched;
3638  * IDL   long erroralert;
3639  * IDL   long logonalert;
3640  * IDL   long accessalert;
3641  * IDL   long diskalert;
3642  * IDL   long netioalert;
3643  * IDL   long maxauditsz;
3644  * IDL   [string] [unique] wchar_t *srvheuristics;
3645  * IDL   long auditedevents;
3646  * IDL   long auditprofile;
3647  * IDL   [string] [unique] wchar_t *autopath;
3648  * IDL } SERVER_INFO_403;
3649  */
3650 static int
3651 srvsvc_dissect_SERVER_INFO_403(tvbuff_t *tvb, int offset,
3652                                    packet_info *pinfo, proto_tree *tree,
3653                                    char *drep)
3654 {
3655         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3656                         hf_srvsvc_ulist_mtime, NULL);
3657
3658         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3659                         hf_srvsvc_glist_mtime, NULL);
3660
3661         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3662                         hf_srvsvc_alist_mtime, NULL);
3663
3664         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3665                         srvsvc_dissect_pointer_UNICODE_STRING,
3666                         NDR_POINTER_UNIQUE, "Alerts",
3667                         hf_srvsvc_alerts, 0);
3668
3669         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3670                         hf_srvsvc_security, NULL);
3671
3672         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3673                         hf_srvsvc_numadmin, NULL);
3674
3675         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3676                         hf_srvsvc_lanmask, NULL);
3677
3678         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3679                         srvsvc_dissect_pointer_UNICODE_STRING,
3680                         NDR_POINTER_UNIQUE, "Guest",
3681                         hf_srvsvc_guest, 0);
3682
3683         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3684                         hf_srvsvc_chdevs, NULL);
3685
3686         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3687                         hf_srvsvc_chdevqs, NULL);
3688
3689         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3690                         hf_srvsvc_chdevjobs, NULL);
3691
3692         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3693                         hf_srvsvc_connections, NULL);
3694
3695         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3696                         hf_srvsvc_shares, NULL);
3697
3698         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3699                         hf_srvsvc_openfiles, NULL);
3700
3701         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3702                         hf_srvsvc_sessopens, NULL);
3703
3704         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3705                         hf_srvsvc_sessvcs, NULL);
3706
3707         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3708                         hf_srvsvc_sessreqs, NULL);
3709
3710         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3711                         hf_srvsvc_opensearch, NULL);
3712
3713         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3714                         hf_srvsvc_activelocks, NULL);
3715
3716         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3717                         hf_srvsvc_sizreqbufs, NULL);
3718
3719         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3720                         hf_srvsvc_numbigbufs, NULL);
3721
3722         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3723                         hf_srvsvc_numfiletasks, NULL);
3724
3725         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3726                         hf_srvsvc_alertsched, NULL);
3727
3728         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3729                         hf_srvsvc_erroralert, NULL);
3730
3731         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3732                         hf_srvsvc_logonalert, NULL);
3733
3734         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3735                         hf_srvsvc_accessalert, NULL);
3736
3737         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3738                         hf_srvsvc_diskalert, NULL);
3739
3740         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3741                         hf_srvsvc_netioalert, NULL);
3742
3743         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3744                         hf_srvsvc_maxauditsz, NULL);
3745
3746         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3747                         srvsvc_dissect_pointer_UNICODE_STRING,
3748                         NDR_POINTER_UNIQUE, "Server Heuristics",
3749                         hf_srvsvc_srvheuristics, 0);
3750
3751         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3752                         hf_srvsvc_auditedevents, NULL);
3753
3754         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3755                         hf_srvsvc_auditprofile, NULL);
3756
3757         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3758                         srvsvc_dissect_pointer_UNICODE_STRING,
3759                         NDR_POINTER_UNIQUE, "Autopath",
3760                         hf_srvsvc_autopath, 0);
3761
3762         return offset;
3763 }
3764
3765 /*
3766  * IDL typedef struct {
3767  * IDL   long sessopens;
3768  * IDL   long sessvcs;
3769  * IDL   long opensearch;
3770  * IDL   long sizreqbufs
3771  * IDL   long initworkitems;
3772  * IDL   long maxworkitems;
3773  * IDL   long rawworkitems;
3774  * IDL   long irpstacksize;
3775  * IDL   long maxrawbuflen;
3776  * IDL   long sessusers;
3777  * IDL   long sessconns;
3778  * IDL   long maxpagedmemoryusage;
3779  * IDL   long maxnonpagedmemoryusage;
3780  * IDL   long enablesoftcompat;
3781  * IDL   long enableforcedlogoff;
3782  * IDL   long timesource
3783  * IDL   long acceptdownlevelapis;
3784  * IDL   long lmannounce;
3785  * IDL } SERVER_INFO_502;
3786  */
3787 static int
3788 srvsvc_dissect_SERVER_INFO_502(tvbuff_t *tvb, int offset,
3789                                    packet_info *pinfo, proto_tree *tree,
3790                                    char *drep)
3791 {
3792         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3793                         hf_srvsvc_sessopens, NULL);
3794
3795         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3796                         hf_srvsvc_sessvcs, NULL);
3797
3798         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3799                         hf_srvsvc_opensearch, NULL);
3800
3801         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3802                         hf_srvsvc_sizreqbufs, NULL);
3803
3804         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3805                         hf_srvsvc_initworkitems, NULL);
3806
3807         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3808                         hf_srvsvc_maxworkitems, NULL);
3809
3810         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3811                         hf_srvsvc_rawworkitems, NULL);
3812
3813         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3814                         hf_srvsvc_irpstacksize, NULL);
3815
3816         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3817                         hf_srvsvc_maxrawbuflen, NULL);
3818
3819         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
3820                         hf_srvsvc_users, NULL);
3821
3822         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3823                         hf_srvsvc_connections, NULL);
3824
3825         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3826                         hf_srvsvc_maxpagedmemoryusage, NULL);
3827
3828         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3829                         hf_srvsvc_maxnonpagedmemoryusage, NULL);
3830
3831         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3832                         hf_srvsvc_enablesoftcompat, NULL);
3833
3834         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3835                         hf_srvsvc_enableforcedlogoff, NULL);
3836
3837         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3838                         hf_srvsvc_timesource, NULL);
3839
3840         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3841                         hf_srvsvc_acceptdownlevelapis, NULL);
3842
3843         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3844                         hf_srvsvc_lmannounce, NULL);
3845
3846         return offset;
3847 }
3848
3849 /*
3850  * IDL typedef struct {
3851  * IDL   long sessopens;
3852  * IDL   long sessvcs;
3853  * IDL   long opensearch;
3854  * IDL   long sizreqbufs
3855  * IDL   long initworkitems;
3856  * IDL   long maxworkitems;
3857  * IDL   long rawworkitems;
3858  * IDL   long irpstacksize;
3859  * IDL   long maxrawbuflen;
3860  * IDL   long sessusers;
3861  * IDL   long sessconns;
3862  * IDL   long maxpagedmemoryusage;
3863  * IDL   long maxnonpagedmemoryusage;
3864  * IDL   long enablesoftcompat;
3865  * IDL   long enableforcedlogoff;
3866  * IDL   long timesource
3867  * IDL   long acceptdownlevelapis;
3868  * IDL   long lmannounce;
3869  * IDL   [string] [unique] wchar_t *domain;
3870  * IDL   long maxcopyreadlen;
3871  * IDL   long maxcopywritelen;
3872  * IDL   long minkeepsearch;
3873  * IDL   long mankeepsearch;
3874  * IDL   long minkeepcomplsearch;
3875  * IDL   long mankeepcomplsearch;
3876  * IDL   long threadcountadd;
3877  * IDL   long numblockthreads;
3878  * IDL   long scavtimeout;
3879  * IDL   long minrcvqueue;
3880  * IDL   long minfreeworkitems;
3881  * IDL   long xactmemsize;
3882  * IDL   long threadpriority;
3883  * IDL   long maxmpxct;
3884  * IDL   long oplockbreakwait;
3885  * IDL   long oplockbreakresponsewait;
3886  * IDL   long enableoplocks;
3887  * IDL   long enableoplockforceclose
3888  * IDL   long enablefcbopens;
3889  * IDL   long enableraw;
3890  * IDL   long enablesharednetdrives;
3891  * IDL   long minfreeconnections;
3892  * IDL   long maxfreeconnections;
3893  * IDL } SERVER_INFO_503;
3894  */
3895 static int
3896 srvsvc_dissect_SERVER_INFO_503(tvbuff_t *tvb, int offset,
3897                                    packet_info *pinfo, proto_tree *tree,
3898                                    char *drep)
3899 {
3900         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3901                         hf_srvsvc_sessopens, NULL);
3902
3903         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3904                         hf_srvsvc_sessvcs, NULL);
3905
3906         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3907                         hf_srvsvc_opensearch, NULL);
3908
3909         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3910                         hf_srvsvc_sizreqbufs, NULL);
3911
3912         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3913                         hf_srvsvc_initworkitems, NULL);
3914
3915         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3916                         hf_srvsvc_maxworkitems, NULL);
3917
3918         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3919                         hf_srvsvc_rawworkitems, NULL);
3920
3921         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3922                         hf_srvsvc_irpstacksize, NULL);
3923
3924         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3925                         hf_srvsvc_maxrawbuflen, NULL);
3926
3927         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
3928                         hf_srvsvc_users, NULL);
3929
3930         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3931                         hf_srvsvc_connections, NULL);
3932
3933         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3934                         hf_srvsvc_maxpagedmemoryusage, NULL);
3935
3936         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3937                         hf_srvsvc_maxnonpagedmemoryusage, NULL);
3938
3939         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3940                         hf_srvsvc_enablesoftcompat, NULL);
3941
3942         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3943                         hf_srvsvc_enableforcedlogoff, NULL);
3944
3945         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3946                         hf_srvsvc_timesource, NULL);
3947
3948         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3949                         hf_srvsvc_acceptdownlevelapis, NULL);
3950
3951         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3952                         hf_srvsvc_lmannounce, NULL);
3953
3954         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
3955                         srvsvc_dissect_pointer_UNICODE_STRING,
3956                         NDR_POINTER_UNIQUE, "Domain",
3957                         hf_srvsvc_domain, 0);
3958
3959         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3960                         hf_srvsvc_maxcopyreadlen, NULL);
3961
3962         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3963                         hf_srvsvc_maxcopywritelen, NULL);
3964
3965         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3966                         hf_srvsvc_minkeepsearch, NULL);
3967
3968         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3969                         hf_srvsvc_maxkeepsearch, NULL);
3970
3971         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3972                         hf_srvsvc_minkeepcomplsearch, NULL);
3973
3974         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3975                         hf_srvsvc_maxkeepcomplsearch, NULL);
3976
3977         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3978                         hf_srvsvc_threadcountadd, NULL);
3979
3980         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3981                         hf_srvsvc_numblockthreads, NULL);
3982
3983         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3984                         hf_srvsvc_scavtimeout, NULL);
3985
3986         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3987                         hf_srvsvc_minrcvqueue, NULL);
3988
3989         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3990                         hf_srvsvc_minfreeworkitems, NULL);
3991
3992         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3993                         hf_srvsvc_xactmemsize, NULL);
3994
3995         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3996                         hf_srvsvc_threadpriority, NULL);
3997
3998         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
3999                         hf_srvsvc_maxmpxct, NULL);
4000
4001         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4002                         hf_srvsvc_oplockbreakwait, NULL);
4003
4004         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4005                         hf_srvsvc_oplockbreakresponsewait, NULL);
4006
4007         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4008                         hf_srvsvc_enableoplocks, NULL);
4009
4010         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4011                         hf_srvsvc_enableoplockforceclose, NULL);
4012
4013         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4014                         hf_srvsvc_enablefcbopens, NULL);
4015
4016         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4017                         hf_srvsvc_enableraw, NULL);
4018
4019         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4020                         hf_srvsvc_enablesharednetdrives, NULL);
4021
4022         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4023                         hf_srvsvc_minfreeconnections, NULL);
4024
4025         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4026                         hf_srvsvc_maxfreeconnections, NULL);
4027
4028         return offset;
4029 }
4030
4031
4032 /*
4033  * IDL typedef struct {
4034  * IDL   long sessopens;
4035  * IDL   long sessvcs;
4036  * IDL   long opensearch;
4037  * IDL   long sizreqbufs
4038  * IDL   long initworkitems;
4039  * IDL   long maxworkitems;
4040  * IDL   long rawworkitems;
4041  * IDL   long irpstacksize;
4042  * IDL   long maxrawbuflen;
4043  * IDL   long sessusers;
4044  * IDL   long sessconns;
4045  * IDL   long maxpagedmemoryusage;
4046  * IDL   long maxnonpagedmemoryusage;
4047  * IDL   long enablesoftcompat;
4048  * IDL   long enableforcedlogoff;
4049  * IDL   long timesource
4050  * IDL   long acceptdownlevelapis;
4051  * IDL   long lmannounce;
4052  * IDL   [string] [unique] wchar_t *domain;
4053  * IDL   long maxcopyreadlen;
4054  * IDL   long maxcopywritelen;
4055  * IDL   long minkeepsearch;
4056  * IDL   long mankeepsearch;
4057  * IDL   long minkeepcomplsearch;
4058  * IDL   long mankeepcomplsearch;
4059  * IDL   long threadcountadd;
4060  * IDL   long numblockthreads;
4061  * IDL   long scavtimeout;
4062  * IDL   long minrcvqueue;
4063  * IDL   long minfreeworkitems;
4064  * IDL   long xactmemsize;
4065  * IDL   long threadpriority;
4066  * IDL   long maxmpxct;
4067  * IDL   long oplockbreakwait;
4068  * IDL   long oplockbreakresponsewait;
4069  * IDL   long enableoplocks;
4070  * IDL   long enableoplockforceclose
4071  * IDL   long enablefcbopens;
4072  * IDL   long enableraw;
4073  * IDL   long enablesharednetdrives;
4074  * IDL   long minfreeconnections;
4075  * IDL   long maxfreeconnections;
4076  * IDL   long initsesstable;
4077  * IDL   long initconntable;
4078  * IDL   long initfiletable;
4079  * IDL   long initsearchtable;
4080  * IDL   long alertsched;
4081  * IDL   long errortreshold;
4082  * IDL   long networkerrortreshold;
4083  * IDL   long diskspacetreshold;
4084  * IDL   long reserved;
4085  * IDL   long maxlinkdelay;
4086  * IDL   long minlinkthroughput;
4087  * IDL   long linkinfovalidtime;
4088  * IDL   long scavqosinfoupdatetime;
4089  * IDL   long maxworkitemidletime;
4090  * IDL } SERVER_INFO_599;
4091  */
4092 static int
4093 srvsvc_dissect_SERVER_INFO_599(tvbuff_t *tvb, int offset,
4094                                    packet_info *pinfo, proto_tree *tree,
4095                                    char *drep)
4096 {
4097         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4098                         hf_srvsvc_sessopens, NULL);
4099
4100         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4101                         hf_srvsvc_sessvcs, NULL);
4102
4103         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4104                         hf_srvsvc_opensearch, NULL);
4105
4106         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4107                         hf_srvsvc_sizreqbufs, NULL);
4108
4109         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4110                         hf_srvsvc_initworkitems, NULL);
4111
4112         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4113                         hf_srvsvc_maxworkitems, NULL);
4114
4115         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4116                         hf_srvsvc_rawworkitems, NULL);
4117
4118         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4119                         hf_srvsvc_irpstacksize, NULL);
4120
4121         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4122                         hf_srvsvc_maxrawbuflen, NULL);
4123
4124         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
4125                         hf_srvsvc_users, NULL);
4126
4127         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4128                         hf_srvsvc_connections, NULL);
4129
4130         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4131                         hf_srvsvc_maxpagedmemoryusage, NULL);
4132
4133         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4134                         hf_srvsvc_maxnonpagedmemoryusage, NULL);
4135
4136         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4137                         hf_srvsvc_enablesoftcompat, NULL);
4138
4139         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4140                         hf_srvsvc_enableforcedlogoff, NULL);
4141
4142         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4143                         hf_srvsvc_timesource, NULL);
4144
4145         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4146                         hf_srvsvc_acceptdownlevelapis, NULL);
4147
4148         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4149                         hf_srvsvc_lmannounce, NULL);
4150
4151         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
4152                         srvsvc_dissect_pointer_UNICODE_STRING,
4153                         NDR_POINTER_UNIQUE, "Domain",
4154                         hf_srvsvc_domain, 0);
4155
4156         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4157                         hf_srvsvc_maxcopyreadlen, NULL);
4158
4159         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4160                         hf_srvsvc_maxcopywritelen, NULL);
4161
4162         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4163                         hf_srvsvc_minkeepsearch, NULL);
4164
4165         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4166                         hf_srvsvc_maxkeepsearch, NULL);
4167
4168         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4169                         hf_srvsvc_minkeepcomplsearch, NULL);
4170
4171         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4172                         hf_srvsvc_maxkeepcomplsearch, NULL);
4173
4174         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4175                         hf_srvsvc_threadcountadd, NULL);
4176
4177         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4178                         hf_srvsvc_numblockthreads, NULL);
4179
4180         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4181                         hf_srvsvc_scavtimeout, NULL);
4182
4183         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4184                         hf_srvsvc_minrcvqueue, NULL);
4185
4186         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4187                         hf_srvsvc_minfreeworkitems, NULL);
4188
4189         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4190                         hf_srvsvc_xactmemsize, NULL);
4191
4192         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4193                         hf_srvsvc_threadpriority, NULL);
4194
4195         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4196                         hf_srvsvc_maxmpxct, NULL);
4197
4198         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4199                         hf_srvsvc_oplockbreakwait, NULL);
4200
4201         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4202                         hf_srvsvc_oplockbreakresponsewait, NULL);
4203
4204         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4205                         hf_srvsvc_enableoplocks, NULL);
4206
4207         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4208                         hf_srvsvc_enableoplockforceclose, NULL);
4209
4210         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4211                         hf_srvsvc_enablefcbopens, NULL);
4212
4213         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4214                         hf_srvsvc_enableraw, NULL);
4215
4216         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4217                         hf_srvsvc_enablesharednetdrives, NULL);
4218
4219         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4220                         hf_srvsvc_minfreeconnections, NULL);
4221
4222         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4223                         hf_srvsvc_maxfreeconnections, NULL);
4224
4225         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4226                         hf_srvsvc_initsesstable, NULL);
4227
4228         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4229                         hf_srvsvc_initconntable, NULL);
4230
4231         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4232                         hf_srvsvc_initfiletable, NULL);
4233
4234         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4235                         hf_srvsvc_initsearchtable, NULL);
4236
4237         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4238                         hf_srvsvc_alertsched, NULL);
4239
4240         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4241                         hf_srvsvc_errortreshold, NULL);
4242
4243         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4244                         hf_srvsvc_networkerrortreshold, NULL);
4245
4246         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4247                         hf_srvsvc_diskspacetreshold, NULL);
4248
4249         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
4250                         hf_srvsvc_reserved, NULL);
4251
4252         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
4253                         hf_srvsvc_reserved, NULL);
4254
4255         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
4256                         hf_srvsvc_maxlinkdelay, NULL);
4257
4258         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
4259                         hf_srvsvc_minlinkthroughput, NULL);
4260
4261         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
4262                         hf_srvsvc_linkinfovalidtime, NULL);
4263
4264         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
4265                         hf_srvsvc_scavqosinfoupdatetime, NULL);
4266
4267         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
4268                         hf_srvsvc_maxworkitemidletime, NULL);
4269
4270         return offset;
4271 }
4272
4273 /*
4274  * IDL typedef struct {
4275  * IDL   [string] [unique] wchar_t *comment;
4276  * IDL } SERVER_INFO_1005;
4277  */
4278 static int
4279 srvsvc_dissect_SERVER_INFO_1005(tvbuff_t *tvb, int offset,
4280                                    packet_info *pinfo, proto_tree *tree,
4281                                    char *drep)
4282 {
4283         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
4284                 srvsvc_dissect_pointer_UNICODE_STRING, NDR_POINTER_UNIQUE,
4285                 "Comment", hf_srvsvc_comment, 0);
4286
4287
4288         return offset;
4289 }
4290
4291 /*
4292  * IDL typedef struct {
4293  * IDL   long disc;
4294  * IDL } SERVER_INFO_1010;
4295  */
4296 static int
4297 srvsvc_dissect_SERVER_INFO_1010(tvbuff_t *tvb, int offset,
4298                                    packet_info *pinfo, proto_tree *tree,
4299                                    char *drep)
4300 {
4301         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4302                         hf_srvsvc_disc, NULL);
4303
4304         return offset;
4305 }
4306
4307 /*
4308  * IDL typedef struct {
4309  * IDL   long hidden;
4310  * IDL } SERVER_INFO_1016;
4311  */
4312 static int
4313 srvsvc_dissect_SERVER_INFO_1016(tvbuff_t *tvb, int offset,
4314                                    packet_info *pinfo, proto_tree *tree,
4315                                    char *drep)
4316 {
4317         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4318                         hf_srvsvc_hidden, NULL);
4319
4320         return offset;
4321 }
4322
4323 /*
4324  * IDL typedef struct {
4325  * IDL   long announce;
4326  * IDL } SERVER_INFO_1017;
4327  */
4328 static int
4329 srvsvc_dissect_SERVER_INFO_1017(tvbuff_t *tvb, int offset,
4330                                    packet_info *pinfo, proto_tree *tree,
4331                                    char *drep)
4332 {
4333         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4334                         hf_srvsvc_announce, NULL);
4335
4336         return offset;
4337 }
4338
4339 /*
4340  * IDL typedef struct {
4341  * IDL   long anndelta;
4342  * IDL } SERVER_INFO_1018;
4343  */
4344 static int
4345 srvsvc_dissect_SERVER_INFO_1018(tvbuff_t *tvb, int offset,
4346                                    packet_info *pinfo, proto_tree *tree,
4347                                    char *drep)
4348 {
4349         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4350                         hf_srvsvc_anndelta, NULL);
4351
4352         return offset;
4353 }
4354
4355 /*
4356  * IDL typedef struct {
4357  * IDL   long users;
4358  * IDL } SERVER_INFO_1107;
4359  */
4360 static int
4361 srvsvc_dissect_SERVER_INFO_1107(tvbuff_t *tvb, int offset,
4362                                    packet_info *pinfo, proto_tree *tree,
4363                                    char *drep)
4364 {
4365         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4366                         hf_srvsvc_users, NULL);
4367
4368         return offset;
4369 }
4370
4371 /*
4372  * IDL typedef struct {
4373  * IDL   long sessopens;
4374  * IDL } SERVER_INFO_1501;
4375  */
4376 static int
4377 srvsvc_dissect_SERVER_INFO_1501(tvbuff_t *tvb, int offset,
4378                                    packet_info *pinfo, proto_tree *tree,
4379                                    char *drep)
4380 {
4381         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4382                         hf_srvsvc_sessopens, NULL);
4383
4384         return offset;
4385 }
4386
4387 /*
4388  * IDL typedef struct {
4389  * IDL   long sessvcs;
4390  * IDL } SERVER_INFO_1502;
4391  */
4392 static int
4393 srvsvc_dissect_SERVER_INFO_1502(tvbuff_t *tvb, int offset,
4394                                    packet_info *pinfo, proto_tree *tree,
4395                                    char *drep)
4396 {
4397         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4398                         hf_srvsvc_sessvcs, NULL);
4399
4400         return offset;
4401 }
4402
4403 /*
4404  * IDL typedef struct {
4405  * IDL   long opensearch;
4406  * IDL } SERVER_INFO_1503;
4407  */
4408 static int
4409 srvsvc_dissect_SERVER_INFO_1503(tvbuff_t *tvb, int offset,
4410                                    packet_info *pinfo, proto_tree *tree,
4411                                    char *drep)
4412 {
4413         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4414                         hf_srvsvc_opensearch, NULL);
4415
4416         return offset;
4417 }
4418
4419 /*
4420  * IDL typedef struct {
4421  * IDL   long maxworkitems;
4422  * IDL } SERVER_INFO_1506;
4423  */
4424 static int
4425 srvsvc_dissect_SERVER_INFO_1506(tvbuff_t *tvb, int offset,
4426                                    packet_info *pinfo, proto_tree *tree,
4427                                    char *drep)
4428 {
4429         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4430                         hf_srvsvc_maxworkitems, NULL);
4431
4432         return offset;
4433 }
4434
4435 /*
4436  * IDL typedef struct {
4437  * IDL   long maxrawbuflen;
4438  * IDL } SERVER_INFO_1509;
4439  */
4440 static int
4441 srvsvc_dissect_SERVER_INFO_1509(tvbuff_t *tvb, int offset,
4442                                    packet_info *pinfo, proto_tree *tree,
4443                                    char *drep)
4444 {
4445         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4446                         hf_srvsvc_maxrawbuflen, NULL);
4447
4448         return offset;
4449 }
4450
4451 /*
4452  * IDL typedef struct {
4453  * IDL   long sessusers;
4454  * IDL } SERVER_INFO_1510;
4455  */
4456 static int
4457 srvsvc_dissect_SERVER_INFO_1510(tvbuff_t *tvb, int offset,
4458                                    packet_info *pinfo, proto_tree *tree,
4459                                    char *drep)
4460 {
4461         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
4462                         hf_srvsvc_users, NULL);
4463
4464         return offset;
4465 }
4466
4467 /*
4468  * IDL typedef struct {
4469  * IDL   long sessconns;
4470  * IDL } SERVER_INFO_1511;
4471  */
4472 static int
4473 srvsvc_dissect_SERVER_INFO_1511(tvbuff_t *tvb, int offset,
4474                                    packet_info *pinfo, proto_tree *tree,
4475                                    char *drep)
4476 {
4477         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4478                         hf_srvsvc_connections, NULL);
4479
4480         return offset;
4481 }
4482
4483 /*
4484  * IDL typedef struct {
4485  * IDL   long maxnonpagedmemoryusage;
4486  * IDL } SERVER_INFO_1512;
4487  */
4488 static int
4489 srvsvc_dissect_SERVER_INFO_1512(tvbuff_t *tvb, int offset,
4490                                    packet_info *pinfo, proto_tree *tree,
4491                                    char *drep)
4492 {
4493         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4494                         hf_srvsvc_maxnonpagedmemoryusage, NULL);
4495
4496         return offset;
4497 }
4498
4499 /*
4500  * IDL typedef struct {
4501  * IDL   long maxpagedmemoryusage;
4502  * IDL } SERVER_INFO_1513;
4503  */
4504 static int
4505 srvsvc_dissect_SERVER_INFO_1513(tvbuff_t *tvb, int offset,
4506                                    packet_info *pinfo, proto_tree *tree,
4507                                    char *drep)
4508 {
4509         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4510                         hf_srvsvc_maxpagedmemoryusage, NULL);
4511
4512         return offset;
4513 }
4514
4515 /*
4516  * IDL typedef struct {
4517  * IDL   long enablesoftcompat;
4518  * IDL } SERVER_INFO_1514;
4519  */
4520 static int
4521 srvsvc_dissect_SERVER_INFO_1514(tvbuff_t *tvb, int offset,
4522                                    packet_info *pinfo, proto_tree *tree,
4523                                    char *drep)
4524 {
4525         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4526                         hf_srvsvc_enablesoftcompat, NULL);
4527
4528         return offset;
4529 }
4530
4531 /*
4532  * IDL typedef struct {
4533  * IDL   long enableforcedlogoff;
4534  * IDL } SERVER_INFO_1515;
4535  */
4536 static int
4537 srvsvc_dissect_SERVER_INFO_1515(tvbuff_t *tvb, int offset,
4538                                    packet_info *pinfo, proto_tree *tree,
4539                                    char *drep)
4540 {
4541         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4542                         hf_srvsvc_enableforcedlogoff, NULL);
4543
4544         return offset;
4545 }
4546
4547 /*
4548  * IDL typedef struct {
4549  * IDL   long timesource;
4550  * IDL } SERVER_INFO_1516;
4551  */
4552 static int
4553 srvsvc_dissect_SERVER_INFO_1516(tvbuff_t *tvb, int offset,
4554                                    packet_info *pinfo, proto_tree *tree,
4555                                    char *drep)
4556 {
4557         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4558                         hf_srvsvc_timesource, NULL);
4559
4560         return offset;
4561 }
4562
4563 /*
4564  * IDL typedef struct {
4565  * IDL   long lmannounce;
4566  * IDL } SERVER_INFO_1518;
4567  */
4568 static int
4569 srvsvc_dissect_SERVER_INFO_1518(tvbuff_t *tvb, int offset,
4570                                    packet_info *pinfo, proto_tree *tree,
4571                                    char *drep)
4572 {
4573         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4574                         hf_srvsvc_lmannounce, NULL);
4575
4576         return offset;
4577 }
4578
4579 /*
4580  * IDL typedef struct {
4581  * IDL   long maxcopyreadlen;
4582  * IDL } SERVER_INFO_1520;
4583  */
4584 static int
4585 srvsvc_dissect_SERVER_INFO_1520(tvbuff_t *tvb, int offset,
4586                                    packet_info *pinfo, proto_tree *tree,
4587                                    char *drep)
4588 {
4589         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4590                         hf_srvsvc_maxcopyreadlen, NULL);
4591
4592         return offset;
4593 }
4594
4595 /*
4596  * IDL typedef struct {
4597  * IDL   long maxcopywritelen;
4598  * IDL } SERVER_INFO_1521;
4599  */
4600 static int
4601 srvsvc_dissect_SERVER_INFO_1521(tvbuff_t *tvb, int offset,
4602                                    packet_info *pinfo, proto_tree *tree,
4603                                    char *drep)
4604 {
4605         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4606                         hf_srvsvc_maxcopywritelen, NULL);
4607
4608         return offset;
4609 }
4610
4611 /*
4612  * IDL typedef struct {
4613  * IDL   long minkeepsearch;
4614  * IDL } SERVER_INFO_1522;
4615  */
4616 static int
4617 srvsvc_dissect_SERVER_INFO_1522(tvbuff_t *tvb, int offset,
4618                                    packet_info *pinfo, proto_tree *tree,
4619                                    char *drep)
4620 {
4621         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4622                         hf_srvsvc_minkeepsearch, NULL);
4623
4624         return offset;
4625 }
4626
4627 /*
4628  * IDL typedef struct {
4629  * IDL   long maxkeepsearch;
4630  * IDL } SERVER_INFO_1523;
4631  */
4632 static int
4633 srvsvc_dissect_SERVER_INFO_1523(tvbuff_t *tvb, int offset,
4634                                    packet_info *pinfo, proto_tree *tree,
4635                                    char *drep)
4636 {
4637         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4638                         hf_srvsvc_maxkeepsearch, NULL);
4639
4640         return offset;
4641 }
4642
4643 /*
4644  * IDL typedef struct {
4645  * IDL   long minkeepcomplsearch;
4646  * IDL } SERVER_INFO_1524;
4647  */
4648 static int
4649 srvsvc_dissect_SERVER_INFO_1524(tvbuff_t *tvb, int offset,
4650                                    packet_info *pinfo, proto_tree *tree,
4651                                    char *drep)
4652 {
4653         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4654                         hf_srvsvc_minkeepcomplsearch, NULL);
4655
4656         return offset;
4657 }
4658
4659 /*
4660  * IDL typedef struct {
4661  * IDL   long maxkeepcomplsearch;
4662  * IDL } SERVER_INFO_1525;
4663  */
4664 static int
4665 srvsvc_dissect_SERVER_INFO_1525(tvbuff_t *tvb, int offset,
4666                                    packet_info *pinfo, proto_tree *tree,
4667                                    char *drep)
4668 {
4669         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4670                         hf_srvsvc_maxkeepcomplsearch, NULL);
4671
4672         return offset;
4673 }
4674
4675 /*
4676  * IDL typedef struct {
4677  * IDL   long scavtimeout;
4678  * IDL } SERVER_INFO_1528;
4679  */
4680 static int
4681 srvsvc_dissect_SERVER_INFO_1528(tvbuff_t *tvb, int offset,
4682                                    packet_info *pinfo, proto_tree *tree,
4683                                    char *drep)
4684 {
4685         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4686                         hf_srvsvc_scavtimeout, NULL);
4687
4688         return offset;
4689 }
4690
4691 /*
4692  * IDL typedef struct {
4693  * IDL   long minrcvqueue;
4694  * IDL } SERVER_INFO_1529;
4695  */
4696 static int
4697 srvsvc_dissect_SERVER_INFO_1529(tvbuff_t *tvb, int offset,
4698                                    packet_info *pinfo, proto_tree *tree,
4699                                    char *drep)
4700 {
4701         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4702                         hf_srvsvc_minrcvqueue, NULL);
4703
4704         return offset;
4705 }
4706
4707 /*
4708  * IDL typedef struct {
4709  * IDL   long minfreeworkitems;
4710  * IDL } SERVER_INFO_1530;
4711  */
4712 static int
4713 srvsvc_dissect_SERVER_INFO_1530(tvbuff_t *tvb, int offset,
4714                                    packet_info *pinfo, proto_tree *tree,
4715                                    char *drep)
4716 {
4717         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4718                         hf_srvsvc_minfreeworkitems, NULL);
4719
4720         return offset;
4721 }
4722
4723 /*
4724  * IDL typedef struct {
4725  * IDL   long maxmpxct;
4726  * IDL } SERVER_INFO_1533;
4727  */
4728 static int
4729 srvsvc_dissect_SERVER_INFO_1533(tvbuff_t *tvb, int offset,
4730                                    packet_info *pinfo, proto_tree *tree,
4731                                    char *drep)
4732 {
4733         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4734                         hf_srvsvc_maxmpxct, NULL);
4735
4736         return offset;
4737 }
4738
4739 /*
4740  * IDL typedef struct {
4741  * IDL   long oplockbreakwait;
4742  * IDL } SERVER_INFO_1534;
4743  */
4744 static int
4745 srvsvc_dissect_SERVER_INFO_1534(tvbuff_t *tvb, int offset,
4746                                    packet_info *pinfo, proto_tree *tree,
4747                                    char *drep)
4748 {
4749         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4750                         hf_srvsvc_oplockbreakwait, NULL);
4751
4752         return offset;
4753 }
4754
4755 /*
4756  * IDL typedef struct {
4757  * IDL   long oplockbreakresponsewait;
4758  * IDL } SERVER_INFO_1535;
4759  */
4760 static int
4761 srvsvc_dissect_SERVER_INFO_1535(tvbuff_t *tvb, int offset,
4762                                    packet_info *pinfo, proto_tree *tree,
4763                                    char *drep)
4764 {
4765         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4766                         hf_srvsvc_oplockbreakresponsewait, NULL);
4767
4768         return offset;
4769 }
4770
4771 /*
4772  * IDL typedef struct {
4773  * IDL   long enableoplocks;
4774  * IDL } SERVER_INFO_1536;
4775  */
4776 static int
4777 srvsvc_dissect_SERVER_INFO_1536(tvbuff_t *tvb, int offset,
4778                                    packet_info *pinfo, proto_tree *tree,
4779                                    char *drep)
4780 {
4781         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4782                         hf_srvsvc_enableoplocks, NULL);
4783
4784         return offset;
4785 }
4786
4787 /*
4788  * IDL typedef struct {
4789  * IDL   long enableoplockforceclose;
4790  * IDL } SERVER_INFO_1537;
4791  */
4792 static int
4793 srvsvc_dissect_SERVER_INFO_1537(tvbuff_t *tvb, int offset,
4794                                    packet_info *pinfo, proto_tree *tree,
4795                                    char *drep)
4796 {
4797         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4798                         hf_srvsvc_enableoplockforceclose, NULL);
4799
4800         return offset;
4801 }
4802
4803 /*
4804  * IDL typedef struct {
4805  * IDL   long enablefcbopens;
4806  * IDL } SERVER_INFO_1538;
4807  */
4808 static int
4809 srvsvc_dissect_SERVER_INFO_1538(tvbuff_t *tvb, int offset,
4810                                    packet_info *pinfo, proto_tree *tree,
4811                                    char *drep)
4812 {
4813         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4814                         hf_srvsvc_enablefcbopens, NULL);
4815
4816         return offset;
4817 }
4818
4819 /*
4820  * IDL typedef struct {
4821  * IDL   long enableraw;
4822  * IDL } SERVER_INFO_1539;
4823  */
4824 static int
4825 srvsvc_dissect_SERVER_INFO_1539(tvbuff_t *tvb, int offset,
4826                                    packet_info *pinfo, proto_tree *tree,
4827                                    char *drep)
4828 {
4829         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4830                         hf_srvsvc_enableraw, NULL);
4831
4832         return offset;
4833 }
4834
4835 /*
4836  * IDL typedef struct {
4837  * IDL   long enablesharednetdrives;
4838  * IDL } SERVER_INFO_1540;
4839  */
4840 static int
4841 srvsvc_dissect_SERVER_INFO_1540(tvbuff_t *tvb, int offset,
4842                                    packet_info *pinfo, proto_tree *tree,
4843                                    char *drep)
4844 {
4845         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4846                         hf_srvsvc_enablesharednetdrives, NULL);
4847
4848         return offset;
4849 }
4850
4851 /*
4852  * IDL typedef struct {
4853  * IDL   long minfreeconnections;
4854  * IDL } SERVER_INFO_1541;
4855  */
4856 static int
4857 srvsvc_dissect_SERVER_INFO_1541(tvbuff_t *tvb, int offset,
4858                                    packet_info *pinfo, proto_tree *tree,
4859                                    char *drep)
4860 {
4861         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4862                         hf_srvsvc_minfreeconnections, NULL);
4863
4864         return offset;
4865 }
4866
4867 /*
4868  * IDL typedef struct {
4869  * IDL   long maxfreeconnections;
4870  * IDL } SERVER_INFO_1542;
4871  */
4872 static int
4873 srvsvc_dissect_SERVER_INFO_1542(tvbuff_t *tvb, int offset,
4874                                    packet_info *pinfo, proto_tree *tree,
4875                                    char *drep)
4876 {
4877         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4878                         hf_srvsvc_maxfreeconnections, NULL);
4879
4880         return offset;
4881 }
4882
4883 /*
4884  * IDL typedef struct {
4885  * IDL   long initsesstable;
4886  * IDL } SERVER_INFO_1543;
4887  */
4888 static int
4889 srvsvc_dissect_SERVER_INFO_1543(tvbuff_t *tvb, int offset,
4890                                    packet_info *pinfo, proto_tree *tree,
4891                                    char *drep)
4892 {
4893         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4894                         hf_srvsvc_initsesstable, NULL);
4895
4896         return offset;
4897 }
4898
4899 /*
4900  * IDL typedef struct {
4901  * IDL   long initconntable;
4902  * IDL } SERVER_INFO_1544;
4903  */
4904 static int
4905 srvsvc_dissect_SERVER_INFO_1544(tvbuff_t *tvb, int offset,
4906                                    packet_info *pinfo, proto_tree *tree,
4907                                    char *drep)
4908 {
4909         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4910                         hf_srvsvc_initconntable, NULL);
4911
4912         return offset;
4913 }
4914
4915 /*
4916  * IDL typedef struct {
4917  * IDL   long initfiletable;
4918  * IDL } SERVER_INFO_1545;
4919  */
4920 static int
4921 srvsvc_dissect_SERVER_INFO_1545(tvbuff_t *tvb, int offset,
4922                                    packet_info *pinfo, proto_tree *tree,
4923                                    char *drep)
4924 {
4925         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4926                         hf_srvsvc_initfiletable, NULL);
4927
4928         return offset;
4929 }
4930
4931 /*
4932  * IDL typedef struct {
4933  * IDL   long initsearchtable;
4934  * IDL } SERVER_INFO_1546;
4935  */
4936 static int
4937 srvsvc_dissect_SERVER_INFO_1546(tvbuff_t *tvb, int offset,
4938                                    packet_info *pinfo, proto_tree *tree,
4939                                    char *drep)
4940 {
4941         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4942                         hf_srvsvc_initsearchtable, NULL);
4943
4944         return offset;
4945 }
4946
4947 /*
4948  * IDL typedef struct {
4949  * IDL   long alertsched;
4950  * IDL } SERVER_INFO_1547;
4951  */
4952 static int
4953 srvsvc_dissect_SERVER_INFO_1547(tvbuff_t *tvb, int offset,
4954                                    packet_info *pinfo, proto_tree *tree,
4955                                    char *drep)
4956 {
4957         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4958                         hf_srvsvc_alertsched, NULL);
4959
4960         return offset;
4961 }
4962
4963 /*
4964  * IDL typedef struct {
4965  * IDL   long errortreshold;
4966  * IDL } SERVER_INFO_1548;
4967  */
4968 static int
4969 srvsvc_dissect_SERVER_INFO_1548(tvbuff_t *tvb, int offset,
4970                                    packet_info *pinfo, proto_tree *tree,
4971                                    char *drep)
4972 {
4973         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4974                         hf_srvsvc_errortreshold, NULL);
4975
4976         return offset;
4977 }
4978
4979 /*
4980  * IDL typedef struct {
4981  * IDL   long networkerrortreshold;
4982  * IDL } SERVER_INFO_1549;
4983  */
4984 static int
4985 srvsvc_dissect_SERVER_INFO_1549(tvbuff_t *tvb, int offset,
4986                                    packet_info *pinfo, proto_tree *tree,
4987                                    char *drep)
4988 {
4989         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
4990                         hf_srvsvc_networkerrortreshold, NULL);
4991
4992         return offset;
4993 }
4994
4995 /*
4996  * IDL typedef struct {
4997  * IDL   long diskspacetreshold;
4998  * IDL } SERVER_INFO_1550;
4999  */
5000 static int
5001 srvsvc_dissect_SERVER_INFO_1550(tvbuff_t *tvb, int offset,
5002                                    packet_info *pinfo, proto_tree *tree,
5003                                    char *drep)
5004 {
5005         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5006                         hf_srvsvc_diskspacetreshold, NULL);
5007
5008         return offset;
5009 }
5010
5011 /*
5012  * IDL typedef struct {
5013  * IDL   long maxlinkdelay;
5014  * IDL } SERVER_INFO_1552;
5015  */
5016 static int
5017 srvsvc_dissect_SERVER_INFO_1552(tvbuff_t *tvb, int offset,
5018                                    packet_info *pinfo, proto_tree *tree,
5019                                    char *drep)
5020 {
5021         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5022                         hf_srvsvc_maxlinkdelay, NULL);
5023
5024         return offset;
5025 }
5026
5027 /*
5028  * IDL typedef struct {
5029  * IDL   long minlinkthroughput;
5030  * IDL } SERVER_INFO_1553;
5031  */
5032 static int
5033 srvsvc_dissect_SERVER_INFO_1553(tvbuff_t *tvb, int offset,
5034                                    packet_info *pinfo, proto_tree *tree,
5035                                    char *drep)
5036 {
5037         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5038                         hf_srvsvc_minlinkthroughput, NULL);
5039
5040         return offset;
5041 }
5042
5043 /*
5044  * IDL typedef struct {
5045  * IDL   long linkinfovalidtime;
5046  * IDL } SERVER_INFO_1554;
5047  */
5048 static int
5049 srvsvc_dissect_SERVER_INFO_1554(tvbuff_t *tvb, int offset,
5050                                    packet_info *pinfo, proto_tree *tree,
5051                                    char *drep)
5052 {
5053         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5054                         hf_srvsvc_linkinfovalidtime, NULL);
5055
5056         return offset;
5057 }
5058
5059 /*
5060  * IDL typedef struct {
5061  * IDL   long scavqosinfoupdatetime;
5062  * IDL } SERVER_INFO_1555;
5063  */
5064 static int
5065 srvsvc_dissect_SERVER_INFO_1555(tvbuff_t *tvb, int offset,
5066                                    packet_info *pinfo, proto_tree *tree,
5067                                    char *drep)
5068 {
5069         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5070                         hf_srvsvc_scavqosinfoupdatetime, NULL);
5071
5072         return offset;
5073 }
5074
5075 /*
5076  * IDL typedef struct {
5077  * IDL   long maxworkitemidletime;
5078  * IDL } SERVER_INFO_1556;
5079  */
5080 static int
5081 srvsvc_dissect_SERVER_INFO_1556(tvbuff_t *tvb, int offset,
5082                                    packet_info *pinfo, proto_tree *tree,
5083                                    char *drep)
5084 {
5085         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5086                         hf_srvsvc_maxworkitemidletime, NULL);
5087
5088         return offset;
5089 }
5090
5091 /*
5092  * IDL typedef [switch_type(long)] union {
5093  * IDL   [case(100)] [unique] SERVER_INFO_100 *srv100;
5094  * IDL   [case(101)] [unique] SERVER_INFO_101 *srv101;
5095  * IDL   [case(102)] [unique] SERVER_INFO_102 *srv102;
5096  * IDL   [case(402)] [unique] SERVER_INFO_402 *srv402;
5097  * IDL   [case(403)] [unique] SERVER_INFO_403 *srv403;
5098  * IDL   [case(502)] [unique] SERVER_INFO_502 *srv502;
5099  * IDL   [case(503)] [unique] SERVER_INFO_503 *srv503;
5100  * IDL   [case(599)] [unique] SERVER_INFO_599 *srv599;
5101  * IDL   [case(1005)] [unique] SERVER_INFO_1005 *srv1005;
5102  * IDL   [case(1010)] [unique] SERVER_INFO_1010 *srv1010;
5103  * IDL   [case(1016)] [unique] SERVER_INFO_1016 *srv1016;
5104  * IDL   [case(1017)] [unique] SERVER_INFO_1017 *srv1017;
5105  * IDL   [case(1018)] [unique] SERVER_INFO_1018 *srv1018;
5106  * IDL   [case(1107)] [unique] SERVER_INFO_1107 *srv1107;
5107  * IDL   [case(1501)] [unique] SERVER_INFO_1501 *srv1501;
5108  * IDL   [case(1502)] [unique] SERVER_INFO_1502 *srv1502;
5109  * IDL   [case(1503)] [unique] SERVER_INFO_1503 *srv1503;
5110  * IDL   [case(1506)] [unique] SERVER_INFO_1506 *srv1506;
5111  * IDL   [case(1509)] [unique] SERVER_INFO_1509 *srv1509;
5112  * IDL   [case(1510)] [unique] SERVER_INFO_1510 *srv1510;
5113  * IDL   [case(1511)] [unique] SERVER_INFO_1511 *srv1511;
5114  * IDL   [case(1512)] [unique] SERVER_INFO_1512 *srv1512;
5115  * IDL   [case(1513)] [unique] SERVER_INFO_1513 *srv1513;
5116  * IDL   [case(1514)] [unique] SERVER_INFO_1514 *srv1514;
5117  * IDL   [case(1515)] [unique] SERVER_INFO_1515 *srv1515;
5118  * IDL   [case(1516)] [unique] SERVER_INFO_1516 *srv1516;
5119  * IDL   [case(1518)] [unique] SERVER_INFO_1518 *srv1518;
5120  * IDL   [case(1520)] [unique] SERVER_INFO_1520 *srv1520;
5121  * IDL   [case(1521)] [unique] SERVER_INFO_1521 *srv1521;
5122  * IDL   [case(1522)] [unique] SERVER_INFO_1522 *srv1522;
5123  * IDL   [case(1523)] [unique] SERVER_INFO_1523 *srv1523;
5124  * IDL   [case(1524)] [unique] SERVER_INFO_1524 *srv1524;
5125  * IDL   [case(1525)] [unique] SERVER_INFO_1525 *srv1525;
5126  * IDL   [case(1528)] [unique] SERVER_INFO_1528 *srv1528;
5127  * IDL   [case(1529)] [unique] SERVER_INFO_1529 *srv1529;
5128  * IDL   [case(1530)] [unique] SERVER_INFO_1530 *srv1530;
5129  * IDL   [case(1533)] [unique] SERVER_INFO_1533 *srv1533;
5130  * IDL   [case(1534)] [unique] SERVER_INFO_1534 *srv1534;
5131  * IDL   [case(1535)] [unique] SERVER_INFO_1535 *srv1535;
5132  * IDL   [case(1536)] [unique] SERVER_INFO_1536 *srv1536;
5133  * IDL   [case(1537)] [unique] SERVER_INFO_1537 *srv1537;
5134  * IDL   [case(1538)] [unique] SERVER_INFO_1538 *srv1538;
5135  * IDL   [case(1539)] [unique] SERVER_INFO_1539 *srv1539;
5136  * IDL   [case(1540)] [unique] SERVER_INFO_1540 *srv1540;
5137  * IDL   [case(1541)] [unique] SERVER_INFO_1541 *srv1541;
5138  * IDL   [case(1542)] [unique] SERVER_INFO_1542 *srv1542;
5139  * IDL   [case(1543)] [unique] SERVER_INFO_1543 *srv1543;
5140  * IDL   [case(1544)] [unique] SERVER_INFO_1544 *srv1544;
5141  * IDL   [case(1545)] [unique] SERVER_INFO_1545 *srv1545;
5142  * IDL   [case(1546)] [unique] SERVER_INFO_1546 *srv1546;
5143  * IDL   [case(1547)] [unique] SERVER_INFO_1547 *srv1547;
5144  * IDL   [case(1548)] [unique] SERVER_INFO_1548 *srv1548;
5145  * IDL   [case(1549)] [unique] SERVER_INFO_1549 *srv1549;
5146  * IDL   [case(1550)] [unique] SERVER_INFO_1550 *srv1550;
5147  * IDL   [case(1552)] [unique] SERVER_INFO_1552 *srv1552;
5148  * IDL   [case(1553)] [unique] SERVER_INFO_1553 *srv1553;
5149  * IDL   [case(1554)] [unique] SERVER_INFO_1554 *srv1554;
5150  * IDL   [case(1555)] [unique] SERVER_INFO_1555 *srv1555;
5151  * IDL   [case(1556)] [unique] SERVER_INFO_1556 *srv1556;
5152  * IDL } SERVER_INFO_UNION;
5153  */
5154 static int
5155 srvsvc_dissect_SERVER_INFO_UNION(tvbuff_t *tvb, int offset,
5156                                      packet_info *pinfo, proto_tree *tree,
5157                                      char *drep)
5158 {
5159         guint32 level;
5160
5161         ALIGN_TO_4_BYTES;
5162
5163         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf_srvsvc_info_level, &level);
5164
5165         switch(level){
5166         case 100:
5167                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5168                         srvsvc_dissect_SERVER_INFO_100,
5169                         NDR_POINTER_UNIQUE, "SERVER_INFO_100:",
5170                         -1, 0);
5171                 break;
5172
5173         case 101:
5174                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5175                         srvsvc_dissect_SERVER_INFO_101,
5176                         NDR_POINTER_UNIQUE, "SERVER_INFO_101:",
5177                         -1, 0);
5178                 break;
5179
5180         case 102:
5181                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5182                         srvsvc_dissect_SERVER_INFO_102,
5183                         NDR_POINTER_UNIQUE, "SERVER_INFO_102:",
5184                         -1, 0);
5185                 break;
5186
5187         case 402:
5188                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5189                         srvsvc_dissect_SERVER_INFO_402,
5190                         NDR_POINTER_UNIQUE, "SERVER_INFO_402:",
5191                         -1, 0);
5192                 break;
5193
5194         case 403:
5195                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5196                         srvsvc_dissect_SERVER_INFO_403,
5197                         NDR_POINTER_UNIQUE, "SERVER_INFO_403:",
5198                         -1, 0);
5199                 break;
5200
5201         case 502:
5202                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5203                         srvsvc_dissect_SERVER_INFO_502,
5204                         NDR_POINTER_UNIQUE, "SERVER_INFO_502:",
5205                         -1, 0);
5206                 break;
5207
5208         case 503:
5209                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5210                         srvsvc_dissect_SERVER_INFO_503,
5211                         NDR_POINTER_UNIQUE, "SERVER_INFO_503:",
5212                         -1, 0);
5213                 break;
5214
5215         case 599:
5216                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5217                         srvsvc_dissect_SERVER_INFO_599,
5218                         NDR_POINTER_UNIQUE, "SERVER_INFO_599:",
5219                         -1, 0);
5220                 break;
5221
5222         case 1005:
5223                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5224                         srvsvc_dissect_SERVER_INFO_1005,
5225                         NDR_POINTER_UNIQUE, "SERVER_INFO_1005:",
5226                         -1, 0);
5227                 break;
5228
5229         case 1010:
5230                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5231                         srvsvc_dissect_SERVER_INFO_1010,
5232                         NDR_POINTER_UNIQUE, "SERVER_INFO_1010:",
5233                         -1, 0);
5234                 break;
5235
5236         case 1016:
5237                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5238                         srvsvc_dissect_SERVER_INFO_1016,
5239                         NDR_POINTER_UNIQUE, "SERVER_INFO_1016:",
5240                         -1, 0);
5241                 break;
5242
5243         case 1017:
5244                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5245                         srvsvc_dissect_SERVER_INFO_1017,
5246                         NDR_POINTER_UNIQUE, "SERVER_INFO_1017:",
5247                         -1, 0);
5248                 break;
5249
5250         case 1018:
5251                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5252                         srvsvc_dissect_SERVER_INFO_1018,
5253                         NDR_POINTER_UNIQUE, "SERVER_INFO_1018:",
5254                         -1, 0);
5255                 break;
5256
5257         case 1107:
5258                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5259                         srvsvc_dissect_SERVER_INFO_1107,
5260                         NDR_POINTER_UNIQUE, "SERVER_INFO_1107:",
5261                         -1, 0);
5262                 break;
5263
5264         case 1501:
5265                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5266                         srvsvc_dissect_SERVER_INFO_1501,
5267                         NDR_POINTER_UNIQUE, "SERVER_INFO_1501:",
5268                         -1, 0);
5269                 break;
5270
5271         case 1502:
5272                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5273                         srvsvc_dissect_SERVER_INFO_1502,
5274                         NDR_POINTER_UNIQUE, "SERVER_INFO_1502:",
5275                         -1, 0);
5276                 break;
5277
5278         case 1503:
5279                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5280                         srvsvc_dissect_SERVER_INFO_1503,
5281                         NDR_POINTER_UNIQUE, "SERVER_INFO_1503:",
5282                         -1, 0);
5283                 break;
5284
5285         case 1506:
5286                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5287                         srvsvc_dissect_SERVER_INFO_1506,
5288                         NDR_POINTER_UNIQUE, "SERVER_INFO_1506:",
5289                         -1, 0);
5290                 break;
5291
5292         case 1509:
5293                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5294                         srvsvc_dissect_SERVER_INFO_1509,
5295                         NDR_POINTER_UNIQUE, "SERVER_INFO_1509:",
5296                         -1, 0);
5297                 break;
5298
5299         case 1510:
5300                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5301                         srvsvc_dissect_SERVER_INFO_1510,
5302                         NDR_POINTER_UNIQUE, "SERVER_INFO_1510:",
5303                         -1, 0);
5304                 break;
5305
5306         case 1511:
5307                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5308                         srvsvc_dissect_SERVER_INFO_1511,
5309                         NDR_POINTER_UNIQUE, "SERVER_INFO_1511:",
5310                         -1, 0);
5311                 break;
5312
5313         case 1512:
5314                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5315                         srvsvc_dissect_SERVER_INFO_1512,
5316                         NDR_POINTER_UNIQUE, "SERVER_INFO_1512:",
5317                         -1, 0);
5318                 break;
5319
5320         case 1513:
5321                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5322                         srvsvc_dissect_SERVER_INFO_1513,
5323                         NDR_POINTER_UNIQUE, "SERVER_INFO_1513:",
5324                         -1, 0);
5325                 break;
5326
5327         case 1514:
5328                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5329                         srvsvc_dissect_SERVER_INFO_1514,
5330                         NDR_POINTER_UNIQUE, "SERVER_INFO_1514:",
5331                         -1, 0);
5332                 break;
5333
5334         case 1515:
5335                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5336                         srvsvc_dissect_SERVER_INFO_1515,
5337                         NDR_POINTER_UNIQUE, "SERVER_INFO_1515:",
5338                         -1, 0);
5339                 break;
5340
5341         case 1516:
5342                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5343                         srvsvc_dissect_SERVER_INFO_1516,
5344                         NDR_POINTER_UNIQUE, "SERVER_INFO_1516:",
5345                         -1, 0);
5346                 break;
5347
5348         case 1518:
5349                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5350                         srvsvc_dissect_SERVER_INFO_1518,
5351                         NDR_POINTER_UNIQUE, "SERVER_INFO_1518:",
5352                         -1, 0);
5353                 break;
5354
5355         case 1520:
5356                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5357                         srvsvc_dissect_SERVER_INFO_1520,
5358                         NDR_POINTER_UNIQUE, "SERVER_INFO_1520:",
5359                         -1, 0);
5360                 break;
5361
5362         case 1521:
5363                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5364                         srvsvc_dissect_SERVER_INFO_1521,
5365                         NDR_POINTER_UNIQUE, "SERVER_INFO_1521:",
5366                         -1, 0);
5367                 break;
5368
5369         case 1522:
5370                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5371                         srvsvc_dissect_SERVER_INFO_1522,
5372                         NDR_POINTER_UNIQUE, "SERVER_INFO_1522:",
5373                         -1, 0);
5374                 break;
5375
5376         case 1523:
5377                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5378                         srvsvc_dissect_SERVER_INFO_1523,
5379                         NDR_POINTER_UNIQUE, "SERVER_INFO_1523:",
5380                         -1, 0);
5381                 break;
5382
5383         case 1524:
5384                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5385                         srvsvc_dissect_SERVER_INFO_1524,
5386                         NDR_POINTER_UNIQUE, "SERVER_INFO_1524:",
5387                         -1, 0);
5388                 break;
5389
5390         case 1525:
5391                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5392                         srvsvc_dissect_SERVER_INFO_1525,
5393                         NDR_POINTER_UNIQUE, "SERVER_INFO_1525:",
5394                         -1, 0);
5395                 break;
5396
5397         case 1528:
5398                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5399                         srvsvc_dissect_SERVER_INFO_1528,
5400                         NDR_POINTER_UNIQUE, "SERVER_INFO_1528:",
5401                         -1, 0);
5402                 break;
5403
5404         case 1529:
5405                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5406                         srvsvc_dissect_SERVER_INFO_1529,
5407                         NDR_POINTER_UNIQUE, "SERVER_INFO_1529:",
5408                         -1, 0);
5409                 break;
5410
5411         case 1530:
5412                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5413                         srvsvc_dissect_SERVER_INFO_1530,
5414                         NDR_POINTER_UNIQUE, "SERVER_INFO_1530:",
5415                         -1, 0);
5416                 break;
5417
5418         case 1533:
5419                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5420                         srvsvc_dissect_SERVER_INFO_1533,
5421                         NDR_POINTER_UNIQUE, "SERVER_INFO_1533:",
5422                         -1, 0);
5423                 break;
5424
5425         case 1534:
5426                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5427                         srvsvc_dissect_SERVER_INFO_1534,
5428                         NDR_POINTER_UNIQUE, "SERVER_INFO_1534:",
5429                         -1, 0);
5430                 break;
5431
5432         case 1535:
5433                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5434                         srvsvc_dissect_SERVER_INFO_1535,
5435                         NDR_POINTER_UNIQUE, "SERVER_INFO_1535:",
5436                         -1, 0);
5437                 break;
5438
5439         case 1536:
5440                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5441                         srvsvc_dissect_SERVER_INFO_1536,
5442                         NDR_POINTER_UNIQUE, "SERVER_INFO_1536:",
5443                         -1, 0);
5444                 break;
5445
5446         case 1537:
5447                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5448                         srvsvc_dissect_SERVER_INFO_1537,
5449                         NDR_POINTER_UNIQUE, "SERVER_INFO_1537:",
5450                         -1, 0);
5451                 break;
5452
5453         case 1538:
5454                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5455                         srvsvc_dissect_SERVER_INFO_1538,
5456                         NDR_POINTER_UNIQUE, "SERVER_INFO_1538:",
5457                         -1, 0);
5458                 break;
5459
5460         case 1539:
5461                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5462                         srvsvc_dissect_SERVER_INFO_1539,
5463                         NDR_POINTER_UNIQUE, "SERVER_INFO_1539:",
5464                         -1, 0);
5465                 break;
5466
5467         case 1540:
5468                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5469                         srvsvc_dissect_SERVER_INFO_1540,
5470                         NDR_POINTER_UNIQUE, "SERVER_INFO_1540:",
5471                         -1, 0);
5472                 break;
5473
5474         case 1541:
5475                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5476                         srvsvc_dissect_SERVER_INFO_1541,
5477                         NDR_POINTER_UNIQUE, "SERVER_INFO_1541:",
5478                         -1, 0);
5479                 break;
5480
5481         case 1542:
5482                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5483                         srvsvc_dissect_SERVER_INFO_1542,
5484                         NDR_POINTER_UNIQUE, "SERVER_INFO_1542:",
5485                         -1, 0);
5486                 break;
5487
5488         case 1543:
5489                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5490                         srvsvc_dissect_SERVER_INFO_1543,
5491                         NDR_POINTER_UNIQUE, "SERVER_INFO_1543:",
5492                         -1, 0);
5493                 break;
5494
5495         case 1544:
5496                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5497                         srvsvc_dissect_SERVER_INFO_1544,
5498                         NDR_POINTER_UNIQUE, "SERVER_INFO_1544:",
5499                         -1, 0);
5500                 break;
5501
5502         case 1545:
5503                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5504                         srvsvc_dissect_SERVER_INFO_1545,
5505                         NDR_POINTER_UNIQUE, "SERVER_INFO_1545:",
5506                         -1, 0);
5507                 break;
5508
5509         case 1546:
5510                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5511                         srvsvc_dissect_SERVER_INFO_1546,
5512                         NDR_POINTER_UNIQUE, "SERVER_INFO_1546:",
5513                         -1, 0);
5514                 break;
5515
5516         case 1547:
5517                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5518                         srvsvc_dissect_SERVER_INFO_1547,
5519                         NDR_POINTER_UNIQUE, "SERVER_INFO_1547:",
5520                         -1, 0);
5521                 break;
5522
5523         case 1548:
5524                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5525                         srvsvc_dissect_SERVER_INFO_1548,
5526                         NDR_POINTER_UNIQUE, "SERVER_INFO_1548:",
5527                         -1, 0);
5528                 break;
5529
5530         case 1549:
5531                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5532                         srvsvc_dissect_SERVER_INFO_1549,
5533                         NDR_POINTER_UNIQUE, "SERVER_INFO_1549:",
5534                         -1, 0);
5535                 break;
5536
5537         case 1550:
5538                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5539                         srvsvc_dissect_SERVER_INFO_1550,
5540                         NDR_POINTER_UNIQUE, "SERVER_INFO_1550:",
5541                         -1, 0);
5542                 break;
5543
5544         case 1552:
5545                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5546                         srvsvc_dissect_SERVER_INFO_1552,
5547                         NDR_POINTER_UNIQUE, "SERVER_INFO_1552:",
5548                         -1, 0);
5549                 break;
5550
5551         case 1553:
5552                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5553                         srvsvc_dissect_SERVER_INFO_1553,
5554                         NDR_POINTER_UNIQUE, "SERVER_INFO_1553:",
5555                         -1, 0);
5556                 break;
5557
5558         case 1554:
5559                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5560                         srvsvc_dissect_SERVER_INFO_1554,
5561                         NDR_POINTER_UNIQUE, "SERVER_INFO_1554:",
5562                         -1, 0);
5563                 break;
5564
5565         case 1555:
5566                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5567                         srvsvc_dissect_SERVER_INFO_1555,
5568                         NDR_POINTER_UNIQUE, "SERVER_INFO_1555:",
5569                         -1, 0);
5570                 break;
5571
5572         case 1556:
5573                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5574                         srvsvc_dissect_SERVER_INFO_1556,
5575                         NDR_POINTER_UNIQUE, "SERVER_INFO_1556:",
5576                         -1, 0);
5577                 break;
5578
5579         }
5580
5581         return offset;
5582 }
5583
5584 /*
5585  * IDL long NetrServerGetInfo(
5586  * IDL      [in] [string] [unique] wchar_t *ServerName,
5587  * IDL      [in] long Level,
5588  * IDL      [out] [ref] SERVER_INFO_UNION *srv;
5589  * IDL );
5590  */
5591 static int
5592 srvsvc_dissect_netrservergetinfo_rqst(tvbuff_t *tvb, int offset,
5593                                      packet_info *pinfo, proto_tree *tree,
5594                                      char *drep)
5595 {
5596         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5597                         srvsvc_dissect_pointer_UNICODE_STRING,
5598                         NDR_POINTER_UNIQUE, "Server",
5599                         hf_srvsvc_server, 0);
5600
5601         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5602                         hf_srvsvc_info_level, 0);
5603
5604         return offset;
5605 }
5606 static int
5607 srvsvc_dissect_netrservergetinfo_reply(tvbuff_t *tvb, int offset,
5608                                      packet_info *pinfo, proto_tree *tree,
5609                                      char *drep)
5610 {
5611         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5612                         srvsvc_dissect_SERVER_INFO_UNION,
5613                         NDR_POINTER_REF, "Server Info",
5614                         -1, 0);
5615
5616         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
5617                         hf_srvsvc_rc, NULL);
5618
5619         return offset;
5620 }
5621
5622 /*
5623  * IDL long NetrServerSetInfo(
5624  * IDL      [in] [string] [unique] wchar_t *ServerName,
5625  * IDL      [in] long Level,
5626  * IDL      [in] [ref] SERVER_INFO_UNION *srv;
5627  * IDL      [in] [out] [unique] long *ParamError;
5628  * IDL );
5629  */
5630 static int
5631 srvsvc_dissect_netrserversetinfo_rqst(tvbuff_t *tvb, int offset,
5632                                      packet_info *pinfo, proto_tree *tree,
5633                                      char *drep)
5634 {
5635         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5636                         srvsvc_dissect_pointer_UNICODE_STRING,
5637                         NDR_POINTER_UNIQUE, "Server",
5638                         hf_srvsvc_server, 0);
5639
5640         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5641                         hf_srvsvc_info_level, 0);
5642
5643         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5644                         srvsvc_dissect_SERVER_INFO_UNION,
5645                         NDR_POINTER_REF, "Server Info",
5646                         -1, 0);
5647
5648         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5649                         srvsvc_dissect_pointer_long, NDR_POINTER_UNIQUE,
5650                         "Parameter Error:", hf_srvsvc_parm_error, 0);
5651
5652         return offset;
5653 }
5654 static int
5655 srvsvc_dissect_netrserversetinfo_reply(tvbuff_t *tvb, int offset,
5656                                      packet_info *pinfo, proto_tree *tree,
5657                                      char *drep)
5658 {
5659         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5660                         srvsvc_dissect_pointer_long, NDR_POINTER_UNIQUE,
5661                         "Parameter Error:", hf_srvsvc_parm_error, 0);
5662
5663         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
5664                         hf_srvsvc_rc, NULL);
5665
5666         return offset;
5667 }
5668
5669
5670 /*
5671  * IDL typedef struct {
5672  * IDL   [size_is()] [unique] wchar_t *disk;
5673  * IDL } DISK_INFO_0;
5674  */
5675 static int
5676 srvsvc_dissect_DISK_INFO_0(tvbuff_t *tvb, int offset,
5677                                      packet_info *pinfo, proto_tree *tree,
5678                                      char *drep)
5679 {
5680         guint32 len;
5681         dcerpc_info *di;
5682         int old_offset;
5683         int data16_offset;
5684         char *text;
5685
5686         di=pinfo->private_data;
5687         if(di->conformant_run){
5688                 /* this call is to make ethereal eat the array header for the conformant run */
5689                 offset =dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep, NULL);
5690
5691                 return offset;
5692         }
5693         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5694                 hf_srvsvc_disk_name_len, &len);
5695
5696         old_offset=offset;
5697         offset = prs_uint16s(tvb, offset, pinfo, tree, len, &data16_offset,
5698                         NULL);
5699         text = fake_unicode(tvb, data16_offset, len);
5700
5701         proto_tree_add_string(tree, hf_srvsvc_disk_name, tvb, old_offset,
5702                 offset-old_offset, text);
5703
5704         g_free(text);
5705         return offset;
5706 }
5707 static int
5708 srvsvc_dissect_DISK_INFO_0_array(tvbuff_t *tvb, int offset,
5709                                      packet_info *pinfo, proto_tree *tree,
5710                                      char *drep)
5711 {
5712         offset = dissect_ndr_ucvarray(tvb, offset, pinfo, tree, drep,
5713                         srvsvc_dissect_DISK_INFO_0);
5714
5715         return offset;
5716 }
5717
5718 /*
5719  * IDL typedef struct {
5720  * IDL   long EntriesRead;
5721  * IDL   [length_is(EntriesRead)] [size_is(EntriesRead)] [unique] DISK_INFO_0 *disk;
5722  * IDL } DISK_ENUM_CONTAINER;
5723  */
5724 static int
5725 srvsvc_dissect_DISK_ENUM_CONTAINER(tvbuff_t *tvb, int offset,
5726                                      packet_info *pinfo, proto_tree *tree,
5727                                      char *drep)
5728 {
5729         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5730                 hf_srvsvc_num_entries, NULL);
5731
5732         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5733                 srvsvc_dissect_DISK_INFO_0_array, NDR_POINTER_UNIQUE,
5734                 "DISK_INFO_0 array:", -1, 0);
5735
5736         return offset;
5737 }
5738
5739
5740 /*
5741  * IDL long NetrServerDiskEnum(
5742  * IDL      [in] [string] [unique] wchar_t *ServerName,
5743  * IDL      [in] long Level,
5744  * IDL      [in] [out] [ref] DISK_ENUM_CONTAINER *disk;
5745  * IDL      [in] long maxlen,
5746  * IDL      [out] long entries,
5747  * IDL      [in] [out] [unique] long *resumehandle,
5748  * IDL );
5749  */
5750 static int
5751 srvsvc_dissect_netrserverdiskenum_rqst(tvbuff_t *tvb, int offset,
5752                                      packet_info *pinfo, proto_tree *tree,
5753                                      char *drep)
5754 {
5755         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5756                         srvsvc_dissect_pointer_UNICODE_STRING,
5757                         NDR_POINTER_UNIQUE, "Server",
5758                         hf_srvsvc_server, 0);
5759
5760         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5761                         hf_srvsvc_info_level, 0);
5762
5763         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5764                         srvsvc_dissect_DISK_ENUM_CONTAINER,
5765                         NDR_POINTER_REF, "Disks",
5766                         -1, 0);
5767
5768         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5769                 hf_srvsvc_preferred_len, 0);
5770
5771         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5772                 srvsvc_dissect_ENUM_HANDLE,
5773                 NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
5774
5775         return offset;
5776 }
5777 static int
5778 srvsvc_dissect_netrserverdiskenum_reply(tvbuff_t *tvb, int offset,
5779                                      packet_info *pinfo, proto_tree *tree,
5780                                      char *drep)
5781 {
5782         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5783                         srvsvc_dissect_DISK_ENUM_CONTAINER,
5784                         NDR_POINTER_REF, "Disks",
5785                         -1, 0);
5786
5787         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5788                 hf_srvsvc_num_entries, NULL);
5789
5790         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5791                 srvsvc_dissect_ENUM_HANDLE,
5792                 NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
5793
5794         return offset;
5795 }
5796
5797 /*
5798  * IDL typedef struct {
5799  * IDL   long start;
5800  * IDL   long fopens;
5801  * IDL   long devopens;
5802  * IDL   long jobsqueued;
5803  * IDL   long sopens;
5804  * IDL   long stimeouts;
5805  * IDL   long serrorout;
5806  * IDL   long pwerrors;
5807  * IDL   long permerrors;
5808  * IDL   long syserrors;
5809  * IDL   long bytessent_low;
5810  * IDL   long bytessent_high;
5811  * IDL   long bytesrcvd_low;
5812  * IDL   long bytesrcvd_high;
5813  * IDL   long avresponse;
5814  * IDL   long reqbufneed;
5815  * IDL   long bigbufneed;
5816  * IDL } SERVER_STAT;
5817  */
5818
5819 static int
5820 srvsvc_dissect_SERVER_STAT(tvbuff_t *tvb, int offset,
5821                                      packet_info *pinfo, proto_tree *tree,
5822                                      char *drep)
5823 {
5824         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5825                 hf_srvsvc_server_stat_start, NULL);
5826
5827         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5828                 hf_srvsvc_server_stat_fopens, NULL);
5829
5830         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5831                 hf_srvsvc_server_stat_devopens, NULL);
5832
5833         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5834                 hf_srvsvc_server_stat_jobsqueued, NULL);
5835
5836         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5837                 hf_srvsvc_server_stat_sopens, NULL);
5838
5839         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5840                 hf_srvsvc_server_stat_stimeouts, NULL);
5841
5842         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5843                 hf_srvsvc_server_stat_serrorout, NULL);
5844
5845         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5846                 hf_srvsvc_server_stat_pwerrors, NULL);
5847
5848         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5849                 hf_srvsvc_server_stat_permerrors, NULL);
5850
5851         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5852                 hf_srvsvc_server_stat_syserrors, NULL);
5853
5854         offset = dissect_ndr_uint64(tvb, offset, pinfo, tree, drep,
5855                 hf_srvsvc_server_stat_bytessent, NULL);
5856
5857         offset = dissect_ndr_uint64(tvb, offset, pinfo, tree, drep,
5858                 hf_srvsvc_server_stat_bytesrcvd, NULL);
5859
5860         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5861                 hf_srvsvc_server_stat_avresponse, NULL);
5862
5863         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5864                 hf_srvsvc_server_stat_reqbufneed, NULL);
5865
5866         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5867                 hf_srvsvc_server_stat_bigbufneed, NULL);
5868
5869         return offset;
5870 }
5871
5872 /*
5873  * IDL long NetrServerStatisticsGet(
5874  * IDL      [in] [string] [unique] wchar_t *ServerName,
5875  * IDL      [in] [string] [unique] wchar_t *Service,
5876  * IDL      [in] long Level,
5877  * IDL      [in] long Options,
5878  * IDL      [out] [ref] SERVER_STAT *stat
5879  * IDL );
5880  */
5881 static int
5882 srvsvc_dissect_netrserverstatisticsget_rqst(tvbuff_t *tvb, int offset,
5883                                      packet_info *pinfo, proto_tree *tree,
5884                                      char *drep)
5885 {
5886         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5887                         srvsvc_dissect_pointer_UNICODE_STRING,
5888                         NDR_POINTER_UNIQUE, "Server",
5889                         hf_srvsvc_server, 0);
5890
5891         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5892                         srvsvc_dissect_pointer_UNICODE_STRING,
5893                         NDR_POINTER_UNIQUE, "Service",
5894                         hf_srvsvc_service, 0);
5895
5896         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5897                 hf_srvsvc_info_level, 0);
5898
5899         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5900                 hf_srvsvc_service_options, 0);
5901
5902         return offset;
5903 }
5904 static int
5905 srvsvc_dissect_netrserverstatisticsget_reply(tvbuff_t *tvb, int offset,
5906                                      packet_info *pinfo, proto_tree *tree,
5907                                      char *drep)
5908 {
5909         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5910                         srvsvc_dissect_SERVER_STAT,
5911                         NDR_POINTER_REF, "Stat",
5912                         -1, 0);
5913
5914         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
5915                         hf_srvsvc_rc, NULL);
5916
5917         return offset;
5918 }
5919
5920 /*
5921  * IDL typedef struct {
5922  * IDL   [size_is(transportaddresslen)] char transportaddress;
5923  * IDL } TRANSPORT_ADDRESS;
5924  */
5925 static int
5926 srvsvc_dissect_TRANSPORT_ADDRESS(tvbuff_t *tvb, int offset,
5927                                      packet_info *pinfo, proto_tree *tree,
5928                                      char *drep)
5929 {
5930         dcerpc_info *di;
5931         guint32 len;
5932
5933         di=pinfo->private_data;
5934         if(di->conformant_run){
5935                 /*just a run to handle conformant arrays, nothing to dissect */
5936                 return offset;
5937         }
5938
5939         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5940                 hf_srvsvc_transport_address_len, &len);
5941
5942         proto_tree_add_item(tree, hf_srvsvc_transport_address, tvb, offset,
5943                 len, FALSE);
5944         offset += len;
5945
5946         return offset;
5947 }
5948
5949 /*
5950  * IDL typedef struct {
5951  * IDL   long numberofvcs;
5952  * IDL   [string] [unique] transportname;
5953  * IDL   [unique] TRANSPORT_ADDRESS *transportaddress;
5954  * IDL   long transportaddresslen;
5955  * IDL   [string] [unique] wchar_t *networkaddress;
5956  * IDL } TRANSPORT_INFO_0;
5957  */
5958 static int
5959 srvsvc_dissect_TRANSPORT_INFO_0(tvbuff_t *tvb, int offset,
5960                                      packet_info *pinfo, proto_tree *tree,
5961                                      char *drep)
5962 {
5963         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5964                         hf_srvsvc_transport_numberofvcs, 0);
5965
5966         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5967                         srvsvc_dissect_pointer_UNICODE_STRING,
5968                         NDR_POINTER_UNIQUE, "Name",
5969                         hf_srvsvc_transport_name, 0);
5970
5971         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5972                         srvsvc_dissect_TRANSPORT_ADDRESS,
5973                         NDR_POINTER_UNIQUE, "Transport Address",
5974                         -1, 0);
5975
5976         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
5977                         hf_srvsvc_transport_address_len, 0);
5978
5979         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
5980                         srvsvc_dissect_pointer_UNICODE_STRING,
5981                         NDR_POINTER_UNIQUE, "Network Address",
5982                         hf_srvsvc_transport_networkaddress, 0);
5983
5984         return offset;
5985 }
5986 static int
5987 srvsvc_dissect_TRANSPORT_INFO_0_array(tvbuff_t *tvb, int offset,
5988                                      packet_info *pinfo, proto_tree *tree,
5989                                      char *drep)
5990 {
5991         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
5992                         srvsvc_dissect_TRANSPORT_INFO_0);
5993
5994         return offset;
5995 }
5996
5997 /*
5998  * IDL typedef struct {
5999  * IDL   long EntriesRead;
6000  * IDL   [size_is(EntriesRead)] [unique] TRANSPORT_INFO_0 *trans;
6001  * IDL } SERVER_XPORT_INFO_0_CONTAINER;
6002  */
6003 static int
6004 srvsvc_dissect_SERVER_XPORT_INFO_0_CONTAINER(tvbuff_t *tvb, int offset,
6005                                      packet_info *pinfo, proto_tree *tree,
6006                                      char *drep)
6007 {
6008         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6009                 hf_srvsvc_num_entries, NULL);
6010
6011         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6012                 srvsvc_dissect_TRANSPORT_INFO_0_array, NDR_POINTER_UNIQUE,
6013                 "TRANSPORT_INFO_0 array:", -1, 0);
6014
6015         return offset;
6016 }
6017
6018 /*
6019  * IDL typedef struct {
6020  * IDL   long numberofvcs;
6021  * IDL   [string] [unique] transportname;
6022  * IDL   [unique] TRANSPORT_ADDRESS *transportaddress;
6023  * IDL   long transportaddresslen;
6024  * IDL   [string] [unique] wchar_t *networkaddress;
6025  * IDL } TRANSPORT_INFO_1;
6026  */
6027 static int
6028 srvsvc_dissect_TRANSPORT_INFO_1(tvbuff_t *tvb, int offset,
6029                                      packet_info *pinfo, proto_tree *tree,
6030                                      char *drep)
6031 {
6032         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6033                 hf_srvsvc_transport_numberofvcs, 0);
6034
6035         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6036                 srvsvc_dissect_pointer_UNICODE_STRING,
6037                 NDR_POINTER_UNIQUE, "Name",
6038                 hf_srvsvc_transport_name, 0);
6039
6040         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6041                         srvsvc_dissect_TRANSPORT_ADDRESS,
6042                         NDR_POINTER_UNIQUE, "Transport Address",
6043                         -1, 0);
6044
6045         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6046                 hf_srvsvc_transport_address_len, 0);
6047
6048         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6049                 srvsvc_dissect_pointer_UNICODE_STRING,
6050                 NDR_POINTER_UNIQUE, "Network Address",
6051                 hf_srvsvc_transport_networkaddress, 0);
6052
6053         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6054                         srvsvc_dissect_pointer_UNICODE_STRING,
6055                         NDR_POINTER_UNIQUE, "Domain",
6056                         hf_srvsvc_domain, 0);
6057
6058         return offset;
6059 }
6060 static int
6061 srvsvc_dissect_TRANSPORT_INFO_1_array(tvbuff_t *tvb, int offset,
6062                                      packet_info *pinfo, proto_tree *tree,
6063                                      char *drep)
6064 {
6065         offset = dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep,
6066                         srvsvc_dissect_TRANSPORT_INFO_1);
6067
6068         return offset;
6069 }
6070
6071 /*
6072  * IDL typedef struct {
6073  * IDL   long EntriesRead;
6074  * IDL   [size_is(EntriesRead)] [unique] TRANSPORT_INFO_1 *trans;
6075  * IDL } SERVER_XPORT_INFO_1_CONTAINER;
6076  */
6077 static int
6078 srvsvc_dissect_SERVER_XPORT_INFO_1_CONTAINER(tvbuff_t *tvb, int offset,
6079                                      packet_info *pinfo, proto_tree *tree,
6080                                      char *drep)
6081 {
6082         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6083                 hf_srvsvc_num_entries, NULL);
6084
6085         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6086                 srvsvc_dissect_TRANSPORT_INFO_1_array, NDR_POINTER_UNIQUE,
6087                 "TRANSPORT_INFO_1 array:", -1, 0);
6088
6089         return offset;
6090 }
6091
6092
6093 /*
6094  * IDL typedef [switch_type(long)] union {
6095  * IDL   [case(0)] [unique] SERVER_XPORT_INFO_0_CONTAINER *xp0;
6096  * IDL   [case(1)] [unique] SERVER_XPORT_INFO_1_CONTAINER *xp1;
6097  * IDL } SERVER_XPORT_ENUM_UNION;
6098  */
6099 static int
6100 srvsvc_dissect_SERVER_XPORT_ENUM_UNION(tvbuff_t *tvb, int offset,
6101                                      packet_info *pinfo, proto_tree *tree,
6102                                      char *drep)
6103 {
6104         guint32 level;
6105
6106         ALIGN_TO_4_BYTES;
6107
6108         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep, hf_srvsvc_info_level, &level);
6109
6110         switch(level){
6111         case 0:
6112                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6113                         srvsvc_dissect_SERVER_XPORT_INFO_0_CONTAINER,
6114                         NDR_POINTER_UNIQUE, "SERVER_XPORT_INFO_0_CONTAINER:",
6115                         -1, 0);
6116                 break;
6117         case 1:
6118                 offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6119                         srvsvc_dissect_SERVER_XPORT_INFO_1_CONTAINER,
6120                         NDR_POINTER_UNIQUE, "SERVER_XPORT_INFO_1_CONTAINER:",
6121                         -1, 0);
6122                 break;
6123         }
6124
6125         return offset;
6126 }
6127
6128 /*
6129  * IDL typedef struct {
6130  * IDL   long Level;
6131  * IDL   SERVER_XPORT_ENUM_UNION xport;
6132  * IDL } SERVER_XPORT_ENUM_STRUCT;
6133  */
6134 static int
6135 srvsvc_dissect_SERVER_XPORT_ENUM_STRUCT(tvbuff_t *tvb, int offset,
6136                                      packet_info *pinfo, proto_tree *tree,
6137                                      char *drep)
6138 {
6139         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6140                         hf_srvsvc_info_level, 0);
6141
6142         offset = srvsvc_dissect_SERVER_XPORT_ENUM_UNION(tvb, offset,
6143                         pinfo, tree, drep);
6144
6145         return offset;
6146 }
6147
6148
6149 /*
6150  * IDL long NetrServerTransportAdd(
6151  * IDL      [in] [string] [unique] wchar_t *ServerName,
6152  * IDL      [in] long Level,
6153  * IDL      [in] [ref] TRANSPORT_INFO_0 *trans;
6154  * IDL );
6155  */
6156 static int
6157 srvsvc_dissect_netrservertransportadd_rqst(tvbuff_t *tvb, int offset,
6158                                      packet_info *pinfo, proto_tree *tree,
6159                                      char *drep)
6160 {
6161         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6162                         srvsvc_dissect_pointer_UNICODE_STRING,
6163                         NDR_POINTER_UNIQUE, "Server",
6164                         hf_srvsvc_server, 0);
6165
6166         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6167                 hf_srvsvc_info_level, 0);
6168
6169         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6170                         srvsvc_dissect_TRANSPORT_INFO_0,
6171                         NDR_POINTER_REF, "Transports",
6172                         -1, 0);
6173
6174         return offset;
6175 }
6176 static int
6177 srvsvc_dissect_netrservertransportadd_reply(tvbuff_t *tvb, int offset,
6178                                      packet_info *pinfo, proto_tree *tree,
6179                                      char *drep)
6180 {
6181         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6182                         hf_srvsvc_rc, NULL);
6183
6184         return offset;
6185 }
6186
6187 /*
6188  * IDL long NetrServerTransportEnum(
6189  * IDL      [in] [string] [unique] wchar_t *ServerName,
6190  * IDL      [in] [out] [ref] SERVER_XPORT_ENUM_STRUCT *xport;
6191  * IDL      [in] long MaxLen,
6192  * IDL      [out] long entries,
6193  * IDL      [in] [out] [unique] long *resumehandle;
6194  * IDL );
6195  */
6196 static int
6197 srvsvc_dissect_netrservertransportenum_rqst(tvbuff_t *tvb, int offset,
6198                                      packet_info *pinfo, proto_tree *tree,
6199                                      char *drep)
6200 {
6201         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6202                         srvsvc_dissect_pointer_UNICODE_STRING,
6203                         NDR_POINTER_UNIQUE, "Server",
6204                         hf_srvsvc_server, 0);
6205
6206         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6207                         srvsvc_dissect_SERVER_XPORT_ENUM_STRUCT,
6208                         NDR_POINTER_REF, "Transports",
6209                         -1, 0);
6210
6211         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6212                 hf_srvsvc_preferred_len, 0);
6213
6214         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6215                 srvsvc_dissect_ENUM_HANDLE,
6216                 NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
6217
6218         return offset;
6219 }
6220 static int
6221 srvsvc_dissect_netrservertransportenum_reply(tvbuff_t *tvb, int offset,
6222                                      packet_info *pinfo, proto_tree *tree,
6223                                      char *drep)
6224 {
6225         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6226                         srvsvc_dissect_SERVER_XPORT_ENUM_STRUCT,
6227                         NDR_POINTER_REF, "Transports",
6228                         -1, 0);
6229
6230         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6231                 hf_srvsvc_num_entries, NULL);
6232
6233         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6234                         srvsvc_dissect_ENUM_HANDLE,
6235                         NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
6236
6237         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6238                         hf_srvsvc_rc, NULL);
6239
6240         return offset;
6241 }
6242
6243
6244 /*
6245  * IDL long NetrServerTransportDel(
6246  * IDL      [in] [string] [unique] wchar_t *ServerName,
6247  * IDL      [in] long Level,
6248  * IDL      [in] [ref] TRANSPORT_INFO_0 *trans;
6249  * IDL );
6250  */
6251 static int
6252 srvsvc_dissect_netrservertransportdel_rqst(tvbuff_t *tvb, int offset,
6253                                      packet_info *pinfo, proto_tree *tree,
6254                                      char *drep)
6255 {
6256         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6257                         srvsvc_dissect_pointer_UNICODE_STRING,
6258                         NDR_POINTER_UNIQUE, "Server",
6259                         hf_srvsvc_server, 0);
6260
6261         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6262                 hf_srvsvc_info_level, 0);
6263
6264         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6265                         srvsvc_dissect_TRANSPORT_INFO_0,
6266                         NDR_POINTER_REF, "Transports",
6267                         -1, 0);
6268
6269         return offset;
6270 }
6271 static int
6272 srvsvc_dissect_netrservertransportdel_reply(tvbuff_t *tvb, int offset,
6273                                      packet_info *pinfo, proto_tree *tree,
6274                                      char *drep)
6275 {
6276         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6277                         hf_srvsvc_rc, NULL);
6278
6279         return offset;
6280 }
6281
6282 /*
6283  * IDL typedef struct {
6284  * IDL   long elapsed;
6285  * IDL   long msecs;
6286  * IDL   long hours;
6287  * IDL   long mins;
6288  * IDL   long secs;
6289  * IDL   long hunds;
6290  * IDL   long timezone;
6291  * IDL   long tinterval;
6292  * IDL   long day;
6293  * IDL   long month;
6294  * IDL   long year;
6295  * IDL   long weekday;
6296  * IDL } TIMEOFDAY;
6297  */
6298 static int
6299 srvsvc_dissect_TIMEOFDAY(tvbuff_t *tvb, int offset,
6300                                      packet_info *pinfo, proto_tree *tree,
6301                                      char *drep)
6302 {
6303         /*
6304          * XXX - is "hf_srvsvc_tod_elapsed" something that should be
6305          * processed by "add_abstime_absent_unknown()" from
6306          * "packet-smb-pipe.c"?  This structure looks similar
6307          * to the result of a NetRemoteTOD RAP call, and that has
6308          * a "current time" field that's processed by
6309          * "add_abstime_absent_unknown()".
6310          *
6311          * Should other fields, such as the time zone offset and
6312          * the time interval, be processed as they are for
6313          * "lm_data_resp_netremotetod_nolevel" as well?
6314          */
6315         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6316                 hf_srvsvc_tod_elapsed, NULL);
6317         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6318                 hf_srvsvc_tod_msecs, NULL);
6319         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6320                 hf_srvsvc_tod_hours, NULL);
6321         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6322                 hf_srvsvc_tod_mins, NULL);
6323         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6324                 hf_srvsvc_tod_secs, NULL);
6325         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6326                 hf_srvsvc_tod_hunds, NULL);
6327         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6328                 hf_srvsvc_tod_timezone, NULL);
6329         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6330                 hf_srvsvc_tod_tinterval, NULL);
6331         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6332                 hf_srvsvc_tod_day, NULL);
6333         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6334                 hf_srvsvc_tod_month, NULL);
6335         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6336                 hf_srvsvc_tod_year, NULL);
6337         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6338                 hf_srvsvc_tod_weekday, NULL);
6339
6340         return offset;
6341 }
6342
6343 /*
6344  * IDL long NetrRemoteTOD(
6345  * IDL      [in] [string] [unique] wchar_t *ServerName,
6346  * IDL      [out] [unique] TIMEOFDAY *t
6347  * IDL );
6348  */
6349 static int
6350 srvsvc_dissect_netrremotetod_rqst(tvbuff_t *tvb, int offset,
6351                                      packet_info *pinfo, proto_tree *tree,
6352                                      char *drep)
6353 {
6354         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6355                         srvsvc_dissect_pointer_UNICODE_STRING,
6356                         NDR_POINTER_UNIQUE, "Server",
6357                         hf_srvsvc_server, 0);
6358
6359         return offset;
6360 }
6361 static int
6362 srvsvc_dissect_netrremotetod_reply(tvbuff_t *tvb, int offset,
6363                                      packet_info *pinfo, proto_tree *tree,
6364                                      char *drep)
6365 {
6366         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6367                         srvsvc_dissect_TIMEOFDAY,
6368                         NDR_POINTER_UNIQUE, "Time of day",
6369                         -1, 0);
6370
6371         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6372                         hf_srvsvc_rc, NULL);
6373
6374         return offset;
6375 }
6376
6377 /*
6378  * IDL long NetrSetServerServiceBits(
6379  * IDL      [in] [string] [unique] wchar_t *ServerName,
6380  * IDL      [in] [string] [unique] wchar_t *Transport,
6381  * IDL      [in] long ServiceBits;
6382  * IDL      [in] long UpdateImmediately;
6383  * IDL );
6384  */
6385 static int
6386 srvsvc_dissect_netrsetserverservicebits_rqst(tvbuff_t *tvb, int offset,
6387                                      packet_info *pinfo, proto_tree *tree,
6388                                      char *drep)
6389 {
6390         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6391                         srvsvc_dissect_pointer_UNICODE_STRING,
6392                         NDR_POINTER_UNIQUE, "Server",
6393                         hf_srvsvc_server, 0);
6394
6395         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6396                 srvsvc_dissect_pointer_UNICODE_STRING,
6397                 NDR_POINTER_UNIQUE, "Transport:",
6398                 hf_srvsvc_transport, 0);
6399
6400         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6401                 hf_srvsvc_service_bits, NULL);
6402
6403         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6404                 hf_srvsvc_update_immediately, NULL);
6405
6406         return offset;
6407 }
6408 static int
6409 srvsvc_dissect_netrsetserverservicebits_reply(tvbuff_t *tvb, int offset,
6410                                      packet_info *pinfo, proto_tree *tree,
6411                                      char *drep)
6412 {
6413         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6414                         hf_srvsvc_rc, NULL);
6415
6416         return offset;
6417 }
6418
6419 /*
6420  * IDL long NetrPathType(
6421  * IDL      [in] [string] [unique] wchar_t *ServerName,
6422  * IDL      [in] [string] [ref] wchar_t *PathName,
6423  * IDL      [in] long PathFlags;
6424  * IDL      [out] long PathType;
6425  * IDL );
6426  */
6427 static int
6428 srvsvc_dissect_netrpathtype_rqst(tvbuff_t *tvb, int offset,
6429                                      packet_info *pinfo, proto_tree *tree,
6430                                      char *drep)
6431 {
6432         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6433                         srvsvc_dissect_pointer_UNICODE_STRING,
6434                         NDR_POINTER_UNIQUE, "Server",
6435                         hf_srvsvc_server, 0);
6436
6437         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6438                         srvsvc_dissect_pointer_UNICODE_STRING,
6439                         NDR_POINTER_REF, "Path:",
6440                         hf_srvsvc_path, 0);
6441
6442         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6443                         hf_srvsvc_path_flags, NULL);
6444
6445         return offset;
6446 }
6447 static int
6448 srvsvc_dissect_netrpathtype_reply(tvbuff_t *tvb, int offset,
6449                                      packet_info *pinfo, proto_tree *tree,
6450                                      char *drep)
6451 {
6452         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6453                         hf_srvsvc_path_type, NULL);
6454
6455         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6456                         hf_srvsvc_rc, NULL);
6457
6458         return offset;
6459 }
6460
6461 /*
6462  * IDL long NetrPathCanonicalize(
6463  * IDL      [in] [string] [unique] wchar_t *ServerName,
6464  * IDL      [in] [string] [ref] wchar_t *PathName,
6465  * IDL      [in] long OutBufLen;
6466  * IDL      [in] [string] [ref] wchar_t *Prefix,
6467  * IDL      [in] [out] [ref] long *PathType;
6468  * IDL      [in] long PathFlags;
6469  * IDL );
6470  */
6471 static int
6472 srvsvc_dissect_netrpathcanonicalize_rqst(tvbuff_t *tvb, int offset,
6473                                      packet_info *pinfo, proto_tree *tree,
6474                                      char *drep)
6475 {
6476         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6477                         srvsvc_dissect_pointer_UNICODE_STRING,
6478                         NDR_POINTER_UNIQUE, "Server",
6479                         hf_srvsvc_server, 0);
6480
6481         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6482                         srvsvc_dissect_pointer_UNICODE_STRING,
6483                         NDR_POINTER_REF, "Path:",
6484                         hf_srvsvc_path, 0);
6485
6486         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6487                         hf_srvsvc_outbuflen, NULL);
6488
6489         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6490                         srvsvc_dissect_pointer_UNICODE_STRING,
6491                         NDR_POINTER_REF, "Prefix:",
6492                         hf_srvsvc_prefix, 0);
6493
6494         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6495                         hf_srvsvc_path_type, NULL);
6496
6497         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6498                         hf_srvsvc_path_flags, NULL);
6499
6500         return offset;
6501 }
6502 static int
6503 srvsvc_dissect_netrpathcanonicalize_reply(tvbuff_t *tvb, int offset,
6504                                      packet_info *pinfo, proto_tree *tree,
6505                                      char *drep)
6506 {
6507         guint32 len;
6508         dcerpc_info *di;
6509         int old_offset;
6510         int data16_offset;
6511         char *text;
6512
6513         di=pinfo->private_data;
6514         if(di->conformant_run){
6515                 /* this call is to make ethereal eat the array header for the conformant run */
6516                 offset =dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep, NULL);
6517
6518                 return offset;
6519         }
6520         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6521                 hf_srvsvc_path_len, &len);
6522
6523         old_offset=offset;
6524         offset = prs_uint16s(tvb, offset, pinfo, tree, len, &data16_offset,
6525                         NULL);
6526         text = fake_unicode(tvb, data16_offset, len);
6527
6528         proto_tree_add_string(tree, hf_srvsvc_path, tvb, old_offset,
6529                 offset-old_offset, text);
6530
6531         g_free(text);
6532
6533
6534
6535         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6536                         hf_srvsvc_path_type, NULL);
6537
6538         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6539                         hf_srvsvc_rc, NULL);
6540
6541         return offset;
6542 }
6543
6544
6545 /*
6546  * IDL long NetrPathCompare(
6547  * IDL      [in] [string] [unique] wchar_t *ServerName,
6548  * IDL      [in] [string] [ref] wchar_t *PathName1,
6549  * IDL      [in] [string] [ref] wchar_t *PathName2,
6550  * IDL      [in] long PathType;
6551  * IDL      [in] long PathFlags;
6552  * IDL );
6553  */
6554 static int
6555 srvsvc_dissect_netrpathcompare_rqst(tvbuff_t *tvb, int offset,
6556                                      packet_info *pinfo, proto_tree *tree,
6557                                      char *drep)
6558 {
6559         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6560                         srvsvc_dissect_pointer_UNICODE_STRING,
6561                         NDR_POINTER_UNIQUE, "Server",
6562                         hf_srvsvc_server, 0);
6563
6564         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6565                         srvsvc_dissect_pointer_UNICODE_STRING,
6566                         NDR_POINTER_REF, "Path 1:",
6567                         hf_srvsvc_path, 0);
6568
6569         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6570                         srvsvc_dissect_pointer_UNICODE_STRING,
6571                         NDR_POINTER_REF, "Path 2:",
6572                         hf_srvsvc_path, 0);
6573
6574         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6575                         hf_srvsvc_path_type, NULL);
6576
6577         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6578                         hf_srvsvc_path_flags, NULL);
6579
6580         return offset;
6581 }
6582 static int
6583 srvsvc_dissect_netrpathcompare_reply(tvbuff_t *tvb, int offset,
6584                                      packet_info *pinfo, proto_tree *tree,
6585                                      char *drep)
6586 {
6587         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6588                         hf_srvsvc_rc, NULL);
6589
6590         return offset;
6591 }
6592
6593
6594 /*
6595  * IDL long NetrNameValidate(
6596  * IDL      [in] [string] [unique] wchar_t *ServerName,
6597  * IDL      [in] [string] [ref] wchar_t *PathName,
6598  * IDL      [in] long PathType;
6599  * IDL      [in] long PathFlags;
6600  * IDL );
6601  */
6602 static int
6603 srvsvc_dissect_netrnamevalidate_rqst(tvbuff_t *tvb, int offset,
6604                                      packet_info *pinfo, proto_tree *tree,
6605                                      char *drep)
6606 {
6607         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6608                         srvsvc_dissect_pointer_UNICODE_STRING,
6609                         NDR_POINTER_UNIQUE, "Server",
6610                         hf_srvsvc_server, 0);
6611
6612         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6613                         srvsvc_dissect_pointer_UNICODE_STRING,
6614                         NDR_POINTER_REF, "Path:",
6615                         hf_srvsvc_path, 0);
6616
6617         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6618                         hf_srvsvc_path_type, NULL);
6619
6620         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6621                         hf_srvsvc_path_flags, NULL);
6622
6623         return offset;
6624 }
6625 static int
6626 srvsvc_dissect_netrnamevalidate_reply(tvbuff_t *tvb, int offset,
6627                                      packet_info *pinfo, proto_tree *tree,
6628                                      char *drep)
6629 {
6630         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6631                         hf_srvsvc_rc, NULL);
6632
6633         return offset;
6634 }
6635
6636 /*
6637  * IDL long NetrNameCanonicalize(
6638  * IDL      [in] [string] [unique] wchar_t *ServerName,
6639  * IDL      [in] [string] [ref] wchar_t *PathName,
6640  * IDL      [in] long OutBufLen,
6641  * IDL      [in] long PathType,
6642  * IDL      [in] long PathFlags,
6643  * IDL      [out] [ref] *PathName
6644  * IDL );
6645  */
6646 static int
6647 srvsvc_dissect_netrnamecanonicalize_rqst(tvbuff_t *tvb, int offset,
6648                                      packet_info *pinfo, proto_tree *tree,
6649                                      char *drep)
6650 {
6651         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6652                         srvsvc_dissect_pointer_UNICODE_STRING,
6653                         NDR_POINTER_UNIQUE, "Server",
6654                         hf_srvsvc_server, 0);
6655
6656         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6657                         srvsvc_dissect_pointer_UNICODE_STRING,
6658                         NDR_POINTER_REF, "Path:",
6659                         hf_srvsvc_path, 0);
6660
6661         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6662                         hf_srvsvc_outbuflen, NULL);
6663
6664         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6665                         hf_srvsvc_path_type, NULL);
6666
6667         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6668                         hf_srvsvc_path_flags, NULL);
6669
6670         return offset;
6671 }
6672 static int
6673 srvsvc_dissect_netrnamecanonicalize_reply(tvbuff_t *tvb, int offset,
6674                                      packet_info *pinfo, proto_tree *tree,
6675                                      char *drep)
6676 {
6677         guint32 len;
6678         dcerpc_info *di;
6679         int old_offset;
6680         int data16_offset;
6681         char *text;
6682
6683         di=pinfo->private_data;
6684         if(di->conformant_run){
6685                 /* this call is to make ethereal eat the array header for the conformant run */
6686                 offset =dissect_ndr_ucarray(tvb, offset, pinfo, tree, drep, NULL);
6687
6688                 return offset;
6689         }
6690         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6691                 hf_srvsvc_path_len, &len);
6692
6693         old_offset=offset;
6694         offset = prs_uint16s(tvb, offset, pinfo, tree, len, &data16_offset,
6695                         NULL);
6696         text = fake_unicode(tvb, data16_offset, len);
6697
6698         proto_tree_add_string(tree, hf_srvsvc_path, tvb, old_offset,
6699                 offset-old_offset, text);
6700
6701         g_free(text);
6702
6703
6704         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6705                         hf_srvsvc_rc, NULL);
6706
6707         return offset;
6708 }
6709
6710
6711 /*
6712  * IDL long NetrNameCompare(
6713  * IDL      [in] [string] [unique] wchar_t *ServerName,
6714  * IDL      [in] [string] [ref] wchar_t *PathName1,
6715  * IDL      [in] [string] [ref] wchar_t *PathName2,
6716  * IDL      [in] long PathType;
6717  * IDL      [in] long PathFlags;
6718  * IDL );
6719  */
6720 static int
6721 srvsvc_dissect_netrnamecompare_rqst(tvbuff_t *tvb, int offset,
6722                                      packet_info *pinfo, proto_tree *tree,
6723                                      char *drep)
6724 {
6725         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6726                         srvsvc_dissect_pointer_UNICODE_STRING,
6727                         NDR_POINTER_UNIQUE, "Server",
6728                         hf_srvsvc_server, 0);
6729
6730         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6731                         srvsvc_dissect_pointer_UNICODE_STRING,
6732                         NDR_POINTER_REF, "Path 1:",
6733                         hf_srvsvc_path, 0);
6734
6735         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6736                         srvsvc_dissect_pointer_UNICODE_STRING,
6737                         NDR_POINTER_REF, "Path 2:",
6738                         hf_srvsvc_path, 0);
6739
6740         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6741                         hf_srvsvc_path_type, NULL);
6742
6743         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6744                         hf_srvsvc_path_flags, NULL);
6745
6746         return offset;
6747 }
6748 static int
6749 srvsvc_dissect_netrnamecompare_reply(tvbuff_t *tvb, int offset,
6750                                      packet_info *pinfo, proto_tree *tree,
6751                                      char *drep)
6752 {
6753         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6754                         hf_srvsvc_rc, NULL);
6755
6756         return offset;
6757 }
6758
6759
6760 /*
6761  * IDL long NetrShareEnumSticky(
6762  * IDL      [in] [string] [unique] wchar_t *ServerName,
6763  * IDL      [in] [out] [ref] SHARE_ENUM_STRUCT *share,
6764  * IDL      [in] long MaxLen,
6765  * IDL      [out] long Entries,
6766  * IDL      [in] [out] [unique] *ResumeHandle
6767  * IDL );
6768  */
6769 static int
6770 srvsvc_dissect_netrshareenumsticky_rqst(tvbuff_t *tvb, int offset,
6771                                      packet_info *pinfo, proto_tree *tree,
6772                                      char *drep)
6773 {
6774         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6775                         srvsvc_dissect_pointer_UNICODE_STRING,
6776                         NDR_POINTER_UNIQUE, "Server",
6777                         hf_srvsvc_server, 0);
6778
6779         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6780                         srvsvc_dissect_SHARE_ENUM_STRUCT,
6781                         NDR_POINTER_REF, "Shares",
6782                         -1, 0);
6783
6784         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6785                         hf_srvsvc_preferred_len, 0);
6786
6787         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6788                         srvsvc_dissect_ENUM_HANDLE,
6789                         NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
6790
6791         return offset;
6792 }
6793 static int
6794 srvsvc_dissect_netrshareenumsticky_reply(tvbuff_t *tvb, int offset,
6795                                      packet_info *pinfo, proto_tree *tree,
6796                                      char *drep)
6797 {
6798         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6799                         srvsvc_dissect_SHARE_ENUM_STRUCT,
6800                         NDR_POINTER_REF, "Shares",
6801                         -1, 0);
6802
6803         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6804                 hf_srvsvc_num_entries, NULL);
6805
6806         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6807                         srvsvc_dissect_ENUM_HANDLE,
6808                         NDR_POINTER_UNIQUE, "Enum Handle", -1, 0);
6809
6810         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6811                         hf_srvsvc_rc, NULL);
6812
6813         return offset;
6814 }
6815
6816
6817 /*
6818  * IDL long NetrShareDelStart(
6819  * IDL      [in] [string] [unique] wchar_t *ServerName,
6820  * IDL      [in] [string] [ref] wchar_t *Share,
6821  * IDL      [in] long reserved,
6822  * IDL      [out] [context_handle] hnd
6823  * IDL );
6824  */
6825 static int
6826 srvsvc_dissect_netrsharedelstart_rqst(tvbuff_t *tvb, int offset,
6827                                      packet_info *pinfo, proto_tree *tree,
6828                                      char *drep)
6829 {
6830         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6831                         srvsvc_dissect_pointer_UNICODE_STRING,
6832                         NDR_POINTER_UNIQUE, "Server",
6833                         hf_srvsvc_server, 0);
6834
6835         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6836                         srvsvc_dissect_pointer_UNICODE_STRING,
6837                         NDR_POINTER_REF, "Share",
6838                         hf_srvsvc_share, 0);
6839
6840         offset = dissect_ndr_uint32 (tvb, offset, pinfo, tree, drep,
6841                                      hf_srvsvc_reserved, NULL);
6842
6843         return offset;
6844 }
6845 static int
6846 srvsvc_dissect_netrsharedelstart_reply(tvbuff_t *tvb, int offset,
6847                                      packet_info *pinfo, proto_tree *tree,
6848                                      char *drep)
6849 {
6850         offset = dissect_nt_policy_hnd(tvb, offset, pinfo, tree, drep,
6851                                        hf_srvsvc_hnd, NULL, TRUE, FALSE);
6852
6853         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6854                         hf_srvsvc_rc, NULL);
6855
6856         return offset;
6857 }
6858
6859 /*
6860  * IDL long NetrShareDelCommit(
6861  * IDL     [in] [out] [contect_handle] h
6862  * IDL );
6863  */
6864 static int
6865 srvsvc_dissect_netrsharedelcommit_rqst(tvbuff_t *tvb, int offset,
6866                                      packet_info *pinfo, proto_tree *tree,
6867                                      char *drep)
6868 {
6869         offset = dissect_nt_policy_hnd(tvb, offset, pinfo, tree, drep,
6870                                        hf_srvsvc_hnd, NULL, TRUE, FALSE);
6871
6872         return offset;
6873 }
6874 static int
6875 srvsvc_dissect_netrsharedelcommit_reply(tvbuff_t *tvb, int offset,
6876                                      packet_info *pinfo, proto_tree *tree,
6877                                      char *drep)
6878 {
6879         offset = dissect_nt_policy_hnd(tvb, offset, pinfo, tree, drep,
6880                                        hf_srvsvc_hnd, NULL, TRUE, FALSE);
6881
6882         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6883                         hf_srvsvc_rc, NULL);
6884
6885         return offset;
6886 }
6887
6888
6889 /* XXX dont know the out parameters. only the in parameters.
6890  *
6891  * IDL long NetrGetFileSecurity(
6892  * IDL      [in] [string] [unique] wchar_t *ServerName,
6893  * IDL      [in] [string] [unique] wchar_t *Share,
6894  * IDL      [in] [string] [ref] wchar_t *File,
6895  * IDL      [in] long requetedinformation
6896  * IDL      [out] [ref] SECDESC *securitysecriptor; 4byte-len followed by bytestring
6897  * IDL );
6898  */
6899 static int
6900 srvsvc_dissect_netrgetfilesecurity_rqst(tvbuff_t *tvb, int offset,
6901                                      packet_info *pinfo, proto_tree *tree,
6902                                      char *drep)
6903 {
6904         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6905                         srvsvc_dissect_pointer_UNICODE_STRING,
6906                         NDR_POINTER_UNIQUE, "Server",
6907                         hf_srvsvc_server, 0);
6908
6909         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6910                         srvsvc_dissect_pointer_UNICODE_STRING,
6911                         NDR_POINTER_UNIQUE, "Share",
6912                         hf_srvsvc_share, 0);
6913
6914         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6915                         srvsvc_dissect_pointer_UNICODE_STRING,
6916                         NDR_POINTER_REF, "Path",
6917                         hf_srvsvc_path, 0);
6918
6919
6920         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6921                         hf_srvsvc_info_level, 0);
6922
6923         return offset;
6924 }
6925 static int
6926 srvsvc_dissect_netrgetfilesecurity_reply(tvbuff_t *tvb, int offset,
6927                                      packet_info *pinfo, proto_tree *tree,
6928                                      char *drep)
6929 {
6930         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6931                         lsa_dissect_LSA_SECURITY_DESCRIPTOR_data, NDR_POINTER_REF,
6932                         "LSA SECURITY DESCRIPTOR data:", -1, 0);
6933
6934         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6935                         hf_srvsvc_rc, NULL);
6936
6937         return offset;
6938 }
6939
6940
6941 /*
6942  * IDL long NetrSetFileSecurity(
6943  * IDL      [in] [string] [unique] wchar_t *ServerName,
6944  * IDL      [in] [string] [unique] wchar_t *Share,
6945  * IDL      [in] [string] [ref] wchar_t *File,
6946  * IDL      [in] long sequrityinformation
6947  * IDL      SECDESC [ref] *securitysecriptor; 4byte-len followed by bytestring
6948  * IDL );
6949  */
6950 static int
6951 srvsvc_dissect_netrsetfilesecurity_rqst(tvbuff_t *tvb, int offset,
6952                                      packet_info *pinfo, proto_tree *tree,
6953                                      char *drep)
6954 {
6955         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6956                         srvsvc_dissect_pointer_UNICODE_STRING,
6957                         NDR_POINTER_UNIQUE, "Server",
6958                         hf_srvsvc_server, 0);
6959
6960         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6961                         srvsvc_dissect_pointer_UNICODE_STRING,
6962                         NDR_POINTER_UNIQUE, "Share",
6963                         hf_srvsvc_share, 0);
6964
6965         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6966                         srvsvc_dissect_pointer_UNICODE_STRING,
6967                         NDR_POINTER_REF, "Path",
6968                         hf_srvsvc_path, 0);
6969
6970
6971         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
6972                         hf_srvsvc_info_level, 0);
6973
6974         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
6975                         lsa_dissect_LSA_SECURITY_DESCRIPTOR_data, NDR_POINTER_REF,
6976                         "LSA SECURITY DESCRIPTOR data:", -1, 0);
6977
6978         return offset;
6979 }
6980 static int
6981 srvsvc_dissect_netrsetfilesecurity_reply(tvbuff_t *tvb, int offset,
6982                                      packet_info *pinfo, proto_tree *tree,
6983                                      char *drep)
6984 {
6985         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
6986                         hf_srvsvc_rc, NULL);
6987
6988         return offset;
6989 }
6990
6991
6992 /*
6993  * IDL long NetrServerTransportAddEx(
6994  * IDL      [in] [string] [unique] wchar_t *ServerName,
6995  * IDL      [in] long Level
6996  * IDL      [in] [ref] SERVER_XPORT_ENUM_STRUCT *sxes;
6997  * IDL );
6998  */
6999 static int
7000 srvsvc_dissect_netrservertransportaddex_rqst(tvbuff_t *tvb, int offset,
7001                                      packet_info *pinfo, proto_tree *tree,
7002                                      char *drep)
7003 {
7004         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
7005                         srvsvc_dissect_pointer_UNICODE_STRING,
7006                         NDR_POINTER_UNIQUE, "Server",
7007                         hf_srvsvc_server, 0);
7008
7009         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
7010                         hf_srvsvc_info_level, 0);
7011
7012         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
7013                         srvsvc_dissect_SERVER_XPORT_ENUM_STRUCT,
7014                         NDR_POINTER_REF, "Transports",
7015                         -1, 0);
7016
7017         return offset;
7018 }
7019 static int
7020 srvsvc_dissect_netrservertransportaddex_reply(tvbuff_t *tvb, int offset,
7021                                      packet_info *pinfo, proto_tree *tree,
7022                                      char *drep)
7023 {
7024         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
7025                         hf_srvsvc_rc, NULL);
7026
7027         return offset;
7028 }
7029
7030
7031 /*
7032  * IDL long NetrServerSetServiceBits2(
7033  * IDL      [in] [string] [unique] wchar_t *ServerName,
7034  * IDL      [in] [string] [unique] wchar_t *EmulatedServerName,
7035  * IDL      [in] [string] [unique] wchar_t *Transport,
7036  * IDL      [in] long servicebitsofinterest
7037  * IDL      [in] long servicebits
7038  * IDL      [in] long updateimmediately
7039  * IDL );
7040  */
7041 static int
7042 srvsvc_dissect_netrserversetservicebits2_rqst(tvbuff_t *tvb, int offset,
7043                                      packet_info *pinfo, proto_tree *tree,
7044                                      char *drep)
7045 {
7046         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
7047                         srvsvc_dissect_pointer_UNICODE_STRING,
7048                         NDR_POINTER_UNIQUE, "Server",
7049                         hf_srvsvc_server, 0);
7050
7051         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
7052                         srvsvc_dissect_pointer_UNICODE_STRING,
7053                         NDR_POINTER_UNIQUE, "Emulated Server",
7054                         hf_srvsvc_emulated_server, 0);
7055
7056         offset = dissect_ndr_pointer(tvb, offset, pinfo, tree, drep,
7057                         srvsvc_dissect_pointer_UNICODE_STRING,
7058                         NDR_POINTER_UNIQUE, "Transport:",
7059                         hf_srvsvc_transport, 0);
7060
7061         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
7062                         hf_srvsvc_service_bits_of_interest, NULL);
7063
7064         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
7065                         hf_srvsvc_service_bits, NULL);
7066
7067         offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, drep,
7068                         hf_srvsvc_update_immediately, NULL);
7069
7070         return offset;
7071 }
7072 static int
7073 srvsvc_dissect_netrserversetservicebits2_reply(tvbuff_t *tvb, int offset,
7074                                      packet_info *pinfo, proto_tree *tree,
7075                                      char *drep)
7076 {
7077         offset = dissect_doserror(tvb, offset, pinfo, tree, drep,
7078                         hf_srvsvc_rc, NULL);
7079
7080         return offset;
7081 }
7082
7083
7084
7085
7086 /*
7087   IDL }
7088 */
7089 static dcerpc_sub_dissector dcerpc_srvsvc_dissectors[] = {
7090         {SRV_NETRCHARDEVENUM,           "NetrCharDevEnum",
7091                 srvsvc_dissect_netrchardevenum_rqst,
7092                 srvsvc_dissect_netrchardevenum_reply},
7093         {SRV_NETRCHARDEVGETINFO,        "NetrCharDevGetInfo",
7094                 srvsvc_dissect_netrchardevgetinfo_rqst,
7095                 srvsvc_dissect_netrchardevgetinfo_reply},
7096         {SRV_NETRCHARDEVCONTROL,        "NetrCharDevControl",
7097                 srvsvc_dissect_netrchardevcontrol_rqst,
7098                 srvsvc_dissect_netrchardevcontrol_reply},
7099         {SRV_NETRCHARDEVQENUM,          "NetrCharDevQEnum",
7100                 srvsvc_dissect_netrchardevqenum_rqst,
7101                 srvsvc_dissect_netrchardevqenum_reply},
7102         {SRV_NETRCHARDEVQGETINFO,       "NetrCharDevQGetInfo",
7103                 srvsvc_dissect_netrchardevqgetinfo_rqst,
7104                 srvsvc_dissect_netrchardevqgetinfo_reply},
7105         {SRV_NETRCHARDEVQSETINFO,       "NetrCharDevQSetInfo",
7106                 srvsvc_dissect_netrchardevqsetinfo_rqst,
7107                 srvsvc_dissect_netrchardevqsetinfo_reply},
7108         {SRV_NETRCHARDEVQPURGE,         "NetrCharDevQPurge",
7109                 srvsvc_dissect_netrchardevqpurge_rqst,
7110                 srvsvc_dissect_netrchardevqpurge_reply},
7111         {SRV_NETRCHARDEVQPURGESELF,     "NetrCharDevQPurgeSelf",
7112                 srvsvc_dissect_netrchardevqpurgeself_rqst,
7113                 srvsvc_dissect_netrchardevqpurgeself_reply},
7114         {SRV_NETRCONNECTIONENUM,        "NetrConnectionEnum",
7115                 srvsvc_dissect_netrconnectionenum_rqst,
7116                 srvsvc_dissect_netrconnectionenum_reply},
7117         {SRV_NETRFILEENUM,              "NetrFileEnum",
7118                 srvsvc_dissect_netrfileenum_rqst,
7119                 srvsvc_dissect_netrfileenum_reply},
7120         {SRV_NETRFILEGETINFO,           "NetrFileGetInfo",
7121                 srvsvc_dissect_netrfilegetinfo_rqst,
7122                 srvsvc_dissect_netrfilegetinfo_reply},
7123         {SRV_NETRFILECLOSE,             "NetrFileClose",
7124                 srvsvc_dissect_netrfileclose_rqst,
7125                 srvsvc_dissect_netrfileclose_reply},
7126         {SRV_NETRSESSIONENUM,           "NetrSessionEnum",
7127                 srvsvc_dissect_netrsessionenum_rqst,
7128                 srvsvc_dissect_netrsessionenum_reply},
7129         {SRV_NETRSESSIONDEL,            "NetrSessionDel",
7130                 srvsvc_dissect_netrsessiondel_rqst,
7131                 srvsvc_dissect_netrsessiondel_reply},
7132         {SRV_NETRSHAREADD,              "NetrShareAdd",
7133                 srvsvc_dissect_netrshareadd_rqst,
7134                 srvsvc_dissect_netrshareadd_reply},
7135         {SRV_NETRSHAREENUM,             "NetrShareEnum",
7136                 srvsvc_dissect_netrshareenum_rqst,
7137                 srvsvc_dissect_netrshareenum_reply},
7138         {SRV_NETRSHAREGETINFO,          "NetrShareGetInfo",
7139                 srvsvc_dissect_netrsharegetinfo_rqst,
7140                 srvsvc_dissect_netrsharegetinfo_reply},
7141         {SRV_NETRSHARESETINFO,          "NetrShareSetInfo",
7142                 srvsvc_dissect_netrsharesetinfo_rqst,
7143                 srvsvc_dissect_netrsharesetinfo_reply},
7144         {SRV_NETRSHAREDEL,              "NetrShareDel",
7145                 srvsvc_dissect_netrsharedel_rqst,
7146                 srvsvc_dissect_netrsharedel_reply},
7147         {SRV_NETRSHAREDELSTICKY,        "NetrShareDelSticky",
7148                 srvsvc_dissect_netrsharedelsticky_rqst,
7149                 srvsvc_dissect_netrsharedelsticky_reply},
7150         {SRV_NETRSHARECHECK,            "NetrShareCheck",
7151                 srvsvc_dissect_netrsharecheck_rqst,
7152                 srvsvc_dissect_netrsharecheck_reply},
7153         {SRV_NETRSERVERGETINFO,         "NetrServerGetInfo",
7154                 srvsvc_dissect_netrservergetinfo_rqst,
7155                 srvsvc_dissect_netrservergetinfo_reply},
7156         {SRV_NETRSERVERSETINFO,         "NetrServerSetInfo",
7157                 srvsvc_dissect_netrserversetinfo_rqst,
7158                 srvsvc_dissect_netrserversetinfo_reply},
7159         {SRV_NETRSERVERDISKENUM,        "NetrServerDiskEnum",
7160                 srvsvc_dissect_netrserverdiskenum_rqst,
7161                 srvsvc_dissect_netrserverdiskenum_reply},
7162         {SRV_NETRSERVERSTATISTICSGET,   "NetrServerStatisticsGet",
7163                 srvsvc_dissect_netrserverstatisticsget_rqst,
7164                 srvsvc_dissect_netrserverstatisticsget_reply},
7165         {SRV_NETRSERVERTRANSPORTADD,    "NetrServerTransportAdd",
7166                 srvsvc_dissect_netrservertransportadd_rqst,
7167                 srvsvc_dissect_netrservertransportadd_reply},
7168         {SRV_NETRSERVERTRANSPORTENUM,   "NetrServerTransportEnum",
7169                 srvsvc_dissect_netrservertransportenum_rqst,
7170                 srvsvc_dissect_netrservertransportenum_reply},
7171         {SRV_NETRSERVERTRANSPORTDEL,    "NetrServerTransportDel",
7172                 srvsvc_dissect_netrservertransportdel_rqst,
7173                 srvsvc_dissect_netrservertransportdel_reply},
7174         {SRV_NETRREMOTETOD,             "NetrRemoteTOD",
7175                 srvsvc_dissect_netrremotetod_rqst,
7176                 srvsvc_dissect_netrremotetod_reply},
7177         {SRV_NETRSERVERSETSERVICEBITS,  "NetrServerSetServiceBits",
7178                 srvsvc_dissect_netrsetserverservicebits_rqst,
7179                 srvsvc_dissect_netrsetserverservicebits_reply},
7180         {SRV_NETRPRPATHTYPE,            "NetrPathType",
7181                 srvsvc_dissect_netrpathtype_rqst,
7182                 srvsvc_dissect_netrpathtype_reply},
7183         {SRV_NETRPRPATHCANONICALIZE,    "NetrpPathCanonicalize",
7184                 srvsvc_dissect_netrpathcanonicalize_rqst,
7185                 srvsvc_dissect_netrpathcanonicalize_reply},
7186         {SRV_NETRPRPATHCOMPARE,         "NetrpPathCompare",
7187                 srvsvc_dissect_netrpathcompare_rqst,
7188                 srvsvc_dissect_netrpathcompare_reply},
7189         {SRV_NETRPRNAMEVALIDATE,        "NetrpNameValidate",
7190                 srvsvc_dissect_netrnamevalidate_rqst,
7191                 srvsvc_dissect_netrnamevalidate_reply},
7192         {SRV_NETRPRNAMECANONICALIZE,    "NetrpNameCanonicalize",
7193                 srvsvc_dissect_netrnamecanonicalize_rqst,
7194                 srvsvc_dissect_netrnamecanonicalize_reply},
7195         {SRV_NETRPRNAMECOMPARE,         "NetrpNameCompare",
7196                 srvsvc_dissect_netrnamecompare_rqst,
7197                 srvsvc_dissect_netrnamecompare_reply},
7198         {SRV_NETRSHAREENUMSTICKY,       "NetrShareEnumSticky",
7199                 srvsvc_dissect_netrshareenumsticky_rqst,
7200                 srvsvc_dissect_netrshareenumsticky_reply},
7201         {SRV_NETRSHAREDELSTART,         "NetrShareDelStart",
7202                 srvsvc_dissect_netrsharedelstart_rqst,
7203                 srvsvc_dissect_netrsharedelstart_reply},
7204         {SRV_NETRSHAREDELCOMMIT,        "NetrShareDelCommit",
7205                 srvsvc_dissect_netrsharedelcommit_rqst,
7206                 srvsvc_dissect_netrsharedelcommit_reply},
7207         {SRV_NETRPGETFILESECURITY,      "NetrpGetFileSecurity",
7208                 srvsvc_dissect_netrgetfilesecurity_rqst,
7209                 srvsvc_dissect_netrgetfilesecurity_reply},
7210         {SRV_NETRPSETFILESECURITY,      "NetrpSetFileSecurity",
7211                 srvsvc_dissect_netrsetfilesecurity_rqst,
7212                 srvsvc_dissect_netrsetfilesecurity_reply},
7213         {SRV_NETRSERVERTRANSPORTADDEX,  "NetrServerTransportAddEx",
7214                 srvsvc_dissect_netrservertransportaddex_rqst,
7215                 srvsvc_dissect_netrservertransportaddex_reply},
7216         {SRV_NETRSERVERSETSERVICEBITS2, "NetrServerSetServiceBits2",
7217                 srvsvc_dissect_netrserversetservicebits2_rqst,
7218                 srvsvc_dissect_netrserversetservicebits2_reply},
7219         {0, NULL, NULL, NULL}
7220 };
7221
7222 static const value_string platform_id_vals[] = {
7223         { 300, "DOS" },
7224         { 400, "OS/2" },
7225         { 500, "Windows NT" },
7226         { 600, "OSF" },
7227         { 700, "VMS" },
7228         { 0,   NULL }
7229 };
7230
7231 static const value_string srvsvc_opnum_vals[] = {
7232         {SRV_NETRCHARDEVENUM,           "NetrCharDevEnum" },
7233         {SRV_NETRCHARDEVGETINFO,        "NetrCharDevGetInfo" },
7234         {SRV_NETRCHARDEVCONTROL,        "NetrCharDevControl" },
7235         {SRV_NETRCHARDEVQENUM,          "NetrCharDevQEnum" },
7236         {SRV_NETRCHARDEVQGETINFO,       "NetrCharDevQGetInfo" },
7237         {SRV_NETRCHARDEVQSETINFO,       "NetrCharDevQSetInfo" },
7238         {SRV_NETRCHARDEVQPURGE,         "NetrCharDevQPurge" },
7239         {SRV_NETRCHARDEVQPURGESELF,     "NetrCharDevQPurgeSelf" },
7240         {SRV_NETRCONNECTIONENUM,        "NetrConnectionEnum" },
7241         {SRV_NETRFILEENUM,              "NetrFileEnum" },
7242         {SRV_NETRFILEGETINFO,           "NetrFileGetInfo" },
7243         {SRV_NETRFILECLOSE,             "NetrFileClose" },
7244         {SRV_NETRSESSIONENUM,           "NetrSessionEnum" },
7245         {SRV_NETRSESSIONDEL,            "NetrSessionDel" },
7246         {SRV_NETRSHAREADD,              "NetrShareAdd" },
7247         {SRV_NETRSHAREENUM,             "NetrShareEnum" },
7248         {SRV_NETRSHAREGETINFO,          "NetrShareGetInfo" },
7249         {SRV_NETRSHARESETINFO,          "NetrShareSetInfo" },
7250         {SRV_NETRSHAREDEL,              "NetrShareDel" },
7251         {SRV_NETRSHAREDELSTICKY,        "NetrShareDelSticky" },
7252         {SRV_NETRSHARECHECK,            "NetrShareCheck" },
7253         {SRV_NETRSERVERGETINFO,         "NetrServerGetInfo" },
7254         {SRV_NETRSERVERSETINFO,         "NetrServerSetInfo" },
7255         {SRV_NETRSERVERDISKENUM,        "NetrServerDiskEnum" },
7256         {SRV_NETRSERVERSTATISTICSGET,   "NetrServerStatisticsGet" },
7257         {SRV_NETRSERVERTRANSPORTADD,    "NetrServerTransportAdd" },
7258         {SRV_NETRSERVERTRANSPORTENUM,   "NetrServerTransportEnum" },
7259         {SRV_NETRSERVERTRANSPORTDEL,    "NetrServerTransportDel" },
7260         {SRV_NETRREMOTETOD,             "NetrRemoteTOD" },
7261         {SRV_NETRSERVERSETSERVICEBITS,  "NetrServerSetServiceBits" },
7262         {SRV_NETRPRPATHTYPE,            "NetrPathType" },
7263         {SRV_NETRPRPATHCANONICALIZE,    "NetrpPathCanonicalize" },
7264         {SRV_NETRPRPATHCOMPARE,         "NetrpPathCompare" },
7265         {SRV_NETRPRNAMEVALIDATE,        "NetrpNameValidate" },
7266         {SRV_NETRPRNAMECANONICALIZE,    "NetrpNameCanonicalize" },
7267         {SRV_NETRPRNAMECOMPARE,         "NetrpNameCompare" },
7268         {SRV_NETRSHAREENUMSTICKY,       "NetrShareEnumSticky" },
7269         {SRV_NETRSHAREDELSTART,         "NetrShareDelStart" },
7270         {SRV_NETRSHAREDELCOMMIT,        "NetrShareDelCommit" },
7271         {SRV_NETRPGETFILESECURITY,      "NetrpGetFileSecurity" },
7272         {SRV_NETRPSETFILESECURITY,      "NetrpSetFileSecurity" },
7273         {SRV_NETRSERVERTRANSPORTADDEX,  "NetrServerTransportAddEx" },
7274         {SRV_NETRSERVERSETSERVICEBITS2, "NetrServerSetServiceBits2" },
7275         {0, NULL }
7276 };
7277
7278 void
7279 proto_register_dcerpc_srvsvc(void)
7280 {
7281         static hf_register_info hf[] = {
7282           { &hf_srvsvc_opnum,
7283             { "Operation", "srvsvc.opnum", FT_UINT16, BASE_DEC,
7284               VALS(srvsvc_opnum_vals), 0x0, "Operation", HFILL }},
7285           { &hf_srvsvc_server,
7286             { "Server", "srvsvc.server", FT_STRING, BASE_NONE,
7287             NULL, 0x0, "Server Name", HFILL}},
7288           { &hf_srvsvc_emulated_server,
7289             { "Emulated Server", "srvsvc.emulated_server", FT_STRING, BASE_NONE,
7290             NULL, 0x0, "Emulated Server Name", HFILL}},
7291           { &hf_srvsvc_alerts,
7292             { "Alerts", "srvsvc.alerts", FT_STRING, BASE_NONE,
7293             NULL, 0x0, "Alerts", HFILL}},
7294           { &hf_srvsvc_guest,
7295             { "Guest Account", "srvsvc.guest", FT_STRING, BASE_NONE,
7296             NULL, 0x0, "Guest Account", HFILL}},
7297           { &hf_srvsvc_transport,
7298             { "Transport", "srvsvc.transport", FT_STRING, BASE_NONE,
7299             NULL, 0x0, "Transport Name", HFILL}},
7300           { &hf_srvsvc_session,
7301             { "Session", "srvsvc.session", FT_STRING, BASE_NONE,
7302             NULL, 0x0, "Session Name", HFILL}},
7303           { &hf_srvsvc_qualifier,
7304             { "Qualifier", "srvsvc.qualifier", FT_STRING, BASE_NONE,
7305             NULL, 0x0, "Connection Qualifier", HFILL}},
7306           { &hf_srvsvc_computer,
7307             { "Computer", "srvsvc.computer", FT_STRING, BASE_NONE,
7308             NULL, 0x0, "Computer Name", HFILL}},
7309           { &hf_srvsvc_chrdev,
7310             { "Char Device", "srvsvc.chrdev", FT_STRING, BASE_NONE,
7311             NULL, 0x0, "Char Device Name", HFILL}},
7312           { &hf_srvsvc_chrdevq,
7313             { "Device Queue", "srvsvc.chrdevq", FT_STRING, BASE_NONE,
7314             NULL, 0x0, "Char Device Queue Name", HFILL}},
7315           { &hf_srvsvc_user,
7316             { "User", "srvsvc.user", FT_STRING, BASE_NONE,
7317             NULL, 0x0, "User Name", HFILL}},
7318           { &hf_srvsvc_path,
7319             { "Path", "srvsvc.path", FT_STRING, BASE_NONE,
7320             NULL, 0x0, "Path", HFILL}},
7321           { &hf_srvsvc_share_passwd,
7322             { "Share Passwd", "srvsvc.share_passwd", FT_STRING, BASE_NONE,
7323             NULL, 0x0, "Password for this share", HFILL}},
7324           { &hf_srvsvc_share_alternate_name,
7325             { "Alternate Name", "srvsvc.share_alternate_name", FT_STRING, BASE_NONE,
7326             NULL, 0x0, "Alternate name for this share", HFILL}},
7327           { &hf_srvsvc_chrdev_status,
7328             { "Status", "srvsvc.chrdev_status", FT_UINT32, BASE_HEX,
7329             NULL, 0x0, "Char Device Status", HFILL}},
7330           { &hf_srvsvc_chrqpri,
7331             { "Priority", "srvsvc.chrqdev_pri", FT_UINT32, BASE_HEX,
7332             NULL, 0x0, "Char QDevice Priority", HFILL}},
7333           { &hf_srvsvc_chrqnumusers,
7334             { "Num Users", "srvsvc.chrqdev_numusers", FT_UINT32, BASE_DEC,
7335             NULL, 0x0, "Char QDevice Number Of Users", HFILL}},
7336           { &hf_srvsvc_chrqnumahead,
7337             { "Num Ahead", "srvsvc.chrqdev_numahead", FT_UINT32, BASE_DEC,
7338             NULL, 0x0, "", HFILL}},
7339           { &hf_srvsvc_chrdev_opcode,
7340             { "Opcode", "srvsvc.chrdev_opcode", FT_UINT32, BASE_HEX,
7341             NULL, 0x0, "Opcode to apply to the Char Device", HFILL}},
7342           { &hf_srvsvc_chrdev_time,
7343             { "Time", "srvsvc.chrdev_time", FT_UINT32, BASE_DEC,
7344             NULL, 0x0, "Char Device Time?", HFILL}},
7345           { &hf_srvsvc_info_level,
7346             { "Info Level", "svrsvc.info_level", FT_UINT32,
7347             BASE_DEC, NULL, 0x0, "Info Level", HFILL}},
7348           { &hf_srvsvc_rc,
7349             { "Return code", "srvsvc.rc", FT_UINT32,
7350               BASE_HEX, VALS(DOS_errors), 0x0, "Return Code", HFILL}},
7351
7352           { &hf_srvsvc_platform_id,
7353             { "Platform ID", "srvsvc.info.platform_id", FT_UINT32,
7354               BASE_DEC, VALS(platform_id_vals), 0x0, "Platform ID", HFILL}},
7355           { &hf_srvsvc_ver_major,
7356             { "Major Version", "srvsvc.version.major", FT_UINT32,
7357               BASE_DEC, NULL, 0x0, "Major Version", HFILL}},
7358           { &hf_srvsvc_ver_minor,
7359             { "Minor Version", "srvsvc.version.minor", FT_UINT32,
7360               BASE_DEC, NULL, 0x0, "Minor Version", HFILL}},
7361           /* XXX - Should break this out. We know it from browsing.
7362              See "dissect_smb_server_type_flags()"
7363              in "packet-smb-browse.c" */
7364           { &hf_srvsvc_server_type,
7365             { "Server Type", "srvsvc.server.type", FT_UINT32,
7366               BASE_HEX, NULL, 0x0, "Server Type", HFILL}},
7367           { &hf_srvsvc_client_type,
7368             { "Client Type", "srvsvc.client.type", FT_STRING,
7369               BASE_NONE, NULL, 0x0, "Client Type", HFILL}},
7370           { &hf_srvsvc_comment,
7371             { "Comment", "srvsvc.comment", FT_STRING,
7372               BASE_NONE, NULL, 0x0, "Comment", HFILL}},
7373           { &hf_srvsvc_users,
7374             { "Users", "srvsvc.users", FT_UINT32,
7375               BASE_DEC, NULL, 0x0 , "User Count", HFILL}},
7376           { &hf_srvsvc_disc,
7377             { "Disc", "srvsvc.disc", FT_UINT32,
7378               BASE_DEC, NULL, 0x0 , "", HFILL}},
7379           { &hf_srvsvc_hidden,
7380             { "Hidden", "srvsvc.hidden", FT_UINT32,
7381               BASE_DEC, NULL, 0x0, "Hidden", HFILL}},
7382           { &hf_srvsvc_reserved,
7383             { "Reserved", "srvsvc.reserved", FT_UINT32,
7384               BASE_DEC, NULL, 0x0, "Announce", HFILL }},
7385           { &hf_srvsvc_announce,
7386             { "Announce", "srvsvc.announce", FT_UINT32,
7387               BASE_DEC, NULL, 0x0, "Announce", HFILL }},
7388           { &hf_srvsvc_anndelta,
7389             { "Announce Delta", "srvsvc.ann_delta", FT_UINT32,
7390               BASE_DEC, NULL, 0x0, "Announce Delta", HFILL}},
7391           { &hf_srvsvc_licences,
7392             { "Licences", "srvsvc.licences", FT_UINT32,
7393               BASE_DEC, NULL, 0x0, "Licences", HFILL}},
7394           { &hf_srvsvc_user_path,
7395             { "User Path", "srvsvc.user_path", FT_STRING,
7396               BASE_NONE, NULL, 0x0, "User Path", HFILL}},
7397           { &hf_srvsvc_share,
7398             { "Share", "srvsvc.share", FT_STRING,
7399               BASE_NONE, NULL, 0x0, "Share", HFILL}},
7400           { &hf_srvsvc_share_type,
7401             { "Share Type", "srvsvc.share_type", FT_UINT32,
7402               BASE_HEX, VALS(share_type_vals), 0x0, "Share Type", HFILL}},
7403           { &hf_srvsvc_file_id,
7404             { "File ID", "srvsvc.file_id", FT_UINT32,
7405               BASE_DEC, NULL, 0x0, "File ID", HFILL}},
7406           { &hf_srvsvc_perm,
7407             { "Permissions", "srvsvc.perm", FT_UINT32,
7408               BASE_HEX, NULL, 0x0, "Permissions", HFILL}},
7409           { &hf_srvsvc_dfs_root_flags,
7410             { "DFS Root Flags", "srvsvc.dfs_root_flags", FT_UINT32,
7411               BASE_HEX, NULL, 0x0, "DFS Root Flags. Contact ethereal developers if you know what the bits are", HFILL}},
7412           { &hf_srvsvc_policy,
7413             { "Policy", "srvsvc.policy", FT_UINT32,
7414               BASE_HEX, NULL, 0x0, "Policy", HFILL}},
7415           { &hf_srvsvc_file_num_locks,
7416             { "Num Locks", "srvsvc.file_num_locks", FT_UINT32,
7417               BASE_DEC, NULL, 0x0, "Number of locks for file", HFILL}},
7418           { &hf_srvsvc_con_id,
7419             { "Connection ID", "srvsvc.con_id", FT_UINT32,
7420               BASE_DEC, NULL, 0x0, "Connection ID", HFILL}},
7421           { &hf_srvsvc_max_uses,
7422             { "Max Uses", "srvsvc.max_uses", FT_UINT32,
7423               BASE_DEC, NULL, 0x0, "Max Uses", HFILL}},
7424           { &hf_srvsvc_cur_uses,
7425             { "Current Uses", "srvsvc.cur_uses", FT_UINT32,
7426               BASE_DEC, NULL, 0x0, "Current Uses", HFILL}},
7427           { &hf_srvsvc_con_num_opens,
7428             { "Num Opens", "srvsvc.con_num_opens", FT_UINT32,
7429               BASE_DEC, NULL, 0x0, "Num Opens", HFILL}},
7430           { &hf_srvsvc_session_num_opens,
7431             { "Num Opens", "srvsvc.session.num_opens", FT_UINT32,
7432               BASE_DEC, NULL, 0x0, "Num Opens", HFILL}},
7433           { &hf_srvsvc_session_time,
7434             { "Time", "srvsvc.session.time", FT_UINT32,
7435               BASE_DEC, NULL, 0x0, "Time", HFILL}},
7436           { &hf_srvsvc_session_idle_time,
7437             { "Idle Time", "srvsvc.session.idle_time", FT_UINT32,
7438               BASE_DEC, NULL, 0x0, "Idle Time", HFILL}},
7439           { &hf_srvsvc_session_user_flags,
7440             { "User Flags", "srvsvc.session.user_flags", FT_UINT32,
7441               BASE_HEX, NULL, 0x0, "User Flags", HFILL}},
7442           { &hf_srvsvc_con_type,
7443             { "Connection Type", "srvsvc.con_type", FT_UINT32,
7444               BASE_DEC, NULL, 0x0, "Connection Type", HFILL}},
7445           { &hf_srvsvc_con_time,
7446             { "Connection Time", "srvsvc.con_time", FT_UINT32,
7447               BASE_DEC, NULL, 0x0, "Connection Time", HFILL}},
7448           { &hf_srvsvc_ulist_mtime,
7449             { "Ulist mtime", "srvsvc.ulist_mtime", FT_UINT32,
7450               BASE_DEC, NULL, 0x0, "Ulist mtime", HFILL}},
7451           { &hf_srvsvc_glist_mtime,
7452             { "Glist mtime", "srvsvc.glist_mtime", FT_UINT32,
7453               BASE_DEC, NULL, 0x0, "Glist mtime", HFILL}},
7454           { &hf_srvsvc_alist_mtime,
7455             { "Alist mtime", "srvsvc.alist_mtime", FT_UINT32,
7456               BASE_DEC, NULL, 0x0, "Alist mtime", HFILL}},
7457           { &hf_srvsvc_connections,
7458             { "Connections", "srvsvc.connections", FT_UINT32,
7459               BASE_DEC, NULL, 0x0, "Number of Connections", HFILL}},
7460           { &hf_srvsvc_shares,
7461             { "Shares", "srvsvc.shares", FT_UINT32,
7462               BASE_DEC, NULL, 0x0, "Number of Shares", HFILL}},
7463           { &hf_srvsvc_diskalert,
7464             { "Disk Alerts", "srvsvc.diskalert", FT_UINT32,
7465               BASE_DEC, NULL, 0x0, "Number of disk alerts", HFILL}},
7466           { &hf_srvsvc_netioalert,
7467             { "Net I/O Alerts", "srvsvc.netioalert", FT_UINT32,
7468               BASE_DEC, NULL, 0x0, "Number of Net I/O Alerts", HFILL}},
7469           { &hf_srvsvc_maxauditsz,
7470             { "Max Audits", "srvsvc.maxaudits", FT_UINT32,
7471               BASE_DEC, NULL, 0x0, "Maximum number of audits", HFILL}},
7472           { &hf_srvsvc_srvheuristics,
7473             { "Server Heuristics", "srvsvc.srvheuristics", FT_STRING,
7474               BASE_DEC, NULL, 0x0, "Server Heuristics", HFILL}},
7475           { &hf_srvsvc_openfiles,
7476             { "Open Files", "srvsvc.openfiles", FT_UINT32,
7477               BASE_DEC, NULL, 0x0, "Open Files", HFILL}},
7478           { &hf_srvsvc_opensearch,
7479             { "Open Search", "srvsvc.opensearch", FT_UINT32,
7480               BASE_DEC, NULL, 0x0, "Open Search", HFILL}},
7481           { &hf_srvsvc_activelocks,
7482             { "Active Locks", "srvsvc.activelocks", FT_UINT32,
7483               BASE_DEC, NULL, 0x0, "Active Locks", HFILL}},
7484           { &hf_srvsvc_numfiletasks,
7485             { "Num Filetasks", "srvsvc.numfiletasks", FT_UINT32,
7486               BASE_DEC, NULL, 0x0, "Number of filetasks", HFILL}},
7487           { &hf_srvsvc_alertsched,
7488             { "Alert Sched", "srvsvc.alertsched", FT_UINT32,
7489               BASE_DEC, NULL, 0x0, "Alert Schedule", HFILL}},
7490           { &hf_srvsvc_erroralert,
7491             { "Error Alerts", "srvsvc.erroralert", FT_UINT32,
7492               BASE_DEC, NULL, 0x0, "Number of error alerts", HFILL}},
7493           { &hf_srvsvc_logonalert,
7494             { "Logon Alerts", "srvsvc.logonalert", FT_UINT32,
7495               BASE_DEC, NULL, 0x0, "Number of logon alerts", HFILL}},
7496           { &hf_srvsvc_accessalert,
7497             { "Access Alerts", "srvsvc.accessalert", FT_UINT32,
7498               BASE_DEC, NULL, 0x0, "Number of access alerts", HFILL}},
7499           { &hf_srvsvc_sizreqbufs,
7500             { "Siz Req Bufs", "srvsvc.sizreqbufs", FT_UINT32,
7501               BASE_DEC, NULL, 0x0, "", HFILL}},
7502           { &hf_srvsvc_numbigbufs,
7503             { "Num Big Bufs", "srvsvc.numbigbufs", FT_UINT32,
7504               BASE_DEC, NULL, 0x0, "Number of big buffers", HFILL}},
7505           { &hf_srvsvc_sessopens,
7506             { "Sessions Open", "srvsvc.sessopens", FT_UINT32,
7507               BASE_DEC, NULL, 0x0, "Sessions Open", HFILL}},
7508           { &hf_srvsvc_sessvcs,
7509             { "Sessions VCs", "srvsvc.sessvcs", FT_UINT32,
7510               BASE_DEC, NULL, 0x0, "Sessions VCs", HFILL}},
7511           { &hf_srvsvc_sessreqs,
7512             { "Sessions Reqs", "srvsvc.sessreqs", FT_UINT32,
7513               BASE_DEC, NULL, 0x0, "Sessions Requests", HFILL}},
7514           { &hf_srvsvc_auditedevents,
7515             { "Audited Events", "srvsvc.auditedevents", FT_UINT32,
7516               BASE_DEC, NULL, 0x0, "Number of audited events", HFILL}},
7517           { &hf_srvsvc_auditprofile,
7518             { "Audit Profile", "srvsvc.auditprofile", FT_UINT32,
7519               BASE_HEX, NULL, 0x0, "Audit Profile", HFILL}},
7520           { &hf_srvsvc_autopath,
7521             { "Autopath", "srvsvc.autopath", FT_STRING,
7522               BASE_DEC, NULL, 0x0, "Autopath", HFILL}},
7523           { &hf_srvsvc_security,
7524             { "Security", "srvsvc.security", FT_UINT32,
7525               BASE_HEX, NULL, 0x0, "Security", HFILL}},
7526           { &hf_srvsvc_numadmin,
7527             { "Num Admins", "srvsvc.num_admins", FT_UINT32,
7528               BASE_DEC, NULL, 0x0, "Number of Administrators", HFILL}},
7529           { &hf_srvsvc_lanmask,
7530             { "LANMask", "srvsvc.lanmask", FT_UINT32,
7531               BASE_HEX, NULL, 0x0, "LANMask", HFILL}},
7532           { &hf_srvsvc_chdevs,
7533             { "Char Devs", "srvsvc.chdevs", FT_UINT32,
7534               BASE_DEC, NULL, 0x0, "Number of Char Devices", HFILL}},
7535           { &hf_srvsvc_chdevqs,
7536             { "Char Devqs", "srvsvc.chdevqs", FT_UINT32,
7537               BASE_DEC, NULL, 0x0, "Number of Char Device Queues", HFILL}},
7538           { &hf_srvsvc_chdevjobs,
7539             { "Char Dev Jobs", "srvsvc.chdevjobs", FT_UINT32,
7540               BASE_DEC, NULL, 0x0, "Number of Char Device Jobs", HFILL}},
7541           { &hf_srvsvc_num_entries,
7542             { "Number of entries", "srvsvc.share.num_entries", FT_UINT32,
7543               BASE_DEC, NULL, 0x0, "Number of Entries", HFILL}},
7544           { &hf_srvsvc_initworkitems,
7545             { "Init Workitems", "srvsvc.initworkitems", FT_UINT32,
7546               BASE_DEC, NULL, 0x0, "Workitems", HFILL}},
7547           { &hf_srvsvc_maxworkitems,
7548             { "Max Workitems", "srvsvc.maxworkitems", FT_UINT32,
7549               BASE_DEC, NULL, 0x0, "Workitems", HFILL}},
7550           { &hf_srvsvc_rawworkitems,
7551             { "Raw Workitems", "srvsvc.rawworkitems", FT_UINT32,
7552               BASE_DEC, NULL, 0x0, "Workitems", HFILL}},
7553           { &hf_srvsvc_preferred_len,
7554             { "Preferred length", "srvsvc.preferred_len", FT_UINT32,
7555               BASE_DEC, NULL, 0x0, "Preferred Length", HFILL}},
7556           { &hf_srvsvc_parm_error,
7557             { "Parameter Error", "srvsvc.parm_error", FT_UINT32,
7558               BASE_DEC, NULL, 0x0, "Parameter Error", HFILL}},
7559           { &hf_srvsvc_enum_handle,
7560             { "Enumeration handle", "srvsvc.enum_hnd", FT_BYTES,
7561               BASE_HEX, NULL, 0x0, "Enumeration Handle", HFILL}},
7562           { &hf_srvsvc_irpstacksize,
7563             { "Irp Stack Size", "srvsvc.irpstacksize", FT_UINT32,
7564               BASE_HEX, NULL, 0x0, "Irp Stack Size", HFILL}},
7565           { &hf_srvsvc_maxrawbuflen,
7566             { "Max Raw Buf Len", "srvsvc.", FT_UINT32,
7567               BASE_HEX, NULL, 0x0, "Max Raw Buf Len", HFILL}},
7568           { &hf_srvsvc_maxpagedmemoryusage,
7569             { "Max Paged Memory Usage", "srvsvc.maxpagedmemoryusage", FT_UINT32,
7570               BASE_HEX, NULL, 0x0, "Max Paged Memory Usage", HFILL}},
7571           { &hf_srvsvc_maxnonpagedmemoryusage,
7572             { "Max Non-Paged Memory Usage", "srvsvc.maxnonpagedmemoryusage", FT_UINT32,
7573               BASE_HEX, NULL, 0x0, "Max Non-Paged Memory Usage", HFILL}},
7574           { &hf_srvsvc_enablesoftcompat,
7575             { "Enable Soft Compat", "srvsvc.enablesoftcompat", FT_UINT32,
7576               BASE_HEX, NULL, 0x0, "Enable Soft Compat", HFILL}},
7577           { &hf_srvsvc_enableforcedlogoff,
7578             { "Enable Forced Logoff", "srvsvc.enableforcedlogoff", FT_UINT32,
7579               BASE_HEX, NULL, 0x0, "Enable Forced Logoff", HFILL}},
7580           { &hf_srvsvc_timesource,
7581             { "Timesource", "srvsvc.timesource", FT_UINT32,
7582               BASE_HEX, NULL, 0x0, "Timesource", HFILL}},
7583           { &hf_srvsvc_acceptdownlevelapis,
7584             { "Accept Downlevel APIs", "srvsvc.acceptdownlevelapis", FT_UINT32,
7585               BASE_HEX, NULL, 0x0, "Accept Downlevel APIs", HFILL}},
7586           { &hf_srvsvc_lmannounce,
7587             { "LM Announce", "srvsvc.lmannounce", FT_UINT32,
7588               BASE_HEX, NULL, 0x0, "LM Announce", HFILL}},
7589           { &hf_srvsvc_domain,
7590             { "Domain", "srvsvc.domain", FT_STRING,
7591               BASE_HEX, NULL, 0x0, "Domain", HFILL}},
7592           { &hf_srvsvc_maxcopyreadlen,
7593             { "Max Copy Read Len", "srvsvc.maxcopyreadlen", FT_UINT32,
7594               BASE_DEC, NULL, 0x0, "Max Copy Read Len", HFILL}},
7595           { &hf_srvsvc_maxcopywritelen,
7596             { "Max Copy Write Len", "srvsvc.maxcopywritelen", FT_UINT32,
7597               BASE_DEC, NULL, 0x0, "Max Copy Write Len", HFILL}},
7598           { &hf_srvsvc_minkeepsearch,
7599             { "Min Keep Search", "srvsvc.minkeepsearch", FT_UINT32,
7600               BASE_DEC, NULL, 0x0, "Min Keep Search", HFILL}},
7601           { &hf_srvsvc_maxkeepsearch,
7602             { "Max Keep Search", "srvsvc.maxkeepsearch", FT_UINT32,
7603               BASE_DEC, NULL, 0x0, "Max Keep Search", HFILL}},
7604           { &hf_srvsvc_minkeepcomplsearch,
7605             { "Min Keep Compl Search", "srvsvc.minkeepcomplsearch", FT_UINT32,
7606               BASE_DEC, NULL, 0x0, "Min Keep Compl Search", HFILL}},
7607           { &hf_srvsvc_maxkeepcomplsearch,
7608             { "Max Keep Compl Search", "srvsvc.maxkeepcomplsearch", FT_UINT32,
7609               BASE_DEC, NULL, 0x0, "Max Keep Compl Search", HFILL}},
7610           { &hf_srvsvc_threadcountadd,
7611             { "Thread Count Add", "srvsvc.threadcountadd", FT_UINT32,
7612               BASE_DEC, NULL, 0x0, "Thread Count Add", HFILL}},
7613           { &hf_srvsvc_numblockthreads,
7614             { "Num Block Threads", "srvsvc.numblockthreads", FT_UINT32,
7615               BASE_DEC, NULL, 0x0, "Num Block Threads", HFILL}},
7616           { &hf_srvsvc_scavtimeout,
7617             { "Scav Timeout", "srvsvc.scavtimeout", FT_UINT32,
7618               BASE_DEC, NULL, 0x0, "Scav Timeout", HFILL}},
7619           { &hf_srvsvc_minrcvqueue,
7620             { "Min Rcv Queue", "srvsvc.minrcvqueue", FT_UINT32,
7621               BASE_DEC, NULL, 0x0, "Min Rcv Queue", HFILL}},
7622           { &hf_srvsvc_minfreeworkitems,
7623             { "Min Free Workitems", "srvsvc.minfreeworkitems", FT_UINT32,
7624               BASE_DEC, NULL, 0x0, "Min Free Workitems", HFILL}},
7625           { &hf_srvsvc_xactmemsize,
7626             { "Xact Mem Size", "srvsvc.xactmemsize", FT_UINT32,
7627               BASE_DEC, NULL, 0x0, "Xact Mem Size", HFILL}},
7628           { &hf_srvsvc_threadpriority,
7629             { "Thread Priority", "srvsvc.threadpriority", FT_UINT32,
7630               BASE_DEC, NULL, 0x0, "Thread Priority", HFILL}},
7631           { &hf_srvsvc_maxmpxct,
7632             { "MaxMpxCt", "srvsvc.maxmpxct", FT_UINT32,
7633               BASE_DEC, NULL, 0x0, "MaxMpxCt", HFILL}},
7634           { &hf_srvsvc_oplockbreakwait,
7635             { "Oplock Break Wait", "srvsvc.oplockbreakwait", FT_UINT32,
7636               BASE_DEC, NULL, 0x0, "Oplock Break Wait", HFILL}},
7637           { &hf_srvsvc_oplockbreakresponsewait,
7638             { "Oplock Break Response wait", "srvsvc.oplockbreakresponsewait", FT_UINT32,
7639               BASE_DEC, NULL, 0x0, "Oplock Break response Wait", HFILL}},
7640           { &hf_srvsvc_enableoplocks,
7641             { "Enable Oplocks", "srvsvc.enableoplocks", FT_UINT32,
7642               BASE_DEC, NULL, 0x0, "Enable Oplocks", HFILL}},
7643           { &hf_srvsvc_enableoplockforceclose,
7644             { "Enable Oplock Force Close", "srvsvc.enableoplockforceclose", FT_UINT32,
7645               BASE_DEC, NULL, 0x0, "Enable Oplock Force Close", HFILL}},
7646           { &hf_srvsvc_enablefcbopens,
7647             { "Enable FCB Opens", "srvsvc.enablefcbopens", FT_UINT32,
7648               BASE_DEC, NULL, 0x0, "Enable FCB Opens", HFILL}},
7649           { &hf_srvsvc_enableraw,
7650             { "Enable RAW", "srvsvc.enableraw", FT_UINT32,
7651               BASE_DEC, NULL, 0x0, "Enable RAW", HFILL}},
7652           { &hf_srvsvc_enablesharednetdrives,
7653             { "Enable Shared Net Drives", "srvsvc.enablesharednetdrives", FT_UINT32,
7654               BASE_DEC, NULL, 0x0, "Enable Shared Net Drives", HFILL}},
7655           { &hf_srvsvc_minfreeconnections,
7656             { "Min Free Conenctions", "srvsvc.minfreeconnections", FT_UINT32,
7657               BASE_DEC, NULL, 0x0, "Min Free Connections", HFILL}},
7658           { &hf_srvsvc_maxfreeconnections,
7659             { "Max Free Conenctions", "srvsvc.maxfreeconnections", FT_UINT32,
7660               BASE_DEC, NULL, 0x0, "Max Free Connections", HFILL}},
7661           { &hf_srvsvc_initsesstable,
7662             { "Init Session Table", "srvsvc.initsesstable", FT_UINT32,
7663               BASE_DEC, NULL, 0x0, "Init Session Table", HFILL}},
7664           { &hf_srvsvc_initconntable,
7665             { "Init Connection Table", "srvsvc.initconntable", FT_UINT32,
7666               BASE_DEC, NULL, 0x0, "Init Connection Table", HFILL}},
7667           { &hf_srvsvc_initfiletable,
7668             { "Init File Table", "srvsvc.initfiletable", FT_UINT32,
7669               BASE_DEC, NULL, 0x0, "Init File Table", HFILL}},
7670           { &hf_srvsvc_initsearchtable,
7671             { "Init Search Table", "srvsvc.initsearchtable", FT_UINT32,
7672               BASE_DEC, NULL, 0x0, "Init Search Table", HFILL}},
7673           { &hf_srvsvc_errortreshold,
7674             { "Error Treshold", "srvsvc.errortreshold", FT_UINT32,
7675               BASE_DEC, NULL, 0x0, "Error Treshold", HFILL}},
7676           { &hf_srvsvc_networkerrortreshold,
7677             { "Network Error Treshold", "srvsvc.networkerrortreshold", FT_UINT32,
7678               BASE_DEC, NULL, 0x0, "Network Error Treshold", HFILL}},
7679           { &hf_srvsvc_diskspacetreshold,
7680             { "Diskspace Treshold", "srvsvc.diskspacetreshold", FT_UINT32,
7681               BASE_DEC, NULL, 0x0, "Diskspace Treshold", HFILL}},
7682           { &hf_srvsvc_maxlinkdelay,
7683             { "Max Link Delay", "srvsvc.maxlinkdelay", FT_UINT32,
7684               BASE_DEC, NULL, 0x0, "Max Link Delay", HFILL}},
7685           { &hf_srvsvc_minlinkthroughput,
7686             { "Min Link Throughput", "srvsvc.minlinkthroughput", FT_UINT32,
7687               BASE_DEC, NULL, 0x0, "Min Link Throughput", HFILL}},
7688           { &hf_srvsvc_linkinfovalidtime,
7689             { "Link Info Valid Time", "srvsvc.linkinfovalidtime", FT_UINT32,
7690               BASE_DEC, NULL, 0x0, "Link Info Valid Time", HFILL}},
7691           { &hf_srvsvc_scavqosinfoupdatetime,
7692             { "Scav QoS Info Update Time", "srvsvc.scavqosinfoupdatetime", FT_UINT32,
7693               BASE_DEC, NULL, 0x0, "Scav QoS Info Update Time", HFILL}},
7694           { &hf_srvsvc_maxworkitemidletime,
7695             { "Max Workitem Idle Time", "srvsvc.maxworkitemidletime", FT_UINT32,
7696               BASE_DEC, NULL, 0x0, "Max Workitem Idle Time", HFILL}},
7697           { &hf_srvsvc_disk_name,
7698             { "Disk Name", "srvsvc.disk_name", FT_STRING,
7699               BASE_DEC, NULL, 0x0, "Disk Name", HFILL}},
7700           { &hf_srvsvc_disk_name_len,
7701             { "Disk Name Length", "srvsvc.disk_name_len", FT_UINT32,
7702               BASE_DEC, NULL, 0x0, "Length of Disk Name", HFILL}},
7703           { &hf_srvsvc_service,
7704             { "Service", "srvsvc.service", FT_STRING,
7705               BASE_DEC, NULL, 0x0, "Service", HFILL}},
7706           { &hf_srvsvc_service_options,
7707             { "Options", "srvsvc.service_options", FT_UINT32,
7708               BASE_HEX, NULL, 0x0, "Service Options", HFILL}},
7709           { &hf_srvsvc_transport_numberofvcs,
7710             { "VCs", "srvsvc.transport.num_vcs", FT_UINT32,
7711               BASE_DEC, NULL, 0x0, "Number of VCs for this transport", HFILL}},
7712           { &hf_srvsvc_transport_name,
7713             { "Name", "srvsvc.transport.name", FT_STRING,
7714               BASE_HEX, NULL, 0x0, "Name of transport", HFILL}},
7715           { &hf_srvsvc_transport_address,
7716             { "Address", "srvsvc.transport.address", FT_BYTES,
7717               BASE_HEX, NULL, 0x0, "Address of transport", HFILL}},
7718           { &hf_srvsvc_transport_address_len,
7719             { "Address Len", "srvsvc.transport.addresslen", FT_UINT32,
7720               BASE_DEC, NULL, 0x0, "Length of transport address", HFILL}},
7721           { &hf_srvsvc_transport_networkaddress,
7722             { "Network Address", "srvsvc.transport.networkaddress", FT_STRING,
7723               BASE_HEX, NULL, 0x0, "Network address for transport", HFILL}},
7724           { &hf_srvsvc_service_bits,
7725             { "Service Bits", "srvsvc.service_bits", FT_UINT32,
7726               BASE_HEX, NULL, 0x0, "Service Bits", HFILL}},
7727           { &hf_srvsvc_service_bits_of_interest,
7728             { "Service Bits Of Interest", "srvsvc.service_bits_of_interest", FT_UINT32,
7729               BASE_HEX, NULL, 0x0, "Service Bits Of Interest", HFILL}},
7730           { &hf_srvsvc_update_immediately,
7731             { "Update Immediately", "srvsvc.update_immediately", FT_UINT32,
7732               BASE_DEC, NULL, 0x0, "Update Immediately", HFILL}},
7733           { &hf_srvsvc_path_flags,
7734             { "Flags", "srvsvc.path_flags", FT_UINT32,
7735               BASE_HEX, NULL, 0x0, "Path flags", HFILL}},
7736           { &hf_srvsvc_share_flags,
7737             { "Flags", "srvsvc.share_flags", FT_UINT32,
7738               BASE_HEX, NULL, 0x0, "Share flags", HFILL}},
7739           { &hf_srvsvc_path_type,
7740             { "Type", "srvsvc.path_type", FT_UINT32,
7741               BASE_DEC, NULL, 0x0, "Path type", HFILL}},
7742           { &hf_srvsvc_path_len,
7743             { "Len", "srvsvc.path_len", FT_UINT32,
7744               BASE_DEC, NULL, 0x0, "Path len", HFILL}},
7745           { &hf_srvsvc_outbuflen,
7746             { "OutBufLen", "srvsvc.outbuflen", FT_UINT32,
7747               BASE_DEC, NULL, 0x0, "Output Buffer Length", HFILL}},
7748           { &hf_srvsvc_prefix,
7749             { "Prefix", "srvsvc.prefix", FT_STRING,
7750               BASE_HEX, NULL, 0x0, "Path Prefix", HFILL}},
7751           { &hf_srvsvc_hnd,
7752             { "Context Handle", "srvsvc.hnd", FT_BYTES,
7753               BASE_NONE, NULL, 0x0, "Context Handle", HFILL}},
7754           { &hf_srvsvc_server_stat_start,
7755             { "Start", "srvsvc.server_stat.start", FT_UINT32,
7756               BASE_DEC, NULL, 0x0, "", HFILL}},
7757           { &hf_srvsvc_server_stat_fopens,
7758             { "Fopens", "srvsvc.server_stat.fopens", FT_UINT32,
7759               BASE_DEC, NULL, 0x0, "Number of fopens", HFILL}},
7760           { &hf_srvsvc_server_stat_devopens,
7761             { "Devopens", "srvsvc.server_stat.devopens", FT_UINT32,
7762               BASE_DEC, NULL, 0x0, "Number of devopens", HFILL}},
7763           { &hf_srvsvc_server_stat_jobsqueued,
7764             { "Jobs Queued", "srvsvc.server_stat.jobsqueued", FT_UINT32,
7765               BASE_DEC, NULL, 0x0, "Number of jobs queued", HFILL}},
7766           { &hf_srvsvc_server_stat_sopens,
7767             { "Sopens", "srvsvc.server_stat.sopens", FT_UINT32,
7768               BASE_DEC, NULL, 0x0, "Number of sopens", HFILL}},
7769           { &hf_srvsvc_server_stat_stimeouts,
7770             { "stimeouts", "srvsvc.server_stat.stimeouts", FT_UINT32,
7771               BASE_DEC, NULL, 0x0, "Number of stimeouts", HFILL}},
7772           { &hf_srvsvc_server_stat_serrorout,
7773             { "Serrorout", "srvsvc.server_stat.serrorout", FT_UINT32,
7774               BASE_DEC, NULL, 0x0, "Number of serrorout", HFILL}},
7775           { &hf_srvsvc_server_stat_pwerrors,
7776             { "Pwerrors", "srvsvc.server_stat.pwerrors", FT_UINT32,
7777               BASE_DEC, NULL, 0x0, "Number of password errors", HFILL}},
7778           { &hf_srvsvc_server_stat_permerrors,
7779             { "Permerrors", "srvsvc.server_stat.permerrors", FT_UINT32,
7780               BASE_DEC, NULL, 0x0, "Number of permission errors", HFILL}},
7781           { &hf_srvsvc_server_stat_syserrors,
7782             { "Syserrors", "srvsvc.server_stat.syserrors", FT_UINT32,
7783               BASE_DEC, NULL, 0x0, "Number of system errors", HFILL}},
7784           { &hf_srvsvc_server_stat_bytessent,
7785             { "Bytes Sent", "srvsvc.server_stat.bytessent", FT_UINT64,
7786               BASE_DEC, NULL, 0x0, "Number of bytes sent", HFILL}},
7787           { &hf_srvsvc_server_stat_bytesrcvd,
7788             { "Bytes Rcvd", "srvsvc.server_stat.bytesrcvd", FT_UINT64,
7789               BASE_DEC, NULL, 0x0, "Number of bytes received", HFILL}},
7790           { &hf_srvsvc_server_stat_avresponse,
7791             { "Avresponse", "srvsvc.server_stat.avresponse", FT_UINT32,
7792               BASE_DEC, NULL, 0x0, "", HFILL}},
7793           { &hf_srvsvc_server_stat_reqbufneed,
7794             { "Req Buf Need", "srvsvc.server_stat.reqbufneed", FT_UINT32,
7795               BASE_DEC, NULL, 0x0, "Number of request buffers needed?", HFILL}},
7796           { &hf_srvsvc_server_stat_bigbufneed,
7797             { "Big Buf Need", "srvsvc.server_stat.bigbufneed", FT_UINT32,
7798               BASE_DEC, NULL, 0x0, "Number of big buffers needed?", HFILL}},
7799           { &hf_srvsvc_tod_elapsed,
7800             { "Elapsed", "srvsvc.tod.elapsed", FT_UINT32,
7801               BASE_DEC, NULL, 0x0, "", HFILL}},
7802           { &hf_srvsvc_tod_msecs,
7803             { "msecs", "srvsvc.tod.msecs", FT_UINT32,
7804               BASE_DEC, NULL, 0x0, "", HFILL}},
7805           { &hf_srvsvc_tod_hours,
7806             { "Hours", "srvsvc.tod.hours", FT_UINT32,
7807               BASE_DEC, NULL, 0x0, "", HFILL}},
7808           { &hf_srvsvc_tod_mins,
7809             { "Mins", "srvsvc.tod.mins", FT_UINT32,
7810               BASE_DEC, NULL, 0x0, "", HFILL}},
7811           { &hf_srvsvc_tod_secs,
7812             { "Secs", "srvsvc.tod.secs", FT_UINT32,
7813               BASE_DEC, NULL, 0x0, "", HFILL}},
7814           { &hf_srvsvc_tod_hunds,
7815             { "Hunds", "srvsvc.tod.hunds", FT_UINT32,
7816               BASE_DEC, NULL, 0x0, "", HFILL}},
7817           { &hf_srvsvc_tod_timezone,
7818             { "Timezone", "srvsvc.tod.timezone", FT_UINT32,
7819               BASE_DEC, NULL, 0x0, "", HFILL}},
7820           { &hf_srvsvc_tod_tinterval,
7821             { "Tinterval", "srvsvc.tod.tinterval", FT_UINT32,
7822               BASE_DEC, NULL, 0x0, "", HFILL}},
7823           { &hf_srvsvc_tod_day,
7824             { "Day", "srvsvc.tod.day", FT_UINT32,
7825               BASE_DEC, NULL, 0x0, "", HFILL}},
7826           { &hf_srvsvc_tod_month,
7827             { "Month", "srvsvc.tod.month", FT_UINT32,
7828               BASE_DEC, NULL, 0x0, "", HFILL}},
7829           { &hf_srvsvc_tod_year,
7830             { "Year", "srvsvc.tod.year", FT_UINT32,
7831               BASE_DEC, NULL, 0x0, "", HFILL}},
7832           { &hf_srvsvc_tod_weekday,
7833             { "Weekday", "srvsvc.tod.weekday", FT_UINT32,
7834               BASE_DEC, NULL, 0x0, "", HFILL}},
7835         };
7836
7837         static gint *ett[] = {
7838                 &ett_dcerpc_srvsvc,
7839                 &ett_srvsvc_share_info_1,
7840                 &ett_srvsvc_share_info_2,
7841                 &ett_srvsvc_share_info_501,
7842                 &ett_srvsvc_share_info_502
7843         };
7844
7845         proto_dcerpc_srvsvc = proto_register_protocol(
7846                 "Microsoft Server Service", "SRVSVC", "srvsvc");
7847
7848         proto_register_field_array(proto_dcerpc_srvsvc, hf, array_length(hf));
7849         proto_register_subtree_array(ett, array_length(ett));
7850 }
7851
7852 void
7853 proto_reg_handoff_dcerpc_srvsvc(void)
7854 {
7855         /* Register protocol as dcerpc */
7856
7857         dcerpc_init_uuid(proto_dcerpc_srvsvc, ett_dcerpc_srvsvc,
7858                          &uuid_dcerpc_srvsvc, ver_dcerpc_srvsvc,
7859                          dcerpc_srvsvc_dissectors, hf_srvsvc_opnum);
7860 }