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 |