【发布时间】:2018-06-27 11:23:21
【问题描述】:
如何使用来自设备路径的驱动器号解析路径?
例如转换
\Device\HarddiskVolume4\Windows\System32\RuntimeBroker.exe
进入
C:\Windows\System32\RuntimeBroker.exe
假设HarddiskVolume4 映射到这台计算机上的C:。
我找到了this question,但我想在 C# 中使用它。
【问题讨论】:
-
您链接下的所有解决方案都不是最好的。清洁高效的任务解决方案 - 使用
IOCTL_MOUNTMGR_QUERY_POINTS。但我只能将其粘贴到 c++ 而不能粘贴到 c# -
在您的情况下,有一个逻辑驱动器“C:”安装点,但假设您可以使用
QueryDosDevice遍历驱动器号安装点通常是错误的。卷可以安装在文件夹中或只有“卷{GUID}”名称。我认为最简单的解决方案是在路径前加上“\\?\GLOBALROOT”;以最少的访问权限打开文件;并致电GetFinalPathNameByHandle尝试获取其VOLUME_NAME_DOS或VOLUME_NAME_GUID。否则,您需要如上所述通过DeviceIoControl查询“\\.\MountPointManager”IOCTL_MOUNTMGR_QUERY_POINTS。 -
@eryksun 这看起来很有趣。我会调查的!
-
取决于您需要的驱动器号名称形式。如果您需要拨打
CreateFileW- 您可以简单地添加“\\\\?\\GLOBALROOT”前缀。或使用NtOpenFile。但是,如果您需要在 shell api 中使用它 - 正确的方法是通过IOCTL_MOUNTMGR_QUERY_POINTS获得MOUNTMGR_MOUNT_POINT数组并找到DeviceName正是您路径的前缀。并将此前缀替换为SymbolicLinkName前缀,当它以MOUNTMGR_IS_DRIVE_LETTER形式出现时
标签: c# windows winapi path drive-letter