Инициализация промежуточного драйвера
Промежуточный драйвер 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 выделять ресурсы при создании виртуального мини-порта в соответствии с функциями базового драйвера минипорта, к которому он привязан.