本地和全局 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 目录。