Udostępnij przez


Odbieranie danych w sterowniku filtru

Sterowniki filtrów mogą inicjować wskazania odbioru lub filtrować wskazania odbioru od podstawowych sterowników. Gdy sterownik miniportu wywołuje funkcję NdisMIndicateReceiveNetBufferLists, NDIS przesyła określoną strukturę NET_BUFFER_LIST do najniższego nakładającego się modułu filtru w stosie sterowników.

Odbieranie sygnałów inicjowanych przez sterownik filtra

Na poniższej ilustracji przedstawiono wskazanie odbioru, które jest inicjowane przez sterownik filtru.

Diagram ilustrujący wskazanie odbioru zainicjowane przez sterownik filtru.

Sterowniki filtrów wywołają funkcję NdisFIndicateReceiveNetBufferLists, aby wskazać odebrane dane. Funkcja NdisFIndicateReceiveNetBufferLists przekazuje wskazaną listę struktur NET_BUFFER_LIST w górę stosu do nadrzędnych sterowników. Sterownik filtru przydziela struktury z pul, które sam utworzył podczas inicjowania.

Jeśli sterownik filtru ustawia znacznik NDIS_RECEIVE_FLAGS_RESOURCES w parametrze ReceiveFlags funkcji NdisFIndicateReceiveNetBufferLists, oznacza to, że sterownik filtru musi natychmiast odzyskać kontrolę nad strukturami NET_BUFFER_LIST. W takim przypadku usługa NDIS nie wywołuje funkcji FilterReturnNetBufferLists sterownika filtra w celu zwrócenia struktur NET_BUFFER_LIST. Sterownik filtru odzyskuje własność natychmiast, gdy NdisFIndicateReceiveNetBufferLists wraca.

Jeśli sterownik filtru nie ustawi flagi NDIS_RECEIVE_FLAGS_RESOURCES w parametrze ReceiveFlags funkcji NdisFIndicateReceiveNetBufferLists, NDIS zwraca podane struktury NET_BUFFER_LIST do funkcji FilterReturnNetBufferLists sterownika filtru. W tym przypadku sterownik filtru rezygnuje z własności wskazanych struktur, aż NDIS je zwróci do FilterReturnNetBufferLists.

Uwaga Sterownik filtru powinien śledzić sygnały odbierania, które inicjuje, i upewnić się, że nie wywołuje funkcji NdisFReturnNetBufferLists po zakończeniu operacji odbierania.

Filtrowanie sygnałów odbioru

Na poniższej ilustracji przedstawiono filtrowane powiadomienie o odbiorze zainicjowane przez podstawowy sterownik.

Diagram ilustrujący odfiltrowany sygnał odbioru zainicjowany przez sterownik bazowy.

NDIS wywołuje funkcję FilterReceiveNetBufferLists sterownika filtru do przetwarzania wskaźników odbioru, które pochodzą od leżących niżej sterowników. NDIS wywołuje FilterReceiveNetBufferLists po wywołaniu funkcji zgłaszania odbioru (na przykład NdisMIndicateReceiveNetBufferLists) w celu wskazania odebranych danych sieciowych lub danych sprzężenia zwrotnego.

Jeśli w parametrze ReceiveFlags funkcji FilterReceiveNetBufferLists nie jest ustawiona flaga NDIS_RECEIVE_FLAGS_RESOURCES, sterownik filtru utrzymuje własność struktur NET_BUFFER_LIST, dopóki nie wywoła funkcji NdisFReturnNetBufferLists.

Jeśli flaga NDIS_RECEIVE_FLAGS_RESOURCES w parametrze ReceiveFlags jest ustawiona, sterownik filtru nie może zachować struktury NET_BUFFER_LIST oraz powiązanych zasobów przydzielonych przez sterownik. Ta flaga może wskazywać, że sterownik ma mało zasobów odbiorczych. Funkcja FilterReceiveNetBufferLists powinna zwrócić wynik tak szybko, jak to możliwe.

Uwaga Jeśli ustawiono flagę NDIS_RECEIVE_FLAGS_RESOURCES, sterownik filtrowania musi zachować oryginalny zestaw struktur NET_BUFFER_LIST na liście połączonej. Na przykład po ustawieniu tej flagi sterownik może przetworzyć struktury i wskazać je w górę stosu pojedynczo, ale zanim funkcja zwróci, musi przywrócić oryginalną połączoną listę.

Sterowniki filtrów mogą wykonywać operacje filtrowania na odebranych danych przed przekazaniem danych do wyższych sterowników. Dla każdego buforu przesłanego do funkcji FilterReceiveNetBufferLists sterownik filtru może wykonać następujące czynności:

  • Przekaż go do następnego nadrzędnego sterownika, wywołując NdisFIndicateReceiveNetBufferLists. Sterownik może modyfikować zawartość buforu. NDIS gwarantuje dostępność przestrzeni dla kontekstu (zobacz strukturę NET_BUFFER_LIST_CONTEXT).

    Sterownik filtru może zmienić stan przekazany przez NDIS na FilterReceiveNetBufferLists lub po prostu przekazać go do NdisFIndicateReceiveNetBufferLists.

    Uwaga Sterownik filtru może przekazać bufor z NdisFIndicateReceiveNetBufferLists, nawet jeśli NDIS ustawia flagę NDIS_RECEIVE_FLAGS_RESOURCES w ReceiveFlags parametru FilterReceiveNetBufferLists. W takim przypadku sterownik filtru nie może powrócić z FilterReceiveNetBufferLists, dopóki nie odzyska własności buforu.

  • Odrzuć bufor. Jeśli usługa NDIS wyczyściła flagę NDIS_RECEIVE_FLAGS_RESOURCES w parametrze ReceiveFlags w funkcji FilterReceiveNetBufferLists, wywołaj funkcję NdisFReturnNetBufferLists, aby odrzucić bufor. Jeśli usługa NDIS ustawi flagę NDIS_RECEIVE_FLAGS_RESOURCES w parametrze ReceiveFlags funkcji FilterReceiveNetBufferLists, nie wykonuj żadnych działań i wróć z funkcji FilterReceiveNetBufferLists, aby zignorować bufor.

  • Umieść bufor w kolejce w lokalnej strukturze danych na potrzeby późniejszego przetwarzania. Jeśli NDIS ustawił flagę NDIS_RECEIVE_FLAGS_RESOURCES w parametrze ReceiveFlags podczas FilterReceiveNetBufferLists, sterownik filtru musi utworzyć kopię przed powrotem z FilterReceiveNetBufferLists.

  • Skopiuj bufor i utwórz sygnał odbioru z tą kopią. Wskaźnik odbioru jest podobny do wskaźnika odbioru inicjowanego przez sterownik filtru. W tym przypadku sterownik musi zwrócić ten oryginalny bufor do sterownika bazowego.

Funkcja NdisFIndicateReceiveNetBufferLists przekazuje wskazaną listę struktur NET_BUFFER_LIST w górę stosu sterowników do nadrzędnych sterowników. Operacja odbierania przebiega podobnie do operacji odbierania zainicjowanej przez sterownik filtru.

Jeśli sterownik nadrzędny zachował własność buforu, NDIS wywołuje funkcję FilterReturnNetBufferLists dla modułu filtrowania. W funkcji FilterReturnNetBufferLists sterownik filtru cofnie operacje, które wcześniej wykonał na buforze na ścieżce zwracania danych odbioru.

Gdy filtr najniższej warstwy wskazuje, że zakończył pracę z buforem, NDIS zwraca bufor do sterownika miniportu. Jeśli usługa NDIS wyczyściła flagę NDIS_RECEIVE_FLAGS_RESOURCES w parametrze ReceiveFlags funkcji FilterReceiveNetBufferLists, sterownik filtru wywołuje NdisFReturnNetBufferLists, aby zwrócić bufor. Jeśli NDIS ustawi flagę NDIS_RECEIVE_FLAGS_RESOURCES w parametrze ReceiveFlags funkcji FilterReceiveNetBufferLists, to powrót z FilterReceiveNetBufferLists zwraca bufor.