diff --git a/rejistry++/src/RegistryHive.h b/rejistry++/src/RegistryHive.h index c5abb29cf189c597bdac852291f754e0149bb14c..786c65637df69ded9873e9a277e835a33bd77345 100644 --- a/rejistry++/src/RegistryHive.h +++ b/rejistry++/src/RegistryHive.h @@ -48,6 +48,10 @@ namespace Rejistry { */ virtual REGFHeader * getHeader() const = 0; + /** + * Virtual destructor to prevent memory leak + */ + virtual ~RegistryHive() {} }; }; diff --git a/rejistry++/src/RegistryHiveBuffer.cpp b/rejistry++/src/RegistryHiveBuffer.cpp index d7233c7b7897275615763c8c76e506606ad8440b..adb940c3ef8e89bc1529d7142347f3b2d36ccb59 100644 --- a/rejistry++/src/RegistryHiveBuffer.cpp +++ b/rejistry++/src/RegistryHiveBuffer.cpp @@ -47,7 +47,10 @@ namespace Rejistry { } RegistryKey * RegistryHiveBuffer::getRoot() const { - return new RegistryKey(getHeader()->getRootNKRecord()); + REGFHeader *header = getHeader(); + Rejistry::NKRecord *nkRecord = header->getRootNKRecord(); + delete header; + return new RegistryKey(nkRecord); } REGFHeader * RegistryHiveBuffer::getHeader() const { diff --git a/rejistry++/src/RegistryKey.cpp b/rejistry++/src/RegistryKey.cpp index dd6b5ae068595b583fdd3365effd830daaa845e8..f342962ee4300bbbf9bb047bf210d0672667519e 100644 --- a/rejistry++/src/RegistryKey.cpp +++ b/rejistry++/src/RegistryKey.cpp @@ -74,19 +74,34 @@ namespace Rejistry { */ RegistryKey::RegistryKeyPtrList RegistryKey::getSubkeyList() const { std::vector<RegistryKey *> subkeys; - NKRecord::NKRecordPtrList nkRecordList = _nk->getSubkeyList()->getSubkeys(); + SubkeyListRecord::SubkeyListRecordPtr subkeyListRecordPtr = _nk->getSubkeyList(); + NKRecord::NKRecordPtrList nkRecordList = subkeyListRecordPtr->getSubkeys(); NKRecord::NKRecordPtrList::iterator it; for (it = nkRecordList.begin(); it != nkRecordList.end(); ++it) { subkeys.push_back(new RegistryKey(*it)); } + delete subkeyListRecordPtr; return subkeys; } + + size_t RegistryKey::getSubkeyListSize() const { + std::vector<RegistryKey *> subkeys; + SubkeyListRecord::SubkeyListRecordPtr subkeyListRecordPtr = _nk->getSubkeyList(); + NKRecord::NKRecordPtrList nkRecordList = subkeyListRecordPtr->getSubkeys(); + delete subkeyListRecordPtr; + return nkRecordList.size(); + } + + /** * Caller is responsible for freeing returned key */ RegistryKey::RegistryKeyPtr RegistryKey::getSubkey(const std::wstring& name) const { - return new RegistryKey(_nk->getSubkeyList()->getSubkey(name)); + SubkeyListRecord::SubkeyListRecordPtr subkeyListRecordPtr = _nk->getSubkeyList(); + Rejistry::NKRecord *nkRecord = subkeyListRecordPtr->getSubkey(name); + delete subkeyListRecordPtr; + return new RegistryKey(nkRecord); } /** @@ -102,10 +117,21 @@ namespace Rejistry { return values; } + + size_t RegistryKey::getValueListSize() const { + Rejistry::ValueListRecord *valueListRecord = _nk->getValueList(); + size_t size = valueListRecord->getValuesSize(); + delete valueListRecord; + return size; + } + /** * Caller is responsible for freeing returned value */ RegistryValue::RegistryValuePtr RegistryKey::getValue(const std::wstring& name) const { - return new RegistryValue(_nk->getValueList()->getValue(name)); + Rejistry::ValueListRecord *valueListRecord = _nk->getValueList(); + Rejistry::VKRecord *vkRecord = valueListRecord->getValue(name); + delete valueListRecord; + return new RegistryValue(vkRecord); } }; diff --git a/rejistry++/src/RegistryKey.h b/rejistry++/src/RegistryKey.h index 9d7f0dd8060e10a4cf8ac540210116659c481d9c..d14ef59f481787d215996da8910233a9bc5eddf4 100644 --- a/rejistry++/src/RegistryKey.h +++ b/rejistry++/src/RegistryKey.h @@ -73,6 +73,13 @@ namespace Rejistry { */ RegistryKeyPtrList getSubkeyList() const; + /** + * Get number of subkeys for the current registry key. + * @returns number of subkeys. + * @throws RegistryParseException on error. + */ + size_t getSubkeyListSize() const; + /** * Get the subkey with the given name. * @param name ASCII name of the subkey of retrieve. @@ -88,6 +95,13 @@ namespace Rejistry { */ RegistryValue::RegistryValuePtrList getValueList() const; + /** + * Get number of values for the current key. + * @returns Number of values. + * @throws RegistryParseException on error. + */ + size_t getValueListSize() const; + /** * Get the value for the given name. * @param name ASCII name of the value to retrieve. diff --git a/rejistry++/src/ValueData.h b/rejistry++/src/ValueData.h index 619918b2a52038c50848f4c07e58b75bf171d2c4..f29f7fd6b418f86a02f119cf335c85b8decdaefc 100644 --- a/rejistry++/src/ValueData.h +++ b/rejistry++/src/ValueData.h @@ -68,6 +68,11 @@ namespace Rejistry { _type = type; } + ~ValueData() { + if (_buf) + delete _buf; + } + VALUE_TYPES getValueType() const { return _type; }; /** diff --git a/rejistry++/src/ValueListRecord.h b/rejistry++/src/ValueListRecord.h index 44d8b1a9cb4aaa7952414a265d4c459134249209..25f144733cb696abacc0287a621679b697c1e872 100644 --- a/rejistry++/src/ValueListRecord.h +++ b/rejistry++/src/ValueListRecord.h @@ -61,6 +61,11 @@ namespace Rejistry { */ VKRecord::VKRecordPtr getValue(const std::wstring& name) const; + /** + * @returns The ValueListRecord size + */ + size_t getValuesSize() const { return _numValues; } + private: static const uint16_t VALUE_LIST_OFFSET = 0x00;