Инициализация драйвера протокола
Система вызывает подпрограмму DriverEntry драйвера протокола после загрузки драйвера. Драйверы протоколов загружают как системные службы. Они могут загружаться в любое время до, во время или после загрузки драйверов минипорта.
Драйверы протоколов выделяют ресурсы драйверов и регистрируют функции ProtocolXxx в DriverEntry. Сюда входят клиенты CoNDIS и автономные диспетчеры звонков. Чтобы зарегистрировать функции ProtocolXxx в NDIS, драйвер протокола вызывает функцию NdisRegisterProtocolDriver .
DriverEntry возвращает STATUS_SUCCESS или эквивалентное ей NDIS_STATUS_SUCCESS, если драйвер успешно зарегистрирован в качестве драйвера протокола NDIS. Если DriverEntry не удается инициалировать, распространяя состояние ошибки, возвращенное функцией NdisXxx или подпрограммой поддержки режима ядра, драйвер не останется загруженным. DriverEntry должен выполняться синхронно; то есть он не может возвращать STATUS_PENDING или эквивалентные ему NDIS_STATUS_PENDING.
Функция DriverEntry драйвера протокола NDIS должна вызывать функцию NdisRegisterProtocolDriver . Чтобы зарегистрировать точки входа ProtocolXxx драйвера в библиотеке NDIS, драйвер протокола инициализирует структуру NDIS_PROTOCOL_DRIVER_CHARACTERISTICS и передает ее в NdisRegisterProtocolDriver.
Драйверы, вызывающие NdisRegisterProtocolDriver, должны быть подготовлены к немедленному вызову любой из своих функций ProtocolXxx.
Драйверы протоколов NDIS предоставляют следующие функции ProtocolXxx , которые являются обновленными версиями функций, предоставляемых устаревшими драйверами:
ProtocolCloseAdapterCompleteEx
Драйверы протоколов NDIS предоставляют следующие функции ProtocolXxx для операций отправки и получения:
ProtocolSendNetBufferListsComplete
Все типы драйверов протоколов NDIS должны регистрировать полнофункциональные функции ProtocolBindAdapterEx и ProtocolUnbindAdapterEx для поддержки Plug and Play (PnP). Как правило, функция DriverEntry должна вызывать NdisRegisterProtocolDriver непосредственно перед возвратом элемента управления со значением состояния STATUS_SUCCESS или NDIS_STATUS_SUCCESS.
Любой драйвер протокола, экспортируемый набор стандартных подпрограмм драйвера в режиме ядра, в дополнение к функциям ProtocolXxx , определяемым NDIS, должен задавать точки входа для этих подпрограмм драйверов в заданном объекте драйвера, который передается в его функцию DriverEntry . Дополнительные сведения о функциях функции DriverEntry такого драйвера протокола см. в статье Написание процедуры DriverEntry.
Если попытка выделить ресурсы, необходимые драйверу для выполнения сетевых операций ввода-вывода, завершается сбоем, DriverEntry должен освободить все уже выделенные ресурсы, прежде чем вернуть управление с состоянием, отличном от STATUS_SUCCESS или NDIS_STATUS_SUCCESS.
Если после успешного вызова NdisRegisterProtocolDriver возникает ошибка, драйвер должен вызвать функцию NdisDeregisterProtocolDriver до возврата DriverEntry .
Чтобы разрешить драйверу протокола настраивать необязательные службы, NDIS вызывает функцию ProtocolSetOptions в контексте вызова драйвера протокола к NdisRegisterProtocolDriver. Дополнительные сведения о дополнительных службах см. в разделе Настройка дополнительных служб драйвера протокола.
Клиентские драйверы CoNDIS должны вызывать функцию NdisSetOptionalHandlers из функции ProtocolSetOptions . Драйвер инициализирует структуру NDIS_CO_CLIENT_OPTIONAL_HANDLERS и передает ее с параметром OptionalHandlersэлемента NdisSetOptionalHandlers.
Автономные диспетчеры вызовов CoNDIS также должны вызывать функцию NdisSetOptionalHandlers из функции ProtocolSetOptions . Драйвер инициализирует структуру NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS и передает ее с параметром OptionalHandlersэлемента NdisSetOptionalHandlers.
MCM не являются драйверами протокола. Поэтому они должны вызывать функцию NdisSetOptionalHandlers из функции MiniportSetOptions . MCM инициализирует структуру NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS и передает ее с параметром OptionalHandlersэлемента NdisSetOptionalHandlers.
Чтобы отменить регистрацию в NDIS, драйвер протокола вызывает NdisDeregisterProtocolDriver из своей подпрограммы выгрузки .
Чтобы выполнить операции очистки перед удалением драйвера протокола, драйвер протокола может зарегистрировать функцию ProtocolUninstall . Функция ProtocolUninstall является необязательной. Например, для нижнего края протокола промежуточного драйвера может потребоваться функция ProtocolUninstall . Промежуточный драйвер может освободить свои пограничные ресурсы протокола в ProtocolUninstall , прежде чем NDIS вызовет свою функцию MiniportDriverUnload .