diff options
| author | Odd Stranne <odd@mullvad.net> | 2021-03-17 18:06:16 +0100 |
|---|---|---|
| committer | Odd Stranne <odd@mullvad.net> | 2021-07-02 16:31:31 +0200 |
| commit | 15be4405fcbe845f806d0e2a50c4e948e049d0d5 (patch) | |
| tree | 869d26d02bad41af6c6bff61d0831ce3705edabc /windows/driverlogic/src/devenum.cpp | |
| parent | 79f52b5adc0d965e1688bb1253a6c782bf74f03f (diff) | |
| download | mullvadvpn-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.cpp | 75 |
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; +} |
