summaryrefslogtreecommitdiffstats
path: root/src/common/win32/registry.cc
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/common/win32/registry.cc165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/common/win32/registry.cc b/src/common/win32/registry.cc
new file mode 100644
index 000000000..85ab80df9
--- /dev/null
+++ b/src/common/win32/registry.cc
@@ -0,0 +1,165 @@
+/*
+ * Ceph - scalable distributed file system
+ *
+ * Copyright (C) 2020 SUSE LINUX GmbH
+ *
+ * This is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1, as published by the Free Software
+ * Foundation. See file COPYING.
+ *
+ */
+
+#define dout_context cct
+#define dout_subsys ceph_subsys_
+
+#include "common/debug.h"
+#include "common/errno.h"
+#include "common/win32/registry.h"
+
+RegistryKey::RegistryKey(CephContext *cct_, HKEY hRootKey, LPCTSTR strKey,
+ bool create_value): cct(cct_)
+{
+ DWORD status = RegOpenKeyEx(hRootKey, strKey, 0, KEY_ALL_ACCESS, &hKey);
+
+ if (status == ERROR_FILE_NOT_FOUND && create_value)
+ {
+ ldout(cct_, 10) << "Creating registry key: " << strKey << dendl;
+ status = RegCreateKeyEx(
+ hRootKey, strKey, 0, NULL, REG_OPTION_NON_VOLATILE,
+ KEY_ALL_ACCESS, NULL, &hKey, NULL);
+ }
+
+ if (ERROR_SUCCESS != status) {
+ if (ERROR_FILE_NOT_FOUND == status) {
+ missingKey = true;
+ } else {
+ lderr(cct_) << "Error: " << win32_strerror(status)
+ << ". Could not open registry key: "
+ << strKey << dendl;
+ }
+ }
+}
+
+RegistryKey::~RegistryKey() {
+ if (!hKey)
+ return;
+
+ DWORD status = RegCloseKey(hKey);
+ if (ERROR_SUCCESS != status) {
+ derr << "Error: " << win32_strerror(status)
+ << ". Could not close registry key." << dendl;
+ } else {
+ hKey = NULL;
+ }
+}
+
+int RegistryKey::remove(CephContext *cct_, HKEY hRootKey, LPCTSTR strKey)
+{
+ DWORD status = RegDeleteKeyEx(hRootKey, strKey, KEY_WOW64_64KEY, 0);
+
+ if (status == ERROR_FILE_NOT_FOUND)
+ {
+ ldout(cct_, 20) << "Registry key : " << strKey
+ << " does not exist." << dendl;
+ return 0;
+ }
+
+ if (ERROR_SUCCESS != status) {
+ lderr(cct_) << "Error: " << win32_strerror(status)
+ << ". Could not delete registry key: "
+ << strKey << dendl;
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+int RegistryKey::flush() {
+ DWORD status = RegFlushKey(hKey);
+ if (ERROR_SUCCESS != status) {
+ derr << "Error: " << win32_strerror(status)
+ << ". Could not flush registry key." << dendl;
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+int RegistryKey::set(LPCTSTR lpValue, DWORD data)
+{
+ DWORD status = RegSetValueEx(hKey, lpValue, 0, REG_DWORD,
+ (LPBYTE)&data, sizeof(DWORD));
+ if (ERROR_SUCCESS != status) {
+ derr << "Error: " << win32_strerror(status)
+ << ". Could not set registry value: " << (char*)lpValue << dendl;
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+int RegistryKey::set(LPCTSTR lpValue, std::string data)
+{
+ DWORD status = RegSetValueEx(hKey, lpValue, 0, REG_SZ,
+ (LPBYTE)data.c_str(), data.length());
+ if (ERROR_SUCCESS != status) {
+ derr << "Error: " << win32_strerror(status)
+ << ". Could not set registry value: "
+ << (char*)lpValue << dendl;
+ return -EINVAL;
+ }
+ return 0;
+}
+
+int RegistryKey::get(LPCTSTR lpValue, bool& value)
+{
+ DWORD value_dw = 0;
+ int r = get(lpValue, value_dw);
+ if (!r) {
+ value = !!value_dw;
+ }
+ return r;
+}
+
+int RegistryKey::get(LPCTSTR lpValue, DWORD& value)
+{
+ DWORD data;
+ DWORD size = sizeof(data);
+ DWORD type = REG_DWORD;
+ DWORD status = RegQueryValueEx(hKey, lpValue, NULL,
+ &type, (LPBYTE)&data, &size);
+ if (ERROR_SUCCESS != status) {
+ derr << "Error: " << win32_strerror(status)
+ << ". Could not get registry value: "
+ << (char*)lpValue << dendl;
+ return -EINVAL;
+ }
+ value = data;
+
+ return 0;
+}
+
+int RegistryKey::get(LPCTSTR lpValue, std::string& value)
+{
+ std::string data{""};
+ DWORD size = 0;
+ DWORD type = REG_SZ;
+ DWORD status = RegQueryValueEx(hKey, lpValue, NULL, &type,
+ (LPBYTE)data.c_str(), &size);
+ if (ERROR_MORE_DATA == status) {
+ data.resize(size);
+ status = RegQueryValueEx(hKey, lpValue, NULL, &type,
+ (LPBYTE)data.c_str(), &size);
+ }
+
+ if (ERROR_SUCCESS != status) {
+ derr << "Error: " << win32_strerror(status)
+ << ". Could not get registry value: "
+ << (char*)lpValue << dendl;
+ return -EINVAL;
+ }
+ value.assign(data.c_str());
+
+ return 0;
+}