|
//------------------------------------------------------------------------------
// <copyright file="UnsafeCollabNativeMethods.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
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
//
// <SecurityKernel Critical="True" Ring="0">
// <SatisfiesLinkDemand Name="SafeHandleZeroOrMinusOneIsInvalid" />
// </SecurityKernel>
#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
//
// <SecurityKernel Critical="True" Ring="0">
// <SatisfiesLinkDemand Name="SafeHandleZeroOrMinusOneIsInvalid" />
// </SecurityKernel>
#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
//
// <SecurityKernel Critical="True" Ring="0">
// <SatisfiesLinkDemand Name="SafeHandleZeroOrMinusOneIsInvalid" />
// </SecurityKernel>
#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
//
// <SecurityKernel Critical="True" Ring="0">
// <SatisfiesLinkDemand Name="SafeHandleZeroOrMinusOneIsInvalid" />
// </SecurityKernel>
#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
//
// <SecurityKernel Critical="True" Ring="0">
// <SatisfiesLinkDemand Name="SafeHandleZeroOrMinusOneIsInvalid" />
// </SecurityKernel>
#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
//
// <SecurityKernel Critical="True" Ring="0">
// <SatisfiesLinkDemand Name="SafeHandleZeroOrMinusOneIsInvalid" />
// </SecurityKernel>
#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;
}
/// <summary>
/// Stores specific error codes that we use.
/// </summary>
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);
}
/// <summary>
/// This class contains all the collab/windows native functions that are called
/// by Collaboration namespace
/// </summary>
[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);
}
}
|