Win10 21H2调用BluetoothGATTGetServices获取GATT句柄失败排查
问题背景
- 运行环境:Windows 10 21H2(OS内部版本19044.1766)
- 开发目标:调用原生Win32蓝牙API
BluetoothGATTGetServices,对接与Windows主机配对连接的安卓手机蓝牙设备,为安全产品采集连接蓝牙设备的序列号等特征信息,用于安全分析日志留存 - 实现约束:仅允许使用原生Win32 API实现,禁止采用WinRT类库
已完成尝试与现存问题
- 第一次尝试:前置调用
BluetoothEnumerateInstalledServices成功获取14个服务GUID,通过Sysinternals WinObj工具查看到GLOBAL??命名空间下存在对应14个GUID的BTHENUM类型符号链接,格式如下:
尝试通过BTHENUM#{服务GUID}_VID&00010075_PID&0100#7&39ffa139&0&F0F56456EDD3_C00000000#{服务GUID}CreateFile打开上述符号链接获取句柄,作为BluetoothGATTGetServices的第一个入参。遍历测试所有14个链接时,分别返回三类错误:错误32(不支持该请求)、错误2(系统找不到指定文件)、错误5(拒绝访问)。
测试过程中遍历了所有可能的参数组合:dwDesiredAccess覆盖GENERIC_READ|GENERIC_WRITE、GENERIC_READ选项;dwShareMode覆盖FILE_SHARE_READ|FILE_SHARE_WRITE、FILE_SHARE_READ、全共享模式选项;dwCreationDisposition固定为OPEN_EXISTING;dwFlagsAndAttributes覆盖FILE_ATTRIBUTE_NORMAL、FILE_FLAG_OVERLAPPED选项,所有组合均无法打开有效句柄。其中返回拒绝访问的2个符号链接的DACL仅授予管理员和SYSTEM账户删除、修改权限、修改所有者权限,尝试取得所有权时因资源被其他进程占用失败。 - 第二次尝试:通过SetupAPI、CM_xx系列接口,使用蓝牙接口GUID
{781aee18-7733-4ce4-add0-91f41c67b592}枚举设备路径,获取到路径\\?\bthle#dev_f0f56456edd3#7&29e54a1a&0&f0f56456edd3#{781aee18-7733-4ce4-add0-91f41c67b592}可成功打开句柄,但将该句柄传入BluetoothGATTGetServices时返回HRESULT_FROM_WIN32(ERROR_NOT_FOUND)(找不到元素)错误。 - 第三次尝试:测试网上公开的旧版GetBLEHandle示例代码,该代码仅适配Win10之前的Windows版本,在当前环境下无法正常运行。
- 第四次尝试:通过Winsock蓝牙套接字接口枚举服务,参考官方开发文档实现
CSecRMMBlueToothSocket::GetService方法,所有API、变量名、常量均保持原生定义,使用PublicBrowseGroupServiceClass_UUID作为查询GUID调用WSALookupServiceBegin/WSALookupServiceNext系列接口,仅枚举到经典蓝牙服务:AV Remote Control Target、Advanced Audio Source、Android Network Access Point、Android Network User、Handsfree Gateway、Headset Gateway、IcService_New、OBEX Object Push、OBEX Phonebook Access Server、SMS/MMS,未获取到BLE GATT服务,返回结果中也未携带对应服务GUID,调整WSAQUERYSET控制标志也未得到预期结果。
待解决核心疑问
- 原生Win32环境下,获取可传入
BluetoothGATTGetServices的有效设备句柄的正确方法是什么?BLE设备服务接口对应的正确GUID值是什么? - 若坚持使用原生Win32接口,是否必须通过蓝牙套接字方式自行实现GATT协议通信,还是
bluetoothleapis系列接口可直接实现GATT服务枚举?
内容的提问来源于stack exchange,提问作者A LaMark
相关产品推荐
相关产品推荐

