6 Appendix A: Full IDL
This section is not applicable for HTTP and UDP transports.
For ease of implementation, the full IDL is provided below, where "ms-dtyp.idl" is the IDL as specified in [MS-DTYP] Appendix A.
-
import "ms-dtyp.idl"; [ uuid(44e265dd-7daf-42cd-8560-3cdb6e7a2729), version(1.3), pointer_default(unique) ] interface TsProxyRpcInterface { typedef [context_handle] void* PTUNNEL_CONTEXT_HANDLE_NOSERIALIZE; typedef [context_handle] void* PCHANNEL_CONTEXT_HANDLE_NOSERIALIZE; typedef [context_handle] PTUNNEL_CONTEXT_HANDLE_NOSERIALIZE PTUNNEL_CONTEXT_HANDLE_SERIALIZE; typedef [context_handle] PCHANNEL_CONTEXT_HANDLE_NOSERIALIZE PCHANNEL_CONTEXT_HANDLE_SERIALIZE; typedef [string] wchar_t* RESOURCENAME; #define MAX_RESOURCE_NAMES 50 typedef struct _tsendpointinfo { [size_is(numResourceNames)] RESOURCENAME* resourceName; [range(0, MAX_RESOURCE_NAMES)] unsigned long numResourceNames; [unique, size_is(numAlternateResourceNames)] RESOURCENAME* alternateResourceNames; [range(0, 3)] unsigned short numAlternateResourceNames; unsigned long Port; } TSENDPOINTINFO, *PTSENDPOINTINFO; #define TSG_PACKET_TYPE_HEADER 0x00004844 #define TSG_PACKET_TYPE_VERSIONCAPS 0x00005643 #define TSG_PACKET_TYPE_QUARCONFIGREQUEST 0x00005143 #define TSG_PACKET_TYPE_QUARREQUEST 0x00005152 #define TSG_PACKET_TYPE_RESPONSE 0x00005052 #define TSG_PACKET_TYPE_QUARENC_RESPONSE 0x00004552 #define TSG_CAPABILITY_TYPE_NAP 0x00000001 #define TSG_PACKET_TYPE_CAPS_RESPONSE 0x00004350 #define TSG_PACKET_TYPE_MSGREQUEST_PACKET 0x00004752 #define TSG_PACKET_TYPE_MESSAGE_PACKET 0x00004750 #define TSG_PACKET_TYPE_AUTH 0x00004054 #define TSG_PACKET_TYPE_REAUTH 0x00005250 #define TSG_ASYNC_MESSAGE_CONSENT_MESSAGE 0x00000001 #define TSG_ASYNC_MESSAGE_SERVICE_MESSAGE 0x00000002 #define TSG_ASYNC_MESSAGE_REAUTH 0x00000003 #define TSG_TUNNEL_CALL_ASYNC_MSG_REQUEST 0x00000001 #define TSG_TUNNEL_CANCEL_ASYNC_MSG_REQUEST 0x00000002 #define TSG_NAP_CAPABILITY_QUAR_SOH 0x00000001 #define TSG_NAP_CAPABILITY_IDLE_TIMEOUT 0x00000002 #define TSG_MESSAGING_CAP_CONSENT_SIGN 0x00000004 #define TSG_MESSAGING_CAP_SERVICE_MSG 0x00000008 #define TSG_MESSAGING_CAP_REAUTH 0x00000010 typedef struct _TSG_PACKET_HEADER { unsigned short ComponentId; unsigned short PacketId; } TSG_PACKET_HEADER, *PTSG_PACKET_HEADER; typedef struct _TSG_CAPABILITY_NAP{ unsigned long capabilities; } TSG_CAPABILITY_NAP, *PTSG_CAPABILITY_NAP; typedef [switch_type(unsigned long)] union { [case (TSG_CAPABILITY_TYPE_NAP)] TSG_CAPABILITY_NAP TSGCapNap; } TSG_CAPABILITIES_UNION, *PTSG_CAPABILITIES_UNION; typedef struct _TSG_PACKET_CAPABILITIES { unsigned long capabilityType; [switch_is(capabilityType)] TSG_CAPABILITIES_UNION TSGPacket; } TSG_PACKET_CAPABILITIES, *PTSG_PACKET_CAPABILITIES; typedef struct _TSG_PACKET_VERSIONCAPS { TSG_PACKET_HEADER tsgHeader; [size_is(numCapabilities)] PTSG_PACKET_CAPABILITIES TSGCaps; [range(0, 32)] unsigned long numCapabilities; unsigned short majorVersion; unsigned short minorVersion; unsigned short quarantineCapabilities; } TSG_PACKET_VERSIONCAPS, *PTSG_PACKET_VERSIONCAPS; typedef struct _TSG_PACKET_QUARCONFIGREQUEST { unsigned long flags; } TSG_PACKET_QUARCONFIGREQUEST, *PTSG_PACKET_QUARCONFIGREQUEST; typedef struct _TSG_PACKET_QUARREQUEST { unsigned long flags; [string, size_is(nameLength)] wchar_t* machineName; [range(0, 512 + 1)] unsigned long nameLength; [unique, size_is(dataLen)] byte* data; [range(0, 8000)] unsigned long dataLen; } TSG_PACKET_QUARREQUEST, *PTSG_PACKET_QUARREQUEST; typedef struct _TSG_REDIRECTION_FLAGS { BOOL enableAllRedirections; BOOL disableAllRedirections; BOOL driveRedirectionDisabled; BOOL printerRedirectionDisabled; BOOL portRedirectionDisabled; BOOL reserved; BOOL clipboardRedirectionDisabled; BOOL pnpRedirectionDisabled; } TSG_REDIRECTION_FLAGS, *PTSG_REDIRECTION_FLAGS; typedef struct _TSG_PACKET_RESPONSE { unsigned long flags; unsigned long reserved; [size_is(responseDataLen)] byte* responseData; [range(0, 24000)] unsigned long responseDataLen; TSG_REDIRECTION_FLAGS redirectionFlags; } TSG_PACKET_RESPONSE, *PTSG_PACKET_RESPONSE; typedef struct _TSG_PACKET_QUARENC_RESPONSE { unsigned long flags; [range(0, 24000)] unsigned long certChainLen; [string, size_is(certChainLen)] wchar_t* certChainData; GUID nonce; PTSG_PACKET_VERSIONCAPS versionCaps; } TSG_PACKET_QUARENC_RESPONSE, *PTSG_PACKET_QUARENC_RESPONSE; typedef struct _TSG_PACKET_MSG_REQUEST { unsigned long maxMessagesPerBatch; } TSG_PACKET_MSG_REQUEST, *PTSG_PACKET_MSG_REQUEST; typedef struct _TSG_PACKET_STRING_MESSAGE { long isDisplayMandatory; long isConsentMandatory; [range(0,65536)] unsigned long msgBytes; [size_is(msgBytes)] wchar_t* msgBuffer; } TSG_PACKET_STRING_MESSAGE, *PTSG_PACKET_STRING_MESSAGE; typedef struct _TSG_PACKET_REAUTH_MESSAGE { unsigned __int64 tunnelContext; } TSG_PACKET_REAUTH_MESSAGE, *PTSG_PACKET_REAUTH_MESSAGE; typedef [switch_type(unsigned long)] union { [case(TSG_ASYNC_MESSAGE_CONSENT_MESSAGE)] PTSG_PACKET_STRING_MESSAGE consentMessage; [case(TSG_ASYNC_MESSAGE_SERVICE_MESSAGE)] PTSG_PACKET_STRING_MESSAGE serviceMessage; [case(TSG_ASYNC_MESSAGE_REAUTH)] PTSG_PACKET_REAUTH_MESSAGE reauthMessage; } TSG_PACKET_TYPE_MESSAGE_UNION, *PTSG_PACKET_TYPE_MESSAGE_UNION ; typedef struct _TSG_PACKET_MSG_RESPONSE { unsigned long msgID; unsigned long msgType; long isMsgPresent; [switch_is(msgType)] TSG_PACKET_TYPE_MESSAGE_UNION messagePacket; } TSG_PACKET_MSG_RESPONSE, *PTSG_PACKET_MSG_RESPONSE; typedef struct _TSG_PACKET_CAPS_RESPONSE { TSG_PACKET_QUARENC_RESPONSE pktQuarEncResponse; TSG_PACKET_MSG_RESPONSE pktConsentMessage; } TSG_PACKET_CAPS_RESPONSE, *PTSG_PACKET_CAPS_RESPONSE; typedef struct _TSG_PACKET_AUTH { TSG_PACKET_VERSIONCAPS TSGVersionCaps; [range(0, 65536)] unsigned long cookieLen; [size_is(cookieLen)] byte* cookie; } TSG_PACKET_AUTH, *PTSG_PACKET_AUTH; typedef [switch_type(unsigned long)] union { [case(TSG_PACKET_TYPE_VERSIONCAPS)] PTSG_PACKET_VERSIONCAPS packetVersionCaps; [case(TSG_PACKET_TYPE_AUTH)] PTSG_PACKET_AUTH packetAuth; } TSG_INITIAL_PACKET_TYPE_UNION, *PTSG_INITIAL_PACKET_TYPE_UNION; typedef struct _TSG_PACKET_REAUTH { unsigned __int64 tunnelContext; unsigned long packetId; [switch_is(packetId)] TSG_INITIAL_PACKET_TYPE_UNION TSGInitialPacket; } TSG_PACKET_REAUTH, *PTSG_PACKET_REAUTH; typedef [switch_type(unsigned long)] union { [case (TSG_PACKET_TYPE_HEADER)] PTSG_PACKET_HEADER packetHeader; [case (TSG_PACKET_TYPE_VERSIONCAPS)] PTSG_PACKET_VERSIONCAPS packetVersionCaps; [case (TSG_PACKET_TYPE_QUARCONFIGREQUEST)] PTSG_PACKET_QUARCONFIGREQUEST packetQuarConfigRequest; [case (TSG_PACKET_TYPE_QUARREQUEST)] PTSG_PACKET_QUARREQUEST packetQuarRequest; [case (TSG_PACKET_TYPE_RESPONSE)] PTSG_PACKET_RESPONSE packetResponse; [case (TSG_PACKET_TYPE_QUARENC_RESPONSE)] PTSG_PACKET_QUARENC_RESPONSE packetQuarEncResponse; [case (TSG_PACKET_TYPE_CAPS_RESPONSE)] PTSG_PACKET_CAPS_RESPONSE packetCapsResponse; [case (TSG_PACKET_TYPE_MSGREQUEST_PACKET)] PTSG_PACKET_MSG_REQUEST packetMsgRequest; [case (TSG_PACKET_TYPE_MESSAGE_PACKET)] PTSG_PACKET_MSG_RESPONSE packetMsgResponse; [case (TSG_PACKET_TYPE_AUTH)] PTSG_PACKET_AUTH packetAuth; [case (TSG_PACKET_TYPE_REAUTH)] PTSG_PACKET_REAUTH packetReauth; } TSG_PACKET_TYPE_UNION, *PTSG_PACKET_TYPE_UNION; typedef struct _TSG_PACKET { unsigned long packetId; [switch_is(packetId)] TSG_PACKET_TYPE_UNION TSGPacket; } TSG_PACKET, *PTSG_PACKET; void Opnum0NotUsedOnWire(void); HRESULT TsProxyCreateTunnel( [in, ref] PTSG_PACKET TSGPacket, [out, ref] PTSG_PACKET* TSGPacketResponse, [out] PTUNNEL_CONTEXT_HANDLE_SERIALIZE* tunnelContext, [out] unsigned long* tunnelId ); HRESULT TsProxyAuthorizeTunnel( [in] PTUNNEL_CONTEXT_HANDLE_NOSERIALIZE tunnelContext, [in, ref] PTSG_PACKET TSGPacket, [out, ref] PTSG_PACKET* TSGPacketResponse ); HRESULT TsProxyMakeTunnelCall( [in] PTUNNEL_CONTEXT_HANDLE_NOSERIALIZE tunnelContext, [in] unsigned long procId, [in, ref] PTSG_PACKET TSGPacket, [out, ref] PTSG_PACKET* TSGPacketResponse ); HRESULT TsProxyCreateChannel( [in] PTUNNEL_CONTEXT_HANDLE_NOSERIALIZE tunnelContext, [in, ref] PTSENDPOINTINFO tsEndPointInfo , [out] PCHANNEL_CONTEXT_HANDLE_SERIALIZE* channelContext, [out] unsigned long* channelId ); void Opnum5NotUsedOnWire(void); HRESULT TsProxyCloseChannel( [in, out] PCHANNEL_CONTEXT_HANDLE_NOSERIALIZE* context ); HRESULT TsProxyCloseTunnel( [in, out] PTUNNEL_CONTEXT_HANDLE_SERIALIZE* context ); //see section 2.2.3.3 for decoding instructions DWORD TsProxySetupReceivePipe( [in, max_is(32767)] byte pRpcMessage[] ); //see section 2.2.3.4 for decoding instructions DWORD TsProxySendToServer( [in, max_is(32767)] byte pRpcMessage[] ); };