diff --git a/CHANGELOG.md b/CHANGELOG.md index cf473ce..320d666 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## 0.7.2 (2026-04-11) + +### Windows support + +- **SPTI backend** (`scsi/windows.rs`) — SCSI_PASS_THROUGH_DIRECT via DeviceIoControl +- **Windows drive discovery** (`drive/windows.rs`) — scans CdRom0-15 + drive letters +- **Platform file separation** — `drive/unix.rs` and `drive/windows.rs`, no inline cfg branches +- **CI** — `cargo check` on windows-latest, actions/checkout@v5 + +### Test suite + +- **177 tests** (was 64) — MPLS, CLPI, H.264, HEVC, AC3, VC1, DTS, TrueHd, PGS, EBML, UDF, disc scanning, streams +- **FEATURES.md** created + +### Improvements + +- **Stable download URLs** — `/latest/download/freemkv-x86_64-unknown-linux-musl.tar.gz` works forever + ## 0.7.1 (2026-04-11) ### SectorReader trait diff --git a/Cargo.toml b/Cargo.toml index 02595bd..2f78633 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "libfreemkv" -version = "0.7.1" +version = "0.7.2" edition = "2021" license = "AGPL-3.0-only" description = "Open source raw disc access library for optical drives" diff --git a/src/scsi/windows.rs b/src/scsi/windows.rs index b92cb24..6a2ae9b 100644 --- a/src/scsi/windows.rs +++ b/src/scsi/windows.rs @@ -87,6 +87,19 @@ pub struct SptiTransport { handle: isize, } +/// Normalize a device path to Windows \\.\X: format. +fn normalize_device_path(path: &str) -> String { + if path.starts_with("\\\\.\\") { return path.to_string(); } + let trimmed = path.trim_end_matches('\\'); + if trimmed.len() == 2 && trimmed.as_bytes()[1] == b':' { + return format!("\\\\.\\{}", trimmed); + } + if path.to_lowercase().starts_with("cdrom") { + return format!("\\\\.\\{}", path); + } + format!("\\\\.\\{}", path) +} + impl SptiTransport { pub fn open(device: &Path) -> Result { let dev_str = device.to_str().ok_or_else(|| Error::DeviceNotFound {