Sdílet prostřednictvím


Odesílání dat z ovladače filtru

Ovladače filtrů můžou iniciovat odesílání požadavků nebo filtrovat požadavky odesílání, které zahajují nadřazené ovladače. Když ovladač protokolu volá funkci NdisSendNetBufferLists, odešle NDIS zadanou strukturu NET_BUFFER_LIST do nejvyššího modulu filtru v zásobníku ovladačů.

Odesílání žádostí iniciovaných ovladačem filtru

Následující obrázek znázorňuje operaci odeslání, která je inicializována ovladačem filtru.

Diagram znázorňující operaci odeslání iniciovanou ovladačem filtru s funkcí NdisFSendNetBufferLists

Ovladače filtru volají funkci NdisFSendNetBufferLists pro odesílání síťových dat definovaných v seznamu NET_BUFFER_LIST struktur.

Ovladač filtru musí nastavit člen SourceHandle každé NET_BUFFER_LIST struktury, kterou vytvoří, na stejnou hodnotu, jakou předává jako parametr NdisFilterHandle funkci NdisFSendNetBufferLists. Ovladače NDIS by neměly upravovat člen SourceHandle pro struktury NET_BUFFER_LIST, které ovladač nevytvořil.

Před voláním NdisFSendNetBufferListsmůže ovladač filtru nastavit informace doprovázející požadavek na odeslání pomocí makra NET_BUFFER_LIST_INFO. Podkladové ovladače mohou tyto informace načíst pomocí makra NET_BUFFER_LIST_INFO.

Jakmile ovladač filtru zavolá NdisFSendNetBufferLists, předává vlastnictví struktury NET_BUFFER_LIST i všech přidružených prostředků. NDIS může zpracovat požadavek odeslání nebo předat požadavek podkladovým ovladačům.

NDIS volá funkci FilterSendNetBufferListsComplete pro vrácení struktur a dat do ovladače filtru. NDIS může shromáždit struktury a data z více požadavků odeslání do jednoho propojeného seznamu struktur NET_BUFFER_LIST, než předá seznam FilterSendNetBufferListsComplete

Než NDIS zavolá FilterSendNetBufferListsComplete, aktuální stav odesílacího požadavku je neznámý. Ovladač filtru by se nikdy neměl pokoušet prozkoumat struktury NET_BUFFER_LIST nebo jakákoli přidružená data předtím, než NDIS tyto struktury vrátí do FilterSendNetBufferListsComplete.

FilterSendNetBufferListsComplete provádí jakékoli následné zpracování potřebné k dokončení operace odeslání.

Když NDIS volá FilterSendNetBufferListsComplete, ovladač filtru znovu získá vlastnictví všech prostředků přidružených ke strukturám NET_BUFFER_LIST, které jsou určené parametrem NetBufferLists. FilterSendNetBufferListsComplete může tyto prostředky buď uvolnit (například voláním funkcí NdisFreeNetBuffer a NdisFreeNetBufferList), nebo je připravit k opětovnému použití při následném volání NdisFSendNetBufferLists.

NDIS vždy odesílá filtrem zadaná síťová data do podkladových ovladačů v pořadí určeném filtrovacím ovladačem, jak je předáno funkci NdisFSendNetBufferLists. Po odeslání dat v zadaném pořadí mohou podkladové ovladače vrátit vyrovnávací paměti (buffers) v libovolném pořadí.

Ovladač filtru může požadovat loopback pro odesílání požadavků, které byly jím vyvolány. K vyžádání zpětné smyčky ovladač nastaví příznak NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK v SendFlags parametru NdisFSendNetBufferLists. NDIS označuje přijatý paket, který obsahuje odesílaná data.

Poznámka: Ovladač filtru by měl sledovat požadavky, které sám vytváří, a ujistit se, že při dokončení těchto požadavků nevolá funkci NdisFSendNetBufferListsComplete.

Filtrování odesílacích požadavků

Následující obrázek znázorňuje filtrování žádosti o odeslání, kterou inicializuje nadřazený ovladač.

Diagram znázorňující proces filtrování požadavku odeslání iniciovaného přílišným ovladačem pomocí funkce FilterSendNetBufferLists

NDIS volá funkci FilterSendNetBufferLists ovladače filtru k filtrování požadavku na odeslání vyššího ovladače.

Ovladač filtru nesmí upravovat SourceHandle člen ve strukturách NET_BUFFER_LIST, které přijímá od jiných ovladačů.

Ovladač filtru může filtrovat data a odesílat filtrovaná data podkladovým ovladačům. Pro každou NET_BUFFER strukturu odeslanou do FilterSendNetBufferListsmůže ovladač filtru provést následující:

  • Předejte vyrovnávací paměť dalšímu podkladovému ovladači voláním funkce NdisFSendNetBufferLists. NDIS zaručuje dostupnost kontextového prostoru (viz NET_BUFFER_LIST_CONTEXT struktura) pro ovladače filtru. Ovladač filtru může upravit obsah vyrovnávací paměti před voláním NdisFSendNetBufferLists. Zpracování filtrovaných dat pokračuje stejně jako při operaci odesílání iniciované ovladačem filtru.

  • Uvolněte vyrovnávací paměť voláním funkce NdisFSendNetBufferListsComplete.

  • Zařaďte vyrovnávací paměť do místní datové struktury pro pozdější zpracování. Návrh ovladače filtru určuje, co způsobí, že ovladač zpracuje vyrovnávací paměť ve frontě. Mezi příklady patří zpracování po vypršení časového limitu nebo zpracování po přijetí konkrétní vyrovnávací paměti.

    Poznámka Pokud ovladač zařadí požadavky na pozdější zpracování, musí podporovat odesílání žádostí o zrušení. Další informace o odesílání žádostí o zrušení naleznete v tématu Zrušení odesílání požadavků v ovladači filtru.

  • Zkopírujte vyrovnávací paměť a vytvořte požadavek na odeslání s touto kopií. Operace odeslání je podobná žádosti o odeslání iniciované ovladačem filtru. V tomto případě musí ovladač vrátit původní vyrovnávací paměť přelehlému ovladači voláním funkce NdisFSendNetBufferListsComplete.

Dokončení odesílání žádostí postupuje nahoru zásobníkem ovladačů. Když ovladač miniportu volá funkci NdisMSendNetBufferListsComplete, NDIS volá funkci FilterSendNetBufferListsComplete pro nejnižší překrývající se modul filtru.

Po dokončení operace odeslání ovladač filtru obrátí modifikace popisovačů bufferů nadřazeného ovladače, které ovladač filtru provedl v FilterSendNetBufferLists. Ovladač volá funkci NdisFSendNetBufferListsComplete, aby vrátil propojený seznam struktur NET_BUFFER_LIST nadřízeným ovladačům a vrátil konečný stav požadavku na odeslání.

Když modul filtru nejvyšší úrovně volá NdisFSendNetBufferListsComplete, NDIS volá původní ovladač protokolu ProtocolSendNetBufferListsComplete funkce.

Ovladač filtru, který neposkytuje FilterSendNetBufferLists funkce může stále inicializovat požadavek odeslání. Pokud takový ovladač inicializuje požadavek odeslání, musí poskytnout funkci FilterSendNetBufferListsComplete a nesmí předat dokončení události do vrstvy ovladačů.

Ovladač filtru může předávat nebo filtrovat požadavek zpětné smyčky nadlimitního ovladače. Pokud chcete předat požadavek zpětné smyčky a NDIS nastaví NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK v parametru SendFlags u FilterSendNetBufferLists, ovladač filtru nastaví NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK v parametru SendFlags při volání NdisFSendNetBufferLists. NDIS označuje přijatý paket, který obsahuje odesílaná data.

Obecně platí, že pokud ovladač filtru upraví jakékoli chování do té míry, že NDIS nemůže poskytovat standardní službu (například zpětnou smyčku), musí tuto službu pro NDIS poskytovat sám ovladač filtru. Například ovladač filtru, který upravuje požadavek na hardwarovou adresu (viz OID_802_3_CURRENT_ADDRESS), by měl zajišťovat zpětné smyčkování vyrovnávacích pamětí směrovaných na novou hardwarovou adresu. V tomto případě nemůže NDIS poskytnout službu zpětné smyčky, kterou obvykle poskytuje, protože filtr změnil adresu. Pokud ovladač filtru nastaví promiskuitní režim (viz OID_GEN_CURRENT_PACKET_FILTER), neměl by předávat nadbytečná data, která přijímá, nadřazeným ovladačům.