调试蓝牙配置文件驱动程序
开发蓝牙配置文件驱动程序时,可以使用驱动程序验证程序来协助其调试。
若要启用验证检查,必须为 Bthusb.sys 启用驱动程序验证程序。 如果不执行此操作,将禁用验证检查。
若要完全利用验证检查,请确保使用蓝牙请求块 (BRB) 分配例程,例如 BthAllocateBrb 和 BthInitializeBrb,这些例程由蓝牙驱动程序堆栈提供来生成和发送 BRB。 这些例程包括帮助调试配置文件驱动程序的其他功能。
验证检查有助于捕获以下类型的错误:
- 尝试在 BRB 完成之前重新提交 BRB
- 尝试分配或初始化无效的 BRB 类型
- 尝试提交大小无效的 BRB
调试配置文件驱动程序时,可以在 BC_BLUETOOTH_VERIFIER_FAULT 后使用 !analyze-v 调试器命令来获取故障的说明。
HCI支持
蓝牙主机控制器接口 (HCI) 指定主机和蓝牙无线电控制器之间的所有交互。 蓝牙规范允许供应商定义的 HCI 命令和事件在主机和控制器之间启用非标准化交互。 Microsoft 定义了 Windows 使用的特定于供应商的 HCI 命令和事件。 蓝牙控制器实现者可以使用这些扩展来实现特殊功能。
要求
蓝牙 HCI 命令由 16 位命令代码标识。 蓝牙组织定义 0x0000 到 0xFBFF 范围内的值。 供应商定义范围 0xFC00 至 0xFFFF 中的值,允许 1024 个不同的供应商分配的命令代码。
供应商必须选择 Microsoft 定义的命令代码的值。 Microsoft 无法选择命令代码,并假定没有其他供应商将代码用于冲突目的。 发出特定于供应商的命令是不安全的,如果控制器不了解该命令,则由它拒绝该命令。 控制器可以将命令解释为破坏性操作,例如更新控制器的固件。
供应商必须通过控制器以外的方法传达所选值。 Microsoft 未指定如何获取所选代码。
通知 Windows 蓝牙堆栈供应商特定的命令代码
Windows 蓝牙堆栈从注册表项 VsMsftOpCode
中读取供应商特定的命令代码。
VsMsftOpCode
注册表项具有 REG_DWORD 类型,键数据是供应商特定的操作码。
若要指定供应商特定的操作码,请使用驱动程序 INF 中 DDInstall.HW 节下的 AddReg
指令。 add registry 节应包含:
HKR,,"VsMsftOpCode",0x00010001,<Vendor Specific Opcode>
例如:
[radio.NTamd64.HW]
AddReg=radio.NTamd64.HW.AddReg
[radio.NTamd64.HW.AddReg]
HKR,,"VsMsftOpCode",0x00010001,<Vendor Specific Opcode>
Microsoft 定义的 HCI 命令
Microsoft 定义的 HCI 命令和子命令
控制器了解只有一个特定于 Microsoft 的 HCI 命令。 特定于 Microsoft 的命令集是使用操作码扩展的。 Microsoft 定义的 HCI 命令的第一个命令参数是指定子命令的操作码。
控制器必须支持 HCI_VS_MSFT_Read_Supported_Features 才能支持任何其他 Microsoft HCI 子命令。 对其他命令的支持是可选的,取决于 HCI_VS_MSFT_Read_Supported_Features 返回的值。 除非控制器通过响应 HCI_VS_MSFT_Read_Supported_Features 指示对 Microsoft 定义的子命令的支持,否则 Windows 不会发送任何子命令。
主要HCI命令
HCI_VS_MSFT_Read_Supported_Features
功能:此命令提供一个位图,描述控制器支持哪些Microsoft定义的功能,并指定控制器返回的Microsoft定义的事件的前缀。
重要性:控制器必须支持此命令,才能支持任何其他Microsoft HCI子命令。对其他命令的支持是可选的,并取决于此命令返回的值。
HCI_VS_MSFT_Monitor_Rssi
功能:请求控制器开始监视指定连接的测量链接RSSI(Received Signal Strength Indication,接收信号强度指示),并在连接的测量链接RSSI超出指定限制时生成事件。
应用场景:用于监控蓝牙连接的信号强度,以确保连接的稳定性和质量。
HCI_VS_MSFT_Cancel_Monitor_Rssi
功能:取消先前发出的HCI_VS_MSFT_Monitor_Rssi命令。
应用场景:当不再需要监控特定连接的RSSI时,可以使用此命令停止监控。
HCI_VS_MSFT_LE_Monitor_Advertisement
功能:请求控制器开始监视落入指定RSSI范围并满足其他要求的广告。
应用场景:用于监控蓝牙LE(Low Energy,低功耗)设备的广告,以便发现新设备或连接已知设备。
HCI_VS_MSFT_LE_Cancel_Monitor_Advertisement
功能:取消先前发出的HCI_VS_MSFT_LE_Monitor_Advertisement命令。
应用场景:当不再需要监控特定广告时,可以使用此命令停止监控。
HCI_VS_MSFT_LE_Set_Advertisement_Filter_Enable
功能:设置广告过滤器的状态。
应用场景:用于控制是否允许特定类型的广告被接收和处理。
HCI_VS_MSFT_Read_Absolute_RSSI
功能:从控制器读取BR/EDR(Basic Rate/Enhanced Data Rate,基本速率/增强数据速率)连接的绝对RSSI值。
应用场景:用于获取蓝牙BR/EDR连接的精确信号强度信息。
子命令与操作码
Microsoft定义的HCI命令通常包含一个指定子命令的操作码作为第一个命令参数。控制器通过识别这个操作码来确定要执行的具体子命令。例如,在HCI_VS_MSFT_Read_Supported_Features命令中,子命令操作码为0x00用于请求读取支持的功能位图。
需要注意的是,Microsoft定义的HCI命令和子命令可能随着Windows系统的更新而发生变化。因此,在开发或调试涉及这些命令的应用程序时,建议参考最新的Microsoft官方文档或蓝牙核心规范以获取最准确的信息。
总的来说,Microsoft定义的HCI命令和子命令为Windows系统提供了与蓝牙控制器进行非标准化交互的能力,从而实现了更多特定于Microsoft的功能和特性。