Инициализация драйвера протокола
Система вызывает подпрограмму 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.
Любой драйвер протокола, экспортируемый набор стандартных подпрограмм драйверов в режиме ядра, в дополнение к определяемым NDIS Функциям ProtocolXxx должен задать точки входа для этих подпрограмм драйвера в заданном объекте драйвера, передаваемом в свою функцию DriverEntry. Дополнительные сведения о функциональных возможностях функции драйвера протокола DriverEntry см. в записи подпрограммы DriverEntry.
Если попытка выделения ресурсов, необходимых драйверу для выполнения операций ввода-вывода сети, завершается сбоем, DriverEntry должен освободить все уже выделенные ресурсы, прежде чем вернуть управление со статусом, отличным от STATUS_SUCCESS или NDIS_STATUS_SUCCESS.
Если ошибка возникает после успешного вызова NdisRegisterProtocolDriver, драйвер должен вызвать функцию NdisDeregisterProtocolDriver перед возвратом DriverEntry.
Чтобы разрешить драйверу протокола настраивать необязательные службы, NDIS вызывает функцию ProtocolSetOptions в контексте вызова драйвера протокола NdisRegisterProtocolDriver. Дополнительные сведения о необязательных службах см. в настройке дополнительных служб драйверов протокола.
Драйверы клиента CoNDIS должны вызывать функцию NdisSetOptionalHandlers из функции ProtocolSetOptions. Драйвер инициализирует структуру NDIS_CO_CLIENT_OPTIONAL_HANDLERS и передает ее в параметр OptionalHandlersNdisSetOptionalHandlers.
Диспетчеры автономных вызовов CoNDIS также должны вызывать функцию NdisSetOptionalHandlers из функции ProtocolSetOptions. Драйвер инициализирует структуру NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS и передает её в параметр OptionalHandlers функции NdisSetOptionalHandlers.
McMs не являются драйверами протокола. Поэтому они должны вызывать функцию NdisSetOptionalHandlers из функции MiniportSetOptions. MCM инициализирует структуру NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS и передает ее в параметре функции NdisSetOptionalHandlers.
Чтобы отменить регистрацию с помощью NDIS, драйвер протокола вызывает NdisDeregisterProtocolDriver из подпрограммы Выгрузки.
Чтобы выполнить операции очистки перед удалением драйвера протокола, драйвер протокола может зарегистрировать функцию ProtocolUninstall. Функция ProtocolUninstall является необязательной. Например, протокольный нижний уровень промежуточного драйвера может потребовать функцию ProtocolUninstall. Промежуточный драйвер может освободить свои пограничные ресурсы протокола в ProtocolUninstall, прежде чем NDIS вызывает функцию MiniportDriverUnload.