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_ */