在驱动程序可以在 简单的外围总线 (SPB)上将 I/O 请求发送到外围设备之前,驱动程序必须打开与设备的逻辑连接。 通过此连接,驱动程序可以发送读取和写入请求,以将数据传入和传出设备。 此外,驱动程序还可以将 I/O 控制(IOCTL)请求发送到设备以执行特定于 SPB 的操作。
在系统启动时,即插即用(PnP)管理器同时枚举 PnP 设备和非 PnP 设备。 对于与 SPB 建立固定连接的非 PnP 外围设备,PnP 管理器会查询硬件平台的 ACPI 固件以获取一组描述如何访问设备的连接参数。 这些连接参数标识设备连接到的总线的 SPB 控制器,并包括控制器与设备通信所需的其他信息,例如总线地址和总线时钟频率。
PnP 管理器将标识符(称为 连接 ID)分配给 SPB 连接的外围设备的连接参数。 PnP 管理器将此 ID 和连接参数存储在名为 资源中心的系统数据存储中。 (资源中心是内部数据存储,其中 PnP 管理器存储有关 SPB 连接的外围设备的配置信息。连接 ID 封装这些参数,以便驱动程序不需要显式提供它们。
SPB 连接的外围设备的驱动程序作为驱动程序分配的硬件资源的一部分接收设备的连接 ID。 当外围设备的驱动程序调用系统函数以打开与设备的连接时,驱动程序会提供连接 ID,该 ID 用于从资源中心检索设备的连接参数。
驱动程序开发人员可以使用 User-Mode 驱动程序框架 (UMDF)或 Kernel-Mode 驱动程序框架 (KMDF)为 SPB 连接的外围设备生成驱动程序。 当框架调用驱动程序的 IPnpCallbackHardware2::OnPrepareHardware 方法时,UMDF 驱动程序将接收其资源(包括连接 ID)。 KMDF 驱动程序在 EvtDevicePrepareHardware 回调期间接收其硬件资源。
若要使 UMDF 外围驱动程序在其资源列表中接收连接 ID,安装该驱动程序的 INF 文件必须在其 WDF 特定的 DDInstall 节中包含以下指令:
UmdfDirectHardwareAccess = AllowDirectHardwareAccess 有关此指令的详细信息,请参阅 在 INF 文件中指定 WDF 指令。 有关使用此指令的 INX 文件(用于生成相应的 INF 文件)的示例,请参阅 SpbAccelerometer 驱动程序示例。
驱动程序作为资源接收的连接 ID 是 64 位整数,但驱动程序必须将此 ID 合并到设备路径名称中,该名称可用于从资源中心检索连接参数。 若要创建设备路径名称,驱动程序将调用在 Reshub.h 头文件中声明的 RESOURCE_HUB_CREATE_PATH_FROM_ID 函数。
若要打开与 SPB 连接的外围设备的逻辑连接,UMDF 驱动程序调用 IWDFRemoteTarget::OpenFileByName 方法,KMDF 驱动程序调用 WdfIoTargetOpen 方法。 任一方法都需要设备路径名称作为输入参数。
有关使用连接 ID 打开与 SPB 连接的外围设备的逻辑连接的 UMDF 和 KMDF 代码示例,请参阅以下主题:
用于 User-Mode SPB 外围驱动程序的硬件资源用于 Kernel-Mode SPB 外围驱动程序的硬件资源 用户模式应用程序无法打开与 SPB 连接的外围设备的逻辑连接,并且无法直接向这些设备发送 I/O 请求。
一次只能有一个驱动程序与 SPB 连接的外围设备建立开放的逻辑连接。 另一个驱动程序尝试打开与同一设备的第二个连接失败。