xpmgr/BuildTools/Include/drt.h

563 lines
19 KiB
C

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: drt.h
//
// Contents: Win32 APIs and structures for the Microsoft Distributed Routing Table.
//
// Questions or feedback:
//
// Email: peerfb@microsoft.com
// Website: http://www.microsoft.com/p2p
// Newsgroup: microsoft.public.win32.programmer.networks
//
//----------------------------------------------------------------------------
#ifndef _DRT_H_
#define _DRT_H_
#ifndef MIDL_PASS
#include <specstrings.h>
#include <winsock2.h>
#include <ws2tcpip.h> // for sockaddrin_6
#include <wincrypt.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
//////////////////////////////////////////////////////////////////////////////
// Constants
typedef PVOID HDRT;
typedef PVOID HDRT_SEARCH_CONTEXT;
typedef PVOID HDRT_TRANSPORT;
typedef PVOID HDRT_REGISTRATION_CONTEXT;
#define FACILITY_DRT 98
#define DRT_E_TIMEOUT MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x1001)
#define DRT_E_INVALID_KEY_SIZE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x1002)
#define DRT_E_INVALID_CERT_CHAIN MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x1004)
#define DRT_E_INVALID_MESSAGE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x1005)
#define DRT_E_NO_MORE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x1006)
#define DRT_E_INVALID_MAX_ADDRESSES MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x1007)
#define DRT_E_SEARCH_IN_PROGRESS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x1008)
#define DRT_E_INVALID_KEY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x1009)
#define DRT_S_RETRY MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_DRT, 0x1010)
#define DRT_E_INVALID_MAX_ENDPOINTS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x1011)
#define DRT_E_INVALID_SEARCH_RANGE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x1012)
#define DRT_E_INVALID_PORT MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2000)
#define DRT_E_INVALID_TRANSPORT_PROVIDER MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2001)
#define DRT_E_INVALID_SECURITY_PROVIDER MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2002)
#define DRT_E_STILL_IN_USE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2003)
#define DRT_E_INVALID_BOOTSTRAP_PROVIDER MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2004)
#define DRT_E_INVALID_ADDRESS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2005)
#define DRT_E_INVALID_SCOPE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2006)
#define DRT_E_TRANSPORT_SHUTTING_DOWN MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2007)
#define DRT_E_NO_ADDRESSES_AVAILABLE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2008)
#define DRT_E_DUPLICATE_KEY MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2009)
#define DRT_E_TRANSPORTPROVIDER_IN_USE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x200a)
#define DRT_E_TRANSPORTPROVIDER_NOT_ATTACHED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x200b)
#define DRT_E_SECURITYPROVIDER_IN_USE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x200c)
#define DRT_E_SECURITYPROVIDER_NOT_ATTACHED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x200d)
#define DRT_E_BOOTSTRAPPROVIDER_IN_USE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x200e)
#define DRT_E_BOOTSTRAPPROVIDER_NOT_ATTACHED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x200f)
#define DRT_E_TRANSPORT_ALREADY_BOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2101)
#define DRT_E_TRANSPORT_NOT_BOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2102)
#define DRT_E_TRANSPORT_UNEXPECTED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2103)
#define DRT_E_TRANSPORT_INVALID_ARGUMENT MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2104)
#define DRT_E_TRANSPORT_NO_DEST_ADDRESSES MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2105)
#define DRT_E_TRANSPORT_EXECUTING_CALLBACK MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2106)
#define DRT_E_TRANSPORT_ALREADY_EXISTS_FOR_SCOPE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2107)
#define DRT_E_INVALID_SETTINGS MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2108)
#define DRT_E_INVALID_SEARCH_INFO MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x2109)
#define DRT_E_FAULTED MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x210a)
#define DRT_E_TRANSPORT_STILL_BOUND MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x210b)
#define DRT_E_INSUFFICIENT_BUFFER MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x210c)
#define DRT_E_INVALID_INSTANCE_PREFIX MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x210d)
#define DRT_E_INVALID_SECURITY_MODE MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x210e)
#define DRT_E_CAPABILITY_MISMATCH MAKE_HRESULT(SEVERITY_ERROR, FACILITY_DRT, 0x210f)
#define DRT_PAYLOAD_REVOKED (1<<0)
#define DRT_MIN_ROUTING_ADDRESSES 1
#define DRT_MAX_ROUTING_ADDRESSES 20
#define DRT_MAX_PAYLOAD_SIZE 5120
#define DRT_MAX_INSTANCE_PREFIX_LEN 128
#define DRT_LINK_LOCAL_ISATAP_SCOPEID 0xffffffff
//////////////////////////////////////////////////////////////////////////////
// Enums
typedef enum drt_scope_tag
{
DRT_GLOBAL_SCOPE = 1,
DRT_SITE_LOCAL_SCOPE = 2,
DRT_LINK_LOCAL_SCOPE = 3,
} DRT_SCOPE;
typedef enum drt_status_tag
{
DRT_ACTIVE = 0,
DRT_ALONE = 1,
DRT_NO_NETWORK = 10,
DRT_FAULTED = 20,
} DRT_STATUS;
typedef enum drt_match_type_tag
{
DRT_MATCH_EXACT = 0,
DRT_MATCH_NEAR = 1,
DRT_MATCH_INTERMEDIATE = 2,
} DRT_MATCH_TYPE;
typedef enum drt_leafset_key_change_type_tag
{
DRT_LEAFSET_KEY_ADDED = 0,
DRT_LEAFSET_KEY_DELETED = 1,
} DRT_LEAFSET_KEY_CHANGE_TYPE;
typedef enum drt_event_type_tag
{
DRT_EVENT_STATUS_CHANGED = 0,
DRT_EVENT_LEAFSET_KEY_CHANGED = 1,
DRT_EVENT_REGISTRATION_STATE_CHANGED = 2,
} DRT_EVENT_TYPE;
typedef enum drt_security_mode_tag
{
DRT_SECURE_RESOLVE = 0,
DRT_SECURE_MEMBERSHIP = 1,
DRT_SECURE_CONFIDENTIALPAYLOAD = 2,
} DRT_SECURITY_MODE;
typedef enum _DRT_REGISTRATION_STATE
{
DRT_REGISTRATION_STATE_UNRESOLVEABLE = 1
} DRT_REGISTRATION_STATE, *PDRT_REGISTRATION_STATE;
typedef enum _DRT_ADDRESS_FLAGS
{
DRT_ADDRESS_FLAG_ACCEPTED = 0x01,
DRT_ADDRESS_FLAG_REJECTED = 0x02,
DRT_ADDRESS_FLAG_UNREACHABLE = 0x04,
DRT_ADDRESS_FLAG_LOOP = 0x08,
DRT_ADDRESS_FLAG_TOO_BUSY = 0x10,
DRT_ADDRESS_FLAG_BAD_VALIDATE_ID = 0x20,
DRT_ADDRESS_FLAG_SUSPECT_UNREGISTERED_ID = 0x40,
DRT_ADDRESS_FLAG_INQUIRE = 0x80
} DRT_ADDRESS_FLAGS, *PDRT_ADDRESS_FLAGS;
//////////////////////////////////////////////////////////////////////////////
// Structures
typedef struct drt_data_tag
{
ULONG cb;
BYTE* pb;
} DRT_DATA, *PDRT_DATA;
typedef const DRT_DATA *PCDRT_DATA;
typedef struct drt_registration_tag
{
DRT_DATA key;
DRT_DATA appData;
} DRT_REGISTRATION, *PDRT_REGISTRATION;
typedef const DRT_REGISTRATION *PCDRT_REGISTRATION;
typedef struct drt_security_provider_tag
{
PVOID pvContext;
HRESULT (*Attach)(
__in const PVOID pvContext);
VOID (*Detach)(
__in const PVOID pvContext);
HRESULT (*RegisterKey)(
__in const PVOID pvContext,
__in const DRT_REGISTRATION* pRegistration,
__in_opt PVOID pvKeyContext);
HRESULT (*UnregisterKey)(
__in const PVOID pvContext,
__in const DRT_DATA* pKey,
__in_opt PVOID pvKeyContext);
HRESULT (*ValidateAndUnpackPayload)(
__in const PVOID pvContext,
__in DRT_DATA* pSecuredAddressPayload,
__in_opt DRT_DATA* pCertChain,
__in_opt DRT_DATA* pClassifier,
__in_opt DRT_DATA* pNonce,
__in_opt DRT_DATA* pSecuredPayload,
__out BYTE* pbProtocolMajor,
__out BYTE* pbProtocolMinor,
__out DRT_DATA* pKey,
__out_opt DRT_DATA* pPayload,
__out CERT_PUBLIC_KEY_INFO** ppPublicKey,
__out_opt SOCKET_ADDRESS_LIST** ppAddressList,
__out DWORD* pdwFlags);
HRESULT (*SecureAndPackPayload)(
__in const PVOID pvContext,
__in_opt PVOID pvKeyContext,
BYTE bProtocolMajor,
BYTE bProtocolMinor,
DWORD dwFlags,
__in const DRT_DATA* pKey,
__in_opt const DRT_DATA* pPayload,
__in_opt const SOCKET_ADDRESS_LIST* pAddressList,
__in const DRT_DATA* pNonce,
__out DRT_DATA* pSecuredAddressPayload,
__out_opt DRT_DATA* pClassifier,
__out_opt DRT_DATA* pSecuredPayload,
__out_opt DRT_DATA* pCertChain);
void (*FreeData)(
__in const PVOID pvContext,
__in_opt PVOID pv);
HRESULT (*EncryptData)(
__in const PVOID pvContext,
__in const DRT_DATA* pRemoteCredential,
__in DWORD dwBuffers,
__in_ecount(dwBuffers) DRT_DATA* pDataBuffers,
__out_ecount(dwBuffers) DRT_DATA* pEncryptedBuffers,
__out DRT_DATA *pKeyToken
);
HRESULT (*DecryptData)(
__in const PVOID pvContext,
__in DRT_DATA* pKeyToken,
__in const PVOID pvKeyContext,
__in DWORD dwBuffers,
__inout_ecount(dwBuffers) DRT_DATA* pData
);
HRESULT (*GetSerializedCredential)(
__in const PVOID pvContext,
__out DRT_DATA *pSelfCredential);
HRESULT (*ValidateRemoteCredential)(
__in const PVOID pvContext,
__in DRT_DATA *pRemoteCredential);
HRESULT (*SignData)(
__in const PVOID pvContext,
__in DWORD dwBuffers,
__in_ecount(dwBuffers) DRT_DATA* pDataBuffers,
__out DRT_DATA *pKeyIdentifier,
__out DRT_DATA *pSignature);
HRESULT (*VerifyData)(
__in const PVOID pvContext,
__in DWORD dwBuffers,
__in_ecount(dwBuffers) DRT_DATA* pDataBuffers,
__in DRT_DATA *pRemoteCredentials,
__in DRT_DATA *pKeyIdentifier,
__in DRT_DATA *pSignature);
} DRT_SECURITY_PROVIDER, *PDRT_SECURITY_PROVIDER;
typedef const DRT_SECURITY_PROVIDER *PCDRT_SECURITY_PROVIDER;
typedef PVOID DRT_BOOTSTRAP_RESOLVE_CONTEXT;
typedef void (CALLBACK* DRT_BOOTSTRAP_RESOLVE_CALLBACK)(HRESULT hr, PVOID pvContext, SOCKET_ADDRESS_LIST* pAddresses, BOOL fFatalError);
typedef struct drt_bootstrap_provider_tag
{
PVOID pvContext;
HRESULT (*Attach)(
__in const PVOID pvContext);
VOID (*Detach)(
__in const PVOID pvContext);
HRESULT (*InitResolve)(
__in const PVOID pvContext,
__in BOOL fSplitDetect,
__in ULONG timeout,
__in ULONG cMaxResults,
__out DRT_BOOTSTRAP_RESOLVE_CONTEXT* ResolveContext,
__out BOOL* fFatalError
);
HRESULT (*IssueResolve)(
__in const PVOID pvContext,
__in const PVOID pvCallbackContext,
__in DRT_BOOTSTRAP_RESOLVE_CALLBACK callback,
__in DRT_BOOTSTRAP_RESOLVE_CONTEXT ResolveContext,
__out BOOL* fFatalError
);
VOID (*EndResolve)(
__in const PVOID pvContext,
__in DRT_BOOTSTRAP_RESOLVE_CONTEXT ResolveContext
);
HRESULT (*Register)(
__in const PVOID pvContext,
__in const SOCKET_ADDRESS_LIST* pAddressList);
VOID (*Unregister)(
__in const PVOID pvContext
);
} DRT_BOOTSTRAP_PROVIDER, *PDRT_BOOTSTRAP_PROVIDER;
typedef const DRT_BOOTSTRAP_PROVIDER *PCDRT_BOOTSTRAP_PROVIDER;
typedef struct drt_settings_tag
{
DWORD dwSize;
ULONG cbKey;
BYTE bProtocolMajorVersion;
BYTE bProtocolMinorVersion;
ULONG ulMaxRoutingAddresses;
PWSTR pwzDrtInstancePrefix;
HDRT_TRANSPORT hTransport;
DRT_SECURITY_PROVIDER* pSecurityProvider;
DRT_BOOTSTRAP_PROVIDER* pBootstrapProvider;
DRT_SECURITY_MODE eSecurityMode;
} DRT_SETTINGS, *PDRT_SETTINGS;
typedef const DRT_SETTINGS *PCDRT_SETTINGS;
typedef struct drt_search_info_tag
{
DWORD dwSize;
BOOL fIterative;
BOOL fAllowCurrentInstanceMatch;
BOOL fAnyMatchInRange;
ULONG cMaxEndpoints;
DRT_DATA* pMaximumKey;
DRT_DATA* pMinimumKey;
} DRT_SEARCH_INFO, *PDRT_SEARCH_INFO;
typedef const DRT_SEARCH_INFO *PCDRT_SEARCH_INFO;
typedef struct _DRT_ADDRESS
{
SOCKADDR_STORAGE socketAddress;
ULONG flags;
LONG nearness;
ULONG latency;
} DRT_ADDRESS, *PDRT_ADDRESS;
typedef struct _DRT_ADDRESS_LIST {
ULONG AddressCount;
__field_ecount(AddressCount) DRT_ADDRESS AddressList[1];
} DRT_ADDRESS_LIST, *PDRT_ADDRESS_LIST;
typedef const DRT_ADDRESS_LIST *PCDRT_ADDRESS_LIST;
typedef struct drt_search_result_tag
{
DWORD dwSize;
DRT_MATCH_TYPE type;
PVOID pvContext;
DRT_REGISTRATION registration;
} DRT_SEARCH_RESULT, *PDRT_SEARCH_RESULT;
typedef const DRT_SEARCH_RESULT *PCDRT_SEARCH_RESULT;
typedef struct drt_event_data_tag
{
DRT_EVENT_TYPE type;
HRESULT hr;
PVOID pvContext;
union
{
struct
{
DRT_LEAFSET_KEY_CHANGE_TYPE change;
DRT_DATA localKey;
DRT_DATA remoteKey;
} leafsetKeyChange;
struct
{
DRT_REGISTRATION_STATE state;
DRT_DATA localKey;
} registrationStateChange;
struct
{
DRT_STATUS status;
struct
{
ULONG cntAddress;
PSOCKADDR_STORAGE pAddresses;
} bootstrapAddresses;
} statusChange;
};
} DRT_EVENT_DATA, *PDRT_EVENT_DATA;
typedef const DRT_EVENT_DATA *PCDRT_EVENT_DATA;
//////////////////////////////////////////////////////////////////////////////
// DRT Default Module Management APIs
HRESULT WINAPI DrtCreatePnrpBootstrapResolver(
__in BOOL fPublish,
__in PCWSTR pwzPeerName,
__in_opt PCWSTR pwzCloudName,
__in_opt PCWSTR pwzPublishingIdentity,
__out DRT_BOOTSTRAP_PROVIDER** ppResolver);
void WINAPI DrtDeletePnrpBootstrapResolver(
__in DRT_BOOTSTRAP_PROVIDER* pResolver);
HRESULT WINAPI DrtCreateDnsBootstrapResolver(
__in USHORT port,
__in PCWSTR pwszAddress,
__out DRT_BOOTSTRAP_PROVIDER** ppModule
);
void WINAPI DrtDeleteDnsBootstrapResolver(
__in DRT_BOOTSTRAP_PROVIDER* pResolver
);
HRESULT WINAPI DrtCreateIpv6UdpTransport(
DRT_SCOPE scope,
ULONG dwScopeId,
ULONG dwLocalityThreshold,
__inout USHORT *pwPort,
__out HDRT_TRANSPORT *phTransport);
HRESULT WINAPI DrtDeleteIpv6UdpTransport(
__in HDRT_TRANSPORT hTransport);
HRESULT WINAPI DrtCreateDerivedKeySecurityProvider(
__in PCCERT_CONTEXT pRootCert,
__in_opt PCCERT_CONTEXT pLocalCert,
__out DRT_SECURITY_PROVIDER** ppSecurityProvider);
HRESULT WINAPI DrtCreateDerivedKey(
__in PCCERT_CONTEXT pLocalCert,
__out DRT_DATA* pKey);
void WINAPI DrtDeleteDerivedKeySecurityProvider(
__in DRT_SECURITY_PROVIDER* pSecurityProvider);
HRESULT WINAPI DrtCreateNullSecurityProvider(
__out DRT_SECURITY_PROVIDER** ppSecurityProvider);
void WINAPI DrtDeleteNullSecurityProvider(
__in DRT_SECURITY_PROVIDER* pSecurityProvider);
//////////////////////////////////////////////////////////////////////////////
// DRT Lifetime Management APIs
HRESULT WINAPI DrtOpen(
__in const DRT_SETTINGS* pSettings,
__in_opt HANDLE hEvent,
__in_opt const PVOID pvContext,
__out HDRT *phDrt);
VOID WINAPI DrtClose(
__in HDRT hDrt);
HRESULT WINAPI DrtGetEventDataSize(
__in HDRT hDrt,
__out ULONG *pulEventDataLen);
HRESULT WINAPI DrtGetEventData(
__in HDRT hDrt,
__in ULONG ulEventDataLen,
__out_bcount_full(ulEventDataLen) DRT_EVENT_DATA *pEventData);
//////////////////////////////////////////////////////////////////////////////
// DRT Key Registration APIs
HRESULT WINAPI DrtRegisterKey(
__in HDRT hDrt,
__in DRT_REGISTRATION *pRegistration,
__in_opt PVOID pvKeyContext,
__out HDRT_REGISTRATION_CONTEXT *phKeyRegistration);
HRESULT WINAPI DrtUpdateKey(
__in HDRT_REGISTRATION_CONTEXT hKeyRegistration,
__in DRT_DATA *pAppData
);
VOID WINAPI DrtUnregisterKey(
__in HDRT_REGISTRATION_CONTEXT hKeyRegistration);
//////////////////////////////////////////////////////////////////////////////
// DRT Search APIs
HRESULT WINAPI DrtStartSearch(
__in HDRT hDrt,
__in DRT_DATA *pKey,
__in_opt const DRT_SEARCH_INFO *pInfo,
ULONG timeout,
__in HANDLE hEvent,
__in_opt const PVOID pvContext,
__out HDRT_SEARCH_CONTEXT* hSearchContext);
HRESULT WINAPI DrtContinueSearch(
__in HDRT_SEARCH_CONTEXT hSearchContext);
HRESULT WINAPI DrtGetSearchResultSize(
__in HDRT_SEARCH_CONTEXT hSearchContext,
__out ULONG *pulSearchResultSize);
HRESULT WINAPI DrtGetSearchResult(
__in HDRT_SEARCH_CONTEXT hSearchContext,
__inout ULONG ulSearchResultSize,
__out_bcount_full(ulSearchResultSize) DRT_SEARCH_RESULT *pSearchResult);
HRESULT WINAPI DrtGetSearchPathSize(
__in HDRT_SEARCH_CONTEXT hSearchContext,
__out ULONG *pulSearchPathSize);
HRESULT WINAPI DrtGetSearchPath(
__in HDRT_SEARCH_CONTEXT hSearchContext,
__inout ULONG ulSearchPathSize,
__out_bcount_full(ulSearchPathSize) DRT_ADDRESS_LIST *pSearchPath);
HRESULT WINAPI DrtEndSearch(
__in HDRT_SEARCH_CONTEXT hSearchContext);
//////////////////////////////////////////////////////////////////////////////
// DRT Instance name related APIs
HRESULT WINAPI DrtGetInstanceName(
__in HDRT hDrt,
__in ULONG ulcbInstanceNameSize,
__out_bcount_full(ulcbInstanceNameSize) PWSTR pwzDrtInstanceName);
HRESULT WINAPI DrtGetInstanceNameSize(
__in HDRT hDrt,
__out ULONG* pulcbInstanceNameSize);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif // _DRT_H_