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


Инициализация виртуальных мини-портов

Промежуточный драйвер инициализирует свои виртуальные мини-порты после того как успешно откроет базовый адаптер минипорта и будет готов принимать запросы и пересылать их через свои виртуальные мини-порты. Промежуточный драйвер вызывает NdisIMInitializeDeviceInstanceEx из функции ProtocolBindAdapterEx один или несколько раз для запроса инициализации одного или нескольких виртуальных мини-портов.

Примечание Нет необходимости, чтобы промежуточный драйвер вызывал NdisIMInitializeDeviceInstanceEx при открытии мини-адаптера нижнего уровня. Между виртуальными минипортами и открытыми адаптерами не требуется связь "один к одному".

Задайте параметр DriverInstanceNdisIMInitializeDeviceInstanceEx имя устройства для инициализированного виртуального мини-порта. Промежуточный драйвер получает имя устройства из раздела реестра UpperBindings.

Для промежуточного драйвера MUX типа n-to-one, который накладывает несколько виртуальных минипортов на один физический сетевой адаптер, должно быть имя устройства для каждого виртуального минипорта. Промежуточный драйвер MUX требует объекта уведомления, который поддерживает список имен устройств виртуального минипорта. Рекомендуемое расположение списка — раздел реестра UpperBindings. В этом случае раздел реестра UpperBindings является записью MULTI_SZ, содержащей список имен устройств. Промежуточный драйвер MUX вызывает NdisIMInitializeDeviceInstanceEx один раз для каждого имени устройства, указанного в списке имен устройств.

Вызов NdisIMInitializeDeviceInstanceEx приводит к вызову функции промежуточного драйвера MiniportInitializeEx для выполнения инициализации указанного виртуального минипорта, если NDIS получает IRP_MN_START_DEVICE для запуска устройства. Если NDIS не получает такой IRP, NDIS не вызовет функцию MiniportInitializeEx промежуточного драйвера. Вызов MiniportInitializeEx может произойти позже, и, следовательно, он не обязательно осуществляется в контексте вызова NdisIMInitializeDeviceInstanceEx. Если NDIS никогда не вызывает MiniportInitializeEx для виртуального минипорта, на который ссылается вызов NdisIMInitializeDeviceInstanceEx, а промежуточный драйвер больше не требует виртуального минипорта, промежуточный драйвер должен вызывать NdisIMCancelInitializeDeviceInstance, чтобы отменить инициализацию виртуального мини-порта. Например, предположим, что промежуточный драйвер создает виртуальный минипорт в ответ на успешную привязку к базовому минипорту. Если эта привязка удаляется до вызова NDIS MiniportInitializeEx, промежуточный драйвер должен вызвать NdisIMCancelInitializeDeviceInstance, чтобы отменить инициализацию минипорта.

MiniportInitializeEx должно выделить и инициализировать область контекста для виртуального минипорта. Дополнительные сведения об указании области контекста см. в Инициализация виртуального минипорта.

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

Промежуточный драйвер должен проверить, что сведения о состоянии, которые он поддерживает, правильно инициализированы. Если драйверу требуются ресурсы, связанные с отправкой — например, новые структуры NET_BUFFER_LIST для сетевых данных, которые MiniportSendNetBufferLists будут передаваться на следующий нижний уровень, — пул структур NET_BUFFER_LIST можно выделить на этом этапе.