Освобождение очереди виртуальных машин
Чтобы освободить очередь получения, драйвер с избыточной ошибкой отправляет запрос OID_RECEIVE_FILTER_FREE_QUEUE задать OID. Элемент 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, остановить DMA в очереди, а драйвер мини-порта должен указать изменение состояния с помощью указания состояния NDIS_STATUS_RECEIVE_QUEUE_STATE . Дополнительные сведения о состояниях очереди см. в разделе Состояния очереди и операции.
После того как драйвер мини-порта выдает указание состояния NDIS_STATUS_RECEIVE_QUEUE_STATE , ему необходимо дождаться завершения всех ожидающих сигналов получения, прежде чем он сможет освободить связанную общую память. Дополнительные сведения об освобождении общей памяти см. в разделе Выделение ресурсов общей памяти.