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.
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.
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:
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.
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í.
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.
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.