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