您知道 - 在 C++ 中,您可以通过在调用 CreateFile 函数时将其路径作为第一个参数传递来获取 I/O 设备的句柄。但我想知道 CreateFile 如何通过给定的路径定位和识别设备。有一天,我使用 WinObj 实用程序发现了一些关于这个主题的东西,这可能是真的。
在 WinObj 中,有一个名为Global??的目录。它位于根目录下,可以在左侧窗格中看到。该目录包含许多“SymbolicLink”类型的项目。
当您将 I/O 设备的路径(例如“\.\C:”或“\.\Changer0”)作为CreateFile函数调用中的第一个参数传递时,CreateFile 函数会解析出路径并删除“\ .\" 从中找到路径的一部分。与该部分同名的 SymbolicLink 目录。然后它找到符号链接所引用的地址,即主物理设备对象名称(例如,“\Device\CdRom0”)。
那么,我的发现是真的吗?设备是否包含在Global 中?目录只有该CreateFile功能可以打开的设备?顺便提一下:不是Global 中的所有项目?目录指的是一个设备,我猜。
我的问题的第二部分
有一天,我想通过向显示器发送IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS控制代码以编程方式降低显示器的屏幕亮度。问题是我不知道为CreateFile函数的第一个参数指定什么。所以我做了以下事情:
- 我打开设备管理器,在列表中找到了我的监控设备。该设备的名称是“通用非即插即用监视器”。
- 我右键单击该列表项并单击Properties。
- 在“属性”窗口中,我单击了“详细信息”选项卡。然后我从属性下拉列表中选择物理设备对象名称。
- 在值部分,我找到了文本“\Device\0000006f”。
- 在 WinObj 中,我搜索了Global?? 引用“\Device\0000006f”的 SymbolicLink 目录。该 SymbolicLink 的名称很长:
DISPLAY#Default_Monitor#5&1193a8c7&0&UID100663553#{866519b5-3f07-4c97-b7df-24c5d8a8ccb8}
- 然后我在前面提到的 SymbolicLink 名称前放了一个“\.\”,并将其指定为
CreateFile函数的第一个参数。
关于如何以编程方式完成所有这些操作的任何想法?我的意思是,我希望我的程序本身能够获取lpFileName参数的值。不是我把这个字符串直接放在我程序的源代码中。