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

ur.*_*ur. 7 windows file-io winapi 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 );
Run Code Online (Sandbox Code Playgroud)

呼叫WriteFile失败了ERROR_ACCESS_DENIED.

如果我写一个扇区,它就可以了.

当我覆盖第一个扇区并再次插入设备时,Windows希望对其进行格式化.在这种情况下,我的代码与2048个扇区一起工作没有ERROR_ACCESS_DENIED.

我还卸载了CodeProject中描述的卷:使用Windows 7的物理驱动器上的WriteFile,但这并没有改变任何东西.显然,该卷已卸载,因为它在Windows资源管理器中不再可见.

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

有什么建议?

小智 3

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

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

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

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

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

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

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