1 /**
2  * This file is part of the mingw-w64 runtime package.
3  * No warranty is given; refer to the file DISCLAIMER within this package.
4  */
5 
6 #ifndef _P2P_H_
7 #define _P2P_H_
8 
9 #include <winapifamily.h>
10 
11 #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP)
12 #ifndef __WIDL__
13 #include <winsock2.h>
14 #include <pnrpns.h>
15 #include <ws2tcpip.h>
16 #include <specstrings.h>
17 #endif
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 #if NTDDI_VERSION < 0x06000000
24 #ifndef NO_P2P_PNRP
25 #define NO_P2P_PNRP
26 #endif
27 
28 #ifndef NO_P2P_COLLABORATION
29 #define NO_P2P_COLLABORATION
30 #endif
31 #endif
32 
33   typedef enum peer_record_change_type_tag {
34     PEER_RECORD_ADDED = 1,
35     PEER_RECORD_UPDATED = 2,
36     PEER_RECORD_DELETED = 3,
37     PEER_RECORD_EXPIRED = 4,
38   } PEER_RECORD_CHANGE_TYPE;
39 
40   typedef enum peer_connection_status_tag {
41     PEER_CONNECTED = 1,
42     PEER_DISCONNECTED = 2,
43     PEER_CONNECTION_FAILED = 3,
44   } PEER_CONNECTION_STATUS;
45 
46   typedef enum peer_connection_flags_tag {
47     PEER_CONNECTION_NEIGHBOR = 0x0001,
48     PEER_CONNECTION_DIRECT = 0x0002,
49   } PEER_CONNECTION_FLAGS;
50 
51   typedef enum peer_record_flags_tag {
52     PEER_RECORD_FLAG_AUTOREFRESH = 0x0001,
53     PEER_RECORD_FLAG_DELETED = 0x0002,
54   } PEER_RECORD_FLAGS;
55 
56   typedef
57 #ifdef __WIDL__
58   [context_handle]
59 #endif
60   void *HPEEREVENT;
61   typedef HPEEREVENT *PHPEEREVENT;
62   typedef
63 #ifdef __WIDL__
64   [context_handle]
65 #endif
66   void *HPEERENUM;
67   typedef HPEERENUM *PHPEERENUM;
68   typedef struct peer_version_data_tag {
69     WORD wVersion;
70     WORD wHighestVersion;
71   } PEER_VERSION_DATA,*PPEER_VERSION_DATA;
72 
73   typedef struct peer_data_tag {
74     ULONG cbData;
75 #ifdef __WIDL__
76     [size_is (cbData)]
77 #endif
78     PBYTE pbData;
79   } PEER_DATA,*PPEER_DATA;
80 
81   typedef const PEER_DATA *PCPEER_DATA;
82 
83   typedef struct peer_record_tag {
84     DWORD dwSize;
85     GUID type;
86     GUID id;
87     DWORD dwVersion;
88     DWORD dwFlags;
89     PWSTR pwzCreatorId;
90     PWSTR pwzModifiedById;
91     PWSTR pwzAttributes;
92     FILETIME ftCreation;
93     FILETIME ftExpiration;
94     FILETIME ftLastModified;
95     PEER_DATA securityData;
96     PEER_DATA data;
97   } PEER_RECORD,*PPEER_RECORD;
98   typedef struct peer_address_tag {
99     DWORD dwSize;
100     SOCKADDR_IN6 sin6;
101   } PEER_ADDRESS,*PPEER_ADDRESS;
102 
103   typedef const PEER_ADDRESS *PCPEER_ADDRESS;
104 
105   typedef struct peer_connection_info_tag {
106     DWORD dwSize;
107     DWORD dwFlags;
108     ULONGLONG ullConnectionId;
109     ULONGLONG ullNodeId;
110     PWSTR pwzPeerId;
111     PEER_ADDRESS address;
112   } PEER_CONNECTION_INFO;
113 
114   typedef struct peer_event_incoming_data_tag {
115     DWORD dwSize;
116     ULONGLONG ullConnectionId;
117     GUID type;
118     PEER_DATA data;
119   } PEER_EVENT_INCOMING_DATA,*PPEER_EVENT_INCOMING_DATA;
120 
121   typedef struct peer_event_record_change_data_tag {
122     DWORD dwSize;
123     PEER_RECORD_CHANGE_TYPE changeType;
124     GUID recordId;
125     GUID recordType;
126   } PEER_EVENT_RECORD_CHANGE_DATA,*PPEER_EVENT_RECORD_CHANGE_DATA;
127 
128   typedef struct peer_event_connection_change_data_tag {
129     DWORD dwSize;
130     PEER_CONNECTION_STATUS status;
131     ULONGLONG ullConnectionId;
132     ULONGLONG ullNodeId;
133 #if NTDDI_VERSION >= 0x06000000
134     ULONGLONG ullNextConnectionId;
135     HRESULT hrConnectionFailedReason;
136 #endif
137   } PEER_EVENT_CONNECTION_CHANGE_DATA,*PPEER_EVENT_CONNECTION_CHANGE_DATA;
138 
139   typedef struct peer_event_synchronized_data_tag {
140     DWORD dwSize;
141     GUID recordType;
142   } PEER_EVENT_SYNCHRONIZED_DATA,*PPEER_EVENT_SYNCHRONIZED_DATA;
143 
144 #if !defined (NO_P2P_GRAPH) && !defined (__WIDL__)
145 #define PEER_GRAPH_VERSION MAKEWORD (1, 0)
146 
147   typedef PVOID HGRAPH,*PHGRAPH;
148 
149   typedef enum peer_graph_event_type_tag {
150     PEER_GRAPH_EVENT_STATUS_CHANGED = 1,
151     PEER_GRAPH_EVENT_PROPERTY_CHANGED = 2,
152     PEER_GRAPH_EVENT_RECORD_CHANGED = 3,
153     PEER_GRAPH_EVENT_DIRECT_CONNECTION = 4,
154     PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION = 5,
155     PEER_GRAPH_EVENT_INCOMING_DATA = 6,
156     PEER_GRAPH_EVENT_CONNECTION_REQUIRED = 7,
157     PEER_GRAPH_EVENT_NODE_CHANGED = 8,
158     PEER_GRAPH_EVENT_SYNCHRONIZED = 9,
159   } PEER_GRAPH_EVENT_TYPE;
160 
161   typedef enum peer_node_change_type_tag {
162     PEER_NODE_CHANGE_CONNECTED = 1,
163     PEER_NODE_CHANGE_DISCONNECTED = 2,
164     PEER_NODE_CHANGE_UPDATED = 3,
165   } PEER_NODE_CHANGE_TYPE;
166 
167   typedef enum peer_graph_status_flags_tag {
168     PEER_GRAPH_STATUS_LISTENING = 0x0001,
169     PEER_GRAPH_STATUS_HAS_CONNECTIONS = 0x0002,
170     PEER_GRAPH_STATUS_SYNCHRONIZED = 0x0004,
171   } PEER_GRAPH_STATUS_FLAGS;
172 
173   typedef enum peer_graph_property_flags_tag {
174     PEER_GRAPH_PROPERTY_HEARTBEATS = 0x0001,
175     PEER_GRAPH_PROPERTY_DEFER_EXPIRATION = 0x0002,
176   } PEER_GRAPH_PROPERTY_FLAGS;
177 
178   typedef enum peer_graph_scope_tag {
179     PEER_GRAPH_SCOPE_ANY = 0,
180     PEER_GRAPH_SCOPE_GLOBAL = 1,
181     PEER_GRAPH_SCOPE_SITELOCAL = 2,
182     PEER_GRAPH_SCOPE_LINKLOCAL = 3,
183     PEER_GRAPH_SCOPE_LOOPBACK = 4
184   } PEER_GRAPH_SCOPE;
185 
186   typedef struct peer_graph_properties_tag {
187     DWORD dwSize;
188     DWORD dwFlags;
189     DWORD dwScope;
190     DWORD dwMaxRecordSize;
191     PWSTR pwzGraphId;
192     PWSTR pwzCreatorId;
193     PWSTR pwzFriendlyName;
194     PWSTR pwzComment;
195     ULONG ulPresenceLifetime;
196     ULONG cPresenceMax;
197   } PEER_GRAPH_PROPERTIES,*PPEER_GRAPH_PROPERTIES;
198 
199   typedef struct peer_node_info_tag {
200     DWORD dwSize;
201     ULONGLONG ullNodeId;
202     PWSTR pwzPeerId;
203     ULONG cAddresses;
204     PPEER_ADDRESS pAddresses;
205     PWSTR pwzAttributes;
206   } PEER_NODE_INFO,*PPEER_NODE_INFO;
207 
208   typedef struct peer_event_node_change_data_tag {
209     DWORD dwSize;
210     PEER_NODE_CHANGE_TYPE changeType;
211     ULONGLONG ullNodeId;
212     PWSTR pwzPeerId;
213   } PEER_EVENT_NODE_CHANGE_DATA,*PPEER_EVENT_NODE_CHANGE_DATA;
214 
215   typedef struct peer_graph_event_registration_tag {
216     PEER_GRAPH_EVENT_TYPE eventType;
217     GUID *pType;
218   } PEER_GRAPH_EVENT_REGISTRATION,*PPEER_GRAPH_EVENT_REGISTRATION;
219 
220   typedef struct peer_graph_event_data_tag {
221     PEER_GRAPH_EVENT_TYPE eventType;
222     __C89_NAMELESS union {
223       PEER_GRAPH_STATUS_FLAGS dwStatus;
224       PEER_EVENT_INCOMING_DATA incomingData;
225       PEER_EVENT_RECORD_CHANGE_DATA recordChangeData;
226       PEER_EVENT_CONNECTION_CHANGE_DATA connectionChangeData;
227       PEER_EVENT_NODE_CHANGE_DATA nodeChangeData;
228       PEER_EVENT_SYNCHRONIZED_DATA synchronizedData;
229     };
230   } PEER_GRAPH_EVENT_DATA,*PPEER_GRAPH_EVENT_DATA;
231 
232   typedef HRESULT (CALLBACK *PFNPEER_VALIDATE_RECORD) (HGRAPH hGraph, PVOID pvContext, PPEER_RECORD pRecord, PEER_RECORD_CHANGE_TYPE changeType);
233   typedef HRESULT (CALLBACK *PFNPEER_SECURE_RECORD) (HGRAPH hGraph, PVOID pvContext, PPEER_RECORD pRecord, PEER_RECORD_CHANGE_TYPE changeType, PPEER_DATA *ppSecurityData);
234   typedef HRESULT (CALLBACK *PFNPEER_FREE_SECURITY_DATA) (HGRAPH hGraph, PVOID pvContext, PPEER_DATA pSecurityData);
235   typedef HRESULT (CALLBACK *PFNPEER_ON_PASSWORD_AUTH_FAILED) (HGRAPH hGraph, PVOID pvContext);
236 
237   typedef struct peer_security_interface_tag {
238     DWORD dwSize;
239     PWSTR pwzSspFilename;
240     PWSTR pwzPackageName;
241     ULONG cbSecurityInfo;
242     PBYTE pbSecurityInfo;
243     PVOID pvContext;
244     PFNPEER_VALIDATE_RECORD pfnValidateRecord;
245     PFNPEER_SECURE_RECORD pfnSecureRecord;
246     PFNPEER_FREE_SECURITY_DATA pfnFreeSecurityData;
247     PFNPEER_ON_PASSWORD_AUTH_FAILED pfnAuthFailed;
248   } PEER_SECURITY_INTERFACE,*PPEER_SECURITY_INTERFACE;
249 
250   HRESULT WINAPI PeerGraphStartup (WORD wVersionRequested, PPEER_VERSION_DATA pVersionData);
251   HRESULT WINAPI PeerGraphShutdown ();
252   VOID WINAPI PeerGraphFreeData (PVOID pvData);
253   HRESULT WINAPI PeerGraphGetItemCount (HPEERENUM hPeerEnum, ULONG *pCount);
254   HRESULT WINAPI PeerGraphGetNextItem (HPEERENUM hPeerEnum, ULONG *pCount, PVOID **pppvItems);
255   HRESULT WINAPI PeerGraphEndEnumeration (HPEERENUM hPeerEnum);
256   HRESULT WINAPI PeerGraphCreate (PPEER_GRAPH_PROPERTIES pGraphProperties, PCWSTR pwzDatabaseName, PPEER_SECURITY_INTERFACE pSecurityInterface, HGRAPH *phGraph);
257   HRESULT WINAPI PeerGraphOpen (PCWSTR pwzGraphId, PCWSTR pwzPeerId, PCWSTR pwzDatabaseName, PPEER_SECURITY_INTERFACE pSecurityInterface, ULONG cRecordTypeSyncPrecedence, const GUID *pRecordTypeSyncPrecedence, HGRAPH *phGraph);
258   HRESULT WINAPI PeerGraphListen (HGRAPH hGraph, DWORD dwScope, DWORD dwScopeId, WORD wPort);
259   HRESULT WINAPI PeerGraphConnect (HGRAPH hGraph, PCWSTR pwzPeerId, PPEER_ADDRESS pAddress, ULONGLONG *pullConnectionId);
260   HRESULT WINAPI PeerGraphClose (HGRAPH hGraph);
261   HRESULT WINAPI PeerGraphDelete (PCWSTR pwzGraphId, PCWSTR pwzPeerId, PCWSTR pwzDatabaseName);
262   HRESULT WINAPI PeerGraphGetStatus (HGRAPH hGraph, DWORD *pdwStatus);
263   HRESULT WINAPI PeerGraphGetProperties (HGRAPH hGraph, PPEER_GRAPH_PROPERTIES *ppGraphProperties);
264   HRESULT WINAPI PeerGraphSetProperties (HGRAPH hGraph, PPEER_GRAPH_PROPERTIES pGraphProperties);
265   HRESULT WINAPI PeerGraphRegisterEvent (HGRAPH hGraph, HANDLE hEvent, ULONG cEventRegistrations, PEER_GRAPH_EVENT_REGISTRATION *pEventRegistrations, HPEEREVENT *phPeerEvent);
266   HRESULT WINAPI PeerGraphUnregisterEvent (HPEEREVENT hPeerEvent);
267   HRESULT WINAPI PeerGraphGetEventData (HPEEREVENT hPeerEvent, PPEER_GRAPH_EVENT_DATA *ppEventData);
268   HRESULT WINAPI PeerGraphGetRecord (HGRAPH hGraph, const GUID *pRecordId, PPEER_RECORD *ppRecord);
269   HRESULT WINAPI PeerGraphAddRecord (HGRAPH hGraph, PPEER_RECORD pRecord, GUID *pRecordId);
270   HRESULT WINAPI PeerGraphUpdateRecord (HGRAPH hGraph, PPEER_RECORD pRecord);
271   HRESULT WINAPI PeerGraphDeleteRecord (HGRAPH hGraph, const GUID *pRecordId, WINBOOL fLocal);
272   HRESULT WINAPI PeerGraphEnumRecords (HGRAPH hGraph, const GUID *pRecordType, PCWSTR pwzPeerId, HPEERENUM *phPeerEnum);
273   HRESULT WINAPI PeerGraphSearchRecords (HGRAPH hGraph, PCWSTR pwzCriteria, HPEERENUM *phPeerEnum);
274   HRESULT WINAPI PeerGraphExportDatabase (HGRAPH hGraph, PCWSTR pwzFilePath);
275   HRESULT WINAPI PeerGraphImportDatabase (HGRAPH hGraph, PCWSTR pwzFilePath);
276   HRESULT WINAPI PeerGraphValidateDeferredRecords (HGRAPH hGraph, ULONG cRecordIds, const GUID *pRecordIds);
277   HRESULT WINAPI PeerGraphOpenDirectConnection (HGRAPH hGraph, PCWSTR pwzPeerId, PPEER_ADDRESS pAddress, ULONGLONG *pullConnectionId);
278   HRESULT WINAPI PeerGraphSendData (HGRAPH hGraph, ULONGLONG ullConnectionId, const GUID *pType, ULONG cbData, PVOID pvData);
279   HRESULT WINAPI PeerGraphCloseDirectConnection (HGRAPH hGraph, ULONGLONG ullConnectionId);
280   HRESULT WINAPI PeerGraphEnumConnections (HGRAPH hGraph, DWORD dwFlags, HPEERENUM *phPeerEnum);
281   HRESULT WINAPI PeerGraphEnumNodes (HGRAPH hGraph, PCWSTR pwzPeerId, HPEERENUM *phPeerEnum);
282   HRESULT WINAPI PeerGraphSetPresence (HGRAPH hGraph, WINBOOL fPresent);
283   HRESULT WINAPI PeerGraphGetNodeInfo (HGRAPH hGraph, ULONGLONG ullNodeId, PPEER_NODE_INFO *ppNodeInfo);
284   HRESULT WINAPI PeerGraphSetNodeAttributes (HGRAPH hGraph, PCWSTR pwzAttributes);
285   HRESULT WINAPI PeerGraphPeerTimeToUniversalTime (HGRAPH hGraph, FILETIME *pftPeerTime, FILETIME *pftUniversalTime);
286   HRESULT WINAPI PeerGraphUniversalTimeToPeerTime (HGRAPH hGraph, FILETIME *pftUniversalTime, FILETIME *pftPeerTime);
287 #endif
288 
289 #if !(defined (NO_P2P_GROUP) && defined (NO_P2P_IDENTITY)) && !defined (__WIDL__)
290 #include <wincrypt.h>
291   VOID WINAPI PeerFreeData (LPCVOID pvData);
292   HRESULT WINAPI PeerGetItemCount (HPEERENUM hPeerEnum, ULONG *pCount);
293   HRESULT WINAPI PeerGetNextItem (HPEERENUM hPeerEnum, ULONG *pCount, PVOID **pppvItems);
294   HRESULT WINAPI PeerEndEnumeration (HPEERENUM hPeerEnum);
295 #endif
296 
297 #ifndef NO_P2P_GROUP
298   typedef PVOID HGROUP,*PHGROUP;
299   typedef GUID PEER_ROLE_ID;
300 #if NTDDI_VERSION >= 0x06000000
301 #define PEER_GROUP_VERSION MAKEWORD (1, 1)
302 #else
303 #define PEER_GROUP_VERSION MAKEWORD (1, 0)
304 #endif
305 
306   typedef enum peer_group_event_type_tag {
307     PEER_GROUP_EVENT_STATUS_CHANGED = 1,
308     PEER_GROUP_EVENT_PROPERTY_CHANGED = 2,
309     PEER_GROUP_EVENT_RECORD_CHANGED = 3,
310     PEER_GROUP_EVENT_DIRECT_CONNECTION = 4,
311     PEER_GROUP_EVENT_NEIGHBOR_CONNECTION = 5,
312     PEER_GROUP_EVENT_INCOMING_DATA = 6,
313     PEER_GROUP_EVENT_MEMBER_CHANGED = 8,
314     PEER_GROUP_EVENT_CONNECTION_FAILED = 10,
315     PEER_GROUP_EVENT_AUTHENTICATION_FAILED = 11
316   } PEER_GROUP_EVENT_TYPE;
317 
318   typedef enum peer_group_status_tag {
319     PEER_GROUP_STATUS_LISTENING = 0x0001,
320     PEER_GROUP_STATUS_HAS_CONNECTIONS = 0x0002,
321   } PEER_GROUP_STATUS;
322 
323   typedef enum peer_group_property_flags_tag {
324     PEER_MEMBER_DATA_OPTIONAL = 0x0001,
325     PEER_DISABLE_PRESENCE = 0x0002,
326     PEER_DEFER_EXPIRATION = 0x0004,
327   } PEER_GROUP_PROPERTY_FLAGS;
328 
329 #if NTDDI_VERSION >= 0x06000000
330   typedef enum peer_group_authentication_scheme_tag {
331     PEER_GROUP_GMC_AUTHENTICATION = 0x00000001,
332     PEER_GROUP_PASSWORD_AUTHENTICATION = 0x00000002,
333   } PEER_GROUP_AUTHENTICATION_SCHEME;
334 #endif
335 
336   typedef enum peer_member_flags_tag {
337     PEER_MEMBER_PRESENT = 0x0001,
338   } PEER_MEMBER_FLAGS;
339 
340   typedef enum peer_member_change_type_tag {
341     PEER_MEMBER_CONNECTED = 1,
342     PEER_MEMBER_DISCONNECTED = 2,
343     PEER_MEMBER_UPDATED = 3,
344     PEER_MEMBER_JOINED = 4,
345     PEER_MEMBER_LEFT = 5,
346   } PEER_MEMBER_CHANGE_TYPE;
347 
348   typedef enum peer_issue_credential_flags_tag {
349     PEER_GROUP_STORE_CREDENTIALS = 0x0001,
350   } PEER_GROUP_ISSUE_CREDENTIAL_FLAGS;
351 
352 #ifndef __WIDL__
353   typedef struct peer_credential_info_tag {
354     DWORD dwSize;
355     DWORD dwFlags;
356     PWSTR pwzFriendlyName;
357     CERT_PUBLIC_KEY_INFO *pPublicKey;
358     PWSTR pwzIssuerPeerName;
359     PWSTR pwzIssuerFriendlyName;
360     FILETIME ftValidityStart;
361     FILETIME ftValidityEnd;
362     ULONG cRoles;
363     PEER_ROLE_ID *pRoles;
364   } PEER_CREDENTIAL_INFO,*PPEER_CREDENTIAL_INFO;
365 
366   typedef struct peer_member_tag {
367     DWORD dwSize;
368     DWORD dwFlags;
369     PWSTR pwzIdentity;
370     PWSTR pwzAttributes;
371     ULONGLONG ullNodeId;
372     ULONG cAddresses;
373     PEER_ADDRESS *pAddresses;
374     PEER_CREDENTIAL_INFO *pCredentialInfo;
375   } PEER_MEMBER,*PPEER_MEMBER;
376 
377   typedef struct peer_invitation_info_tag {
378     DWORD dwSize;
379     DWORD dwFlags;
380     PWSTR pwzCloudName;
381     DWORD dwScope;
382     DWORD dwCloudFlags;
383     PWSTR pwzGroupPeerName;
384     PWSTR pwzIssuerPeerName;
385     PWSTR pwzSubjectPeerName;
386     PWSTR pwzGroupFriendlyName;
387     PWSTR pwzIssuerFriendlyName;
388     PWSTR pwzSubjectFriendlyName;
389     FILETIME ftValidityStart;
390     FILETIME ftValidityEnd;
391     ULONG cRoles;
392     PEER_ROLE_ID *pRoles;
393     ULONG cClassifiers;
394     PWSTR *ppwzClassifiers;
395     CERT_PUBLIC_KEY_INFO *pSubjectPublicKey;
396 #if NTDDI_VERSION >= 0x06000000
397     PEER_GROUP_AUTHENTICATION_SCHEME authScheme;
398 #endif
399   } PEER_INVITATION_INFO,*PPEER_INVITATION_INFO;
400 #endif
401 
402   typedef struct peer_group_properties_tag {
403     DWORD dwSize;
404     DWORD dwFlags;
405     PWSTR pwzCloud;
406     PWSTR pwzClassifier;
407     PWSTR pwzGroupPeerName;
408     PWSTR pwzCreatorPeerName;
409     PWSTR pwzFriendlyName;
410     PWSTR pwzComment;
411     ULONG ulMemberDataLifetime;
412     ULONG ulPresenceLifetime;
413 #if NTDDI_VERSION >= 0x06000000
414     DWORD dwAuthenticationSchemes;
415     PWSTR pwzGroupPassword;
416     PEER_ROLE_ID groupPasswordRole;
417 #endif
418   } PEER_GROUP_PROPERTIES,*PPEER_GROUP_PROPERTIES;
419 
420   typedef struct peer_event_member_change_data_tag {
421     DWORD dwSize;
422     PEER_MEMBER_CHANGE_TYPE changeType;
423     PWSTR pwzIdentity;
424   } PEER_EVENT_MEMBER_CHANGE_DATA,*PPEER_EVENT_MEMBER_CHANGE_DATA;
425 
426   typedef struct peer_group_event_registration_tag {
427     PEER_GROUP_EVENT_TYPE eventType;
428     GUID *pType;
429   } PEER_GROUP_EVENT_REGISTRATION,*PPEER_GROUP_EVENT_REGISTRATION;
430 
431 #ifdef __WIDL__
432   typedef struct peer_group_event_data_tag {
433     PEER_GROUP_EVENT_TYPE eventType;
434     [switch_is (eventType)] union {
435       [case (PEER_GROUP_EVENT_STATUS_CHANGED)] PEER_GROUP_STATUS dwStatus;
436       [case (PEER_GROUP_EVENT_PROPERTY_CHANGED)] ;
437       [case (PEER_GROUP_EVENT_RECORD_CHANGED)] PEER_EVENT_RECORD_CHANGE_DATA recordChangeData;
438       [case (PEER_GROUP_EVENT_NEIGHBOR_CONNECTION, PEER_GROUP_EVENT_DIRECT_CONNECTION)] PEER_EVENT_CONNECTION_CHANGE_DATA connectionChangeData;
439       [case (PEER_GROUP_EVENT_INCOMING_DATA)] PEER_EVENT_INCOMING_DATA incomingData;
440       [case (PEER_GROUP_EVENT_MEMBER_CHANGED)] PEER_EVENT_MEMBER_CHANGE_DATA memberChangeData;
441       [case (PEER_GROUP_EVENT_CONNECTION_FAILED)] HRESULT hrConnectionFailedReason;
442       [default] ;
443     };
444   } PEER_GROUP_EVENT_DATA,*PPEER_GROUP_EVENT_DATA;
445 #else
446   typedef struct peer_group_event_data_tag {
447     PEER_GROUP_EVENT_TYPE eventType;
448     __C89_NAMELESS union {
449       PEER_GROUP_STATUS dwStatus;
450       PEER_EVENT_INCOMING_DATA incomingData;
451       PEER_EVENT_RECORD_CHANGE_DATA recordChangeData;
452       PEER_EVENT_CONNECTION_CHANGE_DATA connectionChangeData;
453       PEER_EVENT_MEMBER_CHANGE_DATA memberChangeData;
454       HRESULT hrConnectionFailedReason;
455     };
456   } PEER_GROUP_EVENT_DATA,*PPEER_GROUP_EVENT_DATA;
457 #endif
458 
459   typedef struct peer_name_pair_tag {
460     DWORD dwSize;
461     PWSTR pwzPeerName;
462     PWSTR pwzFriendlyName;
463   } PEER_NAME_PAIR,*PPEER_NAME_PAIR;
464 
465 #ifndef __WIDL__
466   HRESULT WINAPI PeerGroupStartup (WORD wVersionRequested, PPEER_VERSION_DATA pVersionData);
467   HRESULT WINAPI PeerGroupShutdown ();
468   HRESULT WINAPI PeerGroupCreate (PPEER_GROUP_PROPERTIES pProperties, HGROUP *phGroup);
469   HRESULT WINAPI PeerGroupOpen (PCWSTR pwzIdentity, PCWSTR pwzGroupPeerName, PCWSTR pwzCloud, HGROUP *phGroup);
470   HRESULT WINAPI PeerGroupJoin (PCWSTR pwzIdentity, PCWSTR pwzInvitation, PCWSTR pwzCloud, HGROUP *phGroup);
471   HRESULT WINAPI PeerGroupConnect (HGROUP hGroup);
472   HRESULT WINAPI PeerGroupClose (HGROUP hGroup);
473   HRESULT WINAPI PeerGroupDelete (PCWSTR pwzIdentity, PCWSTR pwzGroupPeerName);
474   HRESULT WINAPI PeerGroupCreateInvitation (HGROUP hGroup, PCWSTR pwzIdentityInfo, FILETIME *pftExpiration, ULONG cRoles, const GUID *pRoles, PWSTR *ppwzInvitation);
475   HRESULT WINAPI PeerGroupParseInvitation (PCWSTR pwzInvitation, PPEER_INVITATION_INFO *ppInvitationInfo);
476   HRESULT WINAPI PeerGroupGetStatus (HGROUP hGroup, DWORD *pdwStatus);
477   HRESULT WINAPI PeerGroupGetProperties (HGROUP hGroup, PPEER_GROUP_PROPERTIES *ppProperties);
478   HRESULT WINAPI PeerGroupSetProperties (HGROUP hGroup, PPEER_GROUP_PROPERTIES pProperties);
479   HRESULT WINAPI PeerGroupEnumMembers (HGROUP hGroup, DWORD dwFlags, PCWSTR pwzIdentity, HPEERENUM *phPeerEnum);
480   HRESULT WINAPI PeerGroupOpenDirectConnection (HGROUP hGroup, PCWSTR pwzIdentity, PPEER_ADDRESS pAddress, ULONGLONG *pullConnectionId);
481   HRESULT WINAPI PeerGroupCloseDirectConnection (HGROUP hGroup, ULONGLONG ullConnectionId);
482   HRESULT WINAPI PeerGroupEnumConnections (HGROUP hGroup, DWORD dwFlags, HPEERENUM *phPeerEnum);
483   HRESULT WINAPI PeerGroupSendData (HGROUP hGroup, ULONGLONG ullConnectionId, const GUID *pType, ULONG cbData, PVOID pvData);
484   HRESULT WINAPI PeerGroupRegisterEvent (HGROUP hGroup, HANDLE hEvent, DWORD cEventRegistration, PEER_GROUP_EVENT_REGISTRATION *pEventRegistrations, HPEEREVENT *phPeerEvent);
485   HRESULT WINAPI PeerGroupUnregisterEvent (HPEEREVENT hPeerEvent);
486   HRESULT WINAPI PeerGroupGetEventData (HPEEREVENT hPeerEvent, PPEER_GROUP_EVENT_DATA *ppEventData);
487   HRESULT WINAPI PeerGroupGetRecord (HGROUP hGroup, const GUID *pRecordId, PPEER_RECORD *ppRecord);
488   HRESULT WINAPI PeerGroupAddRecord (HGROUP hGroup, PPEER_RECORD pRecord, GUID *pRecordId);
489   HRESULT WINAPI PeerGroupUpdateRecord (HGROUP hGroup, PPEER_RECORD pRecord);
490   HRESULT WINAPI PeerGroupDeleteRecord (HGROUP hGroup, const GUID *pRecordId);
491   HRESULT WINAPI PeerGroupEnumRecords (HGROUP hGroup, const GUID *pRecordType, HPEERENUM *phPeerEnum);
492   HRESULT WINAPI PeerGroupSearchRecords (HGROUP hGroup, PCWSTR pwzCriteria, HPEERENUM *phPeerEnum);
493   HRESULT WINAPI PeerGroupExportDatabase (HGROUP hGroup, PCWSTR pwzFilePath);
494   HRESULT WINAPI PeerGroupImportDatabase (HGROUP hGroup, PCWSTR pwzFilePath);
495   HRESULT WINAPI PeerGroupIssueCredentials (HGROUP hGroup, PCWSTR pwzSubjectIdentity, PEER_CREDENTIAL_INFO *pCredentialInfo, DWORD dwFlags, PWSTR *ppwzInvitation);
496   HRESULT WINAPI PeerGroupExportConfig (HGROUP hGroup, PCWSTR pwzPassword, PWSTR *ppwzXML);
497   HRESULT WINAPI PeerGroupImportConfig (PCWSTR pwzXML, PCWSTR pwzPassword, WINBOOL fOverwrite, PWSTR *ppwzIdentity, PWSTR *ppwzGroup);
498   HRESULT WINAPI PeerGroupPeerTimeToUniversalTime (HGROUP hGroup, FILETIME *pftPeerTime, FILETIME *pftUniversalTime);
499   HRESULT WINAPI PeerGroupUniversalTimeToPeerTime (HGROUP hGroup, FILETIME *pftUniversalTime, FILETIME *pftPeerTime);
500 #if NTDDI_VERSION >= 0x06000000
501   HRESULT WINAPI PeerGroupPasswordJoin (PCWSTR pwzIdentity, PCWSTR pwzInvitation, PCWSTR pwzPassword, PCWSTR pwzCloud, HGROUP *phGroup);
502   HRESULT WINAPI PeerGroupConnectByAddress (HGROUP hGroup, ULONG cAddresses, PPEER_ADDRESS pAddresses);
503   HRESULT WINAPI PeerGroupCreatePasswordInvitation (HGROUP hGroup, PWSTR *ppwzInvitation);
504 #endif
505 #if NTDDI_VERSION >= 0x06010000
506   HRESULT WINAPI PeerGroupResumePasswordAuthentication (HGROUP hGroup, HPEEREVENT hPeerEventHandle);
507 #endif
508 #endif
509 #endif
510 
511 #if !defined (NO_P2P_IDENTITY) && !defined (__WIDL__)
512   HRESULT WINAPI PeerIdentityCreate (PCWSTR pwzClassifier, PCWSTR pwzFriendlyName, HCRYPTPROV hCryptProv, PWSTR *ppwzIdentity);
513   HRESULT WINAPI PeerIdentityGetFriendlyName (PCWSTR pwzIdentity, PWSTR *ppwzFriendlyName);
514   HRESULT WINAPI PeerIdentitySetFriendlyName (PCWSTR pwzIdentity, PCWSTR pwzFriendlyName);
515   HRESULT WINAPI PeerIdentityGetCryptKey (PCWSTR pwzIdentity, HCRYPTPROV *phCryptProv);
516   HRESULT WINAPI PeerIdentityDelete (PCWSTR pwzIdentity);
517   HRESULT WINAPI PeerEnumIdentities (HPEERENUM *phPeerEnum);
518   HRESULT WINAPI PeerEnumGroups (PCWSTR pwzIdentity, HPEERENUM *phPeerEnum);
519   HRESULT WINAPI PeerCreatePeerName (PCWSTR pwzIdentity, PCWSTR pwzClassifier, PWSTR *ppwzPeerName);
520   HRESULT WINAPI PeerIdentityGetXML (PCWSTR pwzIdentity, PWSTR *ppwzIdentityXML);
521   HRESULT WINAPI PeerIdentityExport (PCWSTR pwzIdentity, PCWSTR pwzPassword, PWSTR *ppwzExportXML);
522   HRESULT WINAPI PeerIdentityImport (PCWSTR pwzImportXML, PCWSTR pwzPassword, PWSTR *ppwzIdentity);
523   HRESULT WINAPI PeerIdentityGetDefault (PWSTR *ppwzPeerName);
524 #endif
525 
526 #ifndef NO_P2P_COLLABORATION
527 #define PEER_COLLAB_VERSION MAKEWORD (1, 0)
528 
529   typedef enum peer_signin_flags_tag {
530     PEER_SIGNIN_NONE = 0x0,
531     PEER_SIGNIN_NEAR_ME = 0x1,
532     PEER_SIGNIN_INTERNET = 0x2,
533     PEER_SIGNIN_ALL = PEER_SIGNIN_INTERNET | PEER_SIGNIN_NEAR_ME
534   } PEER_SIGNIN_FLAGS;
535 
536   typedef enum peer_watch_permission_tag {
537     PEER_WATCH_BLOCKED = 0,
538     PEER_WATCH_ALLOWED = 1
539   } PEER_WATCH_PERMISSION;
540 
541   typedef enum peer_publication_scope_tag {
542     PEER_PUBLICATION_SCOPE_NONE = 0x0,
543     PEER_PUBLICATION_SCOPE_NEAR_ME = 0x1,
544     PEER_PUBLICATION_SCOPE_INTERNET = 0x2,
545     PEER_PUBLICATION_SCOPE_ALL = PEER_PUBLICATION_SCOPE_NEAR_ME | PEER_PUBLICATION_SCOPE_INTERNET
546   } PEER_PUBLICATION_SCOPE;
547 
548   typedef struct peer_application_tag {
549     GUID id;
550     PEER_DATA data;
551     PWSTR pwzDescription;
552   } PEER_APPLICATION,*PPEER_APPLICATION;
553 
554   typedef const PEER_APPLICATION *PCPEER_APPLICATION;
555 
556   typedef struct peer_object_tag {
557     GUID id;
558     PEER_DATA data;
559     DWORD dwPublicationScope;
560   } PEER_OBJECT,*PPEER_OBJECT;
561 
562   typedef const PEER_OBJECT *PCPEER_OBJECT;
563 
564   typedef struct peer_contact_tag {
565     PWSTR pwzPeerName;
566     PWSTR pwzNickName;
567     PWSTR pwzDisplayName;
568     PWSTR pwzEmailAddress;
569     WINBOOL fWatch;
570     PEER_WATCH_PERMISSION WatcherPermissions;
571     PEER_DATA credentials;
572   } PEER_CONTACT,*PPEER_CONTACT;
573 
574   typedef const PEER_CONTACT *PCPEER_CONTACT;
575 
576   typedef struct peer_endpoint_tag {
577     PEER_ADDRESS address;
578     PWSTR pwzEndpointName;
579   } PEER_ENDPOINT,*PPEER_ENDPOINT;
580 
581   typedef const PEER_ENDPOINT *PCPEER_ENDPOINT;
582 
583   typedef struct peer_people_near_me_tag {
584     PWSTR pwzNickName;
585     PEER_ENDPOINT endpoint;
586     GUID id;
587   } PEER_PEOPLE_NEAR_ME,*PPEER_PEOPLE_NEAR_ME;
588 
589   typedef const PEER_PEOPLE_NEAR_ME *PCPEER_PEOPLE_NEAR_ME;
590 
591   typedef PPEER_PEOPLE_NEAR_ME *PPPEER_PEOPLE_NEAR_ME;
592 
593 #ifndef __WIDL__
594   HRESULT WINAPI PeerCollabStartup (WORD wVersionRequested);
595   HRESULT WINAPI PeerCollabShutdown ();
596   HRESULT WINAPI PeerCollabSignin (HWND hwndParent, DWORD dwSigninOptions);
597   HRESULT WINAPI PeerCollabSignout (DWORD dwSigninOptions);
598   HRESULT WINAPI PeerCollabGetSigninOptions (DWORD *pdwSigninOptions);
599 #endif
600 
601   typedef enum peer_invitation_response_type_tag {
602     PEER_INVITATION_RESPONSE_DECLINED = 0,
603     PEER_INVITATION_RESPONSE_ACCEPTED = 1,
604     PEER_INVITATION_RESPONSE_EXPIRED = 2,
605     PEER_INVITATION_RESPONSE_ERROR = 3
606   } PEER_INVITATION_RESPONSE_TYPE;
607 
608   typedef enum peer_application_registration_type_tag {
609     PEER_APPLICATION_CURRENT_USER = 0,
610     PEER_APPLICATION_ALL_USERS = 1
611   } PEER_APPLICATION_REGISTRATION_TYPE;
612 
613   typedef struct peer_invitation_tag {
614     GUID applicationId;
615     PEER_DATA applicationData;
616     PWSTR pwzMessage;
617   } PEER_INVITATION,*PPEER_INVITATION;
618 
619   typedef const PEER_INVITATION *PCPEER_INVITATION;
620 
621   typedef struct peer_invitation_response_tag {
622     PEER_INVITATION_RESPONSE_TYPE action;
623     PWSTR pwzMessage;
624     HRESULT hrExtendedInfo;
625   } PEER_INVITATION_RESPONSE,*PPEER_INVITATION_RESPONSE;
626 
627   typedef const PEER_INVITATION_RESPONSE *PCPEER_INVITATION_RESPONSE;
628 
629   typedef struct peer_app_launch_info_tag {
630     PPEER_CONTACT pContact;
631     PPEER_ENDPOINT pEndpoint;
632     PPEER_INVITATION pInvitation;
633   } PEER_APP_LAUNCH_INFO,*PPEER_APP_LAUNCH_INFO;
634 
635   typedef const PEER_APP_LAUNCH_INFO *PCPEER_APP_LAUNCH_INFO;
636 
637   typedef struct peer_application_registration_info_tag {
638     PEER_APPLICATION application;
639     PWSTR pwzApplicationToLaunch;
640     PWSTR pwzApplicationArguments;
641     DWORD dwPublicationScope;
642   } PEER_APPLICATION_REGISTRATION_INFO,*PPEER_APPLICATION_REGISTRATION_INFO;
643 
644   typedef const PEER_APPLICATION_REGISTRATION_INFO *PCPEER_APPLICATION_REGISTRATION_INFO;
645 
646 #ifndef __WIDL__
647   HRESULT WINAPI PeerCollabAsyncInviteContact (PCPEER_CONTACT pcContact, PCPEER_ENDPOINT pcEndpoint, PCPEER_INVITATION pcInvitation, HANDLE hEvent, HANDLE *phInvitation);
648   HRESULT WINAPI PeerCollabGetInvitationResponse (HANDLE hInvitation, PPEER_INVITATION_RESPONSE *ppInvitationResponse);
649   HRESULT WINAPI PeerCollabCancelInvitation (HANDLE hInvitation);
650   HRESULT WINAPI PeerCollabCloseHandle (HANDLE hInvitation);
651   HRESULT WINAPI PeerCollabInviteContact (PCPEER_CONTACT pcContact, PCPEER_ENDPOINT pcEndpoint, PCPEER_INVITATION pcInvitation, PPEER_INVITATION_RESPONSE *ppResponse);
652   HRESULT WINAPI PeerCollabAsyncInviteEndpoint (PCPEER_ENDPOINT pcEndpoint, PCPEER_INVITATION pcInvitation, HANDLE hEvent, HANDLE *phInvitation);
653   HRESULT WINAPI PeerCollabInviteEndpoint (PCPEER_ENDPOINT pcEndpoint, PCPEER_INVITATION pcInvitation, PPEER_INVITATION_RESPONSE *ppResponse);
654   HRESULT WINAPI PeerCollabGetAppLaunchInfo (PPEER_APP_LAUNCH_INFO *ppLaunchInfo);
655   HRESULT WINAPI PeerCollabRegisterApplication (PCPEER_APPLICATION_REGISTRATION_INFO pcApplication, PEER_APPLICATION_REGISTRATION_TYPE registrationType);
656   HRESULT WINAPI PeerCollabUnregisterApplication (const GUID *pApplicationId, PEER_APPLICATION_REGISTRATION_TYPE registrationType);
657   HRESULT WINAPI PeerCollabGetApplicationRegistrationInfo (const GUID *pApplicationId, PEER_APPLICATION_REGISTRATION_TYPE registrationType, PPEER_APPLICATION_REGISTRATION_INFO *ppApplication);
658   HRESULT WINAPI PeerCollabEnumApplicationRegistrationInfo (PEER_APPLICATION_REGISTRATION_TYPE registrationType, HPEERENUM *phPeerEnum);
659 #endif
660 
661   typedef enum peer_presence_status_tag {
662     PEER_PRESENCE_OFFLINE = 0,
663     PEER_PRESENCE_OUT_TO_LUNCH = 1,
664     PEER_PRESENCE_AWAY = 2,
665     PEER_PRESENCE_BE_RIGHT_BACK = 3,
666     PEER_PRESENCE_IDLE = 4,
667     PEER_PRESENCE_BUSY = 5,
668     PEER_PRESENCE_ON_THE_PHONE = 6,
669     PEER_PRESENCE_ONLINE = 7
670   } PEER_PRESENCE_STATUS;
671 
672   typedef struct peer_presence_info_tag {
673     PEER_PRESENCE_STATUS status;
674     PWSTR pwzDescriptiveText;
675   } PEER_PRESENCE_INFO,*PPEER_PRESENCE_INFO;
676 
677   typedef const PEER_PRESENCE_INFO *PCPEER_PRESENCE_INFO;
678 
679 #ifndef __WIDL__
680   HRESULT WINAPI PeerCollabGetPresenceInfo (PCPEER_ENDPOINT pcEndpoint, PPEER_PRESENCE_INFO *ppPresenceInfo);
681   HRESULT WINAPI PeerCollabEnumApplications (PCPEER_ENDPOINT pcEndpoint, const GUID *pApplicationId, HPEERENUM *phPeerEnum);
682   HRESULT WINAPI PeerCollabEnumObjects (PCPEER_ENDPOINT pcEndpoint, const GUID *pObjectId, HPEERENUM *phPeerEnum);
683   HRESULT WINAPI PeerCollabEnumEndpoints (PCPEER_CONTACT pcContact, HPEERENUM *phPeerEnum);
684   HRESULT WINAPI PeerCollabRefreshEndpointData (PCPEER_ENDPOINT pcEndpoint);
685   HRESULT WINAPI PeerCollabDeleteEndpointData (PCPEER_ENDPOINT pcEndpoint);
686   HRESULT WINAPI PeerCollabQueryContactData (PCPEER_ENDPOINT pcEndpoint, PWSTR *ppwzContactData);
687   HRESULT WINAPI PeerCollabSubscribeEndpointData (const PCPEER_ENDPOINT pcEndpoint);
688   HRESULT WINAPI PeerCollabUnsubscribeEndpointData (const PCPEER_ENDPOINT pcEndpoint);
689   HRESULT WINAPI PeerCollabSetPresenceInfo (PCPEER_PRESENCE_INFO pcPresenceInfo);
690   HRESULT WINAPI PeerCollabGetEndpointName (PWSTR *ppwzEndpointName);
691   HRESULT WINAPI PeerCollabSetEndpointName (PCWSTR pwzEndpointName);
692   HRESULT WINAPI PeerCollabSetObject (PCPEER_OBJECT pcObject);
693   HRESULT WINAPI PeerCollabDeleteObject (const GUID *pObjectId);
694 #endif
695 
696   typedef enum peer_change_type_tag {
697     PEER_CHANGE_ADDED = 0,
698     PEER_CHANGE_DELETED = 1,
699     PEER_CHANGE_UPDATED = 2
700   } PEER_CHANGE_TYPE;
701 
702   typedef enum peer_collab_event_type_tag {
703     PEER_EVENT_WATCHLIST_CHANGED = 1,
704     PEER_EVENT_ENDPOINT_CHANGED = 2,
705     PEER_EVENT_ENDPOINT_PRESENCE_CHANGED = 3,
706     PEER_EVENT_ENDPOINT_APPLICATION_CHANGED = 4,
707     PEER_EVENT_ENDPOINT_OBJECT_CHANGED = 5,
708     PEER_EVENT_MY_ENDPOINT_CHANGED = 6,
709     PEER_EVENT_MY_PRESENCE_CHANGED = 7,
710     PEER_EVENT_MY_APPLICATION_CHANGED = 8,
711     PEER_EVENT_MY_OBJECT_CHANGED = 9,
712     PEER_EVENT_PEOPLE_NEAR_ME_CHANGED = 10,
713     PEER_EVENT_REQUEST_STATUS_CHANGED = 11
714   } PEER_COLLAB_EVENT_TYPE;
715 
716   typedef struct peer_collab_event_registration_tag {
717     PEER_COLLAB_EVENT_TYPE eventType;
718 #ifdef __WIDL__
719     [unique]
720 #endif
721     GUID *pInstance;
722   } PEER_COLLAB_EVENT_REGISTRATION,*PPEER_COLLAB_EVENT_REGISTRATION;
723 
724   typedef struct peer_event_watchlist_changed_data_tag {
725     PPEER_CONTACT pContact;
726     PEER_CHANGE_TYPE changeType;
727   } PEER_EVENT_WATCHLIST_CHANGED_DATA,*PPEER_EVENT_WATCHLIST_CHANGED_DATA;
728 
729   typedef struct peer_event_presence_changed_data_tag {
730     PPEER_CONTACT pContact;
731     PPEER_ENDPOINT pEndpoint;
732     PEER_CHANGE_TYPE changeType;
733     PPEER_PRESENCE_INFO pPresenceInfo;
734   } PEER_EVENT_PRESENCE_CHANGED_DATA,*PPEER_EVENT_PRESENCE_CHANGED_DATA;
735 
736   typedef struct peer_event_application_changed_data_tag {
737     PPEER_CONTACT pContact;
738     PPEER_ENDPOINT pEndpoint;
739     PEER_CHANGE_TYPE changeType;
740     PPEER_APPLICATION pApplication;
741   } PEER_EVENT_APPLICATION_CHANGED_DATA,*PPEER_EVENT_APPLICATION_CHANGED_DATA;
742 
743   typedef struct peer_event_object_changed_data_tag {
744     PPEER_CONTACT pContact;
745     PPEER_ENDPOINT pEndpoint;
746     PEER_CHANGE_TYPE changeType;
747     PPEER_OBJECT pObject;
748   } PEER_EVENT_OBJECT_CHANGED_DATA,*PPEER_EVENT_OBJECT_CHANGED_DATA;
749 
750   typedef struct peer_event_endpoint_changed_data_tag {
751     PPEER_CONTACT pContact;
752     PPEER_ENDPOINT pEndpoint;
753   } PEER_EVENT_ENDPOINT_CHANGED_DATA,*PPEER_EVENT_ENDPOINT_CHANGED_DATA;
754 
755   typedef struct peer_event_people_near_me_changed_data_tag {
756     PEER_CHANGE_TYPE changeType;
757     PPEER_PEOPLE_NEAR_ME pPeopleNearMe;
758   } PEER_EVENT_PEOPLE_NEAR_ME_CHANGED_DATA,*PPEER_EVENT_PEOPLE_NEAR_ME_CHANGED_DATA;
759 
760   typedef struct peer_event_request_status_changed_data_tag {
761     PPEER_ENDPOINT pEndpoint;
762     HRESULT hrChange;
763   } PEER_EVENT_REQUEST_STATUS_CHANGED_DATA,*PPEER_EVENT_REQUEST_STATUS_CHANGED_DATA;
764 
765 #ifdef __WIDL__
766   typedef struct peer_collab_event_data_tag {
767     PEER_COLLAB_EVENT_TYPE eventType;
768     [switch_is (eventType)]
769     union {
770       [case (PEER_EVENT_WATCHLIST_CHANGED)] PEER_EVENT_WATCHLIST_CHANGED_DATA watchListChangedData;
771       [case (PEER_EVENT_ENDPOINT_PRESENCE_CHANGED, PEER_EVENT_MY_PRESENCE_CHANGED)] PEER_EVENT_PRESENCE_CHANGED_DATA presenceChangedData;
772       [case (PEER_EVENT_ENDPOINT_APPLICATION_CHANGED, PEER_EVENT_MY_APPLICATION_CHANGED)] PEER_EVENT_APPLICATION_CHANGED_DATA applicationChangedData;
773       [case (PEER_EVENT_ENDPOINT_OBJECT_CHANGED, PEER_EVENT_MY_OBJECT_CHANGED)] PEER_EVENT_OBJECT_CHANGED_DATA objectChangedData;
774       [case (PEER_EVENT_ENDPOINT_CHANGED, PEER_EVENT_MY_ENDPOINT_CHANGED)] PEER_EVENT_ENDPOINT_CHANGED_DATA endpointChangedData;
775       [case (PEER_EVENT_PEOPLE_NEAR_ME_CHANGED)] PEER_EVENT_PEOPLE_NEAR_ME_CHANGED_DATA peopleNearMeChangedData;
776       [case (PEER_EVENT_REQUEST_STATUS_CHANGED)] PEER_EVENT_REQUEST_STATUS_CHANGED_DATA requestStatusChangedData;
777       [default] ;
778     };
779   } PEER_COLLAB_EVENT_DATA,*PPEER_COLLAB_EVENT_DATA;
780 #else
781   typedef struct peer_collab_event_data_tag {
782     PEER_COLLAB_EVENT_TYPE eventType;
783     __C89_NAMELESS union {
784       PEER_EVENT_WATCHLIST_CHANGED_DATA watchListChangedData;
785       PEER_EVENT_PRESENCE_CHANGED_DATA presenceChangedData;
786       PEER_EVENT_APPLICATION_CHANGED_DATA applicationChangedData;
787       PEER_EVENT_OBJECT_CHANGED_DATA objectChangedData;
788       PEER_EVENT_ENDPOINT_CHANGED_DATA endpointChangedData;
789       PEER_EVENT_PEOPLE_NEAR_ME_CHANGED_DATA peopleNearMeChangedData;
790       PEER_EVENT_REQUEST_STATUS_CHANGED_DATA requestStatusChangedData;
791     };
792   } PEER_COLLAB_EVENT_DATA,*PPEER_COLLAB_EVENT_DATA;
793 
794   HRESULT WINAPI PeerCollabRegisterEvent (HANDLE hEvent, DWORD cEventRegistration, PEER_COLLAB_EVENT_REGISTRATION *pEventRegistrations, HPEEREVENT *phPeerEvent);
795   HRESULT WINAPI PeerCollabGetEventData (HPEEREVENT hPeerEvent, PPEER_COLLAB_EVENT_DATA *ppEventData);
796   HRESULT WINAPI PeerCollabUnregisterEvent (HPEEREVENT hPeerEvent);
797   HRESULT WINAPI PeerCollabEnumPeopleNearMe (HPEERENUM *phPeerEnum);
798   HRESULT WINAPI PeerCollabAddContact (PCWSTR pwzContactData, PPEER_CONTACT *ppContact);
799   HRESULT WINAPI PeerCollabDeleteContact (PCWSTR pwzPeerName);
800   HRESULT WINAPI PeerCollabGetContact (PCWSTR pwzPeerName, PPEER_CONTACT *ppContact);
801   HRESULT WINAPI PeerCollabUpdateContact (PCPEER_CONTACT pContact);
802   HRESULT WINAPI PeerCollabEnumContacts (HPEERENUM *phPeerEnum);
803   HRESULT WINAPI PeerCollabExportContact (PCWSTR pwzPeerName, PWSTR *ppwzContactData);
804   HRESULT WINAPI PeerCollabParseContact (PCWSTR pwzContactData, PPEER_CONTACT *ppContact);
805 #endif
806 #endif
807 
808 #if !defined (NO_P2P_PNRP) && !defined (__WIDL__)
809 #define PNRP_VERSION MAKEWORD (2, 0)
810 
811 #define PEER_PNRP_ALL_LINK_CLOUDS L"PEER_PNRP_ALL_LINKS"
812 #define PEER_PNRP_AUTO_ADDRESSES ((ULONG) (-1))
813 
814   typedef PVOID HRESOLUTION, HREGISTRATION;
815 
816   typedef struct peer_pnrp_endpoint_info_tag {
817     PWSTR pwzPeerName;
818     ULONG cAddresses;
819     SOCKADDR **ppAddresses;
820     PWSTR pwzComment;
821     PEER_DATA payload;
822   } PEER_PNRP_ENDPOINT_INFO,*PPEER_PNRP_ENDPOINT_INFO;
823 
824   typedef struct peer_pnrp_cloud_info_tag {
825     PWSTR pwzCloudName;
826     PNRP_SCOPE dwScope;
827     DWORD dwScopeId;
828   } PEER_PNRP_CLOUD_INFO,*PPEER_PNRP_CLOUD_INFO;
829 
830   typedef struct peer_pnrp_registration_info_tag {
831     PWSTR pwzCloudName;
832     PWSTR pwzPublishingIdentity;
833     ULONG cAddresses;
834     SOCKADDR **ppAddresses;
835     WORD wPort;
836     PWSTR pwzComment;
837     PEER_DATA payload;
838   } PEER_PNRP_REGISTRATION_INFO,*PPEER_PNRP_REGISTRATION_INFO;
839 
840   HRESULT WINAPI PeerNameToPeerHostName (PCWSTR pwzPeerName, PWSTR *ppwzHostName);
841   HRESULT WINAPI PeerHostNameToPeerName (PCWSTR pwzHostName, PWSTR *ppwzPeerName);
842   HRESULT WINAPI PeerPnrpStartup (WORD wVersionRequested);
843   HRESULT WINAPI PeerPnrpShutdown ();
844   HRESULT WINAPI PeerPnrpRegister (PCWSTR pcwzPeerName, PPEER_PNRP_REGISTRATION_INFO pRegistrationInfo, HREGISTRATION *phRegistration);
845   HRESULT WINAPI PeerPnrpUpdateRegistration (HREGISTRATION hRegistration, PPEER_PNRP_REGISTRATION_INFO pRegistrationInfo);
846   HRESULT WINAPI PeerPnrpUnregister (HREGISTRATION hRegistration);
847   HRESULT WINAPI PeerPnrpResolve (PCWSTR pcwzPeerName, PCWSTR pcwzCloudName, ULONG *pcEndpoints, PPEER_PNRP_ENDPOINT_INFO *ppEndpoints);
848   HRESULT WINAPI PeerPnrpStartResolve (PCWSTR pcwzPeerName, PCWSTR pcwzCloudName, ULONG cMaxEndpoints, HANDLE hEvent, HRESOLUTION *phResolve);
849   HRESULT WINAPI PeerPnrpGetCloudInfo (ULONG *pcNumClouds, PPEER_PNRP_CLOUD_INFO *ppCloudInfo);
850   HRESULT WINAPI PeerPnrpGetEndpoint (HRESOLUTION hResolve, PPEER_PNRP_ENDPOINT_INFO *ppEndpoint);
851   HRESULT WINAPI PeerPnrpEndResolve (HRESOLUTION hResolve);
852 #endif
853 
854 #ifdef __cplusplus
855 }
856 #endif
857 
858 #define WSA_PNRP_ERROR_BASE 11500
859 #define WSA_PNRP_CLOUD_NOT_FOUND (WSA_PNRP_ERROR_BASE + 1)
860 #define WSA_PNRP_CLOUD_DISABLED (WSA_PNRP_ERROR_BASE + 2)
861 #define WSA_PNRP_INVALID_IDENTITY (WSA_PNRP_ERROR_BASE + 3)
862 #define WSA_PNRP_TOO_MUCH_LOAD (WSA_PNRP_ERROR_BASE + 4)
863 #define WSA_PNRP_CLOUD_IS_SEARCH_ONLY (WSA_PNRP_ERROR_BASE + 5)
864 #define WSA_PNRP_CLIENT_INVALID_COMPARTMENT_ID (WSA_PNRP_ERROR_BASE + 6)
865 #define WSA_PNRP_DUPLICATE_PEER_NAME (WSA_PNRP_ERROR_BASE + 8)
866 #define WSA_PNRP_CLOUD_IS_DEAD (WSA_PNRP_ERROR_BASE + 9)
867 
868 #define PEER_E_CLOUD_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_CLOUD_NOT_FOUND)
869 #define PEER_E_CLOUD_DISABLED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_CLOUD_DISABLED)
870 #define PEER_E_INVALID_IDENTITY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_INVALID_IDENTITY)
871 #define PEER_E_TOO_MUCH_LOAD MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_TOO_MUCH_LOAD)
872 #define PEER_E_CLOUD_IS_SEARCH_ONLY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_CLOUD_IS_SEARCH_ONLY)
873 #define PEER_E_CLIENT_INVALID_COMPARTMENT_ID MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_CLIENT_INVALID_COMPARTMENT_ID)
874 #define PEER_E_DUPLICATE_PEER_NAME MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_DUPLICATE_PEER_NAME)
875 #define PEER_E_CLOUD_IS_DEAD MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_CLOUD_IS_DEAD)
876 #define PEER_E_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND)
877 #define PEER_E_DISK_FULL MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_DISK_FULL)
878 #define PEER_E_ALREADY_EXISTS MAKE_HRESULT (SEVERITY_ERROR, FACILITY_WIN32, ERROR_ALREADY_EXISTS)
879 #endif
880 #endif
881 
882 #ifdef DEFINE_GUID
883 #ifndef NO_P2P_GROUP
884 DEFINE_GUID (PEER_GROUP_ROLE_ADMIN, 0x04387127, 0xaa56, 0x450a, 0x8c, 0xe5, 0x4f, 0x56, 0x5c, 0x67, 0x90, 0xf4);
885 DEFINE_GUID (PEER_GROUP_ROLE_MEMBER, 0xf12dc4c7, 0x0857, 0x4ca0, 0x93, 0xfc, 0xb1, 0xbb, 0x19, 0xa3, 0xd8, 0xc2);
886 #if NTDDI_VERSION >= 0x06000000
887 DEFINE_GUID (PEER_GROUP_ROLE_INVITING_MEMBER, 0x4370fd89, 0xdc18, 0x4cfb, 0x8d, 0xbf, 0x98, 0x53, 0xa8, 0xa9, 0xf9, 0x05);
888 #endif
889 #endif
890 #ifndef NO_P2P_COLLABORATION
891 DEFINE_GUID (PEER_COLLAB_OBJECTID_USER_PICTURE, 0xdd15f41f, 0xfc4e, 0x4922, 0xb0, 0x35, 0x4c, 0x06, 0xa7, 0x54, 0xd0, 0x1d);
892 #endif
893 #endif
894