共用方式為


IOCTL_REDIR_QUERY_PATH_EX IOCTL (ntifs.h)

從 Windows Vista 開始,多個 UNC 提供者 (MUP) 會將 IOCTL_REDIR_QUERY_PATH_EX 控制程式代碼傳送給網路重新導向器,以判斷哪一個提供者可以在名稱型作業中處理特定 UNC 路徑,通常是IRP_MJ_CREATE要求。 此要求稱為「前置詞解析」。

MUP 是一個核心模式元件,負責使用 UNC 名稱將所有遠端檔案系統存取通道傳送到能夠處理遠端檔案系統要求的網路重新導向器(UNC 提供者)。 使用 UNC 路徑時,會涉及 MUP,如下列範例所示,可從命令行執行:

notepad \\server\public\readme.txt

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

對於符合 Windows Vista 重新導向器模型的網路重新導向器,即使使用對應的網路驅動器機,也會牽涉到 MUP。 在對應的磁碟驅動器上執行的檔案作業會透過 MUP 傳送至網路重新導向器。 請注意,在此情況下,MUP 只會將作業傳遞至所涉及的網路重新導向器。

IOCTL_REDIR_QUERY_PATH_EX 控制程式代碼會藉由呼叫 FsRtlRegisterUncProviderEx,將已向 MUP 註冊為通用命名約定 (UNC) 提供者的網路重新導向器傳送。 可以有多個 UNC 提供者向 MUP 註冊。

前置詞解析作業有兩個用途:

  • 導致前置詞解析的名稱型作業會路由傳送至宣告前置詞的提供者。 如果成功,MUP 可確保後續的句柄型作業(例如,IRP_MJ_READ和IRP_MJ_WRITE)通過 MUP 至相同的提供者。 請注意,此行為與不符合 Windows Vista 重新導向器模型的網路重新導向器不同,這會針對前置詞解析傳送IOCTL_REDIR_QUERY_PATH。 對於不符合 Windows Vista 重新導向器模型的網路重新導向器,後續句柄型作業會完全略過 MUP。

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

主要程序代碼

IOCTL_REDIR_QUERY_PATH_EX

輸入緩衝區

IrpSp->Parameters.DeviceIoControl.Type3InputBuffer 會設定為包含要求的 QUERY_PATH_REQUEST_EX 數據結構。

輸入緩衝區長度

輸入緩衝區指向的 QUERY_PATH_REQUEST_EX 結構大小,以位元組為單位。

輸出緩衝區

IRP->UserBuffer 會設定為包含回應的 QUERY_PATH_RESPONSE 資料結構。

輸出緩衝區長度

輸出緩衝區指向的 QUERY_PATH_RESPONSE 結構大小,以位元組為單位。

輸入/輸出緩衝區

n/a

輸入/輸出緩衝區長度

n/a

狀態區塊

如果辨識 \\server\share 前置詞名稱,或設定為適當的 NTSTATUS 值,Status 成員會在成功時STATUS_SUCCESS,例如下列其中一項:

狀態代碼 意義
STATUS_BAD_NETWORK_NAME 遠端伺服器上找不到指定的共享名稱。 例如,計算機名稱 (\\server) 是有效的,但遠端伺服器上找不到指定的共享名稱。
STATUS_BAD_NETWORK_PATH 無法找到網路路徑。 例如,計算機名稱 (\\server) 無效,或網路重新導向器無法解析計算機名稱(使用任何可用的名稱解析機制)。
STATUS_INSUFFICIENT_RESOURCES 資源不足,無法配置緩衝區的記憶體。
STATUS_INVALID_DEVICE_REQUEST IOCTL_REDIR_QUERY_PATH_EX要求只應該來自 MUP,而且 IRP 結構的 RequestorMode 成員應該一律 KernelMode。 如果呼叫線程的要求者模式未 KernelMode,則會傳回此錯誤碼。
STATUS_INVALID_PARAMETER QUERY_PATH_REQUEST 結構中的 PathNameLength 成員超過 Unicode 字串允許的最大長度UNICODE_STRING_MAX_BYTES。
STATUS_LOGON_FAILURE或STATUS_ACCESS_DENIED 如果前置詞解析作業因為無效或不正確的認證而失敗,提供者應該傳回遠端伺服器傳回的確切錯誤碼;這些錯誤碼不得轉譯為STATUS_BAD_NETWORK_NAME或STATUS_BAD_NETWORK_PATH。 STATUS_LOGON_FAILURE和STATUS_ACCESS_DENIED之類的錯誤碼可作為使用者的意見反應機制,並指出使用適當認證的需求。 在某些情況下,也會使用這些錯誤碼來提示用戶自動輸入認證。 如果沒有這些錯誤碼,使用者可能會假設計算機無法存取。

如果網路重新導向器無法解析前置詞,它必須傳回符合上述建議NTSTATUS程式碼清單中預期語意的NTSTATUS程式代碼。 如果 NTSTATUS 程式代碼不是來自上述清單,則網路重新導向器不得直接將實際遇到的錯誤(例如STATUS_CONNECTION_REFUSED)傳回 MUP。

言論

網路重新導向器應該只接受此 IOCTL 的核心模式傳送者,方法是確認 Irp->RequestorModeKernelMode

請注意,IOCTL_REDIR_QUERY_PATH_EX是IOCTL METHOD_NEITHER。 這表示輸入和輸出緩衝區可能不在相同的位址。 UNC 提供者常見的錯誤是假設輸入緩衝區和輸出緩衝區相同,並使用輸入緩衝區指標來提供回應。

當 UNC 提供者收到IOCTL_REDIR_QUERY_PATH_EX要求時,它必須判斷它是否可以處理 QUERY_PATH_REQUEST_EX 結構之 PathName 成員中指定的 UNC 路徑。 如果是,UNC 提供者必須更新 LengthAcceptedQUERY_PATH_RESPONSE 結構成員的長度,以位元組為單位,其所宣告的前置詞,並使用 STATUS_SUCCESS 完成 IRP。 如果提供者無法處理指定的 UNC 路徑,它必須使用適當的 NTSTATUS 錯誤碼讓IOCTL_REDIR_QUERY_PATH_EX要求失敗,而且不得更新 QUERY_PATH_RESPONSE 結構 LengthAccepted 成員。 提供者不得在任何條件下修改任何其他成員或 PathName 成員。

提供者所宣告的前置詞長度取決於個別 UNC 提供者。 大部分提供者通常會宣告 \\servername\sharename 格式為 \\servername\sharename\path的一部分。 例如, 如果提供者宣告為 \\伺服器\公用 指定路徑 \\伺服器\public\dir1\dir2,則為前置詞 \的所有名稱型作業\伺服器\公用 (\\伺服器\公用\file1,例如) 會自動路由傳送至該提供者,而不需要任何前置詞解析,因為前置詞已在前置詞快取。 不過,前置詞為 \\伺服器的路徑,\行銷\簡報 將經過前置詞解析。

例如,如果網路重新導向器宣告伺服器名稱(\\伺服器),則此伺服器上共用的所有要求都會移至此網路重新導向器。 只有在不同網路重新導向器無法存取相同伺服器上的另一個共用時,才能接受此行為。 例如,宣告 \\伺服器 UNC 路徑的網络重新導向器,可防止其他網络重新導向器存取此伺服器上的其他共用(例如,web伺服器的 WebDAV 存取\Web)。

如需詳細資訊,請參閱設計指南中的下列各節:

  • UNC 命名和 MUP 支援

  • Microsoft Windows Vista 中的 MUP 變更

要求

要求 價值
最低支援的用戶端 Windows Vista
標頭 ntifs.h (include Ntifs.h)

另請參閱

FsRtlDeregisterUncProvider

FsRtlRegisterUncProvider

FsRtlRegisterUncProviderEx

IOCTL_REDIR_QUERY_PATH