中间驱动程序 DriverEntry 函数
中间驱动程序的初始必需入口点必须显式命名 为 DriverEntry ,以便加载程序能够正确识别它。 所有其他导出的驱动程序函数(在本部分中描述为 MiniportXxx 和 ProtocolXxx)可以具有任何供应商指定的名称,因为它们作为地址传递给 NDIS。
在中间驱动程序中, DriverEntry 必须至少满足以下条件:
调用 NdisMRegisterMiniportDriver 并保存 NdisMiniportDriverHandle 参数中返回的句柄。
如果驱动程序随后将自身绑定到基础 NDIS 驱动程序,则调用 NdisRegisterProtocolDriver 注册驱动程序的 ProtocolXxx 函数。
调用 NdisIMAssociateMiniport 以通知 NDIS 驱动程序的微型端口上边缘和协议下边缘之间的关联。
中间驱动程序必须注册 MiniportDriverUnload 卸载处理程序。 当系统卸载中间驱动程序时,将调用此卸载处理程序。 如果 DriverEntry 失败,则不调用此卸载处理程序;相反,驱动程序只是卸载。 有关卸载处理程序的详细信息,请参阅 卸载中间驱动程序。
卸载处理程序应调用 NdisDeregisterProtocolDriver 来取消注册中间驱动程序的协议部分。 卸载处理程序还应执行任何必要的清理操作,例如重新分配驱动程序协议部分使用的资源。
请注意,卸载处理程序不同于 MiniportHaltEx 函数:卸载处理程序具有更全局的范围, 并且 MiniportHaltEx 函数的作用域仅限于特定的微型端口适配器。 当绑定到中间驱动程序的每个基础微型端口驱动程序停止时,中间驱动程序应清理状态信息并重新分配资源。 有关处理虚拟微型端口的停止操作的信息,请参阅 停止虚拟微型端口。
ProtocolUninstall 是可选的卸载处理程序。 在传递给 NdisRegisterProtocolDriver 的 ProtocolCharacteristics 结构中注册此函数的入口点。 NDIS 调用 ProtocolUninstall 以响应用户卸载中间驱动程序的请求。 NDIS 为每个绑定适配器调用 ProtocolUnbindAdapterEx 一次,然后 NDIS 调用 ProtocolUninstall。 在系统实际卸载驱动程序之前调用此处理程序。 此计时提供了释放任何设备对象或其他资源的机会,这些对象或其他资源可能会阻止系统调用注册到 NdisMRegisterMiniportDriver 的卸载处理程序并卸载驱动程序。
DriverEntry 可以初始化旋转锁,以保护中间驱动程序分配的任何全局共享资源,例如状态变量、结构和内存区域。 驱动程序使用这些资源来跟踪连接和跟踪正在进行的发送或驱动程序分配的队列。
如果 DriverEntry 未能分配驱动程序执行网络 I/O 操作所需的任何资源,则应释放任何以前分配的资源并返回适当的错误状态。
以下主题进一步介绍了如何注册中间驱动程序: