Fungsi FwpsInjectTransportReceiveAsync0 (fwpsk.h)
Fungsi FwpsInjectTransportReceiveAsync0 menyuntikkan data paket dari lapisan kesalahan transportasi, datagram, atau ICMP ke jalur data penerima.
Sintaks
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
Handel injeksi yang sebelumnya dibuat oleh panggilan ke Fungsi FwpsInjectionHandleCreate0 .
[in, optional] injectionContext
Handel opsional ke konteks injeksi. Jika ditentukan, itu dapat diperoleh dengan memanggil fungsi FwpsQueryPacketInjectionState0 ketika status injeksi paket FWPS_PACKET_INJECTION_STATEFWPS_PACKET_INJECTED_BY_SELF atau FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF.
reserved
Dicadangkan. Driver callout harus mengatur parameter ini ke nol.
[in] flags
Dicadangkan. Driver callout harus mengatur parameter ini ke nol.
[in] addressFamily
Salah satu keluarga alamat berikut:
AF_INET
Keluarga alamat IPv4.
AF_INET6
Keluarga alamat IPv6.
[in] compartmentId
Pengidentifikasi kompartemen perutean tempat data paket disuntikkan, ditentukan sebagai jenis COMPARTMENT_ID . Pengidentifikasi ini diberikan kepada callout melalui anggota compartmentId FWPS_INCOMING_METADATA_VALUES0 struktur yang diteruskan ke fungsi callout classifyFn driver callout. Jika anggota compartmentId tersedia untuk callout, FWPS_METADATA_FIELD_COMPARTMENT_ID akan diatur dalam anggota currentMetadataValues . Jika tidak, atur parameter ini ke UNSPECIFIED_COMPARTMENT_ID.
[in] interfaceIndex
Indeks antarmuka tempat data paket asli diterima. Driver callout harus menggunakan nilai indeks antarmuka yang diteruskan sebagai salah satu nilai data masuk ke fungsi callout classifyFn untuk parameter ini jika paket akan disuntikkan ke antarmuka yang sama tempat paket asli ditunjukkan.
[in] subInterfaceIndex
Indeks subinterface tempat data paket asli diterima. Driver callout harus menggunakan nilai indeks subinterface yang diteruskan sebagai salah satu nilai data masuk ke fungsi callout classifyFn untuk parameter ini jika paket akan disuntikkan ke subinterface yang sama tempat paket asli ditunjukkan.
[in, out] netBufferList
Penunjuk ke struktur NET_BUFFER_LIST yang menjelaskan data paket yang sedang disuntikkan. Driver callout mengalokasikan struktur NET_BUFFER_LIST untuk digunakan untuk menyuntikkan data paket dengan memanggil fungsi FwpsAllocateCloneNetBufferList0 atau fungsi FwpsAllocateNetBufferAndNetBufferList0 . Struktur NET_BUFFER_LIST harus dimulai dengan header IP.
[in] completionFn
Penunjuk ke fungsi callout completionFn yang disediakan oleh driver callout. Mesin filter memanggil fungsi ini setelah data paket, yang dijelaskan oleh parameter netBufferList , telah disuntikkan ke dalam tumpukan jaringan.
[in, optional] completionContext
Penunjuk ke konteks yang disediakan driver callout yang diteruskan ke fungsi callout yang diarahkan oleh parameter completionFn . Parameter ini bersifat opsional dan dapat berupa NULL.
Mengembalikan nilai
Fungsi FwpsInjectTransportReceiveAsync0 mengembalikan salah satu kode NTSTATUS berikut.
Menampilkan kode | Deskripsi |
---|---|
|
Injeksi data paket berhasil dimulai. Mesin filter akan memanggil fungsi penyelesaian setelah mesin filter selesai menyuntikkan data paket ke tumpukan jaringan, atau ketika kesalahan terjadi kemudian. Jika terjadi kesalahan, anggota Status struktur NET_BUFFER_LIST yang telah selesai akan menunjukkan alasan kegagalan. |
|
Tumpukan jaringan TCP/IP tidak siap menerima injeksi data paket. |
|
Handel injeksi sedang ditutup. |
|
Terjadi kesalahan. |
Keterangan
Driver callout memanggil fungsi FwpsInjectTransportReceiveAsync0 untuk menyuntikkan data paket dari lapisan kesalahan transportasi, datagram, atau ICMP ke jalur data penerima. Fungsi ini dapat dijalankan secara asinkron. Driver callout biasanya menyuntikkan data ke tumpukan jaringan saat memodifikasi data paket. Untuk informasi selengkapnya tentang bagaimana driver callout dapat memodifikasi data paket, lihat Operasi Driver Callout.
Jika driver callout memodifikasi paket yang akan disuntikkan dengan FwpsInjectTransportReceiveAsync0, itu harus memanggil Fungsi FwpsConstructIpHeaderForTransportPacket0 untuk memperbaiki checksum IP dan protokol tingkat atas (TCP, UDP, dan ICMP). Parameter headerIncludeHeaderSize dari FwpsConstructIpHeaderForTransportPacket0 harus bernilai sama dengan anggota ipHeaderSize dari FWPS_INCOMING_METADATA_VALUES0 struktur yang diteruskan ke parameter inMetaValues dari fungsi callout classifyFn driver callout.
Jika nilai yang dikembalikan tidak STATUS_SUCCESS, fungsi penyelesaian tidak akan dipanggil. Dalam hal ini, daftar buffer net yang diarahkan oleh netBufferList harus dibebaskan oleh panggilan ke FwpsFreeNetBufferList0 atau FwpsFreeCloneNetBufferList0.
Jika data paket masuk asli telah tunduk pada penegakan kebijakan IPsec ketika awalnya diproses oleh lapisan transportasi, paket kloning yang disuntikkan oleh fungsi ini akan melewati verifikasi IPsec ketika masuk kembali ke tumpukan jaringan. Paket masuk yang dihasilkan secara lokal yang menggunakan fungsi FwpsAllocateNetBufferAndNetBufferList0 juga melewati verifikasi IPsec.
Untuk memungkinkan IPsec memproses paket masuk terlebih dahulu, callout yang memeriksa data lapisan transportasi harus memiliki nilai subLayerWeight yang lebih rendah dalam struktur FWPS_FILTER0 daripada sublayer universal. Selain itu, driver callout tidak boleh mencegat paket mode terowongan yang kombinasinya FWPS_PACKET_LIST_INBOUND_IPSEC_INFORMATION0 anggota ( isTunnelMode && ! isDeTunneled ) dikembalikan oleh Fungsi FwpsGetPacketListSecurityInformation0 . Driver callout harus menunggu paket terdetunneled dan kemudian harus mencegatnya di lapisan transportasi atau pada lapisan forward.
Karena semantik penguncian protokol TCP, TCP hanya dapat disuntikkan Keluar dari Band pada lapisan transportasi atau lapisan yang setara, sehingga FwpsInjectTransportReceiveAsync0 dan FwpsInjectTransportSendAsync0 harus diantrekan dan dijalankan oleh DPC.
Fungsi ini dapat dipanggil dari salah satu lapisan transportasi berikut jika bendera metadata FWPS_METADATA_FIELD_ALE_CLASSIFY_REQUIRED tidak diatur:
FWPS_LAYER_INBOUND_TRANSPORT_V4
FWPS_LAYER_INBOUND_TRANSPORT_V6
FWPS_LAYER_DATAGRAM_DATA_V4 (ketika arah masuk ditentukan dengan FWP_DIRECTION_INBOUND)
FWPS_LAYER_DATAGRAM_DATA_V6 (ketika arah masuk ditentukan dengan FWP_DIRECTION_INBOUND)
FWPS_LAYER_INBOUND_ICMP_ERROR_V4
FWPS_LAYER_INBOUND_ICMP_ERROR_V6
Jika tidak, fungsi ini harus dipanggil dari lapisan Application Layer Enforcement (ALE) berikut setelah operasi ALE yang tertunda dimulai dengan panggilan ke FwpsPendOperation0 dan telah selesai dengan panggilan ke FwpsCompleteOperation0:
FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V4
FWPS_LAYER_ALE_AUTH_RECV_ACCEPT_V6
Daftar buffer net yang akan disuntikkan harus diteruskan ke fungsi FwpsCompleteOperation0 sebagai argumen netBufferList .
Paket yang disuntikkan dapat ditunjukkan ke driver callout lagi. Untuk mencegah perulangan tak terbatas, driver harus terlebih dahulu memanggil Fungsi FwpsQueryPacketInjectionState0 sebelum melanjutkan panggilan ke fungsi callout classifyFn , dan driver harus mengizinkan paket yang memiliki status injeksi FWPS_PACKET_INJECTION_STATE diatur ke FWPS_PACKET_INJECTED_BY_SELF atau FWPS_PACKET_PREVIOUSLY_INJECTED_BY_SELF untuk melewati yang tidak diubah.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Tersedia dimulai dengan Windows Vista. |
Target Platform | Universal |
Header | fwpsk.h (termasuk Fwpsk.h) |
Pustaka | Fwpkclnt.lib |
IRQL | <= DISPATCH_LEVEL |