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


Инициализация промежуточного драйвера

Промежуточный драйвер NDIS регистрирует свои функции MiniportXxx и функции ProtocolXxx в контексте своей подпрограммы DriverEntry . Чтобы зарегистрировать функции MiniportXxx , промежуточный драйвер должен вызвать функцию NdisMRegisterMiniportDriver с установленным флагом NDIS_INTERMEDIATE_DRIVER. Этот флаг находится в структуре NDIS_MINIPORT_DRIVER_CHARACTERISTICS , которую драйвер передает в MiniportDriverCharacteristics. Чтобы зарегистрировать функции ProtocolXxx , промежуточный драйвер должен вызвать функцию NdisRegisterProtocolDriver .

DriverEntry возвращает STATUS_SUCCESS или эквивалентную ей NDIS_STATUS_SUCCESS, если драйвер успешно зарегистрирован в качестве промежуточного драйвера NDIS. Если DriverEntry не удается инициалировать, распространяя состояние ошибки, возвращенное функцией NdisXxx или подпрограммой поддержки режима ядра, драйвер не останется загруженным. DriverEntry должен выполняться синхронно; то есть он не может возвращать STATUS_PENDING или эквивалентные NDIS_STATUS_PENDING.

Чтобы зарегистрировать промежуточный драйвер в NDIS, подпрограмма DriverEntry должна как минимум:

  • Вызовите функцию NdisMRegisterMiniportDriver с флагом NDIS_INTERMEDIATE_DRIVER, установленным для регистрации функций MiniportXxx.
  • Вызовите функцию NdisRegisterProtocolDriver , чтобы зарегистрировать функции Драйвера ProtocolXxx, если драйвер впоследствии привязывается к базовому драйверу NDIS.
  • Вызовите функцию NdisIMAssociateMiniport , чтобы сообщить NDIS о связи между верхним краем минипорта драйвера и нижним краем протокола.

Если ошибка возникает в DriverEntry после успешного возврата NdisMRegisterMiniportDriver , драйвер должен вызвать функцию NdisMDeregisterMiniportDriver до возврата DriverEntry . Если DriverEntry выполняется успешно, драйвер должен вызвать NdisMDeregisterMiniportDriver из функции MiniportDriverUnload .

Промежуточные драйверы разделяют большинство требований DriverEntry к драйверам протокола и драйверам мини-порта.

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

NDIS вызывает функцию ProtocolBindAdapterEx после инициализации всех базовых драйверов miniport.

Фактически функция DriverEntry промежуточного драйвера NDIS может игнорировать указатель RegistryPath после его передачи в NdisMRegisterMiniportDriver. Такой драйвер также может игнорировать указатель DriverObject после его передачи в NdisMRegisterMiniportDriver. Однако драйвер должен сохранить значение дескриптора драйвера miniport, возвращаемое NdisMRegisterMiniportDriver в NdisMiniportDriverHandle , и значение дескриптора протокола, возвращаемое NdisRegisterProtocolDriver в NdisProtocolHandle для последующих вызовов функций NdisXxx . Функция ProtocolBindAdapterEx промежуточного драйвера привязывает драйвер к каждому базовому драйверу miniport перед вызовом его функции MiniportInitializeEx для инициализации виртуального минипорта промежуточного драйвера. Драйверы протокола более высокого уровня впоследствии привязываются к создаваемому виртуальному мини-порту. Эта стратегия позволяет промежуточному драйверу NDIS выделять ресурсы при создании виртуального мини-порта в соответствии с функциями базового драйвера минипорта, к которому он привязан.