【问题标题】:How to WriteFile to a PhysicalDrive (Windows 7) without getting ERROR_ACCESS_DENIED?如何在没有得到 ERROR_ACCESS_DENIED 的情况下将文件写入 PhysicalDrive (Windows 7)?
【发布时间】:2011-09-30 07:26:24
【问题描述】:

我正在尝试将测试模式写入已格式化 USB 驱动器的每个扇区。有一个逻辑驱动器(例如 h:)。此卷为 FAT 格式并包含要覆盖的数据。另外,我想覆盖整个物理驱动器。该程序以提升的用户权限运行。

首先我做了以下事情:

// from the drive letter "h:" I get the physical disk number using
// IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS => "\\.\PhysicalDrive2"

hDevice = ::CreateFile( "\\.\PhysicalDrive2", GENERIC_READ|GENERIC_WRITE, 
  FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL ); 

// get the number of available sectors with IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
// => ulNumberOfSectors

// now I try to write some sectors, e.g. 2 (I want to use a higher value):
WriteFile( hDevice, abBuffer, 2*512, &byteswritten, NULL );

WriteFile 的调用失败并显示ERROR_ACCESS_DENIED

如果我写一个扇区,它会起作用。

当我覆盖第一个扇区并重新插入设备时,Windows 想要对其进行格式化。在这种情况下,我的代码同时包含 2048 个扇区,而无需 ERROR_ACCESS_DENIED

我还按照CodeProject: WriteFile on Physical Drives with Windows 7 中的说明卸载了卷,但这并没有改变任何东西。显然该卷已卸载,因为它在 Windows 资源管理器中不再可见。

由于性能原因,我想写入多个扇区。我也担心可能会出现该领域的其他问题,因为我不完全理解这个问题。

有什么建议吗?

【问题讨论】:

  • 你以管理员身份运行?
  • @David:是的,我正在提升。

标签: windows winapi file-io windows-7


【解决方案1】:

我没有遇到不同WriteFile() 大小的问题,但我确实解决了

WriteFile(): 访问被拒绝<ERROR_ACCESS_DENIED/5> 到 '\.\physicaldriveX

在 Windows 7 中以管理员身份运行的设备(通常是 USB HDD/SSD)(提升权限)如下:

计算机管理 -> 磁盘管理:

  • 卷(H:在你的情况下)->右键单击->删除卷
  • 磁盘(在您的情况下为磁盘 2)-> 右键单击​​ -> 离线
  • 磁盘(在您的情况下为磁盘 2)-> 右键单击​​ -> 联机

之后,我可以毫无问题地写入“\.\physicaldriveX”。

我认为只要设备上有任何文件系统,Win7 就会锁定(与以前的 Windows 版本不同)物理设备以避免一致性问题。

【讨论】:

    【解决方案2】:

    您不能直接访问已挂载文件系统所拥有的驱动器扇区。

    Changes to the file system and to the storage stack to restrict direct disk access and direct volume access

    FSCTL_DISMOUNT_VOLUME 的文档描述了以下覆盖文件系统的顺序:

    1. 打开一个卷。
    2. 锁定音量。
    3. 格式化卷。
    4. 卸载卷。
    5. 解锁音量。
    6. 关闭音量手柄。

    您的模式编写操作将在步骤 3 中进行,而不是格式化。

    【讨论】:

      【解决方案3】:

      另一种方法是使用clean删除磁盘上的所有分区(和所有数据)

      C:\> diskpart
      Diskpart> list disk
      
      Diskpart> select disk N (where N is your disk number)
      
      Diskpart> clean
      
      Diskpart> exit
      

      【讨论】:

      • 你应该在你的帖子前加上一个警告,说明这是做什么的。执行此操作的经验不足的用户可以轻松擦除驱动器中的数据,而无需了解此命令的全部后果。
      猜你喜欢
      • 2011-08-24
      • 2017-06-24
      • 2021-10-30
      • 2016-01-10
      • 2011-02-02
      • 2020-11-20
      • 2011-01-20
      • 2016-04-14
      • 1970-01-01
      相关资源
      最近更新 更多