我正在尝试将测试模式写入格式化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资源管理器中不再可见。
由于性能原因,我想写一个以上的扇区。我也担心可能会出现该领域的其他问题,因为我不完全了解这个问题。
有什么建议吗?
答案 0 :(得分:3)
我没有遇到不同WriteFile()
尺寸的问题,但我确实解决了
Windows 7中以<管理员身份运行的设备(通常是USB HDD / SSD)(提升权限),如下所示:WriteFile():拒绝访问
<ERROR_ACCESS_DENIED/5>
“\。\ physicaldriveX
计算机管理 - &gt;磁盘管理:
之后,我可以毫无问题地写'\。\ physicaldriveX'。
我认为只要设备上有任何文件系统,Win7就会锁定(与以前的Windows版本不同)物理设备,以避免出现一致性问题。
答案 1 :(得分:2)
您无法直接访问已安装文件系统所拥有的驱动器扇区。
FSCTL_DISMOUNT_VOLUME
的文档描述了覆盖文件系统的以下顺序:
您的模式编写操作将在步骤3而不是格式化。
答案 2 :(得分:1)
另一种方法是使用clean
删除磁盘上的所有分区:
C:\> diskpart
Diskpart> list disk
Diskpart> select disk N (where N is your disk number)
Diskpart> clean
Diskpart> exit