定义 MS-DOS 设备名称

MS-DOS 设备名称是指向 MS-DOS 设备路径的交汇点。 这些交汇点构成 MS-DOS 设备命名空间。 调用 DefineDosDeviceSetVolumeMountPoint 函数来创建和修改这些交汇点。 DeleteVolumeMountPoint 删除 由 SetVolumeMountPoint 创建的交汇点, DefineDosDevice 删除它创建的交汇点。

定义 MS-DOS 设备名称后,它仍对所有进程可见。

  • Windows 通过身份验证 ID 标识所有 MS-DOS 设备。 身份验证 ID 是创建时与每个登录会话关联的 LUID (本地唯一标识符) 。
  • MS-DOS 设备名称的可见性分为全局或本地,并通过将其包含在全局 MS-DOS 设备和本地 MS-DOS 设备命名空间中来定义。 所有用户都可以访问全局命名空间中 MS-DOS 设备的内容,并且本地命名空间中的 MS-DOS 设备的内容只能由其访问令牌包含与该本地 MS-DOS 设备命名空间关联的 AuthenticationID 的用户访问。

一台计算机一次只能存在多个本地 MS-DOS 设备命名空间和一个全局 MS-DOS 设备命名空间。

请注意,只有 LocalSystem 上下文中运行的进程才能调用 DefineDosDevice ,以在全局 MS-DOS 设备命名空间中创建 MS-DOS 设备。 此外,删除对特定 AuthenticationID 的上次引用时,将删除对应于特定 AuthenticationID 的本地 MS-DOS 设备命名空间。

当代码通过调用 QueryDosDevice 查询现有 MS-DOS 设备名称时,它首先搜索本地 MS-DOS 设备命名空间。 如果找不到它,函数将搜索全局 MS-DOS 设备命名空间。 当代码通过此函数查询所有现有的 MS-DOS 设备名称时,返回的名称列表取决于它是否在 LocalSystem 上下文中运行。 如果是这样,将仅返回全局 MS-DOS 设备命名空间中包含的 MS-DOS 设备名称。 否则,将返回全局和本地 MS-DOS 设备命名空间中的设备名称串联。 如果两个命名空间中都存在设备名称, QueryDosDevice 将返回本地 MS-DOS 设备命名空间中的条目。 这也适用于 GetLogicalDrives 和 GetLogicalDriveStrings 返回的所有 MS-DOS 设备名称的列表

请注意,可能会出现以下情况:

  1. 未在 LocalSystem 上下文中运行的用户 A 在相应的本地 MS-DOS 设备命名空间中创建设备名称,并且该设备名称不存在于全局 MS-DOS 设备命名空间中。
  2. 在 LocalSystem 上下文中运行的用户 B 在全局 MS-DOS 设备命名空间中创建相同的设备名称。

在这种情况下,用户 A 将无权访问全局 MS-DOS 设备命名空间中的设备名称,直到其本地 MS-DOS 设备命名空间中删除或重命名设备名称。 为了降低出现这种情况的可能性,应在全局 MS-DOS 设备命名空间中分配 MS-DOS 驱动器号,以 C: 开头,以 Z:结尾。 对于本地 MS-DOS 设备命名空间中 MS-DOS 驱动器号的分配,应反转此顺序。

如果未在 LocalSystem 上下文中运行,如果本地或全局 MS-DOS 设备命名空间中已存在该设备名称,则 DefineDosDevice 将不允许在本地 MS-DOS 设备命名空间中定义设备名称。 在调用 DefineDosDevice 之前调用 QueryDosDevice 以确定要定义的设备名称是否存在于 MS-DOS 设备命名空间中。

命名文件、路径和命名空间