Filtre Sürücüsünden Veri Gönderme

Filtre sürücüleri gönderme istekleri başlatabilir veya aşırı yükleyen sürücülerin başlattığı gönderme isteklerini filtreleyebilir. Bir protokol sürücüsü NdisSendNetBufferLists işlevini çağırdığında, NDIS belirtilen NET_BUFFER_LIST yapısını sürücü yığınındaki en üstteki filtre modülüne gönderir.

Filtre Sürücüsü Tarafından Başlatılan İstekleri Gönderme

Aşağıdaki şekilde, bir filtre sürücüsü tarafından başlatılan bir gönderme işlemi gösterilmektedir.

NdisFSendNetBufferLists işlevine sahip bir filtre sürücüsü tarafından başlatılan gönderme işlemini gösteren Diyagramı.

Filtre sürücüleri, NET_BUFFER_LIST yapıları listesinde tanımlanan ağ verilerini göndermek için NdisFSendNetBufferLists işlevini çağırır.

Bir filtre sürücüsü, oluşturduğu her NET_BUFFER_LIST yapısının SourceHandle üyesini, NdisFSendNetBufferListsfonksiyonuna NdisFilterHandle parametresi olarak geçtiği aynı değere ayarlamalıdır. NDIS sürücüleri, sürücünün oluşturmadığı NET_BUFFER_LIST yapıları için SourceHandle üyesini değiştirmemelidir.

NdisFSendNetBufferListsçağırmadan önce, bir filtre sürücüsü NET_BUFFER_LIST_INFO makroyla gönderme isteğine eşlik eden bilgileri ayarlayabilir. Altyapı sürücüleri bu bilgilere NET_BUFFER_LIST_INFO makrosu kullanılarak erişebilir.

Bir filtre sürücüsü NdisFSendNetBufferLists'i çağırır çağırmaz, NET_BUFFER_LIST yapılarının ve ilişkili tüm kaynakların sahipliğini bırakır. NDIS, gönderme isteğini işleyebilir veya isteği alttaki sürücülere geçirebilir.

NDIS, yapıları ve verileri filtre sürücüsüne döndürmek için FilterSendNetBufferListsCompleteişlevini çağırır. NDIS, birden çok gönderme isteğindeki yapıları ve verileri, listeyi FilterSendNetBufferListsComplete işlemine geçirmeden önce tek bir bağlı NET_BUFFER_LIST yapıları listesine toplayabilir

NDIS FilterSendNetBufferListsComplete çağırana kadar, gönderme isteğinin geçerli durumu bilinmiyor. Filtre sürücüsü , NDIS FilterSendNetBufferListsCompleteyapılarını döndürmeden önce NET_BUFFER_LIST yapılarını veya ilişkili verileri hiçbir zaman incelemeye çalışmamalıdır.

FilterSendNetBufferListsComplete, gönderme işlemini tamamlamak için gereken işlem sonrası işlemleri gerçekleştirir.

NDIS FilterSendNetBufferListsComplete çağırdığında, filtre sürücüsü NetBufferLists parametresi tarafından belirtilen NET_BUFFER_LIST yapıları ile ilişkili tüm kaynakların sahipliğini yeniden kazanır. FilterSendNetBufferListsComplete bu kaynakları serbest bırakabilir (örneğin, NdisFreeNetBuffer ve NdisFreeNetBufferList işlevlerini çağırarak) veya bunları NdisFSendNetBufferLists sonraki bir çağrıda yeniden kullanıma hazırlayabilir.

NDIS, filtre sürücüsü tarafından sağlanan ağ verilerini her zaman filtre sürücüsü tarafından belirlenen sıraya uygun olarak ve NdisFSendNetBufferListsile geçirildiklerinde temel sürücülere gönderir. Ancak, verileri belirtilen sırada gönderdikten sonra, alt sürücüler arabellekleri farklı bir sırada döndürebilir.

Bir filtre sürücüsü, başlattığı gönderme istekleri için geri döngü talep edebilir. Geri döngü istemek için sürücü, NdisFSendNetBufferListsSendFlags parametresinde NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK bayrağını ayarlar. NDIS, gönderme verilerini içeren alınan bir paketi gösterir.

Not Bir filtre sürücüsü, kaynağı olan gönderme isteklerini izlemeli ve bu tür istekler tamamlandığında NdisFSendNetBufferListsComplete işlevini çağırmadığından emin olmalıdır.

Gönderme İsteklerini Filtreleme

Aşağıdaki şekilde, üst katmandaki bir sürücü tarafından başlatılan bir gönderim isteğinin filtrelenmesi gösterilmektedir.

Üst düzey bir sürücü tarafından başlatılan bir gönderme isteğini FilterSendNetBufferLists işlevini kullanarak filtreleme işlemini gösteren Diyagramı.

NDIS, üst sürücünün gönderme isteğini filtrelemek için bir filtre sürücüsünün FilterSendNetBufferLists işlevini çağırır.

Filtre sürücüsü, diğer sürücülerden aldığı NET_BUFFER_LIST yapılarındaki SourceHandle üyesini değiştirmemelidir.

Filtre sürücüsü verileri filtreleyebilir ve filtrelenmiş verileri temel sürücülere gönderebilir. FilterSendNetBufferListsgönderilen her NET_BUFFER yapısı için bir filtre sürücüsü aşağıdakileri yapabilir:

  • NdisFSendNetBufferLists işlevini çağırarak arabelleği bir sonraki temel sürücüye iletin. NDIS, filtre sürücüleri için bağlam alanının kullanılabilirliğini garanti eder (bkz. NET_BUFFER_LIST_CONTEXT yapı). Filtre sürücüsü, NdisFSendNetBufferListsçağırmadan önce arabellek içeriğini değiştirebilir. Filtrelenen verilerin işlenmesi, bir filtre sürücüsü tarafından başlatılan gönderme işlemiyle devam eder.

  • NdisFSendNetBufferListsComplete işlevini çağırarak arabelleği bırakın.

  • Daha sonra işlenmek üzere arabelleği yerel veri yapısında kuyruğa alın. Filtre sürücüsünün tasarımı, sürücünün kuyruğa alınmış bir arabelleği işlemesine neden olan faktörü belirler. Bazı örnekler zaman aşımından sonra işlemeyi veya belirli bir arabellek alındıktan sonra işlemeyi içerir.

    Not Sürücü kuyrukları daha sonra işlenmek üzere istek gönderiyorsa, iptal istekleri göndermeyi desteklemesi gerekir. İptal istekleri gönderme hakkında daha fazla bilgi için bkz. Filtre Sürücüsünde İstek Göndermeyi İptal Etme.

  • Arabelleği kopyalayın ve bu kopyayla bir gönderme isteği oluşturun. Gönderme işlemi, filtre sürücüsü tarafından başlatılan gönderme isteğine benzer. Bu durumda, sürücü, NdisFSendNetBufferListsComplete işlevini çağırarak özgün arabelleği üzerindeki sürücüye geri döndürmelidir.

Gönderme isteklerinin tamamlanması sürücü yığını boyunca gerçekleşir. Miniport sürücüsü NdisMSendNetBufferListsComplete işlevini çağırdığında, NDIS en düşük aşırı filtreleme modülü için FilterSendNetBufferListsComplete işlevini çağırır.

Gönderme işlemi tamamlandıktan sonra, filtre sürücüsü FilterSendNetBufferListssırasında yaptığı değişiklikleri, üzerindeki sürücünün arabellek tanımlayıcılarında geri alır. Sürücü, NET_BUFFER_LIST yapıların bağlı listesini üzerinde çalışan sürücülere geri döndürmek ve gönderme isteğinin son durumunu geri döndürmek için NdisFSendNetBufferListsComplete işlevini çağırır.

En üstteki filtre modülü NdisFSendNetBufferListsComplete çağırdığında, NDIS kaynak protokol sürücüsünün ProtocolSendNetBufferListsComplete işlevini çağırır.

FilterSendNetBufferLists işlevi sağlamayan bir filtre sürücüsü yine de bir gönderme isteği başlatabilir. Böyle bir sürücü bir gönderme isteği başlatırsa, FilterSendNetBufferListsComplete işlevi sağlamalı ve tüm olayı sürücü yığınına geçirmemelidir.

Bir filtre sürücüsü, üst katman bir sürücünün geri döngü isteğini geçirebilir veya filtreleyebilir. Bir geri döngü isteğini iletmek için, NDIS, FilterSendNetBufferListsfonksiyonunun SendFlags parametresinde NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK ayarlanmışsa, filtre sürücüsü NdisFSendNetBufferListsfonksiyonunu çağırdığında SendFlags parametresinde NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK ayarlar. NDIS, gönderme verilerini içeren alınan bir paketi gösterir.

Genel olarak, filtre sürücüsü herhangi bir davranışı NDIS'nin standart bir hizmet (geri döngü gibi) sağlayamayacağı şekilde değiştirirse, filtre sürücüsünün NDIS için bu hizmeti sağlaması gerekir. Örneğin, donanım adresi isteğini değiştiren bir filtre sürücüsü (bkz. OID_802_3_CURRENT_ADDRESS), yeni donanım adresine yönlendirilen arabelleklerin geri döngülerini işlemelidir. Bu durumda, filtre adresi değiştirdiğinden NDIS genellikle sağladığı geri döngü hizmetini sağlayamaz. Ayrıca, filtre sürücüsü promiscuous modu ayarlarsa (bkz. OID_GEN_CURRENT_PACKET_FILTER), aldığı ek verileri üst katman sürücülerine iletmemelidir.