FreeRDP
Loading...
Searching...
No Matches
freerdp.h
1
22#ifndef FREERDP_H
23#define FREERDP_H
24
25#include <winpr/stream.h>
26#include <winpr/sspi.h>
27
28#include <freerdp/api.h>
29#include <freerdp/types.h>
30#include <freerdp/error.h>
31#include <freerdp/event.h>
32
33#include <freerdp/settings.h>
34
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>
43
44#ifdef __cplusplus
45extern "C"
46{
47#endif
48
49 typedef struct rdp_rdp rdpRdp;
50 typedef struct rdp_rail rdpRail;
51 typedef struct rdp_cache rdpCache;
52
53 typedef struct rdp_client_context rdpClientContext;
54 typedef struct rdp_client_entry_points_v1 RDP_CLIENT_ENTRY_POINTS_V1;
55 typedef RDP_CLIENT_ENTRY_POINTS_V1 RDP_CLIENT_ENTRY_POINTS;
56
57#include <freerdp/utils/smartcardlogon.h>
58#include <freerdp/update.h>
59#include <freerdp/input.h>
60#include <freerdp/graphics.h>
61
62#define MCS_BASE_CHANNEL_ID 1001
63#define MCS_GLOBAL_CHANNEL_ID 1003
64
65/* Flags used by certificate callbacks */
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
74
75/* Message types used by gateway messaging callback */
76#define GATEWAY_MESSAGE_CONSENT 1
77#define GATEWAY_MESSAGE_SERVICE 2
78
79 typedef enum
80 {
81 AUTH_NLA,
82 AUTH_TLS,
83 AUTH_RDP,
84 GW_AUTH_HTTP,
85 GW_AUTH_RDG,
86 GW_AUTH_RPC,
87 AUTH_SMARTCARD_PIN,
88 AUTH_RDSTLS
89 } rdp_auth_reason;
90
91 typedef BOOL (*pContextNew)(freerdp* instance, rdpContext* context);
92 typedef void (*pContextFree)(freerdp* instance, rdpContext* context);
93
94 typedef BOOL (*pConnectCallback)(freerdp* instance);
95 typedef void (*pPostDisconnect)(freerdp* instance);
96
110 typedef BOOL (*pAuthenticate)(freerdp* instance, char** username, char** password,
111 char** domain);
112
134 typedef BOOL (*pAuthenticateEx)(freerdp* instance, char** username, char** password,
135 char** domain, rdp_auth_reason reason);
136
155 typedef BOOL (*pChooseSmartcard)(freerdp* instance, SmartcardCertInfo** cert_list, DWORD count,
156 DWORD* choice, BOOL gateway);
157
158 typedef enum
159 {
160 ACCESS_TOKEN_TYPE_AAD,
161 ACCESS_TOKEN_TYPE_AVD
162 } AccessTokenType;
163
174 typedef BOOL (*pGetAccessToken)(freerdp* instance, AccessTokenType tokenType, char** token,
175 size_t count, ...);
176
190 typedef BOOL (*pGetCommonAccessToken)(rdpContext* context, AccessTokenType tokenType,
191 char** token, size_t count, ...);
192
204 typedef SSIZE_T (*pRetryDialog)(freerdp* instance, const char* what, size_t current,
205 void* userarg);
206
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));
228#endif
229
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);
248
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));
271#endif
272
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);
298
312 typedef int (*pVerifyX509Certificate)(freerdp* instance, const BYTE* data, size_t length,
313 const char* hostname, UINT16 port, DWORD flags);
314
315 typedef int (*pLogonErrorInfo)(freerdp* instance, UINT32 data, UINT32 type);
316
317 typedef BOOL (*pSendChannelData)(freerdp* instance, UINT16 channelId, const BYTE* data,
318 size_t size);
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);
323
324 /* type can be one of the GATEWAY_MESSAGE_ type defines */
325 typedef BOOL (*pPresentGatewayMessage)(freerdp* instance, UINT32 type, BOOL isDisplayMandatory,
326 BOOL isConsentMandatory, size_t length,
327 const WCHAR* message);
328
335 {
336 ALIGN64 freerdp* instance;
340 ALIGN64 freerdp_peer* peer;
344 ALIGN64 BOOL ServerMode;
346 ALIGN64 UINT32 LastError; /* 3 */
347
348 UINT64 paddingA[16 - 4]; /* 4 */
349
350 ALIGN64 int argc;
355 ALIGN64 char** argv;
361 ALIGN64 wPubSub* pubSub; /* (offset 18) */
362
363 ALIGN64 HANDLE channelErrorEvent; /* (offset 19)*/
364 ALIGN64 UINT channelErrorNum; /*(offset 20)*/
365 ALIGN64 char* errorDescription; /*(offset 21)*/
366
367 UINT64 paddingB[32 - 22]; /* 22 */
368
369 ALIGN64 rdpRdp*
375 ALIGN64 rdpGdi* gdi;
379 ALIGN64 rdpRail* rail; /* 34 */
380 ALIGN64 rdpCache* cache; /* 35 */
381 ALIGN64 rdpChannels* channels; /* 36 */
382 ALIGN64 rdpGraphics* graphics; /* 37 */
383 ALIGN64 rdpInput* input; /* 38 owned by rdpRdp */
384 ALIGN64 rdpUpdate* update; /* 39 owned by rdpRdp */
385 ALIGN64 rdpSettings* settings; /* 40 owned by rdpRdp */
386 ALIGN64 rdpMetrics* metrics; /* 41 */
387 ALIGN64 rdpCodecs* codecs; /* 42 */
388 ALIGN64 rdpAutoDetect* autodetect; /* 43 owned by rdpRdp */
389 UINT64 paddingC1[45 - 44]; /* 44 */
390 ALIGN64 int disconnectUltimatum; /* 45 */
391 UINT64 paddingC[64 - 46]; /* 46 */
392
393 ALIGN64 rdpStreamDumpContext* dump; /* 64 */
394 ALIGN64 wLog* log; /* 65 */
395
396 UINT64 paddingD[96 - 66]; /* 66 */
397 UINT64 paddingE[128 - 96]; /* 96 */
398 };
399
407 enum Disconnect_Ultimatum
408 {
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
414 };
415
416#include <freerdp/client.h>
417
426 {
427 ALIGN64
428 rdpContext* context;
438 ALIGN64 RDP_CLIENT_ENTRY_POINTS* pClientEntryPoints;
439
440 UINT64 paddingA[16 - 2]; /* 2 */
441
442#if defined(WITH_FREERDP_DEPRECATED)
443 WINPR_DEPRECATED_VAR("use rdpContext::input instead", ALIGN64 rdpInput* input;) /* (offset
444 16) Input handle for the connection. Will be initialized by a call
445 to freerdp_context_new() owned by rdpRdp */
446 WINPR_DEPRECATED_VAR("use rdpContext::update instead",
447 ALIGN64 rdpUpdate* update;) /* (offset 17)
448 Update display parameters. Used to register display events callbacks
449and settings. Will be initialized by a call to freerdp_context_new() owned by rdpRdp */
450 WINPR_DEPRECATED_VAR("use rdpContext::settings instead",
451 ALIGN64 rdpSettings* settings;)
457 WINPR_DEPRECATED_VAR("use rdpContext::autodetect instead",
458 ALIGN64 rdpAutoDetect* autodetect;) /* (offset 19)
459 Auto-Detect handle for the connection.
460 Will be initialized by a call to freerdp_context_new()
461owned by rdpRdp */
462#else
463 UINT64 paddingX[4];
464#endif
465 ALIGN64 rdpHeartbeat* heartbeat; /* (offset 21) owned by rdpRdp*/
466
467 UINT64 paddingB[32 - 21]; /* 21 */
468
469 ALIGN64 size_t
470 ContextSize; /* (offset 32)
471 Specifies the size of the 'context' field. freerdp_context_new() will use this
472 size to allocate the context buffer. freerdp_new() sets it to
473 sizeof(rdpContext). If modifying it, there should always be a minimum of
474 sizeof(rdpContext), as the freerdp library will assume it can use the 'context'
475 field to set the required information in it. Clients will typically make it
476 bigger, and use a context structure embedding the rdpContext, and adding
477 additional information after that.
478 */
479
480 ALIGN64 pContextNew
486 ALIGN64 pContextFree
491 UINT64 paddingC[47 - 35]; /* 35 */
492
493 ALIGN64 UINT ConnectionCallbackState; /* 47 */
494
495 ALIGN64 pConnectCallback
501 ALIGN64 pConnectCallback
507 ALIGN64 pAuthenticate Authenticate;
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;)
517#else
518 ALIGN64 UINT64 reserved[2];
519#endif
520 ALIGN64 pVerifyX509Certificate
524 ALIGN64 pLogonErrorInfo
528 ALIGN64 pPostDisconnect
537 ALIGN64 pAuthenticate GatewayAuthenticate;
542 ALIGN64 pPresentGatewayMessage PresentGatewayMessage;
546 ALIGN64 pConnectCallback Redirect;
552 ALIGN64 pConnectCallback
557 ALIGN64 pPostDisconnect
558 PostFinalDisconnect;
564 UINT64 paddingD[64 - 61]; /* 61 */
565
566 ALIGN64 pSendChannelData
567 SendChannelData; /* (offset 64)
568 Callback for sending data to a channel.
569 By default, it is set by freerdp_new() to freerdp_send_channel_data(), which
570 eventually calls freerdp_channel_send() */
571 ALIGN64 pReceiveChannelData
572 ReceiveChannelData; /* (offset 65)
573 Callback for receiving data from a channel.
574 This is called by freerdp_channel_process() (if not NULL).
575 Clients will typically use a function that calls freerdp_channels_data()
576 to perform the needed tasks. */
577
578 ALIGN64 pVerifyCertificateEx
582 ALIGN64 pVerifyChangedCertificateEx
586 ALIGN64 pSendChannelPacket
587 SendChannelPacket; /* (offset 68)
588 * Callback for sending RAW data to a channel. In contrast to
589 * SendChannelData data fragmentation is up to the user and this
590 * function sends data as is with the provided flags.
591 */
592 ALIGN64 pAuthenticateEx AuthenticateEx;
596 ALIGN64 pChooseSmartcard
597 ChooseSmartcard; /* (offset 70)
598 Callback for choosing a smartcard for logon.
599 Used when multiple smartcards are available. Returns an index into a list
600 of SmartcardCertInfo pointers */
601 ALIGN64 pGetAccessToken GetAccessToken; /* (offset 71)
602 Callback for obtaining an access token
603 for \b AccessTokenType authentication */
604 ALIGN64 pRetryDialog RetryDialog; /* (offset 72) Callback for displaying a dialog in case of
605 something needs a retry */
606 UINT64 paddingE[80 - 73]; /* 73 */
607 };
608
610 {
611 wListDictionary* init;
612 wListDictionary* open;
613 };
614 typedef struct rdp_channel_handles rdpChannelHandles;
615
616 FREERDP_API void freerdp_context_free(freerdp* instance);
617
618 FREERDP_API BOOL freerdp_context_new(freerdp* instance);
619 FREERDP_API BOOL freerdp_context_new_ex(freerdp* instance, rdpSettings* settings);
620
621 FREERDP_API BOOL freerdp_context_reset(freerdp* instance);
622
623 FREERDP_API BOOL freerdp_connect(freerdp* instance);
624
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));
628#endif
629
630 FREERDP_API BOOL freerdp_abort_connect_context(rdpContext* context);
631 FREERDP_API HANDLE freerdp_abort_event(rdpContext* context);
632
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));
636#endif
637
638 FREERDP_API BOOL freerdp_shall_disconnect_context(const rdpContext* context);
639 FREERDP_API BOOL freerdp_disconnect(freerdp* instance);
640
649 FREERDP_API const char* freerdp_disconnect_reason_string(int reason);
650
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));
654#endif
655
656 FREERDP_API BOOL freerdp_disconnect_before_reconnect_context(rdpContext* context);
657
658 FREERDP_API BOOL freerdp_reconnect(freerdp* instance);
659
660 FREERDP_API UINT freerdp_channels_attach(freerdp* instance);
661 FREERDP_API UINT freerdp_channels_detach(freerdp* instance);
662
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));
667#endif
668
669 FREERDP_API BOOL freerdp_check_fds(freerdp* instance);
670
671 FREERDP_API DWORD freerdp_get_event_handles(rdpContext* context, HANDLE* events, DWORD count);
672 FREERDP_API BOOL freerdp_check_event_handles(rdpContext* context);
673
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,
677 wMessage* message);
678 FREERDP_API int freerdp_message_queue_process_pending_messages(freerdp* instance, DWORD id);
679
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);
685
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);
690
691 FREERDP_API void freerdp_free(freerdp* instance);
692
693 WINPR_ATTR_MALLOC(freerdp_free, 1)
694 WINPR_ATTR_NODISCARD
695 FREERDP_API freerdp* freerdp_new(void);
696
697 FREERDP_API BOOL freerdp_focus_required(freerdp* instance);
698 FREERDP_API void freerdp_set_focus(freerdp* instance);
699
700 FREERDP_API int freerdp_get_disconnect_ultimatum(const rdpContext* context);
701
702 FREERDP_API UINT32 freerdp_get_last_error(const rdpContext* context);
703 FREERDP_API const char* freerdp_get_last_error_name(UINT32 error);
704 FREERDP_API const char* freerdp_get_last_error_string(UINT32 error);
705 FREERDP_API const char* freerdp_get_last_error_category(UINT32 error);
706
707#define freerdp_set_last_error(context, lastError) \
708 freerdp_set_last_error_ex((context), (lastError), __func__, __FILE__, __LINE__)
709
710#define freerdp_set_last_error_if_not(context, lastError) \
711 do \
712 { \
713 if (freerdp_get_last_error(context) == FREERDP_ERROR_SUCCESS) \
714 freerdp_set_last_error_log(context, lastError); \
715 } while (0)
716
717#define freerdp_set_last_error_log(context, lastError) \
718 freerdp_set_last_error_ex((context), (lastError), __func__, __FILE__, __LINE__)
719 FREERDP_API void freerdp_set_last_error_ex(rdpContext* context, UINT32 lastError,
720 const char* fkt, const char* file, int line);
721
722 FREERDP_API const char* freerdp_get_logon_error_info_type(UINT32 type);
723 FREERDP_API const char* freerdp_get_logon_error_info_type_ex(UINT32 type, char* buffer,
724 size_t size);
725
726 FREERDP_API const char* freerdp_get_logon_error_info_data(UINT32 data);
727 FREERDP_API const char* freerdp_get_logon_error_info_data_ex(UINT32 data, char* buffer,
728 size_t size);
729
730 FREERDP_API ULONG freerdp_get_transport_sent(const rdpContext* context, BOOL resetCount);
731
732 FREERDP_API BOOL freerdp_nla_impersonate(rdpContext* context);
733 FREERDP_API BOOL freerdp_nla_revert_to_self(rdpContext* context);
734
735 FREERDP_API UINT32 freerdp_get_nla_sspi_error(const rdpContext* context);
736
745 FREERDP_API BOOL freerdp_nla_encrypt(rdpContext* context, const SecBuffer* inBuffer,
746 SecBuffer* outBuffer);
747
756 FREERDP_API BOOL freerdp_nla_decrypt(rdpContext* context, const SecBuffer* inBuffer,
757 SecBuffer* outBuffer);
758
768 FREERDP_API SECURITY_STATUS freerdp_nla_QueryContextAttributes(rdpContext* context,
769 DWORD ulAttr, PVOID pBuffer);
770
780 FREERDP_API SECURITY_STATUS freerdp_nla_FreeContextBuffer(rdpContext* context, PVOID pBuffer);
781
782 FREERDP_API void clearChannelError(rdpContext* context);
783 FREERDP_API HANDLE getChannelErrorEventHandle(rdpContext* context);
784 FREERDP_API UINT getChannelError(const rdpContext* context);
785 FREERDP_API const char* getChannelErrorDescription(const rdpContext* context);
786 FREERDP_API void setChannelError(rdpContext* context, UINT errorNum, const char* format, ...);
787 FREERDP_API BOOL checkChannelErrorEvent(rdpContext* context);
788
789 FREERDP_API const char* freerdp_nego_get_routing_token(const rdpContext* context,
790 DWORD* length);
791
798 FREERDP_API CONNECTION_STATE freerdp_get_state(const rdpContext* context);
799
806 FREERDP_API const char* freerdp_state_string(CONNECTION_STATE state);
807
817 FREERDP_API BOOL freerdp_is_active_state(const rdpContext* context);
818
819 FREERDP_API BOOL freerdp_channels_from_mcs(rdpSettings* settings, const rdpContext* context);
820
821 FREERDP_API BOOL freerdp_is_valid_mcs_create_request(const BYTE* data, size_t size);
822 FREERDP_API BOOL freerdp_is_valid_mcs_create_response(const BYTE* data, size_t size);
823
836 FREERDP_API BOOL freerdp_persist_credentials(rdpContext* context);
837
846 FREERDP_API BOOL freerdp_set_common_access_token(rdpContext* context,
847 pGetCommonAccessToken GetCommonAccessToken);
848
855 FREERDP_API pGetCommonAccessToken freerdp_get_common_access_token(const rdpContext* context);
856
857#ifdef __cplusplus
858}
859#endif
860
861#endif /* FREERDP_H */
ALIGN64 char ** argv
Definition freerdp.h:355
ALIGN64 rdpRdp * rdp
Definition freerdp.h:370
ALIGN64 freerdp_peer * peer
Definition freerdp.h:340
ALIGN64 BOOL ServerMode
Definition freerdp.h:344
ALIGN64 rdpGdi * gdi
Definition freerdp.h:375
ALIGN64 int argc
Definition freerdp.h:350
ALIGN64 freerdp * instance
Definition freerdp.h:336
UINT64 paddingD[64 - 61]
Definition freerdp.h:564
ALIGN64 pConnectCallback LoadChannels
Definition freerdp.h:553
ALIGN64 pVerifyChangedCertificateEx VerifyChangedCertificateEx
Definition freerdp.h:583
ALIGN64 pVerifyCertificateEx VerifyCertificateEx
Definition freerdp.h:579
ALIGN64 pConnectCallback Redirect
Definition freerdp.h:546
ALIGN64 pConnectCallback PostConnect
Definition freerdp.h:502
ALIGN64 pAuthenticateEx AuthenticateEx
Definition freerdp.h:592
ALIGN64 pPostDisconnect PostDisconnect
Definition freerdp.h:529
ALIGN64 pLogonErrorInfo LogonErrorInfo
Definition freerdp.h:525
ALIGN64 rdpContext * context
Definition freerdp.h:428
ALIGN64 pAuthenticate Authenticate
Definition freerdp.h:507
ALIGN64 pAuthenticate GatewayAuthenticate
Definition freerdp.h:537
ALIGN64 pContextFree ContextFree
Definition freerdp.h:487
ALIGN64 pVerifyX509Certificate VerifyX509Certificate
Definition freerdp.h:521
ALIGN64 pConnectCallback PreConnect
Definition freerdp.h:496
ALIGN64 pContextNew ContextNew
Definition freerdp.h:481
ALIGN64 pPresentGatewayMessage PresentGatewayMessage
Definition freerdp.h:542
Definition rdp.h:148