static int is_hid_service_enabled(const HANDLE hRadio, BLUETOOTH_DEVICE_INFO *device_info) { /* retrieve number of installed services */ DWORD num_services = 0; DWORD result = BluetoothEnumerateInstalledServices(hRadio, device_info, &num_services, NULL); if (result != ERROR_SUCCESS) { /* NOTE: Sometimes we get ERROR_MORE_DATA, sometimes we do not. * The number of services seems to be correct in any case, so * we will just ignore this. */ if (result != ERROR_MORE_DATA) { WINPAIR_DEBUG("Failed to count installed services"); return 0; } } if (num_services == 0) { return 0; } /* retrieve actual list of installed services */ GUID *service_list = (GUID *) calloc(num_services, sizeof(GUID)); if (!service_list) { return 0; } result = BluetoothEnumerateInstalledServices(hRadio, device_info, &num_services, service_list); if (result != ERROR_SUCCESS) { WINPAIR_DEBUG("Failed to enumerate installed services"); return 0; } /* check if the HID service is part of that list */ unsigned int i; int found = 0; GUID service = HumanInterfaceDeviceServiceClass_UUID; for (i = 0; i < num_services; i++) { if (IsEqualGUID(&service_list[i], &service)) { found = 1; break; } } free(service_list); return found; }
static bool is_hid_service_enabled(const HANDLE hRadio, BLUETOOTH_DEVICE_INFO *device_info) { DWORD num_services = 0; GUID *service_list= nullptr; bool success = true; // retrieve number of installed services { DWORD result = BluetoothEnumerateInstalledServices(hRadio, device_info, &num_services, NULL); if (result != ERROR_SUCCESS) { /* NOTE: Sometimes we get ERROR_MORE_DATA, sometimes we do not. * The number of services seems to be correct in any case, so * we will just ignore this. */ if (result != ERROR_MORE_DATA) { SERVER_MT_LOG_ERROR("AsyncBluetoothPairDeviceRequest") << "Failed to count installed services"; success= false; } } if (success && num_services == 0) { success= false; } } // retrieve actual list of installed services if (success) { service_list = (GUID *)calloc(num_services, sizeof(GUID)); if (!service_list) { success= false; } } if (success) { DWORD result = BluetoothEnumerateInstalledServices(hRadio, device_info, &num_services, service_list); if (result != ERROR_SUCCESS) { SERVER_MT_LOG_ERROR("AsyncBluetoothPairDeviceRequest") << "Failed to enumerate installed services"; return 0; } } // check if the HID service is part of that list if (success) { GUID service = HumanInterfaceDeviceServiceClass_UUID; success= false; for (unsigned int i = 0; i < num_services; i++) { if (IsEqualGUID(service_list[i], service)) { success = true; break; } } } if (service_list != nullptr) { free(service_list); } return success; }
// Scan local network for visible remote devices static VALUE bt_devices_scan(VALUE self) { WORD wVersionRequested = 0x202; HANDLE hRadio; BLUETOOTH_FIND_RADIO_PARAMS btfrp = { sizeof(btfrp) }; HBLUETOOTH_RADIO_FIND hFind = BluetoothFindFirstRadio( &btfrp, &hRadio ); VALUE devices_array = rb_ary_new(); if ( NULL != hFind ) { do { BLUETOOTH_DEVICE_INFO_STRUCT deviceInfo; deviceInfo.dwSize = sizeof(deviceInfo); BLUETOOTH_DEVICE_SEARCH_PARAMS deviceSearchParams; memset(&deviceSearchParams, 0, sizeof(deviceSearchParams)); deviceSearchParams.dwSize = sizeof(deviceSearchParams); deviceSearchParams.fReturnAuthenticated = true; deviceSearchParams.fReturnRemembered = false; deviceSearchParams.fReturnUnknown = true; deviceSearchParams.fReturnConnected = true; deviceSearchParams.fIssueInquiry = true; deviceSearchParams.cTimeoutMultiplier = 1; deviceSearchParams.hRadio = hRadio; HANDLE hDeviceFind = BluetoothFindFirstDevice(&deviceSearchParams, &deviceInfo); if (NULL != hDeviceFind) { do { BYTE *rgBytes = deviceInfo.Address.rgBytes; //BluetoothDisplayDeviceProperties(0, &deviceInfo); char addr[19] = { 0 }; char name[248] = { 0 }; wcstombs(name, deviceInfo.szName, sizeof(name)); snprintf(addr, sizeof(addr), "%02x:%02x:%02x:%02x:%02x:%02x", rgBytes[5], rgBytes[4], rgBytes[3], rgBytes[2], rgBytes[1], rgBytes[0]); VALUE bt_dev = bt_device_new(bt_device_class, rb_str_new2(name), rb_str_new2(addr)); rb_ary_push(devices_array, bt_dev); } while(BluetoothFindNextDevice(hDeviceFind, &deviceInfo)); BluetoothFindDeviceClose(hDeviceFind); } GUID guidServices[10]; DWORD numServices = sizeof(guidServices); DWORD result = BluetoothEnumerateInstalledServices(hRadio, &deviceInfo, &numServices, guidServices); CloseHandle( hRadio ); } while( BluetoothFindNextRadio( hFind, &hRadio ) ); BluetoothFindRadioClose( hFind ); } return devices_array; }