【问题标题】:WINAPI: Get a List of Devices by their NT nameWINAPI:按 NT 名称获取设备列表
【发布时间】:2010-11-09 22:31:43
【问题描述】:

article 解释了如何使用QueryDosDevice 查询逻辑 DOS 名称的 NT 命名约定。它解释了如何使用DefineDosDevice 使用它们的 NT 命名约定添加和删除逻辑设备名称。文章解释了访问各种设备需要一个 DOS 名称。

"Win32 程序不能使用内部 要访问的 Windows NT 设备名称 设备,因为 Win32 子系统 和 Win32 API 需要更多 熟悉的驱动器号和 MS-DOS 设备名称,例如 A:、C:、COM1:、 和 LPT1"

我找到了这个interesting article,它获取了所有可用的 DOS 名称,然后使用函数 GetLogicalDriveString 查询 NT 名称。本文不解释如何返回所有已定义的设备 DOS 名称,只是驱动器。

但是,我想知道如何做相反的事情。我将如何获得 NT 设备名称列表。我不只是在寻找驱动器,而是在寻找所有设备。例如 LPT1COM1 是保留的 DOS 名称,它们对应于特定的 NT 名称。我想映射其他可能没有 DOS 名称的设备,以便我可以使用 WINAPI 函数CreateFile

如何获得所有与 DOS 名称相反的 NT 设备名称的列表?

【问题讨论】:

  • 如果不使用 Windows 驱动程序开发工具包,这是否可能?如果可能的话,我想继续使用常规的 WINAPI。

标签: c winapi device


【解决方案1】:

DosDevice 的底层是 NT 对象管理器数据库中指向底层设备的符号链接。我建议与WinObj 一起玩,以了解事物是如何组合在一起的。

不幸的是,要自己进行枚举并添加自己的自定义符号链接,您需要使用本机 NT api(请参阅this 了解枚举内容)。有时您可以使用 DefineDosDevice 函数来做一些映射,但如果您只想通过 CreateFile 访问对象,则实际上不需要这样做。您可以使用 NT 本机转义语法访问 NT 对象管理器数据库中的任何内容,只需在您的 native 路径前加上 \\?\GLOBALROOT 并将其传递给 CreateFile,例如如果你想访问软盘驱动器,请使用CreateFile(L"\\?\GLOBALROOT\Device\Floppy0", ...);

【讨论】:

  • 如果符号链接不存在怎么办?我想动态创建符号链接。也许为每个设备创建一个符号链接。
  • 就是缓冲区设置为 OBJECT_DIRECTORY_INFORMATION 'Device' 的 NtQueryDirectoryObject
【解决方案2】:

QueryDosDevice 的文档提及:

lpDeviceName - 此参数可以为 NULL。在这种情况下,QueryDosDevice 函数会将所有现有 MS-DOS 设备名称的列表存储到 lpTargetPath 指向的缓冲区中。

lpTargetPath - 如果 lpDeviceName 为 NULL,该函数检索所有现有 MS-DOS 设备名称的列表。存储到缓冲区中的每个以 null 结尾的字符串都是现有 MS-DOS 设备的名称,例如 \Device\HarddiskVolume1 或 \Device\Floppy0。

那么你有没有尝试过:

QueryDosDevice(NULL, buffer, buffer_size);

这应该会为您提供缓冲区中的设备名称列表。

【讨论】:

  • 对于 MS-DOS 名称,这绝对比 GetLogicalDriveStrings 好,但它不返回 NT 名称。
  • @Shiftbit:你还在寻找什么其他设备?
【解决方案3】:

您正在寻找的 API 是 WMI。顺便说一句,这也已经回答了:How do I list device types using WMI?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
相关资源
最近更新 更多