/*
  dfs interface definition
*/

[ uuid("4fc742e0-4a10-11cf-8273-00aa004ae673"),
  version(3.0),
  pointer_default(unique),
  helpstring("Settings for Microsoft Distributed File System"),
  keepref
] interface netdfs
{
	/******************/
	/* Function: 0x00 */
	void dfs_GetManagerVersion(
		[out] uint32 *exist_flag
		);


	/******************/
	/* 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 *path,
		[in,unique,string,charset(UTF16)] uint16 *server,
		[in,unique,string,charset(UTF16)] uint16 *share
		);

	/******************/
	/* Function: 0x03 */
	WERROR dfs_SetInfo ();

	/******************/
	/* Function: 0x04 */

	typedef struct {
	} dfs_Info0;

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

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

	typedef struct {
		uint32 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;
		uint32 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;
		uint32 state;
		uint32 timeout;
		GUID   guid;
		uint32 num_stores;
		[size_is(num_stores)] dfs_StorageInfo *stores;
	} dfs_Info4;

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

	typedef struct {
		uint32 state;
	} dfs_Info101;

	typedef struct {
		uint32 timeout;
	} dfs_Info102;

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

	typedef struct {
		uint32 flags;
		[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(100)] dfs_Info100 *info100;
		[case(101)] dfs_Info101 *info101;
		[case(102)] dfs_Info102 *info102;
	} dfs_Info;

	WERROR dfs_GetInfo (
		[in,string,charset(UTF16)] uint16 *path,
		[in,unique,string,charset(UTF16)] uint16 *server,
		[in,unique,string,charset(UTF16)] uint16 *share,
		[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_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(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,unique]     uint32 *unknown,
		[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 */
	WERROR dfs_AddFtRoot();

	/* Function 0x0b */
	WERROR dfs_RemoveFtRoot();

	/* Function 0x0c */
	WERROR dfs_AddStdRoot();

	/* Function 0x0d */
	WERROR dfs_RemoveStdRoot();

	/* Function 0x0e */
	WERROR dfs_ManagerInitialize();

	/* Function 0x0f */
	WERROR dfs_AddStdRootForced();

	/* Function 0x10 */
	WERROR dfs_GetDcAddress();

	/* Function 0x11 */
	WERROR dfs_SetDcAddress();

	/* Function 0x12 */
	WERROR dfs_FlushFtTable();

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

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

	/* Function 0x15 */
	WERROR dfs_EnumEx();

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