Función FltSendMessage (fltkernel.h)
FltSendMessage envía un mensaje a una aplicación en modo de usuario en espera en nombre de un controlador de minifiltro o una instancia de controlador de minifiltro.
Sintaxis
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
);
Parámetros
[in] Filter
Puntero de filtro opaco para el autor de la llamada. Este parámetro es obligatorio y no puede ser NULL.
[in] ClientPort
Puntero a una variable que contiene el puntero de puerto de cliente opaco para el puerto de conexión entre la aplicación en modo de usuario y el controlador minifiltro en modo kernel. Para obtener más información sobre el puntero de puerto de cliente, consulte la descripción del parámetro ConnectNotifyCallback en la entrada de referencia de FltCreateCommunicationPort.
[in] SenderBuffer
Puntero a un búfer asignado por el autor de la llamada que contiene el mensaje que se va a enviar a la aplicación en modo de usuario. Este parámetro es obligatorio y no puede ser NULL.
[in] SenderBufferLength
Tamaño, en bytes, del búfer al que apunta SenderBuffer . Consulte Comentarios para más información.
[out, optional] ReplyBuffer
Puntero a un búfer asignado por el autor de la llamada que recibe la respuesta, si existe, de la aplicación. Este parámetro es opcional y puede ser NULL.
[in, out] ReplyLength
Tamaño, en bytes, del búfer al que apunta ReplyBuffer . Este parámetro es opcional, pero debe ser distinto de NULL cuando ReplyBuffer no es NULL.
[in, optional] Timeout
Puntero a un valor de tiempo de espera que especifica el tiempo total absoluto o relativo, en unidades de 100 nanosegundos, para los que el autor de la llamada puede colocarse en un estado de espera hasta que la aplicación en modo usuario reciba el mensaje y hasta que reciba una respuesta (si se espera).
Un valor positivo especifica una hora absoluta, relativa al 1 de enero de 1601. Un valor negativo especifica un intervalo relativo a la hora actual. Se establece en NULL si el autor de la llamada puede colocarse en un estado de espera indefinidamente.
Valor devuelto
FltSendMessage devuelve STATUS_SUCCESS o un valor NTSTATUS adecuado, como uno de los siguientes:
Código devuelto | Descripción |
---|---|
STATUS_INSUFFICIENT_RESOURCES | FltSendMessage encontró un error de asignación de grupo. Se trata de un código de error. |
STATUS_PORT_DISCONNECTED | El puerto de comunicación se ha desconectado. Se trata de un código de error. |
STATUS_THREAD_IS_TERMINATING | La espera se interrumpió porque un usuario o una aplicación han terminado el subproceso. |
STATUS_TIMEOUT | El intervalo de tiempo de espera expiró antes de que se pudiera entregar el mensaje o antes de recibir una respuesta. Se trata de un código correcto. |
Comentarios
FltSendMessage envía un mensaje a una aplicación en modo de usuario en nombre de un controlador de minifiltro o una instancia de controlador de minifiltro.
Si la aplicación llama a FilterGetMessage para obtener el mensaje antes de que el controlador de minifiltro llame a FltSendMessage para enviarlo, el mensaje se entrega inmediatamente. Este suele ser el caso cuando la aplicación llama a FilterGetMessage desde dentro de un bucle de mensajes.
De lo contrario, si no se ha llamado a una aplicación para obtener un mensaje, el controlador de minifiltro se coloca en un estado de espera como se indica a continuación:
Si Timeout no es cero y la aplicación llama a FilterGetMessage antes de que expire el intervalo de tiempo de espera, se entrega el mensaje.
Si Timeout no es cero y la aplicación no llama a FilterGetMessage antes de que expire el intervalo de tiempo de espera, el mensaje no se entrega y FltSendMessage devuelve STATUS_TIMEOUT. (Nota: STATUS_TIMEOUT es un código correcto).
Si Timeout es cero, el controlador de minifiltro se coloca en un estado de espera indefinidamente. Cuando la aplicación llama a FilterGetMessage, se entrega el mensaje.
Una vez entregado el mensaje, si ReplyBuffer es NULL, FltSendMessage devuelve STATUS_SUCCESS.
De lo contrario, si ReplyBuffer no es NULL, el controlador de minifiltro se coloca en un estado de espera como se indica a continuación:
Si Timeout es distinto de cero y la aplicación llama a FilterReplyMessage antes de que expire el intervalo de tiempo de espera, el controlador de minifiltro recibe la respuesta y FltSendMessage devuelve STATUS_SUCCESS.
Si Timeout es distinto de cero y el controlador de minifiltro no recibe una respuesta antes de que expire el intervalo de tiempo de espera, FltSendMessage devuelve STATUS_TIMEOUT. (Nota: STATUS_TIMEOUT es un código correcto).
Si Timeout es cero cuando el controlador de minifiltro está esperando la respuesta, el controlador de minifiltro se coloca en un estado de espera indefinidamente. Cuando la aplicación llama a FilterReplyMessage, el controlador de minifiltro recibe la respuesta y FltSendMessage devuelve STATUS_SUCCESS.
Nota
Debido a los requisitos de relleno de estructura (específicos del sistema), se requiere precisión cuando se establece el tamaño de los búferes asociados a FltSendMessage y FilterReplyMessage. Por ejemplo, supongamos que los datos se deben enviar a través de FilterReplyMessage a un minifiltro. El componente en modo de usuario puede declarar la siguiente estructura para hacerlo:
typedef struct _REPLY_STRUCT
{
FILTER_REPLY_HEADER Header;
MY_STRUCT Data; // The structure to be sent to the minifilter
} REPLY_STRUCT, *PREPLY_STRUCT;
Dada esta estructura, podría parecer obvio que el autor de la llamada de FilterReplyMessageestablecería dwReplyBufferSizesizeof(REPLY_STRUCT)
en y establecería el parámetro ReplyLength de FltSendMessage en el mismo valor. Sin embargo, debido al relleno de estructuras idiosincrónicas, sizeof(REPLY_STRUCT)
puede ser mayor que sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT)
. Si este es el caso, FltSendMessage devuelve STATUS_BUFFER_OVERFLOW.
Por lo tanto, se recomienda llamar a FilterReplyMessage y FltSendMessage (aprovechando el ejemplo anterior) estableciendo dwReplyBufferSize y ReplyLength en sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT)
en lugar de sizeof(REPLY_STRUCT)
. Esto garantiza que se omita cualquier relleno adicional al final de la estructura de REPLY_STRUCT.
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Paquete acumulativo de actualizaciones de Microsoft Windows 2000 1 para SP4, Windows XP SP2, Windows Server 2003 SP1 y sistemas operativos posteriores. |
Plataforma de destino | Universal |
Encabezado | fltkernel.h (incluya FltKernel.h) |
Library | FltMgr.lib |
Archivo DLL | Fltmgr.sys |
IRQL | <= APC_LEVEL |