FwpsInjectTransportSendAsync0-Funktion (fwpsk.h)
Die FwpsInjectTransportSendAsync0-Funktion fügt Paketdaten aus den Transport-, Datagrammdaten- oder ICMP-Fehlerebenen in den Sendedatenpfad ein.
Syntax
NTSTATUS FwpsInjectTransportSendAsync0(
[in] HANDLE injectionHandle,
[in, optional] HANDLE injectionContext,
[in] UINT64 endpointHandle,
[in] UINT32 flags,
[in, optional] FWPS_TRANSPORT_SEND_PARAMS0 *sendArgs,
[in] ADDRESS_FAMILY addressFamily,
[in] COMPARTMENT_ID compartmentId,
[in, out] NET_BUFFER_LIST *netBufferList,
[in] FWPS_INJECT_COMPLETE0 completionFn,
[in, optional] HANDLE completionContext
);
Parameter
[in] injectionHandle
Ein Einschleusungshandle, das zuvor durch einen Aufruf von erstellt wurde FwpsInjectionHandleCreate0-Funktion .
[in, optional] injectionContext
Ein optionales Handle für den Einschleusungskontext. Wenn angegeben, kann sie durch Aufrufen der FwpsQueryPacketInjectionState0-Funktion abgerufen werden, wenn der FWPS_PACKET_INJECTION_STATE Zustand der Paketeinschleusung FWPS_PACKET_INJECTED_BY_SELF oder FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF ist.
[in] endpointHandle
Ein Handle, das den Stapeltransportendpunkt im Sendedatenpfad angibt, in den das Paket eingefügt werden soll. Dieses Endpunkthandle wird für eine Legende über das element transportEndpointHandle des -Elements bereitgestellt. FWPS_INCOMING_METADATA_VALUES0 Struktur, die an die Legendenfunktion "klassifizierenFn " des Legendentreibers übergeben wird. Legendentreiber sollten das bereitgestellte Handle verwenden, um geklonte Pakete so schnell wie möglich wieder in den Datenpfad einzufügen, bevor der socket, der dem Stapelendpunkt zugeordnet ist, geschlossen wird und das Handle nicht mehr gültig ist.
[in] flags
Reserviert. Legendentreiber müssen diesen Parameter auf 0 (null) festlegen.
[in, optional] sendArgs
Ein Zeiger auf eine FWPS_TRANSPORT_SEND_PARAMS0 Struktur, die die Eigenschaften des aktuellen ausgehenden Pakets angibt. Kann nur NULL sein, wenn die zu einfügende Netzwerkpufferliste einen IP-Header enthält (z. B. wenn das Paket über einen unformatierten Socket gesendet wird).
[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 für eine Legende über das compartmentId-Element des FWPS_INCOMING_METADATA_VALUES0 Struktur, die an die Legendenfunktion "klassifizierenFn " des Legendentreibers übergeben wird. Wenn das element compartmentId 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, out] netBufferList
Ein Zeiger auf eine NET_BUFFER_LIST-Struktur , die die Paketdaten beschreibt, die eingefügt werden. Ein Legendentreiber ordnet eine NET_BUFFER_LIST-Struktur zu, die zum Einfügen von Paketdaten verwendet werden soll, indem entweder die FwpsAllocateCloneNetBufferList0-Funktion oder die FwpsAllocateNetBufferAndNetBufferList0-Funktion .
[in] completionFn
Ein Zeiger auf eine vom Legendentreiber bereitgestellte completionFn-Beschriftungsfunktion. Die Filter-Engine ruft diese Funktion auf, nachdem die durch den netBufferList-Parameter beschriebenen Paketdaten in den Netzwerkstapel eingefügt wurden.
[in, optional] completionContext
Ein Zeiger auf einen vom Legendentreiber 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 FwpsInjectNetworkSendAsync0-Funktion gibt einen der folgenden NTSTATUS-Codes zurück.
Rückgabecode | Beschreibung |
---|---|
|
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 anschließend ein Fehler aufgetreten ist. Im Falle eines Fehlers gibt der Status-Member der abgeschlossenen NET_BUFFER_LIST-Struktur den Grund für den Fehler an. |
|
Der TCP/IP-Netzwerkstapel ist nicht bereit, die Einschleusung von Paketdaten zu akzeptieren. |
|
Der Injektionshandle wird geschlossen. |
|
Ein Fehler ist aufgetreten. |
Hinweise
Ein Legendentreiber ruft die FwpsInjectNetworkSendAsync0-Funktion auf, um Paketdaten aus den Transport-, Datagrammdaten- oder ICMP-Fehlerebenen in den Sendedatenpfad einzufügen. Auf diesen Ebenen ist der IP-Header möglicherweise noch nicht gebildet, und wenn die IPsec-Richtlinie aktiv ist, werden die Paketdaten nicht verschlüsselt oder signiert. Daher ist diese Funktion ideal für die Paketüberprüfung in einer IPsec-fähigen Umgebung geeignet.
Diese Funktion kann asynchron ausgeführt werden.
Wenn der Rückgabewert nicht STATUS_SUCCESS ist, wird die Vervollständigungsfunktion nicht aufgerufen. In diesem Fall muss die netBufferList-Liste, auf die von netBufferList verwiesen wird, durch einen Aufruf von FwpsFreeNetBufferList0 oder FwpsFreeCloneNetBufferList0 freigegeben werden.
Legendentreiber injizieren normalerweise Daten in den Netzwerkstapel, wenn sie Paketdaten ändern. Weitere Informationen dazu, wie ein Legendentreiber Paketdaten ändern kann, finden Sie unter Aufruftreibervorgänge.
Aufgrund der TCP-Protokollsperrungssemantik kann TCP nur out of Band auf jeder Transportschicht oder einer entsprechenden Ebene eingefügt werden, sodass FwpsInjectTransportReceiveAsync0 und FwpsInjectTransportSendAsync0 in die Warteschlange gestellt und von einem DPC ausgeführt werden müssen.
Das eingefügte Paket kann dem Legendentreiber erneut angezeigt werden. Um endlose Schleifen zu verhindern, sollte der Treiber zuerst die FwpsQueryPacketInjectionState0-Funktion aufrufen, bevor die Calloutfunktion klassifizierenFn aufgerufen wird, und Pakete zulassen, deren Einschleusungszustand auf FWPS_PACKET_INJECTED_BY_SELF oder FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF festgelegt FWPS_PACKET_INJECTION_STATE.
Der endpointHandle-Parameter sowie Member, die im FWPS_TRANSPORT_SEND_PARAMS0 Struktur, auf die der sendArgs-Parameter verweist, werden für Legenden aus den folgenden Netzwerkebenen bereitgestellt:
- FWPS_LAYER_OUTBOUND_TRANSPORT_V4
- FWPS_LAYER_OUTBOUND_TRANSPORT_V6
- FWPS_LAYER_DATAGRAM_DATA_V4 (wenn die ausgehende Richtung mit FWP_DIRECTION_OUTBOUND angegeben wird)
- FWPS_LAYER_DATAGRAM_DATA_V6 (wenn die ausgehende Richtung mit FWP_DIRECTION_OUTBOUND angegeben wird)
- FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4
- FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6
Das Datagramm gehört zu einem Unformatierten Socket, wenn beide der folgenden Punkte zutreffen:
- Für das currentMetadataValues-Element der FWPS_INCOMING_METADATA_VALUES0-Struktur ist das flag FWPS_METADATA_FIELD_IP_HEADER_SIZE festgelegt.
- Der ipHeaderSize-Member der FWPS_INCOMING_METADATA_VALUES0-Struktur ist größer als 0 (null).
Wenn das Datagramm auf den folgenden Netzwerkebenen zu einem Rohsocket gehört, muss die netBufferList-Liste angepasst werden, auf die von netBufferList verwiesen wird, um am IP-Header zu beginnen (der der Netzwerkpufferliste vorangestellt werden muss):
- FWPS_LAYER_DATAGRAM_DATA_V4 (wenn die ausgehende Richtung mit FWP_DIRECTION_OUTBOUND angegeben wird)
- FWPS_LAYER_DATAGRAM_DATA_V6 (wenn die ausgehende Richtung mit FWP_DIRECTION_OUTBOUND angegeben wird)
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 |