/*
  dfs interface definition
*/

[ uuid("4fc742e0-4a10-11cf-8273-00aa004ae673"),
  version(3.0),
  pointer_default(unique),
  helpstring("Settings for Microsoft Distributed File System"),
  endpoint("ncacn_np:[\\pipe\\netdfs]", "ncacn_ip_tcp:", "ncalrpc:")
] interface netdfs
{
	/******************/
	/* Function: 0x00 */
	typedef [v1_enum] enum {
		DFS_MANAGER_VERSION_NT4		= 1,
		DFS_MANAGER_VERSION_W2K		= 2,
		DFS_MANAGER_VERSION_W2K3	= 4
	} dfs_ManagerVersion;

	[public] void dfs_GetManagerVersion(
		[out]		dfs_ManagerVersion *version
		);


	/******************/
	/* Function: 0x01 */
	WERROR dfs_Add (
		[in]		[string,charset(UTF16)] uint16 *path,
		[in]		[string,charset(UTF16)] uint16 *server,
		[in,unique]	[string,charset(UTF16)] uint16 *share,
		[in,unique]	[string,charset(UTF16)] uint16 *comment,
		[in]		uint32 flags
		);

	/******************/
	/* Function: 0x02 */
	WERROR dfs_Remove (
		[in]		[string,charset(UTF16)] uint16 *dfs_entry_path,
		[in,unique]	[string,charset(UTF16)] uint16 *servername,
		[in,unique]	[string,charset(UTF16)] uint16 *sharename
		);

	/******************/
	/* Function: 0x03 */

	typedef struct {
	} dfs_Info0;

	typedef struct {
		[string,charset(UTF16)] uint16 *path;
	} dfs_Info1;

	typedef [public,bitmap32bit] bitmap {
		DFS_VOLUME_STATE_OK 		= 0x1,
		DFS_VOLUME_STATE_INCONSISTENT 	= 0x2,
		DFS_VOLUME_STATE_OFFLINE 	= 0x3,
		DFS_VOLUME_STATE_ONLINE		= 0x4,
		DFS_VOLUME_STATE_STANDALONE	= DFS_VOLUME_FLAVOR_STANDALONE,
		DFS_VOLUME_STATE_AD_BLOB	= DFS_VOLUME_FLAVOR_AD_BLOB
	} dfs_VolumeState;

	typedef struct {
		[string,charset(UTF16)] uint16 *path;
		[string,charset(UTF16)] uint16 *comment;
		dfs_VolumeState state;
		uint32 num_stores;
	} dfs_Info2;

	const int DFS_STORAGE_STATES = 0xf;

	/* yes, this is a bitmap */
	typedef [public,bitmap32bit] bitmap {
		DFS_STORAGE_STATE_OFFLINE 	= 1,
		DFS_STORAGE_STATE_ONLINE 	= 2,
		DFS_STORAGE_STATE_ACTIVE 	= 4
	} dfs_StorageState;

	typedef struct {
		dfs_StorageState state;
		[string,charset(UTF16)] uint16 *server;
		[string,charset(UTF16)] uint16 *share;
	} dfs_StorageInfo;

	typedef struct {
		[string,charset(UTF16)] uint16 *path;
		[string,charset(UTF16)] uint16 *comment;
		dfs_VolumeState state;
		uint32 num_stores;
		[size_is(num_stores)] dfs_StorageInfo *stores;
	} dfs_Info3;

	typedef struct {
		[string,charset(UTF16)] uint16 *path;
		[string,charset(UTF16)] uint16 *comment;
		dfs_VolumeState state;
		uint32 timeout;
		GUID   guid;
		uint32 num_stores;
		[size_is(num_stores)] dfs_StorageInfo *stores;
	} dfs_Info4;

	/* verified with dfsutil */
	typedef [public,bitmap32bit] bitmap {
		DFS_PROPERTY_FLAG_INSITE_REFERRALS	= 0x01,
		DFS_PROPERTY_FLAG_ROOT_SCALABILITY	= 0x02,
		DFS_PROPERTY_FLAG_SITE_COSTING 		= 0x04,
		DFS_PROPERTY_FLAG_TARGET_FAILBACK	= 0x08,
		DFS_PROPERTY_FLAG_CLUSTER_ENABLED	= 0x10	/* untested */
	} dfs_PropertyFlags;

	typedef struct {
		[string,charset(UTF16)] uint16 *path;
		[string,charset(UTF16)] uint16 *comment;
		dfs_VolumeState state;
		uint32 timeout;
		GUID   guid;
		dfs_PropertyFlags flags;
		uint32 pktsize;
		uint32 num_stores;
	} dfs_Info5;

	typedef [v1_enum] enum {
		DFS_INVALID_PRIORITY_CLASS	 	= -1,
		DFS_SITE_COST_NORMAL_PRIORITY_CLASS	= 0,
		DFS_GLOBAL_HIGH_PRIORITY_CLASS		= 1,
		DFS_SITE_COST_HIGH_PRIORITY_CLASS	= 2,
		DFS_SITE_COST_LOW_PRIORITY_CLASS	= 3,
		DFS_GLOBAL_LOW_PRIORITY_CLASS		= 4
	} dfs_Target_PriorityClass;

	typedef struct {
		dfs_Target_PriorityClass target_priority_class;
		uint16 target_priority_rank;
		uint16 reserved;
	} dfs_Target_Priority;

	typedef struct {
		dfs_StorageInfo info;
		dfs_Target_Priority target_priority;
	} dfs_StorageInfo2;

	typedef struct {
		[string,charset(UTF16)] uint16 *entry_path;
		[string,charset(UTF16)] uint16 *comment;
		dfs_VolumeState state;
		uint32 timeout;
		GUID   guid;
		dfs_PropertyFlags flags;
		uint32 pktsize;
		uint16 num_stores;
		[size_is(num_stores)] dfs_StorageInfo2 *stores;
	} dfs_Info6;

	typedef struct {
		GUID  generation_guid;
	} dfs_Info7;

	typedef struct {
		[string,charset(UTF16)] uint16 *comment;
	} dfs_Info100;

	typedef struct {
		dfs_StorageState state;
	} dfs_Info101;

	typedef struct {
		uint32 timeout;
	} dfs_Info102;

	typedef struct {
		dfs_PropertyFlags flags;
	} dfs_Info103;

	typedef struct {
		dfs_Target_Priority priority;
	} dfs_Info104;

	typedef struct {
		[string,charset(UTF16)] uint16 *comment;
		dfs_VolumeState state;
		uint32 timeout;
		uint32 property_flag_mask;
		uint32 property_flags;
	} dfs_Info105;

	typedef struct {
		dfs_StorageState state;
		dfs_Target_Priority priority;
	} dfs_Info106;

	typedef struct {
		[string,charset(UTF16)] uint16 *dom_root;
	} dfs_Info200;

        typedef enum {
		DFS_VOLUME_FLAVOR_STANDALONE = 0x100,
		DFS_VOLUME_FLAVOR_AD_BLOB = 0x200
	} dfs_VolumeFlavor;

	typedef struct {
		dfs_VolumeFlavor flavor;
		[string,charset(UTF16)] uint16 *dom_root;
	} dfs_Info300;

	typedef union {
		[case(0)]   dfs_Info0 *info0;
		[case(1)]   dfs_Info1 *info1;
		[case(2)]   dfs_Info2 *info2;
		[case(3)]   dfs_Info3 *info3;
		[case(4)]   dfs_Info4 *info4;
		[case(5)]   dfs_Info5 *info5;
		[case(6)]   dfs_Info6 *info6;
		[case(7)]   dfs_Info7 *info7;
		[case(100)] dfs_Info100 *info100;
		[case(101)] dfs_Info101 *info101;
		[case(102)] dfs_Info102 *info102;
		[case(103)] dfs_Info103 *info103;
		[case(104)] dfs_Info104 *info104;
		[case(105)] dfs_Info105 *info105;
		[case(106)] dfs_Info106 *info106;
	} dfs_Info;

	WERROR dfs_SetInfo (
		[in]	 	[string,charset(UTF16)] uint16 dfs_entry_path[],
		[in,unique]	[string,charset(UTF16)] uint16 *servername,
		[in,unique]	[string,charset(UTF16)] uint16 *sharename,
		[in]		uint32 level,
		[in,ref,switch_is(level)] dfs_Info *info
		);

	/******************/
	/* Function: 0x04 */
	WERROR dfs_GetInfo (
		[in]		[string,charset(UTF16)] uint16 dfs_entry_path[],
		[in,unique]	[string,charset(UTF16)] uint16 *servername,
		[in,unique]	[string,charset(UTF16)] uint16 *sharename,
		[in]		uint32 level,
		[out,switch_is(level)] dfs_Info *info
		);

	/******************/
	/* Function: 0x05 */

	typedef struct {
		uint32 count;
		[size_is(count)] dfs_Info1 *s;
	} dfs_EnumArray1;

	typedef struct {
		uint32 count;
		[size_is(count)] dfs_Info2 *s;
	} dfs_EnumArray2;

	typedef struct {
		uint32 count;
		[size_is(count)] dfs_Info3 *s;
	} dfs_EnumArray3;

	typedef struct {
		uint32 count;
		[size_is(count)] dfs_Info4 *s;
	} dfs_EnumArray4;

	typedef struct {
		uint32 count;
		[size_is(count)] dfs_Info5 *s;
	} dfs_EnumArray5;

	typedef struct {
		uint32 count;
		[size_is(count)] dfs_Info6 *s;
	} dfs_EnumArray6;

	typedef struct {
		uint32 count;
		[size_is(count)] dfs_Info200 *s;
	} dfs_EnumArray200;

	typedef struct {
		uint32 count;
		[size_is(count)] dfs_Info300 *s;
	} dfs_EnumArray300;


	typedef union {
		[case(1)] dfs_EnumArray1 *info1;
		[case(2)] dfs_EnumArray2 *info2;
		[case(3)] dfs_EnumArray3 *info3;
		[case(4)] dfs_EnumArray4 *info4;
		[case(5)] dfs_EnumArray5 *info5;
		[case(6)] dfs_EnumArray6 *info6;
		[case(200)] dfs_EnumArray200 *info200;
		[case(300)] dfs_EnumArray300 *info300;
	} dfs_EnumInfo;

	typedef struct {
		uint32 level;
		[switch_is(level)] dfs_EnumInfo e;
	} dfs_EnumStruct;

	WERROR dfs_Enum (
		[in]		uint32 level,
		[in]		uint32 bufsize,
		[in,out,unique]	dfs_EnumStruct *info,
		[in,out,unique]	uint32 *total
		);

	/* Function 0x06 */
	WERROR dfs_Rename();

	/* Function 0x07 */
	WERROR dfs_Move();

	/* Function 0x08 */
	WERROR dfs_ManagerGetConfigInfo();

	/* Function 0x09 */
	WERROR dfs_ManagerSendSiteInfo();

	/* Function 0x0a */
	typedef struct {
		uint32 unknown1;
		[string,charset(UTF16)] uint16 *unknown2;
	} dfs_UnknownStruct;

	WERROR dfs_AddFtRoot(
		[in]		[string,charset(UTF16)] uint16 servername[],
		[in]		[string,charset(UTF16)] uint16 dns_servername[],
		[in]		[string,charset(UTF16)] uint16 dfsname[],
		[in]		[string,charset(UTF16)] uint16 rootshare[],
		[in]		[string,charset(UTF16)] uint16 comment[],
		[in]		[string,charset(UTF16)] uint16 dfs_config_dn[],
		[in]		uint8 unknown1,
		[in]		uint32 flags,
		[in,out,unique]	dfs_UnknownStruct **unknown2
		);

	/* Function 0x0b */
	WERROR dfs_RemoveFtRoot(
		[in]		[string,charset(UTF16)] uint16 servername[],
		[in]		[string,charset(UTF16)] uint16 dns_servername[],
		[in]		[string,charset(UTF16)] uint16 dfsname[],
		[in]		[string,charset(UTF16)] uint16 rootshare[],
		[in]		uint32 flags,
		[in,out,unique]	dfs_UnknownStruct **unknown
		);

	/* Function 0x0c */ 
	WERROR dfs_AddStdRoot(
		[in]		[string,charset(UTF16)] uint16 servername[],
		[in]		[string,charset(UTF16)] uint16 rootshare[],
		[in]		[string,charset(UTF16)] uint16 comment[],
		[in]		uint32 flags
		);
 
	/* Function 0x0d */
	WERROR dfs_RemoveStdRoot(
		[in]		[string,charset(UTF16)] uint16 servername[],
		[in]		[string,charset(UTF16)] uint16 rootshare[],
		[in]		uint32 flags
		);
 
	/* Function 0x0e */
	WERROR dfs_ManagerInitialize(
		[in]		[string,charset(UTF16)] uint16 *servername,
		[in]		uint32 flags
		);

	/* Function 0x0f */
	WERROR dfs_AddStdRootForced(
		[in]		[string,charset(UTF16)] uint16 servername[],
		[in]		[string,charset(UTF16)] uint16 rootshare[],
		[in]		[string,charset(UTF16)] uint16 comment[],
		[in]		[string,charset(UTF16)] uint16 store[] /* C:\\whatever */
		);

	/* Function 0x10 */
	WERROR dfs_GetDcAddress(
		[in]		[string,charset(UTF16)] uint16 servername[],
		[in,out,ref]	[string,charset(UTF16)] uint16 **server_fullname,
		[in,out,ref] 	boolean8 *is_root,
		[in,out,ref] 	uint32 *ttl
		);

	/* Function 0x11 */
	WERROR dfs_SetDcAddress(
		[in]		[string,charset(UTF16)] uint16 servername[],
		[in]		[string,charset(UTF16)] uint16 server_fullname[],
		[in]		uint32	flags,
		[in]		uint32	ttl
		);

	/* Function 0x12 */
	WERROR dfs_FlushFtTable(
		[in]		[string,charset(UTF16)] uint16 servername[],
		[in]		[string,charset(UTF16)] uint16 rootshare[]
		);

	/* Function 0x13 */
	WERROR dfs_Add2();

	/* Function 0x14 */
	WERROR dfs_Remove2();

	/* Function 0x15 */
	[public] WERROR dfs_EnumEx(
		[in]		[string,charset(UTF16)] uint16 dfs_name[],
		[in]		uint32 level,
		[in]		uint32 bufsize,
		[in,out,unique]	dfs_EnumStruct *info,
		[in,out,unique]	uint32 *total
	);

	/* Function 0x16 */
	WERROR dfs_SetInfo2();
}
