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 が指すバッファーのサイズ (バイト単位)。 このパラメーターは省略可能ですが、ReplyBufferNULL でない場合は 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 を呼び出すと、メッセージが配信されます。

メッセージが配信された後、 ReplyBufferNULL の場合、 FltSendMessage はSTATUS_SUCCESSを返します。

それ以外の場合、 ReplyBufferNULL でない場合、ミニフィルター ドライバーは次のように待機状態になります。

  • Timeout が 0 以外で、タイムアウト間隔が切れる前にアプリケーションが FilterReplyMessage を呼び出した場合、ミニフィルター ドライバーは応答を受け取り、FltSendMessage はSTATUS_SUCCESSを返します。

  • Timeout が 0 以外で、タイムアウト間隔が切れる前にミニフィルター ドライバーが応答を受信しない場合、FltSendMessage はSTATUS_TIMEOUTを返します。 (注: STATUS_TIMEOUTは成功コードです)。

  • ミニフィルター ドライバーが応答を待機しているときに タイムアウト が 0 の場合、ミニフィルター ドライバーは無期限に待機状態になります。 アプリケーションが FilterReplyMessage を呼び出すと、ミニフィルター ドライバーは応答を受け取り、 FltSendMessage はSTATUS_SUCCESSを返します。

注意

 (システム固有の) 構造体の埋め込みの要件により、 FltSendMessageFilterReplyMessage に関連付けられているバッファーのサイズを設定する場合、精度が必要になります。 たとえば、 データを 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)設定し、FltSendMessageReplyLength パラメーターを同じ値に設定することは明らかです。 ただし、構造体の埋め込みの特異性のために、 sizeof(REPLY_STRUCT) が より sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT)大きくなる可能性があります。 この場合、 FltSendMessage はSTATUS_BUFFER_OVERFLOWを返します。

そのため、dwReplyBufferSizeReplyLength の両方sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT)を ではなく に設定して、FilterReplyMessageFltSendMessage (上記の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

こちらもご覧ください

FilterGetMessage

FilterReplyMessage

FilterSendMessage

FltCreateCommunicationPort