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