c++ - 如何以编程方式区分 subst 命令创建的虚拟驱动器和实际可移动驱动器

标签 c++ windows winapi hook

当我们附加可移动驱动器时,操作系统会为其分配驱动器号。另一种方法是使用 subst 命令将本地文件夹映射到任何驱动器。 我正在编写资源管理器的 Hook ,我需要在其中区分这两个驱动器。 我尝试使用 GetVolumePathName,但它无法为虚拟驱动器正常工作。

最佳答案

我通过添加一个额外的验证步骤找到了问题的答案。

假设我将 c:\Folder1 映射到 z:。

我有一个路径 z:\file1.txt。如果我尝试使用 API GetVolumePathName() 获取挂载点,那么它会失败,所以我可以猜测 z:\只不过是指向其他驱动器中某个文件夹的虚拟驱动器。

但是如果我有一个路径 z:\Folder2\file1.txt,那么 GetVolumePathName() 会给我安装点作为 z:\Folder2。我不懂为什么。但是为了验证它是否真的指向任何设备卷,我使用了 API GetVolumeNameForVolumeMountPoint() 来获取上面返回的挂载点的卷名。如果挂载点用于任何设备,则它会返回该设备的实际卷名 GUID,否则它会失败(对于虚拟驱动器)。

现在要知道上面的挂载点返回是 FIXED 还是 REMOVABLE,如果它返回,请使用 GetDriveType() DRIVE_FIXED 那么它是固定驱动器 DRIVE_REMOVABLE 然后它是可移动的。

它解决了我的目的。

关于c++ - 如何以编程方式区分 subst 命令创建的虚拟驱动器和实际可移动驱动器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26968447/

相关文章:

windows - 确定事件窗口名称或 ID

python - 我无法在 Windows 10 的 cmd 中或在 kali linux 的终端中运行 .py 文件

C++ WINAPI 通过 GetProcAddress 调用导出函数

c++ - 使用抽象基来实现模板类的私有(private)部分?

c++ - 默认情况下是否创建 move 构造函数?

c++ - 使用空着色器程序绘制是否有效?

c++ - 如何使用 Windows API 列出目录中的文件?

windows - Windows MSI 可以安装多个包吗?

c++ - OSVERSIONINFOEX 中的最后内部版本号

c++ - 在 boost::test::unit_test 中查找内存泄漏