我有一个应该与用户模式组件通信的(某种过滤器)驱动程序。它通过调用 创建一个设备对象IoCreateDevice
,然后通过 为它创建一个所谓的 MS-DOS 符号链接,以便可以从用户模式代码(通过)IoCreateSymbolicLink
访问它。CreateFile
这或多或少是一种标准技术。驱动程序创建一个形式为 的符号链接\DosDevices\mydevicename
,而用户模式代码打开一个名为\\.\mydevicename
.
现在,当驱动程序在终端服务器会话的上下文中创建设备时,问题就开始了。创建的符号链接实际上属于本地会话目录,而我的用户模式服务在“零会话”的系统帐户下运行,它“看到”属于全局目录的符号链接。
在文档中提到通常没有问题,因为驱动程序大多在DriverEntry
或AddDevice
函数的上下文中创建设备对象,这些设备对象保证在系统帐户下运行。但我的情况不同。而且我不想改变这一点,我真正需要的是能够在属于任何会话的任意线程的上下文中创建/销毁设备对象。
根据文档,有一种方法可以解决这个问题。驱动程序可能会坚持创建一个属于全局目录的符号链接,方法是这样命名:\DosDevices\Global\mydevicename
. 此外,如果用户模式代码恰好在某个帐户下运行,它也可能会坚持在全局目录中查找链接,将文件命名为:\\.\Global\mydevicename
. 虽然这通常不是必需的,但如果该符号在本地目录中不存在,则会在全局目录中自动检查。
我试过这个技巧:它对我不起作用。我使用的是 64 位的 Windows 2008R2。至今没有成功。我始终能够打开在系统帐户中创建的设备,但无法打开在另一个会话中创建的设备(错误代码是“找不到文件”)。我已经尝试了\Global
在内核/用户模式下指定的所有组合和变体 - 到目前为止结果是相同的。
这让我怀疑还有一层符号隔离。也许 using\Global
创建了一个全局会话范围的符号链接,但仍然不是系统范围的。
这有意义吗?有没有办法创建系统范围的符号链接?或者有没有办法打开一个符号链接属于另一个会话的文件?
编辑:
感谢@Hans Passant。我已经尝试过 WinObj 实用程序来实际查看驱动程序实际创建的设备和符号链接。
乍一看,一切似乎都很好。我看到我的所有设备都在\Device
目录下,所有符号链接都在\GLOBAL??
. 符号链接指向正确的设备名称。
然而有一件事很奇怪。尝试从 WinObj 中查看设备属性:对于在零会话中创建的设备,这可以正常工作,但对于在其他会话中创建的设备 WinObj 响应错误:
- 打开 \Device\mydevicename 时出错:系统找不到指定的文件。
因此,它会在其列表中显示此设备对象,但在尝试打开它时它“未找到”。很奇怪。但这解释了我的问题。但这真的很奇怪。
有任何想法吗?提前致谢。