// Copyright 2013 The Chromium Authors
// 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/scoped_thread_priority.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) {
// Mitigate the issues caused by loading DLLs on a background thread
// (http://crbug/973868).
SCOPED_MAY_LOAD_LIBRARY_AT_BACKGROUND_PRIORITY_REPEATEDLY();
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