s4-drsuapi: merge drsuapi_DsWriteAccountSpn from s3 drsuapi idl.
[samba.git] / source4 / librpc / idl / drsuapi.idl
index fe0e98fe0ddba7b699b9ebd60349dcdbeebb82a6..a4aab0f4417b82ad5c117816e01a3bdc4a3b5a75 100644 (file)
@@ -13,7 +13,7 @@ import "security.idl", "misc.idl", "samr.idl";
 ]
 interface drsuapi
 {
-       declare bitmap samr_GroupAttrs;
+       typedef bitmap samr_GroupAttrs samr_GroupAttrs;
 
        /*****************/
         /* Function 0x00 */
@@ -58,21 +58,36 @@ interface drsuapi
                DRSUAPI_SUPPORTED_EXTENSION_80000000                    = 0x80000000
        } drsuapi_SupportedExtensions;
 
+       typedef [bitmap32bit] bitmap {
+               DRSUAPI_SUPPORTED_EXTENSION_ADAM                        = 0x00000001,
+               DRSUAPI_SUPPORTED_EXTENSION_LH_BETA2                    = 0x00000002
+       } drsuapi_SupportedExtensionsExt;
+
        /* this is used by w2k */
        typedef struct {
                drsuapi_SupportedExtensions supported_extensions;
                GUID site_guid;
-               uint32 u1;
+               uint32 pid;
        } drsuapi_DsBindInfo24;
 
        /* this is used by w2k3 */
        typedef struct {
                drsuapi_SupportedExtensions supported_extensions;
                GUID site_guid;
-               uint32 u1;
+               uint32 pid;
                uint32 repl_epoch;
        } drsuapi_DsBindInfo28;
 
+       /* this is used by w2k8 */
+       typedef struct {
+               drsuapi_SupportedExtensions supported_extensions;
+               GUID site_guid;
+               uint32 pid;
+               uint32 repl_epoch;
+               drsuapi_SupportedExtensionsExt supported_extensions_ext;
+               GUID config_dn_guid;
+       } drsuapi_DsBindInfo48;
+
        typedef struct {
                [flag(NDR_REMAINING)] DATA_BLOB info;
        } drsuapi_DsBindInfoFallBack;
@@ -80,6 +95,7 @@ interface drsuapi
        typedef [nodiscriminant] union {
                [case(24)][subcontext(4)] drsuapi_DsBindInfo24 info24;
                [case(28)][subcontext(4)] drsuapi_DsBindInfo28 info28;
+               [case(48)][subcontext(4)] drsuapi_DsBindInfo48 info48;
                [default][subcontext(4)] drsuapi_DsBindInfoFallBack FallBack;
        } drsuapi_DsBindInfo;
 
@@ -111,7 +127,7 @@ interface drsuapi
        const char *DRSUAPI_DS_BIND_GUID_W2K    = "6abec3d1-3054-41c8-a362-5a0c5b7d5d71";
        const char *DRSUAPI_DS_BIND_GUID_W2K3   = "6afab99c-6e26-464a-975f-f58f105218bc";
 
-       WERROR drsuapi_DsBind(
+       [public] WERROR drsuapi_DsBind(
                [in,unique]         GUID *bind_guid,
                [in,out,unique]    drsuapi_DsBindInfoCtr *bind_info,
                [out]   policy_handle *bind_handle
@@ -127,10 +143,11 @@ interface drsuapi
        /* Function 0x02 */
        typedef [public,gensize] struct {
                [value(ndr_size_drsuapi_DsReplicaObjectIdentifier(r, ndr->flags)-4)] uint32 __ndr_size;
-               [value(ndr_size_dom_sid28(&r->sid, ndr->flags))]  uint32 __ndr_size_sid;
+               [value(ndr_size_dom_sid28(&sid, ndr->flags))]  uint32 __ndr_size_sid;
                GUID guid;
                dom_sid28 sid;
-               [flag(STR_SIZE4|STR_CHARLEN|STR_CONFORMANT)] string dn;
+               [value(strlen_m(dn))] uint32 __ndr_size_dn;
+               [charset(UTF16),size_is(__ndr_size_dn+1)] uint16 dn[];
        } drsuapi_DsReplicaObjectIdentifier;
 
        typedef [public] bitmap {
@@ -162,8 +179,8 @@ interface drsuapi
 
        typedef struct {
                drsuapi_DsReplicaObjectIdentifier *naming_context;
-               GUID guid1;
-               astring *string1;
+               GUID source_dsa_guid;
+               astring *other_info; /* I assume this is related to the repsFromTo1OtherInfo dns_name */
                drsuapi_DsReplicaSyncOptions options;
        } drsuapi_DsReplicaSyncRequest1;
 
@@ -188,15 +205,15 @@ interface drsuapi
        typedef [public] struct {
                GUID source_dsa_invocation_id; /* the 'invocationId' field of the CN=NTDS Settings object */
                hyper highest_usn;  /* updated after a full replication cycle */
-       } drsuapi_DsReplicaCoursor;
+       } drsuapi_DsReplicaCursor;
 
        typedef struct {
-               uint32 u1;
-               uint32 u2;
+               [value(1)] uint32 version;
+               [value(0)] uint32 reserved1;
                [range(0,0x100000)] uint32 count;
-               uint32 u3;
-               [size_is(count)] drsuapi_DsReplicaCoursor coursors[];
-       } drsuapi_DsReplicaCoursorCtrEx;
+               [value(0)] uint32 reserved2;
+               [size_is(count)] drsuapi_DsReplicaCursor cursors[];
+       } drsuapi_DsReplicaCursorCtrEx;
 
        typedef [public] bitmap {
                /* the _WRITEABLE flag indicates a replication with all attributes
@@ -229,17 +246,48 @@ interface drsuapi
                DRSUAPI_DS_REPLICA_NEIGHBOUR_PARTIAL_ATTRIBUTE_SET              = 0x40000000
        } drsuapi_DsReplicaNeighbourFlags;
 
+       typedef [flag(NDR_PAHEX),v1_enum] enum {
+               DRSUAPI_EXOP_NONE                               = 0x00000000,
+               DRSUAPI_EXOP_FSMO_REQ_ROLE                      = 0x00000001,
+               DRSUAPI_EXOP_FSMO_RID_ALLOC                     = 0x00000002,
+               DRSUAPI_EXOP_FSMO_RID_REQ_ROLE                  = 0x00000003,
+               DRSUAPI_EXOP_FSMO_REQ_PDC                       = 0x00000004,
+               DRSUAPI_EXOP_FSMO_ABANDON_ROLE                  = 0x00000005,
+               DRSUAPI_EXOP_REPL_OBJ                           = 0x00000006,
+               DRSUAPI_EXOP_REPL_SECRET                        = 0x00000007
+       } drsuapi_DsExtendedOperation;
+
+       typedef [flag(NDR_PAHEX),v1_enum] enum {
+               DRSUAPI_EXOP_ERR_NONE                           = 0x00000000,
+               DRSUAPI_EXOP_ERR_SUCCESS                        = 0x00000001,
+               DRSUAPI_EXOP_ERR_UNKNOWN_OP                     = 0x00000002,
+               DRSUAPI_EXOP_ERR_FSMO_NOT_OWNER                 = 0x00000003,
+               DRSUAPI_EXOP_ERR_UPDATE_ERR                     = 0x00000004,
+               DRSUAPI_EXOP_ERR_EXCEPTION                      = 0x00000005,
+               DRSUAPI_EXOP_ERR_UNKNOWN_CALLER                 = 0x00000006,
+               DRSUAPI_EXOP_ERR_RID_ALLOC                      = 0x00000007,
+               DRSUAPI_EXOP_ERR_FSMO_OWNER_DELETED             = 0x00000008,
+               DRSUAPI_EXOP_ERR_FMSO_PENDING_OP                = 0x00000009,
+               DRSUAPI_EXOP_ERR_MISMATCH                       = 0x0000000A,
+               DRSUAPI_EXOP_ERR_COULDNT_CONTACT                = 0x0000000B,
+               DRSUAPI_EXOP_ERR_FSMO_REFUSING_ROLES            = 0x0000000C,
+               DRSUAPI_EXOP_ERR_DIR_ERROR                      = 0x0000000D,
+               DRSUAPI_EXOP_ERR_FSMO_MISSING_SETTINGS          = 0x0000000E,
+               DRSUAPI_EXOP_ERR_ACCESS_DENIED                  = 0x0000000F,
+               DRSUAPI_EXOP_ERR_PARAM_ERROR                    = 0x00000010
+       } drsuapi_DsExtendedError;
+
        typedef struct {
                GUID destination_dsa_guid;
                GUID source_dsa_invocation_id; /* the 'invocationId' field of the CN=NTDS Settings object */
                [ref] drsuapi_DsReplicaObjectIdentifier *naming_context;
                drsuapi_DsReplicaHighWaterMark highwatermark;
-               drsuapi_DsReplicaCoursorCtrEx *uptodateness_vector;
+               drsuapi_DsReplicaCursorCtrEx *uptodateness_vector;
                drsuapi_DsReplicaNeighbourFlags replica_flags;
                uint32 max_object_count; /* w2k3 uses min(133,max(100,max_object_count)) */
                uint32 max_ndr_size; /* w2k3 seems to ignore this */
-               uint32 unknown4;
-               hyper h1;
+               drsuapi_DsExtendedOperation extended_op;
+               hyper fsmo_info;
        } drsuapi_DsGetNCChangesRequest5;
 
        /*
@@ -327,7 +375,7 @@ interface drsuapi
         * 2.5.5.17     => dom_sid
         */
        typedef [nopush,nopull] struct {
-               [range(0,10000),value(ndr_size_drsuapi_DsReplicaOID_oid(r->oid, 0))] uint32 __ndr_size;
+               [range(0,10000),value(ndr_size_drsuapi_DsReplicaOID_oid(oid, 0))] uint32 __ndr_size;
                [size_is(__ndr_size),charset(DOS)] uint8 *oid; /* it's encoded with asn1_write_OID_String() */
        } drsuapi_DsReplicaOID;
 
@@ -336,7 +384,7 @@ interface drsuapi
                drsuapi_DsReplicaOID oid;
        } drsuapi_DsReplicaOIDMapping;
 
-       typedef struct {
+       typedef [public] struct {
                [range(0,0x100000)] uint32 num_mappings;
                [size_is(num_mappings)] drsuapi_DsReplicaOIDMapping *mappings;
        } drsuapi_DsReplicaOIDMapping_Ctr;
@@ -371,10 +419,17 @@ interface drsuapi
                DRSUAPI_ATTRIBUTE_searchFlags                   = 0x0002014e,
                DRSUAPI_ATTRIBUTE_lDAPDisplayName               = 0x000201cc,
                DRSUAPI_ATTRIBUTE_name                          = 0x00090001,
+               DRSUAPI_ATTRIBUTE_userAccountControl            = 0x00090008,
                DRSUAPI_ATTRIBUTE_currentValue                  = 0x0009001b,
+               DRSUAPI_ATTRIBUTE_homeDirectory                 = 0x0009002c,
+               DRSUAPI_ATTRIBUTE_homeDrive                     = 0x0009002d,
+               DRSUAPI_ATTRIBUTE_scriptPath                    = 0x0009003e,
+               DRSUAPI_ATTRIBUTE_profilePath                   = 0x0009008b,
                DRSUAPI_ATTRIBUTE_objectSid                     = 0x00090092,
                DRSUAPI_ATTRIBUTE_schemaIDGUID                  = 0x00090094,
                DRSUAPI_ATTRIBUTE_dBCSPwd                       = 0x00090037,/* lmPwdHash */
+               DRSUAPI_ATTRIBUTE_logonHours                    = 0x00090040,
+               DRSUAPI_ATTRIBUTE_userWorkstations              = 0x00090056,
                DRSUAPI_ATTRIBUTE_unicodePwd                    = 0x0009005a,/* ntPwdHash */
                DRSUAPI_ATTRIBUTE_ntPwdHistory                  = 0x0009005e,
                DRSUAPI_ATTRIBUTE_priorValue                    = 0x00090064,
@@ -383,6 +438,7 @@ interface drsuapi
                DRSUAPI_ATTRIBUTE_trustAuthOutgoing             = 0x00090087,
                DRSUAPI_ATTRIBUTE_lmPwdHistory                  = 0x000900a0,
                DRSUAPI_ATTRIBUTE_sAMAccountName                = 0x000900dd,
+               DRSUAPI_ATTRIBUTE_sAMAccountType                = 0x0009012e,
                DRSUAPI_ATTRIBUTE_fSMORoleOwner                 = 0x00090171,
                DRSUAPI_ATTRIBUTE_systemFlags                   = 0x00090177,
                DRSUAPI_ATTRIBUTE_serverReference               = 0x00090203,
@@ -390,7 +446,11 @@ interface drsuapi
                DRSUAPI_ATTRIBUTE_initialAuthIncoming           = 0x0009021b,
                DRSUAPI_ATTRIBUTE_initialAuthOutgoing           = 0x0009021c,
                DRSUAPI_ATTRIBUTE_wellKnownObjects              = 0x0009026a,
+               DRSUAPI_ATTRIBUTE_dNSHostName                   = 0x0009026b,
                DRSUAPI_ATTRIBUTE_isMemberOfPartialAttributeSet = 0x0009027f,
+               DRSUAPI_ATTRIBUTE_userPrincipalName             = 0x00090290,
+               DRSUAPI_ATTRIBUTE_groupType                     = 0x000902ee,
+               DRSUAPI_ATTRIBUTE_servicePrincipalName          = 0x00090303,
                DRSUAPI_ATTRIBUTE_objectCategory                = 0x0009030e,
                DRSUAPI_ATTRIBUTE_gPLink                        = 0x0009037b,
                DRSUAPI_ATTRIBUTE_msDS_Behavior_Version         = 0x000905b3,
@@ -399,19 +459,26 @@ interface drsuapi
                DRSUAPI_ATTRIBUTE_msDS_hasMasterNCs             = 0x0009072c
        } drsuapi_DsAttributeId;
 
+       typedef struct {
+               [value(1)] uint32 version;
+               [value(0)] uint32 reserved1;
+               [range(1,0x100000)] uint32 num_attids;
+               [size_is(num_attids)] drsuapi_DsAttributeId attids[];
+       } drsuapi_DsPartialAttributeSet;
+
        typedef struct {
                GUID destination_dsa_guid;
                GUID source_dsa_invocation_id; /* the 'invocationId' field of the CN=NTDS Settings object */
                [ref] drsuapi_DsReplicaObjectIdentifier *naming_context;
                drsuapi_DsReplicaHighWaterMark highwatermark;
-               drsuapi_DsReplicaCoursorCtrEx *uptodateness_vector;
+               drsuapi_DsReplicaCursorCtrEx *uptodateness_vector;
                drsuapi_DsReplicaNeighbourFlags replica_flags;
                uint32 max_object_count; /* w2k3 uses min(133,max(100,max_object_count)) */
                uint32 max_ndr_size; /* w2k3 seems to ignore this */
-               uint32 unknown4;
-               hyper h1;
-               uint32 unique_ptr1;
-               uint32 unique_ptr2;
+               drsuapi_DsExtendedOperation extended_op;
+               hyper fsmo_info;
+               drsuapi_DsPartialAttributeSet *partial_attribute_set;
+               drsuapi_DsPartialAttributeSet *partial_attribute_set_ex;
                drsuapi_DsReplicaOIDMapping_Ctr mapping_ctr;
        } drsuapi_DsGetNCChangesRequest8;
 
@@ -424,185 +491,51 @@ interface drsuapi
                GUID source_dsa_invocation_id; /* the 'invocationId' field of the CN=NTDS Settings object */
                hyper highest_usn;  /* updated after a full replication cycle */
                NTTIME last_sync_success;
-       } drsuapi_DsReplicaCoursor2;
+       } drsuapi_DsReplicaCursor2;
 
        typedef struct {
-               uint32 u1;
-               uint32 u2;
+               [value(2)] uint32 version;
+               [value(0)] uint32 reserved1;
                [range(0,0x100000)] uint32 count;
-               uint32 u3;
-               [size_is(count)] drsuapi_DsReplicaCoursor2 coursors[];
-       } drsuapi_DsReplicaCoursor2CtrEx;
+               [value(0)] uint32 reserved2;
+               [size_is(count)] drsuapi_DsReplicaCursor2 cursors[];
+       } drsuapi_DsReplicaCursor2CtrEx;
 
        /* Generic DATA_BLOB values */
        typedef struct {
-               [range(0,10485760)] uint32 length;
-               DATA_BLOB *data;
-       } drsuapi_DsAttributeValueDataBlob;
-
-       typedef struct {
-               [range(0,10485760)] uint32 num_values;
-               [size_is(num_values)] drsuapi_DsAttributeValueDataBlob *values;
-       } drsuapi_DsAttributeValueCtrDataBlob;
-
-       /* objectClass values */
-       typedef struct {
-               [range(0,10485760),value(4)] uint32 __ndr_size;
-               [subcontext(4)] drsuapi_DsObjectClassId *objectClassId;
-       } drsuapi_DsAttributeValueObjectClassId;
-
-       typedef struct {
-               [range(0,10485760)] uint32 num_values;
-               [size_is(num_values)] drsuapi_DsAttributeValueObjectClassId *values;
-       } drsuapi_DsAttributeValueCtrObjectClassId;
-
-       /* uint32 values */
-       typedef struct {
-               [range(0,10485760),value(4)] uint32 __ndr_size;
-               [subcontext(4)] uint32 *value;
-       } drsuapi_DsAttributeValueUINT32;
-
-       typedef struct {
-               [range(0,10485760)] uint32 num_values;
-               [size_is(num_values)] drsuapi_DsAttributeValueUINT32 *values;
-       } drsuapi_DsAttributeValueCtrUINT32;
-
-       /* UnicodeString values */
-       typedef struct {
-               [range(0,10485760)] uint32 length;
-               [subcontext(4)] nstring *string;
-       } drsuapi_DsAttributeValueUnicodeString;
+               [range(0,10485760),value(ndr_size_DATA_BLOB(0,blob,0))] uint32 __ndr_size;
+               DATA_BLOB *blob;
+       } drsuapi_DsAttributeValue;
 
        typedef struct {
                [range(0,10485760)] uint32 num_values;
-               [size_is(num_values)] drsuapi_DsAttributeValueUnicodeString *values;
-       } drsuapi_DsAttributeValueCtrUnicodeString;
+               [size_is(num_values)] drsuapi_DsAttributeValue *values;
+       } drsuapi_DsAttributeValueCtr;
 
        /* DN String values */
        typedef [public,gensize] struct {
                [value(ndr_size_drsuapi_DsReplicaObjectIdentifier3(r, ndr->flags))] uint32 __ndr_size;
-               [value(ndr_size_dom_sid28(&r->sid,ndr->flags))]  uint32 __ndr_size_sid;
+               [value(ndr_size_dom_sid28(&sid,ndr->flags))]  uint32 __ndr_size_sid;
                GUID guid;
                dom_sid28 sid;
-               [flag(STR_SIZE4|STR_CHARLEN)] string dn;
+               [value(strlen_m(dn))] uint32 __ndr_size_dn;
+               [charset(UTF16)] uint16 dn[__ndr_size_dn+1];
        } drsuapi_DsReplicaObjectIdentifier3;
 
-       typedef struct {
-               [range(0,10485760),value(ndr_size_drsuapi_DsReplicaObjectIdentifier3(object, ndr->flags))] uint32 __ndr_size;
-               [subcontext(4),subcontext_size(__ndr_size)] drsuapi_DsReplicaObjectIdentifier3 *object;
-       } drsuapi_DsAttributeValueDNString;
-
-       typedef struct {
-               [range(0,10485760)] uint32 num_values;
-               [size_is(num_values)] drsuapi_DsAttributeValueDNString *values;
-       } drsuapi_DsAttributeValueCtrDNString;
-
-       /* GUID values */
-       typedef struct {
-               [range(0,10485760),value(ndr_size_GUID(guid, ndr->flags))] uint32 __ndr_size;
-               [subcontext(4)] GUID *guid;
-       } drsuapi_DsAttributeValueGUID;
-
-       typedef struct {
-               [range(0,10485760)] uint32 num_values;
-               [size_is(num_values)] drsuapi_DsAttributeValueGUID *values;
-       } drsuapi_DsAttributeValueCtrGUID;
-
-       /* SID values */
-       typedef struct {
-               [range(0,10485760),value(ndr_size_dom_sid(sid,ndr->flags))] uint32 __ndr_size;
-               [subcontext(4)] dom_sid *sid;
-       } drsuapi_DsAttributeValueSID;
-
-       typedef struct {
-               [range(0,10485760)] uint32 num_values;
-               [size_is(num_values)] drsuapi_DsAttributeValueSID *values;
-       } drsuapi_DsAttributeValueCtrSID;
-
-       /* SecurityDescriptor values */
-       typedef struct {
-               [range(0,10485760),value(ndr_size_security_descriptor(sd,ndr->flags))] uint32 __ndr_size;
-               [subcontext(4)] security_descriptor *sd;
-       } drsuapi_DsAttributeValueSecurityDescriptor;
-
-       typedef struct {
-               [range(0,10485760)] uint32 num_values;
-               [size_is(num_values)] drsuapi_DsAttributeValueSecurityDescriptor *values;
-       } drsuapi_DsAttributeValueCtrSecurityDescriptor;
-
-       /* NTTIME_1sec values */
-       typedef struct {
-               [range(0,10485760),value(8)] uint32 __ndr_size;
-               [subcontext(4)] NTTIME_1sec *time;
-       } drsuapi_DsAttributeValueNTTIME_1sec;
-
-       typedef struct {
-               [range(0,10485760)] uint32 num_values;
-               [size_is(num_values)] drsuapi_DsAttributeValueNTTIME_1sec *values;
-       } drsuapi_DsAttributeValueCtrNTTIME_1sec;
-
-       typedef [nodiscriminant] union {
-               [case(DRSUAPI_ATTRIBUTE_objectClass)] drsuapi_DsAttributeValueCtrObjectClassId object_class_id;
-               [case(DRSUAPI_ATTRIBUTE_governsID)]             drsuapi_DsAttributeValueCtrUINT32 oid;
-               [case(DRSUAPI_ATTRIBUTE_attributeID)]           drsuapi_DsAttributeValueCtrUINT32 oid;
-               [case(DRSUAPI_ATTRIBUTE_attributeSyntax)]       drsuapi_DsAttributeValueCtrUINT32 oid;
-
-               /* BOOL */
-               [case(DRSUAPI_ATTRIBUTE_isSingleValued)]        drsuapi_DsAttributeValueCtrUINT32 boolean;
-               [case(DRSUAPI_ATTRIBUTE_showInAdvancedViewOnly)] drsuapi_DsAttributeValueCtrUINT32 boolean;
-               [case(DRSUAPI_ATTRIBUTE_isMemberOfPartialAttributeSet)] drsuapi_DsAttributeValueCtrUINT32 boolean;
-
-               /* UINT32 */
-               [case(DRSUAPI_ATTRIBUTE_instanceType)]          drsuapi_DsAttributeValueCtrUINT32 uint32;
-               [case(DRSUAPI_ATTRIBUTE_rangeLower)]            drsuapi_DsAttributeValueCtrUINT32 uint32;
-               [case(DRSUAPI_ATTRIBUTE_rangeUpper)]            drsuapi_DsAttributeValueCtrUINT32 uint32;
-               [case(DRSUAPI_ATTRIBUTE_objectVersion)]         drsuapi_DsAttributeValueCtrUINT32 uint32;
-               [case(DRSUAPI_ATTRIBUTE_oMSyntax)]              drsuapi_DsAttributeValueCtrUINT32 uint32;
-               [case(DRSUAPI_ATTRIBUTE_searchFlags)]           drsuapi_DsAttributeValueCtrUINT32 uint32;
-               [case(DRSUAPI_ATTRIBUTE_systemFlags)]           drsuapi_DsAttributeValueCtrUINT32 uint32;
-               [case(DRSUAPI_ATTRIBUTE_msDS_Behavior_Version)] drsuapi_DsAttributeValueCtrUINT32 uint32;
-
-               /* GUID */
-               [case(DRSUAPI_ATTRIBUTE_invocationId)] drsuapi_DsAttributeValueCtrGUID guid;
-               [case(DRSUAPI_ATTRIBUTE_schemaIDGUID)] drsuapi_DsAttributeValueCtrGUID guid;
-
-               /* SID */
-               [case(DRSUAPI_ATTRIBUTE_objectSid)] drsuapi_DsAttributeValueCtrSID sid;
-
-               /* SecurityDescriptor */
-               [case(DRSUAPI_ATTRIBUTE_ntSecurityDescriptor)] drsuapi_DsAttributeValueCtrSecurityDescriptor security_descriptor;
-
-               /* UnicodeString */
-               [case(DRSUAPI_ATTRIBUTE_description)]           drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
-               [case(DRSUAPI_ATTRIBUTE_adminDisplayName)]      drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
-               [case(DRSUAPI_ATTRIBUTE_adminDescription)]      drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
-               [case(DRSUAPI_ATTRIBUTE_lDAPDisplayName)]       drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
-               [case(DRSUAPI_ATTRIBUTE_name)]                  drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
-               [case(DRSUAPI_ATTRIBUTE_sAMAccountName)]        drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
-               [case(DRSUAPI_ATTRIBUTE_gPLink)]                drsuapi_DsAttributeValueCtrUnicodeString unicode_string;
-
-               /* DN String */
-               [case(DRSUAPI_ATTRIBUTE_member)]                drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_objectCategory)]        drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_hasMasterNCs)]          drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_dMDLocation)]           drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_fSMORoleOwner)]         drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_wellKnownObjects)]      drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_serverReference)]       drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_serverReferenceBL)]     drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_msDS_HasDomainNCs)]     drsuapi_DsAttributeValueCtrDNString dn_string;
-               [case(DRSUAPI_ATTRIBUTE_msDS_hasMasterNCs)]     drsuapi_DsAttributeValueCtrDNString dn_string;
-
-               /* NTTIME_1sec */
-               [case(DRSUAPI_ATTRIBUTE_whenCreated)] drsuapi_DsAttributeValueCtrNTTIME_1sec nttime_1sec;
-
-               /* the default is the DATA_BLOB */
-               [default] drsuapi_DsAttributeValueCtrDataBlob data_blob;
-       } drsuapi_DsReplicaAttributeValueCtr;
+       typedef [public,gensize] struct {
+               [value(ndr_size_drsuapi_DsReplicaObjectIdentifier3Binary(r, ndr->flags))] uint32 __ndr_size;
+               [value(ndr_size_dom_sid28(&sid,ndr->flags))]  uint32 __ndr_size_sid;
+               GUID guid;
+               dom_sid28 sid;
+               [value(strlen_m(dn))] uint32 __ndr_size_dn;
+               [charset(UTF16)] uint16 dn[__ndr_size_dn+1];
+               [value(binary.length + 4)] uint32 __ndr_size_binary;
+               [flag(NDR_REMAINING)] DATA_BLOB binary;
+       } drsuapi_DsReplicaObjectIdentifier3Binary;
 
-       typedef struct {
+       typedef [public] struct {
                drsuapi_DsAttributeId attid;
-               [switch_is(attid)] drsuapi_DsReplicaAttributeValueCtr value_ctr;
+               drsuapi_DsAttributeValueCtr value_ctr;
        } drsuapi_DsReplicaAttribute;
 
        typedef struct {
@@ -610,17 +543,23 @@ interface drsuapi
                [size_is(num_attributes)]  drsuapi_DsReplicaAttribute *attributes;
        } drsuapi_DsReplicaAttributeCtr;
 
+       typedef [public] bitmap {
+               DRSUAPI_DS_REPLICA_OBJECT_FROM_MASTER   = 0x00000001,
+               DRSUAPI_DS_REPLICA_OBJECT_DYNAMIC       = 0x00000002,
+               DRSUAPI_DS_REPLICA_OBJECT_REMOTE_MODIFY = 0x00010000
+       } drsuapi_DsReplicaObjectFlags;
+
        typedef [public] struct {
                drsuapi_DsReplicaObjectIdentifier *identifier;
-               uint32 unknown1;
+               drsuapi_DsReplicaObjectFlags flags;
                drsuapi_DsReplicaAttributeCtr attribute_ctr;
        } drsuapi_DsReplicaObject;
 
        typedef struct {
                uint32 version;
-               NTTIME_1sec orginating_time;
-               GUID orginating_invocation_id;
-               hyper orginating_usn;
+               NTTIME_1sec originating_change_time;
+               GUID originating_invocation_id;
+               hyper originating_usn;
        } drsuapi_DsReplicaMetaData;
 
        typedef [public] struct {
@@ -631,7 +570,7 @@ interface drsuapi
        typedef [public,noprint] struct {
                drsuapi_DsReplicaObjectListItemEx *next_object;
                drsuapi_DsReplicaObject object;
-               uint32 unknown1;
+               boolean32 is_nc_prefix;
                GUID *parent_object_guid;
                drsuapi_DsReplicaMetaDataCtr *meta_data_ctr;
        } drsuapi_DsReplicaObjectListItemEx;
@@ -642,25 +581,30 @@ interface drsuapi
                drsuapi_DsReplicaObjectIdentifier *naming_context;
                drsuapi_DsReplicaHighWaterMark old_highwatermark;
                drsuapi_DsReplicaHighWaterMark new_highwatermark;
-               drsuapi_DsReplicaCoursorCtrEx *uptodateness_vector;
+               drsuapi_DsReplicaCursorCtrEx *uptodateness_vector;
                drsuapi_DsReplicaOIDMapping_Ctr mapping_ctr;
-               uint32 total_object_count;
+               drsuapi_DsExtendedError extended_ret; /* w2k sends the nc_object_count value here */
                uint32 object_count;
                /* this +55 is sometimes +56, so I don't know where this comes from... --metze */
                [value(ndr_size_drsuapi_DsGetNCChangesCtr1(r,ndr->flags)+55)] uint32 __ndr_size;
                drsuapi_DsReplicaObjectListItemEx *first_object;
-               uint32 unknown4;
+               boolean32 more_data;
        } drsuapi_DsGetNCChangesCtr1;
 
-       typedef struct {
-               drsuapi_DsReplicaObjectIdentifier *dn;
+       /*
+        * if the DRSUAPI_DS_LINKED_ATTRIBUTE_FLAG_ACTIVE flag
+        * isn't there it means the value is deleted
+        */
+       typedef [public] bitmap {
+               DRSUAPI_DS_LINKED_ATTRIBUTE_FLAG_ACTIVE = 0x00000001
+       } drsuapi_DsLinkedAttributeFlags;
+
+       typedef [public] struct {
+               drsuapi_DsReplicaObjectIdentifier *identifier;
                drsuapi_DsAttributeId attid;
-               /* this dn_string, depends on the attid, maybe could be another
-                * attribute syntax
-                */
-               drsuapi_DsAttributeValueDNString dn_string;
-               uint32 u1;
-               NTTIME_1sec time1;
+               drsuapi_DsAttributeValue value;
+               drsuapi_DsLinkedAttributeFlags flags;
+               NTTIME_1sec originating_add_time;
                drsuapi_DsReplicaMetaData meta_data;
        } drsuapi_DsReplicaLinkedAttribute;
 
@@ -670,51 +614,59 @@ interface drsuapi
                drsuapi_DsReplicaObjectIdentifier *naming_context;
                drsuapi_DsReplicaHighWaterMark old_highwatermark;
                drsuapi_DsReplicaHighWaterMark new_highwatermark;
-               drsuapi_DsReplicaCoursor2CtrEx *uptodateness_vector;
+               drsuapi_DsReplicaCursor2CtrEx *uptodateness_vector;
                drsuapi_DsReplicaOIDMapping_Ctr mapping_ctr;
-               uint32 total_object_count;
+               drsuapi_DsExtendedError extended_ret;
                uint32 object_count;
                /* this +55 is sometimes +56, so I don't know where this comes from... --metze */
                [value(ndr_size_drsuapi_DsGetNCChangesCtr6(r,ndr->flags)+55)] uint32 __ndr_size;
                drsuapi_DsReplicaObjectListItemEx *first_object;
-               uint32 unknown4;
-               uint32 unknown5;
-               uint32 unknown6;
+               boolean32 more_data;
+               uint32 nc_object_count; /* estimated amount of objects in the whole NC */
+               uint32 nc_linked_attributes_count;  /* estimated amount of linked values in the whole NC */
                [range(0,1048576)] uint32 linked_attributes_count;
                [size_is(linked_attributes_count)] drsuapi_DsReplicaLinkedAttribute *linked_attributes;
-               uint32 unknown7;
+               WERROR drs_error;
        } drsuapi_DsGetNCChangesCtr6;
 
-       typedef struct {
+       typedef [public] struct {
+               [subcontext(0xFFFFFC01)] drsuapi_DsGetNCChangesCtr1 ctr1;
+       } drsuapi_DsGetNCChangesCtr1TS;
+
+       typedef [public] struct {
+               [subcontext(0xFFFFFC01)] drsuapi_DsGetNCChangesCtr6 ctr6;
+       } drsuapi_DsGetNCChangesCtr6TS;
+
+       typedef [nopush] struct {
                uint32 decompressed_length;
                uint32 compressed_length;
-               [subcontext(4),subcontext_size(r->compressed_length),
+               [subcontext(4),subcontext_size(compressed_length),
                 compression(NDR_COMPRESSION_MSZIP,compressed_length,decompressed_length)]
-                drsuapi_DsGetNCChangesCtr1 *ctr1;
+                drsuapi_DsGetNCChangesCtr1TS *ts;
        } drsuapi_DsGetNCChangesMSZIPCtr1;
 
-       typedef struct {
+       typedef [nopush] struct {
                uint32 decompressed_length;
                uint32 compressed_length;
-               [subcontext(4),subcontext_size(r->compressed_length),
+               [subcontext(4),subcontext_size(compressed_length),
                 compression(NDR_COMPRESSION_MSZIP,compressed_length,decompressed_length)]
-                drsuapi_DsGetNCChangesCtr6 *ctr6;
+                drsuapi_DsGetNCChangesCtr6TS *ts;
        } drsuapi_DsGetNCChangesMSZIPCtr6;
 
-       typedef struct {
+       typedef [nopush] struct {
                uint32 decompressed_length;
                uint32 compressed_length;
-               [subcontext(4),subcontext_size(r->compressed_length),
-                compression(NDR_COMPRESSION_XPRESS,compressed_length,decompressed_length),
-                flag(NDR_REMAINING)] DATA_BLOB *decompressed;
+               [subcontext(4),subcontext_size(compressed_length),
+                compression(NDR_COMPRESSION_XPRESS,compressed_length,decompressed_length)]
+                drsuapi_DsGetNCChangesCtr1TS *ts;
        } drsuapi_DsGetNCChangesXPRESSCtr1;
 
-       typedef struct {
+       typedef [nopush] struct {
                uint32 decompressed_length;
                uint32 compressed_length;
-               [subcontext(4),subcontext_size(r->compressed_length),
-                compression(NDR_COMPRESSION_XPRESS,compressed_length,decompressed_length),
-                flag(NDR_REMAINING)] DATA_BLOB *decompressed;
+               [subcontext(4),subcontext_size(compressed_length),
+                compression(NDR_COMPRESSION_XPRESS,compressed_length,decompressed_length)]
+                drsuapi_DsGetNCChangesCtr6TS *ts;
        } drsuapi_DsGetNCChangesXPRESSCtr6;
 
        typedef [enum16bit] enum {
@@ -730,13 +682,7 @@ interface drsuapi
        } drsuapi_DsGetNCChangesCompressedCtr;
 
        typedef struct {
-               /* 
-                * this is a bit ugly, as the compression depends on the flags
-                * in the DsBind(), but only w2k uses DsGetNCChangesReq5
-                * and will get DsGetNCChangesCtr2 replies, and w2k only knowns
-                * about MSZIP and level 1 replies
-                */
-               [switch_is(1|(DRSUAPI_COMPRESSION_TYPE_MSZIP<<16))] drsuapi_DsGetNCChangesCompressedCtr ctr;
+               drsuapi_DsGetNCChangesMSZIPCtr1 mszip1;
        } drsuapi_DsGetNCChangesCtr2;
 
        typedef struct {
@@ -754,9 +700,9 @@ interface drsuapi
 
        WERROR drsuapi_DsGetNCChanges(
                [in] policy_handle *bind_handle,
-               [in,out] int32 level,
-               [in,switch_is(level)] drsuapi_DsGetNCChangesRequest req,
-               [out,switch_is(level)] drsuapi_DsGetNCChangesCtr ctr
+               [in,out,ref] int32 *level,
+               [in,switch_is(*level)] drsuapi_DsGetNCChangesRequest req,
+               [out,switch_is(*level)] drsuapi_DsGetNCChangesCtr ctr
                );
 
        /*****************/
@@ -794,7 +740,7 @@ interface drsuapi
                /* TODO ... */
        } drsuapi_DsReplicaAddOptions;
 
-       WERROR DRSUAPI_REPLICA_ADD();
+       [todo] WERROR DRSUAPI_REPLICA_ADD();
 
        /*****************/
         /* Function 0x06 */
@@ -804,7 +750,7 @@ interface drsuapi
                /* TODO ... */
        } drsuapi_DsReplicaDeleteOptions;
 
-       WERROR DRSUAPI_REPLICA_DEL();
+       [todo] WERROR DRSUAPI_REPLICA_DEL();
 
        /*****************/
         /* Function 0x07 */
@@ -813,11 +759,11 @@ interface drsuapi
                DRSUAPI_DS_REPLICA_MODIFY_WRITEABLE                     = 0x00000002
        } drsuapi_DsReplicaModifyOptions;
 
-       WERROR DRSUAPI_REPLICA_MODIFY();
+       [todo] WERROR DRSUAPI_REPLICA_MODIFY();
 
        /*****************/
         /* Function 0x08 */
-       WERROR DRSUAPI_VERIFY_NAMES();
+       [todo] WERROR DRSUAPI_VERIFY_NAMES();
 
        /*****************/
         /* Function 0x09 */
@@ -860,20 +806,56 @@ interface drsuapi
                [case(1)] drsuapi_DsGetMembershipsRequest1 req1;
        } drsuapi_DsGetMembershipsRequest;
 
-       WERROR drsuapi_DsGetMemberships(
+       [todo] WERROR drsuapi_DsGetMemberships(
                [in] policy_handle *bind_handle,
-               [in,out] int32 level,
-               [in] [switch_is(level)] drsuapi_DsGetMembershipsRequest req,
-               [out] [switch_is(level)] drsuapi_DsGetMembershipsCtr ctr
+               [in] int32 level,
+               [in,ref] [switch_is(level)] drsuapi_DsGetMembershipsRequest *req,
+               [out,ref] int32 *level_out,
+               [out,ref] [switch_is(*level_out)] drsuapi_DsGetMembershipsCtr *ctr
                );
 
        /*****************/
         /* Function 0x0a */
-       WERROR DRSUAPI_INTER_DOMAIN_MOVE();
+       [todo] WERROR DRSUAPI_INTER_DOMAIN_MOVE();
 
        /*****************/
         /* Function 0x0b */
-       WERROR DRSUAPI_GET_NT4_CHANGELOG();
+       typedef struct {
+               uint32 unknown1;
+               uint32 unknown2;
+               [range(0,0x00A00000)] uint32 length;
+               [size_is(length)] uint8 *data;
+       } drsuapi_DsGetNT4ChangeLogRequest1;
+
+       typedef [switch_type(uint32)] union {
+               [case(1)] drsuapi_DsGetNT4ChangeLogRequest1 req1;
+       } drsuapi_DsGetNT4ChangeLogRequest;
+
+       typedef struct {
+               [range(0,0x00A00000)] uint32 length1;
+               [range(0,0x00A00000)] uint32 length2;
+               hyper unknown1;
+               NTTIME time2;
+               hyper unknown3;
+               NTTIME time4;
+               hyper unknown5;
+               NTTIME time6;
+               NTSTATUS status;
+               [size_is(length1)] uint8 *data1;
+               [size_is(length2)] uint8 *data2;
+       } drsuapi_DsGetNT4ChangeLogInfo1;
+
+       typedef [switch_type(uint32)] union {
+               [case(1)] drsuapi_DsGetNT4ChangeLogInfo1 info1;
+       } drsuapi_DsGetNT4ChangeLogInfo;
+
+       [todo] WERROR drsuapi_DsGetNT4ChangeLog(
+               [in] policy_handle *bind_handle,
+               [in] uint32 level,
+               [in,ref] [switch_is(level)] drsuapi_DsGetNT4ChangeLogRequest *req,
+               [out,ref] uint32 *level_out,
+               [out,ref] [switch_is(*level_out)] drsuapi_DsGetNT4ChangeLogInfo *info
+               );
 
        /*****************/
        /* Function 0x0c */
@@ -897,7 +879,7 @@ interface drsuapi
        } drsuapi_DsNameFlags;
 
        typedef [v1_enum] enum {
-               DRSUAPI_DS_NAME_FORMAT_UKNOWN                   = 0,
+               DRSUAPI_DS_NAME_FORMAT_UNKNOWN                  = 0,
                DRSUAPI_DS_NAME_FORMAT_FQDN_1779                = 1,
                DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT              = 2,
                DRSUAPI_DS_NAME_FORMAT_DISPLAY                  = 3,
@@ -915,8 +897,8 @@ interface drsuapi
        } drsuapi_DsNameString;
 
        typedef struct {
-               uint32 unknown1; /* 0x000004e4 */
-               uint32 unknown2; /* 0x00000407 */
+               uint32 codepage; /* 0x000004e4 - 1252 is german codepage*/
+               uint32 language; /* 0x00000407 - german language ID*/
                drsuapi_DsNameFlags format_flags;
                drsuapi_DsNameFormat format_offered;
                drsuapi_DsNameFormat format_desired;
@@ -980,9 +962,10 @@ interface drsuapi
 
        WERROR drsuapi_DsWriteAccountSpn(
                [in] policy_handle *bind_handle,
-               [in,out] int32 level,
-               [in,switch_is(level)] drsuapi_DsWriteAccountSpnRequest req,
-               [out,switch_is(level)] drsuapi_DsWriteAccountSpnResult res
+               [in] int32 level,
+               [in,ref,switch_is(level)] drsuapi_DsWriteAccountSpnRequest *req,
+               [out,ref] int32 *level_out,
+               [out,ref,switch_is(*level_out)] drsuapi_DsWriteAccountSpnResult *res
                );
 
        /*****************/
@@ -990,7 +973,7 @@ interface drsuapi
        typedef struct {
                [charset(UTF16),string] uint16 *server_dn;
                [charset(UTF16),string] uint16 *domain_dn;
-               uint32 unknown; /* 0x000000001 */
+               boolean32 commit;
        } drsuapi_DsRemoveDSServerRequest1;
 
        typedef [switch_type(int32)] union {
@@ -998,7 +981,7 @@ interface drsuapi
        } drsuapi_DsRemoveDSServerRequest;
 
        typedef struct {
-               WERROR status;
+               boolean32 last_dc_in_domain;
        } drsuapi_DsRemoveDSServerResult1;
 
        typedef [switch_type(int32)] union {
@@ -1007,14 +990,15 @@ interface drsuapi
 
        WERROR drsuapi_DsRemoveDSServer(
                [in] policy_handle *bind_handle,
-               [in,out] int32 level,
-               [in,switch_is(level)] drsuapi_DsRemoveDSServerRequest req,
-               [out,switch_is(level)] drsuapi_DsRemoveDSServerResult res
+               [in] int32 level,
+               [in,ref,switch_is(level)] drsuapi_DsRemoveDSServerRequest *req,
+               [out,ref] int32 *level_out,
+               [out,ref,switch_is(*level_out)] drsuapi_DsRemoveDSServerResult *res
                );
 
        /*****************/
         /* Function 0x0f */
-       WERROR DRSUAPI_REMOVE_DS_DOMAIN();
+       [todo] WERROR DRSUAPI_REMOVE_DS_DOMAIN();
 
        /*****************/
         /* Function 0x10 */
@@ -1065,30 +1049,68 @@ interface drsuapi
        } drsuapi_DsGetDCInfoCtr2;
 
        typedef struct {
-               uint32 unknown1;
+               [charset(UTF16),string] uint16 *netbios_name;
+               [charset(UTF16),string] uint16 *dns_name;
+               [charset(UTF16),string] uint16 *site_name;
+               [charset(UTF16),string] uint16 *site_dn;
+               [charset(UTF16),string] uint16 *computer_dn;
+               [charset(UTF16),string] uint16 *server_dn;
+               [charset(UTF16),string] uint16 *ntds_dn;
+               uint32 is_pdc;
+               uint32 is_enabled;
+               uint32 is_gc;
+               uint32 is_rodc;
+               GUID site_guid;
+               GUID computer_guid;
+               GUID server_guid;
+               GUID ntds_guid;
+       } drsuapi_DsGetDCInfo3;
+
+       typedef struct {
+               [range(0,10000)] uint32 count;
+               [size_is(count)] drsuapi_DsGetDCInfo3 *array;
+       } drsuapi_DsGetDCInfoCtr3;
+
+       /*
+        * this represents an active connection to the
+        * Directory System Agent (DSA)
+        * this can be via LDAP or DRSUAPI
+        */
+       typedef struct {
+               [flag(NDR_BIG_ENDIAN)] ipv4address client_ip_address;
                uint32 unknown2;
-               uint32 unknown3;
+               uint32 connection_time; /* in seconds */
                uint32 unknown4;
                uint32 unknown5;
                uint32 unknown6;
-               [charset(UTF16),string] uint16 *server_nt4_account;
-       } drsuapi_DsGetDCInfo01;
+               /*
+                * client_account can be the following:
+                * "W2K3\Administrator"
+                * "Administrator@W2K3"
+                * "cn=Administrator,cn=Users,DC=w2k3,DC=vmnet1,DC=vm,DC=base"
+                * ""
+                * or NULL
+                */
+               [charset(UTF16),string] uint16 *client_account;
+       } drsuapi_DsGetDCConnection01;
 
        typedef struct {
                [range(0,10000)] uint32 count;
-               [size_is(count)] drsuapi_DsGetDCInfo01 *array;
-       } drsuapi_DsGetDCInfoCtr01;
+               [size_is(count)] drsuapi_DsGetDCConnection01 *array;
+       } drsuapi_DsGetDCConnectionCtr01;
 
        typedef [v1_enum] enum {
                DRSUAPI_DC_INFO_CTR_1  = 1,
                DRSUAPI_DC_INFO_CTR_2  = 2,
-               DRSUAPI_DC_INFO_CTR_01 = -1
+               DRSUAPI_DC_INFO_CTR_3  = 3,
+               DRSUAPI_DC_CONNECTION_CTR_01 = -1
        } drsuapi_DsGetDCInfoCtrLevels;
 
         typedef [switch_type(int32)] union {
                [case(DRSUAPI_DC_INFO_CTR_1)]  drsuapi_DsGetDCInfoCtr1  ctr1;
                [case(DRSUAPI_DC_INFO_CTR_2)]  drsuapi_DsGetDCInfoCtr2  ctr2;
-               [case(DRSUAPI_DC_INFO_CTR_01)] drsuapi_DsGetDCInfoCtr01 ctr01;
+               [case(DRSUAPI_DC_INFO_CTR_3)]  drsuapi_DsGetDCInfoCtr3  ctr3;
+               [case(DRSUAPI_DC_CONNECTION_CTR_01)] drsuapi_DsGetDCConnectionCtr01 ctr01;
        } drsuapi_DsGetDCInfoCtr;
 
        WERROR drsuapi_DsGetDomainControllerInfo(
@@ -1106,6 +1128,18 @@ interface drsuapi
                drsuapi_DsReplicaObject object;
        } drsuapi_DsReplicaObjectListItem;
 
+       /*
+        * The DsAddEntry() call which creates a nTDSDSA object,
+        * also adds a servicePrincipalName in the following form
+        * to the computer account of the new domain controller
+        * referenced by the "serverReferenece" attribute.
+        *
+        * E3514235-4B06-11D1-AB04-00C04FC2DCD2/<new-ntdsdsa-object-guid-as-string>/<domain-dns-name>
+        *
+        * also note that the "serverReference" isn't added to the new object!
+        */
+       const char *DRSUAPI_NTDSDSA_KRB5_SERVICE_GUID = "E3514235-4B06-11D1-AB04-00C04FC2DCD2";
+
        /*
         * please note the the current idl
         * for DsAddEntry does only parse 
@@ -1198,16 +1232,17 @@ interface drsuapi
                [case(3)] drsuapi_DsAddEntryCtr3 ctr3;
        } drsuapi_DsAddEntryCtr;
 
-       WERROR drsuapi_DsAddEntry(
+       [public] WERROR drsuapi_DsAddEntry(
                [in] policy_handle *bind_handle,
-               [in,out] int32 level,
-               [in,switch_is(level)] drsuapi_DsAddEntryRequest req,
-               [out,switch_is(level)] drsuapi_DsAddEntryCtr ctr
+               [in] int32 level,
+               [in,ref,switch_is(level)] drsuapi_DsAddEntryRequest *req,
+               [out,ref] int32 *level_out,
+               [out,ref,switch_is(*level_out)] drsuapi_DsAddEntryCtr *ctr
                );
 
        /*****************/
         /* Function 0x12 */
-       WERROR DRSUAPI_EXECUTE_KCC();
+       [todo] WERROR DRSUAPI_EXECUTE_KCC();
 
        /*****************/
        /* Function 0x13 */
@@ -1230,7 +1265,7 @@ interface drsuapi
                DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA2       = 10,
                DRSUAPI_DS_REPLICA_INFO_NEIGHBORS02                     = -2,
                DRSUAPI_DS_REPLICA_INFO_CONNECTIONS04                   = -4,
-               DRSUAPI_DS_REPLICA_INFO_CURSURS05                       = -5,
+               DRSUAPI_DS_REPLICA_INFO_CURSORS05                       = -5,
                DRSUAPI_DS_REPLICA_INFO_06                              = -6
        } drsuapi_DsReplicaInfoType;
 
@@ -1283,14 +1318,14 @@ interface drsuapi
        typedef struct {
                uint32 count;
                uint32 reserved;
-               [size_is(count)] drsuapi_DsReplicaCoursor array[];
-       } drsuapi_DsReplicaCoursorCtr;
+               [size_is(count)] drsuapi_DsReplicaCursor array[];
+       } drsuapi_DsReplicaCursorCtr;
 
        typedef struct {
                [charset(UTF16),string] uint16 *attribute_name;
                uint32 version;
-               NTTIME originating_last_changed;
-               GUID originating_dsa_invocation_id;
+               NTTIME originating_change_time;
+               GUID originating_invocation_id;
                hyper originating_usn;
                hyper local_usn;
        } drsuapi_DsReplicaObjMetaData;
@@ -1326,7 +1361,7 @@ interface drsuapi
        typedef [switch_type(drsuapi_DsReplicaOpType)] union {
                [case(DRSUAPI_DS_REPLICA_OP_TYPE_SYNC)]         drsuapi_DsReplicaSyncOptions sync;
                [case(DRSUAPI_DS_REPLICA_OP_TYPE_ADD)]          drsuapi_DsReplicaAddOptions add;
-               [case(DRSUAPI_DS_REPLICA_OP_TYPE_DELETE)]       drsuapi_DsReplicaDeleteOptions delete;
+               [case(DRSUAPI_DS_REPLICA_OP_TYPE_DELETE)]       drsuapi_DsReplicaDeleteOptions op_delete;
                [case(DRSUAPI_DS_REPLICA_OP_TYPE_MODIFY)]       drsuapi_DsReplicaModifyOptions modify;
                [case(DRSUAPI_DS_REPLICA_OP_TYPE_UPDATE_REFS)]  drsuapi_DsReplicaUpdateRefsOptions update_refs;
                [default] uint32 unknown;
@@ -1354,13 +1389,13 @@ interface drsuapi
        typedef struct {
                [charset(UTF16),string] uint16 *attribute_name;
                [charset(UTF16),string] uint16 *object_dn;
-               uint32 value_length;
-               [size_is(value_length)] uint8 *value;
+               [value(ndr_size_DATA_BLOB(0,binary,0))] uint32 __ndr_size_binary;
+               DATA_BLOB *binary;
                NTTIME deleted;
                NTTIME created;
                uint32 version;
-               NTTIME originating_last_changed;
-               GUID originating_dsa_invocation_id;
+               NTTIME originating_change_time;
+               GUID originating_invocation_id;
                hyper originating_usn;
                hyper local_usn;
        } drsuapi_DsReplicaAttrValMetaData;
@@ -1374,30 +1409,30 @@ interface drsuapi
        typedef struct {
                uint32 count;
                int32 enumeration_context;
-               [size_is(count)] drsuapi_DsReplicaCoursor2 array[];
-       } drsuapi_DsReplicaCoursor2Ctr;
+               [size_is(count)] drsuapi_DsReplicaCursor2 array[];
+       } drsuapi_DsReplicaCursor2Ctr;
 
        typedef struct {
                GUID source_dsa_invocation_id;
                hyper highest_usn;
                NTTIME last_sync_success;
                [charset(UTF16),string] uint16 *source_dsa_obj_dn;
-       } drsuapi_DsReplicaCoursor3;
+       } drsuapi_DsReplicaCursor3;
 
        typedef struct {
                uint32 count;
                int32 enumeration_context;
-               [size_is(count)] drsuapi_DsReplicaCoursor3 array[];
-       } drsuapi_DsReplicaCoursor3Ctr;
+               [size_is(count)] drsuapi_DsReplicaCursor3 array[];
+       } drsuapi_DsReplicaCursor3Ctr;
 
        typedef struct {
                [charset(UTF16),string] uint16 *attribute_name;
                uint32 version;
-               NTTIME originating_last_changed;
-               GUID originating_dsa_invocation_id;
+               NTTIME originating_change_time;
+               GUID originating_invocation_id;
                hyper originating_usn;
                hyper local_usn;
-               [charset(UTF16),string] uint16 *originating_dsa_obj_dn;
+               [charset(UTF16),string] uint16 *originating_dsa_dn;
        } drsuapi_DsReplicaObjMetaData2;
 
        typedef struct {
@@ -1409,16 +1444,16 @@ interface drsuapi
        typedef struct {
                [charset(UTF16),string] uint16 *attribute_name;
                [charset(UTF16),string] uint16 *object_dn;
-               uint32 value_length;
-               [size_is(value_length)] uint8 *value;
+               [value(ndr_size_DATA_BLOB(0,binary,0))] uint32 __ndr_size_binary;
+               DATA_BLOB *binary;
                NTTIME deleted;
                NTTIME created;
                uint32 version;
-               NTTIME originating_last_changed;
-               GUID originating_dsa_invocation_id;
+               NTTIME originating_change_time;
+               GUID originating_invocation_id;
                hyper originating_usn;
                hyper local_usn;
-               [charset(UTF16),string] uint16 *originating_dsa_obj_dn;
+               [charset(UTF16),string] uint16 *originating_dsa_dn;
        } drsuapi_DsReplicaAttrValMetaData2;
 
        typedef struct {
@@ -1433,8 +1468,8 @@ interface drsuapi
                uint32 u3;
                GUID bind_guid;
                NTTIME_1sec bind_time;
-               uint32 u4; /* flags? */
-               uint32 u5;
+               [flag(NDR_BIG_ENDIAN)] ipv4address client_ip_address;
+               uint32 u5; /* this is the same value the client used as pid in the DsBindInfoX struct */
        } drsuapi_DsReplicaConnection04;
 
        typedef struct {
@@ -1462,33 +1497,33 @@ interface drsuapi
 
        typedef [switch_type(drsuapi_DsReplicaInfoType)] union {
                [case(DRSUAPI_DS_REPLICA_INFO_NEIGHBORS)] drsuapi_DsReplicaNeighbourCtr *neighbours;
-               [case(DRSUAPI_DS_REPLICA_INFO_CURSORS)] drsuapi_DsReplicaCoursorCtr *coursors;
+               [case(DRSUAPI_DS_REPLICA_INFO_CURSORS)] drsuapi_DsReplicaCursorCtr *cursors;
                [case(DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA)] drsuapi_DsReplicaObjMetaDataCtr *objmetadata;
                [case(DRSUAPI_DS_REPLICA_INFO_KCC_DSA_CONNECT_FAILURES)] drsuapi_DsReplicaKccDsaFailuresCtr *connectfailures;
                [case(DRSUAPI_DS_REPLICA_INFO_KCC_DSA_LINK_FAILURES)] drsuapi_DsReplicaKccDsaFailuresCtr *linkfailures;
                [case(DRSUAPI_DS_REPLICA_INFO_PENDING_OPS)] drsuapi_DsReplicaOpCtr *pendingops;
                [case(DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA)] drsuapi_DsReplicaAttrValMetaDataCtr *attrvalmetadata;
-               [case(DRSUAPI_DS_REPLICA_INFO_CURSORS2)] drsuapi_DsReplicaCoursor2Ctr *coursors2;
-               [case(DRSUAPI_DS_REPLICA_INFO_CURSORS3)] drsuapi_DsReplicaCoursor3Ctr *coursors3;
+               [case(DRSUAPI_DS_REPLICA_INFO_CURSORS2)] drsuapi_DsReplicaCursor2Ctr *cursors2;
+               [case(DRSUAPI_DS_REPLICA_INFO_CURSORS3)] drsuapi_DsReplicaCursor3Ctr *cursors3;
                [case(DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA2)] drsuapi_DsReplicaObjMetaData2Ctr *objmetadata2;
                [case(DRSUAPI_DS_REPLICA_INFO_ATTRIBUTE_VALUE_METADATA2)] drsuapi_DsReplicaAttrValMetaData2Ctr *attrvalmetadata2;
                [case(DRSUAPI_DS_REPLICA_INFO_NEIGHBORS02)] drsuapi_DsReplicaNeighbourCtr *neighbours02;
                [case(DRSUAPI_DS_REPLICA_INFO_CONNECTIONS04)] drsuapi_DsReplicaConnection04Ctr *connections04;
-               [case(DRSUAPI_DS_REPLICA_INFO_CURSURS05)] drsuapi_DsReplicaCoursorCtrEx *coursors05;
+               [case(DRSUAPI_DS_REPLICA_INFO_CURSORS05)] drsuapi_DsReplicaCursorCtrEx *cursors05;
                [case(DRSUAPI_DS_REPLICA_INFO_06)] drsuapi_DsReplica06Ctr *i06;
        } drsuapi_DsReplicaInfo;
 
        WERROR drsuapi_DsReplicaGetInfo(
                [in] policy_handle *bind_handle,
                [in] drsuapi_DsReplicaGetInfoLevel level,
-               [in,switch_is(level)] drsuapi_DsReplicaGetInfoRequest req,
-               [out] drsuapi_DsReplicaInfoType info_type,
-               [out,switch_is(info_type)] drsuapi_DsReplicaInfo info
+               [in,ref,switch_is(level)] drsuapi_DsReplicaGetInfoRequest *req,
+               [out,ref] drsuapi_DsReplicaInfoType *info_type,
+               [out,ref,switch_is(*info_type)] drsuapi_DsReplicaInfo *info
                );
 
        /*****************/
         /* Function 0x14 */
-       WERROR DRSUAPI_ADD_SID_HISTORY();
+       [todo] WERROR DRSUAPI_ADD_SID_HISTORY();
 
        /*****************/
         /* Function 0x15 */
@@ -1513,21 +1548,53 @@ interface drsuapi
 
        WERROR drsuapi_DsGetMemberships2(
                [in] policy_handle *bind_handle,
-               [in,out] int32 level,
-               [in] [switch_is(level)] drsuapi_DsGetMemberships2Request req,
-               [out] [switch_is(level)] drsuapi_DsGetMemberships2Ctr ctr
+               [in] int32 level,
+               [in,ref] [switch_is(level)] drsuapi_DsGetMemberships2Request *req,
+               [out,ref] int32 *level_out,
+               [out,ref] [switch_is(*level_out)] drsuapi_DsGetMemberships2Ctr *ctr
                );
 
-
        /*****************/
         /* Function 0x16 */
-       WERROR DRSUAPI_REPLICA_VERIFY_OBJECTS();
+       [todo] WERROR DRSUAPI_REPLICA_VERIFY_OBJECTS();
 
        /*****************/
         /* Function 0x17 */
-       WERROR DRSUAPI_GET_OBJECT_EXISTENCE();
+       [todo] WERROR DRSUAPI_GET_OBJECT_EXISTENCE();
 
        /*****************/
         /* Function 0x18 */
-       WERROR DRSUAPI_QUERY_SITES_BY_COST();
+       typedef struct {
+               WERROR error_code;
+               uint32 site_cost;
+       } drsuapi_DsSiteCostInfo;
+
+       typedef struct {
+               [range(0,10000)] uint32 num_info;
+               [size_is(num_info)] drsuapi_DsSiteCostInfo *info;
+               uint32 unknown;
+       } drsuapi_QuerySitesByCostCtr1;
+
+       typedef [switch_type(int32)] union {
+               [case(1)] drsuapi_QuerySitesByCostCtr1 ctr1;
+       } drsuapi_QuerySitesByCostCtr;
+
+       typedef struct {
+               [charset(UTF16),string] uint16 *site_from;
+               [range(1,10000)] uint32 num_req;
+               [size_is(num_req)] [charset(UTF16),string] uint16 **site_to;
+               uint32 flags;
+       } drsuapi_QuerySitesByCostRequest1;
+
+       typedef [switch_type(int32)] union {
+               [case(1)] drsuapi_QuerySitesByCostRequest1 req1;
+       } drsuapi_QuerySitesByCostRequest;
+
+       WERROR drsuapi_QuerySitesByCost(
+               [in] policy_handle *bind_handle,
+               [in] int32 level,
+               [in,ref] [switch_is(level)] drsuapi_QuerySitesByCostRequest *req,
+               [out,ref] int32 *level_out,
+               [out,ref] [switch_is(*level_out)] drsuapi_QuerySitesByCostCtr *ctr
+       );
 }