初始化协议驱动程序
系统在加载驱动程序后调用协议驱动程序的 DriverEntry 例程。 协议驱动程序作为系统服务加载。 它们可以在微型端口驱动程序加载之前、期间或之后的任何时间加载。
协议驱动程序分配驱动程序资源并在 DriverEntry 中注册 ProtocolXxx 函数。 这包括 CoNDIS 客户端和独立的呼叫管理器。 若要将其 ProtocolXxx 函数注册到 NDIS,协议驱动程序会调用 NdisRegisterProtocolDriver 函数。
如果驱动程序成功注册为 NDIS 协议驱动程序,则 DriverEntry 返回STATUS_SUCCESS或其等效NDIS_STATUS_SUCCESS。 如果 DriverEntry 无法通过传播 由 NdisXxx 函数或内核模式支持例程返回的错误状态来初始化,驱动程序将不会保持加载状态。 DriverEntry 必须同步执行;也就是说,它不能返回STATUS_PENDING或其等效NDIS_STATUS_PENDING。
NDIS 协议驱动程序的 DriverEntry 函数必须调用 NdisRegisterProtocolDriver 函数。 若要向 NDIS 库注册驱动程序的 ProtocolXxx 入口点,协议驱动程序会初始化 NDIS_PROTOCOL_DRIVER_CHARACTERISTICS 结构并将其传递给 NdisRegisterProtocolDriver。
调用 NdisRegisterProtocolDriver 的驱动程序必须准备好立即调用其任何 ProtocolXxx 函数。
NDIS 协议驱动程序提供以下 ProtocolXxx 函数,这些函数是旧版驱动程序提供的函数的更新版本:
ProtocolCloseAdapterCompleteEx
NDIS 协议驱动程序为发送和接收操作提供以下 ProtocolXxx 函数:
ProtocolSendNetBufferListsComplete
所有类型的 NDIS 协议驱动程序都应注册功能齐全的 ProtocolBindAdapterEx 和 ProtocolUnbindAdapterEx 函数,以支持即插即用 (PnP) 。 通常, DriverEntry 函数应在返回状态值为 STATUS_SUCCESS 或 NDIS_STATUS_SUCCESS 的控件之前立即调用 NdisRegisterProtocolDriver 。
除 NDIS 定义的 ProtocolXxx 函数外,导出一组标准内核模式驱动程序例程的任何协议驱动程序都必须在传递给其 DriverEntry 函数的给定驱动程序对象中设置这些驱动程序例程的入口点。 有关此类协议驱动程序的 DriverEntry 函数的功能的详细信息,请参阅 编写 DriverEntry 例程。
如果尝试分配驱动程序执行网络 I/O 操作所需的资源失败, DriverEntry 应在返回状态为STATUS_SUCCESS或NDIS_STATUS_SUCCESS以外的控制之前释放它已分配的所有资源。
如果在成功调用 NdisRegisterProtocolDriver 后发生错误,驱动程序必须在 DriverEntry 返回之前调用 NdisDeregisterProtocolDriver 函数。
为了允许协议驱动程序配置可选服务,NDIS 在协议驱动程序调用 NdisRegisterProtocolDriver 的上下文中调用 ProtocolSetOptions 函数。 有关可选服务的详细信息,请参阅 配置可选协议驱动程序服务。
CoNDIS 客户端驱动程序必须从 ProtocolSetOptions 函数调用 NdisSetOptionalHandlers 函数。 驱动程序初始化NDIS_CO_CLIENT_OPTIONAL_HANDLERS结构,并在 NdisSetOptionalHandlers 的 OptionalHandlers 参数中传递它。
CoNDIS 独立调用管理器还必须从 ProtocolSetOptions 函数调用 NdisSetOptionalHandlers 函数。 驱动程序初始化NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS结构,并在 NdisSetOptionalHandlers 的 OptionalHandlers 参数中传递它。
MMC 不是协议驱动程序。 因此,它们必须从 MiniportSetOptions 函数调用 NdisSetOptionalHandlers 函数。 MCM 初始化NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS结构,并在 NdisSetOptionalHandlers 的 OptionalHandlers 参数中传递它。
若要注销 NDIS,协议驱动程序从其 Unload 例程调用 NdisDeregisterProtocolDriver。
若要在卸载协议驱动程序之前执行清理操作,协议驱动程序可以注册 ProtocolUninstall 函数。 ProtocolUninstall 函数是可选的。 例如,中间驱动程序的协议下边缘可能需要 ProtocolUninstall 函数。 在 NDIS 调用其 MiniportDriverUnload 函数之前,中间驱动程序可以在 ProtocolUninstall 中释放其协议边缘资源。