xref: /titanic_41/usr/src/uts/common/smbsrv/ndl/srvsvc.ndl (revision 26fd77009b17f8c8fb32eb362584cfd635e87ad9)
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21/*
22 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef _MLSVC_LANMAN_NDL_
27#define _MLSVC_LANMAN_NDL_
28
29/*
30 * LanMan RPC (WKSSVC and SRVSVC) interface definitions.
31 */
32
33#include "ndrtypes.ndl"
34
35/*
36 * WARNING: The cpp(1) macros in this file are not understood by
37 *          /usr/bin/cpp. Use /usr/libexec/cpp instead.
38 */
39
40/*
41 * TYPE CONSTRUCTOR MACROS FOR INFORMATION RESULTS
42 ****************************************************************
43 *
44 * This is an explanation of the macros that follow this comment.
45 *
46 * The LANMAN API's look something like this:
47 *
48 *	NetXXXGetInfo (
49 *		IN  char *  servername,
50 *		IN  char *  XXX_name,
51 *		IN  int     level,
52 *		OUT char ** bufptr);
53 *
54 * The bufptr is a pointer-to-pointer (**). The NetXXXGetInfo() function
55 * malloc()s memory, and sets *bufptr to the memory. The API's
56 * are undiscriminated about what bufptr really points to.
57 *
58 * However, for RPI (Remote Procedure Interface), this just won't fly.
59 * We have to know what the result data looks like in order to
60 * properly (un)marshall it.
61 *
62 * As best we can determine, the MSC developers use an RPI that looks
63 * like this (approximately in IDL):
64 *
65 *	RemoteNetXXXGetInfo (
66 *		IN  char *  servername,
67 *		IN  char *  XXX_name,
68 *		IN  int     level,
69 *		OUT union switch(level) {
70 * 			case(1): XXX_INFO_1 * info1;
71 *			case(2): XXX_INFO_2 * info2;
72 *		    }       bufptr);
73 *
74 * The level guides the (un)marshalling as it follows the pointer.
75 * DCE(MS) IDL will automatically form a structure for the union
76 * which looks about like this (much as Sun/RPC does):
77 *
78 *	struct {
79 *		int   _keyvalue_;
80 *		union {
81 *			XXX_INFO_1 *info1;
82 *			XXX_INFO_2 *info2;
83 *		}      _u_;
84 *	} bufptr;
85 *
86 * This struct is not made visible to the application. It is purely
87 * an internal (automagic) thing.  However, ndrgen does not do this.
88 * The ndrgen input MUST remain a valid C header file, and all
89 * struct and union declarations must be exact, and we (would) have
90 * to tediously code sequences like this (approximately NDL)):
91 *
92 *	union XXXGetInfo_result_u {
93 *	    [case(1)]
94 *		XXX_INFO_1 *	info1;
95 *	    [case(2)]
96 *		XXX_INFO_2 *	info2;
97 *	};
98 *
99 *	struct XXXGetInfo_result {
100 *		int	level;
101 *
102 *		union XXXGetInfo_result_u bufptr;
103 *	};
104 *
105 *	struct XXXGetInfo_param {	// still have to code this one
106 *	    [in]  char *	servername;
107 *	    [in]  ushort	level;
108 *	    [out] struct XXXGetInfo_result result;
109 *	};
110 *
111 * This is error prone and difficult to write, and more difficult
112 * and distracting to read. It is hard to pick through the
113 * necessary evils and see what's really going on. To mitigate
114 * the situation, we have a series of macros which generate
115 * the tedious code, and are easily recognized as supporting
116 * fluff rather than important structures:
117 *
118 *	INFO1RES_DEFINITION(XXXGetInfo,
119 *		INFO1RES_UNION_ENTRY(XXXGetInfo, 1)
120 *		INFO1RES_UNION_ENTRY(XXXGetInfo, 2))
121 *
122 *	structt XXXGetInfo_param {	// still have to code this one
123 *	    [in]  char *	servername;
124 *	    [in]  ushort	level;
125 *	    [out] struct XXXGetInfo_result result;
126 *	};
127 *
128 * The INFO1RES_DEFINITION macro defines two types:
129 *
130 *	union ...__ru {...}
131 *	struct ..._result { DWORD level; union ..._ru bufptr; }
132 *
133 * There is a similar macro, INFO1RESBUF_DEFINITION, which defines
134 * actual space rather than just pointers. It defines:
135 *
136 *	union ...._rb {...}
137 *	typedef union ..._rb ..._rb;
138 *
139 * Which is handy in functions because the initial coding sequence
140 * looks something like:
141 *
142 *	XXXGetInfoParam (struct XXXGetInfo_param *param) {
143 *		XXXGetInfo_rb	rb;
144 *
145 *		param->result.level = param->level;	// for marshalling
146 *		param->result.bufptr.nullptr = &rb;	// anything fits
147 *
148 * There are two flavors of Info results. The first is the
149 * single XXX_INFO_x result, which the foregoing example
150 * uses. The second flavor is when there are multiple entries
151 * possible. Again, for the sake of guiding the marshalling,
152 * the RPIs use something accommodating:
153 *
154 *	struct XXX_INFO_1_result {
155 *		unsigned	entriesread;
156 *	   [size_is(entriesread)]
157 *		XXX_INFO_1 *	table;
158 *	};
159 *
160 *	union { XXX_INFO_1_result *info1; ...}
161 *
162 * Notice this is using XXX_INFO_1_result rather than just XXX_INFO_1.
163 * The requirements from this point are much like before. Because of
164 * the variable-length value, there is no realistic way to do something
165 * like INFO1RESBUF_DEFINITION.
166 *
167 * There are two sets of macros here. INFO1RES_xxx are for the
168 * single result case, and INFONRES_xxx for the multiple entry case.
169 */
170
171/*
172 * INFO1RES_...
173 *	Type constructors for single-result case
174 */
175
176#define INFO1RES_DEFINITION(INFOPREF, ENTRIES) \
177	INFO1RES_UNION(INFOPREF, ENTRIES) \
178	INFO1RES_STRUCT(INFOPREF)
179
180#define INFO1RES_UNION(INFOPREF, ENTRIES) \
181	union INFOPREF##__ru { \
182		INFO1RES_UNION_NULLPTR \
183		ENTRIES \
184	};
185
186#define INFO1RES_UNION_NULLPTR \
187	DEFAULT char *			nullptr;
188
189#define INFO1RES_UNION_ENTRY(INFOPREF,NUM) \
190	CASE(NUM) struct INFOPREF##_##NUM * bufptr##NUM;
191
192#define INFO1RES_STRUCT(INFOPREF) \
193	struct INFOPREF##_result { \
194		DWORD	level; \
195	   SWITCH(level) \
196		union INFOPREF##__ru bufptr; \
197	};
198
199/*
200 * INFO1RESBUF_...
201 *	Type constructors for single-result buffering.
202 */
203
204
205#ifndef NDRGEN
206#define INFO1RESBUF_DEFINITION(INFOPREF, ENTRIES) \
207	typedef union INFOPREF##_rb { \
208		ENTRIES \
209	} INFOPREF##_rb;
210#define INFO1RESBUF_UNION_ENTRY(INFOPREF,NUM) \
211	CASE(NUM) struct INFOPREF##_##NUM   buf##NUM;
212#else
213#define INFO1RESBUF_DEFINITION(INFOPREF, ENTRIES)
214#define INFO1RESBUF_UNION_ENTRY(INFOPREF,NUM)
215#endif
216
217
218
219
220/*
221 * INFONRES_...
222 *	Type constructors for multiple-result case
223 */
224
225#define INFONRES_RESULT(INFOPREF,NUM) \
226	struct INFOPREF##_##NUM##_result { \
227		DWORD	entriesread; \
228	    SIZE_IS(entriesread) \
229		struct INFOPREF##_##NUM *entries; \
230	};
231
232#define INFONRES_DEFINITION(INFOPREF, ENTRIES) \
233	INFONRES_UNION(INFOPREF, ENTRIES) \
234	INFONRES_STRUCT(INFOPREF)
235
236#define INFONRES_UNION(INFOPREF, ENTRIES) \
237	union INFOPREF##__ru { \
238		INFONRES_UNION_NULLPTR \
239		INFONRES_UNION_INFONRES \
240		ENTRIES \
241	};
242
243#define INFONRES_UNION_NULLPTR \
244	DEFAULT char *			nullptr;
245
246#ifndef NDRGEN
247#define INFONRES_UNION_INFONRES \
248	struct mslm_infonres *		p;
249#else
250#define INFONRES_UNION_INFONRES
251#endif
252
253#define INFONRES_UNION_ENTRY(INFOPREF,NUM) \
254	CASE(NUM) struct INFOPREF##_##NUM##_result * bufptr##NUM;
255
256#define INFONRES_STRUCT(INFOPREF) \
257	struct INFOPREF##_result { \
258		DWORD	level; \
259	   SWITCH(level) \
260		union INFOPREF##__ru bufptr; \
261	};
262
263#ifndef NDRGEN
264/*
265 * This just makes things a little easier on the stub modules:
266 *
267 *	XXXGetInfoParam (struct XXXGetInfo_param *param) {
268 *		struct mslm_infonres	infonres;
269 *
270 *		infonres.entriesread = 0;
271 *		infonres.entries = 0;
272 *		param->result.level = param->level;	// for marshalling
273 *		param->result.bufptr.p = &infonres;
274 */
275struct mslm_infonres {
276	DWORD		entriesread;
277	void *		entries;
278};
279#endif
280
281
282/*
283 * SRVSVC - Server Service
284 */
285
286/* Windows NT */
287#define SRVSVC_OPNUM_NetCharDevEnum              0x00
288#define SRVSVC_OPNUM_NetCharDevGetInfo           0x01
289#define SRVSVC_OPNUM_NetCharDevControl           0x02
290#define SRVSVC_OPNUM_NetCharDevQEnum             0x03
291#define SRVSVC_OPNUM_NetCharDevQGetInfo          0x04
292#define SRVSVC_OPNUM_NetCharDevQSetInfo          0x05
293#define SRVSVC_OPNUM_NetCharDevQPurge            0x06
294#define SRVSVC_OPNUM_NetCharDevQPurgeSelf        0x07
295#define SRVSVC_OPNUM_NetConnectEnum              0x08
296#define SRVSVC_OPNUM_NetFileEnum                 0x09
297#define SRVSVC_OPNUM_NetFileGetInfo              0x0a
298#define SRVSVC_OPNUM_NetFileClose                0x0b
299#define SRVSVC_OPNUM_NetSessionEnum              0x0c
300#define SRVSVC_OPNUM_NetSessionDel               0x0d
301#define SRVSVC_OPNUM_NetShareAdd                 0x0e
302#define SRVSVC_OPNUM_NetShareEnum                0x0f
303#define SRVSVC_OPNUM_NetShareGetInfo             0x10
304#define SRVSVC_OPNUM_NetShareSetInfo             0x11
305#define SRVSVC_OPNUM_NetShareDel                 0x12
306#define SRVSVC_OPNUM_NetShareDelSticky           0x13
307#define SRVSVC_OPNUM_NetShareCheck               0x14
308#define SRVSVC_OPNUM_NetServerGetInfo            0x15
309#define SRVSVC_OPNUM_NetServerSetInfo            0x16
310#define SRVSVC_OPNUM_NetServerDiskEnum           0x17
311#define SRVSVC_OPNUM_NetServerStatisticsGet      0x18
312#define SRVSVC_OPNUM_NetServerTransportAdd       0x19
313#define SRVSVC_OPNUM_NetServerTransportEnum      0x1a
314#define SRVSVC_OPNUM_NetServerTransportDel       0x1b
315#define SRVSVC_OPNUM_NetRemoteTOD                0x1c
316#define SRVSVC_OPNUM_NetServerSetServiceBits     0x1d
317#define SRVSVC_OPNUM_NetPathType                 0x1e
318#define SRVSVC_OPNUM_NetPathCanonicalize         0x1f
319#define SRVSVC_OPNUM_NetPathCompare              0x20
320#define SRVSVC_OPNUM_NetNameValidate             0x21
321#define SRVSVC_OPNUM_NetNameCanonicalize         0x22
322#define SRVSVC_OPNUM_NetNameCompare              0x23
323#define SRVSVC_OPNUM_NetShareEnumSticky          0x24
324#define SRVSVC_OPNUM_NetShareDelStart            0x25
325#define SRVSVC_OPNUM_NetShareDelCommit           0x26
326#define SRVSVC_OPNUM_NetGetFileSecurity          0x27
327#define SRVSVC_OPNUM_NetSetFileSecurity          0x28
328#define SRVSVC_OPNUM_NetServerTransportAddEx     0x29
329#define SRVSVC_OPNUM_NetServerSetServiceBitsEx   0x2a
330#define SRVSVC_OPNUM_NetDfsGetVersion            0x2b
331
332/* Windows 2000 */
333#define SRVSVC_OPNUM_NetDfsCreateLocalPartition  0x2c
334#define SRVSVC_OPNUM_NetDfsDeleteLocalPartition  0x2d
335#define SRVSVC_OPNUM_NetDfsSetLocalVolumeState   0x2e
336#define SRVSVC_OPNUM_NetDfsSetServerInfo         0x2f
337#define SRVSVC_OPNUM_NetDfsCreateExitPoint       0x30
338#define SRVSVC_OPNUM_NetDfsDeleteExitPoint       0x31
339#define SRVSVC_OPNUM_NetDfsModifyPrefix          0x32
340#define SRVSVC_OPNUM_NetDfsFixLocalVolume        0x33
341#define SRVSVC_OPNUM_NetDfsManagerReportSiteInfo 0x34
342
343/* Windows XP and Windows Server 2003 */
344#define SRVSVC_OPNUM_NetServerTransportDelEx     0x35
345
346/* Windows Vista */
347#define SRVSVC_OPNUM_NetServerAliasAdd           0x36
348#define SRVSVC_OPNUM_NetServerAliasEnum          0x37
349#define SRVSVC_OPNUM_NetServerAliasDel           0x38
350#define SRVSVC_OPNUM_NetShareDelEx               0x39
351
352/*
353 ***********************************************************************
354 * NetConnectEnum
355 ***********************************************************************
356 */
357
358/*
359 * Level 0 connect information.
360 */
361struct mslm_NetConnectInfoBuf0 {
362        DWORD coni0_id;
363};
364typedef struct mslm_NetConnectInfoBuf0 srvsvc_NetConnectInfoBuf0_t;
365
366struct mslm_NetConnectInfo0 {
367	DWORD entries_read;
368  SIZE_IS(entries_read)
369        struct mslm_NetConnectInfoBuf0 *ci0;
370};
371typedef struct mslm_NetConnectInfo0 srvsvc_NetConnectInfo0_t;
372
373/*
374 * Level 1 connect information.
375 */
376struct mslm_NetConnectInfoBuf1 {
377	DWORD coni1_id;
378	DWORD coni1_type;
379	DWORD coni1_num_opens;
380	DWORD coni1_num_users;
381	DWORD coni1_time;
382	LPTSTR coni1_username;
383	LPTSTR coni1_netname; /* share name */
384};
385typedef struct mslm_NetConnectInfoBuf1 srvsvc_NetConnectInfoBuf1_t;
386
387struct mslm_NetConnectInfo1 {
388	DWORD entries_read;
389  SIZE_IS(entries_read)
390	struct mslm_NetConnectInfoBuf1 *ci1;
391};
392typedef struct mslm_NetConnectInfo1 srvsvc_NetConnectInfo1_t;
393
394union mslm_NetConnectInfoResUnion {
395	CASE(0) struct mslm_NetConnectInfo0 *info0;
396	CASE(1) struct mslm_NetConnectInfo1 *info1;
397	DEFAULT	char *nullptr;
398};
399
400struct mslm_NetConnectInfo {
401	DWORD level;
402	DWORD switch_value;
403  SWITCH(switch_value)
404	union mslm_NetConnectInfoResUnion ru;
405};
406typedef struct mslm_NetConnectInfo srvsvc_NetConnectInfo_t;
407
408OPERATION(SRVSVC_OPNUM_NetConnectEnum)
409struct mslm_NetConnectEnum {
410	IN	LPTSTR servername;
411	IN	LPTSTR qualifier; /* share name */
412	INOUT	struct mslm_NetConnectInfo info;
413	IN	DWORD pref_max_len;
414	OUT 	DWORD total_entries;
415	INOUT	DWORD *resume_handle;
416	OUT	DWORD status;
417};
418
419
420/*
421 ***********************************************************************
422 * NetFileEnum
423 ***********************************************************************
424 */
425struct mslm_NetFileInfoBuf2 {
426	DWORD fi2_id;
427};
428typedef struct mslm_NetFileInfoBuf2 srvsvc_NetFileInfoBuf2_t;
429
430struct mslm_NetFileInfo2 {
431	DWORD entries_read;
432  SIZE_IS(entries_read)
433	struct mslm_NetFileInfoBuf2 *fi2;
434};
435typedef struct mslm_NetFileInfo2 srvsvc_NetFileInfo2_t;
436
437struct mslm_NetFileInfoBuf3 {
438	DWORD fi3_id;
439	DWORD fi3_permissions;
440	DWORD fi3_num_locks;
441	LPTSTR fi3_pathname;
442	LPTSTR fi3_username;
443};
444typedef struct mslm_NetFileInfoBuf3 srvsvc_NetFileInfoBuf3_t;
445
446struct mslm_NetFileInfo3 {
447	DWORD entries_read;
448  SIZE_IS(entries_read)
449	struct mslm_NetFileInfoBuf3 *fi3;
450};
451typedef struct mslm_NetFileInfo3 srvsvc_NetFileInfo3_t;
452
453union mslm_NetFileInfoResUnion {
454	CASE(2)	struct mslm_NetFileInfo2 *info2;
455	CASE(3)	struct mslm_NetFileInfo3 *info3;
456	DEFAULT	char *nullptr;
457};
458
459struct mslm_NetFileInfo {
460	DWORD level;
461	DWORD switch_value;
462  SWITCH(switch_value)
463	union mslm_NetFileInfoResUnion ru;
464};
465
466OPERATION(SRVSVC_OPNUM_NetFileEnum)
467struct mslm_NetFileEnum {
468	IN	LPTSTR servername;
469	IN	DWORD basepath;
470	IN	DWORD username;
471	INOUT	struct mslm_NetFileInfo info;
472	IN	DWORD pref_max_len;
473	OUT	DWORD total_entries;
474	INOUT	DWORD *resume_handle;
475	OUT	DWORD status;
476};
477
478
479/*
480 ***********************************************************************
481 * NetFileClose
482 *
483 * Close files using a file id reported by NetFileEnum.
484 ***********************************************************************
485 */
486OPERATION(SRVSVC_OPNUM_NetFileClose)
487struct mslm_NetFileClose {
488	IN	LPTSTR servername;
489	IN	DWORD file_id;
490	OUT	DWORD status;
491};
492
493
494/*
495 ***********************************************************************
496 * NetShareGetInfo/NetShareSetInfo: netname is the name of a share.
497 *
498 * Levels:
499 *  0      The share name.
500 *  1      Information about the shared resource: name, type of resource
501 *         and a comment.
502 *  2      Information about the shared resource: name, type, permissions,
503 *         password and number of connections.
504 *  501    Information about the shared resource: name, type of resource
505 *         and a comment.
506 *  502    Information about the shared resource, including the name, type,
507 *         permissions, number of connections etc.
508 *  503    Contains information about the shared resource; identical to 502
509 *         except for the addition of a servername.
510 *  1004   A comment for the shared resource.
511 *  1005   A set of flags describing the shared resource.
512 *  1006   The maximum number of concurrent connections that the shared
513 *         resource can accommodate.
514 *  1501   Specifies the SECURITY_DESCRIPTOR for the share.
515 *
516 * Windows Me/98/95 supports level 50, which is similar to level 1.
517 *
518 * shi1005_flags: SHI1005_VALID_FLAGS_SET defines the set of flags that
519 * can be set with the NetShareSetInfo function. SHI1005_FLAGS_DFS and
520 * SHI1005_FLAGS_DFS_ROOT can only be returned, but not set.
521 *
522 * 0x01    SHI1005_FLAGS_DFS
523 *         The specified share is present in a Dfs tree structure.
524 *         This flag cannot be set with NetShareSetInfo.
525 *
526 * 0x02    SHI1005_FLAGS_DFS_ROOT
527 *         The specified share is the root volume in a Dfs tree.
528 *         This flag cannot be set with NetShareSetInfo.
529 *
530 * 0x30    CSC_MASK               Client-side caching (CSC) state:
531 *   0x00  CSC_CACHE_MANUAL_REINT Automatic file-by-file
532 *                                reintegration not allowed.
533 *   0x10  CSC_CACHE_AUTO_REINT   File-by-file reintegration allowed.
534 *   0x20  CSC_CACHE_VDO          File opens do not need to be flowed.
535 *   0x30  CSC_CACHE_NONE         CSC is disabled for this share.
536 *
537 * 0x0100  SHI1005_FLAGS_RESTRICT_EXCLUSIVE_OPENS
538 *         The specified share disallows exclusive file opens,
539 *         where reads to an open file are disallowed.
540 *
541 * 0x0200  SHI1005_FLAGS_FORCE_SHARED_DELETE
542 *         Shared files in the specified share can be forcibly deleted.
543 *
544 * 0x0400  SHI1005_FLAGS_ALLOW_NAMESPACE_CACHING
545 *         Clients are allowed to cache the namespace of the share.
546 *
547 * 0x0800  SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM
548 *         The server will filter directory entries based on the access
549 *         permissions of the client.  The access-based enumeration (ABE)
550 *         flag may also appear as SHI1005_FLAGS_ENFORCE_NAMESPACE_ACCESS.
551 *
552 * Support for Access-based Enumeration (ABE) was added to Windows in
553 * Windows Server 2003 Service Pack 1. ABE filters directory contents
554 * (and other shared resources) returned via a share based on a user's
555 * access rights, i.e. a user would not see objects that are
556 * inaccessible to that user. ABE requests are made using info level
557 * 1005 with the value 0x0800 in the flags field.
558 ***********************************************************************
559 */
560
561#define	CSC_MASK		0x30
562#define	CSC_CACHE_MANUAL_REINT	0x00
563#define	CSC_CACHE_AUTO_REINT	0x10
564#define	CSC_CACHE_VDO		0x20
565#define	CSC_CACHE_NONE		0x30
566
567#define	MLSM_SID_AUTH_MAX	6
568/*
569 * Definition for a SID. The ndl compiler does not allow a typedef of
570 * a structure containing variable size members.
571 */
572struct mslm_sid {
573	BYTE		revision;
574	BYTE		sub_auth_count;
575	BYTE		authority[MLSM_SID_AUTH_MAX];
576  SIZE_IS(sub_auth_count)
577	DWORD		sub_authority[ANY_SIZE_ARRAY];
578};
579
580struct mslm_ace_hdr {
581	BYTE		type;
582	BYTE		flags;
583	WORD		size;
584};
585typedef struct mslm_ace_hdr mslm_ace_hdr_t;
586
587struct mslm_ace {
588	mslm_ace_hdr_t	header;
589	DWORD		mask;
590	struct mslm_sid	*sid;
591};
592typedef struct mslm_ace mslm_ace_t;
593
594struct mslm_acl {
595	BYTE		revision;
596	BYTE		sbz1;
597	WORD		size;
598	WORD		ace_count;
599	WORD		sbz2;
600    SIZE_IS(ace_count)
601	mslm_ace_t	ace[ANY_SIZE_ARRAY];
602};
603
604/*
605 * SRVSVC definition of a security_descriptor.
606 */
607struct mslm_security_descriptor {
608	BYTE revision;
609	BYTE sbz1;
610	WORD control;
611	DWORD offset_owner;
612	DWORD offset_group;
613	DWORD offset_sacl;
614	DWORD offset_dacl;
615	struct mslm_sid *owner;
616	struct mslm_sid *group;
617	struct mslm_acl *sacl;
618	struct mslm_acl *dacl;
619};
620typedef struct mslm_security_descriptor mslm_security_descriptor_t;
621
622struct mslm_NetShareInfo_0 {
623	LPTSTR shi0_netname;
624};
625
626struct mslm_NetShareInfo_1 {
627	LPTSTR shi1_netname;
628	DWORD shi1_type; /* type of resource such as IPC$ */
629	LPTSTR shi1_comment;
630};
631
632struct mslm_NetShareInfo_2 {
633	LPTSTR shi2_netname;
634	DWORD shi2_type;
635	LPTSTR shi2_comment;
636	DWORD shi2_permissions;
637	DWORD shi2_max_uses;
638	DWORD shi2_current_uses;
639	LPTSTR shi2_path;
640	LPTSTR shi2_passwd;
641};
642
643/*
644 * shi501_reserved (AKA shi501_flags) must be zero.
645 */
646struct mslm_NetShareInfo_501 {
647	LPTSTR shi501_netname;
648	DWORD shi501_type;
649	LPTSTR shi501_comment;
650	DWORD shi501_reserved;
651};
652
653struct mslm_NetShareInfo_502 {
654	LPTSTR shi502_netname;
655	DWORD shi502_type;
656	LPTSTR shi502_comment;
657	DWORD shi502_permissions;
658	DWORD shi502_max_uses;
659	DWORD shi502_current_uses;
660	LPTSTR shi502_path;
661	LPTSTR shi502_passwd;
662	DWORD shi502_reserved;
663    SIZE_IS(shi502_reserved)
664	LPBYTE shi502_security_descriptor;
665};
666
667struct mslm_NetShareInfo_503 {
668	LPTSTR shi503_netname;
669	DWORD shi503_type;
670	LPTSTR shi503_comment;
671	DWORD shi503_permissions;
672	DWORD shi503_max_uses;
673	DWORD shi503_current_uses;
674	LPTSTR shi503_path;
675	LPTSTR shi503_passwd;
676	LPTSTR shi503_servername;
677	DWORD shi503_reserved;
678    SIZE_IS(shi503_reserved)
679	LPBYTE shi503_security_descriptor;
680};
681
682struct mslm_NetShareInfo_1004 {
683	LPTSTR shi1004_comment;
684};
685
686struct mslm_NetShareInfo_1005 {
687	DWORD shi1005_flags;
688};
689
690struct mslm_NetShareInfo_1006 {
691	DWORD shi1006_max_uses;
692};
693
694struct mslm_NetShareInfo_1501 {
695	DWORD shi1501_reserved;
696    SIZE_IS(shi1501_reserved)
697	LPBYTE shi1501_security_descriptor;
698};
699
700union mlsm_NetShareInfoResUnion {
701	CASE(0)		struct mslm_NetShareInfo_0 *info0;
702	CASE(1)		struct mslm_NetShareInfo_1 *info1;
703	CASE(2)		struct mslm_NetShareInfo_2 *info2;
704	CASE(501)	struct mslm_NetShareInfo_501 *info501;
705	CASE(502)	struct mslm_NetShareInfo_502 *info502;
706	CASE(503)	struct mslm_NetShareInfo_503 *info503;
707	CASE(1004)	struct mslm_NetShareInfo_1004 *info1004;
708	CASE(1005)	struct mslm_NetShareInfo_1005 *info1005;
709	CASE(1006)	struct mslm_NetShareInfo_1006 *info1006;
710	CASE(1501)	struct mslm_NetShareInfo_1501 *info1501;
711	DEFAULT	char *nullptr;
712};
713
714
715struct mlsm_NetShareInfoRes {
716	DWORD switch_value;
717  SWITCH(switch_value)
718	union mlsm_NetShareInfoResUnion ru;
719};
720
721
722OPERATION(SRVSVC_OPNUM_NetShareGetInfo)
723struct mlsm_NetShareGetInfo {
724	IN	LPTSTR servername;
725	IN REFERENCE	LPTSTR netname;
726	IN	DWORD level;
727	OUT	struct mlsm_NetShareInfoRes result;
728	OUT	DWORD status;
729};
730
731
732OPERATION(SRVSVC_OPNUM_NetShareSetInfo)
733struct mlsm_NetShareSetInfo {
734	IN	LPTSTR servername;
735	IN REFERENCE	LPTSTR netname;
736	IN	DWORD level;
737	IN	struct mlsm_NetShareInfoRes result;
738	INOUT	DWORD *parm_err;
739	OUT	DWORD status;
740};
741
742
743/*
744 ***********************************************************************
745 * NetSessionEnum
746 *
747 * The NetSessionEnum function provides information about sessions
748 * established on a server.
749 *
750 * Only members of the Administrators or Account Operators local groups
751 * can successfully execute the NetSessionEnum function at level 1 or
752 * level 2. No special group membership is required for level 0 or level
753 * 10 calls.
754 *
755 * Windows NT/2000/XP: The parameter order is as follows.
756 *
757 * NET_API_STATUS NetSessionEnum(LPWSTR servername,
758 *                               LPWSTR UncClientName,
759 *                               LPWSTR username,
760 *                               DWORD level,
761 *                               LPBYTE *bufptr,
762 *                               DWORD prefmaxlen,
763 *                               LPDWORD entriesread,
764 *                               LPDWORD totalentries,
765 *                               LPDWORD resume_handle);
766 *
767 * Windows 95/98/Me: The calling application must use the cbBuffer parameter
768 * to specify the size, in bytes, of the information buffer pointed to by the
769 * pbBuffer parameter. (The cbBuffer parameter replaces the prefmaxlen
770 * parameter.) Neither a user name parameter nor a resume handle parameter is
771 * available on this platform. Therefore, the parameter list is as follows.
772 *
773 * API_FUNCTION NetSessionEnum(const char FAR *pszServer,
774 *                             short sLevel,
775 *                             char FAR *pbBuffer,
776 *                             unsigned short cbBuffer,
777 *                             unsigned short FAR *pcEntriesRead,
778 *                             unsigned short FAR *pcTotalAvail);
779 *
780 * Parameters
781 *
782 * servername
783 * [in] Pointer to a string that specifies the DNS or NetBIOS name of the
784 * remote server on which the function is to execute. If this parameter is
785 * NULL, the local computer is used.
786 * Windows NT 4.0 and earlier: This string must begin with \\.
787 *
788 * UncClientName
789 * [in] Pointer to a string that specifies the name of the computer session
790 * for which information is to be returned. If this parameter is NULL,
791 * NetSessionEnum returns information for all computer sessions on the server.
792 *
793 * username
794 * [in] Pointer to a string that specifies the name of the user for which
795 * information is to be returned. If this parameter is NULL, NetSessionEnum
796 * returns information for all users.
797 *
798 * level
799 * [in] Specifies the information level of the data. This parameter can be
800 * one of the following values.
801 * Windows NT/2000/XP: The following levels are valid.
802 * Value    Meaning
803 * 0        Return the name of the computer that established the session.
804 *          The bufptr parameter points to an array of SESSION_INFO_0
805 *          structures.
806 * 1        Return the name of the computer, name of the user, and open files,
807 *          pipes, and devices on the computer. The bufptr parameter points to
808 *          an array of SESSION_INFO_1 structures.
809 * 2        In addition to the information indicated for level 1, return the
810 *          type of client and how the user established the session. The bufptr
811 *          parameter points to an array of SESSION_INFO_2 structures.
812 * 10       Return the name of the computer, name of the user, and active and
813 *          idle times for the session. The bufptr parameter points to an array
814 *          of SESSION_INFO_10 structures.
815 * 502      Return the name of the computer; name of the user; open files,
816 *          pipes, and devices on the computer; and the name of the transport
817 *          the  client is using. The bufptr parameter points to an array of
818 *          SESSION_INFO_502 structures.
819 *
820 * Windows 95/98/Me: The following level is valid.
821 * Value    Meaning
822 * 50       Return the name of the computer, name of the user, open files on
823 *          the computer, and the name of the transport protocol the client is
824 *          using. The pbBuffer parameter points to an array of session_info_50
825 *          structures.
826 *
827 * bufptr
828 * [out] Pointer to the buffer that receives the data. The format of this
829 * data depends on the value of the level parameter.
830 * Windows NT/2000/XP: This buffer is allocated by the system and must be
831 * freed using the NetApiBufferFree function. Note that you must free the
832 * buffer even if the function fails with ERROR_MORE_DATA.
833 * Windows 95/98/Me: The caller must allocate and deallocate this buffer.
834 *
835 * prefmaxlen
836 * [in] Specifies the preferred maximum length of returned data, in bytes.
837 * If you specify MAX_PREFERRED_LENGTH, the function allocates the amount
838 * of memory required for the data. If you specify another value in this
839 * parameter, it can restrict the number of bytes that the function returns.
840 * If the buffer size is insufficient to hold all entries, the function
841 * returns ERROR_MORE_DATA. For more information, see Network Management
842 * Function Buffers and Network Management Function Buffer Lengths.
843 *
844 * entriesread
845 * [out] Pointer to a value that receives the count of elements actually
846 * enumerated.
847 *
848 * totalentries
849 * [out] Pointer to a value that receives the total number of entries that
850 * could have been enumerated from the current resume position.
851 *
852 * resume_handle
853 * [in/out] Pointer to a value that contains a resume handle which is used
854 * to continue an existing session search. The handle should be zero on the
855 * first call and left unchanged for subsequent calls. If resume_handle is
856 * NULL, no resume handle is stored.
857 *
858 *
859 * SESSION_INFO_1
860 * ==============
861 * The SESSION_INFO_1 structure contains information about the session,
862 * including name of the computer; name of the user; and open files, pipes,
863 * and devices on the computer.
864 *
865 * Members
866 *
867 * sesi1_cname
868 * Pointer to a Unicode string specifying the name of the computer that
869 * established the session.
870 *
871 * sesi1_username
872 * Pointer to a Unicode string specifying the name of the user who established
873 * the session.
874 *
875 * sesi1_num_opens
876 * Specifies a DWORD value that contains the number of files, devices,
877 * and pipes opened during the session.
878 *
879 * sesi1_time
880 * Specifies a DWORD value that contains the number of seconds the session
881 * has been active.
882 *
883 * sesi1_idle_time
884 * Specifies a DWORD value that contains the number of seconds the session
885 * has been idle.
886 *
887 * sesi1_user_flags
888 * Specifies a DWORD value that describes how the user established the
889 * session. This member can be one of the following values:
890 * SESS_GUEST           The user specified by the sesi1_username member
891 *                      established the session using a guest account.
892 * SESS_NOENCRYPTION    The user specified by the sesi1_username member
893 *                      established the session without using password
894 *                      encryption.
895 ***********************************************************************
896 */
897
898#define SESS_GUEST          0x00000001
899#define SESS_NOENCRYPTION   0x00000002
900
901struct mslm_SESSION_INFO_0 {
902	LPTSTR sesi0_cname;
903};
904INFONRES_RESULT(mslm_SESSION_INFO, 0)
905
906struct mslm_SESSION_INFO_1 {
907	LPTSTR sesi1_cname;
908	LPTSTR sesi1_uname;
909	DWORD  sesi1_nopens;
910	DWORD  sesi1_time;
911	DWORD  sesi1_itime;
912	DWORD  sesi1_uflags;
913};
914INFONRES_RESULT(mslm_SESSION_INFO, 1)
915
916struct mslm_SESSION_INFO_2 {
917	LPTSTR sesi2_cname;
918	LPTSTR sesi2_uname;
919	DWORD  sesi2_nopens;
920	DWORD  sesi2_time;
921	DWORD  sesi2_itime;
922	DWORD  sesi2_uflags;
923	LPTSTR sesi2_cltype_name;
924};
925INFONRES_RESULT(mslm_SESSION_INFO, 2)
926
927struct mslm_SESSION_INFO_10 {
928	LPTSTR sesi10_cname;
929	LPTSTR sesi10_uname;
930	DWORD  sesi10_time;
931	DWORD  sesi10_itime;
932};
933INFONRES_RESULT(mslm_SESSION_INFO, 10)
934
935struct mslm_SESSION_INFO_502 {
936	LPTSTR sesi502_cname;
937	LPTSTR sesi502_uname;
938	DWORD  sesi502_nopens;
939	DWORD  sesi502_time;
940	DWORD  sesi502_itime;
941	DWORD  sesi502_uflags;
942	LPTSTR sesi502_cltype_name;
943	LPTSTR sesi502_transport;
944};
945INFONRES_RESULT(mslm_SESSION_INFO, 502)
946
947INFONRES_DEFINITION(mslm_NetSessionEnum,
948	INFONRES_UNION_ENTRY(mslm_SESSION_INFO, 0)
949	INFONRES_UNION_ENTRY(mslm_SESSION_INFO, 1)
950	INFONRES_UNION_ENTRY(mslm_SESSION_INFO, 2)
951	INFONRES_UNION_ENTRY(mslm_SESSION_INFO, 10)
952	INFONRES_UNION_ENTRY(mslm_SESSION_INFO, 502))
953
954OPERATION(SRVSVC_OPNUM_NetSessionEnum)
955struct mslm_NetSessionEnum {
956	IN		LPTSTR servername;
957	IN		DWORD unc_clientname;
958	IN		DWORD username;
959	INOUT	DWORD level;
960	INOUT	struct mslm_NetSessionEnum_result result;
961	IN		DWORD pref_max_len;
962	OUT		DWORD total_entries;
963	INOUT	DWORD *resume_handle;
964	OUT		DWORD status;
965};
966
967
968/*
969 ***********************************************************************
970 * NetSessionDel (Platform SDK: Network Management)
971 *
972 * The NetSessionDel function ends a network session between a server
973 * and a workstation.
974 *
975 * Security Requirements
976 * Only members of the Administrators or Account Operators local group
977 * can successfully execute the NetSessionDel function.
978 *
979 * Windows NT/2000/XP: The parameter order is as follows.
980 *
981 * NET_API_STATUS NetSessionDel(LPWSTR servername,
982 *                              LPWSTR UncClientName,
983 *                              LPWSTR username);
984 *
985 * Windows 95/98/Me: The sReserved parameter replaces the username
986 * parameter. For more information, see the following Remarks section.
987 * The parameter list is as follows.
988 *
989 * API_FUNCTION NetSessionDel(const char FAR *pszServer,
990 *                            const char FAR *pszClientName,
991 *                            short  sReserved);
992 *
993 * Parameters
994 *
995 * servername
996 * [in] Pointer to a string that specifies the DNS or NetBIOS name
997 * of the server.  Servers should not validate this parameter.
998 * This parameter may be NULL and on Windows NT 4.0 and earlier it
999 * should begin with \\.
1000 *
1001 * UncClientName
1002 * [in] Pointer to a string that specifies the name of the client
1003 * to disconnect. If UncClientName is NULL, all sessions associated
1004 * with the specified user will be disconnected.
1005 *
1006 * username
1007 * [in] Pointer to a string that specifies the name of the user whose
1008 * session is to be terminated. If username is NULL, all sessions
1009 * from the specified client will be disconnected.
1010 *
1011 * Remarks
1012 * Windows 95/98/Me: You must specify the session key in the sReserved
1013 * parameter when you call NetSessionDel. The session key is returned by
1014 * the NetSessionEnum function or the NetSessionGetInfo function in the
1015 * sesi50_key member of the session_info_50 structure.
1016 ***********************************************************************
1017 */
1018
1019OPERATION(SRVSVC_OPNUM_NetSessionDel)
1020struct mslm_NetSessionDel {
1021	IN	LPTSTR servername;
1022	IN	LPTSTR unc_clientname;
1023	IN	LPTSTR username;
1024	OUT	DWORD status;
1025};
1026
1027
1028/*
1029 * SRVSVC NetServerGetInfo (
1030 *	IN LPTSTR	servername,
1031 *	IN DWORD	level,
1032 *	OUT union switch(level) {
1033 *		case 100: _SERVER_INFO_100 *	p100;
1034 *		case 101: _SERVER_INFO_101 *	p101;
1035 *		case 102: _SERVER_INFO_102 *	p102;
1036 *	    }		bufptr,
1037 *	OUT DWORD	status
1038 *      )
1039 */
1040
1041/* for svX_platform */
1042#define	SV_PLATFORM_ID_DOS		300
1043#define	SV_PLATFORM_ID_OS2		400
1044#define	SV_PLATFORM_ID_NT		500
1045#define	SV_PLATFORM_ID_OSF		600
1046#define	SV_PLATFORM_ID_VMS		700
1047
1048/* Bit-mapped values for svX_type fields */
1049#define SV_TYPE_WORKSTATION         0x00000001
1050#define SV_TYPE_SERVER              0x00000002
1051#define SV_TYPE_SQLSERVER           0x00000004
1052#define SV_TYPE_DOMAIN_CTRL         0x00000008
1053#define SV_TYPE_DOMAIN_BAKCTRL      0x00000010
1054#define SV_TYPE_TIME_SOURCE         0x00000020
1055#define SV_TYPE_AFP                 0x00000040
1056#define SV_TYPE_NOVELL              0x00000080
1057#define SV_TYPE_DOMAIN_MEMBER       0x00000100
1058#define SV_TYPE_PRINTQ_SERVER       0x00000200
1059#define SV_TYPE_DIALIN_SERVER       0x00000400
1060#define SV_TYPE_XENIX_SERVER        0x00000800
1061#define SV_TYPE_SERVER_UNIX         SV_TYPE_XENIX_SERVER
1062#define SV_TYPE_NT                  0x00001000
1063#define SV_TYPE_WFW                 0x00002000
1064
1065#define SV_TYPE_SERVER_MFPN         0x00004000
1066#define SV_TYPE_SERVER_NT           0x00008000
1067#define SV_TYPE_POTENTIAL_BROWSER   0x00010000
1068#define SV_TYPE_BACKUP_BROWSER      0x00020000
1069#define SV_TYPE_MASTER_BROWSER      0x00040000
1070#define SV_TYPE_DOMAIN_MASTER       0x00080000
1071#define SV_TYPE_SERVER_OSF          0x00100000
1072#define SV_TYPE_SERVER_VMS          0x00200000
1073#define SV_TYPE_WINDOWS             0x00400000  /* Windows95 and above */
1074#define SV_TYPE_ALTERNATE_XPORT     0x20000000  /* return list for
1075						 * alternate transport */
1076#define SV_TYPE_LOCAL_LIST_ONLY     0x40000000  /* Return local list only */
1077#define SV_TYPE_DOMAIN_ENUM         0x80000000
1078#define SV_TYPE_ALL                 0xFFFFFFFF  /* handy for NetServerEnum2 */
1079
1080/* NT-Server 4.0 sends 0x0006_120B */
1081#define SV_TYPE_SENT_BY_NT_4_0_SERVER \
1082	(  SV_TYPE_WORKSTATION \
1083	 | SV_TYPE_SERVER \
1084	 | SV_TYPE_DOMAIN_CTRL \
1085	 | SV_TYPE_NT \
1086	 | SV_TYPE_BACKUP_BROWSER \
1087	 | SV_TYPE_MASTER_BROWSER)
1088/* NT-workstation 4.0 send 0x0004_1013 */
1089#define SV_TYPE_SENT_BY_NT_4_0_WORKSTATION \
1090	(  SV_TYPE_WORKSTATION \
1091	 | SV_TYPE_SERVER \
1092	 | SV_TYPE_DOMAIN_BAKCTRL \
1093	 | SV_TYPE_NT \
1094	 | SV_TYPE_MASTER_BROWSER)
1095
1096/* Special value for sv102_disc that specifies infinite disconnect time */
1097#define SV_NODISC           (-1L)  /* No autodisconnect timeout enforced */
1098
1099/* Values of svX_security field */
1100#define SV_USERSECURITY     1
1101#define SV_SHARESECURITY    0
1102
1103/* Values of svX_hidden field */
1104#define SV_HIDDEN       1
1105#define SV_VISIBLE      0
1106
1107
1108struct mslm_SERVER_INFO_100 {
1109	DWORD		sv100_platform_id;
1110	LPTSTR		sv100_name;
1111};
1112
1113struct mslm_SERVER_INFO_101 {
1114	DWORD		sv101_platform_id;
1115	LPTSTR		sv101_name;
1116	DWORD		sv101_version_major;
1117	DWORD		sv101_version_minor;
1118	DWORD		sv101_type;
1119	LPTSTR		sv101_comment;
1120};
1121
1122struct mslm_SERVER_INFO_102 {
1123	DWORD		sv102_platform_id;
1124	LPTSTR		sv102_name;
1125	DWORD		sv102_version_major;
1126	DWORD		sv102_version_minor;
1127	DWORD		sv102_type;
1128	LPTSTR		sv102_comment;
1129	DWORD		sv102_users;
1130	DWORD		sv102_disc;
1131	DWORD		sv102_hidden;		/* BOOL */
1132	DWORD		sv102_announce;
1133	DWORD		sv102_anndelta;
1134	DWORD		sv102_licenses;
1135	LPTSTR		sv102_userpath;
1136};
1137
1138struct mslm_SERVER_INFO_502 {
1139	DWORD sv502_sessopens;
1140	DWORD sv502_sessvcs;
1141	DWORD sv502_opensearch;
1142	DWORD sv502_sizreqbuf;
1143	DWORD sv502_initworkitems;
1144	DWORD sv502_maxworkitems;
1145	DWORD sv502_rawworkitems;
1146	DWORD sv502_irpstacksize;
1147	DWORD sv502_maxrawbuflen;
1148	DWORD sv502_sessusers;
1149	DWORD sv502_sessconns;
1150	DWORD sv502_maxpagedmemoryusage;
1151	DWORD sv502_maxnonpagedmemoryusage;
1152	DWORD sv502_enablesoftcompat;
1153	DWORD sv502_enableforcedlogoff;
1154	DWORD sv502_timesource;
1155	DWORD sv502_acceptdownlevelapis;
1156	DWORD sv502_lmannounce;
1157};
1158
1159struct mslm_SERVER_INFO_503 {
1160	DWORD sv503_sessopens;
1161	DWORD sv503_sessvcs;
1162	DWORD sv503_opensearch;
1163	DWORD sv503_sizreqbuf;
1164	DWORD sv503_initworkitems;
1165	DWORD sv503_maxworkitems;
1166	DWORD sv503_rawworkitems;
1167	DWORD sv503_irpstacksize;
1168	DWORD sv503_maxrawbuflen;
1169	DWORD sv503_sessusers;
1170	DWORD sv503_sessconns;
1171	DWORD sv503_maxpagedmemoryusage;
1172	DWORD sv503_maxnonpagedmemoryusage;
1173	DWORD sv503_enablesoftcompat;
1174	DWORD sv503_enableforcedlogoff;
1175	DWORD sv503_timesource;
1176	DWORD sv503_acceptdownlevelapis;
1177	DWORD sv503_lmannounce;
1178	LPTSTR sv503_domain;
1179	DWORD sv503_maxcopyreadlen;
1180	DWORD sv503_maxcopywritelen;
1181	DWORD sv503_minkeepsearch;
1182	DWORD sv503_maxkeepsearch;
1183	DWORD sv503_minkeepcomplsearch;
1184	DWORD sv503_maxkeepcomplsearch;
1185	DWORD sv503_threadcountadd;
1186	DWORD sv503_numblockthreads;
1187	DWORD sv503_scavtimeout;
1188	DWORD sv503_minrcvqueue;
1189	DWORD sv503_minfreeworkitems;
1190	DWORD sv503_xactmemsize;
1191	DWORD sv503_threadpriority;
1192	DWORD sv503_maxmpxct;
1193	DWORD sv503_oplockbreakwait;
1194	DWORD sv503_oplockbreakresponsewait;
1195	DWORD sv503_enableoplocks;
1196	DWORD sv503_enableoplockforceclose;
1197	DWORD sv503_enablefcbopens;
1198	DWORD sv503_enableraw;
1199	DWORD sv503_enablesharednetdrives;
1200	DWORD sv503_minfreeconnections;
1201	DWORD sv503_maxfreeconnections;
1202};
1203
1204union mslm_NetServerGetInfo_ru {
1205	CASE(100)	struct mslm_SERVER_INFO_100 *bufptr100;
1206	CASE(101)	struct mslm_SERVER_INFO_101 *bufptr101;
1207	CASE(102)	struct mslm_SERVER_INFO_102 *bufptr102;
1208	CASE(502)	struct mslm_SERVER_INFO_502 *bufptr502;
1209	CASE(503)	struct mslm_SERVER_INFO_503 *bufptr503;
1210	DEFAULT		char *nullptr;
1211};
1212
1213struct mslm_NetServerGetInfo_result {
1214	DWORD level;
1215  SWITCH(level)
1216	union mslm_NetServerGetInfo_ru bufptr;
1217};
1218
1219
1220OPERATION(SRVSVC_OPNUM_NetServerGetInfo)
1221struct mslm_NetServerGetInfo {
1222	IN  LPTSTR	servername;
1223	IN  DWORD	level;
1224	OUT struct mslm_NetServerGetInfo_result result;
1225	OUT DWORD	status;
1226};
1227
1228/*
1229 * SRVSVC NetRemoteTOD (
1230 *	IN LPTSTR	servername,
1231 *	OUT _TIME_OF_DAY_INFO *bufptr,
1232 *	OUT long	status
1233 *      )
1234 */
1235
1236struct mslm_TIME_OF_DAY_INFO {
1237	DWORD		tod_elapsedt;
1238	DWORD		tod_msecs;
1239	DWORD		tod_hours;
1240	DWORD		tod_mins;
1241	DWORD		tod_secs;
1242	DWORD		tod_hunds;
1243	DWORD		tod_timezone;
1244	DWORD		tod_tinterval;
1245	DWORD		tod_day;
1246	DWORD		tod_month;
1247	DWORD		tod_year;
1248	DWORD		tod_weekday;
1249};
1250
1251OPERATION(SRVSVC_OPNUM_NetRemoteTOD)
1252struct mslm_NetRemoteTOD {
1253	IN  LPTSTR	servername;
1254	OUT struct mslm_TIME_OF_DAY_INFO *bufptr;
1255	OUT DWORD	status;
1256};
1257
1258#define	NAMETYPE_USER		1
1259#define	NAMETYPE_PASSWORD	2
1260#define	NAMETYPE_GROUP		3
1261#define	NAMETYPE_COMPUTER	4
1262#define	NAMETYPE_EVENT		5
1263#define	NAMETYPE_DOMAIN		6
1264#define	NAMETYPE_SERVICE	7
1265#define	NAMETYPE_NET		8
1266#define	NAMETYPE_SHARE		9
1267#define	NAMETYPE_MESSAGE	10
1268#define	NAMETYPE_MESSAGEDEST	11
1269#define	NAMETYPE_SHAREPASSWORD	12
1270#define	NAMETYPE_WORKGROUP	13
1271
1272OPERATION(SRVSVC_OPNUM_NetNameValidate)
1273struct mslm_NetNameValidate {
1274 	IN  LPTSTR		servername;
1275 	IN  REFERENCE LPTSTR 	pathname;
1276	IN  DWORD		type;
1277	IN  DWORD		flags;
1278	OUT DWORD		status;
1279};
1280
1281/*
1282 * SRVSVC NetShareEnum (
1283 *	IN  LPTSTR	servername,
1284 *	IN  DWORD	level;
1285 *	OUT union switch(level) {
1286 *		case 0: struct {
1287 *				DWORD entriesread;
1288 *			     [size_is(entriesread)]
1289 *				_SHARE_INFO_0 *entries;
1290 *			} *bufptr0;
1291 *		case 1: struct {
1292 *				DWORD entriesread;
1293 *			     [size_is(entriesread)]
1294 *				_SHARE_INFO_1 *entries;
1295 *			} *bufptr1;
1296 *		...
1297 *	    }		bufptr,
1298 *	IN  DWORD	prefmaxlen,
1299 *	OUT DWORD	totalentries,
1300 *	IN OUT DWORD ?*	resume_handle,
1301 *	OUT DWORD	status
1302 *      )
1303 */
1304
1305/*
1306 * Share types for shiX_type fields - duplicated from cifs.h
1307 */
1308#ifndef _SHARE_TYPES_DEFINED_
1309#define _SHARE_TYPES_DEFINED_
1310#define STYPE_DISKTREE          0x00000000
1311#define STYPE_PRINTQ            0x00000001
1312#define STYPE_DEVICE            0x00000002
1313#define STYPE_IPC               0x00000003
1314#define STYPE_MASK              0x0000000F
1315#define STYPE_DFS               0x00000064
1316#define STYPE_HIDDEN            0x80000000
1317#define STYPE_SPECIAL           0x80000000
1318#endif /* _SHARE_TYPES_DEFINED_ */
1319
1320/* Maximum uses for shiX_max_uses fields */
1321#define SHI_USES_UNLIMITED      (DWORD)-1
1322
1323INFONRES_RESULT(mslm_NetShareInfo,0)
1324INFONRES_RESULT(mslm_NetShareInfo,1)
1325INFONRES_RESULT(mslm_NetShareInfo,2)
1326INFONRES_RESULT(mslm_NetShareInfo,501)
1327INFONRES_RESULT(mslm_NetShareInfo,502)
1328
1329union mslm_NetShareAddInfo_u {
1330	CASE(2)     struct mslm_NetShareInfo_2 *info2;
1331	CASE(502)   struct mslm_NetShareInfo_502 *info502;
1332	DEFAULT	char *nullptr;
1333};
1334
1335struct mslm_NetShareAddInfo {
1336	DWORD switch_value;
1337  SWITCH(switch_value)
1338	union mslm_NetShareAddInfo_u un;
1339};
1340
1341
1342OPERATION(SRVSVC_OPNUM_NetShareAdd)
1343struct mslm_NetShareAdd {
1344	IN	LPTSTR servername;
1345	IN	DWORD level;
1346	IN	struct mslm_NetShareAddInfo info;
1347	INOUT	DWORD *parm_err;
1348	OUT	DWORD status;
1349};
1350
1351
1352INFONRES_DEFINITION(mslm_NetShareEnum,
1353	INFONRES_UNION_ENTRY(mslm_NetShareInfo,0)
1354	INFONRES_UNION_ENTRY(mslm_NetShareInfo,1)
1355	INFONRES_UNION_ENTRY(mslm_NetShareInfo,2)
1356	INFONRES_UNION_ENTRY(mslm_NetShareInfo,501)
1357	INFONRES_UNION_ENTRY(mslm_NetShareInfo,502))
1358
1359/*
1360 * NetShareEnum: enumerate all shares (see also NetShareEnumSticky).
1361 * Note: the server should ignore the content of servername.
1362 */
1363OPERATION(SRVSVC_OPNUM_NetShareEnum)
1364struct mslm_NetShareEnum {
1365	IN  		LPTSTR	servername;
1366	INOUT  		DWORD	level;
1367	INOUT 		struct mslm_NetShareEnum_result result;
1368	IN  		DWORD	prefmaxlen;
1369	OUT 		DWORD	totalentries;
1370	INOUT 		DWORD	*resume_handle;
1371	OUT 		DWORD	status;
1372};
1373
1374/*
1375 * Delete a share. The reserved field appears in netmon
1376 * but I've left it out in case it's not always present.
1377 * This won't affect RPC processing.
1378 */
1379OPERATION(SRVSVC_OPNUM_NetShareDel)
1380struct mslm_NetShareDel {
1381	IN	LPTSTR servername;
1382	IN REFERENCE	LPTSTR netname;
1383	/* IN	DWORD reserved; */
1384	OUT	DWORD status;
1385};
1386
1387OPERATION(SRVSVC_OPNUM_NetShareCheck)
1388struct mslm_NetShareCheck {
1389	IN	LPTSTR servername;
1390	IN REFERENCE	LPTSTR path;
1391	OUT	DWORD stype;
1392	OUT	DWORD status;
1393};
1394
1395/*
1396 * NetShareEnumSticky is the same as NetShareEnum except that
1397 * STYPE_SPECIAL (hidden or special) shares are not returned.
1398 * Note: the server should ignore the content of servername.
1399 */
1400OPERATION(SRVSVC_OPNUM_NetShareEnumSticky)
1401struct mslm_NetShareEnumSticky {
1402	IN  		LPTSTR	servername;
1403	INOUT  		DWORD	level;
1404	INOUT 		struct mslm_NetShareEnum_result result;
1405	IN  		DWORD	prefmaxlen;
1406	OUT 		DWORD	totalentries;
1407	INOUT 		DWORD	*resume_handle;
1408	OUT 		DWORD	status;
1409};
1410
1411/*
1412 * When you install Windows NT Server Tools on a Win95 client,
1413 * a security tab will be added to properties dialog box of files/folders.
1414 * Within this security tab, when you try to get/set permissions on a
1415 * file/folder the next two RPC calls are used.
1416 */
1417OPERATION(SRVSVC_OPNUM_NetGetFileSecurity)
1418struct mslm_NetGetFileSecurity {
1419	IN  		LPTSTR	servername;
1420	IN			LPTSTR	sharename;
1421	IN REFERENCE LPTSTR	filename;
1422	IN			DWORD	securityinfo;
1423
1424	/*
1425	 * Right now, we can't send back SD of the requested object
1426	 * in RPC code, so we just reply with access denied error
1427	 * code. Thus, this output declaration is only valid in this
1428	 * case i.e., it's not complete.
1429	 * It looks like:
1430	 *
1431	 *   A Pointer
1432	 *   A Length
1433	 *
1434	 *   A Pointer
1435	 *   A Length (equal to the prev length)
1436	 *   A buffer
1437	 *
1438	 *   return value
1439	 */
1440	OUT			DWORD	length;
1441	OUT 		DWORD	status;
1442};
1443
1444/*
1445 * This is the request:
1446 *
1447 * R_SRVSVC: RPC Client call srvsvc:NetrpSetFileSecurity(..)
1448 *	 R_SRVSVC: SRVSVC_HANDLE ServerName = \\WK76-177
1449 *	 R_SRVSVC: LPWSTR ShareName = AFSHIN
1450 *	 R_SRVSVC: LPWSTR lpFileName = \salek.txt
1451 *	 R_SRVSVC: SECURITY_INFORMATION SecurityInformation = 4 (0x4)
1452 *  -R_SRVSVC: PADT_SECURITY_DESCRIPTOR SecurityDescriptor {..}
1453 *  R_SRVSVC: DWORD Length = 64 (0x40)
1454 *  R_SRVSVC: LPBYTE Buffer = 4496048 (0x449AB0)
1455 *  R_SRVSVC: LPBYTE Buffer [..] = 01 00 04 80 00 00 00 00 00 00 00 00 00 00 00
1456 *  ...
1457 *
1458 *  000000A0        00 83 46 00 0B 00 00 00 00 00 00 00 0B 00   ..F...........
1459 *  000000B0  00 00 5C 00 5C 00 57 00 4B 00 37 00 36 00 2D 00 ..\.\.W.K.7.6.-.
1460 *  000000C0  31 00 37 00 37 00 00 00 08 00 16 83 46 00 07 00 1.7.7.......F...
1461 *  000000D0  00 00 00 00 00 00 07 00 00 00 41 00 46 00 53 00 ..........A.F.S.
1462 *  000000E0  48 00 49 00 4E 00 00 00 00 00 0B 00 00 00 00 00 H.I.N...........
1463 *  000000F0  00 00 0B 00 00 00 5C 00 73 00 61 00 6C 00 65 00 ......\.s.a.l.e.
1464 *  00000100  6B 00 2E 00 74 00 78 00 74 00 00 00 00 00 04 00 k...t.x.t.......
1465 *  00000110  00 00 40 00 00 00 B0 9A 44 00 40 00 00 00 01 00 ..@.....D.@.....
1466 *  00000120  04 80 00 00 00 00 00 00 00 00 00 00 00 00 14 00 ................
1467 *  00000130  00 00 02 00 2C 00 01 00 00 00 00 00 24 00 00 00 ....,.......$...
1468 *  00000140  00 A0 01 05 00 00 00 00 00 05 15 00 00 00 1A 24 ...............$
1469 *  00000150  44 38 90 00 0F 02 65 3A BE 4C FF 03 00 00 00 00 D8....e:.L......
1470 *  00000160  00 00 00 00 00 00 00 00 00 00                   ..........
1471 */
1472OPERATION(SRVSVC_OPNUM_NetSetFileSecurity)
1473struct mslm_NetSetFileSecurity {
1474	IN  		LPTSTR	servername;
1475	IN			LPTSTR	sharename;
1476	IN REFERENCE LPTSTR	filename;
1477	IN			DWORD	securityinfo;
1478	/*
1479	 * IN Security Descriptor (looks like):
1480	 * Length1
1481	 * Pointer
1482	 * Length2 (== Length1)
1483	 * buffer itself
1484	 */
1485
1486	OUT 		DWORD	status;
1487};
1488
1489/*
1490 * The SRVSVC already
1491 */
1492INTERFACE(0)
1493union srvsvc_interface {
1494    CASE(SRVSVC_OPNUM_NetConnectEnum)
1495	struct mslm_NetConnectEnum	NetConnectEnum;
1496    CASE(SRVSVC_OPNUM_NetFileEnum)
1497	struct mslm_NetFileEnum		NetFileEnum;
1498    CASE(SRVSVC_OPNUM_NetFileClose)
1499	struct mslm_NetFileClose	NetFileClose;
1500    CASE(SRVSVC_OPNUM_NetShareGetInfo)
1501	struct mlsm_NetShareGetInfo	NetShareGetInfo;
1502    CASE(SRVSVC_OPNUM_NetShareSetInfo)
1503	struct mlsm_NetShareSetInfo	NetShareSetInfo;
1504    CASE(SRVSVC_OPNUM_NetSessionDel)
1505	struct mslm_NetSessionDel	NetSessionDel;
1506    CASE(SRVSVC_OPNUM_NetSessionEnum)
1507	struct mslm_NetSessionEnum	NetSessionEnum;
1508    CASE(SRVSVC_OPNUM_NetServerGetInfo)
1509	struct mslm_NetServerGetInfo	NetServerGetInfo;
1510    CASE(SRVSVC_OPNUM_NetRemoteTOD)
1511	struct mslm_NetRemoteTOD	NetRemoteTOD;
1512    CASE(SRVSVC_OPNUM_NetNameValidate)
1513	struct mslm_NetNameValidate	NetNameValidate;
1514    CASE(SRVSVC_OPNUM_NetShareAdd)
1515	struct mslm_NetShareAdd		NetShareAdd;
1516    CASE(SRVSVC_OPNUM_NetShareDel)
1517	struct mslm_NetShareDel		NetShareDel;
1518    CASE(SRVSVC_OPNUM_NetShareCheck)
1519	struct mslm_NetShareCheck	NetShareCheck;
1520    CASE(SRVSVC_OPNUM_NetShareEnum)
1521	struct mslm_NetShareEnum	NetShareEnum;
1522    CASE(SRVSVC_OPNUM_NetShareEnumSticky)
1523	struct mslm_NetShareEnumSticky	NetShareEnumSticky;
1524    CASE(SRVSVC_OPNUM_NetGetFileSecurity)
1525	struct mslm_NetGetFileSecurity	NetGetFileSecurity;
1526    CASE(SRVSVC_OPNUM_NetSetFileSecurity)
1527	struct mslm_NetSetFileSecurity	NetSetFileSecurity;
1528};
1529typedef union srvsvc_interface	srvsvc_interface_t;
1530EXTERNTYPEINFO(srvsvc_interface)
1531
1532
1533
1534/*
1535 * WKSSVC - Workstation Service
1536 */
1537
1538/* Windows NT */
1539#define WKSSVC_OPNUM_NetWkstaGetInfo		0x00
1540#define WKSSVC_OPNUM_NetWkstaSetInfo		0x01
1541#define WKSSVC_OPNUM_NetWkstaUserEnum		0x02
1542#define WKSSVC_OPNUM_NetWkstaUserGetInfo	0x03
1543#define WKSSVC_OPNUM_NetWkstaUserSetInfo	0x04
1544#define WKSSVC_OPNUM_NetWkstaTransportEnum	0x05
1545#define WKSSVC_OPNUM_NetWkstaTransportAdd	0x06
1546#define WKSSVC_OPNUM_NetWkstaTransportDel	0x07
1547#define WKSSVC_OPNUM_NetUseAdd			0x08
1548#define WKSSVC_OPNUM_NetUseGetInfo		0x09
1549#define WKSSVC_OPNUM_NetUseDel			0x0a
1550#define WKSSVC_OPNUM_NetUseEnum			0x0b
1551#define WKSSVC_OPNUM_NetMessageBufferSend	0x0c
1552#define WKSSVC_OPNUM_NetWkstaStatisticsGet	0x0d
1553#define WKSSVC_OPNUM_NetLogonDomainNameAdd	0x0e
1554
1555/* Windows 2000 */
1556#define WKSSVC_OPNUM_NetLogonDomainNameDel	0x0f
1557#define WKSSVC_OPNUM_NetJoinDomain		0x10
1558#define WKSSVC_OPNUM_NetUnjoinDomain		0x11
1559#define WKSSVC_OPNUM_NetValidateName		0x12
1560#define WKSSVC_OPNUM_NetRenameMachineInDomain	0x13
1561#define WKSSVC_OPNUM_NetGetJoinInformation	0x14
1562#define WKSSVC_OPNUM_NetGetJoinableOUs		0x15
1563#define WKSSVC_OPNUM_NetJoinDomain2		0x16
1564#define WKSSVC_OPNUM_NetUnjoinDomain2		0x17
1565#define WKSSVC_OPNUM_NetRenameMachineInDomain2	0x18
1566#define WKSSVC_OPNUM_NetValidateName2		0x19
1567#define WKSSVC_OPNUM_NetGetJoinableOUs2		0x1a
1568
1569/* Windows XP and Windows Server 2003 */
1570#define WKSSVC_OPNUM_NetAddAlternateComputerName	0x1b
1571#define WKSSVC_OPNUM_NetRemoveAlternateComputerName	0x1c
1572#define WKSSVC_OPNUM_NetSetPrimaryComputerName		0x1d
1573#define WKSSVC_OPNUM_NetEnumerateComputerNames		0x1e
1574#define WKSSVC_OPNUM_NetWorkstationResetDfsCache	0x1f
1575
1576
1577struct mslm_WKSTA_INFO_100 {
1578    DWORD   wki100_platform_id;
1579    LPTSTR  wki100_computername;
1580    LPTSTR  wki100_langroup;
1581    DWORD   wki100_ver_major;
1582    DWORD   wki100_ver_minor;
1583};
1584
1585/* NetWkstaGetInfo only.  System information - user access */
1586struct mslm_WKSTA_INFO_101 {
1587    DWORD   wki101_platform_id;
1588    LPTSTR  wki101_computername;
1589    LPTSTR  wki101_langroup;
1590    DWORD   wki101_ver_major;
1591    DWORD   wki101_ver_minor;
1592    LPTSTR  wki101_lanroot;
1593};
1594
1595/* NetWkstaGetInfo only.  System information - admin or operator access */
1596struct mslm_WKSTA_INFO_102 {
1597    DWORD   wki102_platform_id;
1598    LPTSTR  wki102_computername;
1599    LPTSTR  wki102_langroup;
1600    DWORD   wki102_ver_major;
1601    DWORD   wki102_ver_minor;
1602    LPTSTR  wki102_lanroot;
1603    DWORD   wki102_logged_on_users;
1604};
1605
1606struct mslm_WKSTA_INFO_502 {
1607	DWORD char_wait;
1608	DWORD collection_time;
1609	DWORD maximum_collection_count;
1610	DWORD keep_connection;
1611	DWORD max_commands;
1612	DWORD session_timeout;
1613	DWORD size_char_buf;
1614	DWORD max_threads;
1615	DWORD lock_quota;
1616	DWORD lock_increment;
1617	DWORD lock_maximum;
1618	DWORD pipe_increment;
1619	DWORD pipe_maximum;
1620	DWORD cache_file_timeout;
1621	DWORD dormant_file_limit;
1622	DWORD read_ahead_throughput;
1623	DWORD num_mailslot_buffers;
1624	DWORD num_srv_announce_buffers;
1625	DWORD max_illegal_dgram_events;
1626	DWORD dgram_event_reset_freq;
1627	DWORD log_election_packets;
1628	DWORD use_opportunistic_locking;
1629	DWORD use_unlock_behind;
1630	DWORD use_close_behind;
1631	DWORD buf_named_pipes;
1632	DWORD use_lock_read_unlock;
1633	DWORD utilize_nt_caching;
1634	DWORD use_raw_read;
1635	DWORD use_raw_write;
1636	DWORD use_write_raw_data;
1637	DWORD use_encryption;
1638	DWORD buf_files_deny_write;
1639	DWORD buf_read_only_files;
1640	DWORD force_core_create_mode;
1641	DWORD use_512_byte_max_transfer;
1642};
1643
1644INFO1RES_DEFINITION(mslm_NetWkstaGetInfo,
1645	INFO1RES_UNION_ENTRY(mslm_WKSTA_INFO,100)
1646	INFO1RES_UNION_ENTRY(mslm_WKSTA_INFO,101)
1647	INFO1RES_UNION_ENTRY(mslm_WKSTA_INFO,102)
1648	INFO1RES_UNION_ENTRY(mslm_WKSTA_INFO,502))
1649
1650INFO1RESBUF_DEFINITION(mslm_NetWkstaGetInfo,
1651	INFO1RESBUF_UNION_ENTRY(mslm_WKSTA_INFO,100)
1652	INFO1RESBUF_UNION_ENTRY(mslm_WKSTA_INFO,101)
1653	INFO1RESBUF_UNION_ENTRY(mslm_WKSTA_INFO,102)
1654	INFO1RESBUF_UNION_ENTRY(mslm_WKSTA_INFO,502))
1655
1656
1657OPERATION(WKSSVC_OPNUM_NetWkstaGetInfo)
1658struct mslm_NetWkstaGetInfo {
1659	IN  LPTSTR	servername;
1660	IN  DWORD	level;
1661	OUT struct mslm_NetWkstaGetInfo_result result;
1662	OUT DWORD	status;
1663};
1664
1665/*
1666 ***********************************************************************
1667 * NetWkstaTransportEnum
1668 ***********************************************************************
1669 */
1670
1671struct mslm_NetWkstaTransportInfo0 {
1672	DWORD quality_of_service;
1673	DWORD num_vcs;
1674	LPTSTR transport_name;
1675	LPTSTR transport_address;
1676	DWORD wan_ish;
1677};
1678
1679struct mslm_NetWkstaTransportCtr0 {
1680	DWORD count;
1681    SIZE_IS(count)
1682	struct mslm_NetWkstaTransportInfo0 *ti0;
1683};
1684
1685union mslm_NetWkstaTransportInfo_ru {
1686	CASE(0) struct mslm_NetWkstaTransportCtr0 *info0;
1687	DEFAULT char *nullptr;
1688};
1689
1690struct mslm_NetWkstaTransportInfo {
1691	DWORD address;
1692	DWORD level;
1693    SWITCH(level)
1694	union mslm_NetWkstaTransportInfo_ru ru;
1695};
1696
1697OPERATION(WKSSVC_OPNUM_NetWkstaTransportEnum)
1698struct mslm_NetWkstaTransportEnum {
1699	IN 	LPTSTR	servername;
1700	INOUT	struct mslm_NetWkstaTransportInfo info;
1701	IN	DWORD	pref_max_len;
1702	OUT 	DWORD	total_entries;
1703	INOUT	DWORD	*resume_handle;
1704	OUT	DWORD	status;
1705};
1706
1707/*
1708 * The WKSSVC already
1709 */
1710INTERFACE(0)
1711union wkssvc_interface {
1712    CASE(WKSSVC_OPNUM_NetWkstaGetInfo)
1713	struct mslm_NetWkstaGetInfo		NetWkstaGetInfo;
1714    CASE(WKSSVC_OPNUM_NetWkstaTransportEnum)
1715	struct mslm_NetWkstaTransportEnum	NetWkstaTransportEnum;
1716};
1717typedef union wkssvc_interface	wkssvc_interface_t;
1718EXTERNTYPEINFO(wkssvc_interface)
1719
1720
1721#endif /* _MLSVC_LANMAN_NDL_ */
1722