Compartir a través de


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 necesario 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 de 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 minifiltro que contiene el mensaje que se va a enviar a la aplicación en modo de usuario. Este parámetro es necesario y no puede ser NULL.

[in] SenderBufferLength

Tamaño, en bytes, del búfer al que SenderBuffer apunta. Consulte comentarios para obtener más información.

[out, optional] ReplyBuffer

Puntero a un búfer asignado al minipuerto que recibe una respuesta de la aplicación, si la hay. Este parámetro es opcional y puede ser NULL.

[in, out] ReplyLength

Tamaño, en bytes, del búfer al que ReplyBuffer. Este parámetro es opcional, pero no debe ser 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 el que el autor de la llamada (minipuerto) se puede poner en estado de espera hasta que la aplicación en modo de usuario reciba el mensaje y hasta que reciba una respuesta si se espera una respuesta.

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. Establezca Timeout en NULL si el autor de la llamada se puede poner 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_BUFFER_OVERFLOW Un búfer asignado a un minipuerto no era lo suficientemente grande. Se trata de un código de error.
ESTADO_RECURSOS_INSUFICIENTES 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 aplicación han terminado el subproceso.
STATUS_TIMEOUT El intervalo de tiempo de espera expira antes de que se pueda entregar el mensaje o antes de recibir una respuesta. Se trata de un código correcto.

Observaciones

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 al que apunta SendBuffer se entrega inmediatamente cuando se llama a FltSendMessage . Este suele ser el caso cuando la aplicación llama a FilterGetMessage desde dentro de un bucle de mensajes.

De lo contrario, si una aplicación no ha llamado para obtener un mensaje, FltMgr pone el minifiltro en un estado de espera de la siguiente manera:

  • Si Timeout apunta a un valor distinto de cero y la aplicación llama a FilterGetMessage antes de que expire el intervalo de tiempo de espera , se entrega el mensaje.

  • Si Timeout apunta a un valor distinto de 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 como código de éxito.

  • Si Timeout apunta a cero (*Timeout == 0), FltSendMessage se devuelve sin esperar.

  • Si Timeout es NULL (Timeout == NULL), el minifiltro se pone en 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 minifiltro se pone en un estado de espera de la siguiente manera:

  • Si Timeout es distinto de cero y la aplicación llama a FilterReplyMessage antes de que expire el intervalo de tiempo de espera , el minifiltro recibe la respuesta y FltSendMessage devuelve STATUS_SUCCESS.

  • Si Timeout es distinto de cero y el minifiltro no recibe una respuesta antes de que expire el intervalo de tiempo de espera , FltSendMessage devuelve STATUS_TIMEOUT como código de éxito.

  • Si Timeout apunta a cero (*Timeout == 0), FltSendMessage se devuelve sin esperar.

  • Si Timeout es cero cuando el minifiltro está esperando la respuesta, el minifiltro se pone en estado de espera indefinidamente. Cuando la aplicación llama a FilterReplyMessage, el minifiltro recibe la respuesta y FltSendMessage devuelve STATUS_SUCCESS.

Relleno y tamaño de búfer

Los problemas pueden producirse cuando el autor de la llamada no tiene en cuenta correctamente el relleno de estructura específico del sistema que puede producirse.

Por ejemplo, supongamos que un minifiltro declara la siguiente estructura en la que recibir una respuesta y le pasa un puntero en 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 debe asignarse con espacio suficiente para contener toda la estructura, incluido cualquier relleno. Por lo tanto, ReplyLength debe establecerse sizeof(REPLY_STRUCT)en , no sizeof(FILTER_REPLY_HEADER) + sizeof(REPLY_DATA)en .

Establecer ReplyLengthsizeof(FILTER_REPLY_HEADER) + sizeof(REPLY_DATA) en no tiene en cuenta el relleno que se puede insertar entre los miembros Header y Data . Esto puede provocar que FltSendMessage devuelva STATUS_BUFFER_OVERFLOW incluso cuando el búfer es lo suficientemente grande como para contener ambas estructuras.

Después de que FltSendMessage vuelva correctamente, use offsetof(REPLY_STRUCT, Data) para buscar el principio de la estructura Data en ReplyBuffer y examine el valor de salida ReplyLength para determinar el número real de bytes escritos por la aplicación en modo de usuario.

Requisitos

Requisito Valor
cliente mínimo admitido Paquete acumulativo de actualizaciones de Windows 2000 1 para SP4, Windows XP SP2
Servidor mínimo admitido Windows Server 2003 SP1
de la plataforma de destino de Universal
encabezado de fltkernel.h (incluya FltKernel.h)
biblioteca de FltMgr.lib
DLL de Fltmgr.sys
irQL <= APC_LEVEL

Consulte también

FilterGetMessage de

FilterReplyMessage de

FilterSendMessage

FltCreateCommunicationPort