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