Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 |