// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "device/bluetooth/bluetooth_init_win.h" #include "base/threading/thread_restrictions.h" namespace { // A frame-based exception handler filter function for a handler for exceptions // generated by the Visual C++ delay loader helper function. int FilterVisualCPPExceptions(DWORD exception_code) { return HRESULT_FACILITY(exception_code) == FACILITY_VISUALCPP ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH; } } // namespace namespace device { namespace bluetooth_init_win { bool HasBluetoothStack() { static enum { HBS_UNKNOWN, HBS_YES, HBS_NO, } has_bluetooth_stack = HBS_UNKNOWN; if (has_bluetooth_stack == HBS_UNKNOWN) { base::ThreadRestrictions::AssertIOAllowed(); HRESULT hr = E_FAIL; __try { hr = __HrLoadAllImportsForDll("bthprops.cpl"); } __except(FilterVisualCPPExceptions(::GetExceptionCode())) { hr = E_FAIL; } has_bluetooth_stack = SUCCEEDED(hr) ? HBS_YES : HBS_NO; } return has_bluetooth_stack == HBS_YES; } } // namespace bluetooth_init_win } // namespace device