From 038152dc94f3dda92c8a3be601f964f4da41a7f8 Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Thu, 8 Sep 2022 15:31:46 +0200 Subject: [PATCH] libsl/uri: add win32 sl_uri_register_scheme (untested) --- libsl/src/uri/scheme.c | 56 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 libsl/src/uri/scheme.c diff --git a/libsl/src/uri/scheme.c b/libsl/src/uri/scheme.c new file mode 100644 index 0000000..1bcfd3e --- /dev/null +++ b/libsl/src/uri/scheme.c @@ -0,0 +1,56 @@ +#ifdef WIN32 + +#include + +int sl_uri_register_scheme(const char *scheme, const char *cmd_path) +{ + LONG ret; + HKEY hkey = NULL; + HKEY hkey_cmd = NULL; + char subkey[128]; + + re_snprintf(subkey, sizeof(subkey), "Software\\Classes\\%s", scheme); + + ret = RegCreateKeyExA(HKEY_CURRENT_USER, class, 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkey, + NULL);); + if (ret != ERROR_SUCCESS) { + warning("sl_uri_register_scheme/URI err: %d", ret); + return EPERM; + } + + re_snprintf(subkey, sizeof(subkey), "URL:%s Protocol", scheme); + + ret = RegSetKeyValueA(hkey, NULL, NULL, REG_SZ, subkey, + strlen(subkey) + 1); + if (ret != ERROR_SUCCESS) { + warning("sl_uri_register_scheme/base proto err: %d", ret); + return EPERM; + } + + ret = RegSetKeyValueA(hkey, NULL, "URL Protocol", REG_SZ, "", 1); + if (ret != ERROR_SUCCESS) { + warning("sl_uri_register_scheme/proto val err: %d", ret); + return EPERM; + } + + ret = RegCreateKeyExA(hkey, "Shell\\Open\\Command", 0, NULL, + REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, + &hkey_cmd, NULL); + if (ret != ERROR_SUCCESS) { + warning("sl_uri_register_scheme/command key err: %d", ret); + return EPERM; + } + + ret = RegSetKeyValueA(hkey_cmd, NULL, NULL, REG_SZ, cmd_path, + strlen(cmd_path) + 1); + if (ret != ERROR_SUCCESS) { + warning("sl_uri_register_scheme/command val err: %d", ret); + return EPERM; + } + + return 0; +} + + +#endif