summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorisanae <14251494+isanae@users.noreply.github.com>2019-09-21 21:27:45 -0400
committerisanae <14251494+isanae@users.noreply.github.com>2019-09-21 21:27:45 -0400
commitc1a5f2ef73f4435c08876155d4551c045d5e7594 (patch)
tree89ead2116344fe3bd8282320022e5d9f31fc63cb /src
parent2feaed68b4bd2191aeaf02c33990a0bdf7f8738c (diff)
refactored getSecurityProductsFromWMI() to stop using a lambda
security products now only need a guid, handles failures better
Diffstat (limited to 'src')
-rw-r--r--src/envsecurity.cpp140
-rw-r--r--src/envsecurity.h4
2 files changed, 84 insertions, 60 deletions
diff --git a/src/envsecurity.cpp b/src/envsecurity.cpp
index 3b4cdcaa..ffb17c42 100644
--- a/src/envsecurity.cpp
+++ b/src/envsecurity.cpp
@@ -161,6 +161,11 @@ SecurityProduct::SecurityProduct(
{
}
+const QUuid& SecurityProduct::guid() const
+{
+ return m_guid;
+}
+
const QString& SecurityProduct::name() const
{
return m_name;
@@ -185,7 +190,13 @@ QString SecurityProduct::toString() const
{
QString s;
- s += m_name + " (" + providerToString() + ")";
+ if (m_name.isEmpty()) {
+ s += "(no name)";
+ } else {
+ s += m_name;
+ }
+
+ s += " (" + providerToString() + ")";
if (!m_active) {
s += ", inactive";
@@ -195,7 +206,9 @@ QString SecurityProduct::toString() const
s += ", definitions outdated";
}
- if (!m_guid.isNull()) {
+ if (m_guid.isNull()) {
+ s += ", (no guid)";
+ } else {
s += ", " + m_guid.toString(QUuid::QUuid::WithoutBraces);
}
@@ -242,91 +255,98 @@ QString SecurityProduct::providerToString() const
}
-std::vector<SecurityProduct> getSecurityProductsFromWMI()
+std::optional<SecurityProduct> handleProduct(IWbemClassObject* o)
{
- // some products may be present in multiple queries, such as a product marked
- // as both antivirus and antispyware, but they'll have the same GUID, so use
- // that to avoid duplicating entries
- std::map<QUuid, SecurityProduct> map;
+ VARIANT prop;
- auto handleProduct = [&](auto* o) {
- VARIANT prop;
- // display name
- auto ret = o->Get(L"displayName", 0, &prop, 0, 0);
- if (FAILED(ret)) {
- log::error("failed to get displayName, {}", formatSystemMessage(ret));
- return;
- }
+ // guid
+ auto ret = o->Get(L"instanceGuid", 0, &prop, 0, 0);
+ if (FAILED(ret)) {
+ log::error("failed to get instanceGuid, {}", formatSystemMessage(ret));
+ return {};
+ }
- if (prop.vt != VT_BSTR) {
- log::error("displayName is a {}, not a bstr", prop.vt);
- return;
- }
+ if (prop.vt != VT_BSTR) {
+ log::error("instanceGuid is a {}, not a bstr", prop.vt);
+ return {};
+ }
- const std::wstring name = prop.bstrVal;
- VariantClear(&prop);
+ const QUuid guid(QString::fromWCharArray(prop.bstrVal));
+ VariantClear(&prop);
- // product state
- ret = o->Get(L"productState", 0, &prop, 0, 0);
- if (FAILED(ret)) {
- log::error("failed to get productState, {}", formatSystemMessage(ret));
- return;
- }
- if (prop.vt != VT_UI4 && prop.vt != VT_I4) {
- log::error("productState is a {}, not a VT_UI4", prop.vt);
- return;
- }
+ // display name
+ QString displayName;
+ ret = o->Get(L"displayName", 0, &prop, 0, 0);
+
+ if (FAILED(ret)) {
+ log::error("failed to get displayName, {}", formatSystemMessage(ret));
+ } else if (prop.vt != VT_BSTR) {
+ log::error("displayName is a {}, not a bstr", prop.vt);
+ } else {
+ displayName = QString::fromWCharArray(prop.bstrVal);
+ }
+
+ VariantClear(&prop);
+
- DWORD state = 0;
+ // product state
+ DWORD state = 0;
+ ret = o->Get(L"productState", 0, &prop, 0, 0);
+
+ if (FAILED(ret)) {
+ log::error("failed to get productState, {}", formatSystemMessage(ret));
+ } else {
if (prop.vt == VT_I4) {
state = prop.lVal;
- } else {
+ } else if (prop.vt == VT_UI4) {
state = prop.ulVal;
+ } else if (prop.vt == VT_NULL) {
+ log::warn("productState is null");
+ } else {
+ log::error("productState is a {}, not a VT_I4 or a VT_UI4", prop.vt);
}
+ }
- VariantClear(&prop);
+ VariantClear(&prop);
- // guid
- ret = o->Get(L"instanceGuid", 0, &prop, 0, 0);
- if (FAILED(ret)) {
- log::error("failed to get instanceGuid, {}", formatSystemMessage(ret));
- return;
- }
- if (prop.vt != VT_BSTR) {
- log::error("instanceGuid is a {}, is not a bstr", prop.vt);
- return;
- }
+ const auto provider = static_cast<int>((state >> 16) & 0xff);
+ const auto scanner = (state >> 8) & 0xff;
+ const auto definitions = state & 0xff;
- const QUuid guid(QString::fromWCharArray(prop.bstrVal));
- VariantClear(&prop);
+ const bool active = ((scanner & 0x10) != 0);
+ const bool upToDate = (definitions == 0);
- const auto provider = static_cast<int>((state >> 16) & 0xff);
- const auto scanner = (state >> 8) & 0xff;
- const auto definitions = state & 0xff;
+ return SecurityProduct(guid, displayName, provider, active, upToDate);
+}
- const bool active = ((scanner & 0x10) != 0);
- const bool upToDate = (definitions == 0);
+std::vector<SecurityProduct> getSecurityProductsFromWMI()
+{
+ // some products may be present in multiple queries, such as a product marked
+ // as both antivirus and antispyware, but they'll have the same GUID, so use
+ // that to avoid duplicating entries
+ std::map<QUuid, SecurityProduct> map;
- map.insert({
- guid,
- {guid, QString::fromStdWString(name), provider, active, upToDate}});
+ auto f = [&](auto* o) {
+ if (auto p=handleProduct(o)) {
+ map.emplace(p->guid(), std::move(*p));
+ }
};
{
WMI wmi("root\\SecurityCenter2");
- wmi.query("select * from AntivirusProduct", handleProduct);
- wmi.query("select * from FirewallProduct", handleProduct);
- wmi.query("select * from AntiSpywareProduct", handleProduct);
+ wmi.query("select * from AntivirusProduct", f);
+ wmi.query("select * from FirewallProduct", f);
+ wmi.query("select * from AntiSpywareProduct", f);
}
{
WMI wmi("root\\SecurityCenter");
- wmi.query("select * from AntivirusProduct", handleProduct);
- wmi.query("select * from FirewallProduct", handleProduct);
- wmi.query("select * from AntiSpywareProduct", handleProduct);
+ wmi.query("select * from AntivirusProduct", f);
+ wmi.query("select * from FirewallProduct", f);
+ wmi.query("select * from AntiSpywareProduct", f);
}
std::vector<SecurityProduct> v;
diff --git a/src/envsecurity.h b/src/envsecurity.h
index 436103b7..5f9e5332 100644
--- a/src/envsecurity.h
+++ b/src/envsecurity.h
@@ -16,6 +16,10 @@ public:
QUuid guid, QString name, int provider,
bool active, bool upToDate);
+ // guid
+ //
+ const QUuid& guid() const;
+
// display name of the product
//
const QString& name() const;