Funzione FwpsInjectTransportReceiveAsync0 (fwpsk.h)
La funzione FwpsInjectTransportReceiveAsync0 inserisce i dati dei pacchetti dai livelli di errore transport, datagram o ICMP nel percorso dati di ricezione.
Sintassi
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
);
Parametri
[in] injectionHandle
Handle injection creato in precedenza da una chiamata all'oggetto Funzione FwpsChangectionHandleCreate0 .
[in, optional] injectionContext
Handle facoltativo per il 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.
reserved
Riservato. I driver di callout devono impostare questo parametro su zero.
[in] flags
Riservato. I driver di callout devono impostare questo parametro su zero.
[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 callout del driver di callout classifyFn . 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] interfaceIndex
Indice dell'interfaccia in cui sono stati ricevuti i dati del pacchetto originale. Un driver di callout deve usare il valore dell'indice di interfaccia passato come uno dei valori dei dati in ingresso alla funzione callout classifyFn per questo parametro se il pacchetto deve essere inserito nella stessa interfaccia in cui è stato indicato il pacchetto originale.
[in] subInterfaceIndex
Indice della sottointerfaccia in cui sono stati ricevuti i dati del pacchetto originale. Un driver di callout deve usare il valore dell'indice dell'interfaccia secondaria passato come uno dei valori di dati in ingresso alla funzione callout classifyFn per questo parametro se il pacchetto deve essere inserito nella stessa sottointerfaccia in cui è stato indicato il pacchetto originale.
[in, out] netBufferList
Puntatore a una struttura di NET_BUFFER_LIST che descrive i dati del pacchetto che vengono inseriti. Un driver di callout alloca una struttura di NET_BUFFER_LIST da usare per inserire i dati dei pacchetti chiamando la funzione FwpsAllocateCloneNetBufferList0 o la funzione FwpsAllocateNetBufferAndNetBufferList0 . La struttura NET_BUFFER_LIST deve iniziare con un'intestazione IP.
[in] completionFn
Puntatore a una funzione callout completionFn fornita dal driver del callout. Il motore di filtro chiama questa funzione dopo che i dati del pacchetto, descritti dal parametro netBufferList , sono stati inseriti nello stack di rete.
[in, optional] completionContext
Puntatore a un contesto fornito dal driver di callout passato alla funzione callout a cui punta il parametro completionFn . Questo parametro è facoltativo e può essere NULL.
Valore restituito
La funzione FwpsInjectTransportReceiveAsync0 restituisce uno dei codici NTSTATUS seguenti.
Codice restituito | Descrizione |
---|---|
|
L'inserimento dei dati del pacchetto è 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 Status della struttura NET_BUFFER_LIST completata indicherà il motivo dell'errore. |
|
Lo stack di rete TCP/IP non è pronto per accettare l'inserimento di dati di pacchetto. |
|
L'handle di inserimento viene chiuso. |
|
Si è verificato un errore. |
Commenti
Un driver callout chiama la funzione FwpsInjectTransportReceiveAsync0 per inserire i dati dei pacchetti dai livelli di errore di trasporto, datagrammi o ICMP nel percorso dati di ricezione. Questa funzione può essere eseguita in modo asincrono. I driver di callout in genere inseriscono i dati nello stack di rete durante la modifica dei dati dei pacchetti. Per altre informazioni su come un driver callout può modificare i dati dei pacchetti, vedere Callout Driver Operations.
Se un driver callout ha modificato un pacchetto che verrà inserita con FwpsInjectTransportReceiveAsync0, deve chiamare il Funzione FwpsConstructIpHeaderForTransportPacket0 per correggere i checksum del protocollo IP e di livello superiore (TCP, UDP e ICMP). Il parametro headerIncludeHeaderSize di FwpsConstructIpHeaderForTransportPacket0 deve essere lo stesso valore del membro ipHeaderSize del FWPS_INCOMING_METADATA_VALUES0 struttura passata al parametro inMetaValues della funzione callout del driver di callout.
Se il valore restituito non è STATUS_SUCCESS, la funzione di completamento non verrà chiamata. In questo caso, l'elenco di net buffer a cui punta netBufferList deve essere liberato da una chiamata a FwpsFreeNetBufferList0 o FwpsFreeCloneNetBufferList0.
Se i dati originali dei pacchetti in ingresso sono stati soggetti all'applicazione dei criteri IPsec quando è stato originariamente elaborato dal livello di trasporto, il pacchetto clonato inserito da questa funzione ignora la verifica IPsec quando esegue il reenting dello stack di rete. I pacchetti in ingresso generati localmente che usano la funzione FwpsAllocateNetBufferAndNetBufferList0 ignorano anche la verifica IPsec.
Per consentire a IPsec di elaborare prima i pacchetti in ingresso, il callout che controlla i dati del livello di trasporto deve avere un valore inferiore di subLayerWeight nella struttura FWPS_FILTER0 rispetto al sottostrato universale. Inoltre, il driver del callout non deve intercettare i pacchetti in modalità tunnel per cui la combinazione di FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 membri ( isTunnelMode && ! isDeTunneled ) viene restituito da Funzione FwpsGetPacketListSecurityInformation0 . Il driver del callout deve attendere che il pacchetto venga detunnelato e quindi deve intercettarlo a livello di trasporto o a livello di avanzamento.
A causa della semantica di blocco del protocollo TCP, TCP può essere inserito solo fuori banda a qualsiasi livello di trasporto o livello equivalente, quindi FwpsInjectTransportReceiveAsync0 e FwpsInjectTransportSendAsync0 devono essere accodati ed eseguiti da un DPC.
Questa funzione può essere chiamata da uno dei livelli di trasporto seguenti se il flag di metadati FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED non è impostato:
FWPS_LAYER_INBOUND_TRANSPORT_V4
FWPS_LAYER_INBOUND_TRANSPORT_V6
FWPS_LAYER_DATAGRAM_DATA_V4 (quando viene specificata la direzione in ingresso con FWP_DIRECTION_INBOUND)
FWPS_LAYER_DATAGRAM_DATA_V6 (quando viene specificata la direzione in ingresso con FWP_DIRECTION_INBOUND)
FWPS_LAYER_INBOUND_ICMP_ERROR_V4
FWPS_LAYER_INBOUND_ICMP_ERROR_V6
In caso contrario, questa funzione deve essere chiamata dai livelli ALE (Application Layer Enforcement) seguenti dopo l'avvio di un'operazione ALE con penna con una chiamata a FwpsPendOperation0 e completata con una chiamata a FwpsCompleteOperation0:
FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4
FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6
Un elenco di net buffer da inserire deve essere passato alla funzione FwpsCompleteOperation0 come argomento netBufferList .
Il pacchetto inserito può essere indicato di nuovo al driver del callout. Per evitare un ciclo infinito, il driver deve prima chiamare Funzione FwpsQueryPacketChangectionState0 prima di procedere con una chiamata alla funzione callout classifyFn e il driver deve consentire ai pacchetti con lo stato di inserimento FWPS_PACKET_INJECTION_STATE impostato su FWPS_PACKET_INJECTED_BY_SELF o FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF per passare attraverso un'istruzione non modificata.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Disponibile a partire da Windows Vista. |
Piattaforma di destinazione | Universale |
Intestazione | fwpsk.h (include Fwpsk.h) |
Libreria | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |