//+--------------------------------------------------------------------------- // // 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 #include #include // for sockaddrin_6 #include #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_