SpbCx 对象句柄

本主题介绍为 spbCx) 库 (SPB 框架扩展定义的对象句柄。

此外,SerCx2 DDI 使用由 Kernel-Mode Driver Framework (KMDF) 定义的两个泛型对象句柄类型 WDFDEVICE 和 WDFREQUEST。 有关框架句柄类型的详细信息,请参阅 Framework 对象的摘要

本主题介绍以下对象句柄:

标头:Spbcx.h

SPBREQUEST 对象句柄

SPBREQUEST 对象句柄表示向总线上的目标设备发出的 I/O 请求。

DECLARE_HANDLE(SPBREQUEST)

SPBREQUEST 对象类派生自 WDFREQUEST 对象类,该对象类表示 I/O 管理器调度的 I/O 请求。 因此,采用 WDFREQUEST 句柄值作为参数的 WdfRequestXxx 方法接受 SPBREQUEST 句柄值作为有效参数值。 有关这些方法的详细信息,请参阅 Framework Request Objects

但是,某些 SpbCx 方法和回调函数专门要求 SPBREQUEST 句柄作为参数。 对于此类参数,替换不是 SPBREQUEST 句柄的 WDFREQUEST 句柄是一个错误。

例如, SpbRequestGetTransferParameters 方法采用 SPBREQUEST 句柄作为参数。 若要提供,对于此参数,不是 SPBREQUEST 句柄的 WDFREQUEST 句柄是一个错误。 此要求的原因是 SPBREQUEST 对象必须存储其他特定于 SPB 的状态信息,以支持 I/O 传输序列WDFREQUEST 基对象类不提供此支持。

在设备初始化期间,SPB 控制器驱动程序可以通过调用 SpbControllerSetRequestAttributes 方法将每个请求的上下文分配给 SPBREQUEST 句柄。

SPBTARGET 对象句柄

SPBTARGET 对象句柄标识从客户端 (外围驱动程序) 到总线上的可寻址端口或外围设备的逻辑连接。

DECLARE_HANDLE(SPBTARGET)

对于 I2C 总线, SPBTARGET 句柄对应于特定的设备地址。
对于 SPI 总线, SPBTARGET 句柄对应于设备选择行。

通常, SPBTARGET 对象从 EvtSpbTargetConnect 事件回调的开头一直存在到相应 EvtSpbTargetDisconnect 事件回调的末尾。 但是,如果 SPB 控制器驱动程序对 SPBTARGET 对象进行附加引用以防止对象在处理目标的 I/O 请求期间意外消失, SPBTARGET 对象的生存期可能会超出第二个回调。

SPB 控制器驱动程序对 SPB 控制器设备执行所有特定于硬件的操作。 当客户端发送 IRP_MJ_CREATE 请求以打开与总线上目标的连接时,SPB 框架扩展 (SpbCx) (管理控制器驱动程序的 I/O 队列)通过调用此驱动程序的 EvtSpbTargetConnect 回调函数将此请求传递给 SPB 控制器驱动程序。 此函数的 Target 参数是 SPBTARGET 句柄。 函数可以使用此句柄来检索特定于连接的资源信息, (例如,从 PnP 管理器) 的设备地址。 当客户端发送关闭连接的 IRP_MJ_CLOSE 请求时,SpbCx 将此请求传递给 SPB 控制器驱动程序的 EvtSpbTargetDisconnect 回调函数,该函数会释放这些资源。

Exclusive-Mode访问

客户端具有独占模式来访问目标设备。 一次只能有一个客户端连接到特定目标设备。 SpbCx 确保总线上的目标设备地址仅存在一个 SPBTARGET 句柄。 此限制是必需的,因为 SpbCx 不支持由两个或多个客户端发送到目标设备的 I/O 请求交错。 如果目标设备必须能够接收来自多个客户端的请求,则此设备需要一个 MUX 驱动程序(独立于控制器驱动程序),该驱动程序可以正确交错所请求的操作。

与 KMDF 的互操作性

由 SpbCx 定义的 SerCx2 驱动程序支持方法和 SpbCx 事件回调函数使用 SPBTARGET 句柄来表示与总线上目标设备的开放连接。 但是,控制器驱动程序通常必须调用需要 WDFFILEOBJECT 句柄而不是 SPBTARGET 句柄来指定目标设备的 KMDF 方法。

SPBTARGET 对象类似于 WDFFILEOBJECT 对象。 但是, SPBTARGET 对象包含 SPB 特定的其他信息。 例如,在处理 IOCTL_SPB_EXECUTE_SEQUENCE I/O 控制请求期间,目标设备的 SPBTARGET 对象跟踪 I/O 传输序列中的传输状态。

为了获取目标的 WDFFILEOBJECT 句柄,SPB 控制器驱动程序调用 SpbTargetGetFileObject 方法。 此方法接受打开的目标设备的 SPBTARGET 句柄作为输入参数,并将相应的 WDFFILEOBJECT 句柄返回到此目标。

根据 KMDF 约定,SPB 控制器驱动程序可以将自己的上下文附加到目标设备的 SPBTARGET 对象,并且此上下文可以包括关联的 EvtCleanupCallbackEvtDestroyCallback 回调函数。 SPB 控制器驱动程序使用此上下文来跟踪特定于控制器驱动程序和目标设备的信息。 此外,此驱动程序还可以创建 SPBTARGET 对象的子对象,例如计时器、DPC,或者(如果需要)I/O 请求和 I/O 队列。