2012-10-17 63 views
2

我搜索了很多以获得写入 - 引导扇区(主文件表)的访问权限。我使用了CreateFile函数,写访问参数如GENERIC_WRITE。然后用SetFilePointerWriteFile写在一个特定的内存地址上。但我总是得到的是System.AccessViolationException(Windows 7)。我在这里做错了什么?VC++ - 如何获得写入NTFS引导扇区的权限?

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

或者我在想如果有任何方法使用Interrup服务例程在VC++(C++/Cli)中写入特定的磁盘扇区?

+0

ISR与.net?祝你好运。 – Dani

+0

http://www.codeproject.com/Questions/279229/Code-in-C-to-Access-the-master-boot-record-MBR – rkosegi

回答

3

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

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

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

更新:我做了一些研究,我发现了Vista的开始,你必须得在卷上的锁或卸除它。否则写入会失败。在the docs微软称:

如果直接写,有一个安装的文件系统卷,你 必须首先获得对卷的独占访问。否则,您可能会因为 应用程序的写入操作与来自 文件系统的其他更改相冲突而导致数据损坏或系统不稳定,从而导致数据损坏或系统不稳定,并且该卷的内容保留不一致的 状态,从而导致风险 。为防止出现这些问题,Windows Vista及更高版本中进行了以下更改 :

如果卷没有安装的文件系统,或者如果以下某个条件为真:

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

如果满足下列条件之一为真在磁盘手柄的写操作将成功:

  • 扇区写入做不在音量范围内。
  • 待写入的扇区位于已装入的卷内,但您已使用FSCTL_LOCK_VOLUMEFSCTL_DISMOUNT_VOLUME明确锁定或卸除卷。
  • 要写入的扇区位于未装入除RAW以外的文件系统的卷内。
+0

关于您的更新:这表示您不需要锁定/卸除如果你只是写引导扇区,只要你通过音量手柄书写音量,不是吗? – hvd

+0

@ hvd,原始问题中没有足够的信息。目前还不清楚OP是打开一个卷还是一个物理驱动器。他也可能错误地写入其他地区。锁定音量并查看问题是否消失很容易。 – detunized

+0

当然,虽然我没有看到如何尝试写入文件系统数据可能导致“AccessViolationException”:几乎可以肯定地指示不正确使用指针。 – hvd