WSLPlugins-rs
WSLPlugins-rs is a Rust framework for building WSL plugins. It wraps the raw WSL plugin API with safer, more idiomatic Rust types and provides a procedural macro for generating plugin entry points and hook wiring. The project is intended for Windows hosts that load plugins through WSL. It includes:
- a runtime crate:
wslplugins-rs - a proc-macro crate:
wslplugins-macro - examples that build real plugin DLLs
Features
- Safe and ergonomic wrappers around the WSL plugin API
- A
#[wsl_plugin_v1(...)]macro that generates the exported entry points - Support for WSL metadata, session information, and command execution
- Examples that can be built, signed, and loaded into WSL
Prerequisites
Install the following tools on Windows:
- Rust stable and Cargo
- PowerShell
- OpenSSL for certificate generation in the signing script
SignTool.exefrom the Windows SDK
Notes:
SignTool.exeis easiest to access from a Visual Studio Developer Command Prompt or a shell where the Windows SDK tools are onPATH.- Running the signing step with
-Trustrequires administrator privileges because it installs the generated certificate locally.
Crates
wslplugins-rs: main framework cratewslplugins-macro: procedural macro crate re-exported bywslplugins-rswhen themacrofeature is enabled
Quick Start
Add the crate with the macro feature:
[]
= { = "0.1.0-beta.2", = ["macro"] }
Then implement a plugin:
use *;
pub
The macro feature re-exports the wsl_plugin_v1 attribute and generates the WSL entry points for a WSLPluginV1 implementation.
Running Commands in WSL
Use ApiV1::new_command to build and execute a Linux command from a plugin session.
use ;
use SessionID;
Notes:
- Program paths must be Linux UTF-8 paths such as
/bin/echo argv[0]defaults to the program path and can be overridden withwith_arg0with_distribution_idtargets a specific user distributionexecute()returns aTcpStreamconnected to process stdin/stdout- stderr is forwarded to Linux
dmesg
Examples
Two example plugins are included:
examples/minimal: a close Rust translation of Microsoft's sample pluginexamples/dist-info: a plugin focused on distribution metadata and tracing
Build one of them in release mode:
cargo build --release -p minimal
or:
cargo build --release -p dist-info
The resulting plugin DLLs are produced in target\release\.
Signing a Plugin
Sign the built DLL with the provided PowerShell script:
.\sign-plugin.ps1 -PluginPath .\target\release\minimal.dll -Trust
or:
.\sign-plugin.ps1 -PluginPath .\target\release\dist_info.dll -Trust
If you do not want to install the certificate automatically, omit -Trust.
Registering the Plugin in WSL
Register the signed DLL in the WSL plugins registry key:
reg.exe add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Lxss\Plugins" /v minimal /d "C:\path\to\wslplugins-rs\target\release\minimal.dll" /t REG_SZ
Adjust the registry value name and DLL path for the plugin you want to load.
Restart the WSL service after registration:
sc.exe stop wslservice
sc.exe start wslservice
Verification
After loading the plugin:
- inspect the log output produced by the example
- verify the DLL path in the registry
- confirm the DLL was signed successfully
The minimal example writes to C:\wsl-plugin-demo.txt.
Release Checks
The repository release workflow is centered on these commands:
cargo test --workspace --all-features
cargo clippy --workspace --all-targets --all-features
cargo fmt --all -- --check
cargo publish --workspace --dry-run
Contributing
Contributions are welcome. Open an issue or submit a pull request with tests and a clear description of the change.
License
Licensed under either MIT or Apache-2.0.