2011-07-07 35 views
7

我试图写一个测试模式到格式化USB驱动器的每个扇区。有一个逻辑驱动器(例如h :)。该卷是FAT格式的,包含要覆盖的数据。另外,我想覆盖整个物理驱动器。该程序正在提升用户权限下运行。如何在没有收到ERROR_ACCESS_DENIED的情况下将文件写入PhysicalDrive(Windows 7)?

首先,我做了以下内容:

// 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

而你以管理员身份运行? –

+0

@大卫:是的,我跑得很高。 –

回答

3

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

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

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

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

  • 容积(H:你的情况) - >右键 - >删除卷
  • 盘(磁盘2在你的情况下) - >右键 - >离线
  • 盘(磁盘2在你的情况) - >右键单击 - >在线

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

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

+0

我会看看这个,谢谢。 –

1

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

C:\> diskpart 
Diskpart> list disk 

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

Diskpart> clean 

Diskpart> exit 
+1

你应该在你的帖子前写上警告。这样做的缺乏经验的用户可以轻松地擦除驱动器中的数据,而不必知道此命令的全部分支。 – ScottN

相关问题