win-drives 0.1.0

Low-level access to Windows physical drives and harddisk volumes via NT APIs, with no_std support
#![cfg(feature = "std")]

use std::io::Read;
use win_drives::PhysicalDrive;

#[test]
fn should_enumerate_drives() {
    for drive in PhysicalDrive::enumerate() {
        println!("{:?}", drive);
        println!("{:?}", drive.device_number());
    }
}

#[test]
fn physical_drive_zero_has_valid_geometry() {
    let drive = win_drives::PhysicalDrive::open(0)
        .expect("PhysicalDrive0 not accessible — are you running as Administrator?");

    let bps = drive.bytes_per_sector();
    assert!(
        bps.is_power_of_two(),
        "bytes_per_sector should be a power of two, got {bps}"
    );
    assert!(
        matches!(bps, 512 | 1024 | 2048 | 4096),
        "bytes_per_sector should be a standard size, got {bps}"
    );

    assert!(drive.cylinders() > 0, "cylinders must be > 0");
    assert!(drive.tracks_per_cylinder() > 0, "tracks_per_cylinder must be > 0");
    assert!(drive.sectors_per_track() > 0, "sectors_per_track must be > 0");

    let expected = drive.cylinders() as u64
        * drive.tracks_per_cylinder() as u64
        * drive.sectors_per_track() as u64
        * bps as u64;
    assert_eq!(drive.size(), expected, "size() must equal CHS * bytes_per_sector");

    let mt = drive.media_type();
    assert!(
        matches!(mt, 11 | 12),
        "media_type should be RemovableMedia (11) or FixedMedia (12), got {mt}"
    );
}

#[test]
fn can_read_first_sector() {
    let mut drive = PhysicalDrive::open(0)
        .expect("PhysicalDrive0 not accessible — are you running as Administrator?");

    let mut buf = vec![0u8; drive.bytes_per_sector() as usize];
    let n = drive.read(&mut buf).expect("read of first sector failed");

    assert_eq!(n, buf.len(), "should have read exactly one sector");
}