Winapi 如何检测两个文件是否在同一物理磁盘上?

Winapi 如何检测两个文件是否在同一物理磁盘上?,winapi,file-io,disk,Winapi,File Io,Disk,我想并行一些磁盘I/O,但如果我的文件在同一磁盘上,这将严重影响性能 请注意,在驱动程序和实际磁盘之间可能存在各种筛选器驱动程序,例如,两个文件可能位于不同的虚拟磁盘(VHD)上,但位于同一物理磁盘上 如何检测两个句柄是否引用同一物理磁盘上的文件(或分区,或其他内容) 如果这是不可能的——下一个最佳/最接近的选择是什么?这相当复杂,但第一步是从句柄获取卷名。您可以使用该功能在Vista或更高版本上执行此操作。如果需要支持早期Windows版本,可以使用 现在您已经有了文件名,您可以解析出驱动器号

我想并行一些磁盘I/O,但如果我的文件在同一磁盘上,这将严重影响性能

请注意,在驱动程序和实际磁盘之间可能存在各种筛选器驱动程序,例如,两个文件可能位于不同的虚拟磁盘(VHD)上,但位于同一物理磁盘上

如何检测两个
句柄是否引用同一物理磁盘上的文件(或分区,或其他内容)


如果这是不可能的——下一个最佳/最接近的选择是什么?

这相当复杂,但第一步是从句柄获取卷名。您可以使用该功能在Vista或更高版本上执行此操作。如果需要支持早期Windows版本,可以使用


现在您已经有了文件名,您可以解析出驱动器号或卷名,并使用已接受的答案中解释的方法

这相当复杂,但第一步是从句柄获取卷名。您可以使用该功能在Vista或更高版本上执行此操作。如果需要支持早期Windows版本,可以使用


现在您已经有了文件名,您可以解析出驱动器号或卷名,并使用已接受的答案中解释的方法

这是最简单的部分!)问题是它提供的是逻辑磁盘,而不是物理磁盘--磁盘顶部可能有一些虚拟化层(包括但不限于VHD文件),这可能会给您带来误报,不幸的是,它没有解决问题。@Mehrdad:我不知道你的解决方案有什么更好的地方可以从句柄中找到文件名。似乎与我建议的方法相同(我同意这是最简单的部分)。但你是对的,我的回答不能解决你的问题。我(错误地)理解VHD不会显示为\\.\PhysicalDriveX,但事实并非如此。进一步挖掘,我认为您不会找到一种方法来区分虚拟磁盘、物理磁盘和用户模式代码,因为虚拟化发生在如此低的级别。祝你好运。这是一个现在困扰着我的有趣问题。我提到“更好”的唯一原因是它不需要使用
QueryDosDevice
来搜索
\DosDevices
名称空间——它直接从装载管理器获取值。除此之外,是的,它几乎是一样的(你的优势是它可以与绕过装载管理器的程序一起工作,比如ImDisk)我想我可能也需要内核模式。。。但我也不确定在那里调用什么函数。(我知道这应该是可能的,因为该功能对于安全弹出设备是必要的。)感谢您的帮助!这是最简单的部分!)问题是它提供的是逻辑磁盘,而不是物理磁盘--磁盘顶部可能有一些虚拟化层(包括但不限于VHD文件),这可能会给您带来误报,不幸的是,它没有解决问题。@Mehrdad:我不知道你的解决方案有什么更好的地方可以从句柄中找到文件名。似乎与我建议的方法相同(我同意这是最简单的部分)。但你是对的,我的回答不能解决你的问题。我(错误地)理解VHD不会显示为\\.\PhysicalDriveX,但事实并非如此。进一步挖掘,我认为您不会找到一种方法来区分虚拟磁盘、物理磁盘和用户模式代码,因为虚拟化发生在如此低的级别。祝你好运。这是一个现在困扰着我的有趣问题。我提到“更好”的唯一原因是它不需要使用
QueryDosDevice
来搜索
\DosDevices
名称空间——它直接从装载管理器获取值。除此之外,是的,它几乎是一样的(你的优势是它可以与绕过装载管理器的程序一起工作,比如ImDisk)我想我可能也需要内核模式。。。但我也不确定在那里调用什么函数。(我知道这应该是可能的,因为该功能对于安全弹出设备是必要的。)感谢您的帮助!