根据Microsoft KB,您必须CreateFile
使用FILE_SHARE_READ
and FILE_SHARE_WRITE
on调用"\\.\PhysicalDriveN"
,其中N
是从零开始的物理驱动器索引。然后,您可以将整个驱动器作为一个大文件访问。您必须是您机器上的管理员才能使用此功能!
您可以使用具有这些设备名称的应用程序编程接口 (API) 打开物理或逻辑驱动器,CreateFile()
前提是您对驱动器具有适当的访问权限(即,您必须是管理员)。您必须同时使用
CreateFile()
FILE_SHARE_READ
和FILE_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 之外没有挂载文件系统的卷。