Sdílet prostřednictvím


Zrušení žádosti o odeslání v ovladači filtru

Ovladače filtrů mohou zrušit odesílání požadavků pocházejících z ovladače filtru nebo z nadřazených ovladačů.

Zrušení odesílání požadavků ovladače filtru

Následující obrázek znázorňuje zrušení žádosti o odeslání, která vznikla ovladačem filtru.

vývojového diagramu, který ukazuje proces zrušení požadavku na odeslání pocházejícího ovladačem filtru.

Ovladač filtru volá makro NDIS_SET_NET_BUFFER_LIST_CANCEL_ID pro každou strukturu NET_BUFFER_LIST, kterou vytváří pro operace odesílání. Funkce NDIS_SET_NET_BUFFER_LIST_CANCEL_ID označí zadaná data identifikátorem zrušení.

Před přiřazením ID zrušení síťovým datům musí ovladač filtru volat NdisGeneratePartialCancelId, aby získal bajt s vysokým pořadím každého ID zrušení, které přiřadí. Tím se zajistí, že řidič neduplikuje ID pro zrušení přiřazená jinými řidiči v systému. Ovladače obvykle volají NdisGeneratePartialCancelId jednou z rutiny DriverEntry. Řidiči však mohou získat více než jeden částečný identifikátor zrušení tím, že vícekrát zavolají funkci NdisGeneratePartialCancelId.

Chcete-li zrušit čekající přenos dat ve struktuře NET_BUFFER_LIST, ovladač filtru předá ID zrušení funkci NdisFCancelSendNetBufferLists. Ovladače mohou získat ID zrušení struktury NET_BUFFER_LIST zavoláním makra NDIS_GET_NET_BUFFER_LIST_CANCEL_ID.

Pokud ovladač filtru označí struktury NET_BUFFER_LIST stejným storno identifikátorem, může jedním voláním NdisFCancelSendNetBufferListszrušit všechny čekající přenosy. Pokud ovladač filtru označí všechny struktury NET_BUFFER_LIST v rámci podskupiny NET_BUFFER_LIST struktur s jedinečným identifikátorem, může zrušit všechny čekající přenosy v této podskupině jediným voláním NdisFCancelSendNetBufferLists.

NDIS volá funkci zrušení odeslání v rámci základních ovladačů. Po přerušení čekajícího přenosu volají podkladové ovladače úplnou funkci odeslání (například NdisMSendNetBufferListsComplete), aby vrátily struktury NET_BUFFER_LIST s stavem dokončení NDIS_STATUS_SEND_ABORTED. NDIS zase volá FilterSendNetBufferListsComplete ovladače filtru.

V FilterSendNetBufferListsCompletemůže ovladač filtru volat NDIS_SET_NET_BUFFER_LIST_CANCEL_ID s CancelId nastaveným na NULL. Tím zabráníte náhodnému opětovnému použití seznamu NET_BUFFER_LIST s neplatným ID zrušení.

Zrušení požadavků na odeslání pocházejících z nadřazených ovladačů

Následující obrázek znázorňuje zrušení požadavku na odeslání, který vznikl nadřazeným ovladačem.

Vývojový diagram, který ukazuje proces zrušení žádosti o odeslání pocházející z nadřazeného ovladače.

Nadřazené ovladače volají funkci pro zrušení odesílání (NdisFCancelSendNetBufferLists nebo NdisCancelSendNetBufferLists) k zrušení nevyřízených požadavků na odeslání. Tyto nadřazené ovladače musí označit odesílaná data pomocí ID zrušení před odesláním požadavku.

NDIS volá funkci ovladače filtru FilterCancelSendNetBufferLists, která zruší přenos všech struktur NET_BUFFER_LIST označených zadaným identifikátorem zrušení.

FilterCancelSendNetBufferLists provádí následující operace:

  1. Prochází seznam struktur NET_BUFFER_LIST, které jsou ve frontě pro zadaný ovladač filtru, a volá makro NDIS_GET_NET_BUFFER_LIST_CANCEL_ID k získání identifikátoru zrušení pro každou strukturu. Ovladač filtru porovnává ID zrušení, které NDIS_GET_NET_BUFFER_LIST_CANCEL_ID vrátí, a ID zrušení, které NDIS předal FilterCancelSendNetBufferLists.

  2. Odpojí z fronty odesílání všechny struktury NET_BUFFER_LIST, jejichž identifikátory zrušení odpovídají zadanému identifikátoru zrušení.

  3. Volá funkci NdisFSendNetBufferListsComplete pro všechny nelinkované struktury NET_BUFFER_LIST, které vrátí struktury. Ovladač filtru nastaví pole stavu struktur NET_BUFFER_LIST na NDIS_STATUS_SEND_ABORTED.

  4. Zavolá funkci NdisFCancelSendNetBufferLists, která předá žádost o zrušení odesílání podkladovým ovladačům. Ovladač filtru předává identifikátor zrušení, který přijal od nadřazeného ovladače. Operace zrušení probíhá stejně jako operace zrušení odesílání pocházející z ovladače filtru.