共用方式為


支援 UNC 命名和 MUP

本文說明網路重新導向器如何支援 統一命名慣例 (UNC) 命名和多個 UNC 提供者 (MUP)。

MUP 是系統提供的內核模式元件,負責處理 UNC 路徑:

  • 這有助於找出識別為使用 UNC 的網路資源。

  • 它會使用 UNC 名稱將所有遠端檔案系統存取通道傳送給能夠處理遠端檔案系統要求的網路重新導向器。 網路重新導向器是 UNC 提供者

當應用程式使用 UNC 路徑時,涉及 MUP;例如,命令列命令,例如:

notepad \\server\public\readme.txt

MUP 會從應用程式接收包含 UNC 名稱的命令。 它會將名稱傳送給每個已註冊的 UNC 提供者,以及安裝的任何其他網路提供者。 當 UNC 提供者將 UNC 名稱識別為自己的名稱時,MUP 會自動將該名稱的未來實例重新導向至該提供者。

在建立對應驅動器號的作業期間,不會牽涉到 MUP (例如 ,例如 “NET USE” 命令)。 相反地,網路重新導向器的多提供者路由器 (MPR) 和使用者模式 Windows 網路 (WNet) 提供者 DLL 會處理這項作業。 不過,使用者模式 WNet 提供者 DLL 可以在此作業期間直接與內核模式網路重新導向器驅動程序通訊。

針對符合 Windows Vista 中引進之重新導向器模型的網路重新導向器,即使使用對應的網路驅動器機,仍會涉及 MUP。 在對應的磁碟驅動器上執行的檔案作業會透過 MUP 傳送至網路重新導向器。 在此情況下,MUP 只會將作業傳遞至所涉及的網路重新導向器。

MUP 是mup.sys二進位檔的一部分,它也包含 DFS (分散式文件系統) 用戶端。

核心網路重新導向器通常也有使用者模式 WNet 提供者 DLL,可支援建立遠端資源的連線(例如,將驅動器號對應至遠端資源)。 MPR 是使用者模式 DLL,可根據對 WNet 提供者的查詢建立網路連線。 呼叫 MPR 是下列任何作業的結果:

  • net use x: \\server\share從命令提示字元發出的命令。

  • 從 Windows 檔案總管建立的網路驅動器號連線。

  • 直接呼叫 WNet 函式。

網路重新導向器必須向 MUP 註冊,才能處理 UNC 名稱。 可以有多個 UNC 提供者向 MUP 註冊。 這些 UNC 提供者可以是下列一或多個重新導向器:

  • 以 RDBSS 為基礎的網路迷你重新導向器,例如伺服器消息塊(SMB)重新導向器和 WebDAV 重新導向器。
  • 舊版重新導向器不是以 RDBSS 為基礎。

前置詞解析

MUP 會決定哪些提供者可以在名稱型作業中處理 UNC 路徑,通常是IRP_MJ_CREATE要求。 此判斷稱為「前置詞解析」。前置詞解析作業有兩個用途:

  • 導致前置詞解析的名稱型作業會路由傳送至宣告前置詞的提供者。 如果成功,MUP 可確保後續的句柄型作業(例如IRP_MJ_READ和IRP_MJ_WRITE)完全略過 MUP 的相同提供者。

  • 提供者及其宣告的前置詞會在 MUP 維護的前置詞快取中輸入。 針對後續的名稱型作業,MUP 會使用此前置詞快取來判斷提供者是否已宣告前置詞,然後再嘗試執行前置詞解析。 此前置詞快取中的每個項目都會在快取新增至快取之後,受到逾時(稱為 TTL)。 此逾時到期之後,會擲回項目,此時 MUP 會在後續的名稱型作業上針對此前置詞再次執行前置詞解析。

MUP 會發出向向向 MUP 註冊的網路重新導向器發出 IOCTL_REDIR_QUERY_PATH 要求,以執行前置詞解析。 IOCTL_REDIR_QUERY_PATH的輸入和輸出緩衝區是從非分頁集區配置。

網路重新導向器應該只允許此 IOCTL 的核心模式傳送者,方法是確認 IRP 結構的 RequesterMode 成員為 KernelMode

MUP 會 針對要求資訊使用 QUERY_PATH_REQUEST 結構。

UNC 提供者應該針對回應資訊使用 QUERY_PATH_RESPONSE 結構。

任何透過呼叫 FsRtlRegisterUncProvider,註冊為 MUP 之 UNC 提供者的舊版網路重新導向器(而非使用 RDBSS)都會收到IOCTL_REDIR_QUERY_PATH要求。

表示支持作為 UNC 提供者的網路迷你重新導向器會收到此前置詞宣告,就像是IRP_MJ_CREATE呼叫一樣。 此建立要求類似於使用者模式 CreateFile 呼叫,並已設定FILE_CREATE_TREE_CONNECTION旗標。 網络迷你重新導向器不會收到前置詞宣告作為 MRxLowIOSubmit[LOWIO_OP_IOCTL]呼叫。 針對前置詞宣告,RDBSS 會將 MRxCreateSrvCall 要求傳送至網路迷你重新導向器,然後呼叫 MRxSrvCallWinnerNotifyMRxCreateVNetRoot。 當網路迷你重新導向器向 RDBSS 註冊時,RDBSS 會複製網路迷你重新導向器的驅動程式分派數據表,以指向內部 RDBSS 進入點。 RDBSS 接著會針對網路迷你重新導向器在內部接收此IOCTL_REDIR_QUERY_PATH,並呼叫 MRxCreateSrvCall、MRxSrvCallWinnerNotifyMRxCreateVNetRoot。 原始 IOCTL_REDIR_QUERY_PATH IRP 包含在傳遞至 MRxCreateSrvCall 例程的 RX_CONTEXT 結構中。 此外,會修改傳遞至 MRxCreateSrvCall 之RX_CONTEXT中的下列成員:

  • 即使原始 IRP 已IRP_MJ_DEVICE_CONTROL,MajorFunction 成員仍會設定為IRP_MJ_CREATE。
  • PrefixClaim.SuppliedPathName.Buffer 成員會設定為 QUERY_PATH_REQUEST 結構的 FilePathName 成員。
  • PrefixClaim.SuppliedPathName.Length 成員會設定為 QUERY_PATH_REQUEST 結構的 PathNameLength 成員。
  • Create.NtCreateParameters.SecurityContext 成員會設定為 QUERY_PATH_REQUEST 結構的 SecurityContext 成員。
  • Create.ThisIsATreeConnectOpen 成員會設定為 TRUE。
  • Create.Flags 成員具有RX_CONTEXT_CREATE_FLAG_UNC_NAME位集。

如果網路迷你重新導向器想要查看前置詞宣告的詳細數據,它可以讀取傳遞至 MRxCreateSrvCall RX_CONTEXT中的這些成員。 否則,只要嘗試連線到伺服器共用,如果 MRxCreateSrvCall 呼叫成功,就會傳回STATUS_SUCCESS。 RDBSS 代表網路迷你重新導向器發出前置詞宣告。

有一種情況是網路迷你重新導向器可以直接接收此 IOCTL。 網路迷你重新導向器可以在向 RDBSS 初始化和註冊之前,先儲存其驅動程式分派數據表的複本。 呼叫 RxRegisterMinirdr 向 RDBSS 註冊之後,網路迷你重新導向器可以儲存 RDBSS 所安裝的新驅動程式分派數據表進入點複本,並還原其原始驅動程式分派數據表。 還原的驅動程式分派表需要修改,如此一來,在檢查網路迷你重新導向器感興趣的 IRP 之後,呼叫會轉送至 RDBSS 驅動程式分派進入點。 當驅動程式初始化 RDBSS 並呼叫 RxRegisterMinrdr 時,RDBSS 會透過網路迷你重新導向器的驅動程式分派數據表複製。 針對 rdbsslib.lib 連結的網路迷你重新導向器必須先儲存其原始驅動程式分派數據表,再從其 DriverEntry 例程呼叫 RxDriverEntry,以初始化 RDBSS 靜態庫,並在呼叫 RxRegisterMinrdr 之後還原其驅動程式分派數據表。 這是因為 RDBSS 會透過 RxDriverEntryRxRegisterMinrdr 例程中的網路迷你重新導向器分派表來複製。

REG_SZ ProviderOrder 登錄值會控制在前置詞解析期間查詢提供者的順序。 此值會儲存在下列機碼底下:

HKLM\System\CurrentControlSet\Control\NetworkProvider\Order

ProviderOrder 登錄值中的個別提供者名稱會以逗號分隔,沒有任何開頭或尾端空格符。

例如,這個值可能包含字串:

RDPNP,LanmanWorkstation,WebClient

假設有 UNC 路徑 \\server>\<<share>\<path,MUP> 會在 MUP 前置詞快取中找不到前置詞解析要求(例如\\server\share 或 \\server)。 MUP 會依下列順序將前置詞解析要求傳送給每個提供者,直到提供者宣告前置詞,或直到查詢所有提供者為止:

  1. TS 用戶端 (RDPNP)

  2. SMB 重新導向器 (LanmanWorkstation)

  3. WebDAV 重新導向器 (WebClient)

ProviderOrder 登錄值的變更需要在 MUP 中重新啟動才會生效。

MUP 會使用列出的每個提供者名稱,在下列登錄機碼下尋找提供者的登錄機碼:

HKLM\System\CurrentControlSet\Services\<ProviderName>

MUP 接著會讀取 NetworkProvider 子機碼下的 DeviceName 值,以尋找提供者將註冊的裝置名稱。 當提供者實際註冊時,MUP 會比對傳入的裝置名稱與已知提供者的裝置名稱清單。 然後,它會將提供者放在已排序的清單中,以便進行前置詞解析。 此清單中的提供者順序是以先前討論的 ProviderOrder 登錄值中指定的順序為基礎。

多提供者路由器 (MPR),使用者模式 DLL,根據對 WNet 提供者的查詢建立網路連線,也接受此提供者順序。

MUP 會串行發出前置詞解析要求,並在第一個提供者宣告前置詞時立即停止。 因此,在先前的範例中,如果 RDPNP 宣告前置詞,MUP 不會呼叫 SMB 或 WebDAV 重新導向器。

「序列前置詞解析」(與平行處理)可防止具有較低 ProviderOrder 優先順序的網路重新導向器造成較高 ProviderOrder 優先順序的網路重新導向器效能問題。 例如,假設有防火牆的遠端伺服器已設定為封鎖特定類型的 TCP/IP 封包(例如 HTTP 的存取),但允許其他人(例如 SMB 存取)。 在此情況下,即使SMB網路重新導向器設定為 ProviderOrder 值中的第一個提供者,並快速宣告前置詞,WebDAV 重新導向器可能會等待TCP 連線逾時,大幅延遲前置詞解析的完成。