2

我进行了很多搜索以获得对引导扇区(主文件表)的写访问权限。我使用CreateFile了带有写访问参数的函数,如GENERIC_WRITE. 然后用SetFilePointerandWriteFile来写一个特定的内存地址。但我总是得到的是System.AccessViolationException(Windows 7)。我在这里做错了吗?

我想知道是否有任何替代 CreateFile-WriteFile 函数来获得对引导扇区的 wrtie 访问权限?

或者我在想是否有任何方法可以使用中断服务程序在 VC++ (C++/Cli) 中的特定磁盘扇区上写入?

4

1 回答 1

3

根据Microsoft KB,您必须CreateFile使用FILE_SHARE_READand FILE_SHARE_WRITEon调用"\\.\PhysicalDriveN",其中N是从零开始的物理驱动器索引。然后,您可以将整个驱动器作为一个大文件访问。您必须是您机器上的管理员才能使用此功能!

您可以使用具有这些设备名称的应用程序编程接口 (API) 打开物理或逻辑驱动器,CreateFile() 前提是您对驱动器具有适当的访问权限(即,您必须是管理员)。您必须同时使用 CreateFile() FILE_SHARE_READFILE_SHARE_WRITE标志才能访问驱动器。

一旦打开了逻辑或物理驱动器,您就可以对整个驱动器上的数据执行直接 I/O。执行直接磁盘 I/O 时,必须在设备扇区大小的倍数和扇区边界上查找、读取和写入。使用 IOCTL_DISK_GET_DRIVE_GEOMETRY 调用 DeviceIoControl() 以获取每个扇区的字节数、扇区数、每个磁道的扇区等等,以便您可以计算所需的缓冲区大小。

更新:我做了一些研究,我发现启动 Vista 你必须获得卷上的锁或卸载它。否则写入将失败。微软在文档中说:

如果您直接写入具有已安装文件系统的卷,则必须首先获得对该卷的独占访问权限。否则,您可能会导致数据损坏或系统不稳定,因为您的应用程序的写入可能会与来自文件系统的其他更改发生冲突,并使卷的内容处于不一致的状态。为防止出现这些问题,在 Windows Vista 及更高版本中进行了以下更改:

如果卷没有挂载的文件系统,或者如果以下条件之一为真,则对卷句柄的写入将成功:

  • 要写入的扇区是引导扇区。
  • 要写入的扇区位于文件系统空间之外。
  • FSCTL_LOCK_VOLUME您已使用或显式锁定或卸载卷FSCTL_DISMOUNT_VOLUME
  • 该卷没有实际的文件系统。(换句话说,它安装了一个 RAW 文件系统。)

如果以下条件之一为真,则磁盘句柄上的写入将成功:

  • 要写入的扇区不在卷的范围内。
  • 要写入的扇区属于已安装的卷,但您已使用FSCTL_LOCK_VOLUME或明确锁定或卸载该卷FSCTL_DISMOUNT_VOLUME
  • 要写入的扇区属于除 RAW 之外没有挂载文件系统的卷。
于 2012-10-17T07:08:33.747 回答