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 2010 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 */
275 struct 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 */
361 struct mslm_NetConnectInfoBuf0 {
362 DWORD coni0_id;
363 };
364 typedef struct mslm_NetConnectInfoBuf0 srvsvc_NetConnectInfoBuf0_t;
365
366 struct mslm_NetConnectInfo0 {
367 DWORD entries_read;
368 SIZE_IS(entries_read)
369 struct mslm_NetConnectInfoBuf0 *ci0;
370 };
371 typedef struct mslm_NetConnectInfo0 srvsvc_NetConnectInfo0_t;
372
373 /*
374 * Level 1 connect information.
375 */
376 struct 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 };
385 typedef struct mslm_NetConnectInfoBuf1 srvsvc_NetConnectInfoBuf1_t;
386
387 struct mslm_NetConnectInfo1 {
388 DWORD entries_read;
389 SIZE_IS(entries_read)
390 struct mslm_NetConnectInfoBuf1 *ci1;
391 };
392 typedef struct mslm_NetConnectInfo1 srvsvc_NetConnectInfo1_t;
393
394 union mslm_NetConnectInfoResUnion {
395 CASE(0) struct mslm_NetConnectInfo0 *info0;
396 CASE(1) struct mslm_NetConnectInfo1 *info1;
397 DEFAULT char *nullptr;
398 };
399
400 struct mslm_NetConnectInfo {
401 DWORD level;
402 DWORD switch_value;
403 SWITCH(switch_value)
404 union mslm_NetConnectInfoResUnion ru;
405 };
406 typedef struct mslm_NetConnectInfo srvsvc_NetConnectInfo_t;
407
408 OPERATION(SRVSVC_OPNUM_NetConnectEnum)
409 struct 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 */
425 struct mslm_NetFileInfoBuf2 {
426 DWORD fi2_id;
427 };
428 typedef struct mslm_NetFileInfoBuf2 srvsvc_NetFileInfoBuf2_t;
429
430 struct mslm_NetFileInfo2 {
431 DWORD entries_read;
432 SIZE_IS(entries_read)
433 struct mslm_NetFileInfoBuf2 *fi2;
434 };
435 typedef struct mslm_NetFileInfo2 srvsvc_NetFileInfo2_t;
436
437 struct mslm_NetFileInfoBuf3 {
438 DWORD fi3_id;
439 DWORD fi3_permissions;
440 DWORD fi3_num_locks;
441 LPTSTR fi3_pathname;
442 LPTSTR fi3_username;
443 };
444 typedef struct mslm_NetFileInfoBuf3 srvsvc_NetFileInfoBuf3_t;
445
446 struct mslm_NetFileInfo3 {
447 DWORD entries_read;
448 SIZE_IS(entries_read)
449 struct mslm_NetFileInfoBuf3 *fi3;
450 };
451 typedef struct mslm_NetFileInfo3 srvsvc_NetFileInfo3_t;
452
453 union mslm_NetFileInfoResUnion {
454 CASE(2) struct mslm_NetFileInfo2 *info2;
455 CASE(3) struct mslm_NetFileInfo3 *info3;
456 DEFAULT char *nullptr;
457 };
458
459 struct mslm_NetFileInfo {
460 DWORD level;
461 DWORD switch_value;
462 SWITCH(switch_value)
463 union mslm_NetFileInfoResUnion ru;
464 };
465
466 OPERATION(SRVSVC_OPNUM_NetFileEnum)
467 struct 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 */
486 OPERATION(SRVSVC_OPNUM_NetFileClose)
487 struct 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 */
572 struct 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
580 struct mslm_ace_hdr {
581 BYTE type;
582 BYTE flags;
583 WORD size;
584 };
585 typedef struct mslm_ace_hdr mslm_ace_hdr_t;
586
587 struct mslm_ace {
588 mslm_ace_hdr_t header;
589 DWORD mask;
590 struct mslm_sid *sid;
591 };
592 typedef struct mslm_ace mslm_ace_t;
593
594 struct 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 */
607 struct 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 };
620 typedef struct mslm_security_descriptor mslm_security_descriptor_t;
621
622 struct mslm_NetShareInfo_0 {
623 LPTSTR shi0_netname;
624 };
625
626 struct mslm_NetShareInfo_1 {
627 LPTSTR shi1_netname;
628 DWORD shi1_type; /* type of resource such as IPC$ */
629 LPTSTR shi1_comment;
630 };
631
632 struct 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 struct mslm_NetShareInfo_501 {
644 LPTSTR shi501_netname;
645 DWORD shi501_type;
646 LPTSTR shi501_comment;
647 DWORD shi501_flags;
648 };
649
650 struct mslm_NetShareInfo_502 {
651 LPTSTR shi502_netname;
652 DWORD shi502_type;
653 LPTSTR shi502_comment;
654 DWORD shi502_permissions;
655 DWORD shi502_max_uses;
656 DWORD shi502_current_uses;
657 LPTSTR shi502_path;
658 LPTSTR shi502_passwd;
659 DWORD shi502_reserved;
660 SIZE_IS(shi502_reserved)
661 LPBYTE shi502_security_descriptor;
662 };
663
664 struct mslm_NetShareInfo_503 {
665 LPTSTR shi503_netname;
666 DWORD shi503_type;
667 LPTSTR shi503_comment;
668 DWORD shi503_permissions;
669 DWORD shi503_max_uses;
670 DWORD shi503_current_uses;
671 LPTSTR shi503_path;
672 LPTSTR shi503_passwd;
673 LPTSTR shi503_servername;
674 DWORD shi503_reserved;
675 SIZE_IS(shi503_reserved)
676 LPBYTE shi503_security_descriptor;
677 };
678
679 struct mslm_NetShareInfo_1004 {
680 LPTSTR shi1004_comment;
681 };
682
683 struct mslm_NetShareInfo_1005 {
684 DWORD shi1005_flags;
685 };
686
687 struct mslm_NetShareInfo_1006 {
688 DWORD shi1006_max_uses;
689 };
690
691 struct mslm_NetShareInfo_1501 {
692 DWORD shi1501_reserved;
693 SIZE_IS(shi1501_reserved)
694 LPBYTE shi1501_security_descriptor;
695 };
696
697 union mlsm_NetShareInfoResUnion {
698 CASE(0) struct mslm_NetShareInfo_0 *info0;
699 CASE(1) struct mslm_NetShareInfo_1 *info1;
700 CASE(2) struct mslm_NetShareInfo_2 *info2;
701 CASE(501) struct mslm_NetShareInfo_501 *info501;
702 CASE(502) struct mslm_NetShareInfo_502 *info502;
703 CASE(503) struct mslm_NetShareInfo_503 *info503;
704 CASE(1004) struct mslm_NetShareInfo_1004 *info1004;
705 CASE(1005) struct mslm_NetShareInfo_1005 *info1005;
706 CASE(1006) struct mslm_NetShareInfo_1006 *info1006;
707 CASE(1501) struct mslm_NetShareInfo_1501 *info1501;
708 DEFAULT char *nullptr;
709 };
710
711
712 struct mlsm_NetShareInfoRes {
713 DWORD switch_value;
714 SWITCH(switch_value)
715 union mlsm_NetShareInfoResUnion ru;
716 };
717
718
719 OPERATION(SRVSVC_OPNUM_NetShareGetInfo)
720 struct mlsm_NetShareGetInfo {
721 IN LPTSTR servername;
722 IN REFERENCE LPTSTR netname;
723 IN DWORD level;
724 OUT struct mlsm_NetShareInfoRes result;
725 OUT DWORD status;
726 };
727
728
729 OPERATION(SRVSVC_OPNUM_NetShareSetInfo)
730 struct mlsm_NetShareSetInfo {
731 IN LPTSTR servername;
732 IN REFERENCE LPTSTR netname;
733 IN DWORD level;
734 IN struct mlsm_NetShareInfoRes result;
735 INOUT DWORD *parm_err;
736 OUT DWORD status;
737 };
738
739
740 /*
741 ***********************************************************************
742 * NetSessionEnum
743 *
744 * The NetSessionEnum function provides information about sessions
745 * established on a server.
746 *
747 * Only members of the Administrators or Account Operators local groups
748 * can successfully execute the NetSessionEnum function at level 1 or
749 * level 2. No special group membership is required for level 0 or level
750 * 10 calls.
751 *
752 * Windows NT/2000/XP: The parameter order is as follows.
753 *
754 * NET_API_STATUS NetSessionEnum(LPWSTR servername,
755 * LPWSTR UncClientName,
756 * LPWSTR username,
757 * DWORD level,
758 * LPBYTE *bufptr,
759 * DWORD prefmaxlen,
760 * LPDWORD entriesread,
761 * LPDWORD totalentries,
762 * LPDWORD resume_handle);
763 *
764 * Windows 95/98/Me: The calling application must use the cbBuffer parameter
765 * to specify the size, in bytes, of the information buffer pointed to by the
766 * pbBuffer parameter. (The cbBuffer parameter replaces the prefmaxlen
767 * parameter.) Neither a user name parameter nor a resume handle parameter is
768 * available on this platform. Therefore, the parameter list is as follows.
769 *
770 * API_FUNCTION NetSessionEnum(const char FAR *pszServer,
771 * short sLevel,
772 * char FAR *pbBuffer,
773 * unsigned short cbBuffer,
774 * unsigned short FAR *pcEntriesRead,
775 * unsigned short FAR *pcTotalAvail);
776 *
777 * Parameters
778 *
779 * servername
780 * [in] Pointer to a string that specifies the DNS or NetBIOS name of the
781 * remote server on which the function is to execute. If this parameter is
782 * NULL, the local computer is used.
783 * Windows NT 4.0 and earlier: This string must begin with \\.
784 *
785 * UncClientName
786 * [in] Pointer to a string that specifies the name of the computer session
787 * for which information is to be returned. If this parameter is NULL,
788 * NetSessionEnum returns information for all computer sessions on the server.
789 *
790 * username
791 * [in] Pointer to a string that specifies the name of the user for which
792 * information is to be returned. If this parameter is NULL, NetSessionEnum
793 * returns information for all users.
794 *
795 * level
796 * [in] Specifies the information level of the data. This parameter can be
797 * one of the following values.
798 * Windows NT/2000/XP: The following levels are valid.
799 * Value Meaning
800 * 0 Return the name of the computer that established the session.
801 * The bufptr parameter points to an array of SESSION_INFO_0
802 * structures.
803 * 1 Return the name of the computer, name of the user, and open files,
804 * pipes, and devices on the computer. The bufptr parameter points to
805 * an array of SESSION_INFO_1 structures.
806 * 2 In addition to the information indicated for level 1, return the
807 * type of client and how the user established the session. The bufptr
808 * parameter points to an array of SESSION_INFO_2 structures.
809 * 10 Return the name of the computer, name of the user, and active and
810 * idle times for the session. The bufptr parameter points to an array
811 * of SESSION_INFO_10 structures.
812 * 502 Return the name of the computer; name of the user; open files,
813 * pipes, and devices on the computer; and the name of the transport
814 * the client is using. The bufptr parameter points to an array of
815 * SESSION_INFO_502 structures.
816 *
817 * Windows 95/98/Me: The following level is valid.
818 * Value Meaning
819 * 50 Return the name of the computer, name of the user, open files on
820 * the computer, and the name of the transport protocol the client is
821 * using. The pbBuffer parameter points to an array of session_info_50
822 * structures.
823 *
824 * bufptr
825 * [out] Pointer to the buffer that receives the data. The format of this
826 * data depends on the value of the level parameter.
827 * Windows NT/2000/XP: This buffer is allocated by the system and must be
828 * freed using the NetApiBufferFree function. Note that you must free the
829 * buffer even if the function fails with ERROR_MORE_DATA.
830 * Windows 95/98/Me: The caller must allocate and deallocate this buffer.
831 *
832 * prefmaxlen
833 * [in] Specifies the preferred maximum length of returned data, in bytes.
834 * If you specify MAX_PREFERRED_LENGTH, the function allocates the amount
835 * of memory required for the data. If you specify another value in this
836 * parameter, it can restrict the number of bytes that the function returns.
837 * If the buffer size is insufficient to hold all entries, the function
838 * returns ERROR_MORE_DATA. For more information, see Network Management
839 * Function Buffers and Network Management Function Buffer Lengths.
840 *
841 * entriesread
842 * [out] Pointer to a value that receives the count of elements actually
843 * enumerated.
844 *
845 * totalentries
846 * [out] Pointer to a value that receives the total number of entries that
847 * could have been enumerated from the current resume position.
848 *
849 * resume_handle
850 * [in/out] Pointer to a value that contains a resume handle which is used
851 * to continue an existing session search. The handle should be zero on the
852 * first call and left unchanged for subsequent calls. If resume_handle is
853 * NULL, no resume handle is stored.
854 *
855 *
856 * SESSION_INFO_1
857 * ==============
858 * The SESSION_INFO_1 structure contains information about the session,
859 * including name of the computer; name of the user; and open files, pipes,
860 * and devices on the computer.
861 *
862 * Members
863 *
864 * sesi1_cname
865 * Pointer to a Unicode string specifying the name of the computer that
866 * established the session.
867 *
868 * sesi1_username
869 * Pointer to a Unicode string specifying the name of the user who established
870 * the session.
871 *
872 * sesi1_num_opens
873 * Specifies a DWORD value that contains the number of files, devices,
874 * and pipes opened during the session.
875 *
876 * sesi1_time
877 * Specifies a DWORD value that contains the number of seconds the session
878 * has been active.
879 *
880 * sesi1_idle_time
881 * Specifies a DWORD value that contains the number of seconds the session
882 * has been idle.
883 *
884 * sesi1_user_flags
885 * Specifies a DWORD value that describes how the user established the
886 * session. This member can be one of the following values:
887 * SESS_GUEST The user specified by the sesi1_username member
888 * established the session using a guest account.
889 * SESS_NOENCRYPTION The user specified by the sesi1_username member
890 * established the session without using password
891 * encryption.
892 ***********************************************************************
893 */
894
895 #define SESS_GUEST 0x00000001
896 #define SESS_NOENCRYPTION 0x00000002
897
898 struct mslm_SESSION_INFO_0 {
899 LPTSTR sesi0_cname;
900 };
901 INFONRES_RESULT(mslm_SESSION_INFO, 0)
902
903 struct mslm_SESSION_INFO_1 {
904 LPTSTR sesi1_cname;
905 LPTSTR sesi1_uname;
906 DWORD sesi1_nopens;
907 DWORD sesi1_time;
908 DWORD sesi1_itime;
909 DWORD sesi1_uflags;
910 };
911 INFONRES_RESULT(mslm_SESSION_INFO, 1)
912
913 struct mslm_SESSION_INFO_2 {
914 LPTSTR sesi2_cname;
915 LPTSTR sesi2_uname;
916 DWORD sesi2_nopens;
917 DWORD sesi2_time;
918 DWORD sesi2_itime;
919 DWORD sesi2_uflags;
920 LPTSTR sesi2_cltype_name;
921 };
922 INFONRES_RESULT(mslm_SESSION_INFO, 2)
923
924 struct mslm_SESSION_INFO_10 {
925 LPTSTR sesi10_cname;
926 LPTSTR sesi10_uname;
927 DWORD sesi10_time;
928 DWORD sesi10_itime;
929 };
930 INFONRES_RESULT(mslm_SESSION_INFO, 10)
931
932 struct mslm_SESSION_INFO_502 {
933 LPTSTR sesi502_cname;
934 LPTSTR sesi502_uname;
935 DWORD sesi502_nopens;
936 DWORD sesi502_time;
937 DWORD sesi502_itime;
938 DWORD sesi502_uflags;
939 LPTSTR sesi502_cltype_name;
940 LPTSTR sesi502_transport;
941 };
942 INFONRES_RESULT(mslm_SESSION_INFO, 502)
943
944 INFONRES_DEFINITION(mslm_NetSessionEnum,
945 INFONRES_UNION_ENTRY(mslm_SESSION_INFO, 0)
946 INFONRES_UNION_ENTRY(mslm_SESSION_INFO, 1)
947 INFONRES_UNION_ENTRY(mslm_SESSION_INFO, 2)
948 INFONRES_UNION_ENTRY(mslm_SESSION_INFO, 10)
949 INFONRES_UNION_ENTRY(mslm_SESSION_INFO, 502))
950
951 OPERATION(SRVSVC_OPNUM_NetSessionEnum)
952 struct mslm_NetSessionEnum {
953 IN LPTSTR servername;
954 IN DWORD unc_clientname;
955 IN DWORD username;
956 INOUT DWORD level;
957 INOUT struct mslm_NetSessionEnum_result result;
958 IN DWORD pref_max_len;
959 OUT DWORD total_entries;
960 INOUT DWORD *resume_handle;
961 OUT DWORD status;
962 };
963
964
965 /*
966 ***********************************************************************
967 * NetSessionDel (Platform SDK: Network Management)
968 *
969 * The NetSessionDel function ends a network session between a server
970 * and a workstation.
971 *
972 * Security Requirements
973 * Only members of the Administrators or Account Operators local group
974 * can successfully execute the NetSessionDel function.
975 *
976 * Windows NT/2000/XP: The parameter order is as follows.
977 *
978 * NET_API_STATUS NetSessionDel(LPWSTR servername,
979 * LPWSTR UncClientName,
980 * LPWSTR username);
981 *
982 * Windows 95/98/Me: The sReserved parameter replaces the username
983 * parameter. For more information, see the following Remarks section.
984 * The parameter list is as follows.
985 *
986 * API_FUNCTION NetSessionDel(const char FAR *pszServer,
987 * const char FAR *pszClientName,
988 * short sReserved);
989 *
990 * Parameters
991 *
992 * servername
993 * [in] Pointer to a string that specifies the DNS or NetBIOS name
994 * of the server. Servers should not validate this parameter.
995 * This parameter may be NULL and on Windows NT 4.0 and earlier it
996 * should begin with \\.
997 *
998 * UncClientName
999 * [in] Pointer to a string that specifies the name of the client
1000 * to disconnect. If UncClientName is NULL, all sessions associated
1001 * with the specified user will be disconnected.
1002 *
1003 * username
1004 * [in] Pointer to a string that specifies the name of the user whose
1005 * session is to be terminated. If username is NULL, all sessions
1006 * from the specified client will be disconnected.
1007 *
1008 * Remarks
1009 * Windows 95/98/Me: You must specify the session key in the sReserved
1010 * parameter when you call NetSessionDel. The session key is returned by
1011 * the NetSessionEnum function or the NetSessionGetInfo function in the
1012 * sesi50_key member of the session_info_50 structure.
1013 ***********************************************************************
1014 */
1015
1016 OPERATION(SRVSVC_OPNUM_NetSessionDel)
1017 struct mslm_NetSessionDel {
1018 IN LPTSTR servername;
1019 IN LPTSTR unc_clientname;
1020 IN LPTSTR username;
1021 OUT DWORD status;
1022 };
1023
1024
1025 /*
1026 * SRVSVC NetServerGetInfo (
1027 * IN LPTSTR servername,
1028 * IN DWORD level,
1029 * OUT union switch(level) {
1030 * case 100: _SERVER_INFO_100 * p100;
1031 * case 101: _SERVER_INFO_101 * p101;
1032 * case 102: _SERVER_INFO_102 * p102;
1033 * } bufptr,
1034 * OUT DWORD status
1035 * )
1036 */
1037
1038 /* for svX_platform */
1039 #define SV_PLATFORM_ID_DOS 300
1040 #define SV_PLATFORM_ID_OS2 400
1041 #define SV_PLATFORM_ID_NT 500
1042 #define SV_PLATFORM_ID_OSF 600
1043 #define SV_PLATFORM_ID_VMS 700
1044
1045 /* Bit-mapped values for svX_type fields */
1046 #define SV_TYPE_WORKSTATION 0x00000001
1047 #define SV_TYPE_SERVER 0x00000002
1048 #define SV_TYPE_SQLSERVER 0x00000004
1049 #define SV_TYPE_DOMAIN_CTRL 0x00000008
1050 #define SV_TYPE_DOMAIN_BAKCTRL 0x00000010
1051 #define SV_TYPE_TIME_SOURCE 0x00000020
1052 #define SV_TYPE_AFP 0x00000040
1053 #define SV_TYPE_NOVELL 0x00000080
1054 #define SV_TYPE_DOMAIN_MEMBER 0x00000100
1055 #define SV_TYPE_PRINTQ_SERVER 0x00000200
1056 #define SV_TYPE_DIALIN_SERVER 0x00000400
1057 #define SV_TYPE_XENIX_SERVER 0x00000800
1058 #define SV_TYPE_SERVER_UNIX SV_TYPE_XENIX_SERVER
1059 #define SV_TYPE_NT 0x00001000 /* NT Workstation */
1060 #define SV_TYPE_WFW 0x00002000 /* Windows for Workgroups */
1061
1062 #define SV_TYPE_SERVER_MFPN 0x00004000
1063 #define SV_TYPE_SERVER_NT 0x00008000 /* NT Server */
1064 #define SV_TYPE_POTENTIAL_BROWSER 0x00010000
1065 #define SV_TYPE_BACKUP_BROWSER 0x00020000
1066 #define SV_TYPE_MASTER_BROWSER 0x00040000
1067 #define SV_TYPE_DOMAIN_MASTER 0x00080000
1068 #define SV_TYPE_SERVER_OSF 0x00100000
1069 #define SV_TYPE_SERVER_VMS 0x00200000
1070 #define SV_TYPE_WINDOWS 0x00400000 /* Windows95 and above */
1071 #define SV_TYPE_ALTERNATE_XPORT 0x20000000 /* Return alt transport list */
1072 #define SV_TYPE_LOCAL_LIST_ONLY 0x40000000 /* Return local list only */
1073 #define SV_TYPE_DOMAIN_ENUM 0x80000000
1074 #define SV_TYPE_ALL 0xFFFFFFFF /* handy for NetServerEnum2 */
1075
1076 #define SV_TYPE_DEFAULT (SV_TYPE_WORKSTATION | SV_TYPE_SERVER | SV_TYPE_NT | \
1077 SV_TYPE_SERVER_NT)
1078
1079 /* Special value for sv102_disc that specifies infinite disconnect time */
1080 #define SV_NODISC (-1L) /* No autodisconnect timeout enforced */
1081
1082 /* Values of svX_security field */
1083 #define SV_USERSECURITY 1
1084 #define SV_SHARESECURITY 0
1085
1086 /* Values of svX_hidden field */
1087 #define SV_HIDDEN 1
1088 #define SV_VISIBLE 0
1089
1090
1091 struct mslm_SERVER_INFO_100 {
1092 DWORD sv100_platform_id;
1093 LPTSTR sv100_name;
1094 };
1095
1096 struct mslm_SERVER_INFO_101 {
1097 DWORD sv101_platform_id;
1098 LPTSTR sv101_name;
1099 DWORD sv101_version_major;
1100 DWORD sv101_version_minor;
1101 DWORD sv101_type;
1102 LPTSTR sv101_comment;
1103 };
1104
1105 struct mslm_SERVER_INFO_102 {
1106 DWORD sv102_platform_id;
1107 LPTSTR sv102_name;
1108 DWORD sv102_version_major;
1109 DWORD sv102_version_minor;
1110 DWORD sv102_type;
1111 LPTSTR sv102_comment;
1112 DWORD sv102_users;
1113 DWORD sv102_disc;
1114 DWORD sv102_hidden; /* BOOL */
1115 DWORD sv102_announce;
1116 DWORD sv102_anndelta;
1117 DWORD sv102_licenses;
1118 LPTSTR sv102_userpath;
1119 };
1120
1121 struct mslm_SERVER_INFO_502 {
1122 DWORD sv502_sessopens;
1123 DWORD sv502_sessvcs;
1124 DWORD sv502_opensearch;
1125 DWORD sv502_sizreqbuf;
1126 DWORD sv502_initworkitems;
1127 DWORD sv502_maxworkitems;
1128 DWORD sv502_rawworkitems;
1129 DWORD sv502_irpstacksize;
1130 DWORD sv502_maxrawbuflen;
1131 DWORD sv502_sessusers;
1132 DWORD sv502_sessconns;
1133 DWORD sv502_maxpagedmemoryusage;
1134 DWORD sv502_maxnonpagedmemoryusage;
1135 DWORD sv502_enablesoftcompat;
1136 DWORD sv502_enableforcedlogoff;
1137 DWORD sv502_timesource;
1138 DWORD sv502_acceptdownlevelapis;
1139 DWORD sv502_lmannounce;
1140 };
1141
1142 struct mslm_SERVER_INFO_503 {
1143 DWORD sv503_sessopens;
1144 DWORD sv503_sessvcs;
1145 DWORD sv503_opensearch;
1146 DWORD sv503_sizreqbuf;
1147 DWORD sv503_initworkitems;
1148 DWORD sv503_maxworkitems;
1149 DWORD sv503_rawworkitems;
1150 DWORD sv503_irpstacksize;
1151 DWORD sv503_maxrawbuflen;
1152 DWORD sv503_sessusers;
1153 DWORD sv503_sessconns;
1154 DWORD sv503_maxpagedmemoryusage;
1155 DWORD sv503_maxnonpagedmemoryusage;
1156 DWORD sv503_enablesoftcompat;
1157 DWORD sv503_enableforcedlogoff;
1158 DWORD sv503_timesource;
1159 DWORD sv503_acceptdownlevelapis;
1160 DWORD sv503_lmannounce;
1161 LPTSTR sv503_domain;
1162 DWORD sv503_maxcopyreadlen;
1163 DWORD sv503_maxcopywritelen;
1164 DWORD sv503_minkeepsearch;
1165 DWORD sv503_maxkeepsearch;
1166 DWORD sv503_minkeepcomplsearch;
1167 DWORD sv503_maxkeepcomplsearch;
1168 DWORD sv503_threadcountadd;
1169 DWORD sv503_numblockthreads;
1170 DWORD sv503_scavtimeout;
1171 DWORD sv503_minrcvqueue;
1172 DWORD sv503_minfreeworkitems;
1173 DWORD sv503_xactmemsize;
1174 DWORD sv503_threadpriority;
1175 DWORD sv503_maxmpxct;
1176 DWORD sv503_oplockbreakwait;
1177 DWORD sv503_oplockbreakresponsewait;
1178 DWORD sv503_enableoplocks;
1179 DWORD sv503_enableoplockforceclose;
1180 DWORD sv503_enablefcbopens;
1181 DWORD sv503_enableraw;
1182 DWORD sv503_enablesharednetdrives;
1183 DWORD sv503_minfreeconnections;
1184 DWORD sv503_maxfreeconnections;
1185 };
1186
1187 union mslm_NetServerGetInfo_ru {
1188 CASE(100) struct mslm_SERVER_INFO_100 *bufptr100;
1189 CASE(101) struct mslm_SERVER_INFO_101 *bufptr101;
1190 CASE(102) struct mslm_SERVER_INFO_102 *bufptr102;
1191 CASE(502) struct mslm_SERVER_INFO_502 *bufptr502;
1192 CASE(503) struct mslm_SERVER_INFO_503 *bufptr503;
1193 DEFAULT char *nullptr;
1194 };
1195
1196 struct mslm_NetServerGetInfo_result {
1197 DWORD level;
1198 SWITCH(level)
1199 union mslm_NetServerGetInfo_ru bufptr;
1200 };
1201
1202
1203 OPERATION(SRVSVC_OPNUM_NetServerGetInfo)
1204 struct mslm_NetServerGetInfo {
1205 IN LPTSTR servername;
1206 IN DWORD level;
1207 OUT struct mslm_NetServerGetInfo_result result;
1208 OUT DWORD status;
1209 };
1210
1211 /*
1212 * SRVSVC NetRemoteTOD (
1213 * IN LPTSTR servername,
1214 * OUT _TIME_OF_DAY_INFO *bufptr,
1215 * OUT long status
1216 * )
1217 */
1218
1219 struct mslm_TIME_OF_DAY_INFO {
1220 DWORD tod_elapsedt;
1221 DWORD tod_msecs;
1222 DWORD tod_hours;
1223 DWORD tod_mins;
1224 DWORD tod_secs;
1225 DWORD tod_hunds;
1226 DWORD tod_timezone;
1227 DWORD tod_tinterval;
1228 DWORD tod_day;
1229 DWORD tod_month;
1230 DWORD tod_year;
1231 DWORD tod_weekday;
1232 };
1233
1234 OPERATION(SRVSVC_OPNUM_NetRemoteTOD)
1235 struct mslm_NetRemoteTOD {
1236 IN LPTSTR servername;
1237 OUT struct mslm_TIME_OF_DAY_INFO *bufptr;
1238 OUT DWORD status;
1239 };
1240
1241 #define NAMEFLAG_LM2 0x80000000
1242
1243 #define NAMETYPE_USER 1
1244 #define NAMETYPE_PASSWORD 2
1245 #define NAMETYPE_GROUP 3
1246 #define NAMETYPE_COMPUTER 4
1247 #define NAMETYPE_EVENT 5
1248 #define NAMETYPE_DOMAIN 6
1249 #define NAMETYPE_SERVICE 7
1250 #define NAMETYPE_NET 8
1251 #define NAMETYPE_SHARE 9
1252 #define NAMETYPE_MESSAGE 10
1253 #define NAMETYPE_MESSAGEDEST 11
1254 #define NAMETYPE_SHAREPASSWORD 12
1255 #define NAMETYPE_WORKGROUP 13
1256
1257 OPERATION(SRVSVC_OPNUM_NetNameValidate)
1258 struct mslm_NetNameValidate {
1259 IN LPTSTR servername;
1260 IN REFERENCE LPTSTR pathname;
1261 IN DWORD type;
1262 IN DWORD flags;
1263 OUT DWORD status;
1264 };
1265
1266 /*
1267 * SRVSVC NetShareEnum (
1268 * IN LPTSTR servername,
1269 * IN DWORD level;
1270 * OUT union switch(level) {
1271 * case 0: struct {
1272 * DWORD entriesread;
1273 * [size_is(entriesread)]
1274 * _SHARE_INFO_0 *entries;
1275 * } *bufptr0;
1276 * case 1: struct {
1277 * DWORD entriesread;
1278 * [size_is(entriesread)]
1279 * _SHARE_INFO_1 *entries;
1280 * } *bufptr1;
1281 * ...
1282 * } bufptr,
1283 * IN DWORD prefmaxlen,
1284 * OUT DWORD totalentries,
1285 * IN OUT DWORD ?* resume_handle,
1286 * OUT DWORD status
1287 * )
1288 */
1289
1290 /*
1291 * Share types for shiX_type fields - duplicated from smb.h
1292 */
1293 #ifndef _SHARE_TYPES_DEFINED_
1294 #define _SHARE_TYPES_DEFINED_
1295 #define STYPE_DISKTREE 0x00000000
1296 #define STYPE_PRINTQ 0x00000001
1297 #define STYPE_DEVICE 0x00000002
1298 #define STYPE_IPC 0x00000003
1299 #define STYPE_MASK 0x0000000F
1300 #define STYPE_DFS 0x00000064
1301 #define STYPE_HIDDEN 0x80000000
1302 #define STYPE_SPECIAL 0x80000000
1303 #endif /* _SHARE_TYPES_DEFINED_ */
1304
1305 /* Maximum uses for shiX_max_uses fields */
1306 #define SHI_USES_UNLIMITED (DWORD)-1
1307
1308 INFONRES_RESULT(mslm_NetShareInfo,0)
1309 INFONRES_RESULT(mslm_NetShareInfo,1)
1310 INFONRES_RESULT(mslm_NetShareInfo,2)
1311 INFONRES_RESULT(mslm_NetShareInfo,501)
1312 INFONRES_RESULT(mslm_NetShareInfo,502)
1313
1314 union mslm_NetShareAddInfo_u {
1315 CASE(2) struct mslm_NetShareInfo_2 *info2;
1316 CASE(502) struct mslm_NetShareInfo_502 *info502;
1317 DEFAULT char *nullptr;
1318 };
1319
1320 struct mslm_NetShareAddInfo {
1321 DWORD switch_value;
1322 SWITCH(switch_value)
1323 union mslm_NetShareAddInfo_u un;
1324 };
1325
1326
1327 OPERATION(SRVSVC_OPNUM_NetShareAdd)
1328 struct mslm_NetShareAdd {
1329 IN LPTSTR servername;
1330 IN DWORD level;
1331 IN struct mslm_NetShareAddInfo info;
1332 INOUT DWORD *parm_err;
1333 OUT DWORD status;
1334 };
1335
1336
1337 INFONRES_DEFINITION(mslm_NetShareEnum,
1338 INFONRES_UNION_ENTRY(mslm_NetShareInfo,0)
1339 INFONRES_UNION_ENTRY(mslm_NetShareInfo,1)
1340 INFONRES_UNION_ENTRY(mslm_NetShareInfo,2)
1341 INFONRES_UNION_ENTRY(mslm_NetShareInfo,501)
1342 INFONRES_UNION_ENTRY(mslm_NetShareInfo,502))
1343
1344 /*
1345 * NetShareEnum: enumerate all shares (see also NetShareEnumSticky).
1346 * Note: the server should ignore the content of servername.
1347 */
1348 OPERATION(SRVSVC_OPNUM_NetShareEnum)
1349 struct mslm_NetShareEnum {
1350 IN LPTSTR servername;
1351 INOUT DWORD level;
1352 INOUT struct mslm_NetShareEnum_result result;
1353 IN DWORD prefmaxlen;
1354 OUT DWORD totalentries;
1355 INOUT DWORD *resume_handle;
1356 OUT DWORD status;
1357 };
1358
1359 /*
1360 * Delete a share. The reserved field appears in netmon
1361 * but I've left it out in case it's not always present.
1362 * This won't affect RPC processing.
1363 */
1364 OPERATION(SRVSVC_OPNUM_NetShareDel)
1365 struct mslm_NetShareDel {
1366 IN LPTSTR servername;
1367 IN REFERENCE LPTSTR netname;
1368 /* IN DWORD reserved; */
1369 OUT DWORD status;
1370 };
1371
1372 OPERATION(SRVSVC_OPNUM_NetShareCheck)
1373 struct mslm_NetShareCheck {
1374 IN LPTSTR servername;
1375 IN REFERENCE LPTSTR path;
1376 OUT DWORD stype;
1377 OUT DWORD status;
1378 };
1379
1380 /*
1381 * NetShareEnumSticky is the same as NetShareEnum except that
1382 * STYPE_SPECIAL (hidden or special) shares are not returned.
1383 * Note: the server should ignore the content of servername.
1384 */
1385 OPERATION(SRVSVC_OPNUM_NetShareEnumSticky)
1386 struct mslm_NetShareEnumSticky {
1387 IN LPTSTR servername;
1388 INOUT DWORD level;
1389 INOUT struct mslm_NetShareEnum_result result;
1390 IN DWORD prefmaxlen;
1391 OUT DWORD totalentries;
1392 INOUT DWORD *resume_handle;
1393 OUT DWORD status;
1394 };
1395
1396 /*
1397 * When you install Windows NT Server Tools on a Win95 client,
1398 * a security tab will be added to properties dialog box of files/folders.
1399 * Within this security tab, when you try to get/set permissions on a
1400 * file/folder the next two RPC calls are used.
1401 */
1402 OPERATION(SRVSVC_OPNUM_NetGetFileSecurity)
1403 struct mslm_NetGetFileSecurity {
1404 IN LPTSTR servername;
1405 IN LPTSTR sharename;
1406 IN REFERENCE LPTSTR filename;
1407 IN DWORD securityinfo;
1408
1409 /*
1410 * Right now, we can't send back SD of the requested object
1411 * in RPC code, so we just reply with access denied error
1412 * code. Thus, this output declaration is only valid in this
1413 * case i.e., it's not complete.
1414 * It looks like:
1415 *
1416 * A Pointer
1417 * A Length
1418 *
1419 * A Pointer
1420 * A Length (equal to the prev length)
1421 * A buffer
1422 *
1423 * return value
1424 */
1425 OUT DWORD length;
1426 OUT DWORD status;
1427 };
1428
1429 /*
1430 * This is the request:
1431 *
1432 * R_SRVSVC: RPC Client call srvsvc:NetrpSetFileSecurity(..)
1433 * R_SRVSVC: SRVSVC_HANDLE ServerName = \\WK76-177
1434 * R_SRVSVC: LPWSTR ShareName = AFSHIN
1435 * R_SRVSVC: LPWSTR lpFileName = \salek.txt
1436 * R_SRVSVC: SECURITY_INFORMATION SecurityInformation = 4 (0x4)
1437 * -R_SRVSVC: PADT_SECURITY_DESCRIPTOR SecurityDescriptor {..}
1438 * R_SRVSVC: DWORD Length = 64 (0x40)
1439 * R_SRVSVC: LPBYTE Buffer = 4496048 (0x449AB0)
1440 * R_SRVSVC: LPBYTE Buffer [..] = 01 00 04 80 00 00 00 00 00 00 00 00 00 00 00
1441 * ...
1442 *
1443 * 000000A0 00 83 46 00 0B 00 00 00 00 00 00 00 0B 00 ..F...........
1444 * 000000B0 00 00 5C 00 5C 00 57 00 4B 00 37 00 36 00 2D 00 ..\.\.W.K.7.6.-.
1445 * 000000C0 31 00 37 00 37 00 00 00 08 00 16 83 46 00 07 00 1.7.7.......F...
1446 * 000000D0 00 00 00 00 00 00 07 00 00 00 41 00 46 00 53 00 ..........A.F.S.
1447 * 000000E0 48 00 49 00 4E 00 00 00 00 00 0B 00 00 00 00 00 H.I.N...........
1448 * 000000F0 00 00 0B 00 00 00 5C 00 73 00 61 00 6C 00 65 00 ......\.s.a.l.e.
1449 * 00000100 6B 00 2E 00 74 00 78 00 74 00 00 00 00 00 04 00 k...t.x.t.......
1450 * 00000110 00 00 40 00 00 00 B0 9A 44 00 40 00 00 00 01 00 ..@.....D.@.....
1451 * 00000120 04 80 00 00 00 00 00 00 00 00 00 00 00 00 14 00 ................
1452 * 00000130 00 00 02 00 2C 00 01 00 00 00 00 00 24 00 00 00 ....,.......$...
1453 * 00000140 00 A0 01 05 00 00 00 00 00 05 15 00 00 00 1A 24 ...............$
1454 * 00000150 44 38 90 00 0F 02 65 3A BE 4C FF 03 00 00 00 00 D8....e:.L......
1455 * 00000160 00 00 00 00 00 00 00 00 00 00 ..........
1456 */
1457 OPERATION(SRVSVC_OPNUM_NetSetFileSecurity)
1458 struct mslm_NetSetFileSecurity {
1459 IN LPTSTR servername;
1460 IN LPTSTR sharename;
1461 IN REFERENCE LPTSTR filename;
1462 IN DWORD securityinfo;
1463 /*
1464 * IN Security Descriptor (looks like):
1465 * Length1
1466 * Pointer
1467 * Length2 (== Length1)
1468 * buffer itself
1469 */
1470
1471 OUT DWORD status;
1472 };
1473
1474 /*
1475 * The SRVSVC already
1476 */
1477 INTERFACE(0)
1478 union srvsvc_interface {
1479 CASE(SRVSVC_OPNUM_NetConnectEnum)
1480 struct mslm_NetConnectEnum NetConnectEnum;
1481 CASE(SRVSVC_OPNUM_NetFileEnum)
1482 struct mslm_NetFileEnum NetFileEnum;
1483 CASE(SRVSVC_OPNUM_NetFileClose)
1484 struct mslm_NetFileClose NetFileClose;
1485 CASE(SRVSVC_OPNUM_NetShareGetInfo)
1486 struct mlsm_NetShareGetInfo NetShareGetInfo;
1487 CASE(SRVSVC_OPNUM_NetShareSetInfo)
1488 struct mlsm_NetShareSetInfo NetShareSetInfo;
1489 CASE(SRVSVC_OPNUM_NetSessionDel)
1490 struct mslm_NetSessionDel NetSessionDel;
1491 CASE(SRVSVC_OPNUM_NetSessionEnum)
1492 struct mslm_NetSessionEnum NetSessionEnum;
1493 CASE(SRVSVC_OPNUM_NetServerGetInfo)
1494 struct mslm_NetServerGetInfo NetServerGetInfo;
1495 CASE(SRVSVC_OPNUM_NetRemoteTOD)
1496 struct mslm_NetRemoteTOD NetRemoteTOD;
1497 CASE(SRVSVC_OPNUM_NetNameValidate)
1498 struct mslm_NetNameValidate NetNameValidate;
1499 CASE(SRVSVC_OPNUM_NetShareAdd)
1500 struct mslm_NetShareAdd NetShareAdd;
1501 CASE(SRVSVC_OPNUM_NetShareDel)
1502 struct mslm_NetShareDel NetShareDel;
1503 CASE(SRVSVC_OPNUM_NetShareCheck)
1504 struct mslm_NetShareCheck NetShareCheck;
1505 CASE(SRVSVC_OPNUM_NetShareEnum)
1506 struct mslm_NetShareEnum NetShareEnum;
1507 CASE(SRVSVC_OPNUM_NetShareEnumSticky)
1508 struct mslm_NetShareEnumSticky NetShareEnumSticky;
1509 CASE(SRVSVC_OPNUM_NetGetFileSecurity)
1510 struct mslm_NetGetFileSecurity NetGetFileSecurity;
1511 CASE(SRVSVC_OPNUM_NetSetFileSecurity)
1512 struct mslm_NetSetFileSecurity NetSetFileSecurity;
1513 };
1514 typedef union srvsvc_interface srvsvc_interface_t;
1515 EXTERNTYPEINFO(srvsvc_interface)
1516
1517
1518
1519 /*
1520 * WKSSVC - Workstation Service
1521 */
1522
1523 /* Windows NT */
1524 #define WKSSVC_OPNUM_NetWkstaGetInfo 0x00
1525 #define WKSSVC_OPNUM_NetWkstaSetInfo 0x01
1526 #define WKSSVC_OPNUM_NetWkstaUserEnum 0x02
1527 #define WKSSVC_OPNUM_NetWkstaUserGetInfo 0x03
1528 #define WKSSVC_OPNUM_NetWkstaUserSetInfo 0x04
1529 #define WKSSVC_OPNUM_NetWkstaTransportEnum 0x05
1530 #define WKSSVC_OPNUM_NetWkstaTransportAdd 0x06
1531 #define WKSSVC_OPNUM_NetWkstaTransportDel 0x07
1532 #define WKSSVC_OPNUM_NetUseAdd 0x08
1533 #define WKSSVC_OPNUM_NetUseGetInfo 0x09
1534 #define WKSSVC_OPNUM_NetUseDel 0x0a
1535 #define WKSSVC_OPNUM_NetUseEnum 0x0b
1536 #define WKSSVC_OPNUM_NetMessageBufferSend 0x0c
1537 #define WKSSVC_OPNUM_NetWkstaStatisticsGet 0x0d
1538 #define WKSSVC_OPNUM_NetLogonDomainNameAdd 0x0e
1539
1540 /* Windows 2000 */
1541 #define WKSSVC_OPNUM_NetLogonDomainNameDel 0x0f
1542 #define WKSSVC_OPNUM_NetJoinDomain 0x10
1543 #define WKSSVC_OPNUM_NetUnjoinDomain 0x11
1544 #define WKSSVC_OPNUM_NetValidateName 0x12
1545 #define WKSSVC_OPNUM_NetRenameMachineInDomain 0x13
1546 #define WKSSVC_OPNUM_NetGetJoinInformation 0x14
1547 #define WKSSVC_OPNUM_NetGetJoinableOUs 0x15
1548 #define WKSSVC_OPNUM_NetJoinDomain2 0x16
1549 #define WKSSVC_OPNUM_NetUnjoinDomain2 0x17
1550 #define WKSSVC_OPNUM_NetRenameMachineInDomain2 0x18
1551 #define WKSSVC_OPNUM_NetValidateName2 0x19
1552 #define WKSSVC_OPNUM_NetGetJoinableOUs2 0x1a
1553
1554 /* Windows XP and Windows Server 2003 */
1555 #define WKSSVC_OPNUM_NetAddAlternateComputerName 0x1b
1556 #define WKSSVC_OPNUM_NetRemoveAlternateComputerName 0x1c
1557 #define WKSSVC_OPNUM_NetSetPrimaryComputerName 0x1d
1558 #define WKSSVC_OPNUM_NetEnumerateComputerNames 0x1e
1559 #define WKSSVC_OPNUM_NetWorkstationResetDfsCache 0x1f
1560
1561
1562 struct mslm_WKSTA_INFO_100 {
1563 DWORD wki100_platform_id;
1564 LPTSTR wki100_computername;
1565 LPTSTR wki100_langroup;
1566 DWORD wki100_ver_major;
1567 DWORD wki100_ver_minor;
1568 };
1569
1570 /* NetWkstaGetInfo only. System information - user access */
1571 struct mslm_WKSTA_INFO_101 {
1572 DWORD wki101_platform_id;
1573 LPTSTR wki101_computername;
1574 LPTSTR wki101_langroup;
1575 DWORD wki101_ver_major;
1576 DWORD wki101_ver_minor;
1577 LPTSTR wki101_lanroot;
1578 };
1579
1580 /* NetWkstaGetInfo only. System information - admin or operator access */
1581 struct mslm_WKSTA_INFO_102 {
1582 DWORD wki102_platform_id;
1583 LPTSTR wki102_computername;
1584 LPTSTR wki102_langroup;
1585 DWORD wki102_ver_major;
1586 DWORD wki102_ver_minor;
1587 LPTSTR wki102_lanroot;
1588 DWORD wki102_logged_on_users;
1589 };
1590
1591 struct mslm_WKSTA_INFO_502 {
1592 DWORD char_wait;
1593 DWORD collection_time;
1594 DWORD maximum_collection_count;
1595 DWORD keep_connection;
1596 DWORD max_commands;
1597 DWORD session_timeout;
1598 DWORD size_char_buf;
1599 DWORD max_threads;
1600 DWORD lock_quota;
1601 DWORD lock_increment;
1602 DWORD lock_maximum;
1603 DWORD pipe_increment;
1604 DWORD pipe_maximum;
1605 DWORD cache_file_timeout;
1606 DWORD dormant_file_limit;
1607 DWORD read_ahead_throughput;
1608 DWORD num_mailslot_buffers;
1609 DWORD num_srv_announce_buffers;
1610 DWORD max_illegal_dgram_events;
1611 DWORD dgram_event_reset_freq;
1612 DWORD log_election_packets;
1613 DWORD use_opportunistic_locking;
1614 DWORD use_unlock_behind;
1615 DWORD use_close_behind;
1616 DWORD buf_named_pipes;
1617 DWORD use_lock_read_unlock;
1618 DWORD utilize_nt_caching;
1619 DWORD use_raw_read;
1620 DWORD use_raw_write;
1621 DWORD use_write_raw_data;
1622 DWORD use_encryption;
1623 DWORD buf_files_deny_write;
1624 DWORD buf_read_only_files;
1625 DWORD force_core_create_mode;
1626 DWORD use_512_byte_max_transfer;
1627 };
1628
1629 INFO1RES_DEFINITION(mslm_NetWkstaGetInfo,
1630 INFO1RES_UNION_ENTRY(mslm_WKSTA_INFO,100)
1631 INFO1RES_UNION_ENTRY(mslm_WKSTA_INFO,101)
1632 INFO1RES_UNION_ENTRY(mslm_WKSTA_INFO,102)
1633 INFO1RES_UNION_ENTRY(mslm_WKSTA_INFO,502))
1634
1635 INFO1RESBUF_DEFINITION(mslm_NetWkstaGetInfo,
1636 INFO1RESBUF_UNION_ENTRY(mslm_WKSTA_INFO,100)
1637 INFO1RESBUF_UNION_ENTRY(mslm_WKSTA_INFO,101)
1638 INFO1RESBUF_UNION_ENTRY(mslm_WKSTA_INFO,102)
1639 INFO1RESBUF_UNION_ENTRY(mslm_WKSTA_INFO,502))
1640
1641
1642 OPERATION(WKSSVC_OPNUM_NetWkstaGetInfo)
1643 struct mslm_NetWkstaGetInfo {
1644 IN LPTSTR servername;
1645 IN DWORD level;
1646 OUT struct mslm_NetWkstaGetInfo_result result;
1647 OUT DWORD status;
1648 };
1649
1650 /*
1651 ***********************************************************************
1652 * NetWkstaTransportEnum
1653 ***********************************************************************
1654 */
1655
1656 struct mslm_NetWkstaTransportInfo0 {
1657 DWORD quality_of_service;
1658 DWORD num_vcs;
1659 LPTSTR transport_name;
1660 LPTSTR transport_address;
1661 DWORD wan_ish;
1662 };
1663
1664 struct mslm_NetWkstaTransportCtr0 {
1665 DWORD count;
1666 SIZE_IS(count)
1667 struct mslm_NetWkstaTransportInfo0 *ti0;
1668 };
1669
1670 union mslm_NetWkstaTransportInfo_ru {
1671 CASE(0) struct mslm_NetWkstaTransportCtr0 *info0;
1672 DEFAULT char *nullptr;
1673 };
1674
1675 struct mslm_NetWkstaTransportInfo {
1676 DWORD address;
1677 DWORD level;
1678 SWITCH(level)
1679 union mslm_NetWkstaTransportInfo_ru ru;
1680 };
1681
1682 OPERATION(WKSSVC_OPNUM_NetWkstaTransportEnum)
1683 struct mslm_NetWkstaTransportEnum {
1684 IN LPTSTR servername;
1685 INOUT struct mslm_NetWkstaTransportInfo info;
1686 IN DWORD pref_max_len;
1687 OUT DWORD total_entries;
1688 INOUT DWORD *resume_handle;
1689 OUT DWORD status;
1690 };
1691
1692 /*
1693 * The WKSSVC already
1694 */
1695 INTERFACE(0)
1696 union wkssvc_interface {
1697 CASE(WKSSVC_OPNUM_NetWkstaGetInfo)
1698 struct mslm_NetWkstaGetInfo NetWkstaGetInfo;
1699 CASE(WKSSVC_OPNUM_NetWkstaTransportEnum)
1700 struct mslm_NetWkstaTransportEnum NetWkstaTransportEnum;
1701 };
1702 typedef union wkssvc_interface wkssvc_interface_t;
1703 EXTERNTYPEINFO(wkssvc_interface)
1704
1705
1706 #endif /* _MLSVC_LANMAN_NDL_ */