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