信息: 了解设备名称和符号链接

文章翻译 文章翻译
文章编号: 235128 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

设备 (如硬盘、 串行的端口和并行端口有一个内部的 Windows NT 设备名称和 (可选) 可能具有的 MS-DOS 设备名称。这些名称放在 Windows NT 对象管理器的命名空间中。尽管 Windows NT 本身和内核模式驱动程序需要使用 NT 设备名称,Win32 程序必须使用 MS-DOS 设备名称。MS-DOS 设备名称是基础的 NT 设备名称的符号链接。本文介绍了设备名称、 符号的链接和 Win32 程序可以创建和删除符号链接的方式。

更多信息

内部的 NT 设备名称

当加载一个内核模式设备驱动程序,将其初始化例程注册设备名称与 Windows NT 的对象管理器。此名称被称为 Windows NT 设备名称。 Windows NT 和内核模式驱动程序的内核模式组件引用按 Windows NT 设备名称的设备。这些名称有 \Device\CDRom0 和 \Device\Serial0 之类的格式,并且也存在 \device 目录下的对象管理器的命名空间。

Win32 程序不能使用内部的 Windows NT 设备名称,来访问设备,因为 Win32 子系统和 Win32 API 要求更熟悉的驱动器号和 A:,C:,COM1 等的 MS-DOS 设备名称:,和 LPT1:。尽管 Win32 程序可能不会使用 Windows NT 设备名称,它们将但是,可以定义并删除访问设备的 MS-DOS 设备名称。他们还可以检索内部 Windows NT 设备名称相关联的 MS-DOS 设备名称。本文的"符号链接"部分中的代码示例说明如何执行此操作。

若要获得更好地了解对象管理器如何跟踪设备和其他系统对象的名称,您可以查看对象管理器的命名空间与 WinObj.exe 工具平台 SDK 中。

MS-DOS 设备名称

Win32 程序使用设备 (例如驱动器、 串行的端口和并行端口到它们的 MS-DOS 设备名称。磁盘驱动器它们 (如 A:[NULL] 和 C:的驱动器号。 串行和并行端口的这些是 COM1 类似的名称:,COM2:,和 LPT1:。与 Windows NT 设备的名称一样这些名称驻留在对象管理器的命名空间中但在该 \ 概览目录是用户模式 Win32 程序可见的。

使 MS-DOS 设备名称不同于 Windows NT 设备名称是它们不使用由 Windows NT 内核模式驱动程序。其目的在于: 请参阅 Windows NT 设备名称以便 Win32 程序可以使用熟悉的驱动器号和设备的名称 ; 例如对于 COM1:、 访问 Windows NT 设备。因此,MS-DOS 设备名称被称为"符号的链接"到 Windows NT 设备名称。也就是一个 MS-DOS 设备名称在管理器中存在对象的 \ 概览目录,并指向对象管理器的 \device 目录中的 Windows NT 设备名称。

每个 MS-DOS 设备名称可以指向最多一个内部 Windows NT 设备。但是,多个 MS-DOS 设备名称可以指向单个设备。例如对于虽然 C:只可以指向单个分区,则可以有两个或多个驱动器号,例如 d:、 e:,和 Z:,指向相同的分区。

符号链接

因为它们存储在注册表中的各计算机重新启动间保持由系统创建符号链接。程序也可能与 DefineDosDevice() API 创建符号链接。 仅在计算机重新启动或关闭,除非其中包含有关链接的信息的注册表项被更新之前,这些链接都有效。

可以有多个 Windows NT 设备名称的符号链接。但是,只有 MS-DOS 设备名称跨保持最初分配给内置的 Windows NT 设备在系统重新启动。因此,就可以创建将多个驱动器号指派给一个单一的 CD-ROM 驱动器的其他符号链接,但在其他驱动器字母只保持,直到关闭或重新启动计算机。

Win32 程序可以检索与特定的 MS-DOS 设备名称通过调用 QueryDosDevice() 与 MS-DOS 设备名称相关联的 Windows NT 设备名称。下面是示例代码显示如何执行此操作:
char szNtDeviceName[MAX_PATH];

if (QueryDosDevice ("C:", szNtDeviceName, MAX_PATH))
{
   printf ("C: is linked to %s\n", szNtDeviceName);
}
				
Win32 程序可以创建并通过调用 DefineDosDevice() 删除符号链接。若要进行一个符号链接呼叫 DefineDosDevice DDD_RAW_TARGET_PATH 标志。 若要去符号链接 DDD_REMOVE_DEFINITION 和 DDD_RAW_TARGET_PATH 标志与调用它。下面的示例程序演示了这两种这些操作:
/*
   DDD

      This sample shows how to associate an MS-DOS device name with a 
      Windows NT device name. The association is a symbolic link between
      device names stored in the Object Manager's namespace. Applications
      use the MS-DOS device name, but Windows NT and kernel-mode drivers
      use the Windows NT device name.  

   Usage:
      ddd <MS-DOS Device Name> <NT Device Name>
      ddd -r <MS-DOS Device Name>

   NOTE: If the MS-DOS device name is a driver letter, the trailing 
   backlash is not accepted by DefineDosDevice or QueryDosDevice.

   NOTE: The MS-DOS device name is defined only until the computer is 
   restarted.

   To make the drive letter associations permanent on Window NT 4.0, you
   have to update HKEY_LOCAL_MACHINE\SYSTEM\DISK\Information. However, 
   the contents of the value are undocumented. 

   On Windows 2000, you have to use the Volume Mount Point APIs.
*/ 

#define WIN32_LEAN_AND_MEAN /* Reduce number of system headers parsed */ 
                            /* during build. */ 

#include <windows.h>
#include <stdio.h>

void main (int argc, char **argv)
{
   char * pszDosDeviceName,
        * pszNtDeviceName;

   bool  fRemoveDeviceName = false;
   bool  fResult;

   /*
      Command-line parsing.
        1) Make sure correct number of arguments are supplied.
        2) See if you should add or remove the MS-DOS Device Name.
   */ 
   if (argc != 3)
   {
      printf("\nusage: %s <DOS device name> <NT device name>    to add\n",
             argv[0]);
      printf("usage: %s [-r] <DOS device name>                to remove\n",
             argv[0]);
      printf("\n\texample: %s d: \\device\\cdrom0\n", argv[0]);
      return;
   }

   fRemoveDeviceName = !lstrcmpi (argv[1], "-r");


   /* Now, add/remove the DOS device name. */ 
   if (fRemoveDeviceName)
   {
      /*
         Remove the MS-DOS device name. First, get the name of the Windows
         NT device from the symbolic link, then delete the symbolic link.
         
      */ 
      pszDosDeviceName = argv[2];

      pszNtDeviceName = (char *)LocalAlloc (LPTR, MAX_PATH);

      fResult = QueryDosDevice (pszDosDeviceName, pszNtDeviceName,
                                MAX_PATH);
      if (fResult)
      {
         fResult = DefineDosDevice (DDD_RAW_TARGET_PATH|
                                    DDD_REMOVE_DEFINITION|
                                    DDD_EXACT_MATCH_ON_REMOVE,
                                    pszDosDeviceName, pszNtDeviceName);
      }
      if (!fResult)
         printf("error %lu: could not remove %s\n",
                GetLastError(), pszDosDeviceName);

      LocalFree (pszNtDeviceName);
   }
   else
   {
      /* Add the DOS device name */ 

      pszDosDeviceName = argv[1];
      pszNtDeviceName  = argv[2];

      fResult = DefineDosDevice (DDD_RAW_TARGET_PATH, pszDosDeviceName,
                                 pszNtDeviceName);
      if (!fResult)
         printf("error %lu: could not link %s to %s\n",
                GetLastError(), pszDosDeviceName, pszNtDeviceName);
   }

}
				

属性

文章编号: 235128 - 最后修改: 2006年11月21日 - 修订: 4.1
这篇文章中的信息适用于:
  • Microsoft Win32 Application Programming Interface?当用于
    • Microsoft Windows NT 4.0
    • the operating system: Microsoft Windows 2000
    • the operating system: Microsoft Windows XP
关键字:?
kbmt kbinfo kbkernbase KB235128 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 235128
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com