Udostępnij przez


Zwalnianie kolejki w maszynie wirtualnej

Aby zwolnić kolejkę odbierania, nadrzędny sterownik wystawia żądanie ustawienia identyfikatora OID_RECEIVE_FILTER_FREE_QUEUE. Element InformationBuffer struktury NDIS_OID_REQUEST zawiera wskaźnik do struktury NDIS_RECEIVE_QUEUE_FREE_PARAMETERS z identyfikatorem kolejki typu NDIS_RECEIVE_QUEUE_ID.

OID_RECEIVE_FILTER_FREE_QUEUE zwalnia kolejkę odbierania, którą nadległy sterownik przydzielił, używając identyfikatora OID_RECEIVE_FILTER_ALLOCATE_QUEUE OID. Aby uzyskać więcej informacji na temat przydzielania kolejki odbiorczej, zobacz Przydzielanie kolejki maszyny wirtualnej.

Uwaga Kolejka domyślna zawierająca identyfikator kolejki NDIS_DEFAULT_RECEIVE_QUEUE_IDjest zawsze przydzielana i nie może zostać zwolniona.

Sterownik nadrzędny musi zwolnić wszystkie filtry ustawione w kolejce, zanim zwolni kolejkę. Ponadto nadrzędny sterownik musi zwolnić wszystkie kolejki odbierania przydzielone na karcie sieciowej przed wywołaniem funkcji NdisCloseAdapterEx, aby zamknąć powiązanie z tą kartą. Usługa NDIS zwalnia wszystkie kolejki przydzielone na karcie sieciowej, zanim wywoła funkcję sterownika miniportu MiniportHaltEx.

Gdy sterownik miniportu odbiera żądanie zwolnienia kolejki, wykonuje następujące czynności:

  • Należy natychmiast zatrzymać DMA do zasobów pamięci udostępnionej, które są powiązane z kolejką.

  • Generuje wskazanie stanu, które wskazuje, że DMA jest zatrzymana.

  • Czeka na zwrócenie wszystkich nierozwiązanych struktur NET_BUFFER_LIST, które są skojarzone z kolejką.

  • Zwalnia pamięć współdzieloną i powiązane zasoby sprzętowe.

Gdy sterownik miniportu odbiera żądanie ustawienia OID_RECEIVE_FILTER_FREE_QUEUE, kolejka musi wprowadzić stan Zatrzymania DMA, zatrzymuje DMA w kolejce i sterownik miniportu musi wskazać zmianę stanu, używając wskazania stanu NDIS_STATUS_RECEIVE_QUEUE_STATE. Aby uzyskać więcej informacji na temat stanów kolejki, zobacz Queue States and Operations.

Po wydaniu przez sterownik miniportu indykacji stanu NDIS_STATUS_RECEIVE_QUEUE_STATE, musi poczekać na ukończenie wszystkich oczekujących indykacji odbioru, zanim będzie mógł zwolnić skojarzoną pamięć udostępnioną. Aby uzyskać więcej informacji na temat zwalniania pamięci udostępnionej, zobacz Alokacji zasobów pamięci udostępnionej.