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 代表微型筛选器驱动程序或微型筛选器驱动程序实例将消息发送到用户模式应用程序。

如果应用程序调用 FilterGetMessage 在微筛选器驱动程序调用 FltSendMessage 发送消息之前获取消息,则会立即传递该消息。 应用程序从消息循环内部调用 FilterGetMessage 时,通常会出现这种情况。

否则,如果应用程序尚未调用以获取消息,则微型筛选器驱动程序将进入等待状态,如下所示:

  • 如果 超时 为非零,并且应用程序在 超时 间隔过期之前调用 filterGetMessage,则会传递消息。

  • 如果 超时 为非零,并且应用程序在 超时 间隔过期之前不 调用 filterGetMessage,则消息不会传递,FltSendMessage 返回STATUS_TIMEOUT。 (注意:STATUS_TIMEOUT是成功的代码。

  • 如果 超时 为零,则微型筛选器驱动程序将无限期地置于等待状态。 当应用程序 FilterGetMessage调用时,将传递消息。

传递消息后,如果 ReplyBufferNULLFltSendMessage 返回STATUS_SUCCESS。

否则,如果 ReplyBufferNULL,则微型筛选器驱动程序将进入等待状态,如下所示:

  • 如果 超时 为非零,并且应用程序在 超时 间隔过期之前调用 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),并将 FltSendMessageReplyLength 参数设置为相同的值。 但是,由于结构填充特征,sizeof(REPLY_STRUCT) 可能大于 sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT)。 如果是这种情况,FltSendMessage 返回STATUS_BUFFER_OVERFLOW。

因此,建议调用 filterReplyMessageFltSendMessage(利用上述示例),方法是 将 dwReplyBufferSizeReplyLength 设置为 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

另请参阅

FilterGetMessage

FilterReplyMessage

FilterSendMessage

FltCreateCommunicationPort