4

我有一个应该与用户模式组件通信的(某种过滤器)驱动程序。它通过调用 创建一个设备对象IoCreateDevice,然后通过 为它创建一个所谓的 MS-DOS 符号链接,以便可以从用户模式代码(通过)IoCreateSymbolicLink访问它。CreateFile这或多或少是一种标准技术。驱动程序创建一个形式为 的符号链接\DosDevices\mydevicename,而用户模式代码打开一个名为\\.\mydevicename.

现在,当驱动程序在终端服务器会话的上下文中创建设备时,问题就开始了。创建的符号链接实际上属于本地会话目录,而我的用户模式服务在“零会话”的系统帐户下运行,它“看到”属于全局目录的符号链接。

在文档中提到通常没有问题,因为驱动程序大多在DriverEntryAddDevice函数的上下文中创建设备对象,这些设备对象保证在系统帐户下运行。但我的情况不同。而且我不想改变这一点,我真正需要的是能够在属于任何会话的任意线程的上下文中创建/销毁设备对象。

根据文档,有一种方法可以解决这个问题。驱动程序可能会坚持创建一个属于全局目录的符号链接,方法是这样命名:\DosDevices\Global\mydevicename. 此外,如果用户模式代码恰好在某个帐户下运行,它也可能会坚持在全局目录中查找链接,将文件命名为:\\.\Global\mydevicename. 虽然这通常不是必需的,但如果该符号在本地目录中不存在,则会在全局目录中自动检查。

我试过这个技巧:它对我不起作用。我使用的是 64 位的 Windows 2008R2。至今没有成功。我始终能够打开在系统帐户中创建的设备,但无法打开在另一个会话中创建的设备(错误代码是“找不到文件”)。我已经尝试了\Global在内核/用户模式下指定的所有组合和变体 - 到目前为止结果是相同的。

这让我怀疑还有一层符号隔离。也许 using\Global创建了一个全局会话范围的符号链接,但仍然不是系统范围的。

这有意义吗?有没有办法创建系统范围的符号链接?或者有没有办法打开一个符号链接属于另一个会话的文件?

编辑

感谢@Hans Passant。我已经尝试过 WinObj 实用程序来实际查看驱动程序实际创建的设备和符号链接。

乍一看,一切似乎都很好。我看到我的所有设备都在\Device目录下,所有符号链接都在\GLOBAL??. 符号链接指向正确的设备名称。

然而有一件事很奇怪。尝试从 WinObj 中查看设备属性:对于在零会话中创建的设备,这可以正常工作,但对于在其他会话中创建的设备 WinObj 响应错误:

  • 打开 \Device\mydevicename 时出错:系统找不到指定的文件。

因此,它会在其列表中显示此设备对象,但在尝试打开它时它“未找到”。很奇怪。但这解释了我的问题。但这真的很奇怪。

有任何想法吗?提前致谢。

4

1 回答 1

2

有一条\Sessions\N\DosDevices\路径,其中 N 是会话号。我没有尝试过,但它应该可以工作。

我还注意到 subst 和网络驱动器映射在 中创建符号链接\Sessions\0\DosDevices\ID\,其中 ID 是会话 ID。因此,您也可以检查该路径。

于 2012-12-11T15:03:11.133 回答