如何将文件写入物理驱动器(Windows 7)而不会收到ERROR_ACCESS_DENIED?

我试图写一个testing模式到格式化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, eg 2 (I want to use a higher value): WriteFile( hDevice, abBuffer, 2*512, &byteswritten, NULL ); 

WriteFile的调用失败,并返回ERROR_ACCESS_DENIED

如果我写一个部门,它的工作。

当我覆盖第一个扇区并重新插入设备时,Windows想格式化它。 在这种情况下,我的代码与2048扇区一起工作,没有ERROR_ACCESS_DENIED

我也卸载了物理驱动器与Windows 7 CodeProject:WriteFile中所述的卷,但这并没有改变任何东西。 很明显,该卷已卸载,因为它在Windows资源pipe理器中不再可见。

由于性能原因,我想写更多的单一部门。 我也担心这个领域的其他问题可能会发生,因为我没有完全理解这个问题。

有什么build议么?

Solutions Collecting From Web of "如何将文件写入物理驱动器(Windows 7)而不会收到ERROR_ACCESS_DENIED?"

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

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

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

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

  • 音量(H:在你的情况下) – >右键单击 – >删除音量
  • 磁盘(在你的情况下,磁盘2) – >右键单击 – >脱机
  • 磁盘(在你的情况下,磁盘2) – >右键单击 – >在线

之后,我可以写入'\。\ physicaldriveX',没有任何问题。

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

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

请参阅更改文件系统和存储堆栈以限制直接访问磁盘和直接访问卷

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

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

您的模式写入操作将在第3步,而不是格式化。

另一种方法是C:> diskpart Diskpart> list disk

Diskpart>选择磁盘N(其中N是您的磁盘号)

Diskpart>清理

Diskpart>退出