Funzione FwpsInjectTransportSendAsync0 (fwpsk.h)
La funzione FwpsInjectTransportSendAsync0 inserisce i dati dei pacchetti dai livelli di errore transport, datagram o ICMP nel percorso di invio dei dati.
Sintassi
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
);
Parametri
[in] injectionHandle
Handle di inserimento creato in precedenza da una chiamata all'oggetto Funzione FwpsChangectionHandleCreate0 .
[in, optional] injectionContext
Handle facoltativo nel contesto di inserimento. Se specificato, può essere ottenuto chiamando la funzione FwpsQueryPacketChangectionState0 quando lo stato di inserimento dei pacchetti FWPS_PACKET_INJECTION_STATE è FWPS_PACKET_INJECTED_BY_SELF o FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF.
[in] endpointHandle
Handle che indica l'endpoint di trasporto dello stack nel percorso di invio dei dati in cui deve essere inserito il pacchetto. Questo handle endpoint viene fornito a un callout tramite il membro transportEndpointHandle del FWPS_INCOMING_METADATA_VALUES0 struttura passata alla funzione di callout del driver di classificazioneFn . I driver di callout devono usare l'handle fornito per inserire pacchetti clonati nuovamente nel percorso dati non appena possibile, prima che il socket associato all'endpoint dello stack sia chiuso e l'handle non sia più valido.
[in] flags
Riservato. I driver di callout devono impostare questo parametro su zero.
[in, optional] sendArgs
Puntatore a FWPS_TRANSPORT_SEND_PARAMS0 struttura che specifica le proprietà del pacchetto in uscita corrente. Può essere NULL solo se l'elenco di buffer net da inserire contiene un'intestazione IP, ad esempio se il pacchetto viene inviato tramite un socket non elaborato.
[in] addressFamily
Una delle famiglie di indirizzi seguenti:
AF_INET
Famiglia di indirizzi IPv4.
AF_INET6
Famiglia di indirizzi IPv6.
[in] compartmentId
Identificatore del raggruppamento di routing in cui vengono inseriti i dati del pacchetto, specificati come tipo di COMPARTMENT_ID . Questo identificatore viene fornito a un callout tramite il membro compartmentId del FWPS_INCOMING_METADATA_VALUES0 struttura passata alla funzione di callout del driver di classificazioneFn . Se il membro compartmentId è disponibile per i callout, FWPS_METADATA_FIELD_COMPARTMENT_ID verrà impostato nel membro currentMetadataValues . In caso contrario, impostare questo parametro su UNSPECIFIED_COMPARTMENT_ID.
[in, out] netBufferList
Puntatore a una struttura NET_BUFFER_LIST che descrive i dati dei pacchetti inseriti. Un driver di callout alloca una struttura NET_BUFFER_LIST da usare per inserire i dati dei pacchetti chiamando una delle due Funzione FwpsAllocateCloneNetBufferList0 o Funzione FwpsAllocateNetBufferAndNetBufferList0 .
[in] completionFn
Puntatore a una funzione callout di completamentoFn fornita dal driver di callout. Il motore di filtro chiama questa funzione dopo i dati del pacchetto, descritti dal parametro netBufferList , è stato inserito nello stack di rete.
[in, optional] completionContext
Puntatore a un contesto fornito dal driver di callout passato alla funzione callout a cui fa riferimento il parametro completamentoFn . Questo parametro è facoltativo e può essere NULL.
Valore restituito
La funzione FwpsInjectNetworkSendAsync0 restituisce uno dei codici NTSTATUS seguenti.
Codice restituito | Descrizione |
---|---|
|
L'inserimento dei dati dei pacchetti è stato avviato correttamente. Il motore di filtro chiamerà la funzione di completamento dopo che il motore di filtro ha completato l'inserimento dei dati del pacchetto nello stack di rete o quando si è verificato un errore successivamente. In caso di errore, il membro Stato della struttura di NET_BUFFER_LIST completata indicherà il motivo dell'errore. |
|
Lo stack di rete TCP/IP non è pronto per accettare l'inserimento dei dati dei pacchetti. |
|
L'handle di inserimento viene chiuso. |
|
Si è verificato un errore. |
Commenti
Un driver di callout chiama la funzione FwpsInjectNetworkSendAsync0 per inserire i dati dei pacchetti dai livelli di errore transport, datagram o ICMP nel percorso dei dati di invio. A questi livelli, l'intestazione IP potrebbe non essere ancora formata e quando i criteri IPsec sono attivi, i dati dei pacchetti non vengono crittografati o firmati. Pertanto, questa funzione è ideale da usare per l'ispezione dei pacchetti in un ambiente abilitato per IPsec.
Questa funzione può essere eseguita in modo asincrono.
Se il valore restituito non è STATUS_SUCCESS, la funzione di completamento non verrà chiamata. In questo caso, l'elenco di buffer net puntato a netBufferList deve essere liberato da una chiamata a FwpsFreeNetBufferList0 o FwpsFreeCloneNetBufferList0.
I driver di callout in genere inseriscono i dati nello stack di rete quando modificano i dati dei pacchetti. Per altre informazioni sul modo in cui un driver di callout può modificare i dati dei pacchetti, vedere Callout Driver Operations.For more information about how a callout driver driver can modify packet data, see Callout Driver Operations.
A causa della semantica di blocco del protocollo TCP, TCP può essere inserito solo fuori banda in qualsiasi livello di trasporto o livello equivalente, quindi FwpsInjectTransportReceiveAsync0 e FwpsInjectTransportSendAsync0 devono essere accodati ed eseguiti da un DPC.
Il pacchetto inserito può essere indicato di nuovo al driver di callout. Per evitare il ciclo infinito, il driver deve prima chiamare la funzione FwpsQueryPacketChangectionState0 prima di chiamare la funzione callout di classificazioneFn e consentire pacchetti con stato di inserimento FWPS_PACKET_INJECTION_STATE impostato su FWPS_PACKET_INJECTED_BY_SELF o FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF.
Parametro endpointHandle , nonché membri dichiarati nell'oggetto FWPS_TRANSPORT_SEND_PARAMS0 struttura a cui punta il parametro sendArgs , vengono forniti callout dai livelli di rete seguenti:
- FWPS_LAYER_OUTBOUND_TRANSPORT_V4
- FWPS_LAYER_OUTBOUND_TRANSPORT_V6
- FWPS_LAYER_DATAGRAM_DATA_V4 (quando viene specificata la direzione in uscita con FWP_DIRECTION_OUTBOUND)
- FWPS_LAYER_DATAGRAM_DATA_V6 (quando viene specificata la direzione in uscita con FWP_DIRECTION_OUTBOUND)
- FWPS_LAYER_OUTBOUND_ICMP_ERROR_V4
- FWPS_LAYER_OUTBOUND_ICMP_ERROR_V6
Il datagram appartiene a un socket non elaborato se entrambe le operazioni seguenti sono vere:
- Il membro currentMetadataValues della struttura FWPS_INCOMING_METADATA_VALUES0 ha il flag FWPS_METADATA_FIELD_IP_HEADER_SIZE impostato.
- Il membro ipHeaderSize della struttura FWPS_INCOMING_METADATA_VALUES0 è maggiore di zero.
Nei livelli di rete seguenti, se il datagram appartiene a un socket non elaborato, l'elenco di buffer net puntato a netBufferList deve essere modificato per iniziare all'intestazione IP (che deve essere prependato all'elenco di buffer net):
- FWPS_LAYER_DATAGRAM_DATA_V4 (quando viene specificata la direzione in uscita con FWP_DIRECTION_OUTBOUND)
- FWPS_LAYER_DATAGRAM_DATA_V6 (quando viene specificata la direzione in uscita con FWP_DIRECTION_OUTBOUND)
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Disponibile a partire da Windows Vista. |
Piattaforma di destinazione | Universale |
Intestazione | fwpsk.h (includere Fwpsk.h) |
Libreria | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |