CreateFile打开在另一个终端会话中创建的MS-DOS设备

CreateFile to open an MS-DOS device created in another terminal session

本文关键字:创建 MS-DOS 设备 会话 终端 另一个 CreateFile      更新时间:2023-10-16

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

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

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

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

我试过这个把戏:它对我不起作用。我使用的是Windows2008R2,64位。到目前为止没有成功。我始终能够打开在系统帐户中创建的设备,但无法打开在其他会话中创建的装置(错误代码为"找不到文件")。我已经尝试了在内核/用户模式下指定Global的所有组合和变体——到目前为止,结果是一样的。

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

这有道理吗?有没有一种方法可以创建全系统的符号链接?或者有没有办法打开一个符号链接属于另一个会话的文件?

编辑

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

乍一看一切都还可以。我在Device目录下看到我的所有设备,所有符号链接都在GLOBAL??下。符号链接指向正确的设备名称。

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

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

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

有什么想法吗?提前谢谢。

有一个SessionsNDosDevices路径,其中N是会话编号。我没有试过,但应该有效。

此外,我注意到子系统和网络驱动器映射在SessionsDosDevicesID中创建了符号链接,其中ID是会话ID。因此,您也可以检查该路径。