Een verzendaanvraag annuleren in een filterstuurprogramma
Filterstuurprogramma's kunnen verzendaanvragen annuleren die afkomstig zijn van het filterstuurprogramma of die afkomstig zijn van bovenliggende stuurprogramma's.
Verzendaanvragen voor filterstuurprogramma's annuleren
In de volgende afbeelding ziet u hoe u een verzendaanvraag annuleert die afkomstig is van een filterstuurprogramma.
Een filterstuurprogramma roept de NDIS_SET_NET_BUFFER_LIST_CANCEL_ID macro aan voor elke NET_BUFFER_LIST structuur die het creëert voor verzendbewerkingen. De NDIS_SET_NET_BUFFER_LIST_CANCEL_ID functie markeert de opgegeven gegevens met een annulerings-id.
Voordat u annulerings-id's toewijst aan netwerkgegevens, moet een filterstuurprogramma NdisGeneratePartialCancelId aanroepen om de byte met hoge volgorde te verkrijgen van elke annulerings-id die wordt toegewezen. Dit zorgt ervoor dat de chauffeur geen dubbele annulerings-id's toegewezen krijgt door andere chauffeurs in het systeem. Stuurprogramma's roepen doorgaans NdisGeneratePartialCancelId één keer aan vanuit de DriverEntry routine. Stuurprogramma's kunnen echter meer dan één gedeeltelijke annulerings-id verkrijgen door NdisGeneratePartialCancelId meerdere keren te bellen.
Een filterstuurprogramma geeft de annulering-ID naar de NdisFCancelSendNetBufferLists functie om de nog lopende overdracht van gegevens in een gemarkeerde NET_BUFFER_LIST-structuur te annuleren. Stuurprogramma's kunnen de annulerings-ID van een NET_BUFFER_LIST-structuur verkrijgen door de NDIS_GET_NET_BUFFER_LIST_CANCEL_ID macro op te roepen.
Als een filterstuurprogramma alle NET_BUFFER_LIST structuren met dezelfde annulerings-id markeert, kan het alle in behandeling zijnde verzendingen annuleren met één aanroep naar NdisFCancelSendNetBufferLists. Als een filterstuurprogramma alle NET_BUFFER_LIST structuren binnen een subgroep van NET_BUFFER_LIST structuren markeert met een unieke id, kan het alle in behandeling zijnde verzendingen binnen die subgroep annuleren met één aanroep naar NdisFCancelSendNetBufferLists.
NDIS roept de functie 'verzenden annuleren' van de onderliggende stuurprogramma's aan. Nadat de overdracht in behandeling is afgebroken, roepen de onderliggende stuurprogramma's een functie voor voltooid verzenden aan (bijvoorbeeld NdisMSendNetBufferListsComplete) om de structuren NET_BUFFER_LIST met de status NDIS_STATUS_SEND_ABORTED te retourneren. Vervolgens roept NDIS de functie FilterSendNetBufferListsComplete van het filterstuurprogramma aan.
In FilterSendNetBufferListsCompletekan een filterstuurprogramma NDIS_SET_NET_BUFFER_LIST_CANCEL_ID aanroepen met CancelId ingesteld op NULL. Dit voorkomt dat de NET_BUFFER_LIST per ongeluk opnieuw wordt gebruikt met een verlopen annulerings-id.
Verzendverzoeken annuleren die afkomstig zijn van bovenliggende drivers
In de volgende afbeelding ziet u hoe u een verzendaanvraag annuleert die afkomstig is van een overliggend stuurprogramma.
Bovenliggende stuurprogramma's roepen een annuleer-verzendfunctie aan (NdisFCancelSendNetBufferLists of NdisCancelSendNetBufferLists) om uitstaande verzendaanvragen te annuleren. Deze overliggende stuurprogramma's moeten de verzendgegevens markeren met een annulerings-id voordat u een verzendaanvraag indient.
NDIS roept de FilterCancelSendNetBufferLists functie aan om de overdracht van alle NET_BUFFER_LIST structuren die zijn gemarkeerd met een opgegeven annulerings-id te annuleren.
FilterCancelSendNetBufferLists de volgende bewerkingen uitvoert:
Doorkruist de lijst met in de wachtrij geplaatste NET_BUFFER_LIST structuren voor de opgegeven filtermodule en roept de NDIS_GET_NET_BUFFER_LIST_CANCEL_ID macro aan om de annulerings-id voor elke structuur te verkrijgen. Het filterstuurprogramma vergelijkt de annulerings-id die NDIS_GET_NET_BUFFER_LIST_CANCEL_ID retourneert met de annulerings-id die NDIS heeft doorgegeven aan FilterCancelSendNetBufferLists.
Verwijdert uit de verzendwachtrij (ontkoppelt) alle NET_BUFFER_LIST structuren waarvan de annulerings-id's overeenkomen met de opgegeven annulerings-id.
Roept de NdisFSendNetBufferListsComplete- functie aan voor alle niet-gekoppelde NET_BUFFER_LIST structuren om de structuren te retourneren. Het filterstuurprogramma stelt het statusveld van de NET_BUFFER_LIST structuren in op NDIS_STATUS_SEND_ABORTED.
Roept de functie NdisFCancelSendNetBufferLists aan om het annuleringsverzoek voor het verzenden door te geven aan onderliggende stuurprogramma's. Het filterstuurprogramma geeft de annulerings-id door die het heeft ontvangen van het overliggende stuurprogramma. De annuleringsbewerking verloopt op dezelfde manier als een annuleringsverzending die door een filterstuurprogramma is geïnitieerd.