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 日を基準とした絶対時間を指定します。 負の値は、現在の時刻を基準とした間隔を指定します。 呼び出し元を無期限に待機状態にできる場合は、 Timeout を NULL に設定します。
戻り値
FltSendMessage は、次のいずれかのSTATUS_SUCCESSまたは適切な NTSTATUS 値を返します。
| リターン コード | 形容 |
|---|---|
| STATUS_BUFFER_OVERFLOW | ミニポートで割り当てられたバッファーが十分な大きさではありませんでした。 これはエラー コードです。 |
| STATUS_INSUFFICIENT_RESOURCES | FltSendMessage プール割り当てエラーが発生しました。 これはエラー コードです。 |
| STATUS_PORT_DISCONNECTED | 通信ポートが切断されました。 これはエラー コードです。 |
| STATUS_THREAD_IS_TERMINATING | スレッドがアプリケーションまたはユーザーによって終了されたため、待機が中断されました。 |
| STATUS_TIMEOUT | タイムアウト 間隔は、メッセージを配信する前または応答を受信する前に期限切れになりました。 これは成功コードです。 |
備考
FltSendMessage 、ミニフィルター ドライバーまたはミニフィルター ドライバー インスタンスの代わりに、ユーザー モード アプリケーションにメッセージを送信します。
ミニフィルター ドライバーが FltSendMessage を呼び出してメッセージを送信する前に、アプリケーションが FilterGetMessage を呼び出してメッセージを取得した場合、 FltSendMessage が呼び出されるとすぐに SendBuffer が指すメッセージが配信されます。 これは通常、アプリケーションがメッセージ ループ内から filterGetMessage 呼び出す場合です。
それ以外の場合、アプリケーションがメッセージを取得するために呼び出されていない場合、 FltMgr は次のようにミニフィルターを待機状態にします。
Timeout が 0 以外の値を指し、Timeout 間隔が経過する前にアプリケーションが FilterGetMessage を呼び出した場合、メッセージは配信されます。
Timeout が 0 以外の値を指し、Timeout 間隔が経過する前にアプリケーションが FilterGetMessage を呼び出さない場合、メッセージは配信されず、FltSendMessage は成功コードとして STATUS_TIMEOUT を返します。
Timeout が 0 (
*Timeout == 0) を指している場合、FltSendMessage は待機せずに制御を戻します。Timeout が NULL (
Timeout == NULL) の場合、ミニフィルターは無期限に待機状態になります。 アプリケーションが FilterGetMessage 呼び出すと、メッセージが配信されます。
メッセージが配信された後、 ReplyBuffer が NULL の場合、 FltSendMessage は STATUS_SUCCESS を返します。
それ以外の場合、 ReplyBuffer が NULL でない場合、ミニフィルターは次のように待機状態になります。
Timeout が 0 以外で、Timeout 間隔が経過する前にアプリケーションが FilterReplyMessage を呼び出した場合、ミニフィルターは応答を受け取り、FltSendMessage はSTATUS_SUCCESSを返します。
Timeout が 0 以外で、Timeout 間隔が経過する前にミニフィルターが応答を受信しない場合、FltSendMessage は成功コードとして STATUS_TIMEOUT を返します。
Timeout が 0 (
*Timeout == 0) を指している場合、FltSendMessage は待機せずに制御を戻します。ミニフィルターが応答を待機しているときに Timeout が 0 の場合、ミニフィルターは無期限に待機状態になります。 アプリケーションが FilterReplyMessage を呼び出すと、ミニフィルターは応答を受け取り、 FltSendMessage はSTATUS_SUCCESSを返します。
パディングとバッファサイズ
問題は、呼び出し元が、発生する可能性があるシステム固有の構造体の埋め込みを適切に考慮していない場合に発生する可能性があります。
たとえば、ミニフィルターが応答を受信する次の構造体を宣言し、それへのポインターを 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(FILTER_REPLY_HEADER) + sizeof(REPLY_DATA)ではなく、sizeof(REPLY_STRUCT)に設定する必要があります。
ReplyLength を sizeof(FILTER_REPLY_HEADER) + sizeof(REPLY_DATA) に設定しても、Header メンバーと Data メンバーの間に挿入される埋め込みは考慮されません。 これにより、バッファーが両方の構造体を保持するのに十分な大きさの場合でも、 FltSendMessage がSTATUS_BUFFER_OVERFLOWを返す可能性があります。
FltSendMessage が正常に返されたら、offsetof(REPLY_STRUCT, Data)を使用して ReplyBuffer 内のデータ構造の先頭を見つけ、ReplyLength 出力値を調べて、ユーザー モード アプリケーションによって書き込まれた実際のバイト数を確認します。
必要条件
| 要件 | 価値 |
|---|---|
| サポートされる最小クライアント | Windows 2000 Update Rollup 1 for SP4、Windows XP SP2 |
| サポートされている最小のサーバー | Windows Server 2003 SP1 |
| ターゲット プラットフォーム の | 万国 |
| ヘッダー | fltkernel.h (FltKernel.h を含む) |
| ライブラリ | FltMgr.lib (英語) |
| DLL | Fltmgr.sys |
| IRQL | <= APC_LEVEL |
関連項目
FltCreateCommunicationPortをする