25#include <winpr/stream.h>
26#include <winpr/sspi.h>
28#include <freerdp/api.h>
29#include <freerdp/types.h>
30#include <freerdp/error.h>
31#include <freerdp/event.h>
33#include <freerdp/settings.h>
35#include <freerdp/gdi/gdi.h>
36#include <freerdp/codecs.h>
37#include <freerdp/metrics.h>
38#include <freerdp/extension.h>
39#include <freerdp/heartbeat.h>
40#include <freerdp/message.h>
41#include <freerdp/autodetect.h>
42#include <freerdp/streamdump.h>
50 typedef struct rdp_rail rdpRail;
55 typedef RDP_CLIENT_ENTRY_POINTS_V1 RDP_CLIENT_ENTRY_POINTS;
57#include <freerdp/utils/smartcardlogon.h>
58#include <freerdp/update.h>
59#include <freerdp/input.h>
60#include <freerdp/graphics.h>
67#define MCS_BASE_CHANNEL_ID 1001
68#define MCS_GLOBAL_CHANNEL_ID 1003
71 typedef enum WINPR_C23_ENUM_TYPE(uint32_t)
73 VERIFY_CERT_FLAG_NONE = 0x00,
74 VERIFY_CERT_FLAG_LEGACY = 0x02,
75 VERIFY_CERT_FLAG_REDIRECT = 0x10,
76 VERIFY_CERT_FLAG_GATEWAY = 0x20,
77 VERIFY_CERT_FLAG_CHANGED = 0x40,
78 VERIFY_CERT_FLAG_MISMATCH = 0x80,
79 VERIFY_CERT_FLAG_MATCH_LEGACY_SHA1 = 0x100,
80 VERIFY_CERT_FLAG_FP_IS_PEM = 0x200,
81 VERIFY_CERT_FLAG_HTTP = 0x1000
82 } RDP_VERIFY_CERT_FLAG;
85#define GATEWAY_MESSAGE_CONSENT 1
86#define GATEWAY_MESSAGE_SERVICE 2
101 typedef BOOL (*pContextNew)(freerdp* instance, rdpContext* context);
102 typedef void (*pContextFree)(freerdp* instance, rdpContext* context);
104 typedef BOOL (*pConnectCallback)(freerdp* instance);
105 typedef void (*pPostDisconnect)(freerdp* instance);
107#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
121 typedef BOOL (*pAuthenticate)(freerdp* instance,
char** username,
char** password,
146 typedef BOOL (*pAuthenticateEx)(freerdp* instance,
char** username,
char** password,
147 char** domain, rdp_auth_reason reason);
167 typedef BOOL (*pChooseSmartcard)(freerdp* instance,
SmartcardCertInfo** cert_list, DWORD count,
168 DWORD* choice, BOOL gateway);
172 ACCESS_TOKEN_TYPE_AAD,
173 ACCESS_TOKEN_TYPE_AVD
186 typedef BOOL (*pGetAccessToken)(freerdp* instance, AccessTokenType tokenType,
char** token,
202 typedef BOOL (*pGetCommonAccessToken)(rdpContext* context, AccessTokenType tokenType,
203 char** token,
size_t count, ...);
216 typedef SSIZE_T (*pRetryDialog)(freerdp* instance,
const char* what,
size_t current,
234#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
235 WINPR_DEPRECATED_VAR(
"Use pVerifyCertificateEx",
236 typedef DWORD (*pVerifyCertificate)(
237 freerdp* instance,
const char* common_name,
const char* subject,
238 const char* issuer,
const char* fingerprint, BOOL host_mismatch));
256 typedef DWORD (*pVerifyCertificateEx)(freerdp* instance,
const char* host, UINT16 port,
257 const char* common_name,
const char* subject,
258 const char* issuer,
const char* fingerprint, DWORD flags);
275#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
276 WINPR_DEPRECATED_VAR(
"Use pVerifyChangedCertificateEx",
277 typedef DWORD (*pVerifyChangedCertificate)(
278 freerdp* instance,
const char* common_name,
const char* subject,
279 const char* issuer,
const char* new_fingerprint,
280 const char* old_subject,
const char* old_issuer,
281 const char* old_fingerprint));
304 typedef DWORD (*pVerifyChangedCertificateEx)(freerdp* instance,
const char* host, UINT16 port,
305 const char* common_name,
const char* subject,
306 const char* issuer,
const char* new_fingerprint,
307 const char* old_subject,
const char* old_issuer,
308 const char* old_fingerprint, DWORD flags);
323 typedef int (*pVerifyX509Certificate)(freerdp* instance,
const BYTE* data,
size_t length,
324 const char* hostname, UINT16 port, DWORD flags);
326 typedef int (*pLogonErrorInfo)(freerdp* instance, UINT32 data, UINT32 type);
328 typedef BOOL (*pSendChannelData)(freerdp* instance, UINT16 channelId,
const BYTE* data,
330 typedef BOOL (*pSendChannelPacket)(freerdp* instance, UINT16 channelId,
size_t totalSize,
331 UINT32 flags,
const BYTE* data,
size_t chunkSize);
332 typedef BOOL (*pReceiveChannelData)(freerdp* instance, UINT16 channelId,
const BYTE* data,
333 size_t size, UINT32 flags,
size_t totalSize);
336 typedef BOOL (*pPresentGatewayMessage)(freerdp* instance, UINT32 type, BOOL isDisplayMandatory,
337 BOOL isConsentMandatory,
size_t length,
338 const WCHAR* message);
357 ALIGN64 UINT32 LastError;
359 UINT64 paddingA[16 - 4];
372 ALIGN64 wPubSub* pubSub;
374 ALIGN64 HANDLE channelErrorEvent;
375 ALIGN64 UINT channelErrorNum;
376 ALIGN64
char* errorDescription;
378 UINT64 paddingB[32 - 22];
390 ALIGN64 rdpRail* rail;
391 ALIGN64 rdpCache* cache;
392 ALIGN64 rdpChannels* channels;
393 ALIGN64 rdpGraphics* graphics;
394 ALIGN64 rdpInput* input;
395 ALIGN64 rdpUpdate* update;
396 ALIGN64 rdpSettings* settings;
397 ALIGN64 rdpMetrics* metrics;
398 ALIGN64 rdpCodecs* codecs;
399 ALIGN64 rdpAutoDetect* autodetect;
400 UINT64 paddingC1[45 - 44];
401 ALIGN64
int disconnectUltimatum;
415 UINT64 paddingC[64 - 49];
417 ALIGN64 rdpStreamDumpContext* dump;
420 UINT64 paddingD[96 - 66];
421 UINT64 paddingE[128 - 96];
431 enum Disconnect_Ultimatum
433 Disconnect_Ultimatum_domain_disconnected = 0,
434 Disconnect_Ultimatum_provider_initiated = 1,
435 Disconnect_Ultimatum_token_purged = 2,
436 Disconnect_Ultimatum_user_requested = 3,
437 Disconnect_Ultimatum_channel_purged = 4
440#include <freerdp/client.h>
462 ALIGN64 RDP_CLIENT_ENTRY_POINTS* pClientEntryPoints;
464 UINT64 paddingA[16 - 2];
466#if defined(WITH_FREERDP_DEPRECATED)
471 ALIGN64 rdpUpdate* update;)
475 ALIGN64 rdpSettings* settings;)
482 ALIGN64 rdpAutoDetect* autodetect;)
489 ALIGN64 rdpHeartbeat* heartbeat;
491 UINT64 paddingB[32 - 21];
504 WINPR_ATTR_NODISCARD ALIGN64 pContextNew
515 UINT64 paddingC[47 - 35];
517 ALIGN64 UINT ConnectionCallbackState;
519 WINPR_ATTR_NODISCARD ALIGN64 pConnectCallback
525 WINPR_ATTR_NODISCARD ALIGN64 pConnectCallback
531#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
533 WINPR_ATTR_NODISCARD ALIGN64 pAuthenticate
540 WINPR_ATTR_NODISCARD ALIGN64 pVerifyCertificate
543 WINPR_ATTR_NODISCARD ALIGN64 pVerifyChangedCertificate
544 VerifyChangedCertificate);
546 ALIGN64 UINT64 reserved50[3];
548 WINPR_ATTR_NODISCARD ALIGN64 pVerifyX509Certificate
552 WINPR_ATTR_NODISCARD ALIGN64 pLogonErrorInfo
556 ALIGN64 pPostDisconnect
564#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
566 WINPR_ATTR_NODISCARD ALIGN64 pAuthenticate
567 GatewayAuthenticate);
572 ALIGN64 UINT64 reserved56[1];
578 WINPR_ATTR_NODISCARD ALIGN64 pConnectCallback
Redirect;
584 WINPR_ATTR_NODISCARD ALIGN64 pConnectCallback
589 ALIGN64 pPostDisconnect
598 WINPR_ATTR_NODISCARD ALIGN64 pSendChannelData
603 WINPR_ATTR_NODISCARD ALIGN64 pReceiveChannelData
610 WINPR_ATTR_NODISCARD ALIGN64 pVerifyCertificateEx
614 WINPR_ATTR_NODISCARD ALIGN64 pVerifyChangedCertificateEx
618 WINPR_ATTR_NODISCARD ALIGN64 pSendChannelPacket
628 WINPR_ATTR_NODISCARD ALIGN64 pChooseSmartcard
633 WINPR_ATTR_NODISCARD ALIGN64 pGetAccessToken GetAccessToken;
636 WINPR_ATTR_NODISCARD ALIGN64 pRetryDialog
639 UINT64 paddingE[80 - 73];
644 wListDictionary* init;
645 wListDictionary* open;
649 FREERDP_API
void freerdp_context_free(freerdp* instance);
652 FREERDP_API BOOL freerdp_context_new(freerdp* instance);
655 FREERDP_API BOOL freerdp_context_new_ex(freerdp* instance, rdpSettings* settings);
658 FREERDP_API BOOL freerdp_context_reset(freerdp* instance);
661 FREERDP_API BOOL freerdp_connect(freerdp* instance);
663#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
664 WINPR_DEPRECATED_VAR(
"use freerdp_abort_connect_context instead",
665 FREERDP_API BOOL freerdp_abort_connect(freerdp* instance));
668 FREERDP_API BOOL freerdp_abort_connect_context(rdpContext* context);
671 FREERDP_API HANDLE freerdp_abort_event(rdpContext* context);
673#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
674 WINPR_DEPRECATED_VAR(
"use freerdp_shall_disconnect_context instead",
675 WINPR_ATTR_NODISCARD FREERDP_API BOOL
676 freerdp_shall_disconnect(
const freerdp* instance));
680 FREERDP_API BOOL freerdp_shall_disconnect_context(
const rdpContext* context);
682 FREERDP_API BOOL freerdp_disconnect(freerdp* instance);
693 FREERDP_API
const char* freerdp_disconnect_reason_string(
int reason);
695#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
696 WINPR_DEPRECATED_VAR(
"use freerdp_disconnect_before_reconnect_context instead",
697 WINPR_ATTR_NODISCARD FREERDP_API BOOL
698 freerdp_disconnect_before_reconnect(freerdp* instance));
702 FREERDP_API BOOL freerdp_disconnect_before_reconnect_context(rdpContext* context);
705 FREERDP_API BOOL freerdp_reconnect(freerdp* instance);
708 FREERDP_API UINT freerdp_channels_attach(freerdp* instance);
711 FREERDP_API UINT freerdp_channels_detach(freerdp* instance);
713#if defined(WITH_FREERDP_DEPRECATED)
714 WINPR_DEPRECATED_VAR(
"Use freerdp_get_event_handles",
715 WINPR_ATTR_NODISCARD FREERDP_API BOOL
716 freerdp_get_fds(freerdp* instance,
void** rfds,
int* rcount,
717 void** wfds,
int* wcount));
721 FREERDP_API BOOL freerdp_check_fds(freerdp* instance);
724 FREERDP_API DWORD freerdp_get_event_handles(rdpContext* context, HANDLE* events, DWORD count);
727 FREERDP_API BOOL freerdp_check_event_handles(rdpContext* context);
730 FREERDP_API wMessageQueue* freerdp_get_message_queue(freerdp* instance, DWORD
id);
733 FREERDP_API HANDLE freerdp_get_message_queue_event_handle(freerdp* instance, DWORD
id);
736 FREERDP_API
int freerdp_message_queue_process_message(freerdp* instance, DWORD
id,
740 FREERDP_API
int freerdp_message_queue_process_pending_messages(freerdp* instance, DWORD
id);
743 FREERDP_API UINT32 freerdp_error_info(
const freerdp* instance);
745 FREERDP_API
void freerdp_set_error_info(rdpRdp* rdp, UINT32 error);
748 FREERDP_API BOOL freerdp_send_error_info(rdpRdp* rdp);
751 FREERDP_API BOOL freerdp_get_stats(
const rdpRdp* rdp, UINT64* inBytes, UINT64* outBytes,
752 UINT64* inPackets, UINT64* outPackets);
754 FREERDP_API
void freerdp_get_version(
int* major,
int* minor,
int* revision);
757 FREERDP_API
const char* freerdp_get_version_string(
void);
760 FREERDP_API
const char* freerdp_get_build_revision(
void);
763 FREERDP_API
const char* freerdp_get_build_config(
void);
774 FREERDP_API BOOL freerdp_enable_translation(
const char* locale,
const char* searchPath);
776 FREERDP_API
void freerdp_free(freerdp* instance);
778 WINPR_ATTR_MALLOC(freerdp_free, 1)
780 FREERDP_API freerdp* freerdp_new(
void);
783 FREERDP_API BOOL freerdp_focus_required(freerdp* instance);
784 FREERDP_API
void freerdp_set_focus(freerdp* instance);
787 FREERDP_API
int freerdp_get_disconnect_ultimatum(const rdpContext* context);
806 freerdp_get_plugin_service_provider(const rdpContext* context);
809 FREERDP_API UINT32 freerdp_get_last_error(const rdpContext* context);
812 FREERDP_API const
char* freerdp_get_last_error_name(UINT32 code);
815 FREERDP_API const
char* freerdp_get_last_error_string(UINT32 code);
818 FREERDP_API const
char* freerdp_get_last_error_category(UINT32 code);
820#define freerdp_set_last_error(context, lastError) \
821 freerdp_set_last_error_ex((context), (lastError), __func__, __FILE__, __LINE__)
823#define freerdp_set_last_error_if_not(context, lastError) \
826 if (freerdp_get_last_error(context) == FREERDP_ERROR_SUCCESS) \
827 freerdp_set_last_error_log(context, lastError); \
830#define freerdp_set_last_error_log(context, lastError) \
831 freerdp_set_last_error_ex((context), (lastError), __func__, __FILE__, __LINE__)
832 FREERDP_API
void freerdp_set_last_error_ex(rdpContext* context, UINT32 lastError,
833 const char* fkt,
const char* file,
int line);
836 FREERDP_API
const char* freerdp_get_logon_error_info_type(UINT32 type);
839 FREERDP_API
const char* freerdp_get_logon_error_info_type_ex(UINT32 type,
char* buffer,
843 FREERDP_API
const char* freerdp_get_logon_error_info_data(UINT32 data);
846 FREERDP_API
const char* freerdp_get_logon_error_info_data_ex(UINT32 data,
char* buffer,
850 FREERDP_API ULONG freerdp_get_transport_sent(
const rdpContext* context, BOOL resetCount);
853 FREERDP_API BOOL freerdp_nla_impersonate(rdpContext* context);
856 FREERDP_API BOOL freerdp_nla_revert_to_self(rdpContext* context);
859 FREERDP_API UINT32 freerdp_get_nla_sspi_error(
const rdpContext* context);
870 FREERDP_API BOOL freerdp_nla_encrypt(rdpContext* context,
const SecBuffer* inBuffer,
882 FREERDP_API BOOL freerdp_nla_decrypt(rdpContext* context,
const SecBuffer* inBuffer,
895 FREERDP_API SECURITY_STATUS freerdp_nla_QueryContextAttributes(rdpContext* context,
896 DWORD ulAttr, PVOID pBuffer);
908 FREERDP_API SECURITY_STATUS freerdp_nla_FreeContextBuffer(rdpContext* context, PVOID pBuffer);
910 FREERDP_API
void clearChannelError(rdpContext* context);
913 FREERDP_API HANDLE getChannelErrorEventHandle(rdpContext* context);
916 FREERDP_API UINT getChannelError(
const rdpContext* context);
919 FREERDP_API
const char* getChannelErrorDescription(
const rdpContext* context);
921 FREERDP_API
void setChannelError(rdpContext* context, UINT errorNum,
const char* format, ...);
924 FREERDP_API BOOL checkChannelErrorEvent(rdpContext* context);
927 FREERDP_API
const char* freerdp_nego_get_routing_token(
const rdpContext* context,
937 FREERDP_API CONNECTION_STATE freerdp_get_state(
const rdpContext* context);
946 FREERDP_API
const char* freerdp_state_string(CONNECTION_STATE state);
958 FREERDP_API BOOL freerdp_is_active_state(
const rdpContext* context);
961 FREERDP_API BOOL freerdp_channels_from_mcs(rdpSettings* settings,
const rdpContext* context);
964 FREERDP_API BOOL freerdp_is_valid_mcs_create_request(
const BYTE* data,
size_t size);
967 FREERDP_API BOOL freerdp_is_valid_mcs_create_response(
const BYTE* data,
size_t size);
982 FREERDP_API BOOL freerdp_persist_credentials(rdpContext* context);
993 FREERDP_API BOOL freerdp_set_common_access_token(rdpContext* context,
994 pGetCommonAccessToken GetCommonAccessToken);
1002 WINPR_ATTR_NODISCARD
1003 FREERDP_API pGetCommonAccessToken freerdp_get_common_access_token(
const rdpContext* context);
ALIGN64 freerdp_peer * peer
ALIGN64 freerdp * instance
WINPR_ATTR_NODISCARD ALIGN64 pVerifyCertificateEx VerifyCertificateEx
WINPR_ATTR_NODISCARD ALIGN64 pConnectCallback Redirect
WINPR_DEPRECATED_VAR("[since 3.25.0] Use AuthenticateEx instead", WINPR_ATTR_NODISCARD ALIGN64 pAuthenticate GatewayAuthenticate)
WINPR_ATTR_NODISCARD ALIGN64 pLogonErrorInfo LogonErrorInfo
WINPR_ATTR_NODISCARD ALIGN64 pContextNew ContextNew
ALIGN64 pPostDisconnect PostDisconnect
WINPR_DEPRECATED_VAR("Use VerifyCertificateEx or VerifyX509Certificate instead", WINPR_ATTR_NODISCARD ALIGN64 pVerifyCertificate VerifyCertificate)
WINPR_ATTR_NODISCARD ALIGN64 pAuthenticateEx AuthenticateEx
WINPR_ATTR_NODISCARD ALIGN64 pConnectCallback LoadChannels
ALIGN64 rdpContext * context
WINPR_DEPRECATED_VAR("[since 3.25.0] Use AuthenticateEx instead", WINPR_ATTR_NODISCARD ALIGN64 pAuthenticate Authenticate)
WINPR_ATTR_NODISCARD ALIGN64 pPresentGatewayMessage PresentGatewayMessage
ALIGN64 pContextFree ContextFree
WINPR_ATTR_NODISCARD ALIGN64 pVerifyX509Certificate VerifyX509Certificate
WINPR_ATTR_NODISCARD ALIGN64 pConnectCallback PreConnect
WINPR_ATTR_NODISCARD ALIGN64 pVerifyChangedCertificateEx VerifyChangedCertificateEx
WINPR_DEPRECATED_VAR("Use VerifyChangedCertificateEx or VerifyX509Certificate instead", WINPR_ATTR_NODISCARD ALIGN64 pVerifyChangedCertificate VerifyChangedCertificate)
WINPR_ATTR_NODISCARD ALIGN64 pConnectCallback PostConnect