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 FREERDP_API freerdp* freerdp_new(void);
695
696 FREERDP_API BOOL freerdp_focus_required(freerdp* instance);
697 FREERDP_API void freerdp_set_focus(freerdp* instance);
698
699 FREERDP_API int freerdp_get_disconnect_ultimatum(const rdpContext* context);
700
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);
705
706#define freerdp_set_last_error(context, lastError) \
707 freerdp_set_last_error_ex((context), (lastError), __func__, __FILE__, __LINE__)
708
709#define freerdp_set_last_error_if_not(context, lastError) \
710 do \
711 { \
712 if (freerdp_get_last_error(context) == FREERDP_ERROR_SUCCESS) \
713 freerdp_set_last_error_log(context, lastError); \
714 } while (0)
715
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);
720
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,
723 size_t size);
724
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,
727 size_t size);
728
729 FREERDP_API ULONG freerdp_get_transport_sent(const rdpContext* context, BOOL resetCount);
730
731 FREERDP_API BOOL freerdp_nla_impersonate(rdpContext* context);
732 FREERDP_API BOOL freerdp_nla_revert_to_self(rdpContext* context);
733
734 FREERDP_API UINT32 freerdp_get_nla_sspi_error(const rdpContext* context);
735
744 FREERDP_API BOOL freerdp_nla_encrypt(rdpContext* context, const SecBuffer* inBuffer,
745 SecBuffer* outBuffer);
746
755 FREERDP_API BOOL freerdp_nla_decrypt(rdpContext* context, const SecBuffer* inBuffer,
756 SecBuffer* outBuffer);
757
767 FREERDP_API SECURITY_STATUS freerdp_nla_QueryContextAttributes(rdpContext* context,
768 DWORD ulAttr, PVOID pBuffer);
769
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);
776
777 FREERDP_API const char* freerdp_nego_get_routing_token(const rdpContext* context,
778 DWORD* length);
779
786 FREERDP_API CONNECTION_STATE freerdp_get_state(const rdpContext* context);
787
794 FREERDP_API const char* freerdp_state_string(CONNECTION_STATE state);
795
805 FREERDP_API BOOL freerdp_is_active_state(const rdpContext* context);
806
807 FREERDP_API BOOL freerdp_channels_from_mcs(rdpSettings* settings, const rdpContext* context);
808
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);
811
824 FREERDP_API BOOL freerdp_persist_credentials(rdpContext* context);
825
834 FREERDP_API BOOL freerdp_set_common_access_token(rdpContext* context,
835 pGetCommonAccessToken GetCommonAccessToken);
836
843 FREERDP_API pGetCommonAccessToken freerdp_get_common_access_token(const rdpContext* context);
844
845#ifdef __cplusplus
846}
847#endif
848
849#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