WINAPI:按名称获取设备列表

时间:2010-11-09 22:31:43

标签: c winapi device

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

  

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

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

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

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

3 个答案:

答案 0 :(得分:5)

在引擎盖下,DosDevice是NT对象管理器数据库中指向底层设备的符号链接。我建议玩WinObj来了解事情的组合方式。

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

访问软盘驱动器

答案 1 :(得分:0)

QueryDosDevice的文档提及:

  

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

     

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

你有没有尝试过:

QueryDosDevice(NULL, buffer, buffer_size);

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

答案 2 :(得分:0)

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