std::vector available_versions()

in platforms/Windows/CustomActions/SwiftInstaller/Sources/swift_installer.cc [96:126]


std::vector<std::wstring> available_versions() noexcept {
  HKEY hKey;

  if (FAILED(RegOpenKeyExW(HKEY_LOCAL_MACHINE, kits_installed_roots_keypath,
                           0, KEY_READ, &hKey)))
    return {};

  windows::raii::hkey key{hKey};

  DWORD cSubKeys;
  DWORD cbMaxSubKeyLen;
  if (FAILED(RegQueryInfoKeyW(hKey, nullptr, nullptr, nullptr, &cSubKeys,
                              &cbMaxSubKeyLen, nullptr, nullptr, nullptr,
                              nullptr, nullptr, nullptr)))
    return {};

  std::vector<wchar_t> buffer;
  buffer.resize(static_cast<size_t>(cbMaxSubKeyLen) + 1);

  std::vector<std::wstring> versions;
  for (DWORD dwIndex = 0; dwIndex < cSubKeys; ++dwIndex) {
    DWORD cchName = cbMaxSubKeyLen + 1;

    // TODO(compnerd) handle error
    (void)RegEnumKeyExW(hKey, dwIndex, buffer.data(), &cchName, nullptr,
                        nullptr, nullptr, nullptr);

    versions.emplace_back(buffer.data());
  }
  return versions;
}