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