3

使用事件查看器,我可以看到事件日志中有诸如“驱动程序在 \Device\Harddisk1\DR1 上检测到控制器错误”之类的条目。和“驱动程序在 \Device\Harddisk1\DR7 上检测到控制器错误。”。

使用 VC++ 代码,我想将此设备路径(例如 \Device\Harddisk1\DR1)转换为驱动器号,例如 C:(只要适用)(我知道并非所有设备都会映射到驱动器号)。

使用FindFirstVolumeFindNextVolume我可以遍历所有卷,并且对于每个卷,我使用QueryDosDevice来获取设备名称和GetVolumePathNamesForVolumeName来获取驱动器号。

我遇到的问题是,当我使用上述方法获取设备名称时,我最终会得到设备名称,例如“\Device\HarddiskVolume3”、“\Device\HarddiskVolume2”等。我确实将这些映射到驱动器号。但是,我不确定这些如何映射到我在事件日志条目中看到的设备名称格式。

所以,总而言之,我的问题是:如何将设备名称格式“ \Device\HarddiskVolume%d ”映射到格式“ \Device\Harddisk%d\DR%d ”,其中每个 %d 都是一个数字。

4

2 回答 2

5

这不是 C++ 代码,但是用 C++ 编写的两个应用程序显示了此信息,至少可以检查您的结果。我不相信任何一个应用程序的来源都是现成的。

  1. NirSoft 的 DriveLetterView将驱动器号\Device\HarddiskVolume%dDrive LetterDevice Path列匹配。

NirSoft 的 DriveLetterView

  1. SysInternals 的 WinObj将驱动器号\Device\HarddiskVolume%d与.\Device\Harddisk%d\DR%dPhysicalDrive%d

WinObj 示例

于 2014-10-17T14:39:29.240 回答
0

更新@Dan-H 的答案:

DriveLetterView

NirSoft DriveLetterView不显示 DRnumber,如\Device\Harddisk1\DR1

但它确实显示了和\Device\HarddiskVolumeN驱动器号\PhysicalDriveNX:\

\Device\HarddiskN 号码和\PhysicalDriveN号码是一样的。

所以知道了,你可以\Device\HarddiskN从DriveLetterView中取数字\Device\HarddiskN\DRx看对应\PhysicalDriveN的,然后再看对应的X:\盘符。

DriveLetterView 显示 DRx、PhysicalDriveN 和 VolumeV

WinOjb

自 2014 年以来, WinObj有了一些改进。截至 2021 年 7 月 20 日,它现已升级到 v3.10。

注意,必须以管理员身份运行,否则它不会显示太多信息。

另请注意,对列进行排序对于查找信息非常有帮助。就像新的搜索一样。

GLOBAL??在左侧导航窗格中最有用。

GLOBAL??按列排序,Symbolic Link Target您可以映射

  • \Device\HarddiskN\DRx
  • \PhysicalDriveN
  • Harddisk1Partition1
  • \Device\HarddiskVolumeN
  • X:\驱动器号

WinObj 显示 \DeviceHarddiskN\DRx \VolumeV 和 X:\ 驱动器号

您还可以使用 WinObj 搜索来查找这些映射。

卷号与命令行工具不匹配diskpart;它有自己的卷编号方案。但是\PhysicalDriveNandHarddiskN似乎与diskpart编号匹配(但我会在依赖它之前确认)。

于 2021-07-20T23:50:17.100 回答