General Questions
What is IronRDP?
What is IronRDP?
- Core tier: Foundational protocol implementation
- Extra tier: Higher-level abstractions and I/O
- Internal tier: Testing and tooling
- Community tier: Community-maintained extensions
Why use IronRDP instead of other RDP implementations?
Why use IronRDP instead of other RDP implementations?
- Memory safety: Written in Rust, eliminating entire classes of vulnerabilities
- Modular design: Use only the components you need
- No-std support: Core crates work in embedded and WASM environments
- Well-documented: Extensive documentation and MS-RDP spec references
- Actively maintained: Regular updates and security fixes
- Cross-platform: Works on Windows, macOS, Linux, and WebAssembly
What are the minimum requirements to use IronRDP?
What are the minimum requirements to use IronRDP?
- Rust: Version 1.88.0 or later (pinned in
rust-toolchain.toml) - Platform: Windows, macOS, Linux, or WebAssembly
- Dependencies: Standard Rust toolchain (
cargo,rustc)
- Run
cargo xtask bootstrap -vto install additional tools - See Contributing Guide for full setup
Is IronRDP production-ready?
Is IronRDP production-ready?
- Core tier crates: Production-ready, extensively tested and fuzzed
- Extra tier crates: Generally stable, used in production
- Community tier crates: Varying maturity, check individual crate documentation
Architecture Questions
What is the difference between core tier and extra tier crates?
What is the difference between core tier and extra tier crates?
- Foundational protocol implementation
- No I/O operations allowed
- Must be
no_stdcompatible - Strictly no platform-dependent code
- Must be fuzzed
- Examples:
ironrdp-core,ironrdp-pdu,ironrdp-svc
- Higher-level abstractions
- I/O operations permitted
- Platform-specific code allowed
- Can depend on
std - Examples:
ironrdp-blocking,ironrdp-async,ironrdp-tokio
Why are there so many crates?
Why are there so many crates?
- Compilation parallelism: Smaller crates compile faster in parallel
- Dependency management: Use only what you need
- Clear boundaries: Each crate has a single, focused responsibility
- Easier testing: Test each component independently
- Reduced coupling: Changes in one crate don’t force rebuilding everything
ironrdp meta-crate re-exports the most commonly used crates for convenience.What is the purpose of ironrdp-core?
What is the purpose of ironrdp-core?
ironrdp-core provides the foundational building blocks used by all other crates:EncodeandDecodetraits for PDU encoding/decodingReadCursorandWriteCursorforno_stdbuffer I/OWriteBuffor managing encode buffersAsAnytrait for type erasure and downcasting
no_std compatibility.What are static vs dynamic virtual channels?
What are static vs dynamic virtual channels?
- Established during connection setup
- Fixed for the duration of the session
- Implemented via
SvcProcessortrait inironrdp-svc - Examples: CLIPRDR, RDPSND, RDPDR
- Created and destroyed on-demand during session
- More flexible, supports multiple concurrent channels
- Implemented via
DvcProcessortrait inironrdp-dvc - Multiplexed over DRDYNVC static channel
- Examples: Display Control, RemoteFX
Usage Questions
How do I create a basic RDP client?
How do I create a basic RDP client?
ironrdp-blocking:How do I handle virtual channels?
How do I handle virtual channels?
How do I enable logging?
How do I enable logging?
tracing crate for structured logging. Configure it with the IRONRDP_LOG environment variable:How do I use IronRDP with async/await?
How do I use IronRDP with async/await?
ironrdp-async or ironrdp-tokio:ironrdp-client which provides a complete async client implementation.Troubleshooting
Why am I getting 'oldString not found in content' errors?
Why am I getting 'oldString not found in content' errors?
Edit tool with content that doesn’t exactly match the file. Common causes:- Line number prefixes: Don’t include line numbers from the Read tool output
- Indentation mismatch: Ensure exact whitespace matching
- File changed: File may have been modified since you read it
Read tool first, then match the content exactly (excluding line number prefixes).Why is my connection failing during TLS upgrade?
Why is my connection failing during TLS upgrade?
-
CredSSP requires TLS resumption disabled:
- Certificate verification failing: Use custom verifier for testing (not production!)
-
Missing flush: Call
tls_stream.flush()?after creating the TLS connection
Why aren't my virtual channels working?
Why aren't my virtual channels working?
- RDPDR requires RDPSND: The RDPDR channel must be advertised with RDPSND channel
- Channel name formatting: Static channel names must be exactly 7 bytes + null terminator
- Missing SHOW_PROTOCOL flag: CLIPRDR messages require
CHANNEL_FLAG_SHOW_PROTOCOL - Capabilities not negotiated: Wait for capability exchange before sending data
How do I debug WebAssembly issues?
How do I debug WebAssembly issues?
- Use console logging:
web_sys::console::log_1()for debug output - Enable source maps: Built automatically with
cargo xtask web build - Check browser console: Look for JavaScript errors and panics
- Test in native first: Verify code works in native Rust before WASM
- Exceeding stack size with large stack allocations
- Using unsupported system calls
- Threading (not supported without additional configuration)
Protocol Questions
Which RDP versions are supported?
Which RDP versions are supported?
- RDP 4.0: Basic bitmap transfers
- RDP 5.0-5.2: Enhanced compression
- RDP 6.0: Improved compression, font smoothing
- RDP 6.1: Better compression algorithms
- RDP 7.0+: RemoteFX, H.264 codec
- RDP 8.0+: Additional virtual channels
- RDP 10.x: Latest features
What graphics codecs are supported?
What graphics codecs are supported?
- Uncompressed raw bitmaps: Full support
- Interleaved RLE: Full support
- RDP 6.0 Bitmap Compression: Full support
- Microsoft RemoteFX (RFX): Full support
- H.264 (AVC420/AVC444): Partial support (decode only)
ironrdp-graphics for implementation details.How do I enable RemoteFX on the server?
How do I enable RemoteFX on the server?
gpedit.msc) to enable RemoteFX settings under:- Computer Configuration > Administrative Templates > Windows Components > Remote Desktop Services > Remote Desktop Session Host > Remote Session Environment
Where can I find the RDP protocol specifications?
Where can I find the RDP protocol specifications?
- MS-RDPBCGR: Basic Connectivity and Graphics
- MS-RDPECLIP: Clipboard Virtual Channel
- MS-RDPEFS: File System Virtual Channel
- MS-RDPEA: Audio Output Virtual Channel
- MS-RDPEDISP: Display Control Virtual Channel
Development Questions
How do I run the test suite?
How do I run the test suite?
How do I add a fuzz target?
How do I add a fuzz target?
fuzz/fuzz_targets/:fuzz/Cargo.toml:What tools are used for development?
What tools are used for development?
- cargo-nextest: Faster test runner
- cargo-deny: Dependency license checking
- typos: Spell checker for code and docs
- wasm-pack: WebAssembly packaging
- cargo-fuzz: Fuzz testing (uses libFuzzer)
- cargo xtask: Project automation

