微型端口驱动程序停止处理程序
NDIS 微型端口驱动程序必须向 NdisMRegisterMiniportDriver 提供 MiniportHaltEx 函数。
MiniportHaltEx 应撤消 MiniportInitializeEx 执行的所有操作。 例如,NDIS 微型端口驱动程序可能:
可用端口。 (有关详细信息,请参阅 释放 NDIS 端口。)
释放 MiniportInitializeEx 声明的所有硬件资源。
通过调用 NdisMDeregisterInterruptEx 释放中断资源。
释放 MiniportInitializeEx 分配的任何内存。
停止 NIC,除非 MiniportShutdownEx 函数已将 NIC 还原到其初始状态。
下图演示了卸载微型端口驱动程序。
MiniportHaltEx 应在返回之前完成卸载驱动程序所需的操作。 如果微型端口驱动程序具有任何未完成的接收指示 (即已收到它已指示到 NDIS 但 NDIS 尚未返回) 的网络数据, 则 MiniportHaltEx 不得返回,直到此类数据返回到微型端口驱动程序的 MiniportReturnNetBufferLists 函数。
上图显示了一组可由 MiniportHaltEx 函数进行的调用。 这些调用只是可以进行的调用的子集。 实际的调用集取决于微型端口驱动程序的先前操作。 如果微型端口驱动程序由于硬件问题或无法获取所需的资源而无法成功初始化网络适配器,则微型端口驱动程序可以在 MiniportInitializeEx 中执行这些相同的调用。 在这种情况下, MiniportInitializeEx 应通过撤消驱动程序以前的操作来卸载驱动程序。 否则, MiniportHaltEx 将撤消 MiniportInitializeEx 的操作。
以下列表描述了反向微型端口驱动程序可能执行的某些操作所需的调用:
如果微型端口驱动程序注册了中断,则应调用 NdisMDeregisterInterruptEx。
如果微型端口驱动程序设置了计时器或计时器,则应为其创建的每个计时器调用 NdisCancelTimerObject 。 如果调用 NdisCancelTimerObject 失败,则计时器可能已触发。 在这种情况下,微型端口驱动程序应等待计时器处理程序完成,然后再从 MiniportHaltEx 返回。
如果微型端口驱动程序使用 NdisAllocateMemoryWithTagPriority 分配了任何内存,则应调用 NdisFreeMemory 来释放该内存。
如果微型端口驱动程序使用 NdisMAllocateSharedMemory 或 NdisMAllocateSharedMemoryAsyncEx 分配了任何内存,则应调用 NdisMFreeSharedMemory 来释放该内存。
如果微型端口驱动程序使用 NdisAllocateNetBufferPool 为数据包描述符池分配并初始化了存储,则它应调用 NdisFreeNetBufferPool 来释放该存储。
如果微型端口驱动程序已分配或保留任何硬件资源,则应返回这些资源。 例如,如果微型端口驱动程序在 NIC 上映射了 I/O 端口范围,则应通过调用 NdisMDeregisterIoPortRange 释放端口。