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}; 406 407OPERATION(SRVSVC_OPNUM_NetConnectEnum) 408struct mslm_NetConnectEnum { 409 IN LPTSTR servername; 410 IN LPTSTR qualifier; /* share name */ 411 INOUT struct mslm_NetConnectInfo info; 412 IN DWORD pref_max_len; 413 OUT DWORD total_entries; 414 INOUT DWORD *resume_handle; 415 OUT DWORD status; 416}; 417 418 419/* 420 *********************************************************************** 421 * NetFileEnum 422 *********************************************************************** 423 */ 424struct mslm_NetFileInfoBuf2 { 425 DWORD fi2_id; 426}; 427typedef struct mslm_NetFileInfoBuf2 srvsvc_NetFileInfoBuf2_t; 428 429struct mslm_NetFileInfo2 { 430 DWORD entries_read; 431 SIZE_IS(entries_read) 432 struct mslm_NetFileInfoBuf2 *fi2; 433}; 434typedef struct mslm_NetFileInfo2 srvsvc_NetFileInfo2_t; 435 436struct mslm_NetFileInfoBuf3 { 437 DWORD fi3_id; 438 DWORD fi3_permissions; 439 DWORD fi3_num_locks; 440 LPTSTR fi3_pathname; 441 LPTSTR fi3_username; 442}; 443typedef struct mslm_NetFileInfoBuf3 srvsvc_NetFileInfoBuf3_t; 444 445struct mslm_NetFileInfo3 { 446 DWORD entries_read; 447 SIZE_IS(entries_read) 448 struct mslm_NetFileInfoBuf3 *fi3; 449}; 450typedef struct mslm_NetFileInfo3 srvsvc_NetFileInfo3_t; 451 452union mslm_NetFileInfoResUnion { 453 CASE(2) struct mslm_NetFileInfo2 *info2; 454 CASE(3) struct mslm_NetFileInfo3 *info3; 455 DEFAULT char *nullptr; 456}; 457 458struct mslm_NetFileInfo { 459 DWORD level; 460 DWORD switch_value; 461 SWITCH(switch_value) 462 union mslm_NetFileInfoResUnion ru; 463}; 464 465OPERATION(SRVSVC_OPNUM_NetFileEnum) 466struct mslm_NetFileEnum { 467 IN LPTSTR servername; 468 IN DWORD basepath; 469 IN DWORD username; 470 INOUT struct mslm_NetFileInfo info; 471 IN DWORD pref_max_len; 472 OUT DWORD total_entries; 473 INOUT DWORD *resume_handle; 474 OUT DWORD status; 475}; 476 477 478/* 479 *********************************************************************** 480 * NetFileClose 481 * 482 * Close files using a file id reported by NetFileEnum. 483 *********************************************************************** 484 */ 485OPERATION(SRVSVC_OPNUM_NetFileClose) 486struct mslm_NetFileClose { 487 IN LPTSTR servername; 488 IN DWORD file_id; 489 OUT DWORD status; 490}; 491 492 493/* 494 *********************************************************************** 495 * NetShareGetInfo: netname is the name of a share. 496 * 497 * Levels: 498 * 1 Sets information about the shared resource: name, type 499 * of resource and a comment. 500 * 2 Sets information about the shared resource: name, type, 501 * permissions, password and number of connections. 502 * 501 Sets information about the shared resource: name, type 503 * of resource and a comment. 504 * 502 Sets information about the shared resource, including 505 * the name, type, permissions, number of connections etc. 506 * 503 Contains information about the shared resource; 507 * identical to 502 except for the addition of a servername. 508 * 1004 Specifies a comment for the shared resource. 509 * 1005 Specifies a set of flags describing the shared resource. 510 * 1006 Specifies the maximum number of concurrent connections 511 * that the shared resource can accommodate. 512 * 1501 Specifies the SECURITY_DESCRIPTOR for the share. 513 * 514 * Windows Me/98/95 supports level 50, which is similar to level 1. 515 * 516 * shi1005_flags: SHI1005_VALID_FLAGS_SET defines the set of flags that 517 * can be set with the NetShareSetInfo function. SHI1005_FLAGS_DFS and 518 * SHI1005_FLAGS_DFS_ROOT can only be returned, but not set. 519 * 520 * 0x01 SHI1005_FLAGS_DFS 521 * The specified share is present in a Dfs tree structure. 522 * This flag cannot be set with NetShareSetInfo. 523 * 524 * 0x02 SHI1005_FLAGS_DFS_ROOT 525 * The specified share is the root volume in a Dfs tree. 526 * This flag cannot be set with NetShareSetInfo. 527 * 528 * 0x30 CSC_MASK Client-side caching (CSC) state: 529 * 0x00 CSC_CACHE_MANUAL_REINT Automatic file-by-file 530 * reintegration not allowed. 531 * 0x10 CSC_CACHE_AUTO_REINT File-by-file reintegration allowed. 532 * 0x20 CSC_CACHE_VDO File opens do not need to be flowed. 533 * 0x30 CSC_CACHE_NONE CSC is disabled for this share. 534 * 535 * 0x0100 SHI1005_FLAGS_RESTRICT_EXCLUSIVE_OPENS 536 * The specified share disallows exclusive file opens, 537 * where reads to an open file are disallowed. 538 * 539 * 0x0200 SHI1005_FLAGS_FORCE_SHARED_DELETE 540 * Shared files in the specified share can be forcibly deleted. 541 * 542 * 0x0400 SHI1005_FLAGS_ALLOW_NAMESPACE_CACHING 543 * Clients are allowed to cache the namespace of the share. 544 * 545 * 0x0800 SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM 546 * The server will filter directory entries based on the access 547 * permissions of the client. This flag is only supported on 548 * servers running Windows Server 2003 SP1. 549 * Note: The access-based enumeration (ABE) flag may also 550 * appear as SHI1005_FLAGS_ENFORCE_NAMESPACE_ACCESS. 551 *********************************************************************** 552 */ 553 554#define CSC_MASK 0x30 555#define CSC_CACHE_MANUAL_REINT 0x00 556#define CSC_CACHE_AUTO_REINT 0x10 557#define CSC_CACHE_VDO 0x20 558#define CSC_CACHE_NONE 0x30 559 560struct mslm_NetShareGetInfo0 { 561 LPTSTR shi0_netname; 562}; 563 564struct mslm_NetShareGetInfo1 { 565 LPTSTR shi1_netname; 566 DWORD shi1_type; /* type of resource such as IPC$ */ 567 LPTSTR shi1_comment; 568}; 569 570struct mslm_NetShareGetInfo2 { 571 LPTSTR shi2_netname; 572 DWORD shi2_type; 573 LPTSTR shi2_comment; 574 DWORD shi2_permissions; 575 DWORD shi2_max_uses; 576 DWORD shi2_current_uses; 577 LPTSTR shi2_path; 578 LPTSTR shi2_passwd; 579}; 580 581struct mslm_NetShareGetInfo501 { 582 LPTSTR shi501_netname; 583 DWORD shi501_type; 584 LPTSTR shi501_comment; 585 DWORD shi501_reserved; 586}; 587 588struct mslm_NetShareGetInfo502 { 589 LPTSTR shi502_netname; 590 DWORD shi502_type; 591 LPTSTR shi502_comment; 592 DWORD shi502_permissions; 593 DWORD shi502_max_uses; 594 DWORD shi502_current_uses; 595 LPTSTR shi502_path; 596 LPTSTR shi502_passwd; 597 DWORD shi502_reserved; 598 DWORD shi502_security_descriptor; 599}; 600 601struct mslm_NetShareGetInfo503 { 602 LPTSTR shi503_netname; 603 DWORD shi503_type; 604 LPTSTR shi503_comment; 605 DWORD shi503_permissions; 606 DWORD shi503_max_uses; 607 DWORD shi503_current_uses; 608 LPTSTR shi503_path; 609 LPTSTR shi503_passwd; 610 LPTSTR shi503_servername; 611 DWORD shi503_reserved; 612 DWORD shi503_security_descriptor; 613}; 614 615struct mslm_NetShareGetInfo1004 { 616 LPTSTR shi1004_comment; 617}; 618 619struct mslm_NetShareGetInfo1005 { 620 DWORD shi1005_flags; 621}; 622 623struct mslm_NetShareGetInfo1006 { 624 DWORD shi1006_max_uses; 625}; 626 627union mlsm_NetShareGetInfoResUnion { 628 CASE(0) struct mslm_NetShareGetInfo0 *info0; 629 CASE(1) struct mslm_NetShareGetInfo1 *info1; 630 CASE(2) struct mslm_NetShareGetInfo2 *info2; 631 CASE(501) struct mslm_NetShareGetInfo501 *info501; 632 CASE(502) struct mslm_NetShareGetInfo502 *info502; 633 CASE(1004) struct mslm_NetShareGetInfo1004 *info1004; 634 CASE(1005) struct mslm_NetShareGetInfo1005 *info1005; 635 CASE(1006) struct mslm_NetShareGetInfo1006 *info1006; 636 DEFAULT char *nullptr; 637}; 638 639 640struct mlsm_NetShareGetInfoRes { 641 DWORD switch_value; 642 SWITCH(switch_value) 643 union mlsm_NetShareGetInfoResUnion ru; 644}; 645 646 647OPERATION(SRVSVC_OPNUM_NetShareGetInfo) 648struct mlsm_NetShareGetInfo { 649 IN LPTSTR servername; 650 IN REFERENCE LPTSTR netname; 651 IN DWORD level; 652 OUT struct mlsm_NetShareGetInfoRes result; 653 OUT DWORD status; 654}; 655 656 657/* 658 *********************************************************************** 659 * NetShareSetInfo: netname is the name of a share. 660 * The levels and shi1005_flags are as described for NetShareGetInfo. 661 * 662 * Support for Access-based Enumeration (ABE) was added to Windows in 663 * Windows Server 2003 Service Pack 1. ABE filters directory contents 664 * (and other shared resources) returned via a share based on a user's 665 * access rights, i.e. a user would not see objects that are 666 * inaccessible to that user. ABE requests are made using info level 667 * 1005 with the value 0x0800 in the flags field (see NetShareGetInfo). 668 *********************************************************************** 669 */ 670OPERATION(SRVSVC_OPNUM_NetShareSetInfo) 671struct mlsm_NetShareSetInfo { 672 IN LPTSTR servername; 673 IN REFERENCE LPTSTR netname; 674 IN DWORD level; 675/* 676 * This should accept all the same levels as NetShareGetInfo 677 * but we always return ACCESS_DENIED for now. So there's no 678 * point in unmarshalling the share information. 679 * 680 * IN struct mlsm_NetShareGetInfoRes result; 681 */ 682 OUT DWORD parm_err_ptr; 683 OUT DWORD parm_err; 684 OUT DWORD status; 685}; 686 687 688/* 689 *********************************************************************** 690 * NetSessionEnum 691 * 692 * The NetSessionEnum function provides information about sessions 693 * established on a server. 694 * 695 * Only members of the Administrators or Account Operators local groups 696 * can successfully execute the NetSessionEnum function at level 1 or 697 * level 2. No special group membership is required for level 0 or level 698 * 10 calls. 699 * 700 * Windows NT/2000/XP: The parameter order is as follows. 701 * 702 * NET_API_STATUS NetSessionEnum(LPWSTR servername, 703 * LPWSTR UncClientName, 704 * LPWSTR username, 705 * DWORD level, 706 * LPBYTE *bufptr, 707 * DWORD prefmaxlen, 708 * LPDWORD entriesread, 709 * LPDWORD totalentries, 710 * LPDWORD resume_handle); 711 * 712 * Windows 95/98/Me: The calling application must use the cbBuffer parameter 713 * to specify the size, in bytes, of the information buffer pointed to by the 714 * pbBuffer parameter. (The cbBuffer parameter replaces the prefmaxlen 715 * parameter.) Neither a user name parameter nor a resume handle parameter is 716 * available on this platform. Therefore, the parameter list is as follows. 717 * 718 * API_FUNCTION NetSessionEnum(const char FAR *pszServer, 719 * short sLevel, 720 * char FAR *pbBuffer, 721 * unsigned short cbBuffer, 722 * unsigned short FAR *pcEntriesRead, 723 * unsigned short FAR *pcTotalAvail); 724 * 725 * Parameters 726 * 727 * servername 728 * [in] Pointer to a string that specifies the DNS or NetBIOS name of the 729 * remote server on which the function is to execute. If this parameter is 730 * NULL, the local computer is used. 731 * Windows NT 4.0 and earlier: This string must begin with \\. 732 * 733 * UncClientName 734 * [in] Pointer to a string that specifies the name of the computer session 735 * for which information is to be returned. If this parameter is NULL, 736 * NetSessionEnum returns information for all computer sessions on the server. 737 * 738 * username 739 * [in] Pointer to a string that specifies the name of the user for which 740 * information is to be returned. If this parameter is NULL, NetSessionEnum 741 * returns information for all users. 742 * 743 * level 744 * [in] Specifies the information level of the data. This parameter can be 745 * one of the following values. 746 * Windows NT/2000/XP: The following levels are valid. 747 * Value Meaning 748 * 0 Return the name of the computer that established the session. 749 * The bufptr parameter points to an array of SESSION_INFO_0 750 * structures. 751 * 1 Return the name of the computer, name of the user, and open files, 752 * pipes, and devices on the computer. The bufptr parameter points to 753 * an array of SESSION_INFO_1 structures. 754 * 2 In addition to the information indicated for level 1, return the 755 * type of client and how the user established the session. The bufptr 756 * parameter points to an array of SESSION_INFO_2 structures. 757 * 10 Return the name of the computer, name of the user, and active and 758 * idle times for the session. The bufptr parameter points to an array 759 * of SESSION_INFO_10 structures. 760 * 502 Return the name of the computer; name of the user; open files, 761 * pipes, and devices on the computer; and the name of the transport 762 * the client is using. The bufptr parameter points to an array of 763 * SESSION_INFO_502 structures. 764 * 765 * Windows 95/98/Me: The following level is valid. 766 * Value Meaning 767 * 50 Return the name of the computer, name of the user, open files on 768 * the computer, and the name of the transport protocol the client is 769 * using. The pbBuffer parameter points to an array of session_info_50 770 * structures. 771 * 772 * bufptr 773 * [out] Pointer to the buffer that receives the data. The format of this 774 * data depends on the value of the level parameter. 775 * Windows NT/2000/XP: This buffer is allocated by the system and must be 776 * freed using the NetApiBufferFree function. Note that you must free the 777 * buffer even if the function fails with ERROR_MORE_DATA. 778 * Windows 95/98/Me: The caller must allocate and deallocate this buffer. 779 * 780 * prefmaxlen 781 * [in] Specifies the preferred maximum length of returned data, in bytes. 782 * If you specify MAX_PREFERRED_LENGTH, the function allocates the amount 783 * of memory required for the data. If you specify another value in this 784 * parameter, it can restrict the number of bytes that the function returns. 785 * If the buffer size is insufficient to hold all entries, the function 786 * returns ERROR_MORE_DATA. For more information, see Network Management 787 * Function Buffers and Network Management Function Buffer Lengths. 788 * 789 * entriesread 790 * [out] Pointer to a value that receives the count of elements actually 791 * enumerated. 792 * 793 * totalentries 794 * [out] Pointer to a value that receives the total number of entries that 795 * could have been enumerated from the current resume position. 796 * 797 * resume_handle 798 * [in/out] Pointer to a value that contains a resume handle which is used 799 * to continue an existing session search. The handle should be zero on the 800 * first call and left unchanged for subsequent calls. If resume_handle is 801 * NULL, no resume handle is stored. 802 * 803 * 804 * SESSION_INFO_1 805 * ============== 806 * The SESSION_INFO_1 structure contains information about the session, 807 * including name of the computer; name of the user; and open files, pipes, 808 * and devices on the computer. 809 * 810 * Members 811 * 812 * sesi1_cname 813 * Pointer to a Unicode string specifying the name of the computer that 814 * established the session. 815 * 816 * sesi1_username 817 * Pointer to a Unicode string specifying the name of the user who established 818 * the session. 819 * 820 * sesi1_num_opens 821 * Specifies a DWORD value that contains the number of files, devices, 822 * and pipes opened during the session. 823 * 824 * sesi1_time 825 * Specifies a DWORD value that contains the number of seconds the session 826 * has been active. 827 * 828 * sesi1_idle_time 829 * Specifies a DWORD value that contains the number of seconds the session 830 * has been idle. 831 * 832 * sesi1_user_flags 833 * Specifies a DWORD value that describes how the user established the 834 * session. This member can be one of the following values: 835 * SESS_GUEST The user specified by the sesi1_username member 836 * established the session using a guest account. 837 * SESS_NOENCRYPTION The user specified by the sesi1_username member 838 * established the session without using password 839 * encryption. 840 *********************************************************************** 841 */ 842 843#define SESS_GUEST 0x00000001 844#define SESS_NOENCRYPTION 0x00000002 845 846struct mslm_SESSION_INFO_0 { 847 LPTSTR sesi0_cname; 848}; 849INFONRES_RESULT(mslm_SESSION_INFO, 0) 850 851struct mslm_SESSION_INFO_1 { 852 LPTSTR sesi1_cname; 853 LPTSTR sesi1_uname; 854 DWORD sesi1_nopens; 855 DWORD sesi1_time; 856 DWORD sesi1_itime; 857 DWORD sesi1_uflags; 858}; 859INFONRES_RESULT(mslm_SESSION_INFO, 1) 860 861INFONRES_DEFINITION(mslm_NetSessionEnum, 862 INFONRES_UNION_ENTRY(mslm_SESSION_INFO, 0) 863 INFONRES_UNION_ENTRY(mslm_SESSION_INFO, 1)) 864 865OPERATION(SRVSVC_OPNUM_NetSessionEnum) 866struct mslm_NetSessionEnum { 867 IN LPTSTR servername; 868 IN DWORD unc_clientname; 869 IN DWORD username; 870 INOUT DWORD level; 871 INOUT struct mslm_NetSessionEnum_result result; 872 IN DWORD pref_max_len; 873 OUT DWORD total_entries; 874 INOUT DWORD *resume_handle; 875 OUT DWORD status; 876}; 877 878 879/* 880 *********************************************************************** 881 * NetSessionDel (Platform SDK: Network Management) 882 * 883 * The NetSessionDel function ends a network session between a server 884 * and a workstation. 885 * 886 * Security Requirements 887 * Only members of the Administrators or Account Operators local group 888 * can successfully execute the NetSessionDel function. 889 * 890 * Windows NT/2000/XP: The parameter order is as follows. 891 * 892 * NET_API_STATUS NetSessionDel(LPWSTR servername, 893 * LPWSTR UncClientName, 894 * LPWSTR username); 895 * 896 * Windows 95/98/Me: The sReserved parameter replaces the username 897 * parameter. For more information, see the following Remarks section. 898 * The parameter list is as follows. 899 * 900 * API_FUNCTION NetSessionDel(const char FAR *pszServer, 901 * const char FAR *pszClientName, 902 * short sReserved); 903 * 904 * Parameters 905 * 906 * servername 907 * [in] Pointer to a string that specifies the DNS or NetBIOS name 908 * of the remote server on which the function is to execute. If this 909 * parameter is NULL, the local computer is used. 910 * Windows NT 4.0 and earlier: This string must begin with \\. 911 * 912 * UncClientName 913 * [in] Pointer to a string that specifies the computer name of the 914 * client to disconnect. If UncClientName is NULL, then all the sessions 915 * of the user identified by the username parameter will be deleted on 916 * the server specified by servername. For more information, see 917 * NetSessionEnum. 918 * 919 * username 920 * [in] Pointer to a string that specifies the name of the user whose 921 * session is to be terminated. If this parameter is NULL, all users' 922 * sessions from the client specified by the UncClientName parameter 923 * are to be terminated. 924 * 925 * Remarks 926 * Windows 95/98/Me: You must specify the session key in the sReserved 927 * parameter when you call NetSessionDel. The session key is returned by 928 * the NetSessionEnum function or the NetSessionGetInfo function in the 929 * sesi50_key member of the session_info_50 structure. 930 *********************************************************************** 931 */ 932 933OPERATION(SRVSVC_OPNUM_NetSessionDel) 934struct mslm_NetSessionDel { 935 IN LPTSTR servername; 936 IN LPTSTR unc_clientname; 937 IN LPTSTR username; 938 OUT DWORD status; 939}; 940 941 942/* 943 * SRVSVC NetServerGetInfo ( 944 * IN LPTSTR servername, 945 * IN DWORD level, 946 * OUT union switch(level) { 947 * case 100: _SERVER_INFO_100 * p100; 948 * case 101: _SERVER_INFO_101 * p101; 949 * case 102: _SERVER_INFO_102 * p102; 950 * } bufptr, 951 * OUT DWORD status 952 * ) 953 */ 954 955/* for svX_platform */ 956#define SV_PLATFORM_ID_OS2 400 957#define SV_PLATFORM_ID_NT 500 958 959/* Bit-mapped values for svX_type fields */ 960#define SV_TYPE_WORKSTATION 0x00000001 961#define SV_TYPE_SERVER 0x00000002 962#define SV_TYPE_SQLSERVER 0x00000004 963#define SV_TYPE_DOMAIN_CTRL 0x00000008 964#define SV_TYPE_DOMAIN_BAKCTRL 0x00000010 965#define SV_TYPE_TIME_SOURCE 0x00000020 966#define SV_TYPE_AFP 0x00000040 967#define SV_TYPE_NOVELL 0x00000080 968#define SV_TYPE_DOMAIN_MEMBER 0x00000100 969#define SV_TYPE_PRINTQ_SERVER 0x00000200 970#define SV_TYPE_DIALIN_SERVER 0x00000400 971#define SV_TYPE_XENIX_SERVER 0x00000800 972#define SV_TYPE_SERVER_UNIX SV_TYPE_XENIX_SERVER 973#define SV_TYPE_NT 0x00001000 974#define SV_TYPE_WFW 0x00002000 975 976#define SV_TYPE_SERVER_MFPN 0x00004000 977#define SV_TYPE_SERVER_NT 0x00008000 978#define SV_TYPE_POTENTIAL_BROWSER 0x00010000 979#define SV_TYPE_BACKUP_BROWSER 0x00020000 980#define SV_TYPE_MASTER_BROWSER 0x00040000 981#define SV_TYPE_DOMAIN_MASTER 0x00080000 982#define SV_TYPE_SERVER_OSF 0x00100000 983#define SV_TYPE_SERVER_VMS 0x00200000 984#define SV_TYPE_WINDOWS 0x00400000 /* Windows95 and above */ 985#define SV_TYPE_ALTERNATE_XPORT 0x20000000 /* return list for 986 * alternate transport */ 987#define SV_TYPE_LOCAL_LIST_ONLY 0x40000000 /* Return local list only */ 988#define SV_TYPE_DOMAIN_ENUM 0x80000000 989#define SV_TYPE_ALL 0xFFFFFFFF /* handy for NetServerEnum2 */ 990 991/* NT-Server 4.0 sends 0x0006_120B */ 992#define SV_TYPE_SENT_BY_NT_4_0_SERVER \ 993 ( SV_TYPE_WORKSTATION \ 994 | SV_TYPE_SERVER \ 995 | SV_TYPE_DOMAIN_CTRL \ 996 | SV_TYPE_NT \ 997 | SV_TYPE_BACKUP_BROWSER \ 998 | SV_TYPE_MASTER_BROWSER) 999/* NT-workstation 4.0 send 0x0004_1013 */ 1000#define SV_TYPE_SENT_BY_NT_4_0_WORKSTATION \ 1001 ( SV_TYPE_WORKSTATION \ 1002 | SV_TYPE_SERVER \ 1003 | SV_TYPE_DOMAIN_BAKCTRL \ 1004 | SV_TYPE_NT \ 1005 | SV_TYPE_MASTER_BROWSER) 1006 1007/* Special value for sv102_disc that specifies infinite disconnect time */ 1008#define SV_NODISC (-1L) /* No autodisconnect timeout enforced */ 1009 1010/* Values of svX_security field */ 1011#define SV_USERSECURITY 1 1012#define SV_SHARESECURITY 0 1013 1014/* Values of svX_hidden field */ 1015#define SV_HIDDEN 1 1016#define SV_VISIBLE 0 1017 1018 1019/* Let's get some info already */ 1020struct mslm_SERVER_INFO_100 { 1021 DWORD sv100_platform_id; 1022 LPTSTR sv100_name; 1023}; 1024 1025struct mslm_SERVER_INFO_101 { 1026 DWORD sv101_platform_id; 1027 LPTSTR sv101_name; 1028 DWORD sv101_version_major; 1029 DWORD sv101_version_minor; 1030 DWORD sv101_type; 1031 LPTSTR sv101_comment; 1032}; 1033 1034struct mslm_SERVER_INFO_102 { 1035 DWORD sv102_platform_id; 1036 LPTSTR sv102_name; 1037 DWORD sv102_version_major; 1038 DWORD sv102_version_minor; 1039 DWORD sv102_type; 1040 LPTSTR sv102_comment; 1041 DWORD sv102_users; 1042 DWORD sv102_disc; 1043 DWORD sv102_hidden; /* BOOL */ 1044 DWORD sv102_announce; 1045 DWORD sv102_anndelta; 1046 DWORD sv102_licenses; 1047 LPTSTR sv102_userpath; 1048}; 1049 1050union mslm_NetServerGetInfo_ru { 1051 CASE(100) struct mslm_SERVER_INFO_100 *bufptr100; 1052 CASE(101) struct mslm_SERVER_INFO_101 *bufptr101; 1053 CASE(102) struct mslm_SERVER_INFO_102 *bufptr102; 1054 DEFAULT char *nullptr; 1055}; 1056 1057struct mslm_NetServerGetInfo_result { 1058 DWORD level; 1059 SWITCH(level) 1060 union mslm_NetServerGetInfo_ru bufptr; 1061}; 1062 1063 1064OPERATION(SRVSVC_OPNUM_NetServerGetInfo) 1065struct mslm_NetServerGetInfo { 1066 IN LPTSTR servername; 1067 IN DWORD level; 1068 OUT struct mslm_NetServerGetInfo_result result; 1069 OUT DWORD status; 1070}; 1071 1072/* 1073 * SRVSVC NetRemoteTOD ( 1074 * IN LPTSTR servername, 1075 * OUT _TIME_OF_DAY_INFO *bufptr, 1076 * OUT long status 1077 * ) 1078 */ 1079 1080struct mslm_TIME_OF_DAY_INFO { 1081 DWORD tod_elapsedt; 1082 DWORD tod_msecs; 1083 DWORD tod_hours; 1084 DWORD tod_mins; 1085 DWORD tod_secs; 1086 DWORD tod_hunds; 1087 DWORD tod_timezone; 1088 DWORD tod_tinterval; 1089 DWORD tod_day; 1090 DWORD tod_month; 1091 DWORD tod_year; 1092 DWORD tod_weekday; 1093}; 1094 1095OPERATION(SRVSVC_OPNUM_NetRemoteTOD) 1096struct mslm_NetRemoteTOD { 1097 IN LPTSTR servername; 1098 OUT struct mslm_TIME_OF_DAY_INFO *bufptr; 1099 OUT DWORD status; 1100}; 1101 1102#define NAMETYPE_USER 1 1103#define NAMETYPE_PASSWORD 2 1104#define NAMETYPE_GROUP 3 1105#define NAMETYPE_COMPUTER 4 1106#define NAMETYPE_EVENT 5 1107#define NAMETYPE_DOMAIN 6 1108#define NAMETYPE_SERVICE 7 1109#define NAMETYPE_NET 8 1110#define NAMETYPE_SHARE 9 1111#define NAMETYPE_MESSAGE 10 1112#define NAMETYPE_MESSAGEDEST 11 1113#define NAMETYPE_SHAREPASSWORD 12 1114#define NAMETYPE_WORKGROUP 13 1115 1116OPERATION(SRVSVC_OPNUM_NetNameValidate) 1117struct mslm_NetNameValidate { 1118 IN LPTSTR servername; 1119 IN REFERENCE LPTSTR pathname; 1120 IN DWORD type; 1121 IN DWORD flags; 1122 OUT DWORD status; 1123}; 1124 1125/* 1126 * SRVSVC NetShareEnum ( 1127 * IN LPTSTR servername, 1128 * IN DWORD level; 1129 * OUT union switch(level) { 1130 * case 0: struct { 1131 * DWORD entriesread; 1132 * [size_is(entriesread)] 1133 * _SHARE_INFO_0 *entries; 1134 * } *bufptr0; 1135 * case 1: struct { 1136 * DWORD entriesread; 1137 * [size_is(entriesread)] 1138 * _SHARE_INFO_1 *entries; 1139 * } *bufptr1; 1140 * ... 1141 * } bufptr, 1142 * IN DWORD prefmaxlen, 1143 * OUT DWORD totalentries, 1144 * IN OUT DWORD ?* resume_handle, 1145 * OUT DWORD status 1146 * ) 1147 */ 1148 1149/* 1150 * Share types for shiX_type fields - duplicated from cifs.h 1151 */ 1152#ifndef _SHARE_TYPES_DEFINED_ 1153#define _SHARE_TYPES_DEFINED_ 1154#define STYPE_DISKTREE 0x00000000 1155#define STYPE_PRINTQ 0x00000001 1156#define STYPE_DEVICE 0x00000002 1157#define STYPE_IPC 0x00000003 1158#define STYPE_MASK 0x0000000F 1159#define STYPE_DFS 0x00000064 1160#define STYPE_HIDDEN 0x80000000 1161#define STYPE_SPECIAL 0x80000000 1162#endif /* _SHARE_TYPES_DEFINED_ */ 1163 1164/* Maximum uses for shiX_max_uses fields */ 1165#define SHI_USES_UNLIMITED (DWORD)-1 1166 1167 1168struct mslm_SHARE_INFO_0 { 1169 LPTSTR shi0_netname; 1170}; 1171INFONRES_RESULT(mslm_SHARE_INFO,0) 1172 1173struct mslm_SHARE_INFO_1 { 1174 LPTSTR shi1_netname; 1175 DWORD shi1_type; 1176 LPTSTR shi1_remark; 1177}; 1178INFONRES_RESULT(mslm_SHARE_INFO,1) 1179 1180struct mslm_SHARE_INFO_2 { 1181 LPTSTR shi2_netname; 1182 DWORD shi2_type; 1183 LPTSTR shi2_remark; 1184 DWORD shi2_permissions; 1185 DWORD shi2_max_uses; 1186 DWORD shi2_current_uses; 1187 LPTSTR shi2_path; 1188 LPTSTR shi2_passwd; 1189}; 1190INFONRES_RESULT(mslm_SHARE_INFO,2) 1191 1192/* 1193 * shi501_flags must be zero. 1194 */ 1195struct mslm_SHARE_INFO_501 { 1196 LPTSTR shi501_netname; 1197 DWORD shi501_type; 1198 LPTSTR shi501_remark; 1199 DWORD shi501_flags; 1200}; 1201INFONRES_RESULT(mslm_SHARE_INFO,501) 1202 1203/* 1204 * Note: shi502_security_descriptor should be a pointer to a 1205 * security descriptor (W32SEC_SECURITY_DESCRIPTOR): 1206 * PSECURITY_DESCRIPTOR shi502_security_descriptor; 1207 * 1208 * For now use a DWORD and set it to zero. 1209 */ 1210struct mslm_SHARE_INFO_502 { 1211 LPTSTR shi502_netname; 1212 DWORD shi502_type; 1213 LPTSTR shi502_remark; 1214 DWORD shi502_permissions; 1215 DWORD shi502_max_uses; 1216 DWORD shi502_current_uses; 1217 LPTSTR shi502_path; 1218 LPTSTR shi502_passwd; 1219 DWORD shi502_reserved; 1220 DWORD shi502_security_descriptor; 1221}; 1222INFONRES_RESULT(mslm_SHARE_INFO,502) 1223 1224union mslm_NetShareAddInfo_u { 1225 CASE(2) struct mslm_SHARE_INFO_2 *info2; 1226 CASE(502) struct mslm_SHARE_INFO_502 *info502; 1227}; 1228 1229struct mslm_NetShareAddInfo { 1230 DWORD switch_value; 1231 SWITCH(switch_value) 1232 union mslm_NetShareAddInfo_u un; 1233}; 1234 1235 1236OPERATION(SRVSVC_OPNUM_NetShareAdd) 1237struct mslm_NetShareAdd { 1238 IN LPTSTR servername; 1239 IN DWORD level; 1240 IN struct mslm_NetShareAddInfo info; 1241 INOUT DWORD *parm_err; 1242 OUT DWORD status; 1243}; 1244 1245 1246INFONRES_DEFINITION(mslm_NetShareEnum, 1247 INFONRES_UNION_ENTRY(mslm_SHARE_INFO,0) 1248 INFONRES_UNION_ENTRY(mslm_SHARE_INFO,1) 1249 INFONRES_UNION_ENTRY(mslm_SHARE_INFO,2) 1250 INFONRES_UNION_ENTRY(mslm_SHARE_INFO,501) 1251 INFONRES_UNION_ENTRY(mslm_SHARE_INFO,502)) 1252 1253/* 1254 * NetShareEnum: enumerate all shares (see also NetShareEnumSticky). 1255 * Note: the server should ignore the content of servername. 1256 */ 1257OPERATION(SRVSVC_OPNUM_NetShareEnum) 1258struct mslm_NetShareEnum { 1259 IN LPTSTR servername; 1260 INOUT DWORD level; 1261 INOUT struct mslm_NetShareEnum_result result; 1262 IN DWORD prefmaxlen; 1263 OUT DWORD totalentries; 1264 INOUT DWORD *resume_handle; 1265 OUT DWORD status; 1266}; 1267 1268/* 1269 * Delete a share. The reserved field appears in netmon 1270 * but I've left it out in case it's not always present. 1271 * This won't affect RPC processing. 1272 */ 1273OPERATION(SRVSVC_OPNUM_NetShareDel) 1274struct mslm_NetShareDel { 1275 IN LPTSTR servername; 1276 IN REFERENCE LPTSTR netname; 1277 /* IN DWORD reserved; */ 1278 OUT DWORD status; 1279}; 1280 1281/* 1282 * NetShareEnumSticky is the same as NetShareEnum except that 1283 * STYPE_SPECIAL (hidden or special) shares are not returned. 1284 * Note: the server should ignore the content of servername. 1285 */ 1286OPERATION(SRVSVC_OPNUM_NetShareEnumSticky) 1287struct mslm_NetShareEnumSticky { 1288 IN LPTSTR servername; 1289 INOUT DWORD level; 1290 INOUT struct mslm_NetShareEnum_result result; 1291 IN DWORD prefmaxlen; 1292 OUT DWORD totalentries; 1293 INOUT DWORD *resume_handle; 1294 OUT DWORD status; 1295}; 1296 1297/* 1298 * When you install Windows NT Server Tools on a Win95 client, 1299 * a security tab will be added to properties dialog box of files/folders. 1300 * Within this security tab, when you try to get/set permissions on a 1301 * file/folder the next two RPC calls are used. 1302 */ 1303OPERATION(SRVSVC_OPNUM_NetGetFileSecurity) 1304struct mslm_NetGetFileSecurity { 1305 IN LPTSTR servername; 1306 IN LPTSTR sharename; 1307 IN REFERENCE LPTSTR filename; 1308 IN DWORD securityinfo; 1309 1310 /* 1311 * Right now, we can't send back SD of the requested object 1312 * in RPC code, so we just reply with access denied error 1313 * code. Thus, this output declaration is only valid in this 1314 * case i.e., it's not complete. 1315 * It looks like: 1316 * 1317 * A Pointer 1318 * A Length 1319 * 1320 * A Pointer 1321 * A Length (equal to the prev length) 1322 * A buffer 1323 * 1324 * return value 1325 */ 1326 OUT DWORD length; 1327 OUT DWORD status; 1328}; 1329 1330/* 1331 * This is the request: 1332 * 1333 * R_SRVSVC: RPC Client call srvsvc:NetrpSetFileSecurity(..) 1334 * R_SRVSVC: SRVSVC_HANDLE ServerName = \\WK76-177 1335 * R_SRVSVC: LPWSTR ShareName = AFSHIN 1336 * R_SRVSVC: LPWSTR lpFileName = \salek.txt 1337 * R_SRVSVC: SECURITY_INFORMATION SecurityInformation = 4 (0x4) 1338 * -R_SRVSVC: PADT_SECURITY_DESCRIPTOR SecurityDescriptor {..} 1339 * R_SRVSVC: DWORD Length = 64 (0x40) 1340 * R_SRVSVC: LPBYTE Buffer = 4496048 (0x449AB0) 1341 * R_SRVSVC: LPBYTE Buffer [..] = 01 00 04 80 00 00 00 00 00 00 00 00 00 00 00 1342 * ... 1343 * 1344 * 000000A0 00 83 46 00 0B 00 00 00 00 00 00 00 0B 00 ..F........... 1345 * 000000B0 00 00 5C 00 5C 00 57 00 4B 00 37 00 36 00 2D 00 ..\.\.W.K.7.6.-. 1346 * 000000C0 31 00 37 00 37 00 00 00 08 00 16 83 46 00 07 00 1.7.7.......F... 1347 * 000000D0 00 00 00 00 00 00 07 00 00 00 41 00 46 00 53 00 ..........A.F.S. 1348 * 000000E0 48 00 49 00 4E 00 00 00 00 00 0B 00 00 00 00 00 H.I.N........... 1349 * 000000F0 00 00 0B 00 00 00 5C 00 73 00 61 00 6C 00 65 00 ......\.s.a.l.e. 1350 * 00000100 6B 00 2E 00 74 00 78 00 74 00 00 00 00 00 04 00 k...t.x.t....... 1351 * 00000110 00 00 40 00 00 00 B0 9A 44 00 40 00 00 00 01 00 ..@.....D.@..... 1352 * 00000120 04 80 00 00 00 00 00 00 00 00 00 00 00 00 14 00 ................ 1353 * 00000130 00 00 02 00 2C 00 01 00 00 00 00 00 24 00 00 00 ....,.......$... 1354 * 00000140 00 A0 01 05 00 00 00 00 00 05 15 00 00 00 1A 24 ...............$ 1355 * 00000150 44 38 90 00 0F 02 65 3A BE 4C FF 03 00 00 00 00 D8....e:.L...... 1356 * 00000160 00 00 00 00 00 00 00 00 00 00 .......... 1357 */ 1358OPERATION(SRVSVC_OPNUM_NetSetFileSecurity) 1359struct mslm_NetSetFileSecurity { 1360 IN LPTSTR servername; 1361 IN LPTSTR sharename; 1362 IN REFERENCE LPTSTR filename; 1363 IN DWORD securityinfo; 1364 /* 1365 * IN Security Descriptor (looks like): 1366 * Length1 1367 * Pointer 1368 * Length2 (== Length1) 1369 * buffer itself 1370 */ 1371 1372 OUT DWORD status; 1373}; 1374 1375/* 1376 * The SRVSVC already 1377 */ 1378INTERFACE(0) 1379union srvsvc_interface { 1380 CASE(SRVSVC_OPNUM_NetConnectEnum) 1381 struct mslm_NetConnectEnum NetConnectEnum; 1382 CASE(SRVSVC_OPNUM_NetFileEnum) 1383 struct mslm_NetFileEnum NetFileEnum; 1384 CASE(SRVSVC_OPNUM_NetFileClose) 1385 struct mslm_NetFileClose NetFileClose; 1386 CASE(SRVSVC_OPNUM_NetShareGetInfo) 1387 struct mlsm_NetShareGetInfo NetShareGetInfo; 1388 CASE(SRVSVC_OPNUM_NetShareSetInfo) 1389 struct mlsm_NetShareGetInfo NetShareSetInfo; 1390 CASE(SRVSVC_OPNUM_NetSessionDel) 1391 struct mslm_NetSessionDel NetSessionDel; 1392 CASE(SRVSVC_OPNUM_NetSessionEnum) 1393 struct mslm_NetSessionEnum NetSessionEnum; 1394 CASE(SRVSVC_OPNUM_NetServerGetInfo) 1395 struct mslm_NetServerGetInfo NetServerGetInfo; 1396 CASE(SRVSVC_OPNUM_NetRemoteTOD) 1397 struct mslm_NetRemoteTOD NetRemoteTOD; 1398 CASE(SRVSVC_OPNUM_NetNameValidate) 1399 struct mslm_NetNameValidate NetNameValidate; 1400 CASE(SRVSVC_OPNUM_NetShareAdd) 1401 struct mslm_NetShareAdd NetShareAdd; 1402 CASE(SRVSVC_OPNUM_NetShareDel) 1403 struct mslm_NetShareDel NetShareDel; 1404 CASE(SRVSVC_OPNUM_NetShareEnum) 1405 struct mslm_NetShareEnum NetShareEnum; 1406 CASE(SRVSVC_OPNUM_NetShareEnumSticky) 1407 struct mslm_NetShareEnumSticky NetShareEnumSticky; 1408 CASE(SRVSVC_OPNUM_NetGetFileSecurity) 1409 struct mslm_NetGetFileSecurity NetGetFileSecurity; 1410 CASE(SRVSVC_OPNUM_NetSetFileSecurity) 1411 struct mslm_NetSetFileSecurity NetSetFileSecurity; 1412}; 1413typedef union srvsvc_interface srvsvc_interface_t; 1414EXTERNTYPEINFO(srvsvc_interface) 1415 1416 1417 1418/* 1419 * WKSSVC - Workstation Service 1420 */ 1421 1422/* Windows NT */ 1423#define WKSSVC_OPNUM_NetWkstaGetInfo 0x00 1424#define WKSSVC_OPNUM_NetWkstaSetInfo 0x01 1425#define WKSSVC_OPNUM_NetWkstaUserEnum 0x02 1426#define WKSSVC_OPNUM_NetWkstaUserGetInfo 0x03 1427#define WKSSVC_OPNUM_NetWkstaUserSetInfo 0x04 1428#define WKSSVC_OPNUM_NetWkstaTransportEnum 0x05 1429#define WKSSVC_OPNUM_NetWkstaTransportAdd 0x06 1430#define WKSSVC_OPNUM_NetWkstaTransportDel 0x07 1431#define WKSSVC_OPNUM_NetUseAdd 0x08 1432#define WKSSVC_OPNUM_NetUseGetInfo 0x09 1433#define WKSSVC_OPNUM_NetUseDel 0x0a 1434#define WKSSVC_OPNUM_NetUseEnum 0x0b 1435#define WKSSVC_OPNUM_NetMessageBufferSend 0x0c 1436#define WKSSVC_OPNUM_NetWkstaStatisticsGet 0x0d 1437#define WKSSVC_OPNUM_NetLogonDomainNameAdd 0x0e 1438 1439/* Windows 2000 */ 1440#define WKSSVC_OPNUM_NetLogonDomainNameDel 0x0f 1441#define WKSSVC_OPNUM_NetJoinDomain 0x10 1442#define WKSSVC_OPNUM_NetUnjoinDomain 0x11 1443#define WKSSVC_OPNUM_NetValidateName 0x12 1444#define WKSSVC_OPNUM_NetRenameMachineInDomain 0x13 1445#define WKSSVC_OPNUM_NetGetJoinInformation 0x14 1446#define WKSSVC_OPNUM_NetGetJoinableOUs 0x15 1447#define WKSSVC_OPNUM_NetJoinDomain2 0x16 1448#define WKSSVC_OPNUM_NetUnjoinDomain2 0x17 1449#define WKSSVC_OPNUM_NetRenameMachineInDomain2 0x18 1450#define WKSSVC_OPNUM_NetValidateName2 0x19 1451#define WKSSVC_OPNUM_NetGetJoinableOUs2 0x1a 1452 1453/* Windows XP and Windows Server 2003 */ 1454#define WKSSVC_OPNUM_NetAddAlternateComputerName 0x1b 1455#define WKSSVC_OPNUM_NetRemoveAlternateComputerName 0x1c 1456#define WKSSVC_OPNUM_NetSetPrimaryComputerName 0x1d 1457#define WKSSVC_OPNUM_NetEnumerateComputerNames 0x1e 1458#define WKSSVC_OPNUM_NetWorkstationResetDfsCache 0x1f 1459 1460 1461struct mslm_WKSTA_INFO_100 { 1462 DWORD wki100_platform_id; 1463 LPTSTR wki100_computername; 1464 LPTSTR wki100_langroup; 1465 DWORD wki100_ver_major; 1466 DWORD wki100_ver_minor; 1467}; 1468 1469/* NetWkstaGetInfo only. System information - user access */ 1470struct mslm_WKSTA_INFO_101 { 1471 DWORD wki101_platform_id; 1472 LPTSTR wki101_computername; 1473 LPTSTR wki101_langroup; 1474 DWORD wki101_ver_major; 1475 DWORD wki101_ver_minor; 1476 LPTSTR wki101_lanroot; 1477}; 1478 1479/* NetWkstaGetInfo only. System information - admin or operator access */ 1480struct mslm_WKSTA_INFO_102 { 1481 DWORD wki102_platform_id; 1482 LPTSTR wki102_computername; 1483 LPTSTR wki102_langroup; 1484 DWORD wki102_ver_major; 1485 DWORD wki102_ver_minor; 1486 LPTSTR wki102_lanroot; 1487 DWORD wki102_logged_on_users; 1488}; 1489 1490struct mslm_WKSTA_INFO_502 { 1491 DWORD char_wait; 1492 DWORD collection_time; 1493 DWORD maximum_collection_count; 1494 DWORD keep_connection; 1495 DWORD max_commands; 1496 DWORD session_timeout; 1497 DWORD size_char_buf; 1498 DWORD max_threads; 1499 DWORD lock_quota; 1500 DWORD lock_increment; 1501 DWORD lock_maximum; 1502 DWORD pipe_increment; 1503 DWORD pipe_maximum; 1504 DWORD cache_file_timeout; 1505 DWORD dormant_file_limit; 1506 DWORD read_ahead_throughput; 1507 DWORD num_mailslot_buffers; 1508 DWORD num_srv_announce_buffers; 1509 DWORD max_illegal_dgram_events; 1510 DWORD dgram_event_reset_freq; 1511 DWORD log_election_packets; 1512 DWORD use_opportunistic_locking; 1513 DWORD use_unlock_behind; 1514 DWORD use_close_behind; 1515 DWORD buf_named_pipes; 1516 DWORD use_lock_read_unlock; 1517 DWORD utilize_nt_caching; 1518 DWORD use_raw_read; 1519 DWORD use_raw_write; 1520 DWORD use_write_raw_data; 1521 DWORD use_encryption; 1522 DWORD buf_files_deny_write; 1523 DWORD buf_read_only_files; 1524 DWORD force_core_create_mode; 1525 DWORD use_512_byte_max_transfer; 1526}; 1527 1528INFO1RES_DEFINITION(mslm_NetWkstaGetInfo, 1529 INFO1RES_UNION_ENTRY(mslm_WKSTA_INFO,100) 1530 INFO1RES_UNION_ENTRY(mslm_WKSTA_INFO,101) 1531 INFO1RES_UNION_ENTRY(mslm_WKSTA_INFO,102) 1532 INFO1RES_UNION_ENTRY(mslm_WKSTA_INFO,502)) 1533 1534INFO1RESBUF_DEFINITION(mslm_NetWkstaGetInfo, 1535 INFO1RESBUF_UNION_ENTRY(mslm_WKSTA_INFO,100) 1536 INFO1RESBUF_UNION_ENTRY(mslm_WKSTA_INFO,101) 1537 INFO1RESBUF_UNION_ENTRY(mslm_WKSTA_INFO,102) 1538 INFO1RESBUF_UNION_ENTRY(mslm_WKSTA_INFO,502)) 1539 1540 1541OPERATION(WKSSVC_OPNUM_NetWkstaGetInfo) 1542struct mslm_NetWkstaGetInfo { 1543 IN LPTSTR servername; 1544 IN DWORD level; 1545 OUT struct mslm_NetWkstaGetInfo_result result; 1546 OUT DWORD status; 1547}; 1548 1549/* 1550 *********************************************************************** 1551 * NetWkstaTransportEnum 1552 *********************************************************************** 1553 */ 1554 1555struct mslm_NetWkstaTransportInfo0 { 1556 DWORD quality_of_service; 1557 DWORD num_vcs; 1558 LPTSTR transport_name; 1559 LPTSTR transport_address; 1560 DWORD wan_ish; 1561}; 1562 1563struct mslm_NetWkstaTransportCtr0 { 1564 DWORD count; 1565 SIZE_IS(count) 1566 struct mslm_NetWkstaTransportInfo0 *ti0; 1567}; 1568 1569union mslm_NetWkstaTransportInfo_ru { 1570 CASE(0) struct mslm_NetWkstaTransportCtr0 *info0; 1571 DEFAULT char *nullptr; 1572}; 1573 1574struct mslm_NetWkstaTransportInfo { 1575 DWORD address; 1576 DWORD level; 1577 SWITCH(level) 1578 union mslm_NetWkstaTransportInfo_ru ru; 1579}; 1580 1581OPERATION(WKSSVC_OPNUM_NetWkstaTransportEnum) 1582struct mslm_NetWkstaTransportEnum { 1583 IN LPTSTR servername; 1584 INOUT struct mslm_NetWkstaTransportInfo info; 1585 IN DWORD pref_max_len; 1586 OUT DWORD total_entries; 1587 INOUT DWORD *resume_handle; 1588 OUT DWORD status; 1589}; 1590 1591/* 1592 * The WKSSVC already 1593 */ 1594INTERFACE(0) 1595union wkssvc_interface { 1596 CASE(WKSSVC_OPNUM_NetWkstaGetInfo) 1597 struct mslm_NetWkstaGetInfo NetWkstaGetInfo; 1598 CASE(WKSSVC_OPNUM_NetWkstaTransportEnum) 1599 struct mslm_NetWkstaTransportEnum NetWkstaTransportEnum; 1600}; 1601typedef union wkssvc_interface wkssvc_interface_t; 1602EXTERNTYPEINFO(wkssvc_interface) 1603 1604 1605#endif /* _MLSVC_LANMAN_NDL_ */ 1606