xpmgr/BuildTools/Include/p2p.h

1807 lines
69 KiB
C

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: p2p.h
//
// Contents: Win32 APIs and structures for the Microsoft Peer To Peer infrastructure.
//
// Questions or feedback:
//
// Email: peerfb@microsoft.com
// Website: http://www.microsoft.com/p2p
// Newsgroup: microsoft.public.win32.programmer.networks
//
//----------------------------------------------------------------------------
//
// If defined, the following flags inhibit definition of the indicated items.
//
// NO_P2P_GROUP - no Peer-to-Peer Grouping
// NO_P2P_GRAPH - no Peer-to-Peer Graphing
// NO_P2P_IDENTITY - no Peer-to-Peer Identity manager
// NO_P2P_PNRP - no Peer-to-Peer Peer Name Resolution Protocol
// NO_P2P_COLLABORATION - no Peer-to-Peer Collaboration Infrastructure
//
//----------------------------------------------------------------------------
#ifndef _P2P_H_
#define _P2P_H_
#ifndef MIDL_PASS
#include <specstrings.h>
#include <winsock2.h>
#include <pnrpns.h>
#include <ws2tcpip.h> // for sockaddrin_6
#endif
#pragma warning(push)
#pragma warning(disable:4201) // nameless struct/union
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#if NTDDI_VERSION < NTDDI_VISTA
#ifndef NO_P2P_PNRP
#define NO_P2P_PNRP //P2P PNRP is not available prior to NTDDI_VISTA
#endif // NO_P2P_PNRP
#ifndef NO_P2P_COLLABORATION
#define NO_P2P_COLLABORATION //P2P COLLABORATION is not available prior to NTDDI_VISTA
#endif // NO_P2P_COLLABORATION
#endif // NTDDI_VERSION < NTDDI_VISTA
//////////////////////////////////////////////////////////////////////////////
// Constants
typedef enum peer_record_change_type_tag {
PEER_RECORD_ADDED = 1,
PEER_RECORD_UPDATED = 2,
PEER_RECORD_DELETED = 3,
PEER_RECORD_EXPIRED = 4,
} PEER_RECORD_CHANGE_TYPE;
typedef enum peer_connection_status_tag {
PEER_CONNECTED = 1,
PEER_DISCONNECTED = 2,
PEER_CONNECTION_FAILED = 3,
} PEER_CONNECTION_STATUS;
typedef enum peer_connection_flags_tag {
PEER_CONNECTION_NEIGHBOR = 0x0001,
PEER_CONNECTION_DIRECT = 0x0002,
} PEER_CONNECTION_FLAGS;
typedef enum peer_record_flags_tag {
PEER_RECORD_FLAG_AUTOREFRESH = 0x0001,
PEER_RECORD_FLAG_DELETED = 0x0002,
} PEER_RECORD_FLAGS;
////////////////////////////////////////////////////////////////////////////////////
// Types
typedef
#ifdef MIDL_PASS
[context_handle]
#endif
void *HPEEREVENT;
typedef HPEEREVENT * PHPEEREVENT;
typedef
#ifdef MIDL_PASS
[context_handle]
#endif
void *HPEERENUM;
typedef HPEERENUM * PHPEERENUM;
typedef struct peer_version_data_tag {
WORD wVersion;
WORD wHighestVersion;
} PEER_VERSION_DATA, *PPEER_VERSION_DATA;
typedef struct peer_data_tag {
ULONG cbData;
#ifdef MIDL_PASS
[size_is(cbData)]
#endif
PBYTE pbData;
} PEER_DATA, * PPEER_DATA;
typedef const PEER_DATA * PCPEER_DATA;
typedef struct peer_record_tag {
DWORD dwSize;
GUID type;
GUID id;
DWORD dwVersion;
DWORD dwFlags;
PWSTR pwzCreatorId;
PWSTR pwzModifiedById;
PWSTR pwzAttributes;
FILETIME ftCreation;
FILETIME ftExpiration;
FILETIME ftLastModified;
PEER_DATA securityData;
PEER_DATA data;
} PEER_RECORD, *PPEER_RECORD;
typedef struct peer_address_tag {
DWORD dwSize;
SOCKADDR_IN6 sin6;
} PEER_ADDRESS, *PPEER_ADDRESS;
typedef const PEER_ADDRESS * PCPEER_ADDRESS;
typedef struct peer_connection_info_tag {
DWORD dwSize;
DWORD dwFlags;
ULONGLONG ullConnectionId;
ULONGLONG ullNodeId;
PWSTR pwzPeerId;
PEER_ADDRESS address;
} PEER_CONNECTION_INFO;
typedef struct peer_event_incoming_data_tag {
DWORD dwSize;
ULONGLONG ullConnectionId;
GUID type;
PEER_DATA data;
} PEER_EVENT_INCOMING_DATA, *PPEER_EVENT_INCOMING_DATA;
typedef struct peer_event_record_change_data_tag {
DWORD dwSize;
PEER_RECORD_CHANGE_TYPE changeType;
GUID recordId;
GUID recordType;
} PEER_EVENT_RECORD_CHANGE_DATA, * PPEER_EVENT_RECORD_CHANGE_DATA;
typedef struct peer_event_connection_change_data_tag {
DWORD dwSize;
PEER_CONNECTION_STATUS status;
ULONGLONG ullConnectionId;
ULONGLONG ullNodeId;
#if NTDDI_VERSION >= NTDDI_VISTA
ULONGLONG ullNextConnectionId;
HRESULT hrConnectionFailedReason;
#endif
} PEER_EVENT_CONNECTION_CHANGE_DATA, * PPEER_EVENT_CONNECTION_CHANGE_DATA;
typedef struct peer_event_synchronized_data_tag {
DWORD dwSize;
GUID recordType;
} PEER_EVENT_SYNCHRONIZED_DATA, * PPEER_EVENT_SYNCHRONIZED_DATA;
#ifndef NO_P2P_GRAPH
#ifndef MIDL_PASS
/////////////////////////////////////////////////////////////////////////////
//
// G R A P H I N G
//
/////////////////////////////////////////////////////////////////////////////
typedef PVOID HGRAPH, *PHGRAPH;
/////////////////////////////////////////////////////////////////////////////
// Constants
#define PEER_GRAPH_VERSION MAKEWORD(1,0)
typedef enum peer_graph_event_type_tag {
PEER_GRAPH_EVENT_STATUS_CHANGED = 1,
PEER_GRAPH_EVENT_PROPERTY_CHANGED = 2,
PEER_GRAPH_EVENT_RECORD_CHANGED = 3,
PEER_GRAPH_EVENT_DIRECT_CONNECTION = 4,
PEER_GRAPH_EVENT_NEIGHBOR_CONNECTION = 5,
PEER_GRAPH_EVENT_INCOMING_DATA = 6,
PEER_GRAPH_EVENT_CONNECTION_REQUIRED = 7,
PEER_GRAPH_EVENT_NODE_CHANGED = 8,
PEER_GRAPH_EVENT_SYNCHRONIZED = 9,
} PEER_GRAPH_EVENT_TYPE;
typedef enum peer_node_change_type_tag {
PEER_NODE_CHANGE_CONNECTED = 1,
PEER_NODE_CHANGE_DISCONNECTED = 2,
PEER_NODE_CHANGE_UPDATED = 3,
} PEER_NODE_CHANGE_TYPE;
typedef enum peer_graph_status_flags_tag {
PEER_GRAPH_STATUS_LISTENING = 0x0001,
PEER_GRAPH_STATUS_HAS_CONNECTIONS = 0x0002,
PEER_GRAPH_STATUS_SYNCHRONIZED = 0x0004,
} PEER_GRAPH_STATUS_FLAGS;
typedef enum peer_graph_property_flags_tag {
PEER_GRAPH_PROPERTY_HEARTBEATS = 0x0001,
PEER_GRAPH_PROPERTY_DEFER_EXPIRATION = 0x0002,
} PEER_GRAPH_PROPERTY_FLAGS;
typedef enum peer_graph_scope_tag {
PEER_GRAPH_SCOPE_ANY = 0,
PEER_GRAPH_SCOPE_GLOBAL = 1,
PEER_GRAPH_SCOPE_SITELOCAL = 2,
PEER_GRAPH_SCOPE_LINKLOCAL = 3,
PEER_GRAPH_SCOPE_LOOPBACK = 4
} PEER_GRAPH_SCOPE;
/////////////////////////////////////////////////////////////////////////////
// Structures
typedef struct peer_graph_properties_tag {
DWORD dwSize;
DWORD dwFlags; // PEER_GRAPH_PROPERTY_FLAGS
DWORD dwScope;
DWORD dwMaxRecordSize;
PWSTR pwzGraphId;
PWSTR pwzCreatorId;
PWSTR pwzFriendlyName;
PWSTR pwzComment;
ULONG ulPresenceLifetime;
ULONG cPresenceMax;
} PEER_GRAPH_PROPERTIES, *PPEER_GRAPH_PROPERTIES;
typedef struct peer_node_info_tag {
DWORD dwSize;
ULONGLONG ullNodeId;
PWSTR pwzPeerId;
ULONG cAddresses;
PPEER_ADDRESS pAddresses;
PWSTR pwzAttributes;
} PEER_NODE_INFO, *PPEER_NODE_INFO;
typedef struct peer_event_node_change_data_tag {
DWORD dwSize;
PEER_NODE_CHANGE_TYPE changeType;
ULONGLONG ullNodeId;
PWSTR pwzPeerId;
} PEER_EVENT_NODE_CHANGE_DATA, *PPEER_EVENT_NODE_CHANGE_DATA;
typedef struct peer_graph_event_registration_tag {
PEER_GRAPH_EVENT_TYPE eventType;
GUID * pType;
} PEER_GRAPH_EVENT_REGISTRATION, *PPEER_GRAPH_EVENT_REGISTRATION;
typedef struct peer_graph_event_data_tag {
PEER_GRAPH_EVENT_TYPE eventType;
union {
PEER_GRAPH_STATUS_FLAGS dwStatus;
PEER_EVENT_INCOMING_DATA incomingData;
PEER_EVENT_RECORD_CHANGE_DATA recordChangeData;
PEER_EVENT_CONNECTION_CHANGE_DATA connectionChangeData;
PEER_EVENT_NODE_CHANGE_DATA nodeChangeData;
PEER_EVENT_SYNCHRONIZED_DATA synchronizedData;
};
} PEER_GRAPH_EVENT_DATA, *PPEER_GRAPH_EVENT_DATA;
typedef HRESULT (CALLBACK * PFNPEER_VALIDATE_RECORD)(
__in HGRAPH hGraph,
__in_opt PVOID pvContext,
__in PPEER_RECORD pRecord,
__in PEER_RECORD_CHANGE_TYPE changeType);
typedef HRESULT (CALLBACK * PFNPEER_SECURE_RECORD)(
__in HGRAPH hGraph,
__in_opt PVOID pvContext,
__in PPEER_RECORD pRecord,
__in PEER_RECORD_CHANGE_TYPE changeType,
__deref_out PPEER_DATA * ppSecurityData);
typedef HRESULT (CALLBACK * PFNPEER_FREE_SECURITY_DATA)(
__in HGRAPH hGraph,
__in_opt PVOID pvContext,
__in PPEER_DATA pSecurityData);
typedef HRESULT (CALLBACK * PFNPEER_ON_PASSWORD_AUTH_FAILED)(
__in HGRAPH hGraph,
__in_opt PVOID pvContext);
typedef struct peer_security_interface_tag {
DWORD dwSize;
PWSTR pwzSspFilename;
PWSTR pwzPackageName;
ULONG cbSecurityInfo;
PBYTE pbSecurityInfo;
PVOID pvContext;
PFNPEER_VALIDATE_RECORD pfnValidateRecord;
PFNPEER_SECURE_RECORD pfnSecureRecord;
PFNPEER_FREE_SECURITY_DATA pfnFreeSecurityData;
PFNPEER_ON_PASSWORD_AUTH_FAILED pfnAuthFailed;
}PEER_SECURITY_INTERFACE, * PPEER_SECURITY_INTERFACE;
/////////////////////////////////////////////////////////////////////////////
// API Definitions
HRESULT WINAPI PeerGraphStartup(
__in WORD wVersionRequested,
__out PPEER_VERSION_DATA pVersionData);
HRESULT WINAPI PeerGraphShutdown();
VOID WINAPI PeerGraphFreeData(
__in PVOID pvData);
HRESULT WINAPI PeerGraphGetItemCount(
__in HPEERENUM hPeerEnum,
__out ULONG * pCount);
HRESULT WINAPI PeerGraphGetNextItem(
__in HPEERENUM hPeerEnum,
__inout ULONG * pCount,
__deref_out_ecount(*pCount) PVOID ** pppvItems);
HRESULT WINAPI PeerGraphEndEnumeration(
__in HPEERENUM hPeerEnum);
HRESULT WINAPI PeerGraphCreate(
__in PPEER_GRAPH_PROPERTIES pGraphProperties,
__in PCWSTR pwzDatabaseName,
__in_opt PPEER_SECURITY_INTERFACE pSecurityInterface,
__out HGRAPH * phGraph);
HRESULT WINAPI PeerGraphOpen(
__in PCWSTR pwzGraphId,
__in PCWSTR pwzPeerId,
__in PCWSTR pwzDatabaseName,
__in_opt PPEER_SECURITY_INTERFACE pSecurityInterface,
__in ULONG cRecordTypeSyncPrecedence,
__in_ecount_opt(cRecordTypeSyncPrecedence) const GUID * pRecordTypeSyncPrecedence,
__out HGRAPH * phGraph);
HRESULT WINAPI PeerGraphListen(
__in HGRAPH hGraph,
__in_opt DWORD dwScope,
__in_opt DWORD dwScopeId,
__in_opt WORD wPort);
HRESULT WINAPI PeerGraphConnect(
__in HGRAPH hGraph,
__in_opt PCWSTR pwzPeerId,
__in PPEER_ADDRESS pAddress,
__out ULONGLONG * pullConnectionId);
HRESULT WINAPI PeerGraphClose(
__in HGRAPH hGraph);
HRESULT WINAPI PeerGraphDelete(
__in PCWSTR pwzGraphId,
__in PCWSTR pwzPeerId,
__in PCWSTR pwzDatabaseName);
HRESULT WINAPI PeerGraphGetStatus(
__in HGRAPH hGraph,
__out DWORD * pdwStatus);
HRESULT WINAPI PeerGraphGetProperties(
__in HGRAPH hGraph,
__deref_out PPEER_GRAPH_PROPERTIES * ppGraphProperties);
HRESULT WINAPI PeerGraphSetProperties(
__in HGRAPH hGraph,
__in PPEER_GRAPH_PROPERTIES pGraphProperties);
// Eventing interfaces
HRESULT WINAPI PeerGraphRegisterEvent(
__in HGRAPH hGraph,
__in HANDLE hEvent,
__in ULONG cEventRegistrations,
__in_ecount(cEventRegistrations) PEER_GRAPH_EVENT_REGISTRATION * pEventRegistrations,
__out HPEEREVENT * phPeerEvent);
HRESULT WINAPI PeerGraphUnregisterEvent(
__in HPEEREVENT hPeerEvent);
HRESULT WINAPI PeerGraphGetEventData(
__in HPEEREVENT hPeerEvent,
__deref_out PPEER_GRAPH_EVENT_DATA * ppEventData);
// Data Storage
HRESULT WINAPI PeerGraphGetRecord(
__in HGRAPH hGraph,
__in const GUID * pRecordId,
__deref_out PPEER_RECORD * ppRecord);
HRESULT WINAPI PeerGraphAddRecord(
__in HGRAPH hGraph,
__in PPEER_RECORD pRecord,
__out GUID * pRecordId);
HRESULT WINAPI PeerGraphUpdateRecord(
__in HGRAPH hGraph,
__in PPEER_RECORD pRecord);
HRESULT WINAPI PeerGraphDeleteRecord(
__in HGRAPH hGraph,
__in const GUID * pRecordId,
__in BOOL fLocal);
HRESULT WINAPI PeerGraphEnumRecords(
__in HGRAPH hGraph,
__in_opt const GUID * pRecordType,
__in_opt PCWSTR pwzPeerId,
__out HPEERENUM * phPeerEnum);
HRESULT WINAPI PeerGraphSearchRecords(
__in HGRAPH hGraph,
__in PCWSTR pwzCriteria,
__out HPEERENUM * phPeerEnum);
HRESULT WINAPI PeerGraphExportDatabase(
__in HGRAPH hGraph,
__in PCWSTR pwzFilePath);
HRESULT WINAPI PeerGraphImportDatabase(
__in HGRAPH hGraph,
__in PCWSTR pwzFilePath);
HRESULT WINAPI PeerGraphValidateDeferredRecords(
__in HGRAPH hGraph,
__in ULONG cRecordIds,
__in_ecount(cRecordIds) const GUID * pRecordIds);
// Node/Connection interfaces
HRESULT WINAPI PeerGraphOpenDirectConnection(
__in HGRAPH hGraph,
__in PCWSTR pwzPeerId,
__in PPEER_ADDRESS pAddress,
__out ULONGLONG * pullConnectionId);
HRESULT WINAPI PeerGraphSendData(
__in HGRAPH hGraph,
__in ULONGLONG ullConnectionId,
__in const GUID * pType,
__in ULONG cbData,
__in_bcount(cbData) PVOID pvData);
HRESULT WINAPI PeerGraphCloseDirectConnection(
__in HGRAPH hGraph,
__in ULONGLONG ullConnectionId);
HRESULT WINAPI PeerGraphEnumConnections(
__in HGRAPH hGraph,
__in DWORD dwFlags, // PEER_CONNECTION_FLAGS
__out HPEERENUM * phPeerEnum);
HRESULT WINAPI PeerGraphEnumNodes(
__in HGRAPH hGraph,
__in_opt PCWSTR pwzPeerId,
__out HPEERENUM * phPeerEnum);
HRESULT WINAPI PeerGraphSetPresence(
__in HGRAPH hGraph,
__in BOOL fPresent);
HRESULT WINAPI PeerGraphGetNodeInfo(
__in HGRAPH hGraph,
__in ULONGLONG ullNodeId,
__deref_out PPEER_NODE_INFO * ppNodeInfo);
HRESULT WINAPI PeerGraphSetNodeAttributes(
__in HGRAPH hGraph,
__in PCWSTR pwzAttributes);
HRESULT WINAPI PeerGraphPeerTimeToUniversalTime(
__in HGRAPH hGraph,
__in FILETIME * pftPeerTime,
__out FILETIME * pftUniversalTime);
HRESULT WINAPI PeerGraphUniversalTimeToPeerTime(
__in HGRAPH hGraph,
__in FILETIME * pftUniversalTime,
__out FILETIME * pftPeerTime);
#endif // MIDL_PASS
#endif // NO_P2P_GRAPH
#if (!(defined (NO_P2P_GROUP)) || (!defined (NO_P2P_IDENTITY)))
#ifndef MIDL_PASS
//////////////////////////////////////////////////////////////////////////////
//
// Common APIs used by Grouping and the Identity Manager
//
//////////////////////////////////////////////////////////////////////////////
#include <wincrypt.h>
VOID WINAPI PeerFreeData(
__in_opt LPCVOID pvData);
HRESULT WINAPI PeerGetItemCount(
__in HPEERENUM hPeerEnum,
__out ULONG * pCount);
HRESULT WINAPI PeerGetNextItem(
__in HPEERENUM hPeerEnum,
__inout ULONG * pCount,
__deref_out_ecount(*pCount) PVOID ** pppvItems);
HRESULT WINAPI PeerEndEnumeration(
__in HPEERENUM hPeerEnum);
#endif // MIDL_PASS
#endif
#ifndef NO_P2P_GROUP
/////////////////////////////////////////////////////////////////////////////
//
// G R O U P I N G
//
/////////////////////////////////////////////////////////////////////////////
typedef PVOID HGROUP, *PHGROUP;
typedef GUID PEER_ROLE_ID;
/////////////////////////////////////////////////////////////////////////////
// Constants
#if NTDDI_VERSION >= NTDDI_VISTA
#define PEER_GROUP_VERSION MAKEWORD(1,1)
#else
#define PEER_GROUP_VERSION MAKEWORD(1,0)
#endif
typedef enum peer_group_event_type_tag {
PEER_GROUP_EVENT_STATUS_CHANGED = 1,
PEER_GROUP_EVENT_PROPERTY_CHANGED = 2,
PEER_GROUP_EVENT_RECORD_CHANGED = 3,
PEER_GROUP_EVENT_DIRECT_CONNECTION = 4,
PEER_GROUP_EVENT_NEIGHBOR_CONNECTION = 5,
PEER_GROUP_EVENT_INCOMING_DATA = 6,
PEER_GROUP_EVENT_MEMBER_CHANGED = 8,
PEER_GROUP_EVENT_CONNECTION_FAILED = 10,
PEER_GROUP_EVENT_AUTHENTICATION_FAILED = 11
} PEER_GROUP_EVENT_TYPE;
typedef enum peer_group_status_tag {
PEER_GROUP_STATUS_LISTENING = 0x0001,
PEER_GROUP_STATUS_HAS_CONNECTIONS = 0x0002,
} PEER_GROUP_STATUS;
typedef enum peer_group_property_flags_tag {
PEER_MEMBER_DATA_OPTIONAL = 0x0001,
PEER_DISABLE_PRESENCE = 0x0002,
PEER_DEFER_EXPIRATION = 0x0004,
} PEER_GROUP_PROPERTY_FLAGS;
#if NTDDI_VERSION >= NTDDI_VISTA
typedef enum peer_group_authentication_scheme_tag {
PEER_GROUP_GMC_AUTHENTICATION = 0x00000001,
PEER_GROUP_PASSWORD_AUTHENTICATION = 0x00000002,
} PEER_GROUP_AUTHENTICATION_SCHEME;
#endif
typedef enum peer_member_flags_tag {
PEER_MEMBER_PRESENT = 0x0001,
} PEER_MEMBER_FLAGS;
typedef enum peer_member_change_type_tag {
PEER_MEMBER_CONNECTED = 1,
PEER_MEMBER_DISCONNECTED = 2,
PEER_MEMBER_UPDATED = 3,
PEER_MEMBER_JOINED = 4,
PEER_MEMBER_LEFT = 5,
} PEER_MEMBER_CHANGE_TYPE;
typedef enum peer_issue_credential_flags_tag {
PEER_GROUP_STORE_CREDENTIALS = 0x0001,
} PEER_GROUP_ISSUE_CREDENTIAL_FLAGS;
/////////////////////////////////////////////////////////////////////////////
// Structures
#ifndef MIDL_PASS
typedef struct peer_credential_info_tag
{
DWORD dwSize;
DWORD dwFlags;
PWSTR pwzFriendlyName;
CERT_PUBLIC_KEY_INFO * pPublicKey;
PWSTR pwzIssuerPeerName;
PWSTR pwzIssuerFriendlyName;
FILETIME ftValidityStart;
FILETIME ftValidityEnd;
ULONG cRoles;
__field_ecount(cRoles) PEER_ROLE_ID * pRoles;
} PEER_CREDENTIAL_INFO, * PPEER_CREDENTIAL_INFO;
typedef struct peer_member_tag {
DWORD dwSize;
DWORD dwFlags; // PEER_MEMBER_FLAGS
PWSTR pwzIdentity;
PWSTR pwzAttributes;
ULONGLONG ullNodeId;
ULONG cAddresses;
__field_ecount(cAddresses) PEER_ADDRESS * pAddresses;
PEER_CREDENTIAL_INFO * pCredentialInfo;
} PEER_MEMBER, *PPEER_MEMBER;
typedef struct peer_invitation_info_tag {
DWORD dwSize;
DWORD dwFlags;
PWSTR pwzCloudName;
DWORD dwScope;
DWORD dwCloudFlags;
PWSTR pwzGroupPeerName;
PWSTR pwzIssuerPeerName;
PWSTR pwzSubjectPeerName;
PWSTR pwzGroupFriendlyName;
PWSTR pwzIssuerFriendlyName;
PWSTR pwzSubjectFriendlyName;
FILETIME ftValidityStart;
FILETIME ftValidityEnd;
ULONG cRoles;
PEER_ROLE_ID * pRoles;
ULONG cClassifiers;
PWSTR* ppwzClassifiers;
CERT_PUBLIC_KEY_INFO * pSubjectPublicKey;
#if NTDDI_VERSION >= NTDDI_VISTA
PEER_GROUP_AUTHENTICATION_SCHEME authScheme;
#endif
} PEER_INVITATION_INFO, *PPEER_INVITATION_INFO;
#endif // MIDL_PASS
//start
typedef struct peer_group_properties_tag {
DWORD dwSize;
DWORD dwFlags; // PEER_GROUP_PROPERTY_FLAGS
PWSTR pwzCloud;
PWSTR pwzClassifier;
PWSTR pwzGroupPeerName;
PWSTR pwzCreatorPeerName;
PWSTR pwzFriendlyName;
PWSTR pwzComment;
ULONG ulMemberDataLifetime;
ULONG ulPresenceLifetime;
#if NTDDI_VERSION >= NTDDI_VISTA
DWORD dwAuthenticationSchemes; // PEER_GROUP_AUTHENTICATION_SCHEME
// group password authentication data
PWSTR pwzGroupPassword;
PEER_ROLE_ID groupPasswordRole;
#endif
} PEER_GROUP_PROPERTIES, *PPEER_GROUP_PROPERTIES;
typedef struct peer_event_member_change_data_tag {
DWORD dwSize;
PEER_MEMBER_CHANGE_TYPE changeType;
PWSTR pwzIdentity;
} PEER_EVENT_MEMBER_CHANGE_DATA, * PPEER_EVENT_MEMBER_CHANGE_DATA;
typedef struct peer_group_event_registration_tag {
PEER_GROUP_EVENT_TYPE eventType;
GUID * pType;
} PEER_GROUP_EVENT_REGISTRATION, *PPEER_GROUP_EVENT_REGISTRATION;
#ifdef MIDL_PASS
typedef struct peer_group_event_data_tag
{
PEER_GROUP_EVENT_TYPE eventType;
[switch_is(eventType)] union
{
[case(PEER_GROUP_EVENT_STATUS_CHANGED)]
PEER_GROUP_STATUS dwStatus;
[case(PEER_GROUP_EVENT_PROPERTY_CHANGED)]
;
[case(PEER_GROUP_EVENT_RECORD_CHANGED)]
PEER_EVENT_RECORD_CHANGE_DATA recordChangeData;
[case(PEER_GROUP_EVENT_NEIGHBOR_CONNECTION, PEER_GROUP_EVENT_DIRECT_CONNECTION)]
PEER_EVENT_CONNECTION_CHANGE_DATA connectionChangeData;
[case(PEER_GROUP_EVENT_INCOMING_DATA)]
PEER_EVENT_INCOMING_DATA incomingData;
[case(PEER_GROUP_EVENT_MEMBER_CHANGED)]
PEER_EVENT_MEMBER_CHANGE_DATA memberChangeData;
[case(PEER_GROUP_EVENT_CONNECTION_FAILED)]
HRESULT hrConnectionFailedReason;
[default]
;
};
} PEER_GROUP_EVENT_DATA, *PPEER_GROUP_EVENT_DATA;
#else // !MIDL_PASS
typedef struct peer_group_event_data_tag
{
PEER_GROUP_EVENT_TYPE eventType;
union
{
PEER_GROUP_STATUS dwStatus;
PEER_EVENT_INCOMING_DATA incomingData;
PEER_EVENT_RECORD_CHANGE_DATA recordChangeData;
PEER_EVENT_CONNECTION_CHANGE_DATA connectionChangeData;
PEER_EVENT_MEMBER_CHANGE_DATA memberChangeData;
HRESULT hrConnectionFailedReason;
};
} PEER_GROUP_EVENT_DATA, *PPEER_GROUP_EVENT_DATA;
#endif // MIDL_PASS
//end
typedef struct peer_name_pair_tag {
DWORD dwSize;
PWSTR pwzPeerName;
PWSTR pwzFriendlyName;
} PEER_NAME_PAIR, * PPEER_NAME_PAIR;
/////////////////////////////////////////////////////////////////////////////
// API Definitions
#ifndef MIDL_PASS
HRESULT WINAPI PeerGroupStartup(
__in WORD wVersionRequested,
__out PPEER_VERSION_DATA pVersionData);
HRESULT WINAPI PeerGroupShutdown();
HRESULT WINAPI PeerGroupCreate(
__in PPEER_GROUP_PROPERTIES pProperties,
__out HGROUP * phGroup);
HRESULT WINAPI PeerGroupOpen(
__in PCWSTR pwzIdentity,
__in PCWSTR pwzGroupPeerName,
__in_opt PCWSTR pwzCloud,
__out HGROUP * phGroup);
HRESULT WINAPI PeerGroupJoin(
__in PCWSTR pwzIdentity,
__in PCWSTR pwzInvitation,
__in_opt PCWSTR pwzCloud,
__out HGROUP * phGroup);
#if NTDDI_VERSION >= NTDDI_VISTA
HRESULT WINAPI PeerGroupPasswordJoin(
__in PCWSTR pwzIdentity,
__in PCWSTR pwzInvitation,
__in PCWSTR pwzPassword,
__in_opt PCWSTR pwzCloud,
__out HGROUP * phGroup);
#endif
HRESULT WINAPI PeerGroupConnect(
__in HGROUP hGroup);
#if NTDDI_VERSION >= NTDDI_VISTA
HRESULT WINAPI PeerGroupConnectByAddress(
__in HGROUP hGroup,
ULONG cAddresses,
__in_ecount(cAddresses) PPEER_ADDRESS pAddresses);
#endif
HRESULT WINAPI PeerGroupClose(
__in HGROUP hGroup);
HRESULT WINAPI PeerGroupDelete(
__in PCWSTR pwzIdentity,
__in PCWSTR pwzGroupPeerName);
HRESULT WINAPI PeerGroupCreateInvitation(
__in HGROUP hGroup,
__in PCWSTR pwzIdentityInfo,
__in_opt FILETIME * pftExpiration,
__in ULONG cRoles,
__in_ecount_opt(cRoles) const GUID * pRoles,
__deref_out PWSTR * ppwzInvitation);
#if NTDDI_VERSION >= NTDDI_VISTA
HRESULT WINAPI PeerGroupCreatePasswordInvitation(
__in HGROUP hGroup,
__deref_out PWSTR * ppwzInvitation);
#endif
HRESULT WINAPI PeerGroupParseInvitation(
__in PCWSTR pwzInvitation,
__deref_out PPEER_INVITATION_INFO * ppInvitationInfo);
HRESULT WINAPI PeerGroupGetStatus(
__in HGROUP hGroup,
__out DWORD * pdwStatus);
HRESULT WINAPI PeerGroupGetProperties(
__in HGROUP hGroup,
__deref_out PPEER_GROUP_PROPERTIES * ppProperties);
HRESULT WINAPI PeerGroupSetProperties(
__in HGROUP hGroup,
__in PPEER_GROUP_PROPERTIES pProperties);
HRESULT WINAPI PeerGroupEnumMembers(
__in HGROUP hGroup,
__in DWORD dwFlags, // PEER_MEMBER_FLAGS
__in_opt PCWSTR pwzIdentity,
__out HPEERENUM * phPeerEnum);
HRESULT WINAPI PeerGroupOpenDirectConnection(
__in HGROUP hGroup,
__in PCWSTR pwzIdentity,
__in PPEER_ADDRESS pAddress,
__out ULONGLONG * pullConnectionId);
HRESULT WINAPI PeerGroupCloseDirectConnection(
__in HGROUP hGroup,
__in ULONGLONG ullConnectionId);
HRESULT WINAPI PeerGroupEnumConnections(
__in HGROUP hGroup,
__in DWORD dwFlags, // PEER_CONNECTION_FLAGS
__out HPEERENUM * phPeerEnum);
HRESULT WINAPI PeerGroupSendData(
__in HGROUP hGroup,
__in ULONGLONG ullConnectionId,
__in const GUID * pType,
__in ULONG cbData,
__in_bcount(cbData) PVOID pvData);
// Eventing interfaces
HRESULT WINAPI PeerGroupRegisterEvent(
__in HGROUP hGroup,
__in HANDLE hEvent,
__in DWORD cEventRegistration,
__in_ecount(cEventRegistration) PEER_GROUP_EVENT_REGISTRATION * pEventRegistrations,
__out HPEEREVENT * phPeerEvent);
HRESULT WINAPI PeerGroupUnregisterEvent(
__in HPEEREVENT hPeerEvent);
HRESULT WINAPI PeerGroupGetEventData(
__in HPEEREVENT hPeerEvent,
__deref_out PPEER_GROUP_EVENT_DATA * ppEventData);
// Data Storage
HRESULT WINAPI PeerGroupGetRecord(
__in HGROUP hGroup,
__in const GUID * pRecordId,
__deref_out PPEER_RECORD * ppRecord);
HRESULT WINAPI PeerGroupAddRecord(
__in HGROUP hGroup,
__in PPEER_RECORD pRecord,
__out GUID * pRecordId);
HRESULT WINAPI PeerGroupUpdateRecord(
__in HGROUP hGroup,
__in PPEER_RECORD pRecord);
HRESULT WINAPI PeerGroupDeleteRecord(
__in HGROUP hGroup,
__in const GUID * pRecordId);
HRESULT WINAPI PeerGroupEnumRecords(
__in HGROUP hGroup,
__in_opt const GUID * pRecordType,
__out HPEERENUM * phPeerEnum);
HRESULT WINAPI PeerGroupSearchRecords(
__in HGROUP hGroup,
__in PCWSTR pwzCriteria,
__out HPEERENUM * phPeerEnum);
HRESULT WINAPI PeerGroupExportDatabase(
__in HGROUP hGroup,
__in PCWSTR pwzFilePath);
HRESULT WINAPI PeerGroupImportDatabase(
__in HGROUP hGroup,
__in PCWSTR pwzFilePath);
HRESULT WINAPI PeerGroupIssueCredentials(
__in HGROUP hGroup,
__in PCWSTR pwzSubjectIdentity,
__in_opt PEER_CREDENTIAL_INFO * pCredentialInfo,
__in DWORD dwFlags,
__deref_opt_out PWSTR * ppwzInvitation);
HRESULT WINAPI PeerGroupExportConfig(
__in HGROUP hGroup,
__in PCWSTR pwzPassword,
__deref_out PWSTR * ppwzXML);
HRESULT WINAPI PeerGroupImportConfig(
__in PCWSTR pwzXML,
__in PCWSTR pwzPassword,
__in BOOL fOverwrite,
__deref_out PWSTR * ppwzIdentity,
__deref_out PWSTR * ppwzGroup);
HRESULT WINAPI PeerGroupPeerTimeToUniversalTime(
__in HGROUP hGroup,
__in FILETIME * pftPeerTime,
__out FILETIME * pftUniversalTime);
HRESULT WINAPI PeerGroupUniversalTimeToPeerTime(
__in HGROUP hGroup,
__in FILETIME * pftUniversalTime,
__out FILETIME * pftPeerTime);
#if NTDDI_VERSION >= NTDDI_WIN7
HRESULT WINAPI PeerGroupResumePasswordAuthentication(
__in HGROUP hGroup,
__in HPEEREVENT hPeerEventHandle);
#endif
#endif // NIDL_PASS
#endif // NO_P2P_GROUP
#ifndef NO_P2P_IDENTITY
#ifndef MIDL_PASS
/////////////////////////////////////////////////////////////////////////////
//
// I D E N T I T Y
//
/////////////////////////////////////////////////////////////////////////////
// API Definitions
HRESULT WINAPI PeerIdentityCreate(
__in_opt PCWSTR pwzClassifier,
__in_opt PCWSTR pwzFriendlyName,
__in_opt HCRYPTPROV hCryptProv,
__deref_out PWSTR * ppwzIdentity);
HRESULT WINAPI PeerIdentityGetFriendlyName(
__in_opt PCWSTR pwzIdentity,
__deref_out PWSTR * ppwzFriendlyName);
HRESULT WINAPI PeerIdentitySetFriendlyName(
__in_opt PCWSTR pwzIdentity,
__in PCWSTR pwzFriendlyName);
HRESULT WINAPI PeerIdentityGetCryptKey(
__in_opt PCWSTR pwzIdentity,
__out HCRYPTPROV * phCryptProv);
HRESULT WINAPI PeerIdentityDelete(
__in PCWSTR pwzIdentity);
HRESULT WINAPI PeerEnumIdentities(
__out HPEERENUM * phPeerEnum);
HRESULT WINAPI PeerEnumGroups(
__in PCWSTR pwzIdentity,
__out HPEERENUM * phPeerEnum);
HRESULT WINAPI PeerCreatePeerName(
__in_opt PCWSTR pwzIdentity,
__in_opt PCWSTR pwzClassifier,
__deref_out PWSTR * ppwzPeerName);
HRESULT WINAPI PeerIdentityGetXML(
__in_opt PCWSTR pwzIdentity,
__deref_out PWSTR * ppwzIdentityXML);
HRESULT WINAPI PeerIdentityExport(
__in_opt PCWSTR pwzIdentity,
__in PCWSTR pwzPassword,
__deref_out PWSTR * ppwzExportXML);
HRESULT WINAPI PeerIdentityImport(
__in PCWSTR pwzImportXML,
__in PCWSTR pwzPassword,
__deref_out PWSTR * ppwzIdentity);
HRESULT WINAPI PeerIdentityGetDefault(
__deref_out PWSTR * ppwzPeerName);
#endif // MIDL_PASS
#endif // NO_P2P_IDENTITY
#ifndef NO_P2P_COLLABORATION
/////////////////////////////////////////////////////////////////////////////
//
// C O L L A B O R A T I O N
//
/////////////////////////////////////////////////////////////////////////////
#define PEER_COLLAB_VERSION MAKEWORD(1,0)
//////////////////////////////////////////////////////////////////////////////
//
// Common used by AppInvite, Contact API's and Serverless Presence
//
//////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// Constants
typedef enum peer_signin_flags_tag {
PEER_SIGNIN_NONE = 0x0,
PEER_SIGNIN_NEAR_ME = 0x1,
PEER_SIGNIN_INTERNET = 0x2,
PEER_SIGNIN_ALL = PEER_SIGNIN_INTERNET | PEER_SIGNIN_NEAR_ME
} PEER_SIGNIN_FLAGS;
typedef enum peer_watch_permission_tag {
PEER_WATCH_BLOCKED = 0,
PEER_WATCH_ALLOWED = 1
} PEER_WATCH_PERMISSION;
typedef enum peer_publication_scope_tag {
PEER_PUBLICATION_SCOPE_NONE = 0x0,
PEER_PUBLICATION_SCOPE_NEAR_ME = 0x1,
PEER_PUBLICATION_SCOPE_INTERNET = 0x2,
PEER_PUBLICATION_SCOPE_ALL = PEER_PUBLICATION_SCOPE_NEAR_ME | PEER_PUBLICATION_SCOPE_INTERNET
} PEER_PUBLICATION_SCOPE;
/////////////////////////////////////////////////////////////////////////////
// Structures
typedef struct peer_application_tag {
GUID id;
PEER_DATA data;
PWSTR pwzDescription;
} PEER_APPLICATION, *PPEER_APPLICATION;
typedef const PEER_APPLICATION * PCPEER_APPLICATION;
typedef struct peer_object_tag {
GUID id;
PEER_DATA data;
DWORD dwPublicationScope;
} PEER_OBJECT, * PPEER_OBJECT;
typedef const PEER_OBJECT * PCPEER_OBJECT;
typedef struct peer_contact_tag
{
PWSTR pwzPeerName;
PWSTR pwzNickName;
PWSTR pwzDisplayName;
PWSTR pwzEmailAddress;
BOOL fWatch;
PEER_WATCH_PERMISSION WatcherPermissions;
PEER_DATA credentials;
} PEER_CONTACT, *PPEER_CONTACT;
typedef const PEER_CONTACT * PCPEER_CONTACT;
typedef struct peer_endpoint_tag {
PEER_ADDRESS address;
PWSTR pwzEndpointName;
} PEER_ENDPOINT, *PPEER_ENDPOINT;
typedef const PEER_ENDPOINT * PCPEER_ENDPOINT;
typedef struct peer_people_near_me_tag {
PWSTR pwzNickName;
PEER_ENDPOINT endpoint;
GUID id;
} PEER_PEOPLE_NEAR_ME, *PPEER_PEOPLE_NEAR_ME;
typedef const PEER_PEOPLE_NEAR_ME *PCPEER_PEOPLE_NEAR_ME;
typedef PPEER_PEOPLE_NEAR_ME *PPPEER_PEOPLE_NEAR_ME;
#ifndef MIDL_PASS
/////////////////////////////////////////////////////////////////////////////
// APIs
HRESULT WINAPI PeerCollabStartup(
__in WORD wVersionRequested);
HRESULT WINAPI PeerCollabShutdown();
HRESULT WINAPI PeerCollabSignin(
__in_opt HWND hwndParent,
__in DWORD dwSigninOptions);
HRESULT WINAPI PeerCollabSignout(
__in DWORD dwSigninOptions);
HRESULT WINAPI PeerCollabGetSigninOptions(
__out DWORD * pdwSigninOptions);
#endif //MIDL_PASS
/////////////////////////////////////////////////////////////////////////////
//
// A P P I N V I T E
//
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// constants
typedef enum peer_invitation_response_type_tag {
PEER_INVITATION_RESPONSE_DECLINED = 0,
PEER_INVITATION_RESPONSE_ACCEPTED = 1,
PEER_INVITATION_RESPONSE_EXPIRED = 2,
PEER_INVITATION_RESPONSE_ERROR = 3
} PEER_INVITATION_RESPONSE_TYPE;
typedef enum peer_application_registration_type_tag {
PEER_APPLICATION_CURRENT_USER = 0,
PEER_APPLICATION_ALL_USERS = 1
} PEER_APPLICATION_REGISTRATION_TYPE;
/////////////////////////////////////////////////////////////////////////////
// Structures
typedef struct peer_invitation_tag {
GUID applicationId;
PEER_DATA applicationData;
PWSTR pwzMessage;
} PEER_INVITATION, * PPEER_INVITATION;
typedef const PEER_INVITATION * PCPEER_INVITATION;
typedef struct peer_invitation_response_tag {
PEER_INVITATION_RESPONSE_TYPE action;
PWSTR pwzMessage;
HRESULT hrExtendedInfo;
} PEER_INVITATION_RESPONSE, * PPEER_INVITATION_RESPONSE;
typedef const PEER_INVITATION_RESPONSE * PCPEER_INVITATION_RESPONSE;
typedef struct peer_app_launch_info_tag {
PPEER_CONTACT pContact;
PPEER_ENDPOINT pEndpoint;
PPEER_INVITATION pInvitation;
} PEER_APP_LAUNCH_INFO, * PPEER_APP_LAUNCH_INFO;
typedef const PEER_APP_LAUNCH_INFO * PCPEER_APP_LAUNCH_INFO;
typedef struct peer_application_registration_info_tag {
PEER_APPLICATION application;
PWSTR pwzApplicationToLaunch;
PWSTR pwzApplicationArguments;
DWORD dwPublicationScope;
} PEER_APPLICATION_REGISTRATION_INFO, *PPEER_APPLICATION_REGISTRATION_INFO;
typedef const PEER_APPLICATION_REGISTRATION_INFO * PCPEER_APPLICATION_REGISTRATION_INFO;
#ifndef MIDL_PASS
/////////////////////////////////////////////////////////////////////////////
// API's
// AppInvite sender side API's
HRESULT WINAPI PeerCollabAsyncInviteContact(
__in_opt PCPEER_CONTACT pcContact,
__in PCPEER_ENDPOINT pcEndpoint,
__in PCPEER_INVITATION pcInvitation,
__in_opt HANDLE hEvent,
__out_opt HANDLE * phInvitation);
HRESULT WINAPI PeerCollabGetInvitationResponse(
__in HANDLE hInvitation,
__deref_out PPEER_INVITATION_RESPONSE * ppInvitationResponse);
HRESULT WINAPI PeerCollabCancelInvitation(
__in HANDLE hInvitation);
HRESULT WINAPI PeerCollabCloseHandle(
__in HANDLE hInvitation);
HRESULT WINAPI PeerCollabInviteContact(
__in_opt PCPEER_CONTACT pcContact,
__in PCPEER_ENDPOINT pcEndpoint,
__in PCPEER_INVITATION pcInvitation,
__deref_out PPEER_INVITATION_RESPONSE * ppResponse);
HRESULT WINAPI PeerCollabAsyncInviteEndpoint(
__in PCPEER_ENDPOINT pcEndpoint,
__in PCPEER_INVITATION pcInvitation,
__in_opt HANDLE hEvent,
__out_opt HANDLE * phInvitation);
HRESULT WINAPI PeerCollabInviteEndpoint(
__in PCPEER_ENDPOINT pcEndpoint,
__in PCPEER_INVITATION pcInvitation,
__deref_out PPEER_INVITATION_RESPONSE * ppResponse);
// AppInvite receiver side API's
HRESULT WINAPI PeerCollabGetAppLaunchInfo(
__deref_out PPEER_APP_LAUNCH_INFO * ppLaunchInfo);
// Applications registration API's
HRESULT WINAPI PeerCollabRegisterApplication(
__in PCPEER_APPLICATION_REGISTRATION_INFO pcApplication,
__in PEER_APPLICATION_REGISTRATION_TYPE registrationType);
HRESULT WINAPI PeerCollabUnregisterApplication(
__in const GUID * pApplicationId,
__in PEER_APPLICATION_REGISTRATION_TYPE registrationType);
HRESULT WINAPI PeerCollabGetApplicationRegistrationInfo(
__in const GUID * pApplicationId,
__in PEER_APPLICATION_REGISTRATION_TYPE registrationType,
__deref_out PPEER_APPLICATION_REGISTRATION_INFO * ppApplication);
HRESULT WINAPI PeerCollabEnumApplicationRegistrationInfo(
__in PEER_APPLICATION_REGISTRATION_TYPE registrationType,
__out HPEERENUM * phPeerEnum);
#endif // MIDL_PASS
/////////////////////////////////////////////////////////////////////////////
//
// S E R V E R L E S S P R E S E N C E
//
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// constants
typedef enum peer_presence_status_tag {
PEER_PRESENCE_OFFLINE = 0,
PEER_PRESENCE_OUT_TO_LUNCH = 1,
PEER_PRESENCE_AWAY = 2,
PEER_PRESENCE_BE_RIGHT_BACK = 3,
PEER_PRESENCE_IDLE = 4,
PEER_PRESENCE_BUSY = 5,
PEER_PRESENCE_ON_THE_PHONE = 6,
PEER_PRESENCE_ONLINE = 7
} PEER_PRESENCE_STATUS;
/////////////////////////////////////////////////////////////////////////////
// Structures
typedef struct peer_presence_info_tag {
PEER_PRESENCE_STATUS status;
PWSTR pwzDescriptiveText;
} PEER_PRESENCE_INFO, *PPEER_PRESENCE_INFO;
typedef const PEER_PRESENCE_INFO * PCPEER_PRESENCE_INFO;
#ifndef MIDL_PASS
//////////////////////////////////////////////////////////////////////////////
// API's
// Subscriber
HRESULT WINAPI PeerCollabGetPresenceInfo(
__in_opt PCPEER_ENDPOINT pcEndpoint,
__deref_out PPEER_PRESENCE_INFO *ppPresenceInfo);
HRESULT WINAPI PeerCollabEnumApplications(
__in_opt PCPEER_ENDPOINT pcEndpoint,
__in_opt const GUID * pApplicationId,
__out HPEERENUM * phPeerEnum);
HRESULT WINAPI PeerCollabEnumObjects(
__in_opt PCPEER_ENDPOINT pcEndpoint,
__in_opt const GUID * pObjectId,
__out HPEERENUM * phPeerEnum);
HRESULT WINAPI PeerCollabEnumEndpoints(
__in_opt PCPEER_CONTACT pcContact,
__out HPEERENUM * phPeerEnum);
HRESULT WINAPI PeerCollabRefreshEndpointData(
__in PCPEER_ENDPOINT pcEndpoint);
HRESULT WINAPI PeerCollabDeleteEndpointData(
__in PCPEER_ENDPOINT pcEndpoint);
HRESULT WINAPI PeerCollabQueryContactData(
__in_opt PCPEER_ENDPOINT pcEndpoint,
__deref_out PWSTR * ppwzContactData);
HRESULT WINAPI PeerCollabSubscribeEndpointData(
__in const PCPEER_ENDPOINT pcEndpoint);
HRESULT WINAPI PeerCollabUnsubscribeEndpointData(
__in const PCPEER_ENDPOINT pcEndpoint);
// Publisher
HRESULT WINAPI PeerCollabSetPresenceInfo(
__in PCPEER_PRESENCE_INFO pcPresenceInfo);
HRESULT WINAPI PeerCollabGetEndpointName(
__deref_out PWSTR * ppwzEndpointName);
HRESULT WINAPI PeerCollabSetEndpointName(
__in PCWSTR pwzEndpointName);
HRESULT WINAPI PeerCollabSetObject(
__in PCPEER_OBJECT pcObject);
HRESULT WINAPI PeerCollabDeleteObject(
__in const GUID * pObjectId);
#endif
/////////////////////////////////////////////////////////////////////////////
//
// R E G I S T R A T I O N
//
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// constants
typedef enum peer_change_type_tag {
PEER_CHANGE_ADDED = 0,
PEER_CHANGE_DELETED = 1,
PEER_CHANGE_UPDATED = 2
} PEER_CHANGE_TYPE;
typedef enum peer_collab_event_type_tag {
PEER_EVENT_WATCHLIST_CHANGED = 1,
PEER_EVENT_ENDPOINT_CHANGED = 2,
PEER_EVENT_ENDPOINT_PRESENCE_CHANGED = 3,
PEER_EVENT_ENDPOINT_APPLICATION_CHANGED = 4,
PEER_EVENT_ENDPOINT_OBJECT_CHANGED = 5,
PEER_EVENT_MY_ENDPOINT_CHANGED = 6,
PEER_EVENT_MY_PRESENCE_CHANGED = 7,
PEER_EVENT_MY_APPLICATION_CHANGED = 8,
PEER_EVENT_MY_OBJECT_CHANGED = 9,
PEER_EVENT_PEOPLE_NEAR_ME_CHANGED = 10,
PEER_EVENT_REQUEST_STATUS_CHANGED = 11
} PEER_COLLAB_EVENT_TYPE;
/////////////////////////////////////////////////////////////////////////////
// Structures
typedef struct peer_collab_event_registration_tag {
PEER_COLLAB_EVENT_TYPE eventType;
#ifdef MIDL_PASS
[unique]
#endif
GUID * pInstance;
} PEER_COLLAB_EVENT_REGISTRATION, *PPEER_COLLAB_EVENT_REGISTRATION;
typedef struct peer_event_watchlist_changed_data_tag {
PPEER_CONTACT pContact;
PEER_CHANGE_TYPE changeType;
} PEER_EVENT_WATCHLIST_CHANGED_DATA, *PPEER_EVENT_WATCHLIST_CHANGED_DATA;
typedef struct peer_event_presence_changed_data_tag {
PPEER_CONTACT pContact;
PPEER_ENDPOINT pEndpoint;
PEER_CHANGE_TYPE changeType;
PPEER_PRESENCE_INFO pPresenceInfo;
} PEER_EVENT_PRESENCE_CHANGED_DATA, *PPEER_EVENT_PRESENCE_CHANGED_DATA;
typedef struct peer_event_application_changed_data_tag {
PPEER_CONTACT pContact;
PPEER_ENDPOINT pEndpoint;
PEER_CHANGE_TYPE changeType;
PPEER_APPLICATION pApplication;
} PEER_EVENT_APPLICATION_CHANGED_DATA, *PPEER_EVENT_APPLICATION_CHANGED_DATA;
typedef struct peer_event_object_changed_data_tag {
PPEER_CONTACT pContact;
PPEER_ENDPOINT pEndpoint;
PEER_CHANGE_TYPE changeType;
PPEER_OBJECT pObject;
} PEER_EVENT_OBJECT_CHANGED_DATA, *PPEER_EVENT_OBJECT_CHANGED_DATA;
typedef struct peer_event_endpoint_changed_data_tag {
PPEER_CONTACT pContact;
PPEER_ENDPOINT pEndpoint;
} PEER_EVENT_ENDPOINT_CHANGED_DATA, *PPEER_EVENT_ENDPOINT_CHANGED_DATA;
typedef struct peer_event_people_near_me_changed_data_tag {
PEER_CHANGE_TYPE changeType;
PPEER_PEOPLE_NEAR_ME pPeopleNearMe;
} PEER_EVENT_PEOPLE_NEAR_ME_CHANGED_DATA, *PPEER_EVENT_PEOPLE_NEAR_ME_CHANGED_DATA;
typedef struct peer_event_request_status_changed_data_tag {
PPEER_ENDPOINT pEndpoint;
HRESULT hrChange;
} PEER_EVENT_REQUEST_STATUS_CHANGED_DATA, *PPEER_EVENT_REQUEST_STATUS_CHANGED_DATA;
#ifdef MIDL_PASS
typedef struct peer_collab_event_data_tag {
PEER_COLLAB_EVENT_TYPE eventType;
[switch_is(eventType)]
union {
[case(PEER_EVENT_WATCHLIST_CHANGED)]
PEER_EVENT_WATCHLIST_CHANGED_DATA watchListChangedData;
[case(PEER_EVENT_ENDPOINT_PRESENCE_CHANGED, PEER_EVENT_MY_PRESENCE_CHANGED)]
PEER_EVENT_PRESENCE_CHANGED_DATA presenceChangedData;
[case(PEER_EVENT_ENDPOINT_APPLICATION_CHANGED, PEER_EVENT_MY_APPLICATION_CHANGED)]
PEER_EVENT_APPLICATION_CHANGED_DATA applicationChangedData;
[case(PEER_EVENT_ENDPOINT_OBJECT_CHANGED, PEER_EVENT_MY_OBJECT_CHANGED)]
PEER_EVENT_OBJECT_CHANGED_DATA objectChangedData;
[case(PEER_EVENT_ENDPOINT_CHANGED, PEER_EVENT_MY_ENDPOINT_CHANGED)]
PEER_EVENT_ENDPOINT_CHANGED_DATA endpointChangedData;
[case(PEER_EVENT_PEOPLE_NEAR_ME_CHANGED)]
PEER_EVENT_PEOPLE_NEAR_ME_CHANGED_DATA peopleNearMeChangedData;
[case(PEER_EVENT_REQUEST_STATUS_CHANGED)]
PEER_EVENT_REQUEST_STATUS_CHANGED_DATA requestStatusChangedData;
[default]
;
};
} PEER_COLLAB_EVENT_DATA, *PPEER_COLLAB_EVENT_DATA;
#else
typedef struct peer_collab_event_data_tag {
PEER_COLLAB_EVENT_TYPE eventType;
union {
PEER_EVENT_WATCHLIST_CHANGED_DATA watchListChangedData;
PEER_EVENT_PRESENCE_CHANGED_DATA presenceChangedData;
PEER_EVENT_APPLICATION_CHANGED_DATA applicationChangedData;
PEER_EVENT_OBJECT_CHANGED_DATA objectChangedData;
PEER_EVENT_ENDPOINT_CHANGED_DATA endpointChangedData;
PEER_EVENT_PEOPLE_NEAR_ME_CHANGED_DATA peopleNearMeChangedData;
PEER_EVENT_REQUEST_STATUS_CHANGED_DATA requestStatusChangedData;
};
} PEER_COLLAB_EVENT_DATA, *PPEER_COLLAB_EVENT_DATA;
#endif
#ifndef MIDL_PASS
/////////////////////////////////////////////////////////////////////////////
// API's
HRESULT WINAPI PeerCollabRegisterEvent(
__in HANDLE hEvent,
__in DWORD cEventRegistration,
__in_ecount(cEventRegistration) PEER_COLLAB_EVENT_REGISTRATION * pEventRegistrations,
__out HPEEREVENT *phPeerEvent);
HRESULT WINAPI PeerCollabGetEventData(
__in HPEEREVENT hPeerEvent,
__deref_out PPEER_COLLAB_EVENT_DATA * ppEventData);
HRESULT WINAPI PeerCollabUnregisterEvent(
__in HPEEREVENT hPeerEvent);
//////////////////////////////////////////////////////////////////////////////
//
// P N M
//
//////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// API's
HRESULT WINAPI PeerCollabEnumPeopleNearMe(
__out HPEERENUM *phPeerEnum);
//////////////////////////////////////////////////////////////////////////////
//
// C O N T A C T
//
//////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// API's
HRESULT WINAPI PeerCollabAddContact(
__in PCWSTR pwzContactData,
__deref_opt_out PPEER_CONTACT * ppContact);
HRESULT WINAPI PeerCollabDeleteContact(
__in PCWSTR pwzPeerName);
HRESULT WINAPI PeerCollabGetContact(
__in_opt PCWSTR pwzPeerName,
__deref_out PPEER_CONTACT * ppContact);
HRESULT WINAPI PeerCollabUpdateContact(
__in PCPEER_CONTACT pContact);
HRESULT WINAPI PeerCollabEnumContacts(
__out HPEERENUM * phPeerEnum);
HRESULT WINAPI PeerCollabExportContact(
__in_opt PCWSTR pwzPeerName,
__deref_out PWSTR * ppwzContactData);
HRESULT WINAPI PeerCollabParseContact(
__in PCWSTR pwzContactData,
__deref_out PPEER_CONTACT * ppContact);
#endif // MIDL_PASS
#endif // NO_P2P_COLLABORATION
/////////////////////////////////////////////////////////////////////////////
//
// PNRP APIs
//
/////////////////////////////////////////////////////////////////////////////
#ifndef MIDL_PASS
#ifndef NO_P2P_PNRP
#define PNRP_VERSION MAKEWORD(2,0)
#define PEER_PNRP_ALL_LINK_CLOUDS L"PEER_PNRP_ALL_LINKS"
#define PEER_PNRP_AUTO_ADDRESSES ((ULONG)(-1))
/////////////////////////////////////////////////////////////////////////////
// Structures
typedef PVOID HRESOLUTION, HREGISTRATION;
typedef struct peer_pnrp_endpoint_info_tag
{
PWSTR pwzPeerName;
ULONG cAddresses;
__field_ecount(cAddresses) SOCKADDR **ppAddresses;
PWSTR pwzComment;
PEER_DATA payload;
} PEER_PNRP_ENDPOINT_INFO, *PPEER_PNRP_ENDPOINT_INFO;
typedef struct peer_pnrp_cloud_info_tag
{
PWSTR pwzCloudName;
PNRP_SCOPE dwScope;
DWORD dwScopeId;
} PEER_PNRP_CLOUD_INFO, *PPEER_PNRP_CLOUD_INFO;
typedef struct peer_pnrp_registration_info_tag {
PWSTR pwzCloudName;
PWSTR pwzPublishingIdentity;
ULONG cAddresses;
__field_ecount(cAddresses) SOCKADDR **ppAddresses;
WORD wPort;
PWSTR pwzComment;
PEER_DATA payload;
} PEER_PNRP_REGISTRATION_INFO, *PPEER_PNRP_REGISTRATION_INFO;
/////////////////////////////////////////////////////////////////////////////
// API's
HRESULT WINAPI PeerNameToPeerHostName(
__in PCWSTR pwzPeerName,
__deref_out PWSTR *ppwzHostName);
HRESULT WINAPI PeerHostNameToPeerName(
__in PCWSTR pwzHostName,
__deref_out PWSTR *ppwzPeerName);
HRESULT WINAPI PeerPnrpStartup(
__in WORD wVersionRequested);
HRESULT WINAPI PeerPnrpShutdown();
HRESULT WINAPI PeerPnrpRegister(
__in PCWSTR pcwzPeerName,
__in_opt PPEER_PNRP_REGISTRATION_INFO pRegistrationInfo,
__out HREGISTRATION *phRegistration);
HRESULT WINAPI PeerPnrpUpdateRegistration(
__in HREGISTRATION hRegistration,
__in PPEER_PNRP_REGISTRATION_INFO pRegistrationInfo);
HRESULT WINAPI PeerPnrpUnregister(
__in HREGISTRATION hRegistration);
HRESULT WINAPI PeerPnrpResolve(
__in PCWSTR pcwzPeerName,
__in_opt PCWSTR pcwzCloudName,
__inout ULONG *pcEndpoints,
__deref_out_ecount(*pcEndpoints) PPEER_PNRP_ENDPOINT_INFO *ppEndpoints);
HRESULT WINAPI PeerPnrpStartResolve(
__in PCWSTR pcwzPeerName,
__in_opt PCWSTR pcwzCloudName,
__in_opt ULONG cMaxEndpoints,
__in HANDLE hEvent,
__out HRESOLUTION *phResolve);
HRESULT WINAPI PeerPnrpGetCloudInfo(
__out ULONG *pcNumClouds,
__deref_out_ecount(*pcNumClouds) PPEER_PNRP_CLOUD_INFO *ppCloudInfo);
HRESULT WINAPI PeerPnrpGetEndpoint(
__in HRESOLUTION hResolve,
__deref_out PPEER_PNRP_ENDPOINT_INFO *ppEndpoint);
HRESULT WINAPI PeerPnrpEndResolve(
__in HRESOLUTION hResolve);
#endif // NO_P2P_PNRP
#endif // MIDL_PASS
#ifdef __cplusplus
}
#endif /* __cplusplus */
/////////////////////////////////////////////////////////////////////////////
//
// Error codes
//
/////////////////////////////////////////////////////////////////////////////
#ifndef FACILITY_P2P
#define FACILITY_P2P 99
#endif
#define PEER_E_IPV6_NOT_INSTALLED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0001)
#define PEER_E_NOT_INITIALIZED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0002)
#define PEER_E_CANNOT_START_SERVICE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0003)
#define PEER_E_NOT_LICENSED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0004)
#define PEER_E_INVALID_GRAPH MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0010)
#define PEER_E_DBNAME_CHANGED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0011)
#define PEER_E_DUPLICATE_GRAPH MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0012)
#define PEER_E_GRAPH_NOT_READY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0013)
#define PEER_E_GRAPH_SHUTTING_DOWN MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0014)
#define PEER_E_GRAPH_IN_USE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0015)
#define PEER_E_INVALID_DATABASE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0016)
#define PEER_E_TOO_MANY_ATTRIBUTES MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0017)
#define PEER_E_CONNECTION_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0103)
#define PEER_E_CONNECT_SELF MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0106)
#define PEER_E_ALREADY_LISTENING MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0107)
#define PEER_E_NODE_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0108)
#define PEER_E_CONNECTION_FAILED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0109)
#define PEER_E_CONNECTION_NOT_AUTHENTICATED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x010A)
#define PEER_E_CONNECTION_REFUSED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x010B)
#define PEER_E_CLASSIFIER_TOO_LONG MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0201)
#define PEER_E_TOO_MANY_IDENTITIES MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0202)
#define PEER_E_NO_KEY_ACCESS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0203)
#define PEER_E_GROUPS_EXIST MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0204)
// record error codes
#define PEER_E_RECORD_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0301)
#define PEER_E_DATABASE_ACCESSDENIED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0302)
#define PEER_E_DBINITIALIZATION_FAILED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0303)
#define PEER_E_MAX_RECORD_SIZE_EXCEEDED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0304)
#define PEER_E_DATABASE_ALREADY_PRESENT MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0305)
#define PEER_E_DATABASE_NOT_PRESENT MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0306)
#define PEER_E_IDENTITY_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0401)
// eventing error
#define PEER_E_EVENT_HANDLE_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0501)
// searching error
#define PEER_E_INVALID_SEARCH MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0601)
#define PEER_E_INVALID_ATTRIBUTES MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0602)
// certificate verification error codes
#define PEER_E_INVITATION_NOT_TRUSTED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0701)
#define PEER_E_CHAIN_TOO_LONG MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0703)
#define PEER_E_INVALID_TIME_PERIOD MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0705)
#define PEER_E_CIRCULAR_CHAIN_DETECTED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0706)
#define PEER_E_CERT_STORE_CORRUPTED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x0801)
#define PEER_E_NO_CLOUD MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x1001)
#define PEER_E_CLOUD_NAME_AMBIGUOUS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x1005)
#define PEER_E_INVALID_RECORD MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2010)
#define PEER_E_NOT_AUTHORIZED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2020)
#define PEER_E_PASSWORD_DOES_NOT_MEET_POLICY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2021)
#define PEER_E_DEFERRED_VALIDATION MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2030)
#define PEER_E_INVALID_GROUP_PROPERTIES MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2040)
#define PEER_E_INVALID_PEER_NAME MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2050)
#define PEER_E_INVALID_CLASSIFIER MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2060)
#define PEER_E_INVALID_FRIENDLY_NAME MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2070)
#define PEER_E_INVALID_ROLE_PROPERTY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2071)
#define PEER_E_INVALID_CLASSIFIER_PROPERTY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2072)
#define PEER_E_INVALID_RECORD_EXPIRATION MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2080)
#define PEER_E_INVALID_CREDENTIAL_INFO MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2081)
#define PEER_E_INVALID_CREDENTIAL MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2082)
#define PEER_E_INVALID_RECORD_SIZE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2083)
#define PEER_E_UNSUPPORTED_VERSION MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2090)
#define PEER_E_GROUP_NOT_READY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2091)
#define PEER_E_GROUP_IN_USE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2092)
#define PEER_E_INVALID_GROUP MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2093)
#define PEER_E_NO_MEMBERS_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2094)
#define PEER_E_NO_MEMBER_CONNECTIONS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2095)
#define PEER_E_UNABLE_TO_LISTEN MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x2096)
#define PEER_E_IDENTITY_DELETED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x20A0)
#define PEER_E_SERVICE_NOT_AVAILABLE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x20A1)
// Contacts APIs error code
#define PEER_E_CONTACT_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x6001)
// Special success codes
#define PEER_S_GRAPH_DATA_CREATED MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_P2P, 0x0001)
#define PEER_S_NO_EVENT_DATA MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_P2P, 0x0002)
#define PEER_S_ALREADY_CONNECTED MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_P2P, 0x2000)
#define PEER_S_SUBSCRIPTION_EXISTS MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_P2P, 0x6000)
#define PEER_S_NO_CONNECTIVITY MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_P2P, 0x0005)
#define PEER_S_ALREADY_A_MEMBER MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_P2P, 0x0006)
// Pnrp helpers errors
#define PEER_E_CANNOT_CONVERT_PEER_NAME MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x4001)
#define PEER_E_INVALID_PEER_HOST_NAME MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x4002)
#define PEER_E_NO_MORE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x4003)
#define PEER_E_PNRP_DUPLICATE_PEER_NAME MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x4005)
// AppInvite APIs error code
#define PEER_E_INVITE_CANCELLED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x7000)
#define PEER_E_INVITE_RESPONSE_NOT_AVAILABLE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x7001)
// Serverless presence error codes
#define PEER_E_NOT_SIGNED_IN MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x7003)
#define PEER_E_PRIVACY_DECLINED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x7004)
#define PEER_E_TIMEOUT MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x7005)
#define PEER_E_INVALID_ADDRESS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0X7007)
#define PEER_E_FW_EXCEPTION_DISABLED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0X7008)
#define PEER_E_FW_BLOCKED_BY_POLICY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0X7009)
#define PEER_E_FW_BLOCKED_BY_SHIELDS_UP MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0X700A)
#define PEER_E_FW_DECLINED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_P2P, 0x700B)
//
// WSA_PNRP_* error codes returned by the NSP
//
// These errors are only used by PNRP NSP and applications using the NSP.
// Any usage from other system/apps not related to PNRP (for example PNRP based getaddrinfo
// implementations) would require these errors be moved to winerror.h
#define WSA_PNRP_ERROR_BASE 11500
#define WSA_PNRP_CLOUD_NOT_FOUND (WSA_PNRP_ERROR_BASE + 1)
#define WSA_PNRP_CLOUD_DISABLED (WSA_PNRP_ERROR_BASE + 2)
#define WSA_PNRP_INVALID_IDENTITY (WSA_PNRP_ERROR_BASE + 3)
#define WSA_PNRP_TOO_MUCH_LOAD (WSA_PNRP_ERROR_BASE + 4)
#define WSA_PNRP_CLOUD_IS_SEARCH_ONLY (WSA_PNRP_ERROR_BASE + 5)
#define WSA_PNRP_CLIENT_INVALID_COMPARTMENT_ID (WSA_PNRP_ERROR_BASE + 6)
#define WSA_PNRP_DUPLICATE_PEER_NAME (WSA_PNRP_ERROR_BASE + 8)
#define WSA_PNRP_CLOUD_IS_DEAD (WSA_PNRP_ERROR_BASE + 9)
//
// these are the HRESULTs corresponding to the WSA error codes above and returned by Grouping and Simple API
//
#define PEER_E_CLOUD_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_CLOUD_NOT_FOUND)
#define PEER_E_CLOUD_DISABLED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_CLOUD_DISABLED)
#define PEER_E_INVALID_IDENTITY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_INVALID_IDENTITY)
#define PEER_E_TOO_MUCH_LOAD MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_TOO_MUCH_LOAD)
#define PEER_E_CLOUD_IS_SEARCH_ONLY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_CLOUD_IS_SEARCH_ONLY)
#define PEER_E_CLIENT_INVALID_COMPARTMENT_ID MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_CLIENT_INVALID_COMPARTMENT_ID)
#define PEER_E_DUPLICATE_PEER_NAME MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_DUPLICATE_PEER_NAME)
#define PEER_E_CLOUD_IS_DEAD MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, WSA_PNRP_CLOUD_IS_DEAD)
//
// these are the error codes that are not defined by winerror.h, so we define them as our own
//
#define PEER_E_NOT_FOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_NOT_FOUND)
#define PEER_E_DISK_FULL MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_DISK_FULL)
#define PEER_E_ALREADY_EXISTS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_WIN32, ERROR_ALREADY_EXISTS)
#pragma warning(pop)
#endif // _P2P_H_
/////////////////////////////////////////////////////////////////////////////
//
// These GUIDs are outside conditional includes so you can
// #include <p2p.h> in precompiled header
// then
// #include <initguid.h> in a single source file
// #include <p2p.h> in that source file a second time to instantiate the GUIDs
#ifdef DEFINE_GUID
#ifndef NO_P2P_GROUP
DEFINE_GUID(PEER_GROUP_ROLE_ADMIN, /* 04387127-aa56-450a-8ce5-4f565c6790f4 */
0x04387127, 0xaa56, 0x450a, 0x8c, 0xe5, 0x4f, 0x56, 0x5c, 0x67, 0x90, 0xf4);
DEFINE_GUID(PEER_GROUP_ROLE_MEMBER, /* f12dc4c7-0857-4ca0-93fc-b1bb19a3d8c2 */
0xf12dc4c7, 0x0857, 0x4ca0, 0x93, 0xfc, 0xb1, 0xbb, 0x19, 0xa3, 0xd8, 0xc2);
#if NTDDI_VERSION >= NTDDI_VISTA
DEFINE_GUID(PEER_GROUP_ROLE_INVITING_MEMBER, /* 4370fd89-dc18-4cfb-8dbf-9853a8a9f905 */
0x4370fd89, 0xdc18, 0x4cfb, 0x8d, 0xbf, 0x98, 0x53, 0xa8, 0xa9, 0xf9, 0x05);
#endif
#endif // NO_P2P_GROUP
#ifndef NO_P2P_COLLABORATION
DEFINE_GUID(PEER_COLLAB_OBJECTID_USER_PICTURE, /* dd15f41f-fc4e-4922-b035-4c06a754d01d */
0xdd15f41f, 0xfc4e, 0x4922, 0xb0, 0x35, 0x4c, 0x06, 0xa7, 0x54, 0xd0, 0x1d);
#endif
#endif // DEFINE_GUID