blob: ab41d47174b5fba0cd91e7902fc8417e9fb5b219 [file] [log] [blame]
// 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/scoped_blocking_call.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::ScopedBlockingCall scoped_blocking_call(
FROM_HERE, base::BlockingType::MAY_BLOCK);
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