c++ - 如何将闪存驱动器设置为只读?

标签 c++ c winapi

我想在 C++ 中将 USB 闪存驱动器设置为只读。

我找到了一个使用 diskpart 并以文本文件作为参数的解决方案,但在命令提示符下这样做不起作用(而使用不带文本文件的 diskpart 则有效)。另外,如果可能的话,我想避免使用第三个文本文件。

我查看了 libusb,但发现其中没有任何内容可以将设备与其驱动器号链接起来(至少在 UI 中我需要它)。

我尝试过 SetFileAttributes,但它以“无效参数”错误结束。

我怎样才能做到这一点?

谢谢。

[编辑]:我正在使用 Win32。

最佳答案

您需要使用 IOCTL_DISK_SET_DISK_ATTRIBUTES 为此,还有 IOCTL_DISK_GET_DISK_ATTRIBUTES 供查询。

  1. 所以我们需要打开 "\\\\?\\PhysicalDrive<X>"FILE_READ_DATA|FILE_WRITE_DATA为集。查询访问可以是 任意
  2. 初始化 SET_DISK_ATTRIBUTES

    SET_DISK_ATTRIBUTES sda = { sizeof(sda), TRUE };// not sizeof(GET_DISK_ATTRIBUTES).as in documentation, this mistake 
    sda.AttributesMask = DISK_ATTRIBUTE_READ_ONLY;
    sda.Attributes = DISK_ATTRIBUTE_READ_ONLY;
    
  3. DeviceIoControl( hDevice, IOCTL_DISK_SET_DISK_ATTRIBUTES, &sda, sizeof(sda), 0, 0, 0);

但是这只能从 Windows 7 开始工作

关于c++ - 如何将闪存驱动器设置为只读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40676088/

相关文章:

c++ - 嵌套模板类的问题

c - 为什么我在第二次搜索文件时收到段错误错误?

windows - SetDefaultItem 的作用是什么?

c - 通过 RAW 套接字在虚拟 VLAN 接口(interface)上复制以太网帧

c# - 共享文件夹API

c++ - 使用 LibVLC 进行音频计量

c++ - 如何查询二进制文件的源代码版本

c++ - 编译器如何确定使用哪个函数?

c++ - 如何停止 gSOAP 操作

c - 我的代码在一个测试用例中失败了。我做错了吗?