如何将事件日志中的设备详细信息(例如\ Device \ Harddisk1 \ DR1)映射到驱动器号,例如C:?

时间:2013-08-29 11:24:16

标签: winapi visual-c++ event-log

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

  1. NirSoft's DriveLetterView将驱动器号与\Device\HarddiskVolume%dDrive Letter列中的Device Path匹配。
  2. NirSoft's DriveLetterView

    1. SysInternals' WinObj将驱动器号与\Device\HarddiskVolume%d\Device\Harddisk%d\DR%dPhysicalDrive%d匹配。
    2. WinObj example

答案 1 :(得分:0)

更新@Dan-H 的回答:

DriveLetterView

NirSoft DriveLetterView 不显示 DR 编号,如 \Device\Harddisk1\DR1

但它确实显示了 \Device\HarddiskVolumeN\PhysicalDriveN 以及 X:\ 驱动器号

\Device\HarddiskN 数和 \PhysicalDriveN 数相同。

所以知道了,你可以从\Device\HarddiskN中取出\Device\HarddiskN\DRx号,然后查看DriveLetterView中对应的\PhysicalDriveN,然后查看对应的X:\盘符。< /p>

DriveLetterView showing DRx, PhysicalDriveN and VolumeV

WinOjb

WinObj 自 2014 年以来进行了一些改进。截至 2021 年 7 月 20 日,它已更新到 v3.10。

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

另请注意,对列进行排序对于查找信息非常有用。与新搜索一样。

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

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

  • \Device\HarddiskN\DRx
  • \PhysicalDriveN
  • Harddisk1Partition1
  • \Device\HarddiskVolumeN
  • X:\ 个驱动器盘符

WinObj showing \DeviceHarddiskN\DRx \VolumeV and X:\ drive letter

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

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