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 释放端口。