[
uuid("e3514235-4b06-11d1-ab04-00c04fc2dcd2"),
version(4.0),
- endpoint("ncacn_np:[\\pipe\\lsass]","ncacn_np:[\\pipe\\protected_storage]","ncacn_ip_tcp:"),
+ endpoint("ncacn_np:[\\pipe\\lsass]","ncacn_np:[\\pipe\\protected_storage]", "ncacn_ip_tcp:", "ncalrpc:"),
helpstring("Active Directory Replication"),
pointer_default(unique)
]
{
/*****************/
/* Function 0x00 */
+ typedef [bitmap32bit] bitmap {
+ DRSUAPI_SUPPORTED_EXTENSION_BASE = 0x00000001,
+ DRSUAPI_SUPPORTED_EXTENSION_ASYNC_REPLICATION = 0x00000002,
+ DRSUAPI_SUPPORTED_EXTENSION_REMOVEAPI = 0x00000004,
+ DRSUAPI_SUPPORTED_EXTENSION_MOVEREQ_V2 = 0x00000008,
+ DRSUAPI_SUPPORTED_EXTENSION_GETCHG_COMPRESS = 0x00000010,
+ DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V1 = 0x00000020,
+ DRSUAPI_SUPPORTED_EXTENSION_RESTORE_USN_OPTIMIZATION = 0x00000040,
+ DRSUAPI_SUPPORTED_EXTENSION_00000080 = 0x00000080,
+ DRSUAPI_SUPPORTED_EXTENSION_KCC_EXECUTE = 0x00000100,
+ DRSUAPI_SUPPORTED_EXTENSION_ADDENTRY_V2 = 0x00000200,
+ DRSUAPI_SUPPORTED_EXTENSION_LINKED_VALUE_REPLICATION = 0x00000400,
+ DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V2 = 0x00000800,
+ DRSUAPI_SUPPORTED_EXTENSION_INSTANCE_TYPE_NOT_REQ_ON_MOD= 0x00001000,
+ DRSUAPI_SUPPORTED_EXTENSION_CRYPTO_BIND = 0x00002000,
+ DRSUAPI_SUPPORTED_EXTENSION_GET_REPL_INFO = 0x00004000,
+ DRSUAPI_SUPPORTED_EXTENSION_STRONG_ENCRYPTION = 0x00008000,
+ DRSUAPI_SUPPORTED_EXTENSION_DCINFO_V01 = 0x00010000,
+ DRSUAPI_SUPPORTED_EXTENSION_TRANSITIVE_MEMBERSHIP = 0x00020000,
+ DRSUAPI_SUPPORTED_EXTENSION_ADD_SID_HISTORY = 0x00040000,
+ DRSUAPI_SUPPORTED_EXTENSION_POST_BETA3 = 0x00080000,
+ DRSUAPI_SUPPORTED_EXTENSION_00100000 = 0x00100000,
+ DRSUAPI_SUPPORTED_EXTENSION_GET_MEMBERSHIPS2 = 0x00200000,
+ DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V6 = 0x00400000,
+ DRSUAPI_SUPPORTED_EXTENSION_NONDOMAIN_NCS = 0x00800000,
+ DRSUAPI_SUPPORTED_EXTENSION_GETCHGREQ_V8 = 0x01000000,
+ DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V5 = 0x02000000,
+ DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V6 = 0x04000000,
+ /*
+ * the following 3 have the same value
+ * repadmin.exe /bind says that
+ */
+ DRSUAPI_SUPPORTED_EXTENSION_ADDENTRYREPLY_V3 = 0x08000000,
+ DRSUAPI_SUPPORTED_EXTENSION_GETCHGREPLY_V7 = 0x08000000,
+ DRSUAPI_SUPPORTED_EXTENSION_VERIFY_OBJECT = 0x08000000,
+ DRSUAPI_SUPPORTED_EXTENSION_XPRESS_COMPRESS = 0x10000000,
+ DRSUAPI_SUPPORTED_EXTENSION_20000000 = 0x20000000,
+ DRSUAPI_SUPPORTED_EXTENSION_40000000 = 0x40000000,
+ DRSUAPI_SUPPORTED_EXTENSION_80000000 = 0x80000000
+ } drsuapi_SupportedExtensions;
+
+ /* this is used by w2k */
+ typedef struct {
+ drsuapi_SupportedExtensions supported_extensions;
+ GUID site_guid;
+ uint32 u1;
+ } drsuapi_DsBindInfo24;
- typedef [flag(NDR_PAHEX)] struct {
- [range(1,10000)] uint32 length;
- [size_is(length)] uint8 data[];
+ /* this is used by w2k3 */
+ typedef struct {
+ drsuapi_SupportedExtensions supported_extensions;
+ GUID site_guid;
+ uint32 u1;
+ uint32 repl_epoch;
+ } drsuapi_DsBindInfo28;
+
+ typedef struct {
+ [flag(NDR_REMAINING)] DATA_BLOB info;
+ } drsuapi_DsBindInfoFallBack;
+
+ typedef [nodiscriminant] union {
+ [case(24)][subcontext(4)] drsuapi_DsBindInfo24 info24;
+ [case(28)][subcontext(4)] drsuapi_DsBindInfo28 info28;
+ [default][subcontext(4)] drsuapi_DsBindInfoFallBack FallBack;
} drsuapi_DsBindInfo;
+ /* the drsuapi_DsBindInfoCtr was this before
+ * typedef [flag(NDR_PAHEX)] struct {
+ * [range(1,10000)] uint32 length;
+ * [size_is(length)] uint8 data[];
+ * } drsuapi_DsBindInfo;
+ *
+ * but we don't want the caller to manually decode this blob,
+ * so we're doing it here
+ */
+
+ typedef struct {
+ [range(1,10000)] uint32 length;
+ [switch_is(length)] drsuapi_DsBindInfo info;
+ } drsuapi_DsBindInfoCtr;
+
/* this is a magic guid you need to pass to DsBind to make drsuapi_DsWriteAccountSpn() work
*
* maybe the bind_guid could also be the invocation_id see drsuapi_DsReplicaConnection04
*/
const string DRSUAPI_DS_BIND_GUID = "e24d201a-4fd6-11d1-a3da-0000f875ae0d";
-
-
- /* this are the bind info blobs returned (seemed to be const):
- w2k3 7ffbff1f81a6ff5d80139441a372e9b779d70268f801000000000000
- w2k 7ffb1f00cb7fb9102391c143bda81fc90e0ff452f4000000
- */
- const uint8 DRSUAPI_DS_BIND_INFO_RESPONSE_W2K3[] = { 0x7f,0xfb,0xff,0x1f,0x81,0xa6,0xff,0x5d,
- 0x80,0x13,0x94,0x41,0xa3,0x72,0xe9,0xb7,
- 0x79,0xd7,0x02,0x68,0xf8,0x01,0x00,0x00,
- 0x00,0x00,0x00,0x00};
- const uint8 DRSUAPI_DS_BIND_INFO_RESPONSE_W2K[] = { 0x7f,0xfb,0x1f,0x00,0xcb,0x7f,0xb9,0x10,
- 0x23,0x91,0xc1,0x43,0xbd,0xa8,0x1f,0xc9,
- 0x0e,0x0f,0xf4,0x52,0xf4,0x00,0x00,0x00};
WERROR drsuapi_DsBind(
[in] GUID *bind_guid,
- [in,out] drsuapi_DsBindInfo *bind_info,
+ [in,out] drsuapi_DsBindInfoCtr *bind_info,
[out,ref] policy_handle *bind_handle
);
/*****************/
/* Function 0x02 */
- typedef struct {
+ typedef [flag(NDR_PAHEX)] struct {
uint32 unknown1;
uint32 unknown2;
GUID guid1;
- [size_is(28)] uint8 unknown3[28];
- [flag(STR_LEN4|STR_CHARLEN)] string nc_dn;
+ uint8 unknown3[28];
+ [flag(STR_SIZE4|STR_CHARLEN|STR_CONFORMANT)] string nc_dn;
} drsuapi_DsReplicaSyncRequest1Info;
typedef struct {
drsuapi_DsReplicaSyncRequest1Info *info;
GUID guid1;
- asclstr string1;
+ astring *string1;
uint32 unknown1;
} drsuapi_DsReplicaSyncRequest1;
WERROR drsuapi_DsReplicaSync(
[in,ref] policy_handle *bind_handle,
- [in] uint32 level,
+ [in] int32 level,
[in,switch_is(level)] drsuapi_DsReplicaSyncRequest req
);
/*****************/
/* Function 0x0c */
- typedef enum {
+ typedef [v1_enum] enum {
DRSUAPI_DS_NAME_STATUS_OK = 0,
DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR = 1,
DRSUAPI_DS_NAME_STATUS_NOT_FOUND = 2,
DRSUAPI_DS_NAME_STATUS_TRUST_REFERRAL = 7
} drsuapi_DsNameStatus;
- typedef enum {
+ typedef [v1_enum] enum {
DRSUAPI_DS_NAME_FLAG_NO_FLAGS = 0x0,
DRSUAPI_DS_NAME_FLAG_SYNTACTICAL_ONLY = 0x1,
DRSUAPI_DS_NAME_FLAG_EVAL_AT_DC = 0x2,
DRSUAPI_DS_NAME_FLAG_TRUST_REFERRAL = 0x8
} drsuapi_DsNameFlags;
- typedef enum {
+ typedef [v1_enum] enum {
DRSUAPI_DS_NAME_FORMAT_UKNOWN = 0,
DRSUAPI_DS_NAME_FORMAT_FQDN_1779 = 1,
DRSUAPI_DS_NAME_FORMAT_NT4_ACCOUNT = 2,
typedef struct {
uint32 unknown1; /* 0x000004e4 */
uint32 unknown2; /* 0x00000407 */
- uint32 format_flags;
- uint32 format_offered;
- uint32 format_desired;
+ drsuapi_DsNameFlags format_flags;
+ drsuapi_DsNameFormat format_offered;
+ drsuapi_DsNameFormat format_desired;
[range(1,10000)] uint32 count;
[size_is(count)] drsuapi_DsNameString *names;
} drsuapi_DsNameRequest1;
} drsuapi_DsNameRequest;
typedef struct {
- uint32 status;
+ drsuapi_DsNameStatus status;
unistr *dns_domain_name;
unistr *result_name;
} drsuapi_DsNameInfo1;
WERROR drsuapi_DsCrackNames(
[in,ref] policy_handle *bind_handle,
- [in, out] uint32 level,
+ [in, out] int32 level,
[in,switch_is(level)] drsuapi_DsNameRequest req,
[out,switch_is(level)] drsuapi_DsNameCtr ctr
);
/*****************/
/* Function 0x0d */
- typedef enum {
+ typedef [v1_enum] enum {
DRSUAPI_DS_SPN_OPERATION_ADD = 0,
DRSUAPI_DS_SPN_OPERATION_REPLACE= 1,
DRSUAPI_DS_SPN_OPERATION_DELETE = 2
} drsuapi_DsSpnOperation;
typedef struct {
- int32 operation;
- int32 unknown1;
+ drsuapi_DsSpnOperation operation;
+ uint32 unknown1;
unistr *object_dn;
[range(0,10000)] uint32 count;
[size_is(count)] drsuapi_DsNameString *spn_names;
WERROR drsuapi_DsWriteAccountSpn(
[in,ref] policy_handle *bind_handle,
- [in, out] uint32 level,
+ [in, out] int32 level,
[in,switch_is(level)] drsuapi_DsWriteAccountSpnRequest req,
[out,switch_is(level)] drsuapi_DsWriteAccountSpnResult res
);
/*****************/
/* Function 0x13 */
- typedef enum {
+ typedef [v1_enum] enum {
DRSUAPI_DS_REPLICA_GET_INFO = 1,
DRSUAPI_DS_REPLICA_GET_INFO2 = 2
} drsuapi_DsReplicaGetInfoLevel;
- typedef enum {
+ typedef [v1_enum] enum {
DRSUAPI_DS_REPLICA_INFO_NEIGHBORS = 0,
DRSUAPI_DS_REPLICA_INFO_CURSORS = 1,
DRSUAPI_DS_REPLICA_INFO_OBJ_METADATA = 2,
} drsuapi_DsReplicaInfoType;
typedef struct {
- int32 info_type;
+ drsuapi_DsReplicaInfoType info_type;
unistr *object_dn;
GUID guid1;
} drsuapi_DsReplicaGetInfoRequest1;
typedef struct {
- int32 info_type;
+ drsuapi_DsReplicaInfoType info_type;
unistr *object_dn;
GUID guid1;
uint32 unknown1;
} drsuapi_DsReplicaGetInfoRequest2;
typedef union {
- [case(1)] drsuapi_DsReplicaGetInfoRequest1 req1;
- [case(2)] drsuapi_DsReplicaGetInfoRequest2 req2;
+ [case(DRSUAPI_DS_REPLICA_GET_INFO)] drsuapi_DsReplicaGetInfoRequest1 req1;
+ [case(DRSUAPI_DS_REPLICA_GET_INFO2)] drsuapi_DsReplicaGetInfoRequest2 req2;
} drsuapi_DsReplicaGetInfoRequest;
typedef struct {
} drsuapi_DsReplica06Ctr;
typedef union {
- [case(0)] drsuapi_DsReplicaNeighbourCtr *neighbours;
- [case(1)] drsuapi_DsReplicaCoursorCtr *coursors;
- [case(2)] drsuapi_DsReplicaObjMetaDataCtr *objmetadata;
- [case(3)] drsuapi_DsReplicaKccDsaFailuresCtr *connectfailures;
- [case(4)] drsuapi_DsReplicaKccDsaFailuresCtr *linkfailures;
- [case(5)] drsuapi_DsReplicaOpCtr *pendingops;
- [case(6)] drsuapi_DsReplicaAttrValMetaDataCtr *attrvalmetadata;
- [case(7)] drsuapi_DsReplicaCoursor2Ctr *coursors2;
- [case(8)] drsuapi_DsReplicaCoursor3Ctr *coursors3;
- [case(9)] drsuapi_DsReplicaObjMetaData2Ctr *objmetadata2;
- [case(10)] drsuapi_DsReplicaAttrValMetaData2Ctr *attrvalmetadata2;
- [case(-2)] drsuapi_DsReplicaNeighbourCtr *neighbours02;
- [case(-4)] drsuapi_DsReplicaConnection04Ctr *connections04;
- [case(-5)] drsuapi_DsReplicaCoursor05Ctr *coursors05;
- [case(-6)] drsuapi_DsReplica06Ctr *i06;
+ [case(DRSUAPI_DS_REPLICA_INFO_NEIGHBORS)] drsuapi_DsReplicaNeighbourCtr *neighbours;
+ [case(DRSUAPI_DS_REPLICA_INFO_CURSORS)] drsuapi_DsReplicaCoursorCtr *coursors;
+ [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_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_DsReplicaCoursor05Ctr *coursors05;
+ [case(DRSUAPI_DS_REPLICA_INFO_06)] drsuapi_DsReplica06Ctr *i06;
} drsuapi_DsReplicaInfo;
WERROR drsuapi_DsReplicaGetInfo(
[in,ref] policy_handle *bind_handle,
- [in] int32 level,
+ [in] drsuapi_DsReplicaGetInfoLevel level,
[in,switch_is(level)] drsuapi_DsReplicaGetInfoRequest req,
- [out] int32 info_type,
+ [out] drsuapi_DsReplicaInfoType info_type,
[out,switch_is(info_type)] drsuapi_DsReplicaInfo info
);