删除 VC
只有发起创建虚拟线路的面向连接的客户端、调用管理器或 MCM 驱动程序 (VC) 才能启动删除该 VC。 因此,客户端会删除它之前为传出呼叫创建的 VC,调用管理器或 MCM 驱动程序会删除它以前通过网络为传入呼叫创建的 VC,而呼叫管理器会删除它以前创建的用于通过网络交换信号消息的 VC。 (MCM 驱动程序不调用 NDIS 来删除它为交换信号消息而创建的 VC。MCM 驱动程序删除此类 VC,其内部操作对 NDIS.)
面向连接的客户端或调用管理器使用 NdisCoDeleteVc 启动 VC 的删除。
下图显示了调用管理器的客户端启动 VC 删除。
下图显示了启动 VC 删除的 MCM 驱动程序的客户端。
下图显示了发起删除 VC 的呼叫管理器。
当客户端或调用管理器调用 NdisCoDeleteVc 或 MCM 驱动程序调用 NdisMCmDeleteVc 时,给定的 VC 上必须没有未完成的调用,并且该 VC 必须已 停用。 满足这些要求意味着满足以下条件:
客户端已使用给定的 NdisVcHandle 调用 NdisClClCloseCall,并且其关闭调用请求已成功完成。
调用管理器已调用 NdisCmDeactivateVc,或者 MCM 驱动程序已使用给定的 NdisMCmHandle 调用 NdisMCmDeactivateVc,并且停用请求已成功完成, (请参阅传入请求以关闭呼叫) 。
客户端或调用管理器对 NdisCoDeleteVc 的调用会导致 NDIS 同时调用基础微型端口驱动程序的 MiniportCoDeleteVc 函数和客户端或调用管理器的 ProtocolCoDeleteVc 函数,调用方与之共享 NdisVcHandle () 看到上述三个数字。
MiniportCoDeleteVc 释放为 VC 分配的任何资源,以及 VC 的微型端口驱动程序上下文。 ProtocolCoDeleteVc 释放客户端或调用管理器用于对 VC 执行操作和跟踪状态的任何资源。 MiniportCoDeleteVc 和 ProtocolCoDeleteVc 都是无法返回NDIS_STATUS_PENDING的同步函数。
MCM 驱动程序使用 NdisMCmDeleteVc 启动删除 VC (请参阅下图) 。
MCM 驱动程序对 NdisMCmDeleteVc 的调用导致 NDIS 调用 MCM 驱动程序与之共享 NdisVcHandle 的客户端的 ProtocolCoDeleteVc 函数。
当 NdisCoDeleteVc 或 NdisMCmDeleteVc 返回控件时, NdisVcHandle 不再有效。