Функция 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
Указатель на переменную, содержащую непрозрачный указатель на клиентский порт для порта подключения между приложением в пользовательском режиме и драйвером мини-фильтра режима ядра. Дополнительные сведения о указателе порта клиента см. в описании параметра 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 года. Отрицательное значение указывает интервал относительно текущего времени. Установите значение 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, сообщение доставляется.
Если после доставки сообщения ReplyBuffer имеет значение NULL, FltSendMessage возвращает STATUS_SUCCESS.
В противном случае, если replyBuffer не равно NULL, драйвер минифильтра переводится в состояние ожидания следующим образом:
Если время ожидания не равно нулю и приложение вызывает 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)
, а параметру ReplyLengthобъекта FltSendMessage присваивается то же значение. Однако из-за особенности sizeof(REPLY_STRUCT)
заполнения структуры может быть больше , чем sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT)
. В этом случае Функция FltSendMessage возвращает STATUS_BUFFER_OVERFLOW.
Поэтому рекомендуется вызывать FilterReplyMessage и FltSendMessage (используя приведенный выше пример), задав для dwReplyBufferSizesizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT)
и ReplyLength значение вместо sizeof(REPLY_STRUCT)
. Это гарантирует, что любое дополнительное заполнение в конце структуры REPLY_STRUCT игнорируется.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Пакет обновления 1 для Microsoft 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 |