如何在不获取ERROR_ACCESS_DENIED的情况下将文件写入PhysicalDrive(Windows 7)?

时间:2011-07-07 09:29:24

标签: windows winapi file-io windows-7

我正在尝试将测试模式写入格式化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资源管理器中不再可见。

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

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

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

  

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

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

计算机管理 - &gt;磁盘管理:

  • 卷(H:在你的情况下) - &gt;右键单击 - &gt;删除卷
  • 磁盘(在您的情况下为磁盘2) - &gt;右键单击 - &gt;离线
  • 磁盘(在您的情况下为磁盘2) - &gt;右键单击 - &gt;在线

之后,我可以毫无问题地写'\。\ physicaldriveX'。

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

答案 1 :(得分: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. 关闭音量控制柄。
  7. 您的模式编写操作将在步骤3而不是格式化。

答案 2 :(得分:1)

另一种方法是使用clean删除磁盘上的所有分区:

C:\> diskpart
Diskpart> list disk

Diskpart> select disk N (where N is your disk number)

Diskpart> clean

Diskpart> exit