fwpsInjectTransportReceiveAsync0-Funktion (fwpsk.h)

Die FwpsInjectTransportReceiveAsync0-Funktion fügt Paketdaten aus den Transport-, Datagrammdaten- oder ICMP-Fehlerebenen in den Empfangsdatenpfad ein.

HinweisFwpsInjectTransportReceiveAsync0 ist eine bestimmte Version von FwpsInjectTransportReceiveAsync. Weitere Informationen finden Sie unter WFP Version-Independent Namen und Zielgruppenspezifische Windows-Versionen .
 

Syntax

NTSTATUS FwpsInjectTransportReceiveAsync0(
  [in]           HANDLE                injectionHandle,
  [in, optional] HANDLE                injectionContext,
                 PVOID                 reserved,
  [in]           UINT32                flags,
  [in]           ADDRESS_FAMILY        addressFamily,
  [in]           COMPARTMENT_ID        compartmentId,
  [in]           IF_INDEX              interfaceIndex,
  [in]           IF_INDEX              subInterfaceIndex,
  [in, out]      NET_BUFFER_LIST       *netBufferList,
  [in]           FWPS_INJECT_COMPLETE0 completionFn,
  [in, optional] HANDLE                completionContext
);

Parameter

[in] injectionHandle

Ein Einschleusungshandle, der zuvor durch einen Aufruf des erstellt wurde FwpsInjectionHandleCreate0-Funktion .

[in, optional] injectionContext

Ein optionales Handle für den Einschleusungskontext. Falls angegeben, kann sie durch Aufrufen der Funktion FwpsQueryPacketInjectionState0 abgerufen werden, wenn der Paketeinschleusungszustand FWPS_PACKET_INJECTION_STATEFWPS_PACKET_INJECTED_BY_SELF oder FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF ist.

reserved

Reserviert. Legendentreiber müssen diesen Parameter auf 0 festlegen.

[in] flags

Reserviert. Legendentreiber müssen diesen Parameter auf 0 festlegen.

[in] addressFamily

Eine der folgenden Adressfamilien:

AF_INET

Die IPv4-Adressfamilie.

AF_INET6

Die IPv6-Adressfamilie.

[in] compartmentId

Der Bezeichner des Routingfachs, in das die Paketdaten eingefügt werden, wird als COMPARTMENT_ID Typ angegeben. Dieser Bezeichner wird einer Legende über das compartmentId-Element des FWPS_INCOMING_METADATA_VALUES0 Struktur, die an die Legendenfunktion klassifizierenFn des Legendentreibers übergeben wird. Wenn das compartmentId-Element für Legenden verfügbar ist, wird FWPS_METADATA_FIELD_COMPARTMENT_ID im currentMetadataValues-Element festgelegt. Legen Sie andernfalls diesen Parameter auf UNSPECIFIED_COMPARTMENT_ID fest.

[in] interfaceIndex

Der Index der Schnittstelle, auf der die ursprünglichen Paketdaten empfangen wurden. Ein Legendentreiber sollte den Wert des Schnittstellenindexes verwenden, der als einer der eingehenden Datenwerte an seine KlassifizierungFn-Legendenfunktion für diesen Parameter übergeben wird, wenn das Paket in dieselbe Schnittstelle eingefügt werden soll, an der das ursprüngliche Paket angegeben wurde.

[in] subInterfaceIndex

Der Index der Unteroberfläche, auf der die ursprünglichen Paketdaten empfangen wurden. Ein Legendentreiber sollte den Wert des Unteroberflächesindex verwenden, der als einer der eingehenden Datenwerte an die KlassifizierungFn-Legendenfunktion für diesen Parameter übergeben wird, wenn das Paket in dieselbe Unteroberfläche eingefügt werden soll, in der das ursprüngliche Paket angegeben wurde.

[in, out] netBufferList

Ein Zeiger auf eine NET_BUFFER_LIST-Struktur , die die Paketdaten beschreibt, die eingefügt werden. Ein Legendentreiber weist eine NET_BUFFER_LIST-Struktur zu, die zum Einfügen von Paketdaten verwendet werden soll, indem entweder die Funktion FwpsAllocateCloneNetBufferList0 oder die Funktion FwpsAllocateNetBufferAndNetBufferList0 aufgerufen wird. Die NET_BUFFER_LIST-Struktur muss mit einem IP-Header beginnen.

[in] completionFn

Ein Zeiger auf eine vom Legendentreiber bereitgestellte funktion completionFn . Die Filter-Engine ruft diese Funktion auf, nachdem die Paketdaten, die durch den netBufferList-Parameter beschrieben werden, in den Netzwerkstapel eingefügt wurden.

[in, optional] completionContext

Ein Zeiger auf einen mit Legendentreibern bereitgestellten Kontext, der an die Legendenfunktion übergeben wird, auf die der completionFn-Parameter verweist. Dieser Parameter ist optional und kann NULL sein.

Rückgabewert

Die FwpsInjectTransportReceiveAsync0-Funktion gibt einen der folgenden NTSTATUS-Codes zurück.

Rückgabecode Beschreibung
STATUS_SUCCESS
Die Paketdateneinschleusung wurde erfolgreich initiiert. Die Filter-Engine ruft die Vervollständigungsfunktion auf, nachdem die Filter-Engine die Einschleusung der Paketdaten in den Netzwerkstapel abgeschlossen hat oder wenn später ein Fehler aufgetreten ist. Im Falle eines Fehlers gibt das Statuselement der abgeschlossenen NET_BUFFER_LIST-Struktur den Grund für den Fehler an.
STATUS_FWP_TCPIP_NOT_READY
Der TCP/IP-Netzwerkstapel ist nicht bereit, die Einschleusung von Paketdaten zu akzeptieren.
STATUS_FWP_INJECT_HANDLE_CLOSING
Der Einschleusungsgriff wird geschlossen.
Andere status Codes
Ein Fehler ist aufgetreten.

Hinweise

Ein Legendentreiber ruft die FwpsInjectTransportReceiveAsync0-Funktion auf, um Paketdaten aus den Transport-, Datagrammdaten- oder ICMP-Fehlerebenen in den Empfangsdatenpfad einzufügen. Diese Funktion kann asynchron ausgeführt werden. Legendentreiber injizieren normalerweise Daten in den Netzwerkstapel, wenn sie Paketdaten ändern. Weitere Informationen dazu, wie ein Legendentreiber Paketdaten ändern kann, finden Sie unter Callout-Treibervorgänge.

Wenn ein Legendentreiber ein Paket geändert hat, das er mit FwpsInjectTransportReceiveAsync0 einbindet, sollte er die aufrufen FwpsConstructIpHeaderForTransportPacket0-Funktion zum Korrigieren der IP- und TCP-, UDP- und ICMP-Prüfsummen. Der headerIncludeHeaderSize-Parameter von FwpsConstructIpHeaderForTransportPacket0 sollte den gleichen Wert wie das ipHeaderSize-Element des FWPS_INCOMING_METADATA_VALUES0 Struktur, die an den parameter inMetaValues der Legendenfunktion klassifizierenFn des Legendentreibers übergeben wird.

Wenn der Rückgabewert nicht STATUS_SUCCESS ist, wird die Vervollständigungsfunktion nicht aufgerufen. In diesem Fall muss die Von netBufferList auf die Net-Pufferliste verwiesen wird, durch einen Aufruf von FwpsFreeNetBufferList0 oder FwpsFreeCloneNetBufferList0.

Wenn die ursprünglichen eingehenden Paketdaten der IPsec-Richtlinienerzwingung unterliegen, als sie ursprünglich von der Transportschicht verarbeitet wurden, wird das geklonte Paket, das von dieser Funktion eingefügt wurde, die IPsec-Überprüfung umgehen, wenn es den Netzwerkstapel erneut öffnet. Lokal generierte eingehende Pakete, die die Funktion FwpsAllocateNetBufferAndNetBufferList0 verwenden, umgehen auch die IPsec-Überprüfung.

Damit IPsec eingehende Pakete zuerst verarbeiten kann, muss die Legende, die die Transportschichtdaten überprüft, einen niedrigeren Wert von subLayerWeight in der FWPS_FILTER0-Struktur aufweisen als die universelle Unterschicht. Darüber hinaus darf der Legendentreiber keine Tunnelmoduspakete abfangen, für die die Kombination von FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 Mitglieder ( isTunnelMode && ! isDeTunneled ) wird von zurückgegeben. FwpsGetPacketListSecurityInformation0-Funktion . Der Legendentreiber muss warten, bis das Paket enttunnelt wurde, und sollte es dann auf der Transportschicht oder auf einer Vorwärtsschicht abfangen.

Aufgrund der TCP-Protokollsperrungssemantik kann TCP nur out of Band auf einer beliebigen Transportschicht oder einer gleichwertigen Schicht eingefügt werden, sodass FwpsInjectTransportReceiveAsync0 und FwpsInjectTransportSendAsync0 von einem DPC in die Warteschlange gestellt und ausgeführt werden müssen.

Diese Funktion kann von einer der folgenden Transportebenen aufgerufen werden, wenn das FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED Metadatenflag nicht festgelegt ist:

FWPS_LAYER_INBOUND_TRANSPORT_V4

FWPS_LAYER_INBOUND_TRANSPORT_V6

FWPS_LAYER_DATAGRAM_DATA_V4 (wenn eingehende Richtung mit FWP_DIRECTION_INBOUND angegeben wird)

FWPS_LAYER_DATAGRAM_DATA_V6 (wenn eingehende Richtung mit FWP_DIRECTION_INBOUND angegeben wird)

FWPS_LAYER_INBOUND_ICMP_ERROR_V4

FWPS_LAYER_INBOUND_ICMP_ERROR_V6

Andernfalls sollte diese Funktion von den folgenden ALE-Ebenen (Application Layer Enforcement) aufgerufen werden, nachdem ein pended ALE-Vorgang mit einem Aufruf von FwpsPendOperation0 initiiert und mit einem Aufruf von FwpsCompleteOperation0 abgeschlossen wurde:

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4

FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6

Eine zu einfügende Nettopufferliste muss als netBufferList-Argument an die Funktion FwpsCompleteOperation0 übergeben werden.

Das eingefügte Paket kann dem Legendentreiber erneut angezeigt werden. Um endlose Schleifen zu verhindern, sollte der Treiber zuerst die Die FwpsQueryPacketInjectionState0-Funktion , bevor Sie mit einem Aufruf der Legendenfunktion klassifizierenFn fortfahren, und der Treiber sollte Paketen, die den Einschleusungszustand FWPS_PACKET_INJECTION_STATE auf FWPS_PACKET_INJECTED_BY_SELF oder FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF festgelegt haben, zulassen, dass sie unverändert durchgehen.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Verfügbar ab Windows Vista.
Zielplattform Universell
Header fwpsk.h (include fwpsk.h)
Bibliothek Fwpkclnt.lib
IRQL <= DISPATCH_LEVEL

Weitere Informationen

FWPS_FILTER0

FWPS_FILTER_CONDITION0

FWPS_INCOMING_METADATA_VALUES0

FWPS_PACKET_INJECTION_STATE

FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 FwpsAllocateCloneNetBufferList0 FwpsAllocateNetBufferAndNetBufferList0

FwpsCompleteOperation0

FwpsFreeCloneNetBufferList0

FwpsFreeNetBufferList0

FwpsGetPacketListSecurityInformation0

FwpsInjectNetworkSendAsync0

FwpsInjectionHandleCreate0

FwpsInjectionHandleDestroy0

FwpsPendOperation0

FwpsQueryPacketInjectionState0

NET_BUFFER_LIST

klassifizierenFn

completionFn