diff options
Diffstat (limited to '3rdparty/lzma/CPP/Windows/Registry.cpp')
-rw-r--r-- | 3rdparty/lzma/CPP/Windows/Registry.cpp | 165 |
1 files changed, 93 insertions, 72 deletions
diff --git a/3rdparty/lzma/CPP/Windows/Registry.cpp b/3rdparty/lzma/CPP/Windows/Registry.cpp index 8b25375d946..c000e62897d 100644 --- a/3rdparty/lzma/CPP/Windows/Registry.cpp +++ b/3rdparty/lzma/CPP/Windows/Registry.cpp @@ -2,10 +2,12 @@ #include "StdAfx.h" +#include <wchar.h> + #ifndef _UNICODE -#include "Common/StringConvert.h" +#include "../Common/StringConvert.h" #endif -#include "Windows/Registry.h" +#include "Registry.h" #ifndef _UNICODE extern bool g_IsNT; @@ -18,7 +20,7 @@ namespace NRegistry { LONG CKey::Create(HKEY parentKey, LPCTSTR keyName, LPTSTR keyClass, DWORD options, REGSAM accessMask, - LPSECURITY_ATTRIBUTES securityAttributes, LPDWORD disposition) + LPSECURITY_ATTRIBUTES securityAttributes, LPDWORD disposition) throw() { MYASSERT(parentKey != NULL); DWORD dispositionReal; @@ -35,7 +37,7 @@ LONG CKey::Create(HKEY parentKey, LPCTSTR keyName, return res; } -LONG CKey::Open(HKEY parentKey, LPCTSTR keyName, REGSAM accessMask) +LONG CKey::Open(HKEY parentKey, LPCTSTR keyName, REGSAM accessMask) throw() { MYASSERT(parentKey != NULL); HKEY key = NULL; @@ -49,7 +51,7 @@ LONG CKey::Open(HKEY parentKey, LPCTSTR keyName, REGSAM accessMask) return res; } -LONG CKey::Close() +LONG CKey::Close() throw() { LONG res = ERROR_SUCCESS; if (_object != NULL) @@ -62,28 +64,28 @@ LONG CKey::Close() // win95, win98: deletes sunkey and all its subkeys // winNT to be deleted must not have subkeys -LONG CKey::DeleteSubKey(LPCTSTR subKeyName) +LONG CKey::DeleteSubKey(LPCTSTR subKeyName) throw() { MYASSERT(_object != NULL); return RegDeleteKey(_object, subKeyName); } -LONG CKey::RecurseDeleteKey(LPCTSTR subKeyName) +LONG CKey::RecurseDeleteKey(LPCTSTR subKeyName) throw() { CKey key; LONG res = key.Open(_object, subKeyName, KEY_READ | KEY_WRITE); if (res != ERROR_SUCCESS) return res; FILETIME fileTime; - const UInt32 kBufferSize = MAX_PATH + 1; // 256 in ATL - DWORD size = kBufferSize; - TCHAR buffer[kBufferSize]; + const UInt32 kBufSize = MAX_PATH + 1; // 256 in ATL + DWORD size = kBufSize; + TCHAR buffer[kBufSize]; while (RegEnumKeyEx(key._object, 0, buffer, &size, NULL, NULL, NULL, &fileTime) == ERROR_SUCCESS) { res = key.RecurseDeleteKey(buffer); if (res != ERROR_SUCCESS) return res; - size = kBufferSize; + size = kBufSize; } key.Close(); return DeleteSubKey(subKeyName); @@ -97,7 +99,7 @@ static inline UInt32 BoolToUINT32(bool value) { return (value ? 1: 0); } static inline bool UINT32ToBool(UInt32 value) { return (value != 0); } -LONG CKey::DeleteValue(LPCTSTR name) +LONG CKey::DeleteValue(LPCTSTR name) throw() { MYASSERT(_object != NULL); return ::RegDeleteValue(_object, name); @@ -113,23 +115,23 @@ LONG CKey::DeleteValue(LPCWSTR name) } #endif -LONG CKey::SetValue(LPCTSTR name, UInt32 value) +LONG CKey::SetValue(LPCTSTR name, UInt32 value) throw() { MYASSERT(_object != NULL); - return RegSetValueEx(_object, name, NULL, REG_DWORD, + return RegSetValueEx(_object, name, 0, REG_DWORD, (BYTE * const)&value, sizeof(UInt32)); } -LONG CKey::SetValue(LPCTSTR name, bool value) +LONG CKey::SetValue(LPCTSTR name, bool value) throw() { return SetValue(name, BoolToUINT32(value)); } -LONG CKey::SetValue(LPCTSTR name, LPCTSTR value) +LONG CKey::SetValue(LPCTSTR name, LPCTSTR value) throw() { MYASSERT(value != NULL); MYASSERT(_object != NULL); - return RegSetValueEx(_object, name, NULL, REG_SZ, + return RegSetValueEx(_object, name, 0, REG_SZ, (const BYTE * )value, (lstrlen(value) + 1) * sizeof(TCHAR)); } @@ -139,7 +141,7 @@ LONG CKey::SetValue(LPCTSTR name, const CSysString &value) MYASSERT(value != NULL); MYASSERT(_object != NULL); return RegSetValueEx(_object, name, NULL, REG_SZ, - (const BYTE *)(const TCHAR *)value, (value.Length() + 1) * sizeof(TCHAR)); + (const BYTE *)(const TCHAR *)value, (value.Len() + 1) * sizeof(TCHAR)); } */ @@ -159,11 +161,11 @@ LONG CKey::SetValue(LPCWSTR name, LPCWSTR value) #endif -LONG CKey::SetValue(LPCTSTR name, const void *value, UInt32 size) +LONG CKey::SetValue(LPCTSTR name, const void *value, UInt32 size) throw() { MYASSERT(value != NULL); MYASSERT(_object != NULL); - return RegSetValueEx(_object, name, NULL, REG_BINARY, + return RegSetValueEx(_object, name, 0, REG_BINARY, (const BYTE *)value, size); } @@ -177,7 +179,7 @@ LONG SetValue(HKEY parentKey, LPCTSTR keyName, LPCTSTR valueName, LPCTSTR value) return res; } -LONG CKey::SetKeyValue(LPCTSTR keyName, LPCTSTR valueName, LPCTSTR value) +LONG CKey::SetKeyValue(LPCTSTR keyName, LPCTSTR valueName, LPCTSTR value) throw() { MYASSERT(value != NULL); CKey key; @@ -187,18 +189,18 @@ LONG CKey::SetKeyValue(LPCTSTR keyName, LPCTSTR valueName, LPCTSTR value) return res; } -LONG CKey::QueryValue(LPCTSTR name, UInt32 &value) +LONG CKey::QueryValue(LPCTSTR name, UInt32 &value) throw() { - DWORD type = NULL; + DWORD type = 0; DWORD count = sizeof(DWORD); LONG res = RegQueryValueEx(_object, (LPTSTR)name, NULL, &type, (LPBYTE)&value, &count); - MYASSERT((res!=ERROR_SUCCESS) || (type == REG_DWORD)); - MYASSERT((res!=ERROR_SUCCESS) || (count == sizeof(UInt32))); + MYASSERT((res != ERROR_SUCCESS) || (type == REG_DWORD)); + MYASSERT((res != ERROR_SUCCESS) || (count == sizeof(UInt32))); return res; } -LONG CKey::QueryValue(LPCTSTR name, bool &value) +LONG CKey::QueryValue(LPCTSTR name, bool &value) throw() { UInt32 uintValue = BoolToUINT32(value); LONG res = QueryValue(name, uintValue); @@ -206,7 +208,7 @@ LONG CKey::QueryValue(LPCTSTR name, bool &value) return res; } -LONG CKey::GetValue_IfOk(LPCTSTR name, UInt32 &value) +LONG CKey::GetValue_IfOk(LPCTSTR name, UInt32 &value) throw() { UInt32 newVal; LONG res = QueryValue(name, newVal); @@ -215,7 +217,7 @@ LONG CKey::GetValue_IfOk(LPCTSTR name, UInt32 &value) return res; } -LONG CKey::GetValue_IfOk(LPCTSTR name, bool &value) +LONG CKey::GetValue_IfOk(LPCTSTR name, bool &value) throw() { bool newVal; LONG res = QueryValue(name, newVal); @@ -224,51 +226,59 @@ LONG CKey::GetValue_IfOk(LPCTSTR name, bool &value) return res; } -LONG CKey::QueryValue(LPCTSTR name, LPTSTR value, UInt32 &count) +LONG CKey::QueryValue(LPCTSTR name, LPTSTR value, UInt32 &count) throw() { - MYASSERT(count != NULL); - DWORD type = NULL; + DWORD type = 0; LONG res = RegQueryValueEx(_object, (LPTSTR)name, NULL, &type, (LPBYTE)value, (DWORD *)&count); - MYASSERT((res!=ERROR_SUCCESS) || (type == REG_SZ) || (type == REG_MULTI_SZ) || (type == REG_EXPAND_SZ)); + MYASSERT((res != ERROR_SUCCESS) || (type == REG_SZ) || (type == REG_MULTI_SZ) || (type == REG_EXPAND_SZ)); return res; } LONG CKey::QueryValue(LPCTSTR name, CSysString &value) { value.Empty(); - DWORD type = NULL; - UInt32 currentSize = 0; - LONG res = RegQueryValueEx(_object, (LPTSTR)name, NULL, &type, NULL, (DWORD *)¤tSize); + DWORD type = 0; + UInt32 curSize = 0; + LONG res = RegQueryValueEx(_object, (LPTSTR)name, NULL, &type, NULL, (DWORD *)&curSize); if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA) return res; - res = QueryValue(name, value.GetBuffer(currentSize), currentSize); - value.ReleaseBuffer(); + UInt32 curSize2 = curSize; + res = QueryValue(name, value.GetBuf(curSize), curSize2); + if (curSize > curSize2) + curSize = curSize2; + value.ReleaseBuf_CalcLen(curSize / sizeof(TCHAR)); return res; } + #ifndef _UNICODE + LONG CKey::QueryValue(LPCWSTR name, LPWSTR value, UInt32 &count) { - MYASSERT(count != NULL); - DWORD type = NULL; + DWORD type = 0; LONG res = RegQueryValueExW(_object, name, NULL, &type, (LPBYTE)value, (DWORD *)&count); - MYASSERT((res!=ERROR_SUCCESS) || (type == REG_SZ) || (type == REG_MULTI_SZ) || (type == REG_EXPAND_SZ)); + MYASSERT((res != ERROR_SUCCESS) || (type == REG_SZ) || (type == REG_MULTI_SZ) || (type == REG_EXPAND_SZ)); return res; } + LONG CKey::QueryValue(LPCWSTR name, UString &value) { value.Empty(); - DWORD type = NULL; - UInt32 currentSize = 0; + DWORD type = 0; + UInt32 curSize = 0; LONG res; + if (g_IsNT) { - res = RegQueryValueExW(_object, name, NULL, &type, NULL, (DWORD *)¤tSize); + res = RegQueryValueExW(_object, name, NULL, &type, NULL, (DWORD *)&curSize); if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA) return res; - res = QueryValue(name, value.GetBuffer(currentSize), currentSize); - value.ReleaseBuffer(); + UInt32 curSize2 = curSize; + res = QueryValue(name, value.GetBuf(curSize), curSize2); + if (curSize > curSize2) + curSize = curSize2; + value.ReleaseBuf_CalcLen(curSize / sizeof(wchar_t)); } else { @@ -276,27 +286,30 @@ LONG CKey::QueryValue(LPCWSTR name, UString &value) res = QueryValue(name == 0 ? 0 : (LPCSTR)GetSystemString(name), vTemp); value = GetUnicodeString(vTemp); } + return res; } + #endif -LONG CKey::QueryValue(LPCTSTR name, void *value, UInt32 &count) + +LONG CKey::QueryValue(LPCTSTR name, void *value, UInt32 &count) throw() { - DWORD type = NULL; + DWORD type = 0; LONG res = RegQueryValueEx(_object, (LPTSTR)name, NULL, &type, (LPBYTE)value, (DWORD *)&count); - MYASSERT((res!=ERROR_SUCCESS) || (type == REG_BINARY)); + MYASSERT((res != ERROR_SUCCESS) || (type == REG_BINARY)); return res; } LONG CKey::QueryValue(LPCTSTR name, CByteBuffer &value, UInt32 &dataSize) { - DWORD type = NULL; + DWORD type = 0; dataSize = 0; LONG res = RegQueryValueEx(_object, (LPTSTR)name, NULL, &type, NULL, (DWORD *)&dataSize); if (res != ERROR_SUCCESS && res != ERROR_MORE_DATA) return res; - value.SetCapacity(dataSize); + value.Alloc(dataSize); return QueryValue(name, (BYTE *)value, dataSize); } @@ -304,14 +317,14 @@ LONG CKey::EnumKeys(CSysStringVector &keyNames) { keyNames.Clear(); CSysString keyName; - for (UInt32 index = 0; ; index++) + for (DWORD index = 0; ; index++) { - const UInt32 kBufferSize = MAX_PATH + 1; // 256 in ATL + const unsigned kBufSize = MAX_PATH + 1; // 256 in ATL FILETIME lastWriteTime; - UInt32 nameSize = kBufferSize; - LONG result = ::RegEnumKeyEx(_object, index, keyName.GetBuffer(kBufferSize), + UInt32 nameSize = kBufSize; + LONG result = ::RegEnumKeyEx(_object, index, keyName.GetBuf(kBufSize), (DWORD *)&nameSize, NULL, NULL, NULL, &lastWriteTime); - keyName.ReleaseBuffer(); + keyName.ReleaseBuf_CalcLen(kBufSize); if (result == ERROR_NO_MORE_ITEMS) break; if (result != ERROR_SUCCESS) @@ -323,46 +336,54 @@ LONG CKey::EnumKeys(CSysStringVector &keyNames) LONG CKey::SetValue_Strings(LPCTSTR valueName, const UStringVector &strings) { - UInt32 numChars = 0; - int i; + size_t numChars = 0; + + unsigned i; + for (i = 0; i < strings.Size(); i++) - numChars += strings[i].Length() + 1; - CBuffer<wchar_t> buffer; - buffer.SetCapacity(numChars); - int pos = 0; + numChars += strings[i].Len() + 1; + + CObjArray<wchar_t> buffer(numChars); + size_t pos = 0; + for (i = 0; i < strings.Size(); i++) { const UString &s = strings[i]; - MyStringCopy((wchar_t *)buffer + pos, (const wchar_t *)s); - pos += s.Length() + 1; + size_t size = s.Len() + 1; + wmemcpy(buffer + pos, s, size); + pos += size; } - return SetValue(valueName, buffer, numChars * sizeof(wchar_t)); + return SetValue(valueName, buffer, (UInt32)numChars * sizeof(wchar_t)); } LONG CKey::GetValue_Strings(LPCTSTR valueName, UStringVector &strings) { strings.Clear(); CByteBuffer buffer; - UInt32 dataSize; + UInt32 dataSize = 0; LONG res = QueryValue(valueName, buffer, dataSize); if (res != ERROR_SUCCESS) return res; + if (dataSize > buffer.Size()) + return E_FAIL; if (dataSize % sizeof(wchar_t) != 0) return E_FAIL; + const wchar_t *data = (const wchar_t *)(const Byte *)buffer; - int numChars = dataSize / sizeof(wchar_t); + size_t numChars = dataSize / sizeof(wchar_t); + size_t prev = 0; UString s; - for (int i = 0; i < numChars; i++) + + for (size_t i = 0; i < numChars; i++) { - wchar_t c = data[i]; - if (c == 0) + if (data[i] == 0) { + s = data + prev; strings.Add(s); - s.Empty(); + prev = i + 1; } - else - s += c; } + return res; } |