It turns out that the Netlogon PAC verification is encrypted.
[kai/samba.git] / source4 / librpc / idl / netlogon.idl
index 96aab3a807d4cc9859b2442431fddc30e82de0fb..22981068518bcd5ad0ec7a2e3b8f412daa78cc99 100644 (file)
@@ -4,7 +4,7 @@
   who contributed!
 */
 
-import "lsa.idl", "samr.idl", "security.idl", "nbt.idl";
+import "misc.idl", "lsa.idl", "samr.idl", "security.idl", "nbt.idl";
 
 #include "idl_types.h"
 
@@ -12,13 +12,13 @@ import "lsa.idl", "samr.idl", "security.idl", "nbt.idl";
   uuid("12345678-1234-abcd-ef00-01234567cffb"),
   version(1.0),
   endpoint("ncacn_np:[\\pipe\\netlogon]","ncacn_ip_tcp:","ncalrpc:"),
-  pointer_default(unique),
-  pointer_default_top(unique)
+  pointer_default(unique)
 ]
 
 interface netlogon
 {
-       declare bitmap samr_AcctFlags;
+       typedef bitmap samr_AcctFlags samr_AcctFlags;
+       typedef bitmap samr_GroupAttrs samr_GroupAttrs;
 
        /*****************/
        /* Function 0x00 */
@@ -43,10 +43,10 @@ interface netlogon
        } netr_UasInfo;
 
        WERROR netr_LogonUasLogon(
-               [in]   [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
                [in]   [string,charset(UTF16)] uint16 account_name[],
                [in]   [string,charset(UTF16)] uint16 workstation[],
-               [out netr_UasInfo *info
+               [out,unique] netr_UasInfo *info
                );
 
 
@@ -59,7 +59,7 @@ interface netlogon
        } netr_UasLogoffInfo;
 
        WERROR netr_LogonUasLogoff(
-               [in] [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
                [in] [string,charset(UTF16)] uint16 account_name[],
                [in] [string,charset(UTF16)] uint16 workstation[],
                [out] netr_UasLogoffInfo info
@@ -86,13 +86,18 @@ interface netlogon
                [size_is(size/2),length_is(length/2)] uint16 *bindata;
        } netr_AcctLockStr;
 
-       const int MSV1_0_CLEARTEXT_PASSWORD_ALLOWED = 0x002;
-       const int MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT = 0x020;
-       const int MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT = 0x800;
+       typedef [public,bitmap32bit] bitmap {
+               MSV1_0_CLEARTEXT_PASSWORD_ALLOWED       = 0x00000002,
+               MSV1_0_UPDATE_LOGON_STATISTICS          = 0x00000004,
+               MSV1_0_RETURN_USER_PARAMETERS           = 0x00000008,
+               MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT       = 0x00000020,
+               MSV1_0_RETURN_PROFILE_PATH              = 0x00000200,
+               MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT  = 0x00000800
+       } netr_LogonParameterControl;
 
        typedef struct {
                lsa_String  domain_name;
-               uint32      parameter_control; /* see MSV1_0_* */
+               netr_LogonParameterControl parameter_control; /* see MSV1_0_* */
                uint32      logon_id_low;
                uint32      logon_id_high;
                lsa_String  account_name;
@@ -118,18 +123,32 @@ interface netlogon
                netr_ChallengeResponse lm;
        } netr_NetworkInfo;
 
-       typedef [public,switch_type(uint16)] union {
-               [case(1)] netr_PasswordInfo *password;
-               [case(2)] netr_NetworkInfo  *network;
-               [case(3)] netr_PasswordInfo *password;
-               [case(5)] netr_PasswordInfo *password;
-               [case(6)] netr_NetworkInfo  *network;
-       } netr_LogonLevel;
+       typedef [flag(NDR_PAHEX)] struct {
+               netr_IdentityInfo identity_info;
+               lsa_String  package_name;
+               uint32 length;
+               [size_is(length)] uint8 *data;
+       } netr_GenericInfo;
 
-       typedef [public] struct {
-               uint32 rid;
-               uint32 attributes;
-       } netr_GroupMembership;
+       typedef enum {
+               NetlogonInteractiveInformation = 1,
+               NetlogonNetworkInformation = 2,
+               NetlogonServiceInformation = 3,
+               NetlogonGenericInformation = 4,
+               NetlogonInteractiveTransitiveInformation = 5,
+               NetlogonNetworkTransitiveInformation = 6,
+               NetlogonServiceTransitiveInformation = 7
+       } netr_LogonInfoClass;
+
+       typedef [public,switch_type(netr_LogonInfoClass)] union {
+               [case(NetlogonInteractiveInformation)]           netr_PasswordInfo *password;
+               [case(NetlogonNetworkInformation)]               netr_NetworkInfo  *network;
+               [case(NetlogonServiceInformation)]               netr_PasswordInfo *password;
+               [case(NetlogonGenericInformation)]               netr_GenericInfo  *generic;
+               [case(NetlogonInteractiveTransitiveInformation)] netr_PasswordInfo *password;
+               [case(NetlogonNetworkTransitiveInformation)]     netr_NetworkInfo  *network;
+               [case(NetlogonServiceTransitiveInformation)]     netr_PasswordInfo *password;
+       } netr_LogonLevel;
 
        typedef [public,flag(NDR_PAHEX)] struct {
                uint8 key[16];
@@ -187,7 +206,7 @@ interface netlogon
 
        typedef struct {
                dom_sid2 *sid;
-               uint32 attribute;
+               samr_GroupAttrs attributes;
        } netr_SidAttr;
 
        typedef [public] struct {
@@ -221,12 +240,25 @@ interface netlogon
                lsa_String unknown4;
        } netr_PacInfo;
 
+       typedef [flag(NDR_PAHEX)] struct {
+               uint32 length;
+               [size_is(length)] uint8 *data;
+       } netr_GenericInfo2;
+
+       typedef enum {
+               NetlogonValidationUasInfo = 1,
+               NetlogonValidationSamInfo = 2,
+               NetlogonValidationSamInfo2 = 3,
+               NetlogonValidationGenericInfo2 = 5,
+               NetlogonValidationSamInfo4 = 6
+       } netr_ValidationInfoClass;
+
        typedef [public,switch_type(uint16)] union {
-               [case(2)] netr_SamInfo2 *sam2;
-               [case(3)] netr_SamInfo3 *sam3;
+               [case(NetlogonValidationSamInfo)] netr_SamInfo2 *sam2;
+               [case(NetlogonValidationSamInfo2)] netr_SamInfo3 *sam3;
                [case(4)] netr_PacInfo  *pac;
-               [case(5)] netr_PacInfo  *pac;
-               [case(6)] netr_SamInfo6 *sam6;
+               [case(NetlogonValidationGenericInfo2)] netr_GenericInfo2  *generic;
+               [case(NetlogonValidationSamInfo4)] netr_SamInfo6 *sam6;
        } netr_Validation;
 
        typedef [public, flag(NDR_PAHEX)] struct {
@@ -239,15 +271,15 @@ interface netlogon
        } netr_Authenticator;
 
        NTSTATUS netr_LogonSamLogon(
-               [in] [string,charset(UTF16)] uint16 *server_name,
-               [in] [string,charset(UTF16)] uint16 *computer_name,
-               [in] netr_Authenticator *credential,
-               [in][out] netr_Authenticator *return_authenticator,
-               [in]  uint16 logon_level,
-               [in]  [switch_is(logon_level)] netr_LogonLevel logon,
-               [in]  uint16 validation_level,
+               [in,unique] [string,charset(UTF16)] uint16         *server_name,
+               [in,unique] [string,charset(UTF16)] uint16         *computer_name,
+               [in,unique] netr_Authenticator                     *credential,
+               [in,out,unique] netr_Authenticator                 *return_authenticator,
+               [in]  netr_LogonInfoClass                           logon_level,
+               [in]  [switch_is(logon_level)] netr_LogonLevel      logon,
+               [in]  uint16                                        validation_level,
                [out] [switch_is(validation_level)] netr_Validation validation,
-               [out] uint8 authoritative
+               [out] uint8                                         authoritative
                );
 
 
@@ -255,10 +287,10 @@ interface netlogon
        /* Function 0x03 */
 
        NTSTATUS netr_LogonSamLogoff(
-               [in] [string,charset(UTF16)] uint16 *server_name,
-               [in] [string,charset(UTF16)] uint16 *computer_name,
-               [in]      netr_Authenticator *credential,
-               [in][out] netr_Authenticator *return_authenticator,
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *computer_name,
+               [in,unique] netr_Authenticator *credential,
+               [in,out,unique] netr_Authenticator *return_authenticator,
                [in] uint16 logon_level,
                [in] [switch_is(logon_level)] netr_LogonLevel logon
                );
@@ -269,7 +301,7 @@ interface netlogon
        /* Function 0x04 */
 
        [public] NTSTATUS netr_ServerReqChallenge(
-               [in,string,charset(UTF16)] uint16 *server_name,
+               [in,unique,string,charset(UTF16)] uint16 *server_name,
                [in,string,charset(UTF16)] uint16 computer_name[],
                [in,out,ref] netr_Credential *credentials
                );
@@ -278,10 +310,10 @@ interface netlogon
        /*****************/
        /* Function 0x05 */
 
-       declare enum netr_SchannelType;
+       typedef enum netr_SchannelType netr_SchannelType;
 
        NTSTATUS netr_ServerAuthenticate(
-               [in,string,charset(UTF16)] uint16 *server_name,
+               [in,unique,string,charset(UTF16)] uint16 *server_name,
                [in,string,charset(UTF16)] uint16 account_name[],
                [in]                       netr_SchannelType secure_channel_type,
                [in,string,charset(UTF16)] uint16 computer_name[],
@@ -293,7 +325,7 @@ interface netlogon
        /* Function 0x06 */
 
        NTSTATUS netr_ServerPasswordSet(
-               [in [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
                [in]  [string,charset(UTF16)] uint16 account_name[],
                [in]  netr_SchannelType secure_channel_type,
                [in]  [string,charset(UTF16)] uint16 computer_name[],
@@ -306,7 +338,7 @@ interface netlogon
        /*****************/
        /* Function 0x07 */
 
-       declare enum netr_SamDatabaseID;
+       typedef enum netr_SamDatabaseID netr_SamDatabaseID;
 
        typedef struct {
                [string,charset(UTF16)] uint16 *account_name;
@@ -403,7 +435,7 @@ interface netlogon
 
        typedef struct {
                lsa_String domain_name;
-               lsa_String comment;
+               lsa_String oem_information; /* comment */
                dlong force_logoff_time;
                uint16 min_password_length;
                uint16 password_history_length;
@@ -684,7 +716,7 @@ interface netlogon
                [in]      netr_SamDatabaseID database_id,
                [in,out]  udlong sequence_num,
                [in]      uint32 preferredmaximumlength,
-               [out]     netr_DELTA_ENUM_ARRAY *delta_enum_array
+               [out,unique] netr_DELTA_ENUM_ARRAY *delta_enum_array
                );
 
 
@@ -699,7 +731,7 @@ interface netlogon
                [in]     netr_SamDatabaseID database_id,
                [in,out] uint32 sync_context,
                [in]     uint32 preferredmaximumlength,
-               [out]    netr_DELTA_ENUM_ARRAY *delta_enum_array
+               [out,unique] netr_DELTA_ENUM_ARRAY *delta_enum_array
                );
 
 
@@ -719,7 +751,7 @@ interface netlogon
        } netr_AccountBuffer;
 
        NTSTATUS netr_AccountDeltas(
-               [in]     [string,charset(UTF16)] uint16 *logon_server,
+               [in,unique] [string,charset(UTF16)] uint16 *logon_server,
                [in]     [string,charset(UTF16)] uint16 computername[],
                [in]     netr_Authenticator credential,
                [in,out] netr_Authenticator return_authenticator,
@@ -738,7 +770,7 @@ interface netlogon
        /* Function 0x0A */
 
        NTSTATUS netr_AccountSync(
-               [in]      [string,charset(UTF16)] uint16 *logon_server,
+               [in,unique] [string,charset(UTF16)] uint16 *logon_server,
                [in]      [string,charset(UTF16)] uint16 computername[],
                [in]      netr_Authenticator credential,
                [in,out]  netr_Authenticator return_authenticator,
@@ -758,8 +790,8 @@ interface netlogon
 
        WERROR netr_GetDcName(
                [in]  [string,charset(UTF16)] uint16 logon_server[],
-               [in [string,charset(UTF16)] uint16 *domainname,
-               [out] [string,charset(UTF16)] uint16 *dcname
+               [in,unique] [string,charset(UTF16)] uint16 *domainname,
+               [out,unique] [string,charset(UTF16)] uint16 *dcname
                );
 
        /*****************/
@@ -802,7 +834,7 @@ interface netlogon
        } netr_LogonControlCode;
 
        WERROR netr_LogonControl(
-               [in]   [string,charset(UTF16)] uint16 *logon_server,
+               [in,unique] [string,charset(UTF16)] uint16 *logon_server,
                [in]   netr_LogonControlCode function_code,
                [in]   uint32 level,
                [out,switch_is(level)]  netr_CONTROL_QUERY_INFORMATION info
@@ -813,9 +845,9 @@ interface netlogon
        /* Function 0x0D */
 
        WERROR netr_GetAnyDCName(
-               [in [string,charset(UTF16)] uint16 *logon_server,
-               [in [string,charset(UTF16)] uint16 *domainname,
-               [out] [string,charset(UTF16)] uint16 *dcname
+               [in,unique] [string,charset(UTF16)] uint16 *logon_server,
+               [in,unique] [string,charset(UTF16)] uint16 *domainname,
+               [out,unique] [string,charset(UTF16)] uint16 *dcname
                );
 
 
@@ -830,7 +862,7 @@ interface netlogon
        } netr_CONTROL_DATA_INFORMATION;
 
        WERROR netr_LogonControl2(
-               [in]    [string,charset(UTF16)] uint16 *logon_server,
+               [in,unique] [string,charset(UTF16)] uint16 *logon_server,
                [in]    uint32 function_code,
                [in]    uint32 level,
                [in][switch_is(function_code)] netr_CONTROL_DATA_INFORMATION  data,
@@ -849,7 +881,7 @@ interface netlogon
        /* Function 0x0F */
 
        NTSTATUS netr_ServerAuthenticate2(
-               [in]         [string,charset(UTF16)] uint16 *server_name,
+               [in,unique]  [string,charset(UTF16)] uint16 *server_name,
                [in]         [string,charset(UTF16)] uint16 account_name[],
                [in]         netr_SchannelType secure_channel_type,
                [in]         [string,charset(UTF16)] uint16 computer_name[],
@@ -870,7 +902,7 @@ interface netlogon
                [in]     uint16 restart_state,
                [in,out] uint32 sync_context,
                [in]     uint32 preferredmaximumlength,
-               [out]    netr_DELTA_ENUM_ARRAY *delta_enum_array
+               [out,unique] netr_DELTA_ENUM_ARRAY *delta_enum_array
                );
 
 
@@ -884,9 +916,9 @@ interface netlogon
                [in]     [string,charset(UTF16)] uint16 computername[],
                [in]     netr_Authenticator credential,
                [in,out] netr_Authenticator return_authenticator,
-               [in][size_is(change_log_entry_size)] uint8 *change_log_entry,
+               [in,unique][size_is(change_log_entry_size)] uint8 *change_log_entry,
                [in]     uint32 change_log_entry_size,
-               [out]    netr_DELTA_ENUM_ARRAY *delta_enum_array
+               [out,unique]    netr_DELTA_ENUM_ARRAY *delta_enum_array
                );
 
 
@@ -894,7 +926,7 @@ interface netlogon
        /* Function 0x12 */
 
        WERROR netr_LogonControl2Ex(
-               [in]   [string,charset(UTF16)] uint16 *logon_server,
+               [in,unique] [string,charset(UTF16)] uint16 *logon_server,
                [in]   uint32 function_code,
                [in]   uint32 level,
                [in][switch_is(function_code)] netr_CONTROL_DATA_INFORMATION  data,
@@ -909,7 +941,7 @@ interface netlogon
        } netr_Blob;
 
        WERROR netr_NetrEnumerateTrustedDomains(
-               [in] [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
                [out,ref] netr_Blob *trusted_domains_blob
                );
 
@@ -973,38 +1005,42 @@ interface netlogon
        } netr_DsRGetDCNameInfo;
 
        WERROR netr_DsRGetDCName(
-               [in] [string,charset(UTF16)] uint16 *server_unc,
-               [in] [string,charset(UTF16)] uint16 *domain_name,
-               [in] GUID *domain_guid,
-               [in] GUID *site_guid,
+               [in,unique] [string,charset(UTF16)] uint16 *server_unc,
+               [in,unique] [string,charset(UTF16)] uint16 *domain_name,
+               [in,unique] GUID *domain_guid,
+               [in,unique] GUID *site_guid,
                [in] netr_DsRGetDCName_flags flags,
-               [out] netr_DsRGetDCNameInfo *info
+               [out,unique] netr_DsRGetDCNameInfo *info
                );
 
        /*****************/
        /* Function 0x15 */
-       WERROR netr_NETRLOGONDUMMYROUTINE1();
+       [todo] WERROR netr_NETRLOGONDUMMYROUTINE1();
 
        /****************/
        /* Function 0x16 */
-       WERROR netr_NETRLOGONSETSERVICEBITS();
+       [todo] WERROR netr_NETRLOGONSETSERVICEBITS();
 
        /****************/
        /* Function 0x17 */
-       WERROR netr_NETRLOGONGETTRUSTRID();
+       WERROR netr_LogonGetTrustRid(
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *domain_name,
+               [out,ref] uint32 *rid
+       );
 
        /****************/
        /* Function 0x18 */
-       WERROR netr_NETRLOGONCOMPUTESERVERDIGEST();
+       [todo] WERROR netr_NETRLOGONCOMPUTESERVERDIGEST();
 
        /****************/
        /* Function 0x19 */
-       WERROR netr_NETRLOGONCOMPUTECLIENTDIGEST();
+       [todo] WERROR netr_NETRLOGONCOMPUTECLIENTDIGEST();
 
        /****************/
        /* Function 0x1a */
        [public] NTSTATUS netr_ServerAuthenticate3(
-               [in]         [string,charset(UTF16)] uint16 *server_name,
+               [in,unique]         [string,charset(UTF16)] uint16 *server_name,
                [in]         [string,charset(UTF16)] uint16 account_name[],
                [in]         netr_SchannelType secure_channel_type,
                [in]         [string,charset(UTF16)] uint16 computer_name[],
@@ -1017,19 +1053,19 @@ interface netlogon
        /* Function 0x1b */
 
        WERROR netr_DsRGetDCNameEx(
-               [in] [string,charset(UTF16)] uint16 *server_unc,
-               [in] [string,charset(UTF16)] uint16 *domain_name,
-               [in] GUID *domain_guid,
-               [in] [string,charset(UTF16)] uint16 *site_name,
+               [in,unique] [string,charset(UTF16)] uint16 *server_unc,
+               [in,unique] [string,charset(UTF16)] uint16 *domain_name,
+               [in,unique] GUID *domain_guid,
+               [in,unique] [string,charset(UTF16)] uint16 *site_name,
                [in] netr_DsRGetDCName_flags flags,
-               [out] netr_DsRGetDCNameInfo *info
+               [out,unique] netr_DsRGetDCNameInfo *info
                );
 
        /****************/
        /* Function 0x1c */
        WERROR netr_DsRGetSiteName(
-               [in] [string,charset(UTF16)] uint16 *computer_name,
-               [out] [string,charset(UTF16)] uint16 *site
+               [in,unique] [string,charset(UTF16)] uint16 *computer_name,
+               [out,unique] [string,charset(UTF16)] uint16 *site
                );
 
        /****************/
@@ -1085,7 +1121,7 @@ interface netlogon
        
        NTSTATUS netr_LogonGetDomainInfo(
                [in]         [string,charset(UTF16)] uint16 server_name[],
-               [in]         [string,charset(UTF16)] uint16 *computer_name,
+               [in,unique]  [string,charset(UTF16)] uint16 *computer_name,
                [in,ref]     netr_Authenticator *credential,
                [in,out,ref] netr_Authenticator *return_authenticator,
                [in]         uint32 level,
@@ -1101,7 +1137,7 @@ interface netlogon
        /*****************/
        /* Function 0x1e */
        NTSTATUS netr_ServerPasswordSet2(
-               [in [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
                [in]  [string,charset(UTF16)] uint16 account_name[],
                [in]  netr_SchannelType secure_channel_type,
                [in]  [string,charset(UTF16)] uint16 computer_name[],
@@ -1113,7 +1149,7 @@ interface netlogon
        /****************/
        /* Function 0x1f */
        WERROR netr_ServerPasswordGet(
-               [in [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
                [in]  [string,charset(UTF16)] uint16 account_name[],
                [in]  netr_SchannelType secure_channel_type,
                [in]  [string,charset(UTF16)] uint16 computer_name[],
@@ -1124,7 +1160,7 @@ interface netlogon
 
        /****************/
        /* Function 0x20 */
-       WERROR netr_NETRLOGONSENDTOSAM();
+       [todo] WERROR netr_NETRLOGONSENDTOSAM();
 
        /****************/
        /* Function 0x21 */
@@ -1139,7 +1175,7 @@ interface netlogon
        } netr_DsRAddress;
 
        WERROR netr_DsRAddressToSitenamesW(
-               [in] [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
                [in] [range(0,32000)] uint32 count,
                [in] [size_is(count)] [ref] netr_DsRAddress *addresses,
                [out] [ref] netr_DsRAddressToSitenamesWCtr **ctr
@@ -1148,19 +1184,19 @@ interface netlogon
        /****************/
        /* Function 0x22 */
        WERROR netr_DsRGetDCNameEx2(
-               [in] [string,charset(UTF16)] uint16 *server_unc,
-               [in] [string,charset(UTF16)] uint16 *client_account,
+               [in,unique] [string,charset(UTF16)] uint16 *server_unc,
+               [in,unique] [string,charset(UTF16)] uint16 *client_account,
                [in] samr_AcctFlags mask,
-               [in] [string,charset(UTF16)] uint16 *domain_name,
-               [in] GUID *domain_guid,
-               [in] [string,charset(UTF16)] uint16 *site_name,
+               [in,unique] [string,charset(UTF16)] uint16 *domain_name,
+               [in,unique] GUID *domain_guid,
+               [in,unique] [string,charset(UTF16)] uint16 *site_name,
                [in] netr_DsRGetDCName_flags flags,
-               [out] netr_DsRGetDCNameInfo *info
+               [out,unique] netr_DsRGetDCNameInfo *info
                );
 
        /****************/
        /* Function 0x23 */
-       WERROR netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN();
+       [todo] WERROR netr_NETRLOGONGETTIMESERVICEPARENTDOMAIN();
 
        /****************/
        /* Function 0x24 */
@@ -1207,7 +1243,7 @@ interface netlogon
         } netr_DomainTrustList;
 
        WERROR netr_NetrEnumerateTrustedDomainsEx(
-               [in] [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
                [out,ref] netr_DomainTrustList *dom_trust_list
        );
 
@@ -1220,7 +1256,7 @@ interface netlogon
        } netr_DsRAddressToSitenamesExWCtr;
 
        WERROR netr_DsRAddressToSitenamesExW(
-               [in] [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
                [in] [range(0,32000)] uint32 count,
                [in] [size_is(count)] [ref] netr_DsRAddress *addresses,
                [out] [ref] netr_DsRAddressToSitenamesExWCtr **ctr
@@ -1235,15 +1271,15 @@ interface netlogon
        } DcSitesCtr;
 
        WERROR netr_DsrGetDcSiteCoverageW(
-               [in] [string,charset(UTF16)] uint16 *server_name,
-               [out] DcSitesCtr *ctr
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
+               [out,unique] DcSitesCtr *ctr
                );
 
        /****************/
        /* Function 0x27 */
        NTSTATUS netr_LogonSamLogonEx(
-               [in] [string,charset(UTF16)] uint16 *server_name,
-               [in] [string,charset(UTF16)] uint16 *computer_name,
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *computer_name,
                [in]  uint16 logon_level,
                [in]  [switch_is(logon_level)] netr_LogonLevel logon,
                [in]  uint16 validation_level,
@@ -1256,21 +1292,27 @@ interface netlogon
        /* Function 0x28 */
 
        WERROR netr_DsrEnumerateDomainTrusts(
-               [in]                 [string,charset(UTF16)] uint16           *server_name,
+               [in,unique]          [string,charset(UTF16)] uint16           *server_name,
                [in]                 netr_TrustFlags  trust_flags,
                [out]                uint32           count,
-               [out,size_is(count)] netr_DomainTrust *trusts
+               [out,unique,size_is(count)] netr_DomainTrust *trusts
                );
 
 
        /****************/
        /* Function 0x29 */
-       WERROR netr_DSRDEREGISTERDNSHOSTRECORDS();
+       WERROR netr_DsrDeregisterDNSHostRecords(
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *domain,
+               [in,unique] GUID *domain_guid,
+               [in,unique] GUID *dsa_guid,
+               [in,ref] [string,charset(UTF16)] uint16 *dns_host
+               );
 
        /****************/
        /* Function 0x2a */
        NTSTATUS netr_ServerTrustPasswordsGet(
-               [in]  [string,charset(UTF16)] uint16 *server_name,
+               [in,unique]  [string,charset(UTF16)] uint16 *server_name,
                [in]  [string,charset(UTF16)] uint16 account_name[],
                [in]  netr_SchannelType secure_channel_type,
                [in]  [string,charset(UTF16)] uint16 computer_name[],
@@ -1286,8 +1328,8 @@ interface netlogon
        const int DS_GFTI_UPDATE_TDO = 0x1;
 
        WERROR netr_DsRGetForestTrustInformation(
-               [in] [string,charset(UTF16)] uint16 *server_name,
-               [in] [string,charset(UTF16)] uint16 *trusted_domain_name,
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *trusted_domain_name,
                [in] uint32 flags,
                [out,ref] lsa_ForestTrustInformation **forest_trust_info
                );
@@ -1295,7 +1337,7 @@ interface netlogon
        /****************/
        /* Function 0x2c */
        WERROR netr_GetForestTrustInformation(
-               [in] [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
                [in,ref] [string,charset(UTF16)] uint16 *trusted_domain_name,
                [in,ref] netr_Authenticator *credential,
                [out,ref] netr_Authenticator *return_authenticator,
@@ -1308,10 +1350,10 @@ interface netlogon
 
        /* this is the ADS varient. I don't yet know what the "flags" are for */
        NTSTATUS netr_LogonSamLogonWithFlags(
-               [in] [string,charset(UTF16)] uint16 *server_name,
-               [in] [string,charset(UTF16)] uint16 *computer_name,
-               [in] netr_Authenticator *credential,
-               [in][out] netr_Authenticator *return_authenticator,
+               [in,unique] [string,charset(UTF16)] uint16 *server_name,
+               [in,unique] [string,charset(UTF16)] uint16 *computer_name,
+               [in,unique] netr_Authenticator *credential,
+               [in,out,unique] netr_Authenticator *return_authenticator,
                [in]  uint16 logon_level,
                [in]  [switch_is(logon_level)] netr_LogonLevel logon,
                [in]  uint16 validation_level,
@@ -1322,5 +1364,5 @@ interface netlogon
 
        /****************/
        /* Function 0x2e */
-       WERROR netr_NETRSERVERGETTRUSTINFO();
+       [todo] WERROR netr_NETRSERVERGETTRUSTINFO();
 }