Condividi tramite


Funzione FltSendMessage (fltkernel.h)

FltSendMessage invia un messaggio a un'applicazione in modalità utente in attesa per conto di un driver minifiltro o di un'istanza del driver minifiltro.

Sintassi

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
);

Parametri

[in] Filter

Puntatore di filtro opaco per il chiamante. Questo parametro è obbligatorio e non può essere NULL.

[in] ClientPort

Puntatore a una variabile che contiene il puntatore alla porta client opaca per la porta di connessione tra l'applicazione in modalità utente e il driver minifilter in modalità kernel. Per altre informazioni sul puntatore alla porta client, vedere la descrizione del parametro ConnectNotifyCallback nella voce di riferimento per FltCreateCommunicationPort.

[in] SenderBuffer

Puntatore a un buffer allocato dal chiamante contenente il messaggio da inviare all'applicazione in modalità utente. Questo parametro è obbligatorio e non può essere NULL.

[in] SenderBufferLength

Dimensioni, in byte, del buffer a cui SenderBuffer punta. Per altre informazioni, vedere osservazioni.

[out, optional] ReplyBuffer

Puntatore a un buffer allocato dal chiamante che riceve la risposta, se presente, dall'applicazione. Questo parametro è facoltativo e può essere NULL.

[in, out] ReplyLength

Dimensioni, in byte, del buffer a cui punta ReplyBuffer. Questo parametro è facoltativo, ma deve essere diverso daNULL quando ReplyBuffer non è NULL.

[in, optional] Timeout

Puntatore a un valore di timeout che specifica la durata totale assoluta o relativa, in unità di 100 nanosecondi, per cui il chiamante può essere inserito in uno stato di attesa fino a quando il messaggio non viene ricevuto dall'applicazione in modalità utente e fino a quando non riceve una risposta (se previsto).

Un valore positivo specifica un'ora assoluta, rispetto al 1° gennaio 1601. Un valore negativo specifica un intervallo relativo all'ora corrente. Impostare su NULL se il chiamante può essere inserito in uno stato di attesa illimitato.

Valore restituito

FltSendMessage restituisce STATUS_SUCCESS o un valore NTSTATUS appropriato, ad esempio uno dei seguenti:

Codice restituito Descrizione
STATUS_INSUFFICIENT_RESOURCES FltSendMessage rilevato un errore di allocazione del pool. Si tratta di un codice di errore.
STATUS_PORT_DISCONNECTED La porta di comunicazione è stata disconnessa. Si tratta di un codice di errore.
STATUS_THREAD_IS_TERMINATING L'attesa è stata interrotta perché il thread è stato terminato da un'applicazione o da un utente.
STATUS_TIMEOUT Intervallo di timeout scaduto prima del recapito del messaggio o prima della ricezione di una risposta. Si tratta di un codice di operazione riuscita.

Osservazioni

FltSendMessage invia un messaggio a un'applicazione in modalità utente per conto di un driver minifiltro o di un'istanza del driver minifiltro.

Se l'applicazione chiama FilterGetMessage per ottenere il messaggio prima che il driver minifilter chiami FltSendMessage per inviarlo, il messaggio viene recapitato immediatamente. Questo è in genere il caso in cui l'applicazione chiama FilterGetMessage dall'interno di un ciclo di messaggi.

In caso contrario, se un'applicazione non ha chiamato per ottenere un messaggio, il driver minifilter viene inserito in uno stato di attesa come indicato di seguito:

  • Se timeout è diverso da zero e l'applicazione chiama FilterGetMessage prima della scadenza dell'intervallo di timeout , il messaggio viene recapitato.

  • Se Timeout è diverso da zero e l'applicazione non chiama FilterGetMessage prima della scadenza dell'intervallo di timeout , il messaggio non viene recapitato e FltSendMessage restituisce STATUS_TIMEOUT. Nota: STATUS_TIMEOUT è un codice di operazione riuscita.

  • Se timeout è zero, il driver del minifiltro viene inserito in uno stato di attesa illimitato. Quando l'applicazione chiama FilterGetMessage, il messaggio viene recapitato.

Dopo il recapito del messaggio, se ReplyBuffer è NULL, FltSendMessage restituisce STATUS_SUCCESS.

In caso contrario, se ReplyBuffer non è NULL, il driver minifiltro viene inserito in uno stato di attesa come indicato di seguito:

  • Se timeout è diverso da zero e l'applicazione chiama FilterReplyMessage prima della scadenza dell'intervallo di timeout, il driver del minifiltro riceve la risposta e FltSendMessage restituisce STATUS_SUCCESS.

  • Se timeout è diverso da zero e il driver minifilter non riceve una risposta prima della scadenza dell'intervallo di timeout , FltSendMessage restituisce STATUS_TIMEOUT. Nota: STATUS_TIMEOUT è un codice di operazione riuscita.

  • Se timeout è zero quando il driver del minifiltro è in attesa della risposta, il driver minifiltro viene inserito in uno stato di attesa illimitato. Quando l'applicazione chiama FilterReplyMessage, il driver minifiltro riceve la risposta e FltSendMessage restituisce STATUS_SUCCESS.

Nota

 A causa dei requisiti di riempimento della struttura (specifici del sistema), l'accuratezza è necessaria quando si impostano le dimensioni dei buffer associati a FltSendMessage e FilterReplyMessage. Si supponga, ad esempio, che i dati debbano essere inviati tramite FilterReplyMessage a un minifiltro. A tale scopo, il componente in modalità utente potrebbe dichiarare la struttura seguente:

typedef struct _REPLY_STRUCT
{
    FILTER_REPLY_HEADER Header;
    MY_STRUCT Data;  // The structure to be sent to the minifilter
} REPLY_STRUCT, *PREPLY_STRUCT;

Data questa struttura, potrebbe sembrare ovvio che il chiamante di FilterReplyMessage impostare dwReplyBufferSize su sizeof(REPLY_STRUCT)e impostare il parametro ReplyLength di FltSendMessage sullo stesso valore. Tuttavia, a causa della spaziatura interna della struttura, sizeof(REPLY_STRUCT) potrebbe essere maggiore di sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT). In questo caso, FltSendMessage restituisce STATUS_BUFFER_OVERFLOW.

È quindi consigliabile chiamare FilterReplyMessage e FltSendMessage (sfruttando l'esempio precedente) impostando dwReplyBufferSize e ReplyLength sia su sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT) anziché su sizeof(REPLY_STRUCT). In questo modo, qualsiasi spaziatura interna aggiuntiva alla fine della struttura REPLY_STRUCT viene ignorata.

Fabbisogno

Requisito Valore
client minimo supportato Microsoft Windows 2000 Update Rollup 1 per SP4, Windows XP SP2, Windows Server 2003 SP1 e sistemi operativi successivi.
piattaforma di destinazione Universale
intestazione fltkernel.h (include FltKernel.h)
libreria FltMgr.lib
dll Fltmgr.sys
IRQL <= APC_LEVEL

Vedere anche

FilterGetMessage

FilterReplyMessage

FilterSendMessage

FltCreateCommunicationPort