Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 2 additions & 12 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,40 +48,34 @@ jobs:
target: i686-pc-windows-msvc
runner: windows-2025-vs2026
artifact: rd_pipe-x86
toolchain: stable
- name: x64
target: x86_64-pc-windows-msvc
runner: windows-2025-vs2026
artifact: rd_pipe-x64
toolchain: stable
- name: arm64
target: aarch64-pc-windows-msvc
runner: windows-11-arm
artifact: rd_pipe-arm64
toolchain: beta
- name: arm64ec
target: arm64ec-pc-windows-msvc
runner: windows-11-arm
artifact: rd_pipe-arm64ec
toolchain: beta
- name: arm64x-on-arm64
target: aarch64-pc-windows-msvc
runner: windows-11-arm
artifact: rd_pipe-arm64x
toolchain: beta
- name: arm64x-on-arm64ec
target: arm64ec-pc-windows-msvc
runner: windows-11-arm
artifact: rd_pipe-arm64x
toolchain: beta

steps:
- uses: actions/checkout@v7

- name: Install rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.toolchain }}
toolchain: stable
target: ${{ matrix.target }}

- uses: Swatinem/rust-cache@v2
Expand Down Expand Up @@ -124,24 +118,20 @@ jobs:
include:
- target: i686-pc-windows-msvc
suffix: x86
toolchain: stable
- target: x86_64-pc-windows-msvc
suffix: x64
toolchain: stable
- target: aarch64-pc-windows-msvc
suffix: arm64
toolchain: beta
- target: arm64ec-pc-windows-msvc
suffix: arm64ec
toolchain: beta

steps:
- uses: actions/checkout@v7

- name: Install rust
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.toolchain }}
toolchain: stable
target: ${{ matrix.target }}

- uses: Swatinem/rust-cache@v2
Expand Down
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Changed

- The arm64, arm64ec and arm64x CI targets build on `stable` instead of
`beta`, now that the arm64ec TLS-destructors→FLS fix
(rust-lang/rust#148799) has reached stable in Rust 1.98.0. Every CI
target is on the same toolchain again, so the per-target `toolchain`
matrix key is gone.
- Declared a minimum supported Rust version of `1.98` for the whole
crate. The requirement originates with arm64ec — an ARM64X image built
without rust-lang/rust#148799 aborts at `0xc0000096` when its EC view
is loaded — but is enforced for every target so the failure is a clear
`requires rustc 1.98` message instead of a crash at DLL load.

## [0.9.0] - 2026-07-24

### Changed
Expand Down
6 changes: 3 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ The DLL is loaded into the RDP/Citrix client process and registered as an in-pro

## Build & Test

Windows + MSVC toolchain required. Cross-platform builds fail (`windows-core` is Windows-only).
Windows + MSVC toolchain required. Cross-platform builds fail (`windows-core` is Windows-only). MSRV is `1.98` (`rust-version` in `Cargo.toml`), set by the arm64ec requirement below and enforced for every target.

```
cargo build # debug
Expand All @@ -31,7 +31,7 @@ The `aarch64` + `arm64ec` staticlibs are linked into one ARM64X (hybrid) DLL by

One hard requirement:

- **Toolchain must be at least `beta` (was `nightly`).** `arm64ec` staticlibs built on a toolchain *without* the TLS-destructors→FLS fix (rust-lang/rust#148799) crash at `0xc0000096` when an ARM64X DLL is loaded from an x64 process on ARM64 Windows (rust-lang/rust#145154). The fix first landed in nightly `1.98.0` (2026-06-03) and, as of 2026-07-17, is in `beta` (`1.98.0-beta.4`, verified: beta contains merge `9c963eec`; arm64ec EC-view tests pass 15/15 on a `windows-11-arm` host). CI therefore uses `beta`. Once `1.98.0` reaches stable the arm64 path can move to `stable`. The `Test (arm64x-on-arm64ec)` job is the gate; it only runs on the `windows-11-arm` runner.
- **Toolchain must be at least `1.98.0` (was `beta`, before that `nightly`).** `arm64ec` staticlibs built on a toolchain *without* the TLS-destructors→FLS fix (rust-lang/rust#148799) crash at `0xc0000096` when an ARM64X DLL is loaded from an x64 process on ARM64 Windows (rust-lang/rust#145154). The fix landed in nightly `1.98.0` (2026-06-03) and rode the train through `beta` (`1.98.0-beta.4`, verified 2026-07-17: beta contains merge `9c963eec`; arm64ec EC-view tests pass 15/15 on a `windows-11-arm` host) into stable `1.98.0`. CI therefore uses `stable` for every target. The `Test (arm64x-on-arm64ec)` job is the gate; it only runs on the `windows-11-arm` runner.
Comment thread
LeonarddeR marked this conversation as resolved.

Link recipe (dynamic CRT, MSVC link.exe):
- Both per-arch staticlibs as explicit inputs (`rd_pipe.lib` arm64 + arm64ec)
Expand All @@ -41,7 +41,7 @@ Link recipe (dynamic CRT, MSVC link.exe):
- `/force:multiple` resolves duplicate `DllMain` (arm64 + arm64ec each define it, plus msvcrt's stub); msvcrt's stub wins but correctly chains through `_pRawDllMain` → user DllMain
- No SDK version constraint (both 26100 and 28000 work)

The script can be exercised on a Windows ARM64 host: build both staticlibs+DLLs (`cargo +beta build --release --target {aarch64,arm64ec}-pc-windows-msvc`), run the script, then validate the merged DLL with `RD_PIPE_DLL_PATH=<dll> cargo +beta nextest run --target {aarch64,arm64ec}-pc-windows-msvc -E 'binary(dll_smoke) or binary(dvc_emulation)'`.
The script can be exercised on a Windows ARM64 host: build both staticlibs+DLLs (`cargo build --release --target {aarch64,arm64ec}-pc-windows-msvc`), run the script, then validate the merged DLL with `RD_PIPE_DLL_PATH=<dll> cargo nextest run --target {aarch64,arm64ec}-pc-windows-msvc -E 'binary(dll_smoke) or binary(dvc_emulation)'`.

## Registration (DllInstall)

Expand Down
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ repository = "https://github.com/leonardder/rd_pipe-rs"
license = "AGPL-3.0-or-later"
categories = ["network-programming", "os::windows-apis"]
edition = "2024"
rust-version = "1.98"

[lib]
crate-type = ["cdylib", "staticlib"]
Expand Down
2 changes: 1 addition & 1 deletion readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ The pipe ACL is built from the caller's logon SID, so only the interactive user

## Building from source

Requires the MSVC Rust toolchain on Windows. Cross-platform builds are not supported.
Requires the MSVC Rust toolchain on Windows, version 1.98 or newer. Cross-platform builds are not supported.

```
cargo build
Expand Down
Loading