C WINAPI:按设备的NT名称获取设备列表

C WINAPI:按设备的NT名称获取设备列表,c,winapi,device,C,Winapi,Device,这说明了如何使用查询逻辑DOS名称以了解其NT命名约定。它解释了如何使用NT命名约定添加和删除逻辑设备名称。本文解释了访问各种设备需要一个DOS名称 “Win32程序无法使用内部 要访问的Windows NT设备名称 由于Win32子系统 而Win32 API则需要更多 熟悉的驱动器号和MS-DOS 设备名称,例如A:、C:、COM1:, 和LPT1“ 我发现它可以获取所有可用的DOS名称,然后使用函数查询NT名称。本文不解释如何返回设备的所有已定义DOS名称,只返回驱动器 然而,我想知道如何做

这说明了如何使用查询逻辑DOS名称以了解其NT命名约定。它解释了如何使用NT命名约定添加和删除逻辑设备名称。本文解释了访问各种设备需要一个DOS名称

“Win32程序无法使用内部 要访问的Windows NT设备名称 由于Win32子系统 而Win32 API则需要更多 熟悉的驱动器号和MS-DOS 设备名称,例如A:、C:、COM1:, 和LPT1“

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

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

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

要提及的文档:

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

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

那么您是否尝试过:

QueryDosDevice(NULL, buffer, buffer_size);

这应该会得到缓冲区中设备名称的列表。

在引擎盖下面,DOS设备是NT对象管理器数据库中指向底层设备的符号链接。我建议你玩游戏,去感受事物是如何组合在一起的


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

您正在查找的API是WMI。顺便提一下,这一点也已经得到了回答:

不使用Windows驱动程序开发工具包也能做到吗?如果可能的话,我希望使用常规的WINAPI。这肯定比MS-DOS名称的GetLogicalDriveStrings好,但它不会返回NT名称。@Shiftbit:您还需要什么设备?如果符号链接不存在怎么办?我想动态创建符号链接。可能需要为每个设备创建符号链接。即NtQueryDirectoryObject,其中缓冲区设置为OBJECT_DIRECTORY_INFORMATION'device'@Ha11owed,不是true:。瞧,WMI COM API!是的,你是对的,但他必须将其用作外部dll。