summaryrefslogtreecommitdiffhomepage
path: root/windows/driverlogic/src/devenum.cpp
diff options
context:
space:
mode:
authorOdd Stranne <odd@mullvad.net>2021-03-17 18:06:16 +0100
committerOdd Stranne <odd@mullvad.net>2021-07-02 16:31:31 +0200
commit15be4405fcbe845f806d0e2a50c4e948e049d0d5 (patch)
tree869d26d02bad41af6c6bff61d0831ce3705edabc /windows/driverlogic/src/devenum.cpp
parent79f52b5adc0d965e1688bb1253a6c782bf74f03f (diff)
downloadmullvadvpn-15be4405fcbe845f806d0e2a50c4e948e049d0d5.tar.xz
mullvadvpn-15be4405fcbe845f806d0e2a50c4e948e049d0d5.zip
Restructure and extend driverlogic
Diffstat (limited to 'windows/driverlogic/src/devenum.cpp')
-rw-r--r--windows/driverlogic/src/devenum.cpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/windows/driverlogic/src/devenum.cpp b/windows/driverlogic/src/devenum.cpp
new file mode 100644
index 0000000000..229d7ee493
--- /dev/null
+++ b/windows/driverlogic/src/devenum.cpp
@@ -0,0 +1,75 @@
+#include "stdafx.h"
+#include "devenum.h"
+#include "error.h"
+
+DeviceEnumerator::DeviceEnumerator(const GUID &deviceClass)
+{
+ m_deviceInfoSet = SetupDiGetClassDevsW
+ (
+ &deviceClass,
+ nullptr,
+ nullptr,
+ DIGCF_PRESENT
+ );
+
+ if (INVALID_HANDLE_VALUE == m_deviceInfoSet)
+ {
+ THROW_SETUPAPI_ERROR(GetLastError(), "SetupDiGetClassDevsW");
+ }
+
+ m_nextDeviceIndex = 0;
+ m_exhausted = false;
+}
+
+//static
+std::unique_ptr<DeviceEnumerator> DeviceEnumerator::Create(const GUID& deviceClass, Filter filter)
+{
+ auto enumerator = std::make_unique<DeviceEnumerator>(deviceClass);
+
+ enumerator->setFilter(filter);
+
+ return enumerator;
+}
+
+DeviceEnumerator::~DeviceEnumerator()
+{
+ SetupDiDestroyDeviceInfoList(m_deviceInfoSet);
+}
+
+bool DeviceEnumerator::next(EnumeratedDevice &device)
+{
+ if (m_exhausted)
+ {
+ return false;
+ }
+
+ SP_DEVINFO_DATA deviceInfo { 0 };
+ deviceInfo.cbSize = sizeof(deviceInfo);
+
+ for (;;)
+ {
+ if (FALSE == SetupDiEnumDeviceInfo(m_deviceInfoSet, m_nextDeviceIndex, &deviceInfo))
+ {
+ if (GetLastError() != ERROR_NO_MORE_ITEMS)
+ {
+ THROW_SETUPAPI_ERROR(GetLastError(), "SetupDiEnumDeviceInfo");
+ }
+
+ m_exhausted = true;
+
+ return false;
+ }
+
+ ++m_nextDeviceIndex;
+
+ if (!m_filter || m_filter(m_deviceInfoSet, deviceInfo))
+ {
+ break;
+ }
+ }
+
+ device.deviceInfoSet = m_deviceInfoSet;
+ device.deviceInfo = deviceInfo;
+
+ return true;
+}