Skip to main content
rdpSettings is FreeRDP’s unified configuration store. Every aspect of an RDP connection — server hostname, credentials, display geometry, security mode, codec preferences, channel lists — is represented as a named key with a strongly-typed value.

What Settings Are

A rdpSettings struct holds all configuration data for one side of an RDP connection. Settings are accessed exclusively through the typed freerdp_settings_get_* / freerdp_settings_set_* API family; direct struct field access is deprecated and may be removed in future releases.

Three Settings Instances

As documented in include/freerdp/settings.h:
There are 3 different settings for each client and server:
  1. The initial configuration supplied by the user
  2. The remote peer settings sent during capability exchange
  3. The merged settings derived from both
InstanceLifetimePurpose
Initial configEntire application lifecycleStores user-supplied values; survives reconnects and redirections
Remote peer settingsCapability exchange → disconnectReflects what the other endpoint advertised
Merged settingsCapability exchange → disconnectThe effective settings the session runs with; always use this for runtime queries
instance->context->settings always points to the merged settings once a connection is active.
This distinction is especially important in proxy scenarios where the same process hosts both a client and a server rdpSettings. Accessing the wrong instance produces stale or incorrect values.

Settings Lifetime

freerdp_settings_new()  ──► initial config created


freerdp_context_new()   ──► context takes ownership of initial config


[capability exchange]   ──► remote peer settings + merged settings created


[disconnect / redirect] ──► remote peer + merged settings freed


freerdp_context_free()  ──► initial config freed
If you modify settings after PreConnect has been called and want those changes to survive a reconnect or redirect, call:
freerdp_persist_credentials(instance->context);

Reading and Writing Settings

Settings are partitioned by value type. Each type has its own enum for key identifiers and its own getter/setter pair.
/* Read */
BOOL val = freerdp_settings_get_bool(settings, FreeRDP_Settings_Keys_Bool_id);

/* Write */
freerdp_settings_set_bool(settings, FreeRDP_Settings_Keys_Bool_id, TRUE);
After a sequence of set calls, validate the settings object in one go:
if (!freerdp_settings_are_valid(settings))
    /* handle invalid state */;

Key Setting Keys

Setting key identifiers are FreeRDP_<Name> constants defined in include/freerdp/settings_keys.h (generated) and surfaced through the typed enum families FreeRDP_Settings_Keys_Bool, FreeRDP_Settings_Keys_UInt32, FreeRDP_Settings_Keys_String, etc.

Connection

KeyTypeDescription
FreeRDP_ServerHostnameStringTarget server hostname or IP
FreeRDP_ServerPortUInt32Target port (default 3389)
FreeRDP_UsernameStringLogon username
FreeRDP_PasswordStringLogon password
FreeRDP_DomainStringWindows domain
FreeRDP_ClientHostnameStringClient machine name sent in GCC
FreeRDP_RdpVersionUInt32Requested RDP protocol version

Display

KeyTypeDescription
FreeRDP_DesktopWidthUInt32Initial desktop width
FreeRDP_DesktopHeightUInt32Initial desktop height
FreeRDP_ColorDepthUInt32Color depth (16 / 24 / 32 bpp)
FreeRDP_ConnectionTypeUInt32Network connection type hint

Security

KeyTypeDescription
FreeRDP_NlaSecurityBoolEnable NLA (CredSSP)
FreeRDP_TlsSecurityBoolEnable TLS transport security
FreeRDP_RdpSecurityBoolEnable classic RDP security
FreeRDP_NtlmSecurityBoolAllow NTLM inside NLA
FreeRDP_AuthenticationBoolRequire authentication
FreeRDP_IgnoreCertificateBoolAccept any certificate (testing only)
FreeRDP_CertificateAcceptedFingerprintsStringSemicolon-separated accepted fingerprints

Performance

KeyTypeDescription
FreeRDP_PerformanceFlagsUInt32Composite PERF_* flags
FreeRDP_DisableWallpaperBoolEquivalent to PERF_DISABLE_WALLPAPER
FreeRDP_AllowFontSmoothingBoolEquivalent to PERF_ENABLE_FONT_SMOOTHING

Codec / Graphics Pipeline

KeyTypeDescription
FreeRDP_SupportGraphicsPipelineBoolEnable RDP GFX (MS-RDPEGFX)
FreeRDP_RemoteFxCodecBoolEnable RemoteFX
FreeRDP_NSCodecBoolEnable NSCodec
FreeRDP_H264EnabledBoolEnable H.264/AVC codec
FreeRDP_GfxAVC444BoolUse AVC444 mode in GFX pipeline
FreeRDP_GfxProgressiveBoolEnable progressive codec

Lifecycle Management API

/* Create a standalone settings instance (rarely needed — context owns one) */
rdpSettings* s = freerdp_settings_new(0);            /* client */
rdpSettings* s = freerdp_settings_new(FREERDP_SETTINGS_SERVER_MODE); /* server */

/* Deep copy */
rdpSettings* copy = freerdp_settings_clone(s);
freerdp_settings_copy(dst, src);                     /* into existing struct */
freerdp_settings_copy_item(dst, src, FreeRDP_Username); /* single key */

/* Free */
freerdp_settings_free(s);

/* Debug dump */
freerdp_settings_dump(log, WLOG_DEBUG, s);
freerdp_settings_print_diff(log, WLOG_WARN, s, other); /* returns TRUE if different */

Example: Configure a Connection Before Connecting

#include <freerdp/freerdp.h>
#include <freerdp/settings.h>

static BOOL my_pre_connect(freerdp* instance)
{
    rdpSettings* settings = instance->context->settings;

    /* Server */
    freerdp_settings_set_string(settings, FreeRDP_ServerHostname, "192.168.1.100");
    freerdp_settings_set_uint32(settings, FreeRDP_ServerPort, 3389);

    /* Credentials */
    freerdp_settings_set_string(settings, FreeRDP_Username, "alice");
    freerdp_settings_set_string(settings, FreeRDP_Password, "s3cret");
    freerdp_settings_set_string(settings, FreeRDP_Domain,   "CORP");

    /* Display */
    freerdp_settings_set_uint32(settings, FreeRDP_DesktopWidth,  1920);
    freerdp_settings_set_uint32(settings, FreeRDP_DesktopHeight, 1080);
    freerdp_settings_set_uint32(settings, FreeRDP_ColorDepth,    32);

    /* Security: require NLA */
    freerdp_settings_set_bool(settings, FreeRDP_NlaSecurity, TRUE);
    freerdp_settings_set_bool(settings, FreeRDP_TlsSecurity, TRUE);
    freerdp_settings_set_bool(settings, FreeRDP_RdpSecurity, FALSE);

    /* Graphics pipeline */
    freerdp_settings_set_bool(settings, FreeRDP_SupportGraphicsPipeline, TRUE);

    return freerdp_settings_are_valid(settings);
}

int main(void)
{
    freerdp* instance = freerdp_new();
    instance->PreConnect = my_pre_connect;

    freerdp_context_new(instance);
    freerdp_connect(instance);

    /* ... event loop ... */

    freerdp_disconnect(instance);
    freerdp_context_free(instance);
    freerdp_free(instance);
    return 0;
}
Never store raw pointers returned by freerdp_settings_get_string(). The string is owned by the settings struct and may be reallocated if the same key is written again. Copy the value if you need it to outlive the next set call.