Fungsi Injeksi Paket

Driver callout dapat memanggil fungsi WFP berikut untuk menyuntikkan data paket yang tertunda atau dimodifikasi ke dalam tumpukan TCP/IP. Lapisan yang berlaku dari mana data dapat disuntikkan, bersama dengan kemungkinan tujuan, tercantum dalam tabel berikut.

Fungsi injeksi Lapisan yang berlaku Tujuan

FwpsInjectForwardAsync0

lapisan jaringan

jalur data penerusan

FwpsInjectNetworkReceiveAsync0

lapisan jaringan

jalur data penerimaan

FwpsInjectNetworkSendAsync0

lapisan jaringan

jalur kirim data

FwpsInjectTransportReceiveAsync0

data paket dari transportasi, data datagram, kesalahan ICMP, atau lapisan ALE

jalur data penerimaan

FwpsInjectTransportSendAsync0

data paket dari transportasi, data datagram, kesalahan ICMP, atau lapisan ALE

jalur kirim data

FwpsStreamInjectAsync0

Segmen data TCP

aliran data

Selain itu, fungsi FwpsQueryPacketInjectionState0 digunakan untuk memeriksa riwayat injeksi data paket.

Injeksi lapisan silang diaktifkan jika callout dapat menyediakan semua informasi yang diperlukan yang diperlukan oleh fungsi injeksi, dan daftar buffer net memiliki format yang diharapkan oleh fungsi injeksi. Misalnya, callout dapat mengambil paket di jalur penerusan, memodifikasi alamat tujuannya ke komputer lokal, dan memanggil FwpsInjectTransportReceiveAsync0 untuk mengalihkan paket ke tumpukan TCP/IP komputer lokal.

Kecuali untuk injeksi aliran (data TCP), paket masuk yang disuntikkan masuk kembali dari "bawah" lapisan tumpukan dan WFP, sambil memasukkan paket keluar masuk kembali dari "atas" tumpukan dan lapisan WFP. Misalnya, paket UDP yang disuntikkan dari lapisan datagram datagram yang masuk akan memasukkan kembali tumpukan dan melintasi lapisan jaringan, lapisan transportasi, lapisan penerimaan atau penerimaan ALE (opsional), dan kembali ke lapisan datagram. Paket UDP lain yang disuntikkan dari lapisan jaringan keluar akan memasukkan kembali tumpukan dan melintasi ALE (opsional), datagram data, dan lapisan transportasi, dan kembali ke lapisan jaringan.

FwpsInjectTransportReceiveAsync0 secara otomatis melewati pemrosesan IPsec untuk paket yang dimasukkan kembali karena sebelumnya telah melalui verifikasi IPsec.

Paket yang disuntikkan oleh driver callout WFP akan ditunjukkan kembali ke callout kecuali dalam kasus di mana modifikasi pada paket menyebabkannya melewatkan kondisi filter asli. WFP menyediakan fungsi FwpsQueryPacketInjectionState0 untuk panggilan untuk mengkueri apakah paket disuntikkan (atau disuntikkan sebelumnya) oleh callout. Untuk mencegah perulangan tak terbatas, callout harus mengizinkan paket yang disuntikkan sendiri.

Callout harus menyesuaikan ip atau checksum lapisan transportasi, atau keduanya, setelah mereka memodifikasi paket IP. Callout dapat mengatur checksum ke 0 untuk paket UDP melalui IPv4. Agar kompatibel dengan offload checksum lapisan transportasi, dan untuk menyesuaikan perhitungan checksum penuh versus pseudo checksum yang sesuai, callout dapat menggunakan logika berikut:

NDIS_TCP_IP_CHECKSUM_PACKET_INFO ChecksumInfo;
 ChecksumInfo.Value = 
 (ULONG) (ULONG_PTR)NET_BUFFER_LIST_INFO(
 NetBufferList,TcpIpChecksumNetBufferListInfo);

Jika ChecksumInfo.Transmit.NdisPacketTcpChecksum BENAR, operasi pengiriman TCP akan dilepas. Jika ChecksumInfo.Transmit.NdisPacketUdpChecksum BENAR, operasi pengiriman UDP akan dilepas.

Di Windows Vista dengan Paket Layanan 1 (SP1) dan Windows Server 2008, jika inMetaValues-headerIncludeHeaderLength> lebih besar dari 0, paket keluar adalah injeksi pengiriman RAW yang menyertakan header IP. Untuk melakukan injeksi ulang pengiriman RAW yang menyertakan header IP untuk Windows Vista dengan SP1 dan Windows Server 2008, Anda harus mundur paket kloning dengan jumlah dalam inMetaValues-headerIncludeHeaderLength> dan menyalin inMetaValues-headerIncludeHeader> di atas ruang yang baru diperluas. Kemudian, gunakan FwpsInjectTransportSendAsync0 dengan daftar buffer net untuk paket dan biarkan parameter FWPS_TRANSPORT_SEND_PARAMS0 diatur ke NULL. Untuk informasi selengkapnya tentang operasi retret untuk daftar buffer bersih, lihat Operasi Retret dan Lanjutan.

Catatan Untuk operasi pengiriman mentah, daftar buffer bersih hanya boleh berisi satu buffer net. Jika daftar buffer bersih Anda berisi lebih dari satu buffer net, Anda harus mengonversi daftar buffer bersih Anda menjadi serangkaian daftar buffer bersih, dan masing-masing dalam seri harus berisi satu buffer bersih. Untuk informasi selengkapnya tentang manajemen daftar buffer net, lihat Arsitektur NET_BUFFER.