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 は 、ミニフィルター ドライバーまたはミニフィルター ドライバー インスタンスの代わりに、ユーザー モード アプリケーションにメッセージを送信します。
ミニフィルター ドライバーが FltSendMessage を呼び出して送信する前に、アプリケーションが FilterGetMessage を呼び出してメッセージを取得した場合、メッセージはすぐに配信されます。 これは通常、アプリケーションがメッセージ ループ内から FilterGetMessage を呼び出す場合です。
それ以外の場合、アプリケーションがメッセージを取得するために呼び出されていない場合、ミニフィルター ドライバーは次のように待機状態になります。
Timeout が 0 以外で、タイムアウト間隔が切れる前にアプリケーションが FilterGetMessageを呼び出すと、メッセージが配信されます。
Timeout が 0 以外で、タイムアウト間隔が切れる前にアプリケーションが FilterGetMessage を呼び出さない場合、メッセージは配信されず、FltSendMessage はSTATUS_TIMEOUTを返します。 (注: STATUS_TIMEOUTは成功コードです)。
Timeout が 0 の場合、ミニフィルター ドライバーは無期限に待機状態になります。 アプリケーションが FilterGetMessage を呼び出すと、メッセージが配信されます。
メッセージが配信された後、 ReplyBuffer が NULL の場合、 FltSendMessage はSTATUS_SUCCESSを返します。
それ以外の場合、 ReplyBuffer が NULL でない場合、ミニフィルター ドライバーは次のように待機状態になります。
Timeout が 0 以外で、タイムアウト間隔が切れる前にアプリケーションが FilterReplyMessage を呼び出した場合、ミニフィルター ドライバーは応答を受け取り、FltSendMessage はSTATUS_SUCCESSを返します。
Timeout が 0 以外で、タイムアウト間隔が切れる前にミニフィルター ドライバーが応答を受信しない場合、FltSendMessage はSTATUS_TIMEOUTを返します。 (注: STATUS_TIMEOUTは成功コードです)。
ミニフィルター ドライバーが応答を待機しているときに タイムアウト が 0 の場合、ミニフィルター ドライバーは無期限に待機状態になります。 アプリケーションが 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を返します。
そのため、dwReplyBufferSize と ReplyLength の両方sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT)
を ではなく に設定して、FilterReplyMessage と FltSendMessage (上記のsizeof(REPLY_STRUCT)
例を利用) を呼び出することをお勧めします。 これにより、REPLY_STRUCT構造体の末尾にある余分なパディングは無視されます。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Microsoft Windows 2000 Update Rollup 1 for SP4、Windows XP SP2、Windows Server 2003 SP1、およびそれ以降のオペレーティング システム。 |
対象プラットフォーム | ユニバーサル |
Header | fltkernel.h (FltKernel.h を含む) |
Library | FltMgr.lib |
[DLL] | Fltmgr.sys |
IRQL | <= APC_LEVEL |