Функция FltSendMessage (fltkernel.h)

FltSendMessage отправляет сообщение ожидающему приложению пользовательского режима от имени драйвера minifilter или экземпляра драйвера minifilter.

Синтаксис

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

Указатель на переменную, содержащую непрозрачный указатель порта клиента для порта соединения между приложением пользовательского режима и драйвером минифильтра режима ядра. Дополнительные сведения об указателе на порт клиента см. в описании параметра ConnectNotifyCallback в справочной записи для FltCreateCommunicationPort.

[in] SenderBuffer

Указатель на выделенный минифильтром буфер, содержащий сообщение для отправки приложению пользовательского режима. Этот параметр является обязательным и не может иметь значение NULL.

[in] SenderBufferLength

Размер буфера (в байтах), на который указывает SenderBuffer . Для получения дополнительной информации см. раздел «Примечания».

[out, optional] ReplyBuffer

Указатель на буфер, выделенный минипортом, который получает ответ от приложения, если таковой имеется. Этот параметр является необязательным и может иметь значение NULL.

[in, out] ReplyLength

Размер буфера (в байтах), на который указывает ReplyBuffer . Этот параметр является необязательным, но должен быть не равен NULL, если ReplyBuffer не равен NULL.

[in, optional] Timeout

Указатель на значение тайм-аута, указывающее общую абсолютную или относительную продолжительность времени в единицах 100 наносекунд, в течение которого вызывающий объект (минипорт) может быть переведен в состояние ожидания до тех пор, пока сообщение не будет получено приложением пользовательского режима и пока оно не получит ответ, если ожидается ответ.

Положительное значение указывает абсолютное время относительно 1 января 1601 года. Отрицательное значение указывает интервал относительно текущего времени. Задайте для параметра Timeout значение NULL, если вызывающий объект может быть переведен в состояние ожидания на неопределенный срок.

Возвращаемое значение

FltSendMessage возвращает STATUS_SUCCESS или соответствующее значение NTSTATUS, например, одно из следующих:

Код возврата Описание
STATUS_BUFFER_OVERFLOW Буфер, выделенный минипортом, был недостаточно велик. Это код ошибки.
СТАТУС_НЕДОСТАТОЧНО_РЕСУРСОВ FltSendMessage обнаружил сбой выделения пула. Это код ошибки.
STATUS_PORT_DISCONNECTED Порт связи отключен. Это код ошибки.
СТАТУС_Поток_Завершается Ожидание было прервано, так как поток был завершен приложением или пользователем.
STATUS_TIMEOUT Интервал времени ожидания истек до доставки сообщения или до получения ответа. Это код успешного выполнения.

Замечания

FltSendMessage отправляет сообщение в приложение пользовательского режима от имени драйвера минифильтра или экземпляра драйвера минифильтра.

Если приложение вызывает FilterGetMessage для получения сообщения до того, как драйвер минифильтра вызовет FltSendMessage для его отправки, сообщение, на которое указывает SendBuffer , доставляется немедленно при вызове FltSendMessage . Обычно это происходит, когда приложение вызывает FilterGetMessage из цикла обработки сообщений.

В противном случае, если приложение не вызывалось для получения сообщения, FltMgr переводит минифильтр в состояние ожидания следующим образом:

  • Если Timeout указывает на ненулевое значение и приложение вызывает FilterGetMessage до истечения интервала Timeout , сообщение доставляется.

  • Если Timeout указывает на ненулевое значение и приложение не вызывает FilterGetMessage до истечения интервала Timeout, сообщение не доставляется, и FltSendMessage возвращает STATUS_TIMEOUT в качестве кода успеха.

  • Если значение Timeout равно нулю (*Timeout == 0), FltSendMessage возвращается без ожидания.

  • Если Timeout имеет значение NULL (Timeout == NULL), минифильтр переводится в состояние ожидания на неопределенный срок. Когда приложение вызывает FilterGetMessage, сообщение доставляется.

После доставки сообщения, если ReplyBuffer имеет значение NULL, FltSendMessage возвращает STATUS_SUCCESS.

В противном случае, если ReplyBuffer не имеет значения NULL, минифильтр переводится в состояние ожидания следующим образом:

  • Если значение Timeout не равно нулю и приложение вызывает FilterReplyMessage до истечения интервала времени ожидания, минифильтр получает ответ, а FltSendMessage возвращает STATUS_SUCCESS.

  • Если значение Timeout не равно нулю и минифильтр не получает ответ до истечения интервала Timeout, FltSendMessage возвращает STATUS_TIMEOUT в качестве кода успешного выполнения.

  • Если значение Timeout равно нулю (*Timeout == 0), FltSendMessage возвращается без ожидания.

  • Если значение Timeout равно нулю, когда минифильтр ожидает ответа, минифильтр переводится в состояние ожидания на неопределенный срок. Когда приложение вызывает 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;

ОтветBuffer должен быть выделен с достаточным пространством для хранения всей структуры, включая любую заполнение. Поэтому параметр ReplyLength должен иметь значение sizeof(REPLY_STRUCT), а не sizeof(FILTER_REPLY_HEADER) + sizeof(REPLY_DATA).

Параметр ReplyLengthsizeof(FILTER_REPLY_HEADER) + sizeof(REPLY_DATA) не учитывает заполнение, которое может быть вставлено между элементами заголовка и данных . Это может привести к возврату STATUS_BUFFER_OVERFLOW fltSendMessage , даже если буфер достаточно велик для хранения обеих структур.

После успешного возвращения FltSendMessage используйте offsetof(REPLY_STRUCT, Data) для поиска начала структуры данных в ReplyBuffer и проверьте выходное значение ReplyLength , чтобы определить фактическое количество байтов, записанных приложением пользовательского режима.

Требования

Требование Ценность
Минимальный поддерживаемый клиент Накопительный пакет обновления Windows 2000 1 для sp4, Windows XP с пакетом обновления 2 (SP2)
минимальный поддерживаемый сервер Windows Server 2003 с пакетом обновления 1 (SP1)
целевая платформа универсальный
Заголовок fltkernel.h (включая FltKernel.h)
Библиотека FltMgr.lib
Библиотека dll Fltmgr.sys
IRQL <= APC_LEVEL

См. также

FilterGetMessage (ФильтрGetMessage)

FilterReplyMessage (СообщениеFilterReplyMessage)

FilterSendMessage (СообщениеFilterSendMessage)

FltCreateCommunicationPort