aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/vcpkg_System.cpp
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2017-03-10 15:43:54 -0800
committerRobert Schumacher <roschuma@microsoft.com>2017-03-10 16:12:04 -0800
commit4d0abd5841b9639c20126a5a25e2b0d4a9eb98d2 (patch)
tree9eb9f240cbdaf5e80150c1938f66b8fdd74549b1 /toolsrc/src/vcpkg_System.cpp
parentbfa5812a6bd9dd108317491111bbdb68d4d2c9a8 (diff)
downloadvcpkg-4d0abd5841b9639c20126a5a25e2b0d4a9eb98d2.tar.gz
vcpkg-4d0abd5841b9639c20126a5a25e2b0d4a9eb98d2.zip
[vcpkg] Refactor RAII registry key manipulation
Diffstat (limited to 'toolsrc/src/vcpkg_System.cpp')
-rw-r--r--toolsrc/src/vcpkg_System.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/toolsrc/src/vcpkg_System.cpp b/toolsrc/src/vcpkg_System.cpp
index 9609d819b..1730ff3ad 100644
--- a/toolsrc/src/vcpkg_System.cpp
+++ b/toolsrc/src/vcpkg_System.cpp
@@ -107,4 +107,32 @@ namespace vcpkg::System
{
_wputenv_s(varname, varvalue);
}
+
+ static bool is_string_keytype(DWORD hkey_type)
+ {
+ return hkey_type == REG_SZ || hkey_type == REG_MULTI_SZ || hkey_type == REG_EXPAND_SZ;
+ }
+
+ optional<std::wstring> get_registry_string(HKEY base, const wchar_t* subKey, const wchar_t* valuename)
+ {
+ HKEY k = nullptr;
+ LSTATUS ec = RegOpenKeyExW(base, subKey, NULL, KEY_READ, &k);
+ if (ec != ERROR_SUCCESS)
+ return nullptr;
+
+ DWORD dwBufferSize = 0;
+ DWORD dwType = 0;
+ auto rc = RegQueryValueExW(k, valuename, nullptr, &dwType, nullptr, &dwBufferSize);
+ if (rc != ERROR_SUCCESS || !is_string_keytype(dwType) || dwBufferSize == 0 || dwBufferSize % sizeof(wchar_t) != 0)
+ return nullptr;
+ std::wstring ret;
+ ret.resize(dwBufferSize / sizeof(wchar_t));
+
+ rc = RegQueryValueExW(k, valuename, nullptr, &dwType, reinterpret_cast<LPBYTE>(ret.data()), &dwBufferSize);
+ if (rc != ERROR_SUCCESS || !is_string_keytype(dwType) || dwBufferSize != sizeof(wchar_t) * ret.size())
+ return nullptr;
+
+ ret.pop_back(); // remove extra trailing null byte
+ return std::make_unique<std::wstring>(std::move(ret));
+ }
}