1 #define _WIN32_WINNT _WIN32_WINNT_VISTA
2 #define WIN32_LEAN_AND_MEAN
7 #include <knownfolders.h>
9 #include <sys/utsname.h>
11 #include <msp/core/systemerror.h>
12 #include <msp/stringcodec/utf16.h>
13 #include <msp/stringcodec/utf8.h>
14 #include <msp/strings/format.h>
15 #include <msp/strings/utils.h>
18 #if defined(_WIN32) && !defined(PROCESSOR_ARCHITECTURE_ARM64)
19 #define PROCESSOR_ARCHITECTURE_ARM64 12
25 string get_system_type()
29 GetSystemInfo(&sysinfo);
30 WORD machine = sysinfo.wProcessorArchitecture;
31 if(machine==PROCESSOR_ARCHITECTURE_AMD64 || machine==PROCESSOR_ARCHITECTURE_INTEL)
33 else if(machine==PROCESSOR_ARCHITECTURE_ARM || machine==PROCESSOR_ARCHITECTURE_ARM64)
38 return tolower(format("%s-%s", un.sysname, un.machine));
44 FS::Path get_program_files_x86_dir()
47 wchar_t *program_files_x86_ptr = 0;
48 HRESULT err = SHGetKnownFolderPath(FOLDERID_ProgramFilesX86, 0, NULL, &program_files_x86_ptr);
50 throw runtime_error("Can't get Program Files path");
52 unsigned len = wcslen(program_files_x86_ptr);
53 FS::Path program_files_x86 = StringCodec::transcode<StringCodec::Utf16Le, StringCodec::Utf8>(
54 string(reinterpret_cast<const char *>(program_files_x86_ptr), len*sizeof(wchar_t)));
56 CoTaskMemFree(program_files_x86_ptr);
58 return program_files_x86;
60 return "/mnt/c/Program Files (x86)";
65 string get_registry_value<string>(const string &path)
68 string::size_type first_sep = path.find('\\');
69 string::size_type last_sep = path.rfind('\\');
70 string root = path.substr(0, first_sep);
71 string key_path = path.substr(first_sep+1, last_sep-first_sep-1);
72 string value_name = path.substr(last_sep+1);
76 root_handle = HKEY_CLASSES_ROOT;
78 root_handle = HKEY_CURRENT_CONFIG;
80 root_handle = HKEY_CURRENT_USER;
82 root_handle = HKEY_LOCAL_MACHINE;
84 root_handle = HKEY_USERS;
86 throw invalid_argument("get_registry_value");
89 LSTATUS err = RegOpenKeyEx(root_handle, key_path.c_str(), 0, KEY_READ, &key);
90 if(err!=ERROR_SUCCESS)
91 throw Msp::system_error("RegOpenKey", err);
94 err = RegGetValue(key, 0, value_name.c_str(), RRF_RT_REG_SZ, 0, 0, &value_len);
95 if(err!=ERROR_SUCCESS)
96 throw Msp::system_error("RegGetValue", err);
98 char *buffer = new char[value_len];
99 err = RegGetValue(key, 0, value_name.c_str(), RRF_RT_REG_SZ, 0, buffer, &value_len);
100 if(err!=ERROR_SUCCESS)
103 throw Msp::system_error("RegGetValue", err);
106 string result(buffer);