/*++

Copyright (c) 1990  Microsoft Corporation

Module Name:

    SRVSVC.IDL

Abstract:

    Contains the Netr (Net Remote) RPC interface specification for the
    API associated with the Server Service.  This includes API from the
    following catagories:

        NetCharDev
        NetCharDevQ
        NetConnection
        NetFile
        NetRemoteTOD
        NetServer
        NetServerTransport
        NetSession
        NetShare
        NetStatisticsGet (server half)

    Also contains the RPC specific data structures for these API.

Author:

    Dan Lafferty    (danl)  06-Feb-1991

Environment:

    User Mode - Win32 - MIDL

Revision History:

    07-May-1991     danl
        Updated with RPC unionSs and latest structures.

    06-Feb-1991     danl
        created

    08-Aug-1992     johnsona
        added share info level 502.

--*/


//
// Interface Attributes
//

[
    uuid(4B324FC8-1670-01D3-1278-5A47BF6EE188),
    version(3.0),
#ifdef __midl
        ms_union,
#endif // __midl
    pointer_default(unique)
]


interface srvsvc


{

import   "import.idl";
#include <lmcons.h>

//
// BUGBUG - take this definition out when midl understands LPWSTR etc
//

#ifdef UNICODE
#define LPTSTR wchar_t*
#define TCHAR wchar_t
#else
#define TCHAR char
#endif

typedef [handle] LPTSTR  SRVSVC_HANDLE;

//
// CharDev API
//

//
// Structures - NetrCharDev
//
typedef struct _CHARDEV_INFO_0_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPCHARDEV_INFO_0 Buffer;
} CHARDEV_INFO_0_CONTAINER, *PCHARDEV_INFO_0_CONTAINER, *LPCHARDEV_INFO_0_CONTAINER;

typedef struct _CHARDEV_INFO_1_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPCHARDEV_INFO_1 Buffer;
} CHARDEV_INFO_1_CONTAINER, *PCHARDEV_INFO_1_CONTAINER, *LPCHARDEV_INFO_1_CONTAINER;

typedef struct _CHARDEV_ENUM_STRUCT {
    DWORD   Level;
    [switch_is(Level)] union _CHARDEV_ENUM_UNION{
        [case(0)]
            CHARDEV_INFO_0_CONTAINER *Level0;
        [case(1)]
            CHARDEV_INFO_1_CONTAINER *Level1;
        [default]
            ;
    } CharDevInfo;

}CHARDEV_ENUM_STRUCT, *PCHARDEV_ENUM_STRUCT, *LPCHARDEV_ENUM_STRUCT;

typedef [switch_type(unsigned long)] union _CHARDEV_INFO {  // for Get & Set Info
    [case(0)]
        LPCHARDEV_INFO_0 CharDevInfo0;
    [case(1)]
        LPCHARDEV_INFO_1 CharDevInfo1;
    [default]
        ;
} CHARDEV_INFO, *PCHARDEV_INFO, *LPCHARDEV_INFO;

//
// Function Prototypes - NetrCharDev
//

NET_API_STATUS
NetrCharDevEnum (
    [in,string,unique] SRVSVC_HANDLE          ServerName,
    [in,out]           LPCHARDEV_ENUM_STRUCT  InfoStruct,
    [in]               DWORD                  PreferedMaximumLength,
    [out]              LPDWORD                TotalEntries,
    [in,out,unique]    LPDWORD                ResumeHandle
    );

NET_API_STATUS
NetrCharDevGetInfo (
    [in,string,unique] SRVSVC_HANDLE        ServerName,
    [in,string] LPTSTR                      DevName,
    [in]        DWORD                       Level,
    [out, switch_is(Level)] LPCHARDEV_INFO  InfoStruct
    );

NET_API_STATUS
NetrCharDevControl (
    [in,string,unique] SRVSVC_HANDLE    ServerName,
    [in,string] LPTSTR                  DevName,
    [in]        DWORD                   Opcode
    );


//
// CharDevQ API
//

//
// Structures - NetrCharDevQ
//

typedef struct _CHARDEVQ_INFO_0_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPCHARDEVQ_INFO_0 Buffer;
} CHARDEVQ_INFO_0_CONTAINER, *PCHARDEVQ_INFO_0_CONTAINER, *LPCHARDEVQ_INFO_0_CONTAINER;

typedef struct _CHARDEVQ_INFO_1_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPCHARDEVQ_INFO_1 Buffer;
} CHARDEVQ_INFO_1_CONTAINER, *PCHARDEVQ_INFO_1_CONTAINER, *LPCHARDEVQ_INFO_1_CONTAINER;

typedef struct _CHARDEVQ_ENUM_STRUCT {
    DWORD   Level;
    [switch_is(Level)] union _CHARDEVQ_ENUM_UNION{
        [case(0)]
            CHARDEVQ_INFO_0_CONTAINER *Level0;
        [case(1)]
            CHARDEVQ_INFO_1_CONTAINER *Level1;
        [default]
            ;
    } CharDevQInfo;

}CHARDEVQ_ENUM_STRUCT, *PCHARDEVQ_ENUM_STRUCT, *LPCHARDEVQ_ENUM_STRUCT;

typedef [switch_type(unsigned long)] union _CHARDEVQ_INFO {  // for Get & Set Info
    [case(0)]
        LPCHARDEVQ_INFO_0 CharDevQInfo0;
    [case(1)]
        LPCHARDEVQ_INFO_1 CharDevQInfo1;
    [case(1002)]
        LPCHARDEVQ_INFO_1002 CharDevQInfo11002;
    [case(1003)]
        LPCHARDEVQ_INFO_1003 CharDevQInfo1003;
    [default]
        ;
} CHARDEVQ_INFO, *PCHARDEVQ_INFO, *LPCHARDEVQ_INFO;

//
// Function Prototypes - NetrCharDevQ
//

NET_API_STATUS
NetrCharDevQEnum (
    [in,string,unique] SRVSVC_HANDLE           ServerName,
    [in,string,unique] LPTSTR                  UserName,
    [in,out]           LPCHARDEVQ_ENUM_STRUCT  InfoStruct,
    [in]               DWORD                   PreferedMaximumLength,
    [out]              LPDWORD                 TotalEntries,
    [in,out,unique]    LPDWORD                 ResumeHandle
    );

NET_API_STATUS
NetrCharDevQGetInfo (
    [in,string,unique] SRVSVC_HANDLE        ServerName,
    [in,string] LPTSTR                      QueueName,
    [in,string] LPTSTR                      UserName,
    [in]        DWORD                       Level,
    [out, switch_is(Level)] LPCHARDEVQ_INFO InfoStruct
    );

NET_API_STATUS
NetrCharDevQSetInfo (
    [in,string,unique]     SRVSVC_HANDLE    ServerName,
    [in,string]            LPTSTR           QueueName,
    [in]                   DWORD            Level,
    [in, switch_is(Level)] LPCHARDEVQ_INFO  CharDevQInfo,
    [in,out,unique]        LPDWORD          ParmErr
    );

NET_API_STATUS
NetrCharDevQPurge (
    [in,string,unique]  SRVSVC_HANDLE   ServerName,
    [in,string]  LPTSTR                 QueueName
    );

NET_API_STATUS
NetrCharDevQPurgeSelf (
    [in,string,unique]  SRVSVC_HANDLE   ServerName,
    [in,string]  LPTSTR                 QueueName,
    [in,string]  LPTSTR                 ComputerName
    );

//
// Connection API
//

//
// Structures - NetrConnection
//

typedef struct _CONNECT_INFO_0_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPCONNECTION_INFO_0 Buffer;
} CONNECT_INFO_0_CONTAINER, *PCONNECT_INFO_0_CONTAINER, *LPCONNECT_INFO_0_CONTAINER;

typedef struct _CONNECT_INFO_1_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPCONNECTION_INFO_1 Buffer;
} CONNECT_INFO_1_CONTAINER, *PCONNECT_INFO_1_CONTAINER, *LPCONNECT_INFO_1_CONTAINER;

typedef struct _CONNECT_ENUM_STRUCT {
    DWORD   Level;
    [switch_is(Level)] union _CONNECT_ENUM_UNION{
        [case(0)]
            CONNECT_INFO_0_CONTAINER *Level0;
        [case(1)]
            CONNECT_INFO_1_CONTAINER *Level1;
        [default]
            ;
    } ConnectInfo;

}CONNECT_ENUM_STRUCT, *PCONNECT_ENUM_STRUCT, *LPCONNECT_ENUM_STRUCT;


//
// Function Prototypes - NetrConnection
//

NET_API_STATUS
NetrConnectionEnum (
    [in,string,unique]  SRVSVC_HANDLE          ServerName,
    [in,string,unique]  LPTSTR                 Qualifier,
    [in,out]            LPCONNECT_ENUM_STRUCT  InfoStruct,
    [in]                DWORD                  PreferedMaximumLength,
    [out]               LPDWORD                TotalEntries,
    [in,out,unique]     LPDWORD                ResumeHandle
    );

//
// File API
//

//
// Structures - NetrFile
//

typedef struct _FILE_INFO_2_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPFILE_INFO_2    Buffer;
} FILE_INFO_2_CONTAINER, *PFILE_INFO_2_CONTAINER, *LPFILE_INFO_2_CONTAINER;

typedef struct _FILE_INFO_3_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPFILE_INFO_3    Buffer;
} FILE_INFO_3_CONTAINER, *PFILE_INFO_3_CONTAINER, *LPFILE_INFO_3_CONTAINER;


typedef struct _FILE_ENUM_STRUCT {
    DWORD   Level;
    [switch_is(Level)] union _FILE_ENUM_UNION {
        [case(2)]
            FILE_INFO_2_CONTAINER *Level2;
        [case(3)]
            FILE_INFO_3_CONTAINER *Level3;
        [default]
            ;
    } FileInfo;

}FILE_ENUM_STRUCT, *PFILE_ENUM_STRUCT, *LPFILE_ENUM_STRUCT;

typedef [switch_type(unsigned long)] union _FILE_INFO {  // for Get & Set Info
    [case(2)]
        LPFILE_INFO_2 FileInfo2;
    [case(3)]
        LPFILE_INFO_3 FileInfo3;
    [default]
        ;
} FILE_INFO, *PFILE_INFO, *LPFILE_INFO;

//
// Function Prototypes - NetrFile
//

NET_API_STATUS
NetrFileEnum (
    [in,string,unique] SRVSVC_HANDLE      ServerName,
    [in,string,unique] LPTSTR             BasePath,
    [in,string,unique] LPTSTR             UserName,
    [in,out]           PFILE_ENUM_STRUCT  InfoStruct,
    [in]               DWORD              PreferedMaximumLength,
    [out]              LPDWORD            TotalEntries,
    [in,out,unique]    LPDWORD            ResumeHandle
    );

NET_API_STATUS
NetrFileGetInfo (
    [in,string,unique] SRVSVC_HANDLE    ServerName,
    [in]        DWORD                   FileId,
    [in]        DWORD                   Level,
    [out, switch_is(Level)] LPFILE_INFO InfoStruct
    );

NET_API_STATUS
NetrFileClose (
    [in,string,unique] SRVSVC_HANDLE    ServerName,
    [in]        DWORD                   FileId
    );

//
// Session API
//

//
// Structures - NetrSession
//

typedef struct _SESSION_INFO_0_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPSESSION_INFO_0 Buffer;
} SESSION_INFO_0_CONTAINER, *PSESSION_INFO_0_CONTAINER, *LPSESSION_INFO_0_CONTAINER;

typedef struct _SESSION_INFO_1_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPSESSION_INFO_1 Buffer;
} SESSION_INFO_1_CONTAINER, *PSESSION_INFO_1_CONTAINER, *LPSESSION_INFO_1_CONTAINER;

typedef struct _SESSION_INFO_2_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPSESSION_INFO_2 Buffer;
} SESSION_INFO_2_CONTAINER, *PSESSION_INFO_2_CONTAINER, *LPSESSION_INFO_2_CONTAINER;

typedef struct _SESSION_INFO_10_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPSESSION_INFO_10 Buffer;
} SESSION_INFO_10_CONTAINER, *PSESSION_INFO_10_CONTAINER, *LPSESSION_INFO_10_CONTAINER;

typedef struct _SESSION_INFO_502_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPSESSION_INFO_502 Buffer;
} SESSION_INFO_502_CONTAINER, *PSESSION_INFO_502_CONTAINER, *LPSESSION_INFO_502_CONTAINER;

typedef struct _SESSION_ENUM_STRUCT {
    DWORD   Level;
    [switch_is(Level)] union _SESSION_ENUM_UNION {
        [case(0)]
            SESSION_INFO_0_CONTAINER *Level0;
        [case(1)]
            SESSION_INFO_1_CONTAINER *Level1;
        [case(2)]
            SESSION_INFO_2_CONTAINER *Level2;
        [case(10)]
            SESSION_INFO_10_CONTAINER *Level10;
        [case(502)]
            SESSION_INFO_502_CONTAINER *Level502;
        [default]
            ;
    } SessionInfo;

}SESSION_ENUM_STRUCT, *PSESSION_ENUM_STRUCT, *LPSESSION_ENUM_STRUCT;

//
// Function Prototypes - NetrSession
//

NET_API_STATUS
NetrSessionEnum (
    [in,string,unique] SRVSVC_HANDLE         ServerName,
    [in,string,unique] LPTSTR                ClientName,
    [in,string,unique] LPTSTR                UserName,
    [in,out]           PSESSION_ENUM_STRUCT  InfoStruct,
    [in]               DWORD                 PreferedMaximumLength,
    [out]              LPDWORD               TotalEntries,
    [in,out,unique]    LPDWORD               ResumeHandle
    );


NET_API_STATUS
NetrSessionDel (
    [in,string,unique] SRVSVC_HANDLE    ServerName,
    [in,string,unique] LPTSTR           ClientName,
    [in,string,unique] LPTSTR           UserName
    );

//
// Share API
//

//
// Structures - NetrShare
//

//
// Internal 502 and 1501 structures used for passing and/or returning
// self-relative security descriptors.
//

typedef struct _SHARE_INFO_502_I {
    [string] LPTSTR     shi502_netname;
    DWORD               shi502_type;
    [string] LPTSTR     shi502_remark;
    DWORD               shi502_permissions;
    DWORD               shi502_max_uses;
    DWORD               shi502_current_uses;
    [string] LPTSTR     shi502_path;
    [string] LPTSTR     shi502_passwd;
    DWORD               shi502_reserved;
    [size_is(shi502_reserved)] PUCHAR  shi502_security_descriptor;
} SHARE_INFO_502_I, *PSHARE_INFO_502_I, *LPSHARE_INFO_502_I;

typedef struct _SHARE_INFO_1501_I {
    DWORD               shi1501_reserved;
    [size_is(shi1501_reserved)] PUCHAR  shi1501_security_descriptor;
} SHARE_INFO_1501_I, *PSHARE_INFO_1501_I, *LPSHARE_INFO_1501_I;

//
// Structures for NetShareEnum
//

typedef struct _SHARE_INFO_0_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPSHARE_INFO_0 Buffer;
} SHARE_INFO_0_CONTAINER;

typedef struct _SHARE_INFO_1_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPSHARE_INFO_1 Buffer;
} SHARE_INFO_1_CONTAINER;

typedef struct _SHARE_INFO_2_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPSHARE_INFO_2 Buffer;
} SHARE_INFO_2_CONTAINER, *PSHARE_INFO_2_CONTAINER, *LPSHARE_INFO_2_CONTAINER;

typedef struct _SHARE_INFO_501_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPSHARE_INFO_501 Buffer;
} SHARE_INFO_501_CONTAINER, *PSHARE_INFO_501_CONTAINER, *LPSHARE_INFO_501_CONTAINER;

typedef struct _SHARE_INFO_502_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPSHARE_INFO_502_I Buffer;
} SHARE_INFO_502_CONTAINER, *PSHARE_INFO_502_CONTAINER, *LPSHARE_INFO_502_CONTAINER;


typedef struct _SHARE_ENUM_STRUCT {
    DWORD   Level;
    [switch_is(Level)] union _SHARE_ENUM_UNION {
        [case(0)]
            SHARE_INFO_0_CONTAINER *Level0;
        [case(1)]
            SHARE_INFO_1_CONTAINER *Level1;
        [case(2)]
            SHARE_INFO_2_CONTAINER *Level2;
        [case(502)]
            SHARE_INFO_502_CONTAINER *Level502;
        [default]
            ;
        [case(501)]
            SHARE_INFO_501_CONTAINER *Level501;
    } ShareInfo;

}SHARE_ENUM_STRUCT, *PSHARE_ENUM_STRUCT, *LPSHARE_ENUM_STRUCT;

typedef [switch_type(unsigned long)] union _SHARE_INFO {  // for Get & Set Info
    [case(0)]
        LPSHARE_INFO_0 ShareInfo0;
    [case(1)]
        LPSHARE_INFO_1 ShareInfo1;
    [case(2)]
        LPSHARE_INFO_2 ShareInfo2;
    [case(502)]
        LPSHARE_INFO_502_I ShareInfo502;
    [case(1004)]
        LPSHARE_INFO_1004 ShareInfo1004;
    [case(1006)]
        LPSHARE_INFO_1006 ShareInfo1006;
    [case(1501)]
        LPSHARE_INFO_1501_I ShareInfo1501;
    [default]
        ;
    [case(1005)]
        LPSHARE_INFO_1005 ShareInfo1005;
    [case(501)]
        LPSHARE_INFO_501 ShareInfo501;
} SHARE_INFO, *PSHARE_INFO, *LPSHARE_INFO;

//
// Function Prototypes - NetrShare
//

NET_API_STATUS
NetrShareAdd (
    [in,string,unique] SRVSVC_HANDLE        ServerName,
    [in]               DWORD                Level,
    [in, switch_is(Level)] LPSHARE_INFO     InfoStruct,
    [in,out,unique]    LPDWORD              ParmErr
    );

NET_API_STATUS
NetrShareEnum (
    [in,string,unique] SRVSVC_HANDLE        ServerName,
    [in,out]           LPSHARE_ENUM_STRUCT  InfoStruct,
    [in]               DWORD                PreferedMaximumLength,
    [out]              LPDWORD              TotalEntries,
    [in,out,unique]    LPDWORD              ResumeHandle
    );

NET_API_STATUS
NetrShareGetInfo (
    [in,string,unique] SRVSVC_HANDLE     ServerName,
    [in,string]        LPTSTR            NetName,
    [in]               DWORD             Level,
    [out, switch_is(Level)] LPSHARE_INFO InfoStruct
    );

NET_API_STATUS
NetrShareSetInfo (
    [in,string,unique]      SRVSVC_HANDLE  ServerName,
    [in,string]             LPTSTR         NetName,
    [in]                    DWORD          Level,
    [in, switch_is(Level)]  LPSHARE_INFO   ShareInfo,
    [in,out,unique]         LPDWORD        ParmErr
    );

NET_API_STATUS
NetrShareDel (
    [in,string,unique] SRVSVC_HANDLE    ServerName,
    [in,string] LPTSTR                  NetName,
    [in]  DWORD                         Reserved
    );

NET_API_STATUS
NetrShareDelSticky (
    [in,string,unique] SRVSVC_HANDLE    ServerName,
    [in,string] LPTSTR                  NetName,
    [in]  DWORD                         Reserved
    );

NET_API_STATUS
NetrShareCheck (
    [in,string,unique] SRVSVC_HANDLE    ServerName,
    [in,string] LPTSTR                  Device,
    [out] LPDWORD                       Type
    );

//
// Server API
//

//
// Structures - NetrServer
//

typedef [switch_type(unsigned long)] union _SERVER_INFO {  // For Get & Set Info
    [case(100)]
        LPSERVER_INFO_100 ServerInfo100;
    [case(101)]
        LPSERVER_INFO_101 ServerInfo101;
    [case(102)]
        LPSERVER_INFO_102 ServerInfo102;
    [case(402)]
        LPSERVER_INFO_402 ServerInfo402;
    [case(403)]
        LPSERVER_INFO_403 ServerInfo403;
    [case(502)]
        LPSERVER_INFO_502 ServerInfo502;
    [case(503)]
        LPSERVER_INFO_503 ServerInfo503;
    [case(599)]
        LPSERVER_INFO_599 ServerInfo599;
    [case(1005)]
        LPSERVER_INFO_1005 ServerInfo1005;
    [case(1107)]
        LPSERVER_INFO_1107 ServerInfo1107;
    [case(1010)]
        LPSERVER_INFO_1010 ServerInfo1010;
    [case(1016)]
        LPSERVER_INFO_1016 ServerInfo1016;
    [case(1017)]
        LPSERVER_INFO_1017 ServerInfo1017;
    [case(1018)]
        LPSERVER_INFO_1018 ServerInfo1018;
    [case(1501)]
        LPSERVER_INFO_1501 ServerInfo1501;
    [case(1502)]
        LPSERVER_INFO_1502 ServerInfo1502;
    [case(1503)]
        LPSERVER_INFO_1503 ServerInfo1503;
    [case(1506)]
        LPSERVER_INFO_1506 ServerInfo1506;
    [case(1509)]
        LPSERVER_INFO_1509 ServerInfo1509;
    [case(1510)]
        LPSERVER_INFO_1510 ServerInfo1510;
    [case(1511)]
        LPSERVER_INFO_1511 ServerInfo1511;
    [case(1512)]
        LPSERVER_INFO_1512 ServerInfo1512;
    [case(1513)]
        LPSERVER_INFO_1513 ServerInfo1513;
    [case(1514)]
        LPSERVER_INFO_1514 ServerInfo1514;
    [case(1515)]
        LPSERVER_INFO_1515 ServerInfo1515;
    [case(1516)]
        LPSERVER_INFO_1516 ServerInfo1516;
    [case(1518)]
        LPSERVER_INFO_1518 ServerInfo1518;
    [case(1520)]
        LPSERVER_INFO_1520 ServerInfo1520;
    [case(1521)]
        LPSERVER_INFO_1521 ServerInfo1521;
    [case(1522)]
        LPSERVER_INFO_1522 ServerInfo1522;
    [case(1523)]
        LPSERVER_INFO_1523 ServerInfo1523;
    [case(1524)]
        LPSERVER_INFO_1524 ServerInfo1524;
    [case(1525)]
        LPSERVER_INFO_1525 ServerInfo1525;
    [case(1528)]
        LPSERVER_INFO_1528 ServerInfo1528;
    [case(1529)]
        LPSERVER_INFO_1529 ServerInfo1529;
    [case(1530)]
        LPSERVER_INFO_1530 ServerInfo1530;
    [case(1533)]
        LPSERVER_INFO_1533 ServerInfo1533;
    [case(1534)]
        LPSERVER_INFO_1534 ServerInfo1534;
    [case(1535)]
        LPSERVER_INFO_1535 ServerInfo1535;
    [case(1536)]
        LPSERVER_INFO_1536 ServerInfo1536;
    [case(1537)]
        LPSERVER_INFO_1537 ServerInfo1537;
    [case(1538)]
        LPSERVER_INFO_1538 ServerInfo1538;
    [case(1539)]
        LPSERVER_INFO_1539 ServerInfo1539;
    [case(1540)]
        LPSERVER_INFO_1540 ServerInfo1540;
    [case(1541)]
        LPSERVER_INFO_1541 ServerInfo1541;
    [case(1542)]
        LPSERVER_INFO_1542 ServerInfo1542;
    [case(1543)]
        LPSERVER_INFO_1543 ServerInfo1543;
    [case(1544)]
        LPSERVER_INFO_1544 ServerInfo1544;
    [case(1545)]
        LPSERVER_INFO_1545 ServerInfo1545;
    [case(1546)]
        LPSERVER_INFO_1546 ServerInfo1546;
    [case(1547)]
        LPSERVER_INFO_1547 ServerInfo1547;
    [case(1548)]
        LPSERVER_INFO_1548 ServerInfo1548;
    [case(1549)]
        LPSERVER_INFO_1549 ServerInfo1549;
    [case(1550)]
        LPSERVER_INFO_1550 ServerInfo1550;
    [case(1552)]
        LPSERVER_INFO_1552 ServerInfo1552;
    [case(1553)]
        LPSERVER_INFO_1553 ServerInfo1553;
    [case(1554)]
        LPSERVER_INFO_1554 ServerInfo1554;
    [case(1555)]
        LPSERVER_INFO_1555 ServerInfo1555;
    [case(1556)]
        LPSERVER_INFO_1556 ServerInfo1556;
    [default]
        ;
} SERVER_INFO, *PSERVER_INFO, *LPSERVER_INFO;

//
// DiskEnum
//
// NOTE:  The buffer pointer is supposed to point to an array of strings.
//          each string is fixed size with two characters followed by a NUL.
//          A:\0B:\0c:\0\0

typedef struct _DISK_INFO {
    [string] TCHAR Disk[3];
} DISK_INFO, *PDISK_INFO, *LPDISK_INFO;

typedef struct _DISK_ENUM_CONTAINER {
    DWORD EntriesRead;
    [size_is(EntriesRead), length_is(EntriesRead)] LPDISK_INFO   Buffer;
} DISK_ENUM_CONTAINER;

//
// Function Prototypes - NetrServer
//

NET_API_STATUS
NetrServerGetInfo (
    [in,string,unique] SRVSVC_HANDLE        ServerName,
    [in]        DWORD                       Level,
    [out, switch_is(Level)] LPSERVER_INFO   InfoStruct
    );

NET_API_STATUS
NetrServerSetInfo   (
    [in,string,unique]     SRVSVC_HANDLE  ServerName,
    [in]                   DWORD          Level,
    [in, switch_is(Level)] LPSERVER_INFO  ServerInfo,
    [in,out,unique]        LPDWORD        ParmErr
    );

NET_API_STATUS
NetrServerDiskEnum (
    [in,string,unique] SRVSVC_HANDLE        ServerName,
    [in]               DWORD                Level,
    [in,out]           DISK_ENUM_CONTAINER  *DiskInfoStruct,
    [in]               DWORD                PreferredMaximumLength,
    [out]              LPDWORD              TotalEntries,
    [in,out,unique]    LPDWORD              ResumeHandle
    );

//
// Function Prototype - NetrServerStatisticsGet
//

NET_API_STATUS
NetrServerStatisticsGet (
    [in,string,unique]            SRVSVC_HANDLE          ServerName,
    [in,string,unique]            LPTSTR                 Service,
    [in]                          DWORD                  Level,
    [in]                          DWORD                  Options,
    [out]                         LPSTAT_SERVER_0        *InfoStruct
    );

//
// Server Transport API
//

//
// Structures - NetrServerTransport
//

typedef struct _SERVER_XPORT_INFO_0_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPSERVER_TRANSPORT_INFO_0 Buffer;
} SERVER_XPORT_INFO_0_CONTAINER, *PSERVER_XPORT_INFO_0_CONTAINER;

typedef struct _SERVER_XPORT_INFO_1_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPSERVER_TRANSPORT_INFO_1 Buffer;
} SERVER_XPORT_INFO_1_CONTAINER, *PSERVER_XPORT_INFO_1_CONTAINER;

typedef struct _SERVER_XPORT_INFO_2_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPSERVER_TRANSPORT_INFO_2 Buffer;
} SERVER_XPORT_INFO_2_CONTAINER, *PSERVER_XPORT_INFO_2_CONTAINER;

typedef struct _SERVER_XPORT_INFO_3_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPSERVER_TRANSPORT_INFO_3 Buffer;
} SERVER_XPORT_INFO_3_CONTAINER, *PSERVER_XPORT_INFO_3_CONTAINER;

typedef [switch_type(unsigned long)] union _TRANSPORT_INFO { // for Add and Del
    [case(0)]
        SERVER_TRANSPORT_INFO_0 Transport0;
    [case(1)]
        SERVER_TRANSPORT_INFO_1 Transport1;
    [case(2)]
        SERVER_TRANSPORT_INFO_2 Transport2;
    [case(3)]
        SERVER_TRANSPORT_INFO_3 Transport3;
    [default]
        ;
} TRANSPORT_INFO, *PTRANSPORT_INFO, *LPTRANSPORT_INFO;

typedef struct _SERVER_XPORT_ENUM_STRUCT {
    DWORD   Level;
    [switch_is(Level)] union _SERVER_XPORT_ENUM_UNION {
        [case(0)]
            PSERVER_XPORT_INFO_0_CONTAINER Level0;
        [case(1)]
            PSERVER_XPORT_INFO_1_CONTAINER Level1;
        [case(2)]
            PSERVER_XPORT_INFO_2_CONTAINER Level2;
        [case(3)]
            PSERVER_XPORT_INFO_3_CONTAINER Level3;
        [default]
            ;
    } XportInfo;

} SERVER_XPORT_ENUM_STRUCT, *PSERVER_XPORT_ENUM_STRUCT, *LPSERVER_XPORT_ENUM_STRUCT;

//
// Function Prototypes - NetrServerTransport
//
NET_API_STATUS
NetrServerTransportAdd (
    [in,string,unique]      SRVSVC_HANDLE              ServerName,
    [in]                    DWORD                      Level,
    [in]                    LPSERVER_TRANSPORT_INFO_0  Buffer
    );


NET_API_STATUS
NetrServerTransportEnum (
    [in,string,unique]      SRVSVC_HANDLE              ServerName,
    [in,out]                LPSERVER_XPORT_ENUM_STRUCT InfoStruct,
    [in]                    DWORD                      PreferedMaximumLength,
    [out]                   LPDWORD                    TotalEntries,
    [in,out,unique]         LPDWORD                    ResumeHandle
    );

NET_API_STATUS
NetrServerTransportDel (
    [in,string,unique]      SRVSVC_HANDLE              ServerName,
    [in]                    DWORD                      Level,
    [in]                   LPSERVER_TRANSPORT_INFO_0  Buffer
    );


//
// Function Prototype - NetrRemoteTOD
//

NET_API_STATUS
NetrRemoteTOD (
    [in,string,unique]  SRVSVC_HANDLE       ServerName,
    [out]               LPTIME_OF_DAY_INFO  *BufferPtr
    );

//
// Function Prototype - I_NetrServerSetServiceBits (internal API)
//

NET_API_STATUS
I_NetrServerSetServiceBits (
    [in,string,unique]  SRVSVC_HANDLE              ServerName,
    [in,string,unique]  LPTSTR                     TransportName,
    [in]                DWORD                      ServiceBits,
    [in]                DWORD                      UpdateImmediately
    );

//
// Function Prototypes - Canonicalization functions
//

NET_API_STATUS
NetprPathType(
    [in,string,unique]  SRVSVC_HANDLE   ServerName,
    [in,string]         LPTSTR          PathName,
    [out]               LPDWORD         PathType,
    [in]                DWORD           Flags
    );

NET_API_STATUS
NetprPathCanonicalize(
    [in,string,unique]          SRVSVC_HANDLE   ServerName,
    [in,string]                 LPTSTR          PathName,
    [out,size_is(OutbufLen)]    LPBYTE          Outbuf,
    [in]                        DWORD           OutbufLen,
    [in,string]                 LPTSTR          Prefix,
    [in,out]                    LPDWORD         PathType,
    [in]                        DWORD           Flags
    );

LONG
NetprPathCompare(
    [in,string,unique]  SRVSVC_HANDLE   ServerName,
    [in,string]         LPTSTR          PathName1,
    [in,string]         LPTSTR          PathName2,
    [in]                DWORD           PathType,
    [in]                DWORD           Flags
    );

NET_API_STATUS
NetprNameValidate(
    [in,string,unique]  SRVSVC_HANDLE   ServerName,
    [in,string]         LPTSTR          Name,
    [in]                DWORD           NameType,
    [in]                DWORD           Flags
    );

NET_API_STATUS
NetprNameCanonicalize(
    [in,string,unique]          SRVSVC_HANDLE   ServerName,
    [in,string]                 LPTSTR          Name,
    [out,size_is(OutbufLen)]    LPTSTR          Outbuf,
    [in]                        DWORD           OutbufLen,
    [in]                        DWORD           NameType,
    [in]                        DWORD           Flags
    );

LONG
NetprNameCompare(
    [in,string,unique]  SRVSVC_HANDLE   ServerName,
    [in,string]         LPTSTR          Name1,
    [in,string]         LPTSTR          Name2,
    [in]                DWORD           NameType,
    [in]                DWORD           Flags
    );

NET_API_STATUS
NetrShareEnumSticky (
    [in,string,unique] SRVSVC_HANDLE        ServerName,
    [in,out]           LPSHARE_ENUM_STRUCT  InfoStruct,
    [in]               DWORD                PreferedMaximumLength,
    [out]              LPDWORD              TotalEntries,
    [in,out,unique]    LPDWORD              ResumeHandle
    );

//
// Two-phase share deletion used to delete IPC$
//

typedef [context_handle] void *SHARE_DEL_HANDLE;
typedef SHARE_DEL_HANDLE *PSHARE_DEL_HANDLE;

NET_API_STATUS
NetrShareDelStart (
    [in,string,unique] SRVSVC_HANDLE    ServerName,
    [in,string] LPTSTR                  NetName,
    [in]  DWORD                         Reserved,
    [out] PSHARE_DEL_HANDLE             ContextHandle
    );

NET_API_STATUS
NetrShareDelCommit (
    [in, out] PSHARE_DEL_HANDLE         ContextHandle
    );

//
// AdminTools types and functions
//
typedef struct _ADT_SECURITY_DESCRIPTOR {
    DWORD                       Length;
    [size_is(Length)] LPBYTE    Buffer;
} ADT_SECURITY_DESCRIPTOR, *PADT_SECURITY_DESCRIPTOR;

DWORD
NetrpGetFileSecurity (
    [in,string,unique]      SRVSVC_HANDLE   ServerName,
    [in,string,unique]      LPWSTR          ShareName,
    [in,string]             LPWSTR          lpFileName,
    [in]        SECURITY_INFORMATION        RequestedInformation,
    [out]       PADT_SECURITY_DESCRIPTOR    *SecurityDescriptor
    );

DWORD
NetrpSetFileSecurity (
    [in,string,unique]  SRVSVC_HANDLE       ServerName,
    [in,string,unique]  LPWSTR              ShareName,
    [in,string]         LPWSTR              lpFileName,
    [in]    SECURITY_INFORMATION            SecurityInformation,
    [in]    PADT_SECURITY_DESCRIPTOR        SecurityDescriptor
    );

NET_API_STATUS
NetrServerTransportAddEx (
    [in,string,unique]      SRVSVC_HANDLE              ServerName,
    [in]                    DWORD                      Level,
    [in, switch_is(Level)]  LPTRANSPORT_INFO           Buffer
    );

NET_API_STATUS
I_NetrServerSetServiceBitsEx (
    [in,string,unique]  SRVSVC_HANDLE ServerName,
    [in,string,unique]  LPWSTR  EmulatedServerName,
    [in,string,unique]  LPTSTR  TransportName,
    [in]                DWORD   ServiceBitsOfInterest,
    [in]                DWORD   ServiceBits,
    [in]                DWORD   UpdateImmediately
    );


//
// Definitions for DFS operations
//

NET_API_STATUS NET_API_FUNCTION
NetrDfsGetVersion(
    [in,string,unique]  SRVSVC_HANDLE           ServerName,
    [out]               LPDWORD                 Version
    );

NET_API_STATUS NET_API_FUNCTION
NetrDfsCreateLocalPartition (
    [in,string,unique]  SRVSVC_HANDLE                   ServerName,
    [in,string]         LPWSTR                          ShareName,
    [in]                LPGUID                          EntryUid,       // unique id for this partition
    [in,string]         LPWSTR                          EntryPrefix,    // path prefix for this partition
    [in,string]         LPWSTR                          ShortName,      // 8.3 format of EntryPrefix
    [in]                LPNET_DFS_ENTRY_ID_CONTAINER    RelationInfo,
    [in]                BOOL                            Force
    );

NET_API_STATUS NET_API_FUNCTION
NetrDfsDeleteLocalPartition (
    [in,string,unique]  SRVSVC_HANDLE               ServerName,
    [in]                LPGUID                      Uid,
    [in,string]         LPWSTR                      Prefix
    );

NET_API_STATUS NET_API_FUNCTION
NetrDfsSetLocalVolumeState (
    [in,string,unique]  SRVSVC_HANDLE               ServerName,
    [in]                LPGUID                      Uid,
    [in,string]         LPWSTR                      Prefix,
    [in]                    ULONG                       State
    );

NET_API_STATUS NET_API_FUNCTION
NetrDfsSetServerInfo (
    [in,string,unique]  SRVSVC_HANDLE               ServerName,
    [in]                LPGUID                      Uid,
    [in,string]         LPWSTR                      Prefix
    );

NET_API_STATUS NET_API_FUNCTION
NetrDfsCreateExitPoint (
    [in,string,unique]  SRVSVC_HANDLE               ServerName,
    [in]                LPGUID                      Uid,
    [in,string]         LPWSTR                      Prefix,
    [in]                ULONG                       Type,
    [in]                DWORD                       ShortPrefixLen,
    [out,size_is(ShortPrefixLen)] LPWSTR            ShortPrefix
    );

NET_API_STATUS NET_API_FUNCTION
NetrDfsDeleteExitPoint (
    [in,string,unique]  SRVSVC_HANDLE               ServerName,
    [in]                LPGUID                      Uid,
    [in,string]         LPWSTR                      Prefix,
    [in]                ULONG                       Type
    );

NET_API_STATUS NET_API_FUNCTION
NetrDfsModifyPrefix (
    [in,string,unique]  SRVSVC_HANDLE               ServerName,
    [in]                LPGUID                      Uid,
    [in,string]         LPWSTR                      Prefix
    );

NET_API_STATUS NET_API_FUNCTION
NetrDfsFixLocalVolume (
    [in,string,unique]  SRVSVC_HANDLE                   ServerName,
    [in,string]         LPWSTR                          VolumeName,
    [in]                ULONG                           EntryType,
    [in]                ULONG                           ServiceType,
    [in,string]         LPWSTR                          StgId,
    [in]                LPGUID                          EntryUid,       // unique id for this partition
    [in,string]         LPWSTR                          EntryPrefix,    // path prefix for this partition
    [in]                LPNET_DFS_ENTRY_ID_CONTAINER    RelationInfo,
    [in]                ULONG                           CreateDisposition
    );

NET_API_STATUS NET_API_FUNCTION
NetrDfsManagerReportSiteInfo (
    [in,string,unique]  SRVSVC_HANDLE                   ServerName,
    [in,out,unique]     LPDFS_SITELIST_INFO             *ppSiteInfo
    );

NET_API_STATUS
NetrServerTransportDelEx (
    [in,string,unique]      SRVSVC_HANDLE              ServerName,
    [in]                    DWORD                      Level,
    [in, switch_is(Level)]  LPTRANSPORT_INFO           Buffer
    );


}
