初始化微型端口适配器
当网络设备可用时,系统会加载所需的 NDIS 微型端口驱动程序。 随后,即插即用 (PnP) 管理器向 NDIS 发送即插即用 IRP 来启动设备。 NDIS 调用微型端口驱动程序的 MiniportInitializeEx 函数来初始化用于网络 I/O 操作的适配器。 初始化驱动程序后,NDIS 可以随时调用 MiniportInitializeEx 。
在 MiniportInitializeEx 返回之前,NDIS 不会提交要初始化的适配器的请求。 适配器处于"正在初始化"状态。
微型端口驱动程序通常在 MiniportInitializeEx 中执行以下任务:
- 获取适配器的配置信息;
- 获取有关适配器的硬件资源的信息;
- 调用 NdisMSetMiniportAttributes 并提供以下与适配器关联的属性:
- 指向驱动程序分配的上下文区域的指针;
- 适当的属性标志;
- 调用其 MiniportCheckForHangEx 函数的超时间隔;
- 接口类型;
- 初始化适配器特定的资源;
微型端口驱动程序指定 miniportInitializeEx 传递给 NdisMSetMiniportAttributes的 NDIS_MINIPORT_ADAPTER_ATTRIBUTES 结构中的适配器属性。
通常, MiniportInitializeEx 按以下顺序分配特定于适配器的资源:
- 非分页池内存;
- NET_BUFFER 和 NET_BUFFER_LIST 池 ;
- 旋转锁;
- 定时器;
- IO 端口;
- DMA ;
- 共享内存;
- 中断 ;
MiniportInitializeEx 成功返回后,适配器将处于 Paused 状态。 NDIS 可以调用 MiniportRestart 函数,将适配器转换为"正在运行"状态。
如果 MiniportInitializeEx 返回NDIS_STATUS_SUCCESS,驱动程序应在 MiniportHaltEx 函数中释放适配器的所有资源。
如果驱动程序返回NDIS_STATUS_SUCCESS,驱动程序必须调用 NdisMSetMiniportAttributes 并在NDIS_MINIPORT_ADAPTER_ATTRIBUTES结构中设置 GeneralAttributes。
如果 MiniportInitializeEx 失败, MiniportInitializeEx 必须释放它分配的所有资源,然后才能返回,适配器将返回到"已停止"状态。
停止微型端口适配器
NDIS 调用 NDIS 微型端口驱动程序的 MiniportHaltEx 函数,以在从系统中删除适配器时解除分配资源,并停止硬件。 驱动程序的 MiniportInitializeEx 函数成功返回后,NDIS 可以调用 MiniportHaltEx 。
MiniportHaltEx 必须释放驱动程序为设备分配的任何资源。 驱动程序必须调用最初分配资源的 NdisXxx 函数的倒数。 一般情况下, MiniportHaltEx 函数应按初始化期间使用的相反顺序调用倒数 NdisXxx 函数。
如果适配器生成中断,则微型端口驱动程序的 MiniportHaltEx 函数可由该驱动程序的 MiniportInterrupt 函数抢占,直到 MiniportHaltEx 禁用中断。
如果有未完成的 OID 请求或发送请求,NDIS 不会调用 MiniportHaltEx 。 在 NDIS 调用 MiniportHaltEx 后,NDIS 不会提交对受影响设备的进一步请求。
在 MiniportHaltEx 返回后,微型端口驱动程序将处于"已停止"状态。
启动适配器
NDIS 调用微型端口驱动程序的 MiniportRestart 函数,为处于"已暂停"状态的适配器启动重启请求。 驱动程序可以在 NDIS 调用 MiniportRestart 之后和微型端口驱动程序以同步或异步方式完成重启操作之前立即恢复接收的数据。
当它调用微型端口驱动程序的 MiniportRestart 函数时,NDIS 会将指向NDIS_RESTART_ATTRIBUTES结构的指针传递给 NDIS_MINIPORT_RESTART_PARAMETERS 结构的 RestartAttributes 成员中的微型端口驱动程序。
若要异步完成重启操作, MiniportRestart 将返回NDIS_STATUS_PENDING并且驱动程序必须在操作完成后调用 NdisMRestartComplete 函数。
微型端口驱动程序应在完成重启操作后准备好接受发送请求。 在重启操作完成之前,NDIS 不会启动任何其他即插即用操作,例如停止、初始化或暂停请求。
驱动程序准备好处理发送和接收操作后,适配器将处于"正在运行"状态。
暂停适配器
NDIS 调用微型端口驱动程序的 MiniportPause 函数来启动暂停操作。 适配器将一直处于暂停状态,直到暂停操作完成。
在暂停状态下,微型端口驱动程序必须完成未完成的接收操作。 驱动程序还必须完成任何未完成的发送操作,并且应拒绝任何新的发送请求。
若要完成接收操作,驱动程序将等待对 NdisMIndicateReceiveNetBufferLists 函数的所有调用返回,并且 NDIS 必须将所有未完成 的NET_BUFFER_LIST 结构返回到微型端口驱动程序的 MiniportReturnNetBufferLists 函数。
若要完成未完成的发送操作,微型端口驱动程序应为所有未完成的 NET_BUFFER_LIST 结构调用 NdisMSendNetBufferListsComplete 函数。 驱动程序应立即拒绝对其 MiniportSendNetBufferLists 函数发出的任何新发送请求。
微型端口驱动程序完成所有未完成的发送和接收操作后,驱动程序必须以同步或异步方式完成暂停请求。 如果暂停操作以异步方式完成,驱动程序将调用 NdisMPauseComplete 以完成暂停请求。 完成暂停请求后,微型端口驱动程序将处于"已暂停"状态。
当微型端口驱动程序处于暂停状态时,NDIS 不会启动其他即插即用操作,例如停止、初始化、电源更改或重启操作。 在微型端口驱动程序处于"暂停"状态后,NDIS 可以启动这些即插即用操作。
配置可选的服务
NDIS 调用微型端口驱动程序的 MiniportSetOptions 函数,以允许驱动程序配置可选服务。 NDIS 在微型端口驱动程序调用 NdisMRegisterMiniportDriver 函数的上下文中调用 MiniportSetOptions。
MiniportSetOptions 为可选 MiniportXxx 函数注册默认入口点,并且可以分配其他驱动程序资源。 为了注册可选的 MiniportXxx 函数,微型端口驱动程序调用 NdisSetOptionalHandlers 函数,并在 OptionalHandlers 参数处传递特征结构。
从 NDIS 6.0 开始,有效特征结构包括:
NDIS_MINIPORT_CO_CHARACTERISTICS:
NDIS_MINIPORT_PNP_CHARACTERISTICS:
NDIS_CO_CALL_MANAGER_OPTIONAL_HANDLERS:
NDIS_PROVIDER_CHIMNEY_OFFLOAD_GENERIC_CHARACTERISTICS:
NDIS_PROVIDER_CHIMNEY_OFFLOAD_TCP_CHARACTERISTICS:
从 NDIS 6.30 开始,有效特征结构还包括:
NDIS_MINIPORT_SS_CHARACTERISTICS:
NDIS_NDK_PROVIDER_CHARACTERISTICS: