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
90 typedef BOOL (*pContextNew)(freerdp* instance, rdpContext* context);
91 typedef void (*pContextFree)(freerdp* instance, rdpContext* context);
93 typedef BOOL (*pConnectCallback)(freerdp* instance);
94 typedef void (*pPostDisconnect)(freerdp* instance);
109 typedef BOOL (*pAuthenticate)(freerdp* instance,
char** username,
char** password,
126 typedef BOOL (*pAuthenticateEx)(freerdp* instance,
char** username,
char** password,
127 char** domain, rdp_auth_reason reason);
128 typedef BOOL (*pChooseSmartcard)(freerdp* instance,
SmartcardCertInfo** cert_list, DWORD count,
129 DWORD* choice, BOOL gateway);
133 ACCESS_TOKEN_TYPE_AAD,
134 ACCESS_TOKEN_TYPE_AVD
147 typedef BOOL (*pGetAccessToken)(freerdp* instance, AccessTokenType tokenType,
char** token,
163 typedef BOOL (*pGetCommonAccessToken)(rdpContext* context, AccessTokenType tokenType,
164 char** token,
size_t count, ...);
177 typedef SSIZE_T (*pRetryDialog)(freerdp* instance,
const char* what,
size_t current,
195#if defined(WITH_FREERDP_DEPRECATED)
196 typedef WINPR_DEPRECATED_VAR(
197 "Use pVerifyCertificateEx",
198 DWORD (*pVerifyCertificate)(freerdp* instance,
const char* common_name,
const char* subject,
199 const char* issuer,
const char* fingerprint,
200 BOOL host_mismatch));
218 typedef DWORD (*pVerifyCertificateEx)(freerdp* instance,
const char* host, UINT16 port,
219 const char* common_name,
const char* subject,
220 const char* issuer,
const char* fingerprint, DWORD flags);
237#if defined(WITH_FREERDP_DEPRECATED)
238 typedef WINPR_DEPRECATED_VAR(
239 "Use pVerifyChangedCertificateEx",
240 DWORD (*pVerifyChangedCertificate)(freerdp* instance,
const char* common_name,
241 const char* subject,
const char* issuer,
242 const char* new_fingerprint,
const char* old_subject,
243 const char* old_issuer,
const char* old_fingerprint));
266 typedef DWORD (*pVerifyChangedCertificateEx)(freerdp* instance,
const char* host, UINT16 port,
267 const char* common_name,
const char* subject,
268 const char* issuer,
const char* new_fingerprint,
269 const char* old_subject,
const char* old_issuer,
270 const char* old_fingerprint, DWORD flags);
285 typedef int (*pVerifyX509Certificate)(freerdp* instance,
const BYTE* data,
size_t length,
286 const char* hostname, UINT16 port, DWORD flags);
288 typedef int (*pLogonErrorInfo)(freerdp* instance, UINT32 data, UINT32 type);
290 typedef BOOL (*pSendChannelData)(freerdp* instance, UINT16 channelId,
const BYTE* data,
292 typedef BOOL (*pSendChannelPacket)(freerdp* instance, UINT16 channelId,
size_t totalSize,
293 UINT32 flags,
const BYTE* data,
size_t chunkSize);
294 typedef BOOL (*pReceiveChannelData)(freerdp* instance, UINT16 channelId,
const BYTE* data,
295 size_t size, UINT32 flags,
size_t totalSize);
298 typedef BOOL (*pPresentGatewayMessage)(freerdp* instance, UINT32 type, BOOL isDisplayMandatory,
299 BOOL isConsentMandatory,
size_t length,
300 const WCHAR* message);
319 ALIGN64 UINT32 LastError;
321 UINT64 paddingA[16 - 4];
334 ALIGN64 wPubSub* pubSub;
336 ALIGN64 HANDLE channelErrorEvent;
337 ALIGN64 UINT channelErrorNum;
338 ALIGN64
char* errorDescription;
340 UINT64 paddingB[32 - 22];
352 ALIGN64 rdpRail* rail;
353 ALIGN64 rdpCache* cache;
354 ALIGN64 rdpChannels* channels;
355 ALIGN64 rdpGraphics* graphics;
356 ALIGN64 rdpInput* input;
357 ALIGN64 rdpUpdate* update;
358 ALIGN64 rdpSettings* settings;
359 ALIGN64 rdpMetrics* metrics;
360 ALIGN64 rdpCodecs* codecs;
361 ALIGN64 rdpAutoDetect* autodetect;
362 UINT64 paddingC1[45 - 44];
363 ALIGN64
int disconnectUltimatum;
364 UINT64 paddingC[64 - 46];
366 ALIGN64 rdpStreamDumpContext* dump;
369 UINT64 paddingD[96 - 66];
370 UINT64 paddingE[128 - 96];
380 enum Disconnect_Ultimatum
382 Disconnect_Ultimatum_domain_disconnected = 0,
383 Disconnect_Ultimatum_provider_initiated = 1,
384 Disconnect_Ultimatum_token_purged = 2,
385 Disconnect_Ultimatum_user_requested = 3,
386 Disconnect_Ultimatum_channel_purged = 4
389#include <freerdp/client.h>
411 ALIGN64 RDP_CLIENT_ENTRY_POINTS* pClientEntryPoints;
413 UINT64 paddingA[16 - 2];
415#if defined(WITH_FREERDP_DEPRECATED)
416 WINPR_DEPRECATED_VAR(
"use rdpContext::input instead", ALIGN64 rdpInput* input;)
419 WINPR_DEPRECATED_VAR(
"use rdpContext::update instead",
420 ALIGN64 rdpUpdate* update;)
423 WINPR_DEPRECATED_VAR(
"use rdpContext::settings instead",
424 ALIGN64 rdpSettings* settings;)
430 WINPR_DEPRECATED_VAR(
"use rdpContext::autodetect instead",
431 ALIGN64 rdpAutoDetect* autodetect;)
438 ALIGN64 rdpHeartbeat* heartbeat;
440 UINT64 paddingB[32 - 21];
464 UINT64 paddingC[47 - 35];
466 ALIGN64 UINT ConnectionCallbackState;
468 ALIGN64 pConnectCallback
474 ALIGN64 pConnectCallback
484#if defined(WITH_FREERDP_DEPRECATED)
485 WINPR_DEPRECATED_VAR(
"Use VerifyCertificateEx or VerifyX509Certificate instead",
486 ALIGN64 pVerifyCertificate VerifyCertificate;)
487 WINPR_DEPRECATED_VAR(
"Use VerifyChangedCertificateEx or VerifyX509Certificate instead",
488 ALIGN64 pVerifyChangedCertificate
489 VerifyChangedCertificate;)
491 ALIGN64 UINT64 reserved[2];
493 ALIGN64 pVerifyX509Certificate
497 ALIGN64 pLogonErrorInfo
501 ALIGN64 pPostDisconnect
525 ALIGN64 pConnectCallback
530 ALIGN64 pPostDisconnect
539 ALIGN64 pSendChannelData
544 ALIGN64 pReceiveChannelData
551 ALIGN64 pVerifyCertificateEx
555 ALIGN64 pVerifyChangedCertificateEx
559 ALIGN64 pSendChannelPacket
569 ALIGN64 pChooseSmartcard
574 ALIGN64 pGetAccessToken GetAccessToken;
577 ALIGN64 pRetryDialog RetryDialog;
579 UINT64 paddingE[80 - 73];
584 wListDictionary* init;
585 wListDictionary* open;
589 FREERDP_API
void freerdp_context_free(freerdp* instance);
591 FREERDP_API BOOL freerdp_context_new(freerdp* instance);
592 FREERDP_API BOOL freerdp_context_new_ex(freerdp* instance, rdpSettings* settings);
594 FREERDP_API BOOL freerdp_context_reset(freerdp* instance);
596 FREERDP_API BOOL freerdp_connect(freerdp* instance);
598#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
599 WINPR_DEPRECATED_VAR(
"use freerdp_abort_connect_context instead",
600 FREERDP_API BOOL freerdp_abort_connect(freerdp* instance));
603 FREERDP_API BOOL freerdp_abort_connect_context(rdpContext* context);
604 FREERDP_API HANDLE freerdp_abort_event(rdpContext* context);
606#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
607 WINPR_DEPRECATED_VAR(
"use freerdp_shall_disconnect_context instead",
608 FREERDP_API BOOL freerdp_shall_disconnect(freerdp* instance));
611 FREERDP_API BOOL freerdp_shall_disconnect_context(
const rdpContext* context);
612 FREERDP_API BOOL freerdp_disconnect(freerdp* instance);
622 FREERDP_API
const char* freerdp_disconnect_reason_string(
int reason);
624#if !defined(WITHOUT_FREERDP_3x_DEPRECATED)
625 WINPR_DEPRECATED_VAR(
"use freerdp_disconnect_before_reconnect_context instead",
626 FREERDP_API BOOL freerdp_disconnect_before_reconnect(freerdp* instance));
629 FREERDP_API BOOL freerdp_disconnect_before_reconnect_context(rdpContext* context);
631 FREERDP_API BOOL freerdp_reconnect(freerdp* instance);
633 FREERDP_API UINT freerdp_channels_attach(freerdp* instance);
634 FREERDP_API UINT freerdp_channels_detach(freerdp* instance);
636#if defined(WITH_FREERDP_DEPRECATED)
637 WINPR_DEPRECATED_VAR(
"Use freerdp_get_event_handles",
638 FREERDP_API BOOL freerdp_get_fds(freerdp* instance,
void** rfds,
639 int* rcount,
void** wfds,
int* wcount));
642 FREERDP_API BOOL freerdp_check_fds(freerdp* instance);
644 FREERDP_API DWORD freerdp_get_event_handles(rdpContext* context, HANDLE* events, DWORD count);
645 FREERDP_API BOOL freerdp_check_event_handles(rdpContext* context);
647 FREERDP_API wMessageQueue* freerdp_get_message_queue(freerdp* instance, DWORD
id);
648 FREERDP_API HANDLE freerdp_get_message_queue_event_handle(freerdp* instance, DWORD
id);
649 FREERDP_API
int freerdp_message_queue_process_message(freerdp* instance, DWORD
id,
651 FREERDP_API
int freerdp_message_queue_process_pending_messages(freerdp* instance, DWORD
id);
653 FREERDP_API UINT32 freerdp_error_info(freerdp* instance);
654 FREERDP_API
void freerdp_set_error_info(rdpRdp* rdp, UINT32 error);
655 FREERDP_API BOOL freerdp_send_error_info(rdpRdp* rdp);
656 FREERDP_API BOOL freerdp_get_stats(rdpRdp* rdp, UINT64* inBytes, UINT64* outBytes,
657 UINT64* inPackets, UINT64* outPackets);
659 FREERDP_API
void freerdp_get_version(
int* major,
int* minor,
int* revision);
660 FREERDP_API
const char* freerdp_get_version_string(
void);
661 FREERDP_API
const char* freerdp_get_build_revision(
void);
662 FREERDP_API
const char* freerdp_get_build_config(
void);
664 FREERDP_API
void freerdp_free(freerdp* instance);
666 WINPR_ATTR_MALLOC(freerdp_free, 1)
667 FREERDP_API freerdp* freerdp_new(
void);
669 FREERDP_API BOOL freerdp_focus_required(freerdp* instance);
670 FREERDP_API
void freerdp_set_focus(freerdp* instance);
672 FREERDP_API
int freerdp_get_disconnect_ultimatum(rdpContext* context);
674 FREERDP_API UINT32 freerdp_get_last_error(rdpContext* context);
675 FREERDP_API const
char* freerdp_get_last_error_name(UINT32 error);
676 FREERDP_API const
char* freerdp_get_last_error_string(UINT32 error);
677 FREERDP_API const
char* freerdp_get_last_error_category(UINT32 error);
679#define freerdp_set_last_error(context, lastError) \
680 freerdp_set_last_error_ex((context), (lastError), __func__, __FILE__, __LINE__)
682#define freerdp_set_last_error_if_not(context, lastError) \
685 if (freerdp_get_last_error(context) == FREERDP_ERROR_SUCCESS) \
686 freerdp_set_last_error_log(context, lastError); \
689#define freerdp_set_last_error_log(context, lastError) \
690 freerdp_set_last_error_ex((context), (lastError), __func__, __FILE__, __LINE__)
691 FREERDP_API
void freerdp_set_last_error_ex(rdpContext* context, UINT32 lastError,
692 const char* fkt,
const char* file,
int line);
694 FREERDP_API
const char* freerdp_get_logon_error_info_type(UINT32 type);
695 FREERDP_API
const char* freerdp_get_logon_error_info_type_ex(UINT32 type,
char* buffer,
698 FREERDP_API
const char* freerdp_get_logon_error_info_data(UINT32 data);
699 FREERDP_API
const char* freerdp_get_logon_error_info_data_ex(UINT32 data,
char* buffer,
702 FREERDP_API ULONG freerdp_get_transport_sent(rdpContext* context, BOOL resetCount);
704 FREERDP_API BOOL freerdp_nla_impersonate(rdpContext* context);
705 FREERDP_API BOOL freerdp_nla_revert_to_self(rdpContext* context);
707 FREERDP_API UINT32 freerdp_get_nla_sspi_error(rdpContext* context);
717 FREERDP_API BOOL freerdp_nla_encrypt(rdpContext* context,
const SecBuffer* inBuffer,
728 FREERDP_API BOOL freerdp_nla_decrypt(rdpContext* context,
const SecBuffer* inBuffer,
740 FREERDP_API SECURITY_STATUS freerdp_nla_QueryContextAttributes(rdpContext* context,
741 DWORD ulAttr, PVOID pBuffer);
743 FREERDP_API
void clearChannelError(rdpContext* context);
744 FREERDP_API HANDLE getChannelErrorEventHandle(rdpContext* context);
745 FREERDP_API UINT getChannelError(rdpContext* context);
746 FREERDP_API
const char* getChannelErrorDescription(rdpContext* context);
747 FREERDP_API
void setChannelError(rdpContext* context, UINT errorNum,
const char* format, ...);
748 FREERDP_API BOOL checkChannelErrorEvent(rdpContext* context);
750 FREERDP_API
const char* freerdp_nego_get_routing_token(rdpContext* context, DWORD* length);
758 FREERDP_API CONNECTION_STATE freerdp_get_state(
const rdpContext* context);
766 FREERDP_API
const char* freerdp_state_string(CONNECTION_STATE state);
777 FREERDP_API BOOL freerdp_is_active_state(
const rdpContext* context);
779 FREERDP_API BOOL freerdp_channels_from_mcs(rdpSettings* settings,
const rdpContext* context);
781 FREERDP_API BOOL freerdp_is_valid_mcs_create_request(
const BYTE* data,
size_t size);
782 FREERDP_API BOOL freerdp_is_valid_mcs_create_response(
const BYTE* data,
size_t size);
796 FREERDP_API BOOL freerdp_persist_credentials(rdpContext* context);
806 FREERDP_API BOOL freerdp_set_common_access_token(rdpContext* context,
807 pGetCommonAccessToken GetCommonAccessToken);
815 FREERDP_API pGetCommonAccessToken freerdp_get_common_access_token(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