資訊: 瞭解裝置的名稱和符號連結

文章翻譯 文章翻譯
文章編號: 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 裝置名稱相關聯。範例程式碼,這份文件: 符號連結 」 一節中的將告訴您,如何執行這項操作。

若要獲得一個更好的瞭解如何物件管理員追蹤裝置及其他系統物件的名稱,您可以在平台 SDK 中檢視物件管理員命名空間,以 WinObj.exe 工具。

MS-DOS 裝置名稱

Win32 程式會使用磁碟機、 序列連接埠及他們的 MS-DOS 裝置名稱透過平行連接埠等裝置。磁碟機這些都是像 A: 和 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
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本: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