IOCTL_REDIR_QUERY_PATH IOCTL (ntifs.h)
IOCTL_REDIR_QUERY_PATH 控制程式代碼是由多個 UNC 提供者 (MUP) 傳送至網路重新導向器,以判斷哪個提供者可以在名稱型作業中處理特定 UNC 路徑,通常是IRP_MJ_CREATE要求。 此要求稱為「前置詞解析」。
MUP 是一個核心模式元件,負責將所有遠端檔案系統存取的通道,其使用 UNC 名稱傳送到能夠處理遠端檔案系統要求的網路重新導向器(UNC 提供者)。 使用 UNC 路徑時,會涉及 MUP,如下列範例所示,可從命令行執行:
notepad \\server\public\readme.txt
在建立對應驅動器號的作業期間,不會牽涉到 MUP (例如 ,例如 “NET USE” 命令)。 此作業由多個提供者路由器 (MPR) 和網路重新導向器的使用者模式 WNet 提供者 DLL 處理。 不過,使用者模式 WNet 提供者 DLL 可能會在這項作業期間直接與內核模式網路重新導向器驅動程序通訊。
在 Windows Server 2003、Windows XP 和 Windows 2000 上,未代表分散式文件系統 (DFS) 磁碟驅動器的對應磁碟驅動器上執行的遠端檔案作業不會通過 MUP。 這些作業會直接移至處理驅動器號對應的網路提供者。
對於符合 Windows Vista 重新導向器模型的網路重新導向器,即使使用對應的網路驅動器機,也會牽涉到 MUP。 在對應的磁碟驅動器上執行的檔案作業會透過 MUP 傳送至網路重新導向器。 請注意,在此情況下,MUP 只會將作業傳遞至所涉及的網路重新導向器。
IOCTL_REDIR_QUERY_PATH 控制程式代碼會藉由呼叫 FsRtlRegisterUncProvider,將已向 MUP 註冊為通用命名約定 (UNC) 提供者的網路重新導向器傳送。 可以有多個 UNC 提供者向 MUP 註冊。
前置詞解析作業有兩個用途:
導致前置詞解析的名稱型作業會路由傳送至宣告前置詞的提供者。 如果成功,MUP 可確保後續的句柄型作業(例如IRP_MJ_READ和IRP_MJ_WRITE)完全略過 MUP 的相同提供者。
提供者及其宣告的前置詞會輸入 MUP 所維護的前置詞快取。 針對後續的名稱型作業,MUP 會使用此前置詞快取來判斷提供者是否已在 MUP 嘗試執行前置詞解析之前宣告前置詞。 此前置詞快取中的每個專案在新增至快取之後,都會受限於逾時(稱為 TTL)。 此逾時到期之後,會擲回項目,此時 MUP 會在後續的名稱型作業上針對此前置詞再次執行前置詞解析。
主要程序代碼
IOCTL_REDIR_QUERY_PATH
輸入緩衝區
IrpSp->Parameters.DeviceIoControl.Type3InputBuffer 會設定為包含要求的 QUERY_PATH_REQUEST 數據結構。
輸入緩衝區長度
輸入緩衝區的長度,以位元組為單位,必須至少 sizeof(QUERY_PATH_REQUEST)
。
輸出緩衝區
IRP->UserBuffer 會設定為包含回應的 QUERY_PATH_RESPONSE 資料結構。
輸出緩衝區長度
輸出緩衝區的長度,以位元組為單位,必須至少 sizeof(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是METHOD_NEITHER IOCTL。 這表示輸入和輸出緩衝區可能不在相同的位址。 UNC 提供者常見的錯誤是假設輸入緩衝區和輸出緩衝區相同,並使用輸入緩衝區指標來提供回應。
當 UNC 提供者收到IOCTL_REDIR_QUERY_PATH要求時,它必須判斷它是否可以處理 QUERY_PATH_REQUEST 結構之 FilePathName 成員中指定的 UNC 路徑。 如果是,它必須更新 LengthAccepted 成員,QUERY_PATH_RESPONSE 結構的長度,以位元組為單位,其所宣告的前置詞,並使用 STATUS_SUCCESS完成 IRP。 如果提供者無法處理指定的 UNC 路徑,它必須使用適當的 NTSTATUS 錯誤碼來失敗IOCTL_REDIR_QUERY_PATH要求,而且不得更新 QUERY_PATH_RESPONSE 結構的 LengthAccepted 成員。 提供者不得在任何條件下修改任何其他成員或 FilePathName 字串。
提供者所宣告的前置詞長度取決於個別 UNC 提供者。 大部分提供者通常會宣告 \\servername\sharename 格式為 \\servername\sharename\path的一部分。 例如, 如果提供者宣告為 \\伺服器\公用 指定路徑 \\伺服器\public\dir1\dir2,則為前置詞 \的所有名稱型作業\伺服器\公用 (\\伺服器\公用\file1,例如) 會自動路由傳送至該提供者,而不需要任何前置詞解析,因為前置詞已在前置詞快取。 不過,前置詞為 \\伺服器的路徑,\行銷\簡報 將經過前置詞解析。
例如,如果網路重新導向器宣告伺服器名稱(\\伺服器),則此伺服器上共用的所有要求都會移至此網路重新導向器。 只有在不同網路重新導向器無法存取相同伺服器上的另一個共用時,才能接受此行為。 例如,宣告 \\伺服器 UNC 路徑的網络重新導向器,可防止其他網络重新導向器存取此伺服器上的其他共用(例如,web伺服器的 WebDAV 存取\Web)。
如需詳細資訊,請參閱下列文章:
UNC 命名和 MUP
支援 Microsoft Windows Vista 中的
MUP 變更
要求
要求 | 價值 |
---|---|
標題 | ntifs.h (include Ntifs.h) |