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
20extern "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
884DEFINE_GUID (PEER_GROUP_ROLE_ADMIN, 0x04387127, 0xaa56, 0x450a, 0x8c, 0xe5, 0x4f, 0x56, 0x5c, 0x67, 0x90, 0xf4);
885DEFINE_GUID (PEER_GROUP_ROLE_MEMBER, 0xf12dc4c7, 0x0857, 0x4ca0, 0x93, 0xfc, 0xb1, 0xbb, 0x19, 0xa3, 0xd8, 0xc2);
886#if NTDDI_VERSION >= 0x06000000
887DEFINE_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
891DEFINE_GUID (PEER_COLLAB_OBJECTID_USER_PICTURE, 0xdd15f41f, 0xfc4e, 0x4922, 0xb0, 0x35, 0x4c, 0x06, 0xa7, 0x54, 0xd0, 0x1d);
892#endif
893#endif
894