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;
ReplyLength を sizeof(REPLY_STRUCT)
に設定すると、構造体の任意のメンバーの末尾に追加される可能性のあるパディングがキャプチャされますが、構造体とその各メンバーの実際のサイズを正確に表しているわけではありません。
ReplyLength を sizeof(FILTER_REPLY_HEADER) + sizeof(REPLY_DATA)
に設定すると、どちらの構造体の末尾の埋め込みも無視されます。
ヘッダー構造体の後に埋め込みが追加される可能性がある場合は、offsetof(REPLY_STRUCT, Data)
を使用して Data 構造体の先頭に正確にアクセスし、sizeof(REPLY_DATA)
を使用して Data 構造体の実際のバイト数を判断できます。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | 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をする