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