FreeRDP
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Modules Pages
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 } rdp_auth_reason;
89
90 typedef BOOL (*pContextNew)(freerdp* instance, rdpContext* context);
91 typedef void (*pContextFree)(freerdp* instance, rdpContext* context);
92
93 typedef BOOL (*pConnectCallback)(freerdp* instance);
94 typedef void (*pPostDisconnect)(freerdp* instance);
95
109 typedef BOOL (*pAuthenticate)(freerdp* instance, char** username, char** password,
110 char** domain);
111
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);
130
131 typedef enum
132 {
133 ACCESS_TOKEN_TYPE_AAD,
134 ACCESS_TOKEN_TYPE_AVD
135 } AccessTokenType;
136
147 typedef BOOL (*pGetAccessToken)(freerdp* instance, AccessTokenType tokenType, char** token,
148 size_t count, ...);
149
163 typedef BOOL (*pGetCommonAccessToken)(rdpContext* context, AccessTokenType tokenType,
164 char** token, size_t count, ...);
165
177 typedef SSIZE_T (*pRetryDialog)(freerdp* instance, const char* what, size_t current,
178 void* userarg);
179
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));
201#endif
202
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);
221
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));
244#endif
245
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);
271
285 typedef int (*pVerifyX509Certificate)(freerdp* instance, const BYTE* data, size_t length,
286 const char* hostname, UINT16 port, DWORD flags);
287
288 typedef int (*pLogonErrorInfo)(freerdp* instance, UINT32 data, UINT32 type);
289
290 typedef BOOL (*pSendChannelData)(freerdp* instance, UINT16 channelId, const BYTE* data,
291 size_t size);
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);
296
297 /* type can be one of the GATEWAY_MESSAGE_ type defines */
298 typedef BOOL (*pPresentGatewayMessage)(freerdp* instance, UINT32 type, BOOL isDisplayMandatory,
299 BOOL isConsentMandatory, size_t length,
300 const WCHAR* message);
301
308 {
309 ALIGN64 freerdp* instance;
313 ALIGN64 freerdp_peer* peer;
317 ALIGN64 BOOL ServerMode;
319 ALIGN64 UINT32 LastError; /* 3 */
320
321 UINT64 paddingA[16 - 4]; /* 4 */
322
323 ALIGN64 int argc;
328 ALIGN64 char** argv;
334 ALIGN64 wPubSub* pubSub; /* (offset 18) */
335
336 ALIGN64 HANDLE channelErrorEvent; /* (offset 19)*/
337 ALIGN64 UINT channelErrorNum; /*(offset 20)*/
338 ALIGN64 char* errorDescription; /*(offset 21)*/
339
340 UINT64 paddingB[32 - 22]; /* 22 */
341
342 ALIGN64 rdpRdp*
348 ALIGN64 rdpGdi* gdi;
352 ALIGN64 rdpRail* rail; /* 34 */
353 ALIGN64 rdpCache* cache; /* 35 */
354 ALIGN64 rdpChannels* channels; /* 36 */
355 ALIGN64 rdpGraphics* graphics; /* 37 */
356 ALIGN64 rdpInput* input; /* 38 owned by rdpRdp */
357 ALIGN64 rdpUpdate* update; /* 39 owned by rdpRdp */
358 ALIGN64 rdpSettings* settings; /* 40 owned by rdpRdp */
359 ALIGN64 rdpMetrics* metrics; /* 41 */
360 ALIGN64 rdpCodecs* codecs; /* 42 */
361 ALIGN64 rdpAutoDetect* autodetect; /* 43 owned by rdpRdp */
362 UINT64 paddingC1[45 - 44]; /* 44 */
363 ALIGN64 int disconnectUltimatum; /* 45 */
364 UINT64 paddingC[64 - 46]; /* 46 */
365
366 ALIGN64 rdpStreamDumpContext* dump; /* 64 */
367 ALIGN64 wLog* log; /* 65 */
368
369 UINT64 paddingD[96 - 66]; /* 66 */
370 UINT64 paddingE[128 - 96]; /* 96 */
371 };
372
380 enum Disconnect_Ultimatum
381 {
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
387 };
388
389#include <freerdp/client.h>
390
399 {
400 ALIGN64
401 rdpContext* context;
411 ALIGN64 RDP_CLIENT_ENTRY_POINTS* pClientEntryPoints;
412
413 UINT64 paddingA[16 - 2]; /* 2 */
414
415#if defined(WITH_FREERDP_DEPRECATED)
416 WINPR_DEPRECATED_VAR("use rdpContext::input instead", ALIGN64 rdpInput* input;) /* (offset
417 16) Input handle for the connection. Will be initialized by a call
418 to freerdp_context_new() owned by rdpRdp */
419 WINPR_DEPRECATED_VAR("use rdpContext::update instead",
420 ALIGN64 rdpUpdate* update;) /* (offset 17)
421 Update display parameters. Used to register display events callbacks
422and settings. Will be initialized by a call to freerdp_context_new() owned by rdpRdp */
423 WINPR_DEPRECATED_VAR("use rdpContext::settings instead",
424 ALIGN64 rdpSettings* settings;)
430 WINPR_DEPRECATED_VAR("use rdpContext::autodetect instead",
431 ALIGN64 rdpAutoDetect* autodetect;) /* (offset 19)
432 Auto-Detect handle for the connection.
433 Will be initialized by a call to freerdp_context_new()
434owned by rdpRdp */
435#else
436 UINT64 paddingX[4];
437#endif
438 ALIGN64 rdpHeartbeat* heartbeat; /* (offset 21) owned by rdpRdp*/
439
440 UINT64 paddingB[32 - 21]; /* 21 */
441
442 ALIGN64 size_t
443 ContextSize; /* (offset 32)
444 Specifies the size of the 'context' field. freerdp_context_new() will use this
445 size to allocate the context buffer. freerdp_new() sets it to
446 sizeof(rdpContext). If modifying it, there should always be a minimum of
447 sizeof(rdpContext), as the freerdp library will assume it can use the 'context'
448 field to set the required information in it. Clients will typically make it
449 bigger, and use a context structure embedding the rdpContext, and adding
450 additional information after that.
451 */
452
453 ALIGN64 pContextNew
459 ALIGN64 pContextFree
464 UINT64 paddingC[47 - 35]; /* 35 */
465
466 ALIGN64 UINT ConnectionCallbackState; /* 47 */
467
468 ALIGN64 pConnectCallback
474 ALIGN64 pConnectCallback
480 ALIGN64 pAuthenticate Authenticate;
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;)
490#else
491 ALIGN64 UINT64 reserved[2];
492#endif
493 ALIGN64 pVerifyX509Certificate
497 ALIGN64 pLogonErrorInfo
501 ALIGN64 pPostDisconnect
510 ALIGN64 pAuthenticate GatewayAuthenticate;
515 ALIGN64 pPresentGatewayMessage PresentGatewayMessage;
519 ALIGN64 pConnectCallback Redirect;
525 ALIGN64 pConnectCallback
530 ALIGN64 pPostDisconnect
531 PostFinalDisconnect;
537 UINT64 paddingD[64 - 61]; /* 61 */
538
539 ALIGN64 pSendChannelData
540 SendChannelData; /* (offset 64)
541 Callback for sending data to a channel.
542 By default, it is set by freerdp_new() to freerdp_send_channel_data(), which
543 eventually calls freerdp_channel_send() */
544 ALIGN64 pReceiveChannelData
545 ReceiveChannelData; /* (offset 65)
546 Callback for receiving data from a channel.
547 This is called by freerdp_channel_process() (if not NULL).
548 Clients will typically use a function that calls freerdp_channels_data()
549 to perform the needed tasks. */
550
551 ALIGN64 pVerifyCertificateEx
555 ALIGN64 pVerifyChangedCertificateEx
559 ALIGN64 pSendChannelPacket
560 SendChannelPacket; /* (offset 68)
561 * Callback for sending RAW data to a channel. In contrast to
562 * SendChannelData data fragmentation is up to the user and this
563 * function sends data as is with the provided flags.
564 */
565 ALIGN64 pAuthenticateEx AuthenticateEx;
569 ALIGN64 pChooseSmartcard
570 ChooseSmartcard; /* (offset 70)
571 Callback for choosing a smartcard for logon.
572 Used when multiple smartcards are available. Returns an index into a list
573 of SmartcardCertInfo pointers */
574 ALIGN64 pGetAccessToken GetAccessToken; /* (offset 71)
575 Callback for obtaining an access token
576 for \b AccessTokenType authentication */
577 ALIGN64 pRetryDialog RetryDialog; /* (offset 72) Callback for displaying a dialog in case of
578 something needs a retry */
579 UINT64 paddingE[80 - 73]; /* 73 */
580 };
581
583 {
584 wListDictionary* init;
585 wListDictionary* open;
586 };
587 typedef struct rdp_channel_handles rdpChannelHandles;
588
589 FREERDP_API void freerdp_context_free(freerdp* instance);
590
591 FREERDP_API BOOL freerdp_context_new(freerdp* instance);
592 FREERDP_API BOOL freerdp_context_new_ex(freerdp* instance, rdpSettings* settings);
593
594 FREERDP_API BOOL freerdp_context_reset(freerdp* instance);
595
596 FREERDP_API BOOL freerdp_connect(freerdp* instance);
597
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));
601#endif
602
603 FREERDP_API BOOL freerdp_abort_connect_context(rdpContext* context);
604 FREERDP_API HANDLE freerdp_abort_event(rdpContext* context);
605
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));
609#endif
610
611 FREERDP_API BOOL freerdp_shall_disconnect_context(const rdpContext* context);
612 FREERDP_API BOOL freerdp_disconnect(freerdp* instance);
613
622 FREERDP_API const char* freerdp_disconnect_reason_string(int reason);
623
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));
627#endif
628
629 FREERDP_API BOOL freerdp_disconnect_before_reconnect_context(rdpContext* context);
630
631 FREERDP_API BOOL freerdp_reconnect(freerdp* instance);
632
633 FREERDP_API UINT freerdp_channels_attach(freerdp* instance);
634 FREERDP_API UINT freerdp_channels_detach(freerdp* instance);
635
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));
640#endif
641
642 FREERDP_API BOOL freerdp_check_fds(freerdp* instance);
643
644 FREERDP_API DWORD freerdp_get_event_handles(rdpContext* context, HANDLE* events, DWORD count);
645 FREERDP_API BOOL freerdp_check_event_handles(rdpContext* context);
646
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,
650 wMessage* message);
651 FREERDP_API int freerdp_message_queue_process_pending_messages(freerdp* instance, DWORD id);
652
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);
658
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);
663
664 FREERDP_API void freerdp_free(freerdp* instance);
665
666 WINPR_ATTR_MALLOC(freerdp_free, 1)
667 FREERDP_API freerdp* freerdp_new(void);
668
669 FREERDP_API BOOL freerdp_focus_required(freerdp* instance);
670 FREERDP_API void freerdp_set_focus(freerdp* instance);
671
672 FREERDP_API int freerdp_get_disconnect_ultimatum(rdpContext* context);
673
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);
678
679#define freerdp_set_last_error(context, lastError) \
680 freerdp_set_last_error_ex((context), (lastError), __func__, __FILE__, __LINE__)
681
682#define freerdp_set_last_error_if_not(context, lastError) \
683 do \
684 { \
685 if (freerdp_get_last_error(context) == FREERDP_ERROR_SUCCESS) \
686 freerdp_set_last_error_log(context, lastError); \
687 } while (0)
688
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);
693
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,
696 size_t size);
697
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,
700 size_t size);
701
702 FREERDP_API ULONG freerdp_get_transport_sent(rdpContext* context, BOOL resetCount);
703
704 FREERDP_API BOOL freerdp_nla_impersonate(rdpContext* context);
705 FREERDP_API BOOL freerdp_nla_revert_to_self(rdpContext* context);
706
707 FREERDP_API UINT32 freerdp_get_nla_sspi_error(rdpContext* context);
708
717 FREERDP_API BOOL freerdp_nla_encrypt(rdpContext* context, const SecBuffer* inBuffer,
718 SecBuffer* outBuffer);
719
728 FREERDP_API BOOL freerdp_nla_decrypt(rdpContext* context, const SecBuffer* inBuffer,
729 SecBuffer* outBuffer);
730
740 FREERDP_API SECURITY_STATUS freerdp_nla_QueryContextAttributes(rdpContext* context,
741 DWORD ulAttr, PVOID pBuffer);
742
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);
749
750 FREERDP_API const char* freerdp_nego_get_routing_token(rdpContext* context, DWORD* length);
751
758 FREERDP_API CONNECTION_STATE freerdp_get_state(const rdpContext* context);
759
766 FREERDP_API const char* freerdp_state_string(CONNECTION_STATE state);
767
777 FREERDP_API BOOL freerdp_is_active_state(const rdpContext* context);
778
779 FREERDP_API BOOL freerdp_channels_from_mcs(rdpSettings* settings, const rdpContext* context);
780
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);
783
796 FREERDP_API BOOL freerdp_persist_credentials(rdpContext* context);
797
806 FREERDP_API BOOL freerdp_set_common_access_token(rdpContext* context,
807 pGetCommonAccessToken GetCommonAccessToken);
808
815 FREERDP_API pGetCommonAccessToken freerdp_get_common_access_token(rdpContext* context);
816
817#ifdef __cplusplus
818}
819#endif
820
821#endif /* FREERDP_H */
ALIGN64 char ** argv
Definition freerdp.h:328
ALIGN64 rdpRdp * rdp
Definition freerdp.h:343
ALIGN64 freerdp_peer * peer
Definition freerdp.h:313
ALIGN64 BOOL ServerMode
Definition freerdp.h:317
ALIGN64 rdpGdi * gdi
Definition freerdp.h:348
ALIGN64 int argc
Definition freerdp.h:323
ALIGN64 freerdp * instance
Definition freerdp.h:309
UINT64 paddingD[64 - 61]
Definition freerdp.h:537
ALIGN64 pConnectCallback LoadChannels
Definition freerdp.h:526
ALIGN64 pVerifyChangedCertificateEx VerifyChangedCertificateEx
Definition freerdp.h:556
ALIGN64 pVerifyCertificateEx VerifyCertificateEx
Definition freerdp.h:552
ALIGN64 pConnectCallback Redirect
Definition freerdp.h:519
ALIGN64 pConnectCallback PostConnect
Definition freerdp.h:475
ALIGN64 pAuthenticateEx AuthenticateEx
Definition freerdp.h:565
ALIGN64 pPostDisconnect PostDisconnect
Definition freerdp.h:502
ALIGN64 pLogonErrorInfo LogonErrorInfo
Definition freerdp.h:498
ALIGN64 rdpContext * context
Definition freerdp.h:401
ALIGN64 pAuthenticate Authenticate
Definition freerdp.h:480
ALIGN64 pAuthenticate GatewayAuthenticate
Definition freerdp.h:510
ALIGN64 pContextFree ContextFree
Definition freerdp.h:460
ALIGN64 pVerifyX509Certificate VerifyX509Certificate
Definition freerdp.h:494
ALIGN64 pConnectCallback PreConnect
Definition freerdp.h:469
ALIGN64 pContextNew ContextNew
Definition freerdp.h:454
ALIGN64 pPresentGatewayMessage PresentGatewayMessage
Definition freerdp.h:515
Definition rdp.h:148