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