FltSendMessage 代表迷你篩選驅動程式或迷你篩選驅動程序實例將訊息傳送至等候的使用者模式應用程式。
語法
NTSTATUS FLTAPI FltSendMessage(
[in] PFLT_FILTER Filter,
[in] PFLT_PORT *ClientPort,
[in] PVOID SenderBuffer,
[in] ULONG SenderBufferLength,
[out, optional] PVOID ReplyBuffer,
[in, out] PULONG ReplyLength,
[in, optional] PLARGE_INTEGER Timeout
);
參數
[in] Filter
呼叫端的不透明篩選指標。 這是必要參數,而且不能是 NULL。
[in] ClientPort
變數的指標,其中包含使用者模式應用程式與內核模式迷你篩選驅動程式之間的連線埠不透明用戶端埠指標。 有關用戶端埠指標的詳細資訊,請參閱 FltCreateCommunicationPort 的參考條目中 ConnectNotifyCallback 參數的說明。
[in] SenderBuffer
指向 minifilter 分配的緩衝區的指標,該緩衝區包含要發送到使用者模式應用程式的消息。 這是必要參數,而且不能是 NULL。
[in] SenderBufferLength
SenderBuffer 指向的緩衝區大小,以位元組為單位。 如需詳細資訊,請參閱<
[out, optional] ReplyBuffer
指向從應用程式接收答覆的微型埠分配的緩衝區(如果有)的指標。 這個參數是選擇性的,而且可以是 NULL。
[in, out] ReplyLength
ReplyBuffer 指向的緩衝區大小,以位元組為單位。 此參數是可選的,但當 ReplyBuffer 不為 NULL 時,必須為非 NULL。
[in, optional] Timeout
一個指向超時值的指標,該值指定總絕對或相對時間長度(以 100 納秒為單位),調用方 (微型埠) 可以進入等待狀態,直到使用者模式應用程式收到消息,直到收到回復(如果需要回復)。
正值會指定絕對時間,相對於 1601 年 1 月 1 日。 負值會指定相對於目前時間的間隔。 如果調用方可以無限期地進入等待狀態,請將 Timeout 設置為 NULL。
傳回值
FltSendMessage 會傳回STATUS_SUCCESS或適當的 NTSTATUS 值,例如下列其中一項:
| 傳回碼 | 描述 |
|---|---|
| STATUS_BUFFER_OVERFLOW | 微型埠分配的緩衝區不夠大。 這是錯誤碼。 |
| STATUS_INSUFFICIENT_RESOURCES | FltSendMessage 發生集區配置失敗。 這是錯誤碼。 |
| STATUS_PORT_DISCONNECTED | 通訊埠已中斷連線。 這是錯誤碼。 |
| STATUS_THREAD_IS_TERMINATING | 等候中斷,因為線程已由應用程式或用戶終止。 |
| 狀態_超時 | 逾時 間隔已過期,才能傳遞訊息或收到回復之前。 這是成功的程序代碼。 |
言論
FltSendMessage 代表小型篩選驅動程式或迷你篩選驅動程序實例將訊息傳送至使用者模式應用程式。
如果應用程式在微篩選器驅動程式調用 FltSendMessage 發送消息之前調用 FilterGetMessage 來獲取消息,則在調用 FltSendMessage 時,將立即傳遞 SendBuffer 指向的消息。 當應用程式從訊息迴圈內呼叫 filterGetMessage 時,通常是這種情況。
否則,如果應用程式尚未調用以獲取消息, 則 FltMgr 會將微篩選器置於等待狀態,如下所示:
如果 Timeout 指向非零值,並且應用程式在 Timeout 間隔到期之前調用 FilterGetMessage,則發送消息。
如果 Timeout 指向非零值,並且應用程式在 Timeout 間隔到期之前未調用 FilterGetMessage,則不會傳遞該消息,並且 FltSendMessage 將 STATUS_TIMEOUT 作為成功代碼返回。
如果 Timeout 指向零 (),
*Timeout == 0則 FltSendMessage 將返回而不等待。如果 Timeout 為 NULL ()
Timeout == NULL,則微篩檢程式將無限期地進入等待狀態。 當應用程式呼叫 FilterGetMessage時,就會傳遞訊息。
傳遞消息后,如果 ReplyBuffer 為 NULL, 則 FltSendMessage 傳回 STATUS_SUCCESS。
否則,如果 ReplyBuffer 不為 NULL,則微篩選器將進入等待狀態,如下所示:
如果 Timeout 為非零,並且應用程式在 Timeout 間隔到期之前調用 FilterReplyMessage,則微篩選器將收到回復,並且 FltSendMessage 將返回 STATUS_SUCCESS。
如果 Timeout 為非零,並且微篩選器在 Timeout 間隔到期之前未收到回復, 則 FltSendMessage 將返回 STATUS_TIMEOUT 作為成功代碼。
如果 Timeout 指向零 (),
*Timeout == 0則 FltSendMessage 將返回而不等待。如果 Timeout 在微篩選器等待回復時為零,則微篩選器將無限期地進入等待狀態。 當應用程式調用 FilterReplyMessage 時,微篩選器將收到回復, FltSendMessage 將返回 STATUS_SUCCESS。
Padding 和 Buffer Size
當呼叫端未正確考慮可能發生的系統特定結構填補時,可能會發生問題。
例如,假設一個 minifilter 聲明了以下結構,用於接收回復,並在 ReplyBuffer 中傳遞指向它的指標:
typedef struct _REPLY_STRUCT
{
FILTER_REPLY_HEADER Header;
REPLY_DATA Data; // The structure to be sent to the minifilter with the reply.
} REPLY_STRUCT, *PREPLY_STRUCT;
ReplyBuffer 必須配置足夠的空間來保留整個結構,包括任何填補。 因此,ReplyLength 應該設定為 sizeof(REPLY_STRUCT),而不是 sizeof(FILTER_REPLY_HEADER) + sizeof(REPLY_DATA)。
將 ReplyLength 設定為 sizeof(FILTER_REPLY_HEADER) + sizeof(REPLY_DATA) 不會考慮可能在 Header 和 Data 成員之間插入的填補。 這可能會導致 FltSendMessage 傳回STATUS_BUFFER_OVERFLOW即使緩衝區足夠大以保留這兩個結構也一樣。
FltSendMessage 成功傳回之後,請使用 來offsetof(REPLY_STRUCT, Data)找出 ReplyBuffer 內 Data 結構的開頭,並檢查 ReplyLength 輸出值,以判斷使用者模式應用程式所寫入的實際位元組數目。
要求
| 要求 | 價值 |
|---|---|
| 最低支援的用戶端 | 適用於SP4、Windows XP SP2 的 Windows 2000 更新匯總 1 |
| 支援的最低伺服器 | Windows Server 2003 SP1 |
| 目標平臺 | 普遍 |
| 標頭 | fltkernel.h (包括 FltKernel.h) |
| 連結庫 | FltMgr.lib 檔 |
| DLL | Fltmgr.sys |
| IRQL | <= APC_LEVEL |