/*++

Copyright (c) 1990  Microsoft Corporation

Module Name:

    wkssvc.idl

Abstract:

    Contains the Netr (Net Remote) RPC interface specification for the APIs
    associated with the Workstation service.  This includes APIs from the
    following catagories:
        NetWksta
        NetUse
    Also contains the RPC specific data structures for these API.

Author:

    Rita Wong  (ritaw)  06-May-1991

Environment:

    User Mode - Win32 - MIDL

Revision History:

    21-Jan-1992 rfirth
        * Removed NET_API_FUNCTION from all interfaces
--*/

//
// Interface Attributes
//

[
    uuid(6BFFD098-A112-3610-9833-46C3F87E345A),
    version(1.0),
#ifdef __midl
        ms_union,
#endif // __midl
    pointer_default(unique)
]


//
// Interface Keyword
//

interface wkssvc


//
// Interface Body
//

{

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

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

#ifdef UNICODE
#define LPTSTR wchar_t*
#endif

//
// ---------------------------------------------------------------//
//


typedef [handle] LPTSTR WKSSVC_IMPERSONATE_HANDLE;

typedef [handle] LPTSTR WKSSVC_IDENTIFY_HANDLE;


//
// Workstation APIs
//


//
// NetrWkstaGetInfo and NetrWkstaSetInfo
//
typedef [switch_type(unsigned long)] union _WKSTA_INFO {
    [case(100)]
        LPWKSTA_INFO_100 WkstaInfo100;
    [case(101)]
        LPWKSTA_INFO_101 WkstaInfo101;
    [case(102)]
        LPWKSTA_INFO_102 WkstaInfo102;
    [case(1010)]
        LPWKSTA_INFO_1010 WkstaInfo1010;
    [case(1011)]
        LPWKSTA_INFO_1011 WkstaInfo1011;
    [case(1012)]
        LPWKSTA_INFO_1012 WkstaInfo1012;
    [case(1013)]
        LPWKSTA_INFO_1013 WkstaInfo1013;
    [case(1018)]
        LPWKSTA_INFO_1018 WkstaInfo1018;
    [case(1023)]
        LPWKSTA_INFO_1023 WkstaInfo1023;
    [case(1033)]
        LPWKSTA_INFO_1033 WkstaInfo1033;
    [case(1041)]
        LPWKSTA_INFO_1041 WkstaInfo1041;
    [case(1042)]
        LPWKSTA_INFO_1042 WkstaInfo1042;
    [case(1043)]
        LPWKSTA_INFO_1043 WkstaInfo1043;
    [case(1044)]
        LPWKSTA_INFO_1044 WkstaInfo1044;
    [case(1045)]
        LPWKSTA_INFO_1045 WkstaInfo1045;
    [case(1046)]
        LPWKSTA_INFO_1046 WkstaInfo1046;
    [case(1047)]
        LPWKSTA_INFO_1047 WkstaInfo1047;
    [case(1048)]
        LPWKSTA_INFO_1048 WkstaInfo1048;
    [case(1049)]
        LPWKSTA_INFO_1049 WkstaInfo1049;
    [case(1050)]
        LPWKSTA_INFO_1050 WkstaInfo1050;
    [case(1051)]
        LPWKSTA_INFO_1051 WkstaInfo1051;
    [case(1052)]
        LPWKSTA_INFO_1052 WkstaInfo1052;
    [case(1053)]
        LPWKSTA_INFO_1053 WkstaInfo1053;
    [case(1054)]
        LPWKSTA_INFO_1054 WkstaInfo1054;
    [case(1055)]
        LPWKSTA_INFO_1055 WkstaInfo1055;
    [case(1056)]
        LPWKSTA_INFO_1056 WkstaInfo1056;
    [case(1057)]
        LPWKSTA_INFO_1057 WkstaInfo1057;
    [case(1058)]
        LPWKSTA_INFO_1058 WkstaInfo1058;
    [case(1059)]
        LPWKSTA_INFO_1059 WkstaInfo1059;
    [case(1060)]
        LPWKSTA_INFO_1060 WkstaInfo1060;
    [case(1061)]
        LPWKSTA_INFO_1061 WkstaInfo1061;
    [case(1062)]
        LPWKSTA_INFO_1062 WkstaInfo1062;
    [case(502)]
        LPWKSTA_INFO_502 WkstaInfo502;
    [default]
        ;
} WKSTA_INFO, *PWKSTA_INFO, *LPWKSTA_INFO;

NET_API_STATUS
NetrWkstaGetInfo (
    [in,string,unique]      WKSSVC_IDENTIFY_HANDLE ServerName,
    [in]                    DWORD                  Level,
    [out, switch_is(Level)] LPWKSTA_INFO           WkstaInfo
    );

NET_API_STATUS
NetrWkstaSetInfo (
    [in,string,unique]     WKSSVC_IDENTIFY_HANDLE ServerName,
    [in]                   DWORD                  Level,
    [in, switch_is(Level)] LPWKSTA_INFO           WkstaInfo,
    [in,out,unique]        LPDWORD                ErrorParameter
    );



//
// NetrWkstaUserEnum
//
typedef struct _WKSTA_USER_INFO_0_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPWKSTA_USER_INFO_0 Buffer;
} WKSTA_USER_INFO_0_CONTAINER, *PWKSTA_USER_INFO_0_CONTAINER,
  *LPWKSTA_USER_INFO_0_CONTAINER;


typedef struct _WKSTA_USER_INFO_1_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPWKSTA_USER_INFO_1 Buffer;
} WKSTA_USER_INFO_1_CONTAINER, *PWKSTA_USER_INFO_1_CONTAINER,
  *LPWKSTA_USER_INFO_1_CONTAINER;

typedef struct _WKSTA_USER_ENUM_STRUCT {
    DWORD   Level;
    [switch_is(Level)] union _WKSTA_USER_ENUM_UNION {
        [case(0)]
            LPWKSTA_USER_INFO_0_CONTAINER Level0;
        [case(1)]
            LPWKSTA_USER_INFO_1_CONTAINER Level1;
        [default]
            ;
    } WkstaUserInfo;
} WKSTA_USER_ENUM_STRUCT, *PWKSTA_USER_ENUM_STRUCT, *LPWKSTA_USER_ENUM_STRUCT;

NET_API_STATUS
NetrWkstaUserEnum (
    [in,string,unique] WKSSVC_IDENTIFY_HANDLE   ServerName,
    [in,out]           LPWKSTA_USER_ENUM_STRUCT UserInfo,
    [in]               DWORD                    PreferredMaximumLength,
    [out]              LPDWORD                  TotalEntries,
    [in,out,unique]    LPDWORD                  ResumeHandle
    );



//
// NetrWkstaUserGetInfo and NetrWkstaUserSetInfo
//
typedef [switch_type(unsigned long)] union _WKSTA_USER_INFO {
    [case(0)]
        LPWKSTA_USER_INFO_0 UserInfo0;
    [case(1)]
        LPWKSTA_USER_INFO_1 UserInfo1;
    [case(1101)]
        LPWKSTA_USER_INFO_1101 UserInfo1101;
    [default]
        ;
} WKSTA_USER_INFO, *PWKSTA_USER_INFO, *LPWKSTA_USER_INFO;

NET_API_STATUS
NetrWkstaUserGetInfo (
    [in,string,unique]      WKSSVC_IDENTIFY_HANDLE Reserved,
    [in]                    DWORD                  Level,
    [out, switch_is(Level)] LPWKSTA_USER_INFO      UserInfo
    );

NET_API_STATUS
NetrWkstaUserSetInfo (
    [in,string,unique]     WKSSVC_IDENTIFY_HANDLE Reserved,
    [in]                   DWORD                  Level,
    [in, switch_is(Level)] LPWKSTA_USER_INFO      UserInfo,
    [in,out,unique]        LPDWORD                ErrorParameter
    );

//
// NetrWkstaTransportEnum
//
typedef struct _WKSTA_TRANSPORT_INFO_0_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPWKSTA_TRANSPORT_INFO_0 Buffer;
} WKSTA_TRANSPORT_INFO_0_CONTAINER, *PWKSTA_TRANSPORT_INFO_0_CONTAINER,
  *LPWKSTA_TRANSPORT_INFO_0_CONTAINER;

typedef struct _WKSTA_TRANSPORT_ENUM_STRUCT {
    DWORD   Level;
    [switch_is(Level)] union _WKSTA_TRANSPORT_ENUM_UNION {
        [case(0)]
            LPWKSTA_TRANSPORT_INFO_0_CONTAINER Level0;
        [default]
            ;
    } WkstaTransportInfo;
} WKSTA_TRANSPORT_ENUM_STRUCT, *PWKSTA_TRANSPORT_ENUM_STRUCT,
  *LPWKSTA_TRANSPORT_ENUM_STRUCT;

NET_API_STATUS
NetrWkstaTransportEnum (
    [in,string,unique] WKSSVC_IDENTIFY_HANDLE        ServerName,
    [in,out]           LPWKSTA_TRANSPORT_ENUM_STRUCT TransportInfo,
    [in]               DWORD                         PreferredMaximumLength,
    [out]              LPDWORD                       TotalEntries,
    [in,out,unique]    LPDWORD                       ResumeHandle
    );

//
// NetrWkstaTransportAdd
//
NET_API_STATUS
NetrWkstaTransportAdd (
    [in,string,unique] WKSSVC_IDENTIFY_HANDLE   ServerName,
    [in]               DWORD                    Level,
    [in]               LPWKSTA_TRANSPORT_INFO_0 TransportInfo,
    [in,out,unique]    LPDWORD                  ErrorParameter
    );

//
// NetrWkstaTransportDel
//
NET_API_STATUS
NetrWkstaTransportDel (
    [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName,
    [in,string,unique] LPTSTR                 TransportName,
    [in]               DWORD                  ForceLevel
    );



//
// NetrUseAdd and NetrUseGetInfo
//
typedef [switch_type(unsigned long)] union _USE_INFO {
    [case(0)]
        LPUSE_INFO_0 UseInfo0;
    [case(1)]
        LPUSE_INFO_1 UseInfo1;
    [case(2)]
        LPUSE_INFO_2 UseInfo2;
    [case(3)]
        LPUSE_INFO_3 UseInfo3;
    [default]
        ;
} USE_INFO, *PUSE_INFO, *LPUSE_INFO;

NET_API_STATUS
NetrUseAdd (
    [in,string,unique]     WKSSVC_IMPERSONATE_HANDLE ServerName,
    [in]                   DWORD                     Level,
    [in, switch_is(Level)] LPUSE_INFO                InfoStruct,
    [in,out,unique]        LPDWORD                   ErrorParameter
    );

NET_API_STATUS
NetrUseGetInfo (
    [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName,
    [in,string]        LPTSTR                    UseName,
    [in]               DWORD                     Level,
    [out, switch_is(Level)] LPUSE_INFO           InfoStruct
    );



//
// NetrUseDel
//
NET_API_STATUS
NetrUseDel (
    [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName,
    [in,string]        LPTSTR                    UseName,
    [in]               DWORD                     ForceLevel
    );


//
// NetrUseEnum
//
typedef struct _USE_INFO_0_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPUSE_INFO_0 Buffer;
} USE_INFO_0_CONTAINER, *PUSE_INFO_0_CONTAINER, *LPUSE_INFO_0_CONTAINER;

typedef struct _USE_INFO_1_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPUSE_INFO_1 Buffer;
} USE_INFO_1_CONTAINER, *PUSE_INFO_1_CONTAINER, *LPUSE_INFO_1_CONTAINER;

typedef struct _USE_INFO_2_CONTAINER {
    DWORD   EntriesRead;
    [size_is(EntriesRead)] LPUSE_INFO_2 Buffer;
} USE_INFO_2_CONTAINER, *PUSE_INFO_2_CONTAINER, *LPUSE_INFO_2_CONTAINER;

typedef struct _USE_ENUM_STRUCT {
    DWORD   Level;
    [switch_is(Level)] union _USE_ENUM_UNION {
        [case(0)]
            LPUSE_INFO_0_CONTAINER Level0;
        [case(1)]
            LPUSE_INFO_1_CONTAINER Level1;
        [case(2)]
            LPUSE_INFO_2_CONTAINER Level2;
        [default]
            ;
    } UseInfo;

}USE_ENUM_STRUCT, *PUSE_ENUM_STRUCT, *LPUSE_ENUM_STRUCT;

NET_API_STATUS
NetrUseEnum (
    [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName,
    [in,out]           LPUSE_ENUM_STRUCT      InfoStruct,
    [in]               DWORD                  PreferedMaximumLength,
    [out]              LPDWORD                TotalEntries,
    [in,out,unique]    LPDWORD                ResumeHandle
    );

//
// NetrMessageBufferSend
//
NET_API_STATUS
NetrMessageBufferSend (
    [in,string,unique]        WKSSVC_IMPERSONATE_HANDLE ServerName,
    [in,string]               LPTSTR                    MessageName,
    [in,string,unique]        LPTSTR                    FromName,
    [in,size_is(MessageSize)] LPBYTE                    Message,
    [in]                      DWORD                     MessageSize
    );

NET_API_STATUS
NetrWorkstationStatisticsGet(
    [in,string,unique]  WKSSVC_IDENTIFY_HANDLE  ServerName,
    [in,string,unique]  LPTSTR                  ServiceName,
    [in]                DWORD                   Level,
    [in]                DWORD                   Options,
    [out]               LPSTAT_WORKSTATION_0*   Buffer
    );

//
// I_NetrLogonDomainNameAdd
//
NET_API_STATUS
I_NetrLogonDomainNameAdd(
    [in,string] WKSSVC_IDENTIFY_HANDLE LogonDomain
    );

//
// I_NetrLogonDomainNameDel
//
NET_API_STATUS
I_NetrLogonDomainNameDel(
    [in,string] WKSSVC_IDENTIFY_HANDLE LogonDomain
    );

//
// Net join apis
//
NET_API_STATUS
NetrJoinDomain(
    [in,string,unique]  WKSSVC_IMPERSONATE_HANDLE ServerName,
    [in,string]         LPTSTR                    DomainName,
    [in,string,unique]  LPTSTR                    MachineAccountOU,
    [in,string,unique]  LPTSTR                    AccountName,
    [in,string,unique]  LPTSTR                    Password,
    [in]                DWORD                     Options
    );

NET_API_STATUS
NetrUnjoinDomain(
    [in,string,unique]  WKSSVC_IMPERSONATE_HANDLE ServerName,
    [in,string,unique]  LPTSTR                    AccountName,
    [in,string,unique]  LPTSTR                    Password,
    [in]                DWORD                     Options
    );

NET_API_STATUS
NetrRenameMachineInDomain(
    [in,string,unique]  WKSSVC_IMPERSONATE_HANDLE ServerName,
    [in,string,unique]  LPTSTR                    MachineName,
    [in,string,unique]  LPTSTR                    AccountName,
    [in,string,unique]  LPTSTR                    Password,
    [in]                DWORD                     Options
    );


//
// Determine the validity of a name
//
NET_API_STATUS
NetrValidateName(
    [in,string,unique]  WKSSVC_IMPERSONATE_HANDLE ServerName,
    [in,string]         LPTSTR                    NameToValidate,
    [in,string,unique]  LPTSTR                    AccountName,
    [in,string,unique]  LPTSTR                    Password,
    [in]                NETSETUP_NAME_TYPE        NameType
    );

//
// Determines whether a workstation is joined to a domain or not
//
NET_API_STATUS
NetrGetJoinInformation(
    [in,string,unique]  WKSSVC_IMPERSONATE_HANDLE ServerName,
    [in,out,string]     LPTSTR                   *NameBuffer,
    [out]               PNETSETUP_JOIN_STATUS     BufferType
    );

typedef struct _NETSETUPR_MACHINE_ACCOUNT_OUS {
    [size_is( OUCount ), string ] LPWSTR    *OUs;
    DWORD OUCount;
} NETSETUPR_MACHINE_ACCOUNT_OUS, *PNETSETUPR_MACHINE_ACCOUNT_OUS,
  *LPNETSETUPR_MACHINE_ACCOUNT_OUS;

typedef  [string] LPWSTR  OUSTRING;

NET_API_STATUS
NetrGetJoinableOUs(
    [in,string,unique]  WKSSVC_IMPERSONATE_HANDLE   ServerName,
    [in,string]         LPWSTR                      Domain,
    [in,string,unique]  LPWSTR                      Account,
    [in,string,unique]  LPWSTR                      Password,
    [in,out]            DWORD                      *OUCount,
    [out,size_is(,*OUCount)] OUSTRING             **OUs
    );

//
// Join APIs with encrypted passwords
//

//
// Structure to pass an encrypted password over the wire.  The Length is the
// length of the password, which should be placed at the end of the buffer.
//
#define JOIN_OBFUSCATOR_LENGTH 8
#define JOIN_MAX_PASSWORD_LENGTH PWLEN

typedef struct _JOINPR_USER_PASSWORD {
    UCHAR Obfuscator[JOIN_OBFUSCATOR_LENGTH];
    WCHAR Buffer[JOIN_MAX_PASSWORD_LENGTH];
    ULONG Length;
} JOINPR_USER_PASSWORD, *PJOINPR_USER_PASSWORD;

//
// Buffer - contains random fill with the password filling up the end
//          of the buffer (the last Length bytes).
// Length - Length, in bytes, of the buffer.
//

//
// This is the encrypted version of the above structure, and is passed
// on the wire.
//

typedef struct _JOINPR_ENCRYPTED_USER_PASSWORD {
    UCHAR Buffer[ JOIN_OBFUSCATOR_LENGTH + (JOIN_MAX_PASSWORD_LENGTH * sizeof(WCHAR)) + sizeof(ULONG) ];
} JOINPR_ENCRYPTED_USER_PASSWORD, *PJOINPR_ENCRYPTED_USER_PASSWORD;

NET_API_STATUS
NetrJoinDomain2(
    [in]                handle_t                  RpcBindingHandle,
    [in,string,unique]  LPTSTR                    ServerName,
    [in,string]         LPTSTR                    DomainName,
    [in,string,unique]  LPTSTR                    MachineAccountOU,
    [in,string,unique]  LPTSTR                    AccountName,
    [in,unique]         PJOINPR_ENCRYPTED_USER_PASSWORD Password,
    [in]                DWORD                     Options
    );

NET_API_STATUS
NetrUnjoinDomain2(
    [in]                handle_t                  RpcBindingHandle,
    [in,string,unique]  LPTSTR                    ServerName,
    [in,string,unique]  LPTSTR                    AccountName,
    [in,unique]         PJOINPR_ENCRYPTED_USER_PASSWORD Password,
    [in]                DWORD                     Options
    );

NET_API_STATUS
NetrRenameMachineInDomain2(
    [in]                handle_t                  RpcBindingHandle,
    [in,string,unique]  LPTSTR                    ServerName,
    [in,string,unique]  LPTSTR                    MachineName,
    [in,string,unique]  LPTSTR                    AccountName,
    [in,unique]         PJOINPR_ENCRYPTED_USER_PASSWORD Password,
    [in]                DWORD                     Options
    );

NET_API_STATUS
NetrValidateName2(
    [in]                handle_t                  RpcBindingHandle,
    [in,string,unique]  LPTSTR                    ServerName,
    [in,string]         LPTSTR                    NameToValidate,
    [in,string,unique]  LPTSTR                    AccountName,
    [in,unique]         PJOINPR_ENCRYPTED_USER_PASSWORD Password,
    [in]                NETSETUP_NAME_TYPE        NameType
    );

NET_API_STATUS
NetrGetJoinableOUs2(
    [in]                handle_t                  RpcBindingHandle,
    [in,string,unique]  LPTSTR                    ServerName,
    [in,string]         LPWSTR                    Domain,
    [in,string,unique]  LPWSTR                    Account,
    [in,unique]         PJOINPR_ENCRYPTED_USER_PASSWORD Password,
    [in,out]            DWORD                     *OUCount,
    [out,size_is(,*OUCount)] OUSTRING             **OUs
    );

//
// Computer rename preparation API
//

NET_API_STATUS
NetrAddAlternateComputerName(
    [in]                handle_t                  RpcBindingHandle,
    [in,string,unique]  LPTSTR                    ServerName,
    [in,string,unique]  LPTSTR                    AlternateName,
    [in,string,unique]  LPTSTR                    DomainAccount,
    [in,unique]         PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword,
    [in]                DWORD                     Options
    );

NET_API_STATUS
NetrRemoveAlternateComputerName(
    [in]                handle_t                  RpcBindingHandle,
    [in,string,unique]  LPTSTR                    ServerName,
    [in,string,unique]  LPTSTR                    AlternateName,
    [in,string,unique]  LPTSTR                    DomainAccount,
    [in,unique]         PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword,
    [in]                DWORD                     Options
    );

NET_API_STATUS
NetrSetPrimaryComputerName(
    [in]                handle_t                  RpcBindingHandle,
    [in,string,unique]  LPTSTR                    ServerName,
    [in,string,unique]  LPTSTR                    PrimaryName,
    [in,string,unique]  LPTSTR                    DomainAccount,
    [in,unique]         PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword,
    [in]                DWORD                     Options
    );

typedef struct _NET_COMPUTER_NAME_ARRAY {
    ULONG EntryCount;
    [size_is(EntryCount)] PUNICODE_STRING ComputerNames;
} NET_COMPUTER_NAME_ARRAY, *PNET_COMPUTER_NAME_ARRAY;

NET_API_STATUS
NetrEnumerateComputerNames(
    [in,string,unique]  WKSSVC_IMPERSONATE_HANDLE ServerName,
    [in]                NET_COMPUTER_NAME_TYPE    NameType,
    [in]                DWORD                     Options,
    [out]               PNET_COMPUTER_NAME_ARRAY  *ComputerNames
    );
}