aboutsummaryrefslogtreecommitdiff
path: root/src/windows/identity/kmm/kmm_reg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/windows/identity/kmm/kmm_reg.c')
-rw-r--r--src/windows/identity/kmm/kmm_reg.c291
1 files changed, 291 insertions, 0 deletions
diff --git a/src/windows/identity/kmm/kmm_reg.c b/src/windows/identity/kmm/kmm_reg.c
new file mode 100644
index 0000000..ea13fc1
--- /dev/null
+++ b/src/windows/identity/kmm/kmm_reg.c
@@ -0,0 +1,291 @@
+/*
+ * Copyright (c) 2004 Massachusetts Institute of Technology
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+/* $Id$ */
+
+#include<kmminternal.h>
+
+KHMEXP khm_int32 KHMAPI
+kmm_get_module_info(wchar_t * module_name, khm_int32 flags,
+ kmm_module_info * buffer, khm_size * cb_buffer)
+{
+ /*TODO:Implement this */
+ return KHM_ERROR_NOT_IMPLEMENTED;
+}
+
+KHMEXP khm_int32 KHMAPI
+kmm_get_plugin_info(wchar_t * plugin_name,
+ kmm_plugin_info * buffer, khm_size * cb_buffer)
+{
+ /*TODO:Implement this */
+ return KHM_ERROR_NOT_IMPLEMENTED;
+}
+
+KHMEXP khm_int32 KHMAPI
+kmm_get_plugins_config(khm_int32 flags, khm_handle * result) {
+ khm_handle csp_root;
+ khm_handle csp_plugins;
+ khm_int32 rv;
+
+ rv = khc_open_space(KHM_INVALID_HANDLE, KMM_CSNAME_ROOT, flags, &csp_root);
+
+ if(KHM_FAILED(rv))
+ return rv;
+
+ rv = khc_open_space(csp_root, KMM_CSNAME_PLUGINS, flags, &csp_plugins);
+ khc_close_space(csp_root);
+
+ if(KHM_SUCCEEDED(rv))
+ *result = csp_plugins;
+ else
+ *result = NULL;
+
+ return rv;
+}
+
+
+KHMEXP khm_int32 KHMAPI
+kmm_get_modules_config(khm_int32 flags, khm_handle * result) {
+ khm_handle croot;
+ khm_handle kmm_all_modules;
+ khm_int32 rv;
+
+ rv = khc_open_space(NULL, KMM_CSNAME_ROOT, flags, &croot);
+
+ if(KHM_FAILED(rv))
+ return rv;
+
+ rv = khc_open_space(croot, KMM_CSNAME_MODULES, flags, &kmm_all_modules);
+ khc_close_space(croot);
+
+ if(KHM_SUCCEEDED(rv))
+ *result = kmm_all_modules;
+ else
+ *result = NULL;
+
+ return rv;
+}
+
+
+KHMEXP khm_int32 KHMAPI
+kmm_get_plugin_config(wchar_t * plugin, khm_int32 flags, khm_handle * result)
+{
+ khm_handle csplugins;
+ khm_handle csplugin;
+ khm_int32 rv;
+
+ if(!plugin || wcschr(plugin, L'/') || wcschr(plugin, L'\\'))
+ return KHM_ERROR_INVALID_PARM;
+
+ if(KHM_FAILED(kmm_get_plugins_config(flags, &csplugins)))
+ return KHM_ERROR_UNKNOWN;
+
+ rv = khc_open_space(csplugins, plugin, flags, &csplugin);
+ *result = csplugin;
+
+ khc_close_space(csplugins);
+
+ return rv;
+}
+
+
+KHMEXP khm_int32 KHMAPI
+kmm_get_module_config(wchar_t * module, khm_int32 flags, khm_handle * result)
+{
+ khm_handle csmodules;
+ khm_handle csmodule;
+ khm_int32 rv;
+
+ if(!module || wcschr(module, L'/') || wcschr(module, L'\\'))
+ return KHM_ERROR_INVALID_PARM;
+
+ if(KHM_FAILED(kmm_get_modules_config(flags, &csmodules)))
+ return KHM_ERROR_UNKNOWN;
+
+ rv = khc_open_space(csmodules, module, flags, &csmodule);
+ *result = csmodule;
+
+ khc_close_space(csmodules);
+
+ return rv;
+}
+
+KHMEXP khm_int32 KHMAPI
+kmm_register_plugin(kmm_plugin_reg * plugin, khm_int32 config_flags)
+{
+ khm_int32 rv = KHM_ERROR_SUCCESS;
+ khm_handle csp_plugin = NULL;
+ khm_handle csp_module = NULL;
+ size_t cch;
+
+ /* avoid accidently creating the module key if it doesn't exist */
+ config_flags &= ~KHM_FLAG_CREATE;
+
+ if((plugin == NULL) ||
+ (plugin->dependencies &&
+ KHM_FAILED(multi_string_length_cch(plugin->dependencies, KMM_MAXCCH_DEPS, &cch))) ||
+ FAILED(StringCchLength(plugin->module, KMM_MAXCCH_NAME - 1, &cch)) ||
+ (plugin->description &&
+ FAILED(StringCchLength(plugin->description, KMM_MAXCCH_DESC - 1, &cch))) ||
+ FAILED(StringCchLength(plugin->name, KMM_MAXCCH_NAME - 1, &cch)))
+ {
+ return KHM_ERROR_INVALID_PARM;
+ }
+
+ /* note that we are retaining the length of the plugin name in
+ chars in cch */
+ cch ++;
+
+#define CKRV if(KHM_FAILED(rv)) goto _exit
+
+ rv = kmm_get_plugin_config(plugin->name,
+ config_flags | KHM_FLAG_CREATE, &csp_plugin);
+ CKRV;
+
+ /* should fail if the module key doesn't exist */
+ rv = kmm_get_module_config(plugin->module, config_flags, &csp_module);
+ CKRV;
+
+ /*TODO: Make sure that the module registration is in the same
+ config store as the one in which the plugin is going to be
+ registered */
+
+ rv = khc_write_string(csp_plugin, L"Module", plugin->module);
+ CKRV;
+ if(plugin->description) {
+ rv = khc_write_string(csp_plugin, L"Description", plugin->description);
+ CKRV;
+ }
+ if(plugin->dependencies) {
+ rv = khc_write_multi_string(csp_plugin, L"Dependencies", plugin->dependencies);
+ CKRV;
+ }
+ rv = khc_write_int32(csp_plugin, L"Type", plugin->type);
+ CKRV;
+ rv = khc_write_int32(csp_plugin, L"Flags", plugin->flags);
+ CKRV;
+
+ {
+ khm_size cb = 0;
+ wchar_t * pl = NULL;
+ size_t scb = 0;
+
+ rv = khc_read_multi_string(csp_module, L"PluginList", NULL, &cb);
+ if(rv != KHM_ERROR_TOO_LONG)
+ goto _exit;
+
+ cb += cch * sizeof(wchar_t);
+ scb = cb;
+
+ pl = malloc(cb);
+
+ rv = khc_read_multi_string(csp_module, L"PluginList", NULL, &cb);
+ if(KHM_FAILED(rv)) {
+ if(pl)
+ free(pl);
+ goto _exit;
+ }
+
+ if(!multi_string_find(pl, plugin->name, 0)) {
+ multi_string_append(pl, &scb, plugin->name);
+ rv = khc_write_multi_string(csp_module, L"PluginList", pl);
+ }
+
+ free(pl);
+ CKRV;
+ }
+
+#undef CKRV
+
+_exit:
+ if(csp_plugin)
+ khc_close_space(csp_plugin);
+ if(csp_module)
+ khc_close_space(csp_module);
+
+ return rv;
+}
+
+KHMEXP khm_int32 KHMAPI
+kmm_register_module(kmm_module_reg * module, khm_int32 config_flags)
+{
+ khm_int32 rv = KHM_ERROR_SUCCESS;
+ khm_handle csp_module = NULL;
+ size_t cch;
+ int i;
+
+ if((module == NULL) ||
+ FAILED(StringCchLength(module->name, KMM_MAXCCH_NAME - 1, &cch)) ||
+ (module->description &&
+ FAILED(StringCchLength(module->description, KMM_MAXCCH_DESC - 1, &cch))) ||
+ FAILED(StringCchLength(module->path, MAX_PATH, &cch)) ||
+ (module->n_plugins > 0 && module->plugin_reg_info == NULL))
+ {
+ return KHM_ERROR_INVALID_PARM;
+ }
+
+#define CKRV if(KHM_FAILED(rv)) goto _exit
+
+ rv = kmm_get_module_config(module->name, config_flags | KHM_FLAG_CREATE, &csp_module);
+ CKRV;
+
+ if(module->description) {
+ rv = khc_write_string(csp_module, L"Description", module->description);
+ CKRV;
+ }
+ rv = khc_write_string(csp_module, L"ImagePath", module->path);
+ CKRV;
+
+ rv = khc_write_int32(csp_module, L"Flags", 0);
+ CKRV;
+
+ /* FileVersion and ProductVersion will be set when the module
+ is loaded for the first time */
+
+ for(i=0; i<module->n_plugins; i++) {
+ rv = kmm_register_plugin(module->plugin_reg_info + i, config_flags);
+ CKRV;
+ }
+
+#undef CKRV
+_exit:
+ if(csp_module)
+ khc_close_space(csp_module);
+
+ return rv;
+}
+
+KHMEXP khm_int32 KHMAPI
+kmm_unregister_plugin(wchar_t * plugin, khm_int32 config_flags)
+{
+ /*TODO: implement this */
+ return KHM_ERROR_NOT_IMPLEMENTED;
+}
+
+KHMEXP khm_int32 KHMAPI
+kmm_unregister_module(wchar_t * module, khm_int32 config_flags)
+{
+ /*TODO: implement this */
+ return KHM_ERROR_NOT_IMPLEMENTED;
+}