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

指向 minifilter 分配的缓冲区的指针,该缓冲区包含要发送到用户模式应用程序的消息。 此参数是必需的,不能为 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 指向非零值,并且应用程序在 Timeout 间隔到期之前调用 FilterGetMessage,则发送消息。

  • 如果 Timeout 指向非零值,并且应用程序在 Timeout 间隔到期之前未调用 FilterGetMessage,则不会传递该消息,并且 FltSendMessage 将 STATUS_TIMEOUT 作为成功代码返回。

  • 如果 Timeout 指向零 (),*Timeout == 0则 FltSendMessage 将返回而不等待。

  • 如果 Timeout 为 NULL ()Timeout == NULL ,则微过滤器将无限期地进入等待状态。 当应用程序 FilterGetMessage调用时,将传递消息。

传递消息后,如果 ReplyBuffer 为 NULL, 则 FltSendMessage 返回 STATUS_SUCCESS。

否则,如果 ReplyBuffer 不为 NULL,则微筛选器将进入等待状态,如下所示:

  • 如果 Timeout 为非零,并且应用程序在 Timeout 间隔到期之前调用 FilterReplyMessage,则微筛选器将收到回复,并且 FltSendMessage 将返回 STATUS_SUCCESS。

  • 如果 Timeout 为非零,并且微筛选器在 Timeout 间隔到期之前未收到回复, 则 FltSendMessage 将返回 STATUS_TIMEOUT 作为成功代码。

  • 如果 Timeout 指向零 (),*Timeout == 0则 FltSendMessage 将返回而不等待。

  • 如果 Timeout 在微筛选器等待回复时为零,则微筛选器将无限期地进入等待状态。 当应用程序调用 FilterReplyMessage 时,微筛选器将收到回复, FltSendMessage 将返回 STATUS_SUCCESS。

Padding 和 Buffer Size

当调用方无法正确考虑可能发生的系统特定结构填充时,可能会出现问题。

例如,假设一个 minifilter 声明了以下结构,用于接收回复,并在 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(REPLY_STRUCT),而不是 sizeof(FILTER_REPLY_HEADER) + sizeof(REPLY_DATA)

ReplyLength 设置为sizeof(FILTER_REPLY_HEADER) + sizeof(REPLY_DATA)不考虑在标头和数据成员之间插入的填充。 这可能会导致 FltSendMessage 返回STATUS_BUFFER_OVERFLOW,即使缓冲区足够大,可以容纳这两个结构。

FltSendMessage 成功返回后,用于offsetof(REPLY_STRUCT, Data)ReplyBuffer 中找到数据结构的开头,并检查 ReplyLength 输出值以确定用户模式应用程序写入的实际字节数。

要求

要求 价值
最低支持的客户端 适用于 SP4、Windows XP SP2 的 Windows 2000 更新汇总 1
支持的最低服务器 Windows Server 2003 SP1
目标平台 普遍
标头 fltkernel.h (包括 FltKernel.h)
FltMgr.lib 文件
DLL Fltmgr.sys
IRQL <= APC_LEVEL

另请参阅

FilterGetMessage

FilterReplyMessage

FilterSendMessage

FltCreateCommunicationPort 端口