本地和全局 MS-DOS 设备名称

Microsoft Windows 2000 及更高版本的基于 Windows NT 的操作系统维护 DosDevices 目录的多个版本。

在这些操作系统上,有一个 全局\DosDevices 目录和多个 local\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

有关标准驱动程序例程运行上下文的详细信息,请参阅 调度例程和 IRQL

系统按如下所示区分本地 \DosDevices 目录:

  • 在 Windows XP 及更高版本上,登录会话访问令牌的 AuthenticationID 标识本地 \DosDevices 目录。 有关 AuthenticationID 的详细信息,请参阅 Microsoft Windows SDK 文档中TOKEN_STATISTICS结构的说明。

  • 在 Windows 2000 上,本地 \DosDevices 目录由终端服务器会话的 SessionId 标识。 有关 SessionId 的详细信息,请参阅 Windows SDK 文档中 WTS_SESSION_INFO 结构的说明。

Windows NT 4.0 终端服务器版本以与 Windows 2000 完全相同的方式支持本地 \DosDevices 目录。