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>
62#define MCS_BASE_CHANNEL_ID 1001
63#define MCS_GLOBAL_CHANNEL_ID 1003
66#define VERIFY_CERT_FLAG_NONE 0x00
67#define VERIFY_CERT_FLAG_LEGACY 0x02
68#define VERIFY_CERT_FLAG_REDIRECT 0x10
69#define VERIFY_CERT_FLAG_GATEWAY 0x20
70#define VERIFY_CERT_FLAG_CHANGED 0x40
71#define VERIFY_CERT_FLAG_MISMATCH 0x80
72#define VERIFY_CERT_FLAG_MATCH_LEGACY_SHA1 0x100
73#define VERIFY_CERT_FLAG_FP_IS_PEM 0x200
76#define GATEWAY_MESSAGE_CONSENT 1
77#define GATEWAY_MESSAGE_SERVICE 2
91 typedef BOOL (*pContextNew)(freerdp* instance, rdpContext* context);
92 typedef void (*pContextFree)(freerdp* instance, rdpContext* context);
94 typedef BOOL (*pConnectCallback)(freerdp* instance);
95 typedef void (*pPostDisconnect)(freerdp* instance);
110 typedef BOOL (*pAuthenticate)(freerdp* instance,
char** username,
char** password,
134 typedef BOOL (*pAuthenticateEx)(freerdp* instance,
char** username,
char** password,
135 char** domain, rdp_auth_reason reason);
155 typedef BOOL (*pChooseSmartcard)(freerdp* instance,
SmartcardCertInfo** cert_list, DWORD count,
156 DWORD* choice, BOOL gateway);
160 ACCESS_TOKEN_TYPE_AAD,
161 ACCESS_TOKEN_TYPE_AVD
174 typedef BOOL (*pGetAccessToken)(freerdp* instance, AccessTokenType tokenType,
char** token,
190 typedef BOOL (*pGetCommonAccessToken)(rdpContext* context, AccessTokenType tokenType,
191 char** token,
size_t count, ...);
204 typedef SSIZE_T (*pRetryDialog)(freerdp* instance,
const char* what,
size_t current,
222#if defined(WITH_FREERDP_DEPRECATED)
223 typedef WINPR_DEPRECATED_VAR(
224 "Use pVerifyCertificateEx",
225 DWORD (*pVerifyCertificate)(freerdp* instance,
const char* common_name,
const char* subject,
226 const char* issuer,
const char* fingerprint,
227 BOOL host_mismatch));
245 typedef DWORD (*pVerifyCertificateEx)(freerdp* instance,
const char* host, UINT16 port,
246 const char* common_name,
const char* subject,
247 const char* issuer,
const char* fingerprint, DWORD flags);
264#if defined(WITH_FREERDP_DEPRECATED)
265 typedef WINPR_DEPRECATED_VAR(
266 "Use pVerifyChangedCertificateEx",
267 DWORD (*pVerifyChangedCertificate)(freerdp* instance,
const char* common_name,
268 const char* subject,
const char* issuer,
269 const char* new_fingerprint,
const char* old_subject,
270 const char* old_issuer,
const char* old_fingerprint));
293 typedef DWORD (*pVerifyChangedCertificateEx)(freerdp* instance,
const char* host, UINT16 port,
294 const char* common_name,
const char* subject,
295 const char* issuer,
const char* new_fingerprint,
296 const char* old_subject,
const char* old_issuer,
297 const char* old_fingerprint, DWORD flags);
312 typedef int (*pVerifyX509Certificate)(freerdp* instance,
const BYTE* data,
size_t length,
313 const char* hostname, UINT16 port, DWORD flags);
315 typedef int (*pLogonErrorInfo)(freerdp* instance, UINT32 data, UINT32 type);
317 typedef BOOL (*pSendChannelData)(freerdp* instance, UINT16 channelId,
const BYTE* data,
319 typedef BOOL (*pSendChannelPacket)(freerdp* instance, UINT16 channelId,
size_t totalSize,
320 UINT32 flags,
const BYTE* data,
size_t chunkSize);
321 typedef BOOL (*pReceiveChannelData)(freerdp* instance, UINT16 channelId,
const BYTE* data,
322 size_t size, UINT32 flags,
size_t totalSize);
325 typedef BOOL (*pPresentGatewayMessage)(freerdp* instance, UINT32 type, BOOL isDisplayMandatory,
326 BOOL isConsentMandatory,
size_t length,
327 const WCHAR* message);
346 ALIGN64 UINT32 LastError;
348 UINT64 paddingA[16 - 4];
361 ALIGN64 wPubSub* pubSub;
363 ALIGN64 HANDLE channelErrorEvent;
364 ALIGN64 UINT channelErrorNum;
365 ALIGN64
char* errorDescription;
367 UINT64 paddingB[32 - 22];
379 ALIGN64 rdpRail* rail;
380 ALIGN64 rdpCache* cache;
381 ALIGN64 rdpChannels* channels;
382 ALIGN64 rdpGraphics* graphics;
383 ALIGN64 rdpInput* input;
384 ALIGN64 rdpUpdate* update;
385 ALIGN64 rdpSettings* settings;
386 ALIGN64 rdpMetrics* metrics;
387 ALIGN64 rdpCodecs* codecs;
388 ALIGN64 rdpAutoDetect* autodetect;
389 UINT64 paddingC1[45 - 44];
390 ALIGN64
int disconnectUltimatum;
391 UINT64 paddingC[64 - 46];
393 ALIGN64 rdpStreamDumpContext* dump;
396 UINT64 paddingD[96 - 66];
397 UINT64 paddingE[128 - 96];
407 enum Disconnect_Ultimatum
409 Disconnect_Ultimatum_domain_disconnected = 0,
410 Disconnect_Ultimatum_provider_initiated = 1,
411 Disconnect_Ultimatum_token_purged = 2,
412 Disconnect_Ultimatum_user_requested = 3,
413 Disconnect_Ultimatum_channel_purged = 4
416#include <freerdp/client.h>
438 ALIGN64 RDP_CLIENT_ENTRY_POINTS* pClientEntryPoints;
440 UINT64 paddingA[16 - 2];
442#if defined(WITH_FREERDP_DEPRECATED)
443 WINPR_DEPRECATED_VAR(
"use rdpContext::input instead", ALIGN64 rdpInput* input;)
446 WINPR_DEPRECATED_VAR(
"use rdpContext::update instead",
447 ALIGN64 rdpUpdate* update;)
450 WINPR_DEPRECATED_VAR(
"use rdpContext::settings instead",
451 ALIGN64 rdpSettings* settings;)
457 WINPR_DEPRECATED_VAR(
"use rdpContext::autodetect instead",
458 ALIGN64 rdpAutoDetect* autodetect;)
465 ALIGN64 rdpHeartbeat* heartbeat;
467 UINT64 paddingB[32 - 21];
491 UINT64 paddingC[47 - 35];
493 ALIGN64 UINT ConnectionCallbackState;
495 ALIGN64 pConnectCallback
501 ALIGN64 pConnectCallback
511#if defined(WITH_FREERDP_DEPRECATED)
512 WINPR_DEPRECATED_VAR(
"Use VerifyCertificateEx or VerifyX509Certificate instead",
513 ALIGN64 pVerifyCertificate VerifyCertificate;)
514 WINPR_DEPRECATED_VAR(
"Use VerifyChangedCertificateEx or VerifyX509Certificate instead",
515 ALIGN64 pVerifyChangedCertificate
516 VerifyChangedCertificate;)
518 ALIGN64 UINT64 reserved[2];
520 ALIGN64 pVerifyX509Certificate
524 ALIGN64 pLogonErrorInfo
528 ALIGN64 pPostDisconnect
552 ALIGN64 pConnectCallback
557 ALIGN64 pPostDisconnect
566 ALIGN64 pSendChannelData
571 ALIGN64 pReceiveChannelData
578 ALIGN64 pVerifyCertificateEx
582 ALIGN64 pVerifyChangedCertificateEx
586 ALIGN64 pSendChannelPacket
596 ALIGN64 pChooseSmartcard
601 ALIGN64 pGetAccessToken GetAccessToken;
604 ALIGN64 pRetryDialog RetryDialog;
606 UINT64 paddingE[80 - 73];
611 wListDictionary* init;
612 wListDictionary* open;
616 FREERDP_API
void freerdp_context_free(freerdp* instance);
618 FREERDP_API BOOL freerdp_context_new(freerdp* instance);
619 FREERDP_API BOOL freerdp_context_new_ex(freerdp* instance, rdpSettings* settings);
621 FREERDP_API BOOL freerdp_context_reset(freerdp* instance);
623 FREERDP_API BOOL freerdp_connect(freerdp* instance);
625#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
626 WINPR_DEPRECATED_VAR(
"use freerdp_abort_connect_context instead",
627 FREERDP_API BOOL freerdp_abort_connect(freerdp* instance));
630 FREERDP_API BOOL freerdp_abort_connect_context(rdpContext* context);
631 FREERDP_API HANDLE freerdp_abort_event(rdpContext* context);
633#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
634 WINPR_DEPRECATED_VAR(
"use freerdp_shall_disconnect_context instead",
635 FREERDP_API BOOL freerdp_shall_disconnect(
const freerdp* instance));
638 FREERDP_API BOOL freerdp_shall_disconnect_context(
const rdpContext* context);
639 FREERDP_API BOOL freerdp_disconnect(freerdp* instance);
649 FREERDP_API
const char* freerdp_disconnect_reason_string(
int reason);
651#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
652 WINPR_DEPRECATED_VAR(
"use freerdp_disconnect_before_reconnect_context instead",
653 FREERDP_API BOOL freerdp_disconnect_before_reconnect(freerdp* instance));
656 FREERDP_API BOOL freerdp_disconnect_before_reconnect_context(rdpContext* context);
658 FREERDP_API BOOL freerdp_reconnect(freerdp* instance);
660 FREERDP_API UINT freerdp_channels_attach(freerdp* instance);
661 FREERDP_API UINT freerdp_channels_detach(freerdp* instance);
663#if defined(WITH_FREERDP_DEPRECATED)
664 WINPR_DEPRECATED_VAR(
"Use freerdp_get_event_handles",
665 FREERDP_API BOOL freerdp_get_fds(freerdp* instance,
void** rfds,
666 int* rcount,
void** wfds,
int* wcount));
669 FREERDP_API BOOL freerdp_check_fds(freerdp* instance);
671 FREERDP_API DWORD freerdp_get_event_handles(rdpContext* context, HANDLE* events, DWORD count);
672 FREERDP_API BOOL freerdp_check_event_handles(rdpContext* context);
674 FREERDP_API wMessageQueue* freerdp_get_message_queue(freerdp* instance, DWORD
id);
675 FREERDP_API HANDLE freerdp_get_message_queue_event_handle(freerdp* instance, DWORD
id);
676 FREERDP_API
int freerdp_message_queue_process_message(freerdp* instance, DWORD
id,
678 FREERDP_API
int freerdp_message_queue_process_pending_messages(freerdp* instance, DWORD
id);
680 FREERDP_API UINT32 freerdp_error_info(
const freerdp* instance);
681 FREERDP_API
void freerdp_set_error_info(rdpRdp* rdp, UINT32 error);
682 FREERDP_API BOOL freerdp_send_error_info(rdpRdp* rdp);
683 FREERDP_API BOOL freerdp_get_stats(
const rdpRdp* rdp, UINT64* inBytes, UINT64* outBytes,
684 UINT64* inPackets, UINT64* outPackets);
686 FREERDP_API
void freerdp_get_version(
int* major,
int* minor,
int* revision);
687 FREERDP_API
const char* freerdp_get_version_string(
void);
688 FREERDP_API
const char* freerdp_get_build_revision(
void);
689 FREERDP_API
const char* freerdp_get_build_config(
void);
691 FREERDP_API
void freerdp_free(freerdp* instance);
693 WINPR_ATTR_MALLOC(freerdp_free, 1)
694 FREERDP_API freerdp* freerdp_new(
void);
696 FREERDP_API BOOL freerdp_focus_required(freerdp* instance);
697 FREERDP_API
void freerdp_set_focus(freerdp* instance);
699 FREERDP_API
int freerdp_get_disconnect_ultimatum(const rdpContext* context);
701 FREERDP_API UINT32 freerdp_get_last_error(const rdpContext* context);
702 FREERDP_API const
char* freerdp_get_last_error_name(UINT32 error);
703 FREERDP_API const
char* freerdp_get_last_error_string(UINT32 error);
704 FREERDP_API const
char* freerdp_get_last_error_category(UINT32 error);
706#define freerdp_set_last_error(context, lastError) \
707 freerdp_set_last_error_ex((context), (lastError), __func__, __FILE__, __LINE__)
709#define freerdp_set_last_error_if_not(context, lastError) \
712 if (freerdp_get_last_error(context) == FREERDP_ERROR_SUCCESS) \
713 freerdp_set_last_error_log(context, lastError); \
716#define freerdp_set_last_error_log(context, lastError) \
717 freerdp_set_last_error_ex((context), (lastError), __func__, __FILE__, __LINE__)
718 FREERDP_API
void freerdp_set_last_error_ex(rdpContext* context, UINT32 lastError,
719 const char* fkt,
const char* file,
int line);
721 FREERDP_API
const char* freerdp_get_logon_error_info_type(UINT32 type);
722 FREERDP_API
const char* freerdp_get_logon_error_info_type_ex(UINT32 type,
char* buffer,
725 FREERDP_API
const char* freerdp_get_logon_error_info_data(UINT32 data);
726 FREERDP_API
const char* freerdp_get_logon_error_info_data_ex(UINT32 data,
char* buffer,
729 FREERDP_API ULONG freerdp_get_transport_sent(
const rdpContext* context, BOOL resetCount);
731 FREERDP_API BOOL freerdp_nla_impersonate(rdpContext* context);
732 FREERDP_API BOOL freerdp_nla_revert_to_self(rdpContext* context);
734 FREERDP_API UINT32 freerdp_get_nla_sspi_error(
const rdpContext* context);
744 FREERDP_API BOOL freerdp_nla_encrypt(rdpContext* context,
const SecBuffer* inBuffer,
755 FREERDP_API BOOL freerdp_nla_decrypt(rdpContext* context,
const SecBuffer* inBuffer,
767 FREERDP_API SECURITY_STATUS freerdp_nla_QueryContextAttributes(rdpContext* context,
768 DWORD ulAttr, PVOID pBuffer);
770 FREERDP_API
void clearChannelError(rdpContext* context);
771 FREERDP_API HANDLE getChannelErrorEventHandle(rdpContext* context);
772 FREERDP_API UINT getChannelError(
const rdpContext* context);
773 FREERDP_API
const char* getChannelErrorDescription(
const rdpContext* context);
774 FREERDP_API
void setChannelError(rdpContext* context, UINT errorNum,
const char* format, ...);
775 FREERDP_API BOOL checkChannelErrorEvent(rdpContext* context);
777 FREERDP_API
const char* freerdp_nego_get_routing_token(
const rdpContext* context,
786 FREERDP_API CONNECTION_STATE freerdp_get_state(
const rdpContext* context);
794 FREERDP_API
const char* freerdp_state_string(CONNECTION_STATE state);
805 FREERDP_API BOOL freerdp_is_active_state(
const rdpContext* context);
807 FREERDP_API BOOL freerdp_channels_from_mcs(rdpSettings* settings,
const rdpContext* context);
809 FREERDP_API BOOL freerdp_is_valid_mcs_create_request(
const BYTE* data,
size_t size);
810 FREERDP_API BOOL freerdp_is_valid_mcs_create_response(
const BYTE* data,
size_t size);
824 FREERDP_API BOOL freerdp_persist_credentials(rdpContext* context);
834 FREERDP_API BOOL freerdp_set_common_access_token(rdpContext* context,
835 pGetCommonAccessToken GetCommonAccessToken);
843 FREERDP_API pGetCommonAccessToken freerdp_get_common_access_token(
const rdpContext* context);
ALIGN64 freerdp_peer * peer
ALIGN64 freerdp * instance
ALIGN64 pConnectCallback LoadChannels
ALIGN64 pVerifyChangedCertificateEx VerifyChangedCertificateEx
ALIGN64 pVerifyCertificateEx VerifyCertificateEx
ALIGN64 pConnectCallback Redirect
ALIGN64 pConnectCallback PostConnect
ALIGN64 pAuthenticateEx AuthenticateEx
ALIGN64 pPostDisconnect PostDisconnect
ALIGN64 pLogonErrorInfo LogonErrorInfo
ALIGN64 rdpContext * context
ALIGN64 pAuthenticate Authenticate
ALIGN64 pAuthenticate GatewayAuthenticate
ALIGN64 pContextFree ContextFree
ALIGN64 pVerifyX509Certificate VerifyX509Certificate
ALIGN64 pConnectCallback PreConnect
ALIGN64 pContextNew ContextNew
ALIGN64 pPresentGatewayMessage PresentGatewayMessage