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