From 7ef3bf6962eccc5747bb4f4ae58b944f027c729f Mon Sep 17 00:00:00 2001 From: Leonard de Ruijter Date: Tue, 28 Jul 2026 19:57:02 +0200 Subject: [PATCH 1/2] ci: build the arm64 targets on stable The arm64ec TLS-destructors->FLS fix (rust-lang/rust#148799) that forced the arm64, arm64ec and arm64x jobs onto beta has reached stable in Rust 1.98.0, so every CI target can share one toolchain again. With the pin gone the per-entry `toolchain` matrix key is uniform, so it is dropped in favour of a plain `toolchain: stable` on the install step. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/ci.yml | 14 ++------------ CHANGELOG.md | 8 ++++++++ CLAUDE.md | 4 ++-- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ba86ae3..788a483 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,32 +48,26 @@ 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 @@ -81,7 +75,7 @@ jobs: - name: Install rust uses: dtolnay/rust-toolchain@master with: - toolchain: ${{ matrix.toolchain }} + toolchain: stable target: ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 @@ -124,16 +118,12 @@ 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 @@ -141,7 +131,7 @@ jobs: - name: Install rust uses: dtolnay/rust-toolchain@master with: - toolchain: ${{ matrix.toolchain }} + toolchain: stable target: ${{ matrix.target }} - uses: Swatinem/rust-cache@v2 diff --git a/CHANGELOG.md b/CHANGELOG.md index d2538f9..581fb2d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,14 @@ 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. + ## [0.9.0] - 2026-07-24 ### Changed diff --git a/CLAUDE.md b/CLAUDE.md index 6a16d37..d3542d9 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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. Link recipe (dynamic CRT, MSVC link.exe): - Both per-arch staticlibs as explicit inputs (`rd_pipe.lib` arm64 + arm64ec) @@ -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= 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= cargo nextest run --target {aarch64,arm64ec}-pc-windows-msvc -E 'binary(dll_smoke) or binary(dvc_emulation)'`. ## Registration (DllInstall) From fee73b64077bf924fc707f8d64713211ccb276ee Mon Sep 17 00:00:00 2001 From: Leonard de Ruijter Date: Tue, 28 Jul 2026 20:09:56 +0200 Subject: [PATCH 2/2] build: declare an MSRV of 1.98 The arm64ec TLS-destructors->FLS fix (rust-lang/rust#148799) that this crate needs first ships in Rust 1.98.0. Declaring it as `rust-version` turns a too-old toolchain into a clear "requires rustc 1.98" resolver error instead of an 0xc0000096 abort when the ARM64X EC view is loaded. The floor is enforced for every target, not just arm64ec, so there is one supported-toolchain answer for the whole crate. Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 5 +++++ CLAUDE.md | 2 +- Cargo.toml | 1 + readme.md | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 581fb2d..eb38b31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 (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 diff --git a/CLAUDE.md b/CLAUDE.md index d3542d9..6747885 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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 diff --git a/Cargo.toml b/Cargo.toml index 7731f61..fc77311 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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"] diff --git a/readme.md b/readme.md index ce22402..ddb0cf3 100644 --- a/readme.md +++ b/readme.md @@ -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