Delen via


Gegevens verzenden vanuit een filterstuurprogramma

Filterstuurprogramma's kunnen verzendaanvragen initiëren of verzendaanvragen filteren die bovenliggende stuurprogramma's initiëren. Wanneer een protocolstuurprogramma de NdisSendNetBufferLists functie aanroept, verzendt NDIS de opgegeven NET_BUFFER_LIST structuur naar de meest bovenste filtermodule in de stuurprogrammastack.

Aanvragen geïnitieerd door een filterstuurprogramma verzenden

In de volgende afbeelding ziet u een verzendbewerking die wordt gestart door een filterstuurprogramma.

diagram met een verzendbewerking die is geïnitieerd door een filterstuurprogramma met de functie NdisFSendNetBufferLists.

Filterstuurprogramma's roepen de NdisFSendNetBufferLists functie aan om de netwerkgegevens te verzenden die zijn gedefinieerd in een lijst met NET_BUFFER_LIST structuren.

Een filterstuurprogramma moet het SourceHandle- lid van elke structuur van NET_BUFFER_LIST die het creëert instellen op dezelfde waarde als die wordt doorgegeven aan de parameter NdisFilterHandle van NdisFSendNetBufferLists. NDIS-stuurprogramma's mogen de SourceHandle- leden voor NET_BUFFER_LIST-structuren waarvan het stuurprogramma niet de oorsprong is, niet wijzigen.

Voordat u NdisFSendNetBufferListsaanroept, kan een filterstuurprogramma informatie instellen die de verzendaanvraag bij de NET_BUFFER_LIST_INFO macro begeleidt. De onderliggende stuurprogramma's kunnen deze informatie ophalen met de NET_BUFFER_LIST_INFO macro.

Zodra een filterstuurprogramma NdisFSendNetBufferListsaanroept, wordt het eigendom van de NET_BUFFER_LIST structuren en alle bijbehorende resources teruggetrokken. NDIS kan de verzendaanvraag verwerken of de aanvraag doorgeven aan onderliggende stuurprogramma's.

NDIS roept de functie FilterSendNetBufferListsComplete aan om de structuren en gegevens te retourneren aan het filterstuurprogramma. NDIS kan de structuren en gegevens van meerdere verzendaanvragen verzamelen in één gekoppelde lijst met NET_BUFFER_LIST structuren voordat de lijst wordt doorgegeven aan FilterSendNetBufferListsComplete

Totdat NDIS FilterSendNetBufferListsCompleteaanroept, is de huidige status van een verzendaanvraag onbekend. Een filterstuurprogramma moet nooit proberen de NET_BUFFER_LIST structuren of eventuele bijbehorende gegevens te onderzoeken voordat NDIS de structuren retourneert naar FilterSendNetBufferListsComplete.

FilterSendNetBufferListsComplete voert alle postverwerkingen uit die nodig zijn om een verzendbewerking te voltooien.

Wanneer NDIS FilterSendNetBufferListsCompleteaanroept, wordt het filterstuurprogramma weer eigenaar van alle resources die zijn gekoppeld aan de NET_BUFFER_LIST structuren die zijn opgegeven door de parameter NetBufferLists. FilterSendNetBufferListsComplete kunnen deze resources vrijmaken (bijvoorbeeld door de NdisFreeNetBuffer en NdisFreeNetBufferList functies) aan te roepen of ze voor te bereiden voor hergebruik in een volgende aanroep naar NdisFSendNetBufferLists.

NDIS verzendt altijd door een filter geleverde netwerkgegevens in de door het filterstuurprogramma bepaalde volgorde naar de onderliggende stuurprogramma's, zoals doorgegeven aan NdisFSendNetBufferLists. Na het verzenden van de gegevens in de opgegeven volgorde kunnen de onderliggende stuurprogramma's de buffers echter in elke volgorde retourneren.

Een filterstuurprogramma kan loopback aanvragen voor verzendverzoeken die het zelf initieert. Om loopback aan te vragen, stelt het stuurprogramma de NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK vlag in de SendFlags parameter van NdisFSendNetBufferLists. NDIS geeft een ontvangen pakket aan dat de verzendgegevens bevat.

Opmerking Een filterstuurprogramma moet het verzenden van aanvragen die afkomstig zijn bijhouden en ervoor zorgen dat het de NdisFSendNetBufferListsComplete- functie niet aanroept wanneer dergelijke aanvragen zijn voltooid.

Verzendaanvragen filteren

In de volgende afbeelding ziet u hoe u een verzendaanvraag filtert die wordt geïnitieerd door een overliggend stuurprogramma.

diagram met het filteren van een verzendaanvraag die is geïnitieerd door een overliggend stuurprogramma met behulp van de functie FilterSendNetBufferLists.

NDIS roept de FilterSendNetBufferLists functie van een filterstuurprogramma aan om de verzendaanvraag van een overliggend stuurprogramma te filteren.

Het filterstuurprogramma mag het SourceHandle- lid niet wijzigen in de NET_BUFFER_LIST structuren die het ontvangt van andere stuurprogramma's.

Het filterstuurprogramma kan de gegevens filteren en de gefilterde gegevens verzenden naar onderliggende stuurprogramma's. Voor elke NET_BUFFER structuur die wordt verzonden naar FilterSendNetBufferLists, kan een filterstuurprogramma het volgende doen:

  • Geef de buffer door aan het volgende onderliggende stuurprogramma door de NdisFSendNetBufferLists functie aan te roepen. NDIS garandeert de beschikbaarheid van contextruimte (zie NET_BUFFER_LIST_CONTEXT structuur) voor filterstuurprogramma's. Het filterstuurprogramma kan de bufferinhoud wijzigen voordat NdisFSendNetBufferListswordt aangeroepen. De verwerking van de gefilterde gegevens gaat verder met een verzendbewerking die is geïnitieerd door een filterstuurprogramma.

  • Zet de buffer neer door de functie NdisFSendNetBufferListsComplete aan te roepen.

  • De buffer in een lokale gegevensstructuur in de wachtrij plaatsen voor latere verwerking. Het ontwerp van het filterstuurprogramma bepaalt waardoor het stuurprogramma een buffer in de wachtrij verwerkt. Enkele voorbeelden zijn verwerking na een time-out of verwerking nadat een specifieke buffer is ontvangen.

    Opmerking Als het stuurprogramma verzoeken in de wachtrij plaatst voor latere verwerking, moet het ondersteuning bieden voor het annuleren van deze verzoeken. Raadpleeg Annuleringsverzoeken verzenden in een filterstuurprogrammavoor meer informatie over het annuleren van verzendverzoeken.

  • Kopieer de buffer en maak een verzendaanvraag met de kopie. De verzendbewerking is vergelijkbaar met een door het filterstuurprogramma geïnitieerde verzendaanvraag. In dit geval moet het stuurprogramma de oorspronkelijke buffer retourneren aan het overliggende stuurprogramma door de functie NdisFSendNetBufferListsComplete aan te roepen.

Het voltooien van verzendaanvragen verloopt hoger in de stuurprogrammastack. Wanneer het minipoortstuurprogramma de functie NdisMSendNetBufferListsComplete aanroept, roept NDIS de FilterSendNetBufferListsComplete--functie aan voor de laagst overliggende filtermodule.

Nadat de verzendbewerking is voltooid, herstelt het filterstuurprogramma de wijzigingen in de bufferbeschrijvingen van het bovenliggende stuurprogramma die het eerder heeft gemaakt in FilterSendNetBufferLists. Het stuurprogramma roept de functie NdisFSendNetBufferListsComplete aan om de gekoppelde lijst met NET_BUFFER_LIST structuren te retourneren aan de overliggende stuurprogramma's en om de uiteindelijke status van de verzendaanvraag te retourneren.

Wanneer de bovenste filtermodule NdisFSendNetBufferListsCompleteaanroept, roept NDIS de ProtocolSendNetBufferListsComplete functie van het oorspronkelijke protocolstuurprogramma aan.

Een filterstuurprogramma dat geen FilterSendNetBufferLists functie biedt, kan nog steeds een verzendaanvraag initiëren. Als een dergelijk stuurprogramma een verzendaanvraag initieert, moet deze een FilterSendNetBufferListsComplete functie opgeven en mag de volledige gebeurtenis niet worden doorgegeven aan de stuurprogrammastack.

Een filterstuurprogramma kan de loopback-aanvraag van een overliggend stuurprogramma doorgeven of filteren. Als NDIS in de SendFlags parameter van FilterSendNetBufferListsNDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK wil doorgeven, stelt het filterstuurprogramma NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK in de SendFlags parameter in wanneer het NdisFSendNetBufferListsaanroept. NDIS geeft een ontvangen pakket aan dat de verzendgegevens bevat.

In het algemeen, als een filterstuurprogramma gedrag zodanig wijzigt dat NDIS geen standaardservice (zoals loopback) kan bieden, moet het filterstuurprogramma die service voor NDIS leveren. Een filterstuurprogramma dat bijvoorbeeld een aanvraag voor het hardwareadres wijzigt (zie OID_802_3_CURRENT_ADDRESS), moet loopback van buffers verwerken die zijn omgeleid naar het nieuwe hardwareadres. In dit geval kan NDIS de loopback-service die doorgaans wordt geboden, niet opgeven omdat het filter het adres heeft gewijzigd. Als het filterstuurprogramma de promiscueuze modus instelt (zie OID_GEN_CURRENT_PACKET_FILTER), mag het niet de extra gegevens doorgeven die het ontvangt voor overliggende stuurprogramma's.