FltSendMessage 函式 (fltkernel.h)
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
呼叫端配置的緩衝區指標,其中包含要傳送至使用者模式應用程式的訊息。 這是必要參數,而且無法 NULL。
[in] SenderBufferLength
SenderBuffer 指向的緩衝區大小,以位元組為單位。 如需詳細資訊,請參閱<
[out, optional] ReplyBuffer
從應用程式接收回復之呼叫端配置的緩衝區指標。如果有的話。 這個參數是選擇性的,而且可以 NULL。
[in, out] ReplyLength
ReplyBuffer 指向的緩衝區大小,以位元組為單位。 這個參數是選擇性的,但當 ReplyBuffer 不是 NULL時,這個參數必須是非NULL。
[in, optional] Timeout
逾時值的指標,指定總絕對或相對時間長度,單位為 100 奈秒,呼叫端可以放入等候狀態,直到使用者模式應用程式收到訊息,直到收到回復為止(如果預期)。
正值會指定絕對時間,相對於 1601 年 1 月 1 日。 負值會指定相對於目前時間的間隔。 如果呼叫端可以無限期地放入等候狀態,請將 設定為 NULL。
傳回值
FltSendMessage 會傳回STATUS_SUCCESS或適當的 NTSTATUS 值,例如下列其中一項:
傳回碼 | 描述 |
---|---|
STATUS_INSUFFICIENT_RESOURCES | FltSendMessage 發生集區配置失敗。 這是錯誤碼。 |
STATUS_PORT_DISCONNECTED | 通訊埠已中斷連線。 這是錯誤碼。 |
STATUS_THREAD_IS_TERMINATING | 等候中斷,因為線程已由應用程式或用戶終止。 |
STATUS_TIMEOUT | 逾時 間隔已過期,才能傳遞訊息或收到回復之前。 這是成功的程序代碼。 |
言論
FltSendMessage 代表小型篩選驅動程式或迷你篩選驅動程序實例將訊息傳送至使用者模式應用程式。
如果應用程式呼叫 FilterGetMessage 在小型篩選驅動程式呼叫 FltSendMessage 來傳送訊息之前,就會立即傳遞訊息。 當應用程式從訊息迴圈內呼叫 filterGetMessage 時,通常是這種情況。
否則,如果應用程式尚未呼叫 以取得訊息,迷你篩選驅動程式會進入等候狀態,如下所示:
如果 逾時 為非零值,且應用程式會在 逾時 間隔到期之前呼叫 FilterGetMessage,則會傳遞訊息。
如果 逾時 為非零值,且應用程式不會在 逾時 間隔到期之前呼叫 FilterGetMessage,則不會傳遞訊息,FltSendMessage 會傳回STATUS_TIMEOUT。 (注意:STATUS_TIMEOUT是成功的程序代碼。
如果 逾時 為零,小型篩選驅動程式就會無限期地進入等候狀態。 當應用程式呼叫 FilterGetMessage時,就會傳遞訊息。
傳遞訊息之後,如果 ReplyBufferNULL,FltSendMessage 會傳回STATUS_SUCCESS。
否則,如果 ReplyBuffer 未 NULL,小型篩選驅動程式會進入等候狀態,如下所示:
如果 逾時 為非零值,且應用程式會在 逾時 間隔到期之前呼叫 FilterReplyMessage,小型篩選驅動程式會收到回復,FltSendMessage 會傳回STATUS_SUCCESS。
如果 逾時 為非零值,而且小型篩選驅動程式在 逾時 間隔到期之前未收到回復,FltSendMessage 傳回STATUS_TIMEOUT。 (注意:STATUS_TIMEOUT是成功的程序代碼。
如果 當迷你篩選驅動程式等候回復時, 逾時為零,小型篩選驅動程式就會無限期地進入等候狀態。 當應用程式呼叫 FilterReplyMessage時,迷你篩選驅動程式會收到回復,且 FltSendMessage 傳回STATUS_SUCCESS。
注意
由於 (系統特定的) 結構填補需求,因此當您設定與 fltSendMessage 相關聯的緩衝區大小,並 FilterReplyMessage時,需要精確度。 例如,假設數據必須透過 FilterReplyMessage 傳送至小型篩選工具。 使用者模式元件可能會宣告下列結構來執行此動作:
typedef struct _REPLY_STRUCT
{
FILTER_REPLY_HEADER Header;
MY_STRUCT Data; // The structure to be sent to the minifilter
} REPLY_STRUCT, *PREPLY_STRUCT;
鑒於此結構,FilterReplyMessage 的呼叫者似乎很明顯,會將 dwReplyBufferSize 設定為 sizeof(REPLY_STRUCT)
,並將 fltSendMessage 的 ReplyLength 參數 設定為相同的值。 不過,由於結構填補特殊性,sizeof(REPLY_STRUCT)
可能大於 sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT)
。 如果是這種情況,FltSendMessage 會傳回STATUS_BUFFER_OVERFLOW。
因此,建議您呼叫 FilterReplyMessage 和 FltSendMessage (利用上述範例),方法是 將 dwReplyBufferSize 和 ReplyLength 設為 sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT)
,而不是 sizeof(REPLY_STRUCT)
。 這可確保忽略REPLY_STRUCT結構結尾的任何額外填補。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Microsoft SP4、Windows XP SP2、Windows Server 2003 SP1 和更新版本的作系統的 Windows 2000 更新匯總 1。 |
目標平臺 | 普遍 |
標頭 | fltkernel.h (包括 FltKernel.h) |
連結庫 | FltMgr.lib |
DLL | Fltmgr.sys |
IRQL | <= APC_LEVEL |