917 lines
34 KiB
C#
917 lines
34 KiB
C#
|
//------------------------------------------------------------------------------
|
||
|
// <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);
|
||
|
|
||
|
}
|
||
|
}
|