创建 VC
进行传出调用之前,面向连接的客户端会启动创建虚拟连接 (VC) 。 在指示对面向连接的客户端的传入调用之前,调用管理器或 MCM 驱动程序会启动 VC 的创建。 设置并激活 VC 后,可以在 VC 上传输或接收客户端数据。
呼叫管理器或 MCM 驱动程序还可以启动 VC 的创建,在该 VC 上与网络组件(如网络交换机)交换信号消息。
Client-Initiated 创建 VC
在使用 NdisClMakeCall进行调用之前,面向连接的客户端调用 NdisCoCreateVc 以启动 VC 的创建。
下图显示了发起创建 VC 的调用管理器的客户端。
下图显示了启动创建 VC 的 MCM 驱动程序的客户端。
当调用管理器的面向连接的客户端调用 NdisCoCreateVc 时,NDIS 将调用作为同步操作,调用管理器的 ProtocolCoCreateVc 函数和基础微型端口驱动程序的 MiniportCoCreateVc 函数 (参阅本主题中的第一个图) 。 NDIS 将表示 VC 的 NdisVcHandle 传递给 ProtocolCoCreateVc 和 MiniportCoCreateVc。 如果调用 NdisCoCreateVc 成功,NDIS 会将 NdisVcHandle 返回到 NdisCoCreateVc。
ProtocolCoCreateVc 分配和初始化调用管理器在将激活的 VC 上执行后续操作所需的任何动态资源和结构。 MiniportCoCreateVc 分配和初始化微型端口驱动程序维护有关 VC 的状态信息所需的任何资源。 ProtocolCoCreateVc 和 MiniportCoCreateVc 都存储 NdisVcHandle。
当 MCM 驱动程序的面向连接的客户端时,对 NdisCoCreateVc 的调用会导致 NDIS 调用 MCM 驱动程序的 ProtocolCoCreateVc 函数, (请参阅 Client-Initiated 创建 VC (MCM 驱动程序 Present) ) 。 在这种情况下, ProtocolCoCreateVc 为 VC 执行必要的资源分配和初始化。 由于 MCM 驱动程序不提供此类函数,因此无法 (内部调用或以其他方式) MiniportCoCreateVc。
调用 Manager-Initiated 创建 VC
在使用 NdisCmDispatchIncomingCall 指示对面向连接的客户端的传入调用之前,呼叫管理器调用 NdisCoCreateVc 以启动 VC 的创建 (请参阅下图) 。
当调用管理器调用 NdisCoCreateVc 时,NDIS 以同步操作的形式调用注册了正在接收调用的 SAP 的面向连接的客户端的 ProtocolCoCreateVc 函数,以及基础微型端口的 MiniportCoCreateVc 函数。 NDIS 将表示 VC 的 NdisVcHandle 传递给 ProtocolCoCreateVc 和 MiniportCoCreateVc。 如果调用 NdisCoCreateVc 成功,NDIS 会将 NdisVcHandle 返回到 NdisCoCreateVc。
MCM Driver-Initiated 创建 VC
在使用 NdisMCmDispatchIncomingCall 指示对面向连接的客户端的传入调用之前,MCM 驱动程序调用 NdisMCmCreateVc 以启动创建 VC (请参阅下图) 。
当 MCM 驱动程序调用 NdisMCmCreateVc 时,NDIS 在 NdisMCmCreateVc 返回之前会调用作为同步操作,即面向连接的客户端的 ProtocolCoCreateVc 函数,该客户端注册了正在接收调用的 SAP。 NDIS 将表示 VC 的 NdisVcHandle 传递到 ProtocolCoCreateVc。 如果对 NdisMCmCreateVc 的调用成功,NDIS 会将 NdisVcHandle 返回到 NdisMCmCreateVc。
ProtocolCoCreateVc 分配和初始化客户端在 VC 上执行后续操作所需的任何动态资源和结构。 ProtocolCoCreateVc 还存储 NdisVcHandle 。
请注意,当 MCM 驱动程序创建用于与网络组件交换信号消息的 VC 时,它不使用 NdisXxx 调用来创建 VC。 事实上,MCM 驱动程序不会使用 NdisXxx 调用来创建、激活、停用或删除此类 VC。 相反,MCM 驱动程序在内部执行这些操作。 因此,此类 VC 对 NDIS 是不透明的。