指示来电

呼叫管理器或 MCM 驱动程序通过发出来自网络的消息发出信号来向传入呼叫发出警报。 从这些信号消息中,调用管理器或 MCM 驱动程序提取呼叫的调用参数,包括传入呼叫所发送到的 SAP。

下图显示了指示传入呼叫的 MCM 驱动程序。

显示指示传入呼叫的 MCM 驱动程序的关系图。

下图显示了指示传入呼叫的呼叫管理器。

说明指示传入呼叫的呼叫管理器的关系图。

如果呼叫管理器或 MCM 驱动程序无法接受传入呼叫参数,则如果信号协议允许此类协商,则它可以尝试与远程方协商这些参数的更改。 或者,接收来自调用管理器或 MCM 驱动程序的调用指示后,将传入呼叫定向到的客户端可以尝试协商调用参数 (请参阅 客户端发起的更改调用参数的请求) 。 如果呼叫管理器或 MCM 驱动程序无法与远程方协商呼叫的可接受呼叫参数,则它可能会拒绝呼叫。 信号协议确定在这种情况下可能的情况。

在指示对客户端的传入调用之前,调用管理器或 MCM 驱动程序必须标识呼叫定向到的 SAP。 SAP 必须以前由客户端 注册 。 调用管理器或 MCM 驱动程序还必须启动 VC 的创建 并启动 此 VC 的激活

然后,呼叫管理器或 MCM 驱动程序指示对注册了传入呼叫定向到的 SAP 的客户端的传入呼叫。 呼叫管理器使用 NdisCmDispatchIncomingCall 指示传入呼叫。 MCM 驱动程序指示使用 NdisMCmDispatchIncomingCall 的传入呼叫。

在调用 Ndis (M) CmDispatchIncomingCall 时,调用管理器或 MCM 驱动程序传递以下内容:

  • 标识传入呼叫的 SAP 的 NdisSapHandle

  • 标识传入呼叫的虚拟线路的 NdisVcHandle

  • 指向 CO_CALL_PARAMETERS 类型的结构的指针,该结构包含调用的调用参数。

调用 Ndis (M) CmDispatchIncomingCall 会导致 NDIS 调用客户端的 ProtocolClIncomingCall 函数,客户端在其中接受或拒绝请求的连接。 ProtocolClIncomingCall 应验证 SAP、VC 和调用参数。

ProtocolClIncomingCall 可以同步完成,也可以使用 NdisClIncomingCallComplete 以异步方式返回NDIS_STATUS_PENDING和完整。 调用 NdisClIncomingCallComplete 会导致 NDIS 调用调用管理器的 或 MCM 驱动程序的 ProtocolCmIncomingCallComplete 函数。

由 ProtocolClIncomingCall 同步完成返回或提供给 NdisClIncomingCallComplete 的NDIS_STATUS代码指示客户端接受或拒绝传入调用。 客户端还会返回缓冲CO_CALL_PARAMETERS结构中调用的调用参数。 如果客户端发现调用参数不可接受,如果信号协议允许,则可以通过使用 CALL_PARAMETERS_CHANGED 设置 CO_CALL_PARAMETERS 结构中的 Flags 成员并在缓冲CO_CALL_PARAMETERS结构中提供修订后的调用参数来请求更改调用参数。

如果客户端接受传入呼叫,则调用管理器或 MCM 驱动程序应发送信号消息,以指示呼叫实体已接受呼叫。 否则,呼叫管理器或 MCM 驱动程序应发送信号消息以指示呼叫已被拒绝。 如果客户端请求更改调用参数,则调用管理器或 MCM 驱动程序会发送信号消息以请求更改调用参数。

如果客户端接受了调用,或者远程方接受了客户端请求的调用参数更改,则调用管理器调用 NdisCmDispatchCallConnected,MCM 驱动程序调用 NdisMCmDispatchCallConnected。 调用 Ndis (M) CmDispatchCallConnected 会导致 NDIS 调用客户端的 ProtocolClCallConnected 函数。

如果客户端拒绝了呼叫,并且调用管理器或 MCM 驱动程序已激活传入呼叫的 VC,则调用管理器或 MCM 驱动程序调用 Ndis (M) CmDeactivateVc 以在激活 VC 时停用 VC。 然后,调用管理器或 MCM 驱动程序可以通过调用管理器中的 NdisCoDeleteVcMCM 驱动程序中的 NdisMCmDeleteVc 来启动删除 VC。

如果客户端接受了调用,但由于远程方) 取消呼叫而未成功建立端到端连接 (,则调用管理器或 MCM 驱动程序不会调用 Ndis (M) CmDispatchCallConnected。 相反,它将调用 Ndis (M) CmDispatchIncomingCloseCall,这会导致 NDIS 调用客户端的 ProtocolClIncomingCloseCall 函数。 然后,客户端必须调用 NdisClClCloseCall 以完成调用的拆解。 然后,调用管理器或 MCM 驱动程序调用 Ndis (M) CmDeactivateVC 来停用它为传入呼叫创建的 VC 。 然后,调用管理器或 MCM 驱动程序可以通过调用管理器中的 NdisCoDeleteVcMCM 驱动程序中的 NdisMCmDeleteVc 来启动删除 VC。