//------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //------------------------------------------------------------------------------ namespace System.Net.PeerToPeer.Collaboration { using System; using System.Security.Permissions; using System.Security.Cryptography.X509Certificates; using System.Collections; using System.Collections.ObjectModel; using System.Runtime.InteropServices; using Microsoft.Win32.SafeHandles; using System.Collections.Generic; using System.Text; using System.Security; // // To manage any collaboration memory handle // // // // #pragma warning disable 618 // Have not migrated to v4 transparency yet [System.Security.SecurityCritical(System.Security.SecurityCriticalScope.Everything)] #pragma warning restore 618 [System.Security.SuppressUnmanagedCodeSecurityAttribute()] internal sealed class SafeCollabData : SafeHandleZeroOrMinusOneIsInvalid { internal SafeCollabData() : base(true) { } protected override bool ReleaseHandle() { if(!IsInvalid) UnsafeCollabNativeMethods.PeerFreeData(handle); SetHandleAsInvalid(); //Mark it closed - This does not change the value of the handle it self SetHandle(IntPtr.Zero); //Mark it invalid - Change the value to Zero return true; } } // // To manage any collaboration enumeration handle // // // // #pragma warning disable 618 // Have not migrated to v4 transparency yet [System.Security.SecurityCritical(System.Security.SecurityCriticalScope.Everything)] #pragma warning restore 618 [System.Security.SuppressUnmanagedCodeSecurityAttribute()] internal sealed class SafeCollabEnum : SafeHandleZeroOrMinusOneIsInvalid { internal SafeCollabEnum() : base(true) { } protected override bool ReleaseHandle() { if (!IsInvalid) UnsafeCollabNativeMethods.PeerEndEnumeration(handle); SetHandleAsInvalid(); //Mark it closed - This does not change the value of the handle it self SetHandle(IntPtr.Zero); //Mark it invalid - Change the value to Zero return true; } } // // To manage any collaboration invite handle // // // // #pragma warning disable 618 // Have not migrated to v4 transparency yet [System.Security.SecurityCritical(System.Security.SecurityCriticalScope.Everything)] #pragma warning restore 618 [System.Security.SuppressUnmanagedCodeSecurityAttribute()] internal sealed class SafeCollabInvite : SafeHandleZeroOrMinusOneIsInvalid { internal SafeCollabInvite() : base(true) { } protected override bool ReleaseHandle() { if (!IsInvalid) UnsafeCollabNativeMethods.PeerCollabCloseHandle(handle); SetHandleAsInvalid(); //Mark it closed - This does not change the value of the handle it self SetHandle(IntPtr.Zero); //Mark it invalid - Change the value to Zero return true; } } // // To manage any cert store handle // // // // #pragma warning disable 618 // Have not migrated to v4 transparency yet [System.Security.SecurityCritical(System.Security.SecurityCriticalScope.Everything)] #pragma warning restore 618 [System.Security.SuppressUnmanagedCodeSecurityAttribute()] internal sealed class SafeCertStore : SafeHandleZeroOrMinusOneIsInvalid { internal SafeCertStore() : base(true) { } protected override bool ReleaseHandle() { if (!IsInvalid) UnsafeCollabNativeMethods.CertCloseStore(handle, 0); SetHandleAsInvalid(); //Mark it closed - This does not change the value of the handle it self SetHandle(IntPtr.Zero); //Mark it invalid - Change the value to Zero return true; } } // // To manage any allocated memory handle // // // // #pragma warning disable 618 // Have not migrated to v4 transparency yet [System.Security.SecurityCritical(System.Security.SecurityCriticalScope.Everything)] #pragma warning restore 618 [System.Security.SuppressUnmanagedCodeSecurityAttribute()] internal sealed class SafeCollabMemory : SafeHandleZeroOrMinusOneIsInvalid { private bool allocated; internal SafeCollabMemory() : base(true) { } [SecurityPermissionAttribute(SecurityAction.LinkDemand, UnmanagedCode = true)] internal SafeCollabMemory(int cb) : base(true) { handle = Marshal.AllocHGlobal(cb); if (IntPtr.Equals(handle, IntPtr.Zero)){ SetHandleAsInvalid(); throw new PeerToPeerException(SR.GetString(SR.MemoryAllocFailed)); } allocated = true; } protected override bool ReleaseHandle() { if (allocated && !IsInvalid) Marshal.FreeHGlobal(handle); SetHandleAsInvalid(); //Mark it closed - This does not change the value of the handle it self SetHandle(IntPtr.Zero); //Mark it invalid - Change the value to Zero return true; } } // // To manage any collaboration event handle // // // // #pragma warning disable 618 // Have not migrated to v4 transparency yet [System.Security.SecurityCritical(System.Security.SecurityCriticalScope.Everything)] #pragma warning restore 618 [System.Security.SuppressUnmanagedCodeSecurityAttribute()] internal sealed class SafeCollabEvent : SafeHandleZeroOrMinusOneIsInvalid { internal SafeCollabEvent() : base(true) { } protected override bool ReleaseHandle() { UnsafeCollabNativeMethods.PeerCollabUnregisterEvent(handle); SetHandleAsInvalid(); //Mark it closed - This does not change the value of the handle it self SetHandle(IntPtr.Zero); //Mark it invalid - Change the value to Zero return true; } } // // // Definitions of structures used for passing data into native collaboration // functions // // /* typedef struct peer_presence_info_tag { PEER_PRESENCE_STATUS status; PWSTR pwzDescriptiveText; } PEER_PRESENCE_INFO */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_PRESENCE_INFO { internal PeerPresenceStatus status; internal string descText; } // /* typedef struct sockaddr_in6 { ADDRESS_FAMILY sin6_family; // AF_INET6. USHORT sin6_port; // Transport level port number. ULONG sin6_flowinfo; // IPv6 flow information. IN6_ADDR sin6_addr; // IPv6 address. union { ULONG sin6_scope_id; // Set of interfaces for a scope. SCOPE_ID sin6_scope_struct; }; } SOCKADDR_IN6_LH */ [StructLayout(LayoutKind.Sequential)] internal struct SOCKADDR_IN6 { internal ushort sin6_family; internal ushort sin6_port; internal uint sin6_flowinfo; internal byte sin6_addr0; internal byte sin6_addr1; internal byte sin6_addr2; internal byte sin6_addr3; internal byte sin6_addr4; internal byte sin6_addr5; internal byte sin6_addr6; internal byte sin6_addr7; internal byte sin6_addr8; internal byte sin6_addr9; internal byte sin6_addr10; internal byte sin6_addr11; internal byte sin6_addr12; internal byte sin6_addr13; internal byte sin6_addr14; internal byte sin6_addr15; internal uint sin6_scope_id; } /* typedef struct peer_address_tag { DWORD dwSize; SOCKADDR_IN6 sin6; } PEER_ADDRESS */ [StructLayout(LayoutKind.Sequential, Pack = 1)] internal struct PEER_ADDRESS { internal uint dwSize; internal SOCKADDR_IN6 sin6; } /* typedef struct peer_endpoint_tag { PEER_ADDRESS address; PWSTR pwzEndpointName; } PEER_ENDPOINT */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_ENDPOINT { internal PEER_ADDRESS peerAddress; internal IntPtr pwzEndpointName; } /* typedef struct peer_data_tag { ULONG cbData; PBYTE pbData; } PEER_DATA */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_DATA { internal UInt32 cbData; internal IntPtr pbData; } // for Guid /* typedef struct _GUID { unsigned long Data1; unsigned short Data2; unsigned short Data3; unsigned char Data4[ 8 ]; } GUID; */ [StructLayout(LayoutKind.Sequential/*, Pack=1*/)] internal struct GUID { internal uint data1; internal ushort data2; internal ushort data3; internal byte data4; internal byte data5; internal byte data6; internal byte data7; internal byte data8; internal byte data9; internal byte data10; internal byte data11; } /* typedef struct peer_object_tag { GUID id; PEER_DATA data; DWORD dwPublicationScope; } PEER_OBJECT */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_OBJECT { internal GUID guid; internal PEER_DATA data; internal uint dwPublicationScope; } /* typedef struct peer_application_tag { GUID id; PEER_DATA data; PWSTR pwzDescription; } PEER_APPLICATION */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_APPLICATION { internal GUID guid; internal PEER_DATA data; internal IntPtr pwzDescription; } /* typedef struct peer_application_registration_info_tag { PEER_APPLICATION application; PWSTR pwzApplicationToLaunch; PWSTR pwzApplicationArguments; DWORD dwPublicationScope; } PEER_APPLICATION_REGISTRATION_INFO */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_APPLICATION_REGISTRATION_INFO { internal PEER_APPLICATION application; internal string pwzApplicationToLaunch; internal string pwzApplicationArguments; internal uint dwPublicationScope; } /* typedef struct peer_contact_tag { PWSTR pwzPeerName; PWSTR pwzNickName; PWSTR pwzDisplayName; PWSTR pwzEmailAddress; BOOL fWatch; PEER_WATCH_PERMISSION WatcherPermissions; PEER_DATA credentials; } PEER_CONTACT */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_CONTACT { internal string pwzPeerName; internal string pwzNickname; internal string pwzDisplayName; internal string pwzEmailAddress; internal bool fWatch; internal SubscriptionType WatcherPermissions; internal PEER_DATA credentials; } /* typedef struct peer_people_near_me_tag { PWSTR pwzNickName; PEER_ENDPOINT endpoint; GUID id; } PEER_PEOPLE_NEAR_ME */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_PEOPLE_NEAR_ME { internal IntPtr pwzNickname; internal PEER_ENDPOINT endpoint; internal GUID id; } /* typedef struct peer_invitation_tag { GUID applicationId; PEER_DATA applicationData; PWSTR pwzMessage; } PEER_INVITATION */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_INVITATION { internal GUID applicationId; internal PEER_DATA applicationData; internal string pwzMessage; } /* typedef struct peer_invitation_response_tag { PEER_INVITATION_RESPONSE_TYPE action; PWSTR pwzMessage; HRESULT hrExtendedInfo; } PEER_INVITATION_RESPONSE */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_INVITATION_RESPONSE { internal PeerInvitationResponseType action; internal string pwzMessage; internal uint hrExtendedInfo; } /* typedef struct peer_app_launch_info_tag { PPEER_CONTACT pContact; PPEER_ENDPOINT pEndpoint; PPEER_INVITATION pInvitation; } PEER_APP_LAUNCH_INFO */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_APP_LAUNCH_INFO { internal IntPtr pContact; internal IntPtr pEndpoint; internal IntPtr pInvitation; } /* typedef struct peer_collab_event_registration_tag { PEER_COLLAB_EVENT_TYPE eventType; #ifdef MIDL_PASS [unique] #endif GUID * pInstance; } PEER_COLLAB_EVENT_REGISTRATION */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_COLLAB_EVENT_REGISTRATION { internal PeerCollabEventType eventType; internal IntPtr pInstance; } /* typedef struct peer_event_watchlist_changed_data_tag { PPEER_CONTACT pContact; PEER_CHANGE_TYPE changeType; } PEER_EVENT_WATCHLIST_CHANGED_DATA */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_EVENT_WATCHLIST_CHANGED_DATA { internal IntPtr pContact; internal PeerChangeType changeType; } /* 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 */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_EVENT_PRESENCE_CHANGED_DATA { internal IntPtr pContact; internal IntPtr pEndPoint; internal PeerChangeType changeType; internal IntPtr pPresenceInfo; } /* 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 */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_EVENT_APPLICATION_CHANGED_DATA { internal IntPtr pContact; internal IntPtr pEndPoint; internal PeerChangeType changeType; internal IntPtr pApplication; } /* 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 */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_EVENT_OBJECT_CHANGED_DATA { internal IntPtr pContact; internal IntPtr pEndPoint; internal PeerChangeType changeType; internal IntPtr pObject; } /* typedef struct peer_event_endpoint_changed_data_tag { PPEER_CONTACT pContact; PPEER_ENDPOINT pEndpoint; } PEER_EVENT_ENDPOINT_CHANGED_DATA */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_EVENT_ENDPOINT_CHANGED_DATA { internal IntPtr pContact; internal IntPtr pEndPoint; } /* 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; */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_EVENT_PEOPLE_NEAR_ME_CHANGED_DATA { internal PeerChangeType changeType; internal IntPtr pPeopleNearMe; } /* 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; */ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_EVENT_REQUEST_STATUS_CHANGED_DATA { internal IntPtr pEndPoint; internal int hrChange; } /* 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; */ // // We have two different structures and one has explicit layout to be able to // handle the union as shown in the structure above. Two structures are used // instead of one because of x86 and x64 padding issues. // [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct PEER_COLLAB_EVENT_DATA { internal PeerCollabEventType eventType; PEER_COLLAB_EVENT_CHANGED_DATA changedData; internal PEER_EVENT_WATCHLIST_CHANGED_DATA watchListChangedData { get{ return changedData.watchListChangedData; } } internal PEER_EVENT_PRESENCE_CHANGED_DATA presenceChangedData { get{ return changedData.presenceChangedData; } } internal PEER_EVENT_APPLICATION_CHANGED_DATA applicationChangedData { get{ return changedData.applicationChangedData; } } internal PEER_EVENT_OBJECT_CHANGED_DATA objectChangedData { get{ return changedData.objectChangedData; } } internal PEER_EVENT_ENDPOINT_CHANGED_DATA endpointChangedData { get{ return changedData.endpointChangedData; } } internal PEER_EVENT_PEOPLE_NEAR_ME_CHANGED_DATA peopleNearMeChangedData { get{ return changedData.peopleNearMeChangedData; } } internal PEER_EVENT_REQUEST_STATUS_CHANGED_DATA requestStatusChangedData { get{ return changedData.requestStatusChangedData; } } } [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Unicode)] internal struct PEER_COLLAB_EVENT_CHANGED_DATA { [FieldOffset(0)] internal PEER_EVENT_WATCHLIST_CHANGED_DATA watchListChangedData; [FieldOffset(0)] internal PEER_EVENT_PRESENCE_CHANGED_DATA presenceChangedData; [FieldOffset(0)] internal PEER_EVENT_APPLICATION_CHANGED_DATA applicationChangedData; [FieldOffset(0)] internal PEER_EVENT_OBJECT_CHANGED_DATA objectChangedData; [FieldOffset(0)] internal PEER_EVENT_ENDPOINT_CHANGED_DATA endpointChangedData; [FieldOffset(0)] internal PEER_EVENT_PEOPLE_NEAR_ME_CHANGED_DATA peopleNearMeChangedData; [FieldOffset(0)] internal PEER_EVENT_REQUEST_STATUS_CHANGED_DATA requestStatusChangedData; } /// /// Stores specific error codes that we use. /// internal static class UnsafeCollabReturnCodes { private const UInt32 FACILITY_P2P = 99; private const UInt32 FACILITY_WIN32 = 7; internal const int PEER_S_NO_EVENT_DATA = (int)(((int)FACILITY_P2P << 16) | 0x0002); internal const int PEER_S_SUBSCRIPTION_EXISTS = (int)(((int)FACILITY_P2P << 16) | 0x6000); internal const int PEER_E_NOT_FOUND = (int)(((int)1 << 31) | ((int)FACILITY_WIN32 << 16) | 1168); internal const int PEER_E_CONTACT_NOT_FOUND = (int)(((int)1 << 31) | ((int)FACILITY_P2P << 16) | 0x6001); internal const int PEER_E_ALREADY_EXISTS = (int)(((int)1 << 31) | ((int)FACILITY_WIN32 << 16) | 183); internal const int PEER_E_TIMEOUT = (int)(((int)1 << 31) | ((int)FACILITY_P2P << 16) | 0x7005); internal const int ERROR_TIMEOUT = (int)(((int)1 << 31) | ((int)FACILITY_WIN32 << 16) | 0x05B4); } /// /// This class contains all the collab/windows native functions that are called /// by Collaboration namespace /// [System.Security.SuppressUnmanagedCodeSecurityAttribute()] internal static class UnsafeCollabNativeMethods { private const string P2P = "p2p.dll"; [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabStartup(short wVersionRequested); [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabSignin(IntPtr hwndParent, PeerScope dwSignInOptions); [DllImport(P2P, CharSet = CharSet.Unicode)] public extern static void PeerFreeData(IntPtr dataToFree); [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabSignout(PeerScope dwSignInOptions); [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabGetSigninOptions(ref PeerScope dwSignInOptions); [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabSetPresenceInfo(ref PEER_PRESENCE_INFO ppi); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabGetPresenceInfo(IntPtr endpoint, out SafeCollabData pPresenceInfo); // // Application registration functions // [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabRegisterApplication(ref PEER_APPLICATION_REGISTRATION_INFO appRegInfo, PeerApplicationRegistrationType appRegType); [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabUnregisterApplication(ref GUID pApplicationId, PeerApplicationRegistrationType appRegType); // // Object set functions // [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabSetObject(ref PEER_OBJECT pcObject); [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabDeleteObject(ref GUID pObjectId); // // Enumeration functions // [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabEnumObjects( IntPtr pcEndpoint, IntPtr pObjectId, out SafeCollabEnum phPeerEnum); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabEnumApplications( IntPtr pcEndpoint, IntPtr pObjectId, out SafeCollabEnum phPeerEnum); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabEnumPeopleNearMe(out SafeCollabEnum phPeerEnum); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabEnumEndpoints(ref PEER_CONTACT pcContact, out SafeCollabEnum phPeerEnum); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabEnumContacts(out SafeCollabEnum phPeerEnum); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerGetItemCount(SafeCollabEnum hPeerEnum, ref UInt32 pCount); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerGetNextItem(SafeCollabEnum hPeerEnum, ref UInt32 pCount, out SafeCollabData pppvItems); [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerEndEnumeration(IntPtr hPeerEnum); // // Misc application functions // [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabGetAppLaunchInfo(out SafeCollabData ppLaunchInfo); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabGetApplicationRegistrationInfo(ref GUID pApplicationId, PeerApplicationRegistrationType registrationType, out SafeCollabData ppApplication); // // Contact functions // [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabExportContact(string pwzPeerNAme, ref string ppwzContactData); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabParseContact(string pwzContactData, out SafeCollabData ppContactData); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabGetContact(string pwzPeerName, out SafeCollabData ppwzContactData); [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabQueryContactData(IntPtr pcEndpoint, ref string ppwzContactData); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabAddContact(string pwzContactData, out SafeCollabData ppContact); [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabDeleteContact(string pwzPeerName); [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabUpdateContact(ref PEER_CONTACT pc); // // Endpoint functions // [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabRefreshEndpointData(IntPtr pcEndpoint); // // Event functions // [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabRegisterEvent(SafeWaitHandle hEvent, UInt32 cEventRegistration, ref PEER_COLLAB_EVENT_REGISTRATION pEventRegistrations, out SafeCollabEvent phPeerEvent); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabGetEventData(SafeCollabEvent hPeerEvent, out SafeCollabData ppEventData); [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabUnregisterEvent(IntPtr handle); // private const string CRYPT32 = "crypt32.dll"; // // Certificate functions // [System.Security.SecurityCritical] [DllImport(CRYPT32, CharSet = CharSet.Auto, SetLastError = true)] internal extern static SafeCertStore CertOpenStore(IntPtr lpszStoreProvider, uint dwMsgAndCertEncodingType, IntPtr hCryptProv, uint dwFlags, ref PEER_DATA pvPara); [System.Security.SecurityCritical] [DllImport(CRYPT32, CharSet = CharSet.Auto, SetLastError = true)] internal extern static SafeCertStore CertOpenStore(IntPtr lpszStoreProvider, uint dwMsgAndCertEncodingType, IntPtr hCryptProv, uint dwFlags, IntPtr pvPara); [DllImport(CRYPT32, CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.U1)] internal extern static bool CertCloseStore(IntPtr hCertStore, uint dwFlags); [System.Security.SecurityCritical] [DllImport(CRYPT32, CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.U1)] internal extern static bool CertSaveStore( SafeCertStore hCertStore, uint dwMsgAndCertEncodingType, uint dwSaveAs, uint dwSaveTo, ref PEER_DATA pvSafeToPara, uint dwFlags); // // My Contact functions // [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabGetEndpointName(ref string ppwzEndpointName); [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabSetEndpointName(string pwzEndpointName); // // Invitation functions // [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabGetInvitationResponse(SafeCollabInvite hInvitation, out SafeCollabData ppInvitationResponse); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabCancelInvitation(SafeCollabInvite hInvitation); [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabCloseHandle(IntPtr hInvitation); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabInviteContact( ref PEER_CONTACT pcContact, IntPtr pcEndpoint, ref PEER_INVITATION pcInvitation, out SafeCollabData ppResponse); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabAsyncInviteContact(ref PEER_CONTACT pcContact, IntPtr pcEndpoint, ref PEER_INVITATION pcInvitation, SafeWaitHandle hEvent, out SafeCollabInvite phInvitation); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabInviteEndpoint( IntPtr pcEndpoint, ref PEER_INVITATION pcInvitation, out SafeCollabData ppResponse); [SecurityCritical] [DllImport(P2P, CharSet = CharSet.Unicode)] internal extern static int PeerCollabAsyncInviteEndpoint( IntPtr pcEndpoint, ref PEER_INVITATION pcInvitation, SafeWaitHandle hEvent, out SafeCollabInvite phInvitation); } }