Инициализация промежуточного драйвера
Промежуточный драйвер 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 после инициализации всех базовых драйверов минипорта.
Фактически, функция DriverEntry промежуточного драйвера NDIS может игнорировать указатель RegistryPath после передачи его в NdisMRegisterMiniportDriver. Такой драйвер может также игнорировать указатель DriverObject после передачи его в NdisMRegisterMiniportDriver. Однако драйвер должен сохранить значение дескриптора минипорт-драйвера, возвращаемое NdisMRegisterMiniportDriver в NdisMiniportDriverHandle, и значение дескриптора протокол-драйвера, возвращаемое NdisRegisterProtocolDriver в NdisProtocolHandle для последующих вызовов функций NdisXxx. Функция промежуточного драйвера ProtocolBindAdapterEx привязывает драйвер к каждому базовому драйверу минипорта перед вызовом функции miniportInitializeEx, чтобы инициализировать виртуальный минипорт промежуточного драйвера. Все еще более высокие драйверы протокола впоследствии привязывают себя к виртуальному минипорту, который он создает. Эта стратегия позволяет промежуточному драйверу NDIS выделять ресурсы при создании виртуального минипорта в соответствии с функциями базового минипорта драйвера, к которому он привязан.