共用方式為


KsProbeStreamIrp 函式 (ks.h)

KsProbeStreamIrp 函式會根據傳遞的旗標,對指定 IRP 的輸入和輸出緩衝區進行指定的修改,然後驗證數據流標頭。 這在當地語系化例外狀況處理或對 IRP 執行異步工作時很有用。 產生的 IRP 基本上是METHOD_OUT_DIRECT或METHOD_IN_DIRECT格式,但數據緩衝區的存取可能是 IoModifyAccess,視傳遞至此函式的旗標或數據流標頭中的旗標而定。

語法

KSDDKAPI NTSTATUS KsProbeStreamIrp(
  [in, out]      PIRP  Irp,
  [in]           ULONG ProbeFlags,
  [in, optional] ULONG HeaderSize
);

參數

[in, out] Irp

指定要對應的輸入和輸出緩衝區的 IRP。 探查緩衝區時,會使用 IRP 的要求者模式。

[in] ProbeFlags

指定旗標,指定如何探查串流 IRP;下表列出旗標。

[in, optional] HeaderSize

指定要針對傳遞至此用戶端的每個標頭進行驗證的大小,如果未完成驗證,則為零。 如果使用,則會假設傳遞的整個緩衝區是這個標頭大小的倍數,除非緩衝區改為包含單一格式變更標頭。

傳回值

如果成功, KsProbeStreamIrp 函式會傳回STATUS_SUCCESS,或傳回記憶體或存取錯誤。

備註

如果函式只用來設定 MDL 的 ,而不是探查和鎖定位址,呼叫端必須有完成例程才能清除 MDL 的 。 例如,Just-In-Time 鎖定機制可以配置 MDL 清單,但只視需要鎖定記憶體。 客戶端必須提供清除程序代碼,才能在 IRP 完成之前移除部分鎖定的 MDL 清單,這通常是在完成例程中。

如果標頭似乎已經複製到系統緩衝區,則不會再次驗證。 一般而言,使用 IRP 多次呼叫 KsProbeStreamIrp 函式並不有害。 呼叫函式之後,數據流標頭可在 PIRP 中使用。AssociatedIrp.SystemBuffer。 如果已配置數據流緩衝區 MDL,即可透過 PIRP 取得它們。MdlAddress。

下列定義用於 ProbeFlags 變數:

ProbeFlags 價值 Description
KSPROBE_READ 表示作業是裝置上讀取的數據流。 此為預設值。
KSPROBE_WRITE 表示作業是裝置上的數據流寫入。
KSPROBE_ALLOCATEMDL 表示如果尚未配置 MDL,則應該為數據流緩衝區配置 MDL。 如果沒有串流緩衝區存在,則會忽略 旗標。 如果未同時指定KSPROBE_PROBEANDLOCK與這個旗標,則呼叫端必須有完成例程,才能清除任何 MDL,如果尚未成功探查並鎖定所有 MDL。
KSPROBE_PROBEANDLOCK 如果已設定KSPROBE_ALLOCATEMDL,表示數據流緩衝區的 MDL 所參考的記憶體應該探查並鎖定。 如果未設定 MDL 配置旗標,即使先前已進行 MDL 配置,也會忽略此旗標。 探查的方法取決於所傳遞的 IRP 類型。 針對寫入作業,會使用 IoReadAccess 。 針對讀取作業,會使用 IoWriteAccess 。 如果傳送數據的用戶端使用非分頁集區,則會初始化適當的 MDL,而不是探查和鎖定。
KSPROBE_SYSTEMADDRESS 擷取鏈結中每個 MDL 的系統位址,讓呼叫端不需要在個別步驟中執行此動作。 如果未設定探查和鎖定旗標,即使先前已探查 MDL,也會忽略此情況。
KSPROBE_ALLOWFORMATCHANGE 針對 Stream 寫入,允許在數據流標頭中設定KSSTREAM_HEADER_OPTIONSF_TYPECHANGED旗標。 這表示數據流標頭不是延伸長度,即使已指出擴充的標頭大小也一樣。 此外,在此情況下,IRP 中可能只有一個數據流標頭。 與此標頭相關聯的緩衝區包含新的數據格式。 對於系統記憶體數據流,緩衝區不應該從交涉配置器取得,因為它不是數據流的一部分。

規格需求

需求
目標平台 Universal
標頭 ks.h (包含 Ks.h)
程式庫 Ks.lib