Bluetooth (Windows): adds a string variant helper; removes propsys dependency

This commit is contained in:
李通洲
2026-03-03 10:45:11 +08:00
parent 75f4a3d92d
commit b86c0880b9
5 changed files with 40 additions and 26 deletions
+1 -1
View File
@@ -1020,6 +1020,7 @@ elseif(WIN32)
src/common/windows/registry.c
src/common/windows/unicode.c
src/common/windows/wmi.cpp
src/common/windows/variant.cpp
src/common/windows/version.c
src/detection/battery/battery_windows.c
src/detection/bios/bios_windows.c
@@ -1735,7 +1736,6 @@ elseif(WIN32)
PRIVATE "wtsapi32"
PRIVATE "cfgmgr32"
PRIVATE "winbrand"
PRIVATE "propsys"
PRIVATE "secur32"
PRIVATE "wintrust"
)
+21
View File
@@ -0,0 +1,21 @@
#include "variant.hpp"
#include <oleauto.h>
FFWmiVariant::FFWmiVariant(std::initializer_list<PCWSTR> strings): FFWmiVariant()
{
SAFEARRAYBOUND bound = {
.cElements = (ULONG) strings.size(),
.lLbound = 0,
};
SAFEARRAY* psa = SafeArrayCreate(VT_BSTR, 1, &bound);
LONG i = 0;
for (PCWSTR str : strings) {
SafeArrayPutElement(psa, &i, bstr_t(str));
++i;
}
this->vt = VT_ARRAY | VT_BSTR;
this->parray = psa;
}
+17
View File
@@ -3,6 +3,7 @@
#include <type_traits>
#include <utility>
#include <string_view>
#include <cassert>
template <typename TVariant>
struct FFBaseVariant: TVariant
@@ -137,6 +138,7 @@ struct FFWmiVariant: FFBaseVariant<VARIANT>
FFWmiVariant(const FFWmiVariant&) = delete;
FFWmiVariant(FFWmiVariant&&); // don't define it to enforce NRVO optimization
explicit FFWmiVariant() { VariantInit(this); }
explicit FFWmiVariant(std::initializer_list<PCWSTR> strings);
~FFWmiVariant() { VariantClear(this); }
};
static_assert(sizeof(FFWmiVariant) == sizeof(VARIANT), "");
@@ -149,3 +151,18 @@ struct FFPropVariant: FFBaseVariant<PROPVARIANT>
~FFPropVariant() { PropVariantClear(this); }
};
static_assert(sizeof(FFPropVariant) == sizeof(PROPVARIANT), "");
namespace
{
// Provide our bstr_t to avoid libstdc++ dependency
struct bstr_t
{
explicit bstr_t(const wchar_t* str) noexcept: _bstr(SysAllocString(str)) {}
~bstr_t(void) noexcept { SysFreeString(_bstr); }
explicit operator const wchar_t*(void) const noexcept { return _bstr; }
operator BSTR(void) const noexcept { return _bstr; }
private:
BSTR _bstr;
};
}
-16
View File
@@ -8,7 +8,6 @@ extern "C" {
#include <initguid.h>
#include <wbemidl.h>
#include <cassert>
#include "variant.hpp"
@@ -74,21 +73,6 @@ struct FFWmiQuery
}
};
namespace
{
// Provide our bstr_t to avoid libstdc++ dependency
struct bstr_t
{
explicit bstr_t(const wchar_t* str) noexcept: _bstr(SysAllocString(str)) {}
~bstr_t(void) noexcept { SysFreeString(_bstr); }
explicit operator const wchar_t*(void) const noexcept { return _bstr; }
operator BSTR(void) const noexcept { return _bstr; }
private:
BSTR _bstr;
};
}
#else
// Win32 COM headers requires C++ compiler
#error Must be included in C++ source file
@@ -6,8 +6,6 @@ extern "C"
#include "common/windows/unicode.hpp"
#include "common/windows/util.hpp"
STDAPI InitVariantFromStringArray(_In_reads_(cElems) PCWSTR *prgsz, _In_ ULONG cElems, _Out_ VARIANT *pvar);
extern "C"
const char* ffBluetoothDetectBattery(FFlist* devices)
{
@@ -27,13 +25,7 @@ const char* ffBluetoothDetectBattery(FFlist* devices)
if (FAILED(pnpEntityClass->GetMethod(bstr_t(L"GetDeviceProperties"), 0, &pInParams, NULL)))
return "Failed to get GetDeviceProperties method";
VARIANT devicePropertyKeys;
PCWSTR props[] = { L"{104EA319-6EE2-4701-BD47-8DDBF425BBE5} 2", L"DEVPKEY_Bluetooth_DeviceAddress" };
if (FAILED(InitVariantFromStringArray(props, ARRAY_SIZE(props), &devicePropertyKeys)))
return "Failed to init variant from string array";
on_scope_exit releaseDevicePropertyKeys([&] { VariantClear(&devicePropertyKeys); });
FFWmiVariant devicePropertyKeys({ L"{104EA319-6EE2-4701-BD47-8DDBF425BBE5} 2", L"DEVPKEY_Bluetooth_DeviceAddress" });
if (FAILED(pInParams->Put(L"devicePropertyKeys", 0, &devicePropertyKeys, CIM_FLAG_ARRAY | CIM_STRING)))
return "Failed to put devicePropertyKeys";
}