You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中创建Windows虚拟驱动器?(类似subst命令功能)

在Rust中实现Windows虚拟驱动器(类似subst命令)

Windows的subst命令本质依赖Win32底层API DefineDosDeviceW,Rust中没有专门的高层封装,但可以通过Win32绑定直接调用该API实现相同功能。

实现步骤

1. 添加依赖

在Cargo.toml中引入现代化的Win32绑定库windows:

[dependencies]
windows = { version = "0.52", features = ["Win32_System_Devices"] }

2. 核心代码实现

直接调用DefineDosDeviceW完成虚拟驱动器的挂载与卸载:

use windows::Win32::System::Devices::{DefineDosDeviceW, DDD_RAW_TARGET_PATH};
use windows::core::PCWSTR;

// 挂载虚拟驱动器:将目标路径映射为指定驱动器号
fn map_virtual_drive(drive_letter: &str, target_path: &str) -> Result<(), windows::core::Error> {
    // 格式化驱动器号为 "X:" 格式
    let drive_str = format!("{}:", drive_letter);
    // 转换为Windows API要求的宽字符格式
    let drive_wide = PCWSTR::from_raw(
        drive_str.encode_utf16().chain(Some(0)).collect::<Vec<_>>().as_ptr()
    );
    let target_wide = PCWSTR::from_raw(
        target_path.encode_utf16().chain(Some(0)).collect::<Vec<_>>().as_ptr()
    );

    // 调用Win32 API,DDD_RAW_TARGET_PATH表示按原始路径处理目标
    let result = unsafe {
        DefineDosDeviceW(DDD_RAW_TARGET_PATH, drive_wide, target_wide)
    };

    if result.as_bool() {
        Ok(())
    } else {
        Err(windows::core::Error::from_win32())
    }
}

// 卸载虚拟驱动器
fn unmap_virtual_drive(drive_letter: &str) -> Result<(), windows::core::Error> {
    let drive_str = format!("{}:", drive_letter);
    let drive_wide = PCWSTR::from_raw(
        drive_str.encode_utf16().chain(Some(0)).collect::<Vec<_>>().as_ptr()
    );

    // 传入空目标路径触发卸载操作
    let result = unsafe {
        DefineDosDeviceW(DDD_RAW_TARGET_PATH, drive_wide, PCWSTR::null())
    };

    if result.as_bool() {
        Ok(())
    } else {
        Err(windows::core::Error::from_win32())
    }
}

fn main() -> Result<(), windows::core::Error> {
    // 示例:将C:\Users映射为Z盘
    map_virtual_drive("Z", "C:\\Users")?;
    println!("虚拟驱动器Z:已挂载到C:\\Users");

    // 卸载示例(注释掉的代码)
    // unmap_virtual_drive("Z")?;
    // println!("虚拟驱动器Z:已卸载");

    Ok(())
}

关键说明

  • 执行挂载/卸载操作需要管理员权限,否则会返回权限错误
  • DDD_RAW_TARGET_PATH参数确保目标路径按原始字符串处理,避免API自动解析环境变量或相对路径
  • 代码中的unsafe块是因为直接调用Win32 API需要手动保证参数的安全性
  • 挂载的虚拟驱动器在系统重启后会失效,若需持久化,需修改注册表路径HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices
  • 驱动器号必须是未被占用的大写英文字母(A-Z)

内容的提问来源于stack exchange,提问作者Kerwin Bryant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 01:19:58