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..eb38b31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/CLAUDE.md b/CLAUDE.md index 6a16d37..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 @@ -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) 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