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