Освобождение очереди виртуальных машин

Чтобы освободить очередь получения, верхний драйвер создает запрос установки OID OID_RECEIVE_FILTER_FREE_QUEUE. Элемент InformationBuffer структуры NDIS_OID_REQUEST содержит указатель на структуру NDIS_RECEIVE_QUEUE_FREE_PARAMETERS с идентификатором очереди типа NDIS_RECEIVE_QUEUE_ID.

OID_RECEIVE_FILTER_FREE_QUEUE освобождает очередь получения, выделенную вышележащим драйвером с использованием OID_RECEIVE_FILTER_ALLOCATE_QUEUE OID. Дополнительные сведения о выделении очереди приёма см. в выделении очереди виртуальных машин.

Примечание Очередь по умолчанию, которая имеет идентификатор очереди NDIS_DEFAULT_RECEIVE_QUEUE_ID, всегда выделяется и не может быть освобождена.

Вышележащий драйвер должен освободить все фильтры, которые он устанавливает для очереди, прежде чем освободить очередь. Кроме того, вышележащий драйвер должен освободить все очереди получения, которые были выделены на сетевом адаптере, перед тем как вызвать функцию NdisCloseAdapterEx для закрытия связи с сетевым адаптером. NDIS освобождает все очереди, выделенные на сетевом адаптере, прежде чем вызывать функцию минипорт-драйвера MiniportHaltEx.

Когда минипорт-драйвер получает запрос на освобождение очереди, выполняется следующее:

  • Необходимо немедленно остановить DMA для ресурсов общей памяти, связанных с очередью.

  • Создает индикатор состояния, показывающий, что DMA остановлен.

  • Ожидает возврата всех невыполненных NET_BUFFER_LIST структур, связанных с очередью.

  • Освобождает связанные общие ресурсы памяти и оборудования.

Когда драйвер минипорта получает запрос OID_RECEIVE_FILTER_FREE_QUEUE набора, очередь должна перейти в состояние остановки DMA. Драйвер минипорта должен сообщить об изменении состояния с помощью указания NDIS_STATUS_RECEIVE_QUEUE_STATE. Дополнительные сведения о состояниях очередей см. в состояния очередей и операций.

После того как драйвер минипорта выдает индикацию статуса NDIS_STATUS_RECEIVE_QUEUE_STATE, он должен дождаться завершения всех ожидающих индикаций приема, прежде чем сможет освободить связанную общую память. Для получения дополнительной информации об освобождении общей памяти см. выделение ресурсов общей памяти.