diff --git a/UsbDkHelper/RegAccess.cpp b/UsbDkHelper/RegAccess.cpp index fcb80e4..4f5445a 100644 --- a/UsbDkHelper/RegAccess.cpp +++ b/UsbDkHelper/RegAccess.cpp @@ -626,3 +626,15 @@ VOID UsbDkRegAccess::FormatFullRegPath(LPTSTR lpzFullPathBuff, DWORD_PTR dwNumbe } } } + +VOID UsbDkRegAccess::key_iterator::advance() +{ + assert(!m_End); + + if (!m_Root->ReadKeyName(m_CurrentKeyName, + TBUF_SIZEOF(m_CurrentKeyName), + m_NextIndex++)) + { + m_End = true; + } +} diff --git a/UsbDkHelper/RegAccess.h b/UsbDkHelper/RegAccess.h index 07af393..88e5ea7 100644 --- a/UsbDkHelper/RegAccess.h +++ b/UsbDkHelper/RegAccess.h @@ -44,6 +44,46 @@ public: UsbDkRegAccess(HKEY hNewPrKey, LPCTSTR lpzNewRegPath); virtual ~UsbDkRegAccess(); + class key_iterator + { + public: + key_iterator(const UsbDkRegAccess &Root) + : m_Root(&Root) + , m_End(false) + { + advance(); + } + + key_iterator() + {} + + const key_iterator& operator++() + { + advance(); + return *this; + } + + bool operator !=(const key_iterator& other) const + { return !m_End || !other.m_End; } + + LPCTSTR operator *() + { return m_CurrentKeyName; } + + private: + void advance(); + + const UsbDkRegAccess* m_Root = nullptr; + TCHAR m_CurrentKeyName[DEFAULT_REG_ENTRY_DATA_LEN] = {}; + int m_NextIndex = 0; + bool m_End = true; + }; + + key_iterator begin() const + { return key_iterator(*this); } + + key_iterator end() const + { return key_iterator(); } + VOID SetPrimaryKey(HKEY hNewPrKey); BOOL SetRegPath(LPCTSTR lpzNewRegPath); HKEY GetPrimaryKey(VOID); diff --git a/UsbDkHelper/stdafx.h b/UsbDkHelper/stdafx.h index 2800b74..b1c91f8 100644 --- a/UsbDkHelper/stdafx.h +++ b/UsbDkHelper/stdafx.h @@ -50,6 +50,9 @@ #include #include +//new behavior: elements of array 'array' will be default initialized +#pragma warning(disable : 4351) + #include "tstrings.h" #include "Exception.h" #include "Utils.h"