Freigeben über


FltSendMessage-Funktion (fltkernel.h)

FltSendMessage eine Nachricht an eine wartende Benutzermodusanwendung im Auftrag eines Minifiltertreibers oder einer Minifiltertreiberinstanz sendet.

Syntax

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

Parameter

[in] Filter

Undurchsichtiger Filterzeiger für den Aufrufer. Dieser Parameter ist erforderlich und kann nicht NULL-werden.

[in] ClientPort

Zeiger auf eine Variable, die den undurchsichtigen Clientportzeiger für den Verbindungsport zwischen der Benutzermodusanwendung und dem Kernelmodus-Minifiltertreiber enthält. Weitere Informationen zum Clientportzeiger finden Sie in der Beschreibung des ConnectNotifyCallback- Parameters im Referenzeintrag für FltCreateCommunicationPort.

[in] SenderBuffer

Zeigen Sie auf einen vom Aufrufer zugewiesenen Puffer, der die Nachricht enthält, die an die Benutzermodusanwendung gesendet werden soll. Dieser Parameter ist erforderlich und kann nicht NULL-werden.

[in] SenderBufferLength

Größe des Puffers in Bytes, auf den SenderBuffer verweist. Weitere Informationen finden Sie in Anmerkungen.

[out, optional] ReplyBuffer

Zeigen Sie auf einen vom Aufrufer zugewiesenen Puffer, der die Antwort (sofern vorhanden) von der Anwendung empfängt. Dieser Parameter ist optional und kann NULL-werden.

[in, out] ReplyLength

Größe des Puffers, auf den "ReplyBuffer" in Bytes verweist. Dieser Parameter ist optional, muss jedoch nichtNULL- sein, wenn ReplyBuffer- nicht NULL-ist.

[in, optional] Timeout

Ein Zeiger auf einen Timeoutwert, der die absolute oder relative Zeitdauer in Einheiten von 100 Nanosekunden angibt, für die der Aufrufer in einen Wartezustand versetzt werden kann, bis die Nachricht von der Anwendung für den Benutzermodus empfangen wird und bis sie eine Antwort empfängt (sofern erwartet).

Ein positiver Wert gibt eine absolute Zeit im Verhältnis zum 1. Januar 1601 an. Ein negativer Wert gibt ein Intervall relativ zur aktuellen Uhrzeit an. Wird auf NULL- festgelegt, wenn der Aufrufer unbegrenzt in einen Wartezustand versetzt werden kann.

Rückgabewert

FltSendMessage gibt STATUS_SUCCESS oder einen geeigneten NTSTATUS-Wert zurück, z. B. einen der folgenden:

Rückgabecode Beschreibung
STATUS_INSUFFICIENT_RESOURCES FltSendMessage ein Poolzuordnungsfehler aufgetreten ist. Dies ist ein Fehlercode.
STATUS_PORT_DISCONNECTED Der Kommunikationsport wurde getrennt. Dies ist ein Fehlercode.
STATUS_THREAD_IS_TERMINATING Die Wartezeit wurde unterbrochen, da der Thread von einer Anwendung oder einem Benutzer beendet wurde.
STATUS_TIMEOUT Das Timeout Intervall abgelaufen, bevor die Nachricht übermittelt werden konnte oder bevor eine Antwort empfangen wurde. Dies ist ein Erfolgscode.

Bemerkungen

FltSendMessage sendet eine Nachricht im Auftrag eines Minifiltertreibers oder einer Minifiltertreiberinstanz an eine Benutzermodusanwendung.

Wenn die Anwendung FilterGetMessage- aufruft, um die Nachricht abzurufen, bevor der Minifiltertreiber FltSendMessage aufruft, um sie zu senden, wird die Nachricht sofort zugestellt. Dies ist in der Regel der Fall, wenn die Anwendung FilterGetMessage- aus einer Nachrichtenschleife aufruft.

Andernfalls wird der Minifiltertreiber wie folgt in einen Wartezustand versetzt, wenn eine Anwendung nicht zum Abrufen einer Nachricht aufgerufen wurde:

  • Wenn Timeout- nicht null ist und die Anwendung FilterGetMessage- aufruft, bevor das Timeout Intervall abläuft, wird die Nachricht zugestellt.

  • Wenn Timeout- ungleich Null ist und die Anwendung FilterGetMessage- nicht aufruft, bevor das Timeout Intervall abläuft, wird die Nachricht nicht übermittelt, und FltSendMessage gibt STATUS_TIMEOUT zurück. (Hinweis: STATUS_TIMEOUT ist ein Erfolgscode.)

  • Wenn Timeout- null ist, wird der Minifiltertreiber auf unbestimmte Zeit in einen Wartezustand versetzt. Wenn die Anwendung FilterGetMessage-aufruft, wird die Nachricht zugestellt.

Wenn ReplyBufferNULL-ist, gibt FltSendMessage STATUS_SUCCESS zurück.

Andernfalls, wenn ReplyBuffer nicht NULL-ist, wird der Minifiltertreiber wie folgt in einen Wartezustand versetzt:

  • Wenn Timeout- nicht null ist und die Anwendung FilterReplyMessage- aufruft, bevor das Timeout Intervall abläuft, empfängt der Minifiltertreiber die Antwort, und FltSendMessage gibt STATUS_SUCCESS zurück.

  • Wenn Timeout- nicht null ist und der Minifiltertreiber keine Antwort empfängt, bevor das Timeout Intervall abläuft, gibt FltSendMessage STATUS_TIMEOUT zurück. (Hinweis: STATUS_TIMEOUT ist ein Erfolgscode.)

  • Wenn Timeout- null ist, wenn der Minifiltertreiber auf die Antwort wartet, wird der Minifiltertreiber unbegrenzt in einen Wartezustand versetzt. Wenn die Anwendung FilterReplyMessage-aufruft, empfängt der Minifiltertreiber die Antwort, und FltSendMessage- gibt STATUS_SUCCESS zurück.

Anmerkung

 Aufgrund (systemspezifischer) Strukturabstandsanforderungen ist die Genauigkeit erforderlich, wenn Sie die Größe von Puffern festlegen, die FltSendMessage und FilterReplyMessage-zugeordnet sind. Nehmen wir beispielsweise an, dass Daten über FilterReplyMessage- an einen Minifilter gesendet werden müssen. Die Benutzermoduskomponente deklariert möglicherweise die folgende Struktur, um dies zu tun:

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

Angesichts dieser Struktur scheint es offensichtlich, dass der Aufrufer von FilterReplyMessage-dwReplyBufferSize auf sizeof(REPLY_STRUCT)festlegen und den ReplyLength Parameter von FltSendMessage auf denselben Wert festlegen würde. Aufgrund von Strukturabstands-Idiosyncrasien kann sizeof(REPLY_STRUCT) jedoch größer als sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT)sein. Wenn dies der Fall ist, gibt FltSendMessage STATUS_BUFFER_OVERFLOW zurück.

Daher wird empfohlen, FilterReplyMessage- und FltSendMessage- (unter Verwendung des obigen Beispiels) aufzurufen, indem Sie dwReplyBufferSize- und ReplyLength sowohl sizeof(FILTER_REPLY_HEADER) + sizeof(MY_STRUCT) als auch sizeof(REPLY_STRUCT)festlegen. Dadurch wird sichergestellt, dass alle zusätzlichen Abstände am Ende der REPLY_STRUCT Struktur ignoriert werden.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Microsoft Windows 2000 UpdateRollup 1 für SP4, Windows XP SP2, Windows Server 2003 SP1 und höhere Betriebssysteme.
Zielplattform- Universal
Header- fltkernel.h (include FltKernel.h)
Library FltMgr.lib
DLL- Fltmgr.sys
IRQL- <= APC_LEVEL

Siehe auch

FilterGetMessage-

FilterReplyMessage-

FilterSendMessage-

FltCreateCommunicationPort