6 Appendix A: Full IDL

For ease of implementation, the full IDL is provided below, where "ms-dtyp.idl" is the IDL found in [MS-DTYP] Appendix A.

 import "ms-dtyp.idl";
  
 [
     uuid(6BFFD098-A112-3610-9833-46C3F87E345A),version(1.0),
     pointer_default(unique)
 ]
 interface wkssvc
 {
     typedef enum _NETSETUP_JOIN_STATUS {
         NetSetupUnknownStatus = 0,
         NetSetupUnjoined,
         NetSetupWorkgroupName,
         NetSetupDomainName
     } NETSETUP_JOIN_STATUS, *PNETSETUP_JOIN_STATUS;
  
     typedef enum  _NETSETUP_NAME_TYPE {
         NetSetupUnknown = 0,
         NetSetupMachine,
         NetSetupWorkgroup,
         NetSetupDomain,
         NetSetupNonExistentDomain,
         NetSetupDnsMachine
     } NETSETUP_NAME_TYPE, *PNETSETUP_NAME_TYPE;
  
     typedef enum _NET_COMPUTER_NAME_TYPE {
         NetPrimaryComputerName = 0,
         NetAlternateComputerNames,
         NetAllComputerNames,
         NetComputerNameTypeMax
     } NET_COMPUTER_NAME_TYPE, *PNET_COMPUTER_NAME_TYPE;
  
     typedef struct _STAT_WORKSTATION_0 {
         LARGE_INTEGER   StatisticsStartTime;
         LARGE_INTEGER   BytesReceived;
         LARGE_INTEGER   SmbsReceived;
         LARGE_INTEGER   PagingReadBytesRequested;
         LARGE_INTEGER   NonPagingReadBytesRequested;
         LARGE_INTEGER   CacheReadBytesRequested;
         LARGE_INTEGER   NetworkReadBytesRequested;
         LARGE_INTEGER   BytesTransmitted;
         LARGE_INTEGER   SmbsTransmitted;
         LARGE_INTEGER   PagingWriteBytesRequested;
         LARGE_INTEGER   NonPagingWriteBytesRequested;
         LARGE_INTEGER   CacheWriteBytesRequested;
         LARGE_INTEGER   NetworkWriteBytesRequested;
         unsigned long   InitiallyFailedOperations;
         unsigned long   FailedCompletionOperations;
         unsigned long   ReadOperations;
         unsigned long   RandomReadOperations;
         unsigned long   ReadSmbs;
         unsigned long   LargeReadSmbs;
         unsigned long   SmallReadSmbs;
         unsigned long   WriteOperations;
         unsigned long   RandomWriteOperations;
         unsigned long   WriteSmbs;
         unsigned long   LargeWriteSmbs;
         unsigned long   SmallWriteSmbs;
         unsigned long   RawReadsDenied;
         unsigned long   RawWritesDenied;
         unsigned long   NetworkErrors;
         unsigned long   Sessions;
         unsigned long   FailedSessions;
         unsigned long   Reconnects;
         unsigned long   CoreConnects;
         unsigned long   Lanman20Connects;
         unsigned long   Lanman21Connects;
         unsigned long   LanmanNtConnects;
         unsigned long   ServerDisconnects;
         unsigned long   HungSessions;
         unsigned long   UseCount;
         unsigned long   FailedUseCount;
         unsigned long   CurrentCommands;
     } STAT_WORKSTATION_0, *PSTAT_WORKSTATION_0, *LPSTAT_WORKSTATION_0;
  
     typedef struct _WKSTA_INFO_100 {
         unsigned long  wki100_platform_id;
         [string] wchar_t* wki100_computername;
         [string] wchar_t* wki100_langroup;
         unsigned long wki100_ver_major;
         unsigned long wki100_ver_minor;
     } WKSTA_INFO_100, *PWKSTA_INFO_100, *LPWKSTA_INFO_100;
  
     typedef struct _WKSTA_INFO_101 {
         unsigned long wki101_platform_id;
         [string] wchar_t* wki101_computername;
         [string] wchar_t* wki101_langroup;
         unsigned long wki101_ver_major;
         unsigned long wki101_ver_minor;
         [string] wchar_t* wki101_lanroot;
     } WKSTA_INFO_101, *PWKSTA_INFO_101, *LPWKSTA_INFO_101;
  
     typedef struct _WKSTA_INFO_102 {
         unsigned long  wki102_platform_id;
         [string] wchar_t* wki102_computername;
         [string] wchar_t* wki102_langroup;
         unsigned long wki102_ver_major;
         unsigned long wki102_ver_minor;
         [string] wchar_t* wki102_lanroot;
         unsigned long  wki102_logged_on_users;
     } WKSTA_INFO_102, *PWKSTA_INFO_102, *LPWKSTA_INFO_102;
  
     typedef struct _WKSTA_INFO_502{
         unsigned long   wki502_char_wait;
         unsigned long   wki502_collection_time;
         unsigned long   wki502_maximum_collection_count;
         unsigned long   wki502_keep_conn;
         unsigned long   wki502_max_cmds;
         unsigned long   wki502_sess_timeout;
         unsigned long   wki502_siz_char_buf;
         unsigned long   wki502_max_threads;
         unsigned long   wki502_lock_quota;
         unsigned long   wki502_lock_increment;
         unsigned long   wki502_lock_maximum;
         unsigned long   wki502_pipe_increment;
         unsigned long   wki502_pipe_maximum;
         unsigned long   wki502_cache_file_timeout;
         unsigned long   wki502_dormant_file_limit;
         unsigned long   wki502_read_ahead_throughput;
         unsigned long   wki502_num_mailslot_buffers;
         unsigned long   wki502_num_srv_announce_buffers;
         unsigned long   wki502_max_illegal_datagram_events;
         unsigned long   wki502_illegal_datagram_event_reset_frequency;
         int  wki502_log_election_packets;
         int  wki502_use_opportunistic_locking;
         int  wki502_use_unlock_behind;
         int  wki502_use_close_behind;
         int  wki502_buf_named_pipes;
         int  wki502_use_lock_read_unlock;
         int  wki502_utilize_nt_caching;
         int  wki502_use_raw_read;
         int  wki502_use_raw_write;
         int  wki502_use_write_raw_data;
         int  wki502_use_encryption;
         int  wki502_buf_files_deny_write;
         int  wki502_buf_read_only_files;
         int  wki502_force_core_create_mode;
         int  wki502_use_512_byte_max_transfer;
     } WKSTA_INFO_502, *PWKSTA_INFO_502, *LPWKSTA_INFO_502;
  
     typedef struct _WKSTA_INFO_1013 {
          unsigned long  wki1013_keep_conn;
     } WKSTA_INFO_1013, *PWKSTA_INFO_1013, *LPWKSTA_INFO_1013;
  
     typedef struct _WKSTA_INFO_1018 {
          unsigned long  wki1018_sess_timeout;
     } WKSTA_INFO_1018, *PWKSTA_INFO_1018, *LPWKSTA_INFO_1018;
  
     typedef struct _WKSTA_INFO_1046 {
         unsigned long  wki1046_dormant_file_limit;
     } WKSTA_INFO_1046, *PWKSTA_INFO_1046, *LPWKSTA_INFO_1046;
  
     typedef struct _WKSTA_USER_INFO_0 {
         [string] wchar_t* wkui0_username;
     } WKSTA_USER_INFO_0, *PWKSTA_USER_INFO_0, *LPWKSTA_USER_INFO_0;
  
     typedef struct _WKSTA_USER_INFO_1 {
         [string]  wchar_t* wkui1_username;
         [string] wchar_t* wkui1_logon_domain;
         [string] wchar_t* wkui1_oth_domains;
         [string] wchar_t* wkui1_logon_server;
     } WKSTA_USER_INFO_1, *PWKSTA_USER_INFO_1, *LPWKSTA_USER_INFO_1;
  
     typedef struct _WKSTA_TRANSPORT_INFO_0 {
         unsigned long wkti0_quality_of_service;
         unsigned long wkti0_number_of_vcs;
         [string] wchar_t* wkti0_transport_name;
         [string] wchar_t* wkti0_transport_address;
         unsigned long wkti0_wan_ish;
     } WKSTA_TRANSPORT_INFO_0, *PWKSTA_TRANSPORT_INFO_0,
      *LPWKSTA_TRANSPORT_INFO_0;
  
     typedef [handle] wchar_t* WKSSVC_IDENTIFY_HANDLE;
  
     typedef [handle] wchar_t* WKSSVC_IMPERSONATE_HANDLE;
  
     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(502)]
             LPWKSTA_INFO_502 WkstaInfo502;
         [case(1013)]
             LPWKSTA_INFO_1013 WkstaInfo1013;
         [case(1018)]
             LPWKSTA_INFO_1018 WkstaInfo1018;
         [case(1046)]
             LPWKSTA_INFO_1046 WkstaInfo1046;
         [default]
             ;
     } WKSTA_INFO, *PWKSTA_INFO, *LPWKSTA_INFO;
  
     typedef struct _USE_INFO_0 {
         [string] wchar_t* ui0_local;
         [string] wchar_t* ui0_remote;
     } USE_INFO_0, *PUSE_INFO_0, *LPUSE_INFO_0;
  
     typedef struct _USE_INFO_1 {
         [string] wchar_t* ui1_local;
         [string] wchar_t* ui1_remote;
         [string] wchar_t* ui1_password;
         unsigned long ui1_status;
         unsigned long ui1_asg_type;
         unsigned long ui1_refcount;
         unsigned long ui1_usecount;
     } USE_INFO_1, *PUSE_INFO_1, *LPUSE_INFO_1;
  
     typedef struct _USE_INFO_2 {
         USE_INFO_1 ui2_useinfo;
         [string] wchar_t* ui2_username;
         [string] wchar_t* ui2_domainname;
     } USE_INFO_2, *PUSE_INFO_2, *LPUSE_INFO_2;
  
     typedef struct _USE_INFO_3 {
         USE_INFO_2 ui3_ui2;
         ULONG ui3_flags;
     } USE_INFO_3, *PUSE_INFO_3, *LPUSE_INFO_3;
  
     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;
  
     typedef struct _USE_INFO_0_CONTAINER {
         unsigned long EntriesRead;
         LPUSE_INFO_0 Buffer;
     } USE_INFO_0_CONTAINER, *PUSE_INFO_0_CONTAINER, *LPUSE_INFO_0_CONTAINER;
  
     typedef struct _USE_INFO_1_CONTAINER {
         unsigned long EntriesRead;
         LPUSE_INFO_1 Buffer;
     } USE_INFO_1_CONTAINER, *PUSE_INFO_1_CONTAINER, *LPUSE_INFO_1_CONTAINER;
  
     typedef struct _USE_INFO_2_CONTAINER {
         unsigned long 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;
  
     unsigned long
     NetrWkstaGetInfo (
         [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName,
         [in] unsigned long Level,
         [out, switch_is(Level)] LPWKSTA_INFO WkstaInfo
     );
  
     unsigned long
     NetrWkstaSetInfo (
         [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName,
         [in] unsigned long  Level,
         [in, switch_is(Level)] LPWKSTA_INFO   WkstaInfo,
         [in,out,unique] unsigned long* ErrorParameter
     );
  
     typedef struct _WKSTA_USER_INFO_0_CONTAINER {
         unsigned long   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 {
         unsigned long   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 {
         unsigned long   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;
  
     unsigned long
     NetrWkstaUserEnum (
         [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName,
         [in,out] LPWKSTA_USER_ENUM_STRUCT UserInfo,
         [in] unsigned long  PreferredMaximumLength,
         [out] unsigned long* TotalEntries,
         [in,out,unique] unsigned long* ResumeHandle
     );
  
     void Opnum3NotUsedOnWire(void);
         
     void Opnum4NotUsedOnWire(void); 
  
     typedef struct _WKSTA_TRANSPORT_INFO_0_CONTAINER {
         unsigned long   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 {
         unsigned long   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;
  
     unsigned long
     NetrWkstaTransportEnum (
         [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName,
         [in,out] LPWKSTA_TRANSPORT_ENUM_STRUCT TransportInfo,
         [in] unsigned long  PreferredMaximumLength,
         [out] unsigned long* TotalEntries,
         [in,out,unique] unsigned long* ResumeHandle
     );
  
     unsigned long
     NetrWkstaTransportAdd (
         [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName,
         [in] unsigned long Level,
         [in] LPWKSTA_TRANSPORT_INFO_0 TransportInfo,
         [in,out,unique] unsigned long* ErrorParameter
     );
  
     unsigned long
     NetrWkstaTransportDel (
         [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName,
         [in,string,unique] wchar_t* TransportName,
         [in] unsigned long ForceLevel
     );
  
     unsigned long
     NetrUseAdd (
         [in, string, unique] WKSSVC_IMPERSONATE_HANDLE ServerName,
         [in] unsigned long Level,
         [in, switch_is(Level)] LPUSE_INFO InfoStruct,
         [in, out, unique] unsigned long* ErrorParameter
     );
          unsigned long NetrUseGetInfo(
            [in, string, unique] WKSSVC_IMPERSONATE_HANDLE ServerName,
            [in, string] wchar_t* UseName,
            [in] unsigned long Level,
            [out, switch_is(Level)] LPUSE_INFO InfoStruct
          );
     unsigned long
     NetrUseDel (
         [in, string, unique] WKSSVC_IMPERSONATE_HANDLE ServerName,
         [in, string] wchar_t* UseName,
         [in] unsigned long ForceLevel
     );
  
     unsigned long
     NetrUseEnum (
         [in, string, unique] WKSSVC_IDENTIFY_HANDLE ServerName,
         [in, out] LPUSE_ENUM_STRUCT InfoStruct,
         [in] unsigned long PreferredMaximumLength,
         [out] unsigned long* TotalEntries,
         [in, out, unique] unsigned long* ResumeHandle
     );
  
         
     void Opnum12NotUsedOnWire(void);
  
     unsigned long
     NetrWorkstationStatisticsGet(
         [in,string,unique] WKSSVC_IDENTIFY_HANDLE ServerName,
         [in,string,unique] wchar_t* ServiceName,
         [in] unsigned long Level,
         [in] unsigned long Options,
         [out] LPSTAT_WORKSTATION_0* Buffer
     );
  
     void Opnum14NotUsedOnWire(void);
         
     void Opnum15NotUsedOnWire(void);
  
     void Opnum16NotUsedOnWire(void);
  
     void Opnum17NotUsedOnWire(void);
  
     void Opnum18NotUsedOnWire(void);
  
     void Opnum19NotUsedOnWire(void);
  
     unsigned long
     NetrGetJoinInformation(
         [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName,
         [in,out,string] wchar_t**    NameBuffer,
         [out] PNETSETUP_JOIN_STATUS BufferType
     );
  
     void Opnum21NotUsedOnWire(void);
  
 #define JOIN_OBFUSCATOR_LENGTH 8
 #define JOIN_MAX_PASSWORD_LENGTH 256
  
     typedef struct _JOINPR_USER_PASSWORD {
         unsigned char Obfuscator[JOIN_OBFUSCATOR_LENGTH];
         wchar_t Buffer[JOIN_MAX_PASSWORD_LENGTH];
         unsigned long Length;
     } JOINPR_USER_PASSWORD,
      *PJOINPR_USER_PASSWORD;
  
     typedef struct _JOINPR_ENCRYPTED_USER_PASSWORD {
         unsigned char Buffer[JOIN_OBFUSCATOR_LENGTH + 
             (JOIN_MAX_PASSWORD_LENGTH * sizeof(wchar_t)) + 
             sizeof(unsigned long)];
     } JOINPR_ENCRYPTED_USER_PASSWORD,
      *PJOINPR_ENCRYPTED_USER_PASSWORD;
  
     typedef struct _UNICODE_STRING {
         unsigned short Length;
         unsigned short MaximumLength;
         [size_is(MaximumLength / 2), length_is((Length) / 2)] 
             unsigned short* Buffer;
     } UNICODE_STRING, 
      *PUNICODE_STRING;
  
     unsigned long
     NetrJoinDomain2(
         [in] handle_t RpcBindingHandle,
         [in,string,unique] wchar_t* ServerName,
         [in,string] wchar_t* DomainNameParam,
         [in,string,unique] wchar_t* MachineAccountOU,
         [in,string,unique] wchar_t* AccountName,
         [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD Password,
         [in] unsigned long Options
     );
  
     unsigned long
     NetrUnjoinDomain2(
         [in] handle_t RpcBindingHandle,
         [in,string,unique] wchar_t* ServerName,
         [in,string,unique] wchar_t* AccountName,
         [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD Password,
         [in] unsigned long Options
     );
  
     unsigned long
     NetrRenameMachineInDomain2(
         [in] handle_t RpcBindingHandle,
         [in,string,unique] wchar_t* ServerName,
         [in,string,unique] wchar_t* MachineName,
         [in,string,unique] wchar_t* AccountName,
         [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD Password,
         [in] unsigned long Options
     );
  
     unsigned long
     NetrValidateName2(
         [in] handle_t RpcBindingHandle,
         [in,string,unique] wchar_t* ServerName,
         [in,string] wchar_t* NameToValidate,
         [in,string,unique] wchar_t* AccountName,
         [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD Password,
         [in] NETSETUP_NAME_TYPE NameType
     );
  
     unsigned long
     NetrGetJoinableOUs2(
         [in] handle_t  RpcBindingHandle,
         [in,string,unique] wchar_t*  ServerName,
         [in,string] wchar_t*  DomainNameParam,
         [in,string,unique] wchar_t*  AccountName,
         [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD Password,
         [in,out] unsigned long*  OUCount,
         [out,string,size_is(,*OUCount)] wchar_t*** OUs
     );
  
     unsigned long
     NetrAddAlternateComputerName(
         [in] handle_t  RpcBindingHandle,
         [in,string,unique] wchar_t*  ServerName,
         [in,string,unique] wchar_t*  AlternateName,
         [in,string,unique] wchar_t*  DomainAccount,
         [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword,
         [in] unsigned long  Reserved
     );
  
     unsigned long
     NetrRemoveAlternateComputerName(
         [in] handle_t  RpcBindingHandle,
         [in,string,unique] wchar_t*  ServerName,
         [in,string,unique] wchar_t*  AlternateName,
         [in,string,unique] wchar_t*  DomainAccount,
         [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD EncryptedPassword,
         [in] unsigned long  Reserved
     );
  
     unsigned long
     NetrSetPrimaryComputerName(
         [in] handle_t  RpcBindingHandle,
         [in,string,unique] wchar_t*  ServerName,
         [in,string,unique] wchar_t*  PrimaryName,
         [in,string,unique] wchar_t*  DomainAccount,
         [in,unique] PJOINPR_ENCRYPTED_USER_PASSWORD  EncryptedPassword,
         [in] unsigned long  Reserved
     );
  
     typedef struct _NET_COMPUTER_NAME_ARRAY {
         unsigned long EntryCount;
         [size_is(EntryCount)] PUNICODE_STRING ComputerNames;
     } NET_COMPUTER_NAME_ARRAY, *PNET_COMPUTER_NAME_ARRAY;
  
     unsigned long
     NetrEnumerateComputerNames(
         [in,string,unique] WKSSVC_IMPERSONATE_HANDLE ServerName,
         [in] NET_COMPUTER_NAME_TYPE  NameType,
         [in] unsigned long  Reserved,
         [out] PNET_COMPUTER_NAME_ARRAY  *ComputerNames
     );
 }
  
Show: