diff --git a/CMakeLists.txt b/CMakeLists.txt index f2be4d558..ec4525a57 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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" ) diff --git a/src/common/windows/variant.cpp b/src/common/windows/variant.cpp new file mode 100644 index 000000000..fa3b9a0e5 --- /dev/null +++ b/src/common/windows/variant.cpp @@ -0,0 +1,21 @@ +#include "variant.hpp" + +#include + +FFWmiVariant::FFWmiVariant(std::initializer_list 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; +} diff --git a/src/common/windows/variant.hpp b/src/common/windows/variant.hpp index 84a471ff9..1fa8fd180 100644 --- a/src/common/windows/variant.hpp +++ b/src/common/windows/variant.hpp @@ -3,6 +3,7 @@ #include #include #include +#include template struct FFBaseVariant: TVariant @@ -137,6 +138,7 @@ struct FFWmiVariant: FFBaseVariant FFWmiVariant(const FFWmiVariant&) = delete; FFWmiVariant(FFWmiVariant&&); // don't define it to enforce NRVO optimization explicit FFWmiVariant() { VariantInit(this); } + explicit FFWmiVariant(std::initializer_list strings); ~FFWmiVariant() { VariantClear(this); } }; static_assert(sizeof(FFWmiVariant) == sizeof(VARIANT), ""); @@ -149,3 +151,18 @@ struct FFPropVariant: FFBaseVariant ~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; + }; +} diff --git a/src/common/windows/wmi.hpp b/src/common/windows/wmi.hpp index c506a8868..a72a72dcc 100644 --- a/src/common/windows/wmi.hpp +++ b/src/common/windows/wmi.hpp @@ -8,7 +8,6 @@ extern "C" { #include #include -#include #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 diff --git a/src/detection/bluetooth/bluetooth_windows.cpp b/src/detection/bluetooth/bluetooth_windows.cpp index b54882d61..3109037f4 100644 --- a/src/detection/bluetooth/bluetooth_windows.cpp +++ b/src/detection/bluetooth/bluetooth_windows.cpp @@ -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"; }