Поделиться через


Десериализированные драйверы минипорта NDIS

Все драйверы NDIS 6.0 и более поздних версий десериализированы.

Несериализованный драйвер минипорта NDIS сериализует выполнение собственных функций MiniportXxx и обрабатывает все запросы на отправку внутри себя, а не полагается на NDIS для выполнения этих функций. В результате десериализованный драйвер минипорта может достичь значительно лучшей производительности в полнодуплексном режиме, чем сериализованный минипорт-драйвер.

Десериализированная модель драйвера — это модель по умолчанию для драйверов мини-порта NDIS. Драйверы минипорта, ориентированные на подключение, а также драйверы минипорта с нижним краем WDM, должны быть десериализированы. При написании нового мини-драйвера NDIS рекомендуется написать десериализированный драйвер. По возможности следует также перенести старые драйверы в NDIS 6.0 или более поздней версии. Дополнительные сведения о переносе драйверов см. в следующем разделе:

Десериализированный минипорт-драйвер должен соответствовать следующим требованиям при интерфейсе с NDIS:

  • Десериализированный минипорт-драйвер должен идентифицировать себя как таковой для NDIS во время инициализации.

  • Десериализированный драйвер минипорта должен выполнять все запросы на отправку асинхронно. Чтобы завершить запрос на отправку, драйверы минипорта без подключения NDIS 6.0 и более поздних версий вызывают функцию NdisMSendNetBufferListsComplete. Драйверы мини-порта, ориентированные на подключение NDIS 6.0 и более поздних версий, вызывают функцию NdisMCoSendNetBufferListsComplete.

  • Десериализированный минипортовый драйвер, поддерживающий NDIS версии 6.0 или более поздней, задает член Status структуры NET_BUFFER_LIST, который будет передаваться в функцию NdisMSendNetBufferListsComplete.

  • Если десериализированный драйвер минипорта не может немедленно завершить отправку запросов, он не может вернуть запросы в NDIS для повторного запроса. Вместо этого минипорт-драйвер должен ставить запросы на отправку в внутреннюю очередь до тех пор, пока не будут доступны достаточные ресурсы для передачи данных.

  • Десериализированный драйвер минипорта не должен проверять структуры, которые он передает NDIS в индикациях приема до тех пор, пока NDIS не вернет их. NDIS возвращает структуры NET_BUFFER_LIST в функцию MiniportReturnNetBufferLists драйвера минипорта.

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

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

  • Десериализированные функции драйвера минипорта MiniportXxx могут выполняться в IRQL <= DISPATCH_LEVEL. Следовательно, автор драйвера не может считать, что функции MiniportXxx будут вызываться в той последовательности, в которой они обрабатывают запросы. Одна функция MiniportXx может вытеснить другую функцию MiniportXx, которая выполняется на более низком уровне IRQL.

  • Десериализированный драйвер минипорта отвечает за управление сетевой буферной очередью. Когда у драйвера минипорта возникает проблема с ресурсами, он не может возвращать запросы на отправку данных в NDIS для повторного размещения. Вместо этого драйвер минипорта должен внутренне поставить в очередь все запросы на отправку, пока не будут доступны достаточные ресурсы для отправки данных.

  • Десериализированный драйвер минипорта должен завершить отправку запросов в порядке, определяемом протоколом.

Дополнительные сведения о требованиях к отправке и получению драйверов NDIS см. в разделе Операции отправки и получения.

Обратите внимание, что десериализированный драйвер минипорта обычно завершает отправку запросов в порядке, определяемом протоколом. Однако мини-драйвер, поддерживающий приоритет пакетов (например, IEEE 802.1p), может переупорядочить запросы на отправку на основе сведений о приоритете.