本地和全局 MS-DOS 设备名称
Microsoft基于 Windows NT 的操作系统的 Windows 2000 及更高版本维护 DosDevices 目录的多个版本。
在这些操作系统上,有一个全局 \DosDevices 目录和多个本地 \DosDevices 目录。 全局 \DosDevices 目录包含可见的系统范围的 MS-DOS 设备名称。 本地 \DosDevices 目录保存仅在特定本地 DosDevices 上下文中可见的 MS-DOS 设备名称。
本地 DosDevices 上下文如下所示。
在 Windows XP 及更高版本上,每个登录会话都有自己的本地 DosDevices 上下文。 系统线程和作为 LocalSystem 用户运行的任何线程都不会在本地 DosDevices 上下文中运行。
在 Windows 2000 上,每个终端服务器会话都有自己的本地 DosDevices 上下文。 作为控制台会话的一部分运行的任何线程都不会在本地 DosDevices 上下文中运行。
每个线程都有一个当前的 DosDevices 上下文,该上下文可以在线程的生存期内更改。 据说不在本地 DosDevices 上下文中运行的线程在全局 DosDevices 上下文中运行。 因此,系统帐户在全局 DosDevices 上下文中运行。
如果线程当前在本地 DosDevices 上下文中运行,则它创建的任何 MS-DOS 设备名称仅在本地 DosDevices 目录中创建。 因此,在本地 DosDevices 上下文中运行的线程不会影响在另一个本地 DosDevices 上下文或全局 DosDevices 上下文中运行的线程可见的 MS-DOS 设备名称。 例如,如果 Windows XP 或更高版本上的用户将网络驱动器装载为 X:,则不会影响 X 的含义 : 对于任何其他用户或整个系统。
在 Windows XP 及更高版本上,当对象管理器在 \DosDevices 中查找名称时,它会先搜索本地 \DosDevices 目录,然后搜索全局 \DosDevices 目录。 如果名称存在于这两个位置,则本地名称将隐藏全局名称。
在 Windows 2000 上,每当启动新的终端服务器会话时,系统会通过复制全局 \DosDevices 目录来生成本地 \DosDevices 目录。 对全局目录的任何后续更改都不会传播到本地目录。
必须在全局 \DosDevices 目录中创建其 MS-DOS 设备名称的驱动程序可以通过在保证在系统线程上下文(如 DriverEntry)中运行的标准驱动程序例程中创建其符号链接来执行此操作。 或者,全局 \DosDevices 目录可用作 \DosDevices\Global;驱动程序可以使用 \DosDevices\Global\DosDeviceName 的名称在全局目录中指定名称。
请注意,\DosDevices\Global 在不支持本地版本和全局版本的 \DosDevices(如 Windows 98/Me)的平台上不存在。 下面的代码示例创建一个全局符号链接,该链接适用于 Windows 98/Me 以及 Windows 2000 及更高版本的操作系统:
UNICODE_STRING deviceName; // Already initialized.
UNICODE_STRING symbolicLinkName; // Initializing below.
NTSTATUS status;
if (IoIsWdmVersionAvailable(1, 0x10)) {
// We're on Windows 2000 or later, so we use \DosDevices\Global.
RtlInitUnicodeString(&symbolicLinkName, L"\\DosDevices\\Global\\SymbolicLinkName");
} else {
// Windows 98/Me. We just use DosDevices.
RtlInitUnicodeString(&symbolicLinkName, L"\\DosDevices\\SymbolicLinkName");
}
status = IoCreateSymbolicLink(&symbolicLinkName, &deviceName);
if (!NT_SUCCESS(status)) {
/* Symbolic link creation failed. Handle error appropriately. */
}
驱动程序可以通过创建符号链接以响应 IOCTL,在本地 \DosDevices 目录中创建 MS-DOS 设备名称。 当特定本地 DosDevices 上下文中的线程发送 IOCTL 时,将从当前线程上下文中调用驱动程序的 DispatchDeviceControl 。
有关运行标准驱动程序例程的上下文的详细信息,请参阅 Dispatch 例程和 IRCL。
系统按如下所示区分本地 \DosDevices 目录:
在 Windows XP 及更高版本上,本地 \DosDevices 目录由 登录会话的访问令牌的 AuthenticationID 标识。 有关 AuthenticationID 的详细信息,请参阅 Microsoft Windows SDK 文档中TOKEN_STATISTICS结构的说明。
在 Windows 2000 上,本地 \DosDevices 目录由 终端服务器会话的 SessionId 标识。 有关 SessionId 的详细信息,请参阅 Windows SDK 文档中WTS_SESSION_INFO结构的说明。
Windows NT 4.0 终端服务器版本支持与 Windows 2000 完全相同的本地 \DosDevices 目录。