1#include "idl_types.h"
2
3import "misc/misc.idl";
4
5[
6  uuid("ccd8c074-d0e5-4a40-92b4-d074faa6ba28"),
7  version(1.1),
8  pointer_default(unique),
9  helpstring("SMB Witness Service"),
10  helper("../librpc/ndr/ndr_witness.h"),
11  endpoint("ncacn_ip_tcp:")
12]
13interface witness
14{
15	typedef [v1_enum] enum {
16		WITNESS_V1 = 0x00010001,
17		WITNESS_V2 = 0x00020000,
18		WITNESS_UNSPECIFIED_VERSION = 0xFFFFFFFF
19	} witness_version;
20
21	/*****************/
22	/* Function 0x00 */
23
24	typedef [enum16bit] enum {
25		WITNESS_STATE_UNKNOWN     = 0x00,
26		WITNESS_STATE_AVAILABLE   = 0x01,
27		WITNESS_STATE_UNAVAILABLE = 0xff
28	} witness_interfaceInfo_state;
29
30	typedef [bitmap32bit] bitmap {
31		WITNESS_INFO_IPv4_VALID = 0x01,
32		WITNESS_INFO_IPv6_VALID = 0x02,
33		WITNESS_INFO_WITNESS_IF = 0x04
34	} witness_interfaceInfo_flags;
35
36	typedef struct {
37		[charset(UTF16),to_null] uint16 group_name[260];
38		witness_version version;
39		witness_interfaceInfo_state state;
40		[flag(NDR_BIG_ENDIAN)] ipv4address ipv4;
41		[flag(NDR_BIG_ENDIAN)] ipv6address ipv6;
42		witness_interfaceInfo_flags flags;
43	} witness_interfaceInfo;
44
45	typedef struct {
46		uint32 num_interfaces;
47		[size_is(num_interfaces)] witness_interfaceInfo *interfaces;
48	} witness_interfaceList;
49
50	[public] WERROR witness_GetInterfaceList(
51		[out] witness_interfaceList **interface_list
52		);
53
54	/*****************/
55	/* Function 0x01 */
56
57	[public] WERROR witness_Register(
58		[out,ref] policy_handle *context_handle,
59		[in] witness_version version,
60		[in,unique,string,charset(UTF16)] uint16 *net_name,
61		[in,unique,string,charset(UTF16)] uint16 *ip_address,
62		[in,unique,string,charset(UTF16)] uint16 *client_computer_name
63		);
64
65	/*****************/
66	/* Function 0x02 */
67
68	[public] WERROR witness_UnRegister(
69		[in] policy_handle context_handle
70		);
71
72	/*****************/
73	/* Function 0x03 */
74
75	typedef [v1_enum,public] enum {
76		WITNESS_NOTIFY_RESOURCE_CHANGE = 1,
77		WITNESS_NOTIFY_CLIENT_MOVE     = 2,
78		WITNESS_NOTIFY_SHARE_MOVE      = 3,
79		WITNESS_NOTIFY_IP_CHANGE       = 4
80	} witness_notifyResponse_type;
81
82	typedef [v1_enum] enum {
83		WITNESS_RESOURCE_STATE_UNKNOWN     = 0x00,
84		WITNESS_RESOURCE_STATE_AVAILABLE   = 0x01,
85		WITNESS_RESOURCE_STATE_UNAVAILABLE = 0xff
86	} witness_ResourceChange_type;
87
88	typedef [flag(NDR_NOALIGN|NDR_LITTLE_ENDIAN),gensize,public] struct {
89		[value(ndr_size_witness_ResourceChange(r,ndr->flags))] uint32 length;
90		witness_ResourceChange_type type;
91		nstring name;
92	} witness_ResourceChange;
93
94	typedef [bitmap32bit] bitmap {
95		WITNESS_IPADDR_V4      = 0x01,
96		WITNESS_IPADDR_V6      = 0x02,
97		WITNESS_IPADDR_ONLINE  = 0x08,
98		WITNESS_IPADDR_OFFLINE = 0x10
99	} witness_IPaddrInfo_flags;
100
101	typedef [flag(NDR_NOALIGN|NDR_LITTLE_ENDIAN),gensize] struct {
102		witness_IPaddrInfo_flags flags;
103		ipv4address ipv4;
104		ipv6address ipv6;
105	} witness_IPaddrInfo;
106
107	typedef [flag(NDR_NOALIGN|NDR_LITTLE_ENDIAN)] struct {
108		[value(r->num*ndr_size_witness_IPaddrInfo(r->addr, ndr->flags))] uint32 length;
109		[value(0)] uint32 reserved;
110		uint32 num;
111		witness_IPaddrInfo addr[num];
112	} witness_IPaddrInfoList;
113
114	typedef [public,switch_type(witness_notifyResponse_type),nodiscriminant, flag(NDR_NOALIGN|NDR_LITTLE_ENDIAN)] union {
115		[case(WITNESS_NOTIFY_RESOURCE_CHANGE)] witness_ResourceChange resource_change;
116		[case(WITNESS_NOTIFY_CLIENT_MOVE)]     witness_IPaddrInfoList client_move;
117		[case(WITNESS_NOTIFY_SHARE_MOVE)]      witness_IPaddrInfoList share_move;
118		[case(WITNESS_NOTIFY_IP_CHANGE)]       witness_IPaddrInfoList ip_change;
119		[default,flag(NDR_REMAINING)]          DATA_BLOB data;
120	} witness_notifyResponse_message;
121
122	typedef [flag(NDR_PAHEX),gensize,public,nopush,nopull] struct {
123		witness_notifyResponse_type type;
124		[value(ndr_size_witness_notifyResponse(r, ndr->flags)-20)] uint32 length;
125		uint32 num;
126		[subcontext(4), subcontext_size(length), flag(NDR_REMAINING), switch_is(type)] witness_notifyResponse_message messages[num];
127	} witness_notifyResponse;
128
129	[public] WERROR witness_AsyncNotify(
130		[in] policy_handle context_handle,
131		[out] witness_notifyResponse **response
132		);
133
134	/*****************/
135	/* Function 0x04 */
136
137	typedef [bitmap32bit] bitmap {
138		WITNESS_REGISTER_NONE            = 0x00,
139		WITNESS_REGISTER_IP_NOTIFICATION = 0x01
140	} witness_RegisterEx_flags;
141
142	WERROR witness_RegisterEx(
143		[out,ref] policy_handle *context_handle,
144		[in] witness_version version,
145		[in,unique,string,charset(UTF16)] uint16 *net_name,
146		[in,unique,string,charset(UTF16)] uint16 *share_name,
147		[in,unique,string,charset(UTF16)] uint16 *ip_address,
148		[in,unique,string,charset(UTF16)] uint16 *client_computer_name,
149		[in] witness_RegisterEx_flags flags,
150		[in] uint32 timeout
151		);
152}
153