如何使用蓝牙驱动程序堆栈

Windows 加载并初始化蓝牙驱动程序堆栈后,驱动程序堆栈将发现已配对的活动蓝牙设备。 然后,驱动程序堆栈为所有配对设备生成设备标识符(设备 ID)。 接下来,驱动程序堆栈使用标准即插即用 (PnP) 机制为每个设备加载相应的配置文件驱动程序。 要加载的配置文件驱动程序是根据安装配置文件驱动程序的 INF 文件和设备标识来选择的,由蓝牙驱动堆栈生成,如安装蓝牙设备中所述。

配置文件驱动程序通过所有基于 WDM 架构的驱动程序所采用的基于标准 I/O 请求包 (IRP) 的机制与蓝牙驱动程序堆栈进行通信。 配置文件驱动程序通过在蓝牙驱动程序堆栈中分配 IRP 并将其发送到蓝牙端口驱动程序 Bthport.sys 来与其设备通信。

配置文件驱动程序分配并初始化要由 Bthport.sys 处理的 IRP。 然后,配置文件驱动程序通过使用 IOCTL 请求与设备通信,IOCTL 请求通过 IRP_MJ_INTERNAL_DEVICE_CONTROLIRP_MJ_DEVICE_CONTROL IRP 传递给设备。 配置文件驱动程序指定 IRP 中以下列表中的一个 I/O 控制代码。

蓝牙驱动程序堆栈通过 IRP_MJ_DEVICE_CONTROL 为内核模式调用方支持以下 IOCTL:

IOCTL_BTH_DISCONNECT_DEVICE

IOCTL_BTH_GET_DEVICE_INFO

IOCTL_BTH_GET_LOCAL_INFO

IOCTL_BTH_GET_RADIO_INFO

IOCTL_BTH_SDP_ATTRIBUTE_SEARCH

IOCTL_BTH_SDP_CONNECT

IOCTL_BTH_SDP_DISCONNECT

IOCTL_BTH_SDP_REMOVE_RECORD

IOCTL_BTH_SDP_SERVICE_ATTRIBUTE_SEARCH

IOCTL_BTH_SDP_SERVICE_SEARCH

IOCTL_BTH_SDP_SUBMIT_RECORD

IOCTL_BTH_SDP_SUBMIT_RECORD_WITH_INFO

蓝牙驱动程序堆栈通过 IRP_MJ_INTERNAL_DEVICE_CONTROL 支持以下 IOCTL 和 BRB 内核模式调用方(通常用于驱动程序到驱动程序通信):

BRB_HCI_GET_LOCAL_BD_ADDR

BRB_L2CA_REGISTER_SERVER

BRB_L2CA_UNREGISTER_SERVER

BRB_L2CA_OPEN_CHANNEL

BRB_L2CA_OPEN_CHANNEL_RESPONSE

BRB_L2CA_CLOSE_CHANNEL

BRB_L2CA_ACL_TRANSFER

BRB_L2CA_UPDATE_CHANNEL

BRB_L2CA_PING

BRB_REGISTER_PSM

BRB_UNREGISTER_PSM

BRB_SCO_REGISTER_SERVER

BRB_SCO_UNREGISTER_SERVER

BRB_SCO_OPEN_CHANNEL

BRB_SCO_OPEN_CHANNEL_RESPONSE

BRB_SCO_CLOSE_CHANNEL

BRB_SCO_TRANSFER

BRB_SCO_GET_CHANNEL_INFO

BRB_SCO_GET_SYSTEM_INFO

BRB_SCO_FLUSH_CHANNEL

BRB_ACL_GET_MODE

BRB_ACL_ENTER_ACTIVE_MODE

BRB_GET_DEVICE_INTERFACE_STRING

IOCTL_INTERNAL_BTH_SUBMIT_BRB

IOCTL_INTERNAL_BTHENUM_GET_DEVINFO

IOCTL_INTERNAL_BTHENUM_GET_ENUMINFO

有关如何使用前面列表中所述的 IOCTL 的详细信息,请参阅蓝牙 IOCTL

配置文件驱动程序主要使用 IOCTL_INTERNAL_BTH_SUBMIT_BRB 与蓝牙驱动程序堆栈中提供的功能进行通信和交互。 配置文件驱动程序使用 IOCTL_INTERNAL_BTH_SUBMIT_BRB 将称为蓝牙请求块 (BRB) 的可变长度数据结构传递给所管理的设备。 配置文件驱动程序使用 BRB 打开和关闭与远程设备的连接,并执行大多数输入和输出任务。 IOCTL_INTERNAL_BTH_SUBMIT_BRB 包含一个 BRB,用于进一步描述要执行的蓝牙操作。 若要详细了解如何在蓝牙驱动程序堆栈中生成和发送 BRB,请参阅生成和发送 BRB

每个 BRB 都以 BRB_HEADER 结构定义的标准标头开头,该结构指定 BRB 的类型,从而确定 BRB 其余部分的结构。 Type 成员必须等于 BRB_TYPE 枚举中的值之一,它确定配置文件驱动程序请求的蓝牙操作类型。 根据 BRB 的类型,BRB 的结构和尺寸有所不同。 BRB_HEADER 结构的 Length 成员指定 BRB 的大小(以字节为单位)。 BthAllocateBrbBthInitializeBrbBthReuseBrb 函数自动设置 TypeLength 成员。

例如,若要打开与远程设备的连接,请指定其中一个函数代码(BRB_L2CA_OPEN_CHANNELBRB_SCO_OPEN_CHANNEL)以指示配置文件驱动程序正在尝试打开到远程设备的 L2CAP 或 SCO 连接通道。 蓝牙驱动程序堆栈使用 BRB 结构的 Status 成员返回特定于蓝牙的状态代码。

对于每个 BRB,配置文件驱动程序必须分配并初始化相应的结构,其中包含要执行的蓝牙操作的信息。

下表描述了与配置文件驱动程序可以发布的特定 BRB 相对应的结构:

蓝牙请求块 (BRB) 相应的结构
BRB_HCI_GET_LOCAL_BD_ADDR _BRB_GET_LOCAL_BD_ADDR
BRB_L2CA_REGISTER_SERVER _BRB_L2CA_REGISTER_SERVER
BRB_L2CA_UNREGISTER_SERVER _BRB_L2CA_UNREGISTER_SERVER
BRB_L2CA_OPEN_CHANNEL _BRB_L2CA_OPEN_CHANNEL
BRB_L2CA_OPEN_CHANNEL_RESPONSE _BRB_L2CA_OPEN_CHANNEL
BRB_L2CA_CLOSE_CHANNEL _BRB_L2CA_CLOSE_CHANNEL
BRB_L2CA_ACL_TRANSFER _BRB_L2CA_ACL_TRANSFER
BRB_L2CA_UPDATE_CHANNEL _BRB_L2CA_UPDATE_CHANNEL
BRB_L2CA_PING _BRB_L2CA_PING
BRB_REGISTER_PSM _BRB_PSM
BRB_UNREGISTER_PSM _BRB_PSM
BRB_SCO_REGISTER_SERVER _BRB_SCO_REGISTER_SERVER
BRB_SCO_UNREGISTER_SERVER _BRB_SCO_UNREGISTER_SERVER
BRB_SCO_OPEN_CHANNEL _BRB_SCO_OPEN_CHANNEL
BRB_SCO_OPEN_CHANNEL_RESPONSE _BRB_SCO_OPEN_CHANNEL
BRB_SCO_CLOSE_CHANNEL _BRB_SCO_CLOSE_CHANNEL
BRB_SCO_TRANSFER _BRB_SCO_TRANSFER
BRB_SCO_GET_CHANNEL_INFO _BRB_SCO_GET_CHANNEL_INFO
BRB_SCO_GET_SYSTEM_INFO _BRB_SCO_GET_SYSTEM_INFO
BRB_SCO_FLUSH_CHANNEL _BRB_SCO_FLUSH_CHANNEL
BRB_ACL_GET_MODE _BRB_ACL_GET_MODE
BRB_ACL_ENTER_ACTIVE_MODE _BRB_ACL_ENTER_ACTIVE_MODE
BRB_GET_DEVICE_INTERFACE_STRING _BRB_GET_DEVICE_INTERFACE_STRING

有关使用蓝牙 IOCTL 和 BRB 的详细信息,请参阅生成和发送 BRB