summaryrefslogtreecommitdiff
path: root/core/src
diff options
context:
space:
mode:
authorruki <[email protected]>2017-05-30 23:14:27 +0800
committerruki <[email protected]>2017-05-30 23:14:27 +0800
commitf01d5364141a3e2a965bd9d46e65a2bd851e27ec (patch)
tree6d56fb256655efa493021ee1a340368407c2c7c2 /core/src
parentaf5040e4c197ce261062b925743201358dc5e43c (diff)
add winreg.query and improve program
Diffstat (limited to 'core/src')
-rw-r--r--core/src/xmake/machine.c19
-rw-r--r--core/src/xmake/makefile1
-rw-r--r--core/src/xmake/winreg/prefix.h39
-rw-r--r--core/src/xmake/winreg/query.c235
4 files changed, 294 insertions, 0 deletions
diff --git a/core/src/xmake/machine.c b/core/src/xmake/machine.c
index 0281f0a2c..e1638e1ab 100644
--- a/core/src/xmake/machine.c
+++ b/core/src/xmake/machine.c
@@ -93,6 +93,11 @@ tb_int_t xm_path_absolute(lua_State* lua);
tb_int_t xm_path_translate(lua_State* lua);
tb_int_t xm_path_is_absolute(lua_State* lua);
+// the winreg functions
+#ifdef TB_CONFIG_OS_WINDOWS
+tb_int_t xm_winreg_query(lua_State* lua);
+#endif
+
// the string functions
tb_int_t xm_string_strcmp(lua_State* lua);
tb_int_t xm_string_endswith(lua_State* lua);
@@ -173,6 +178,15 @@ static luaL_Reg const g_string_functions[] =
, { tb_null, tb_null }
};
+#ifdef TB_CONFIG_OS_WINDOWS
+// the winreg functions
+static luaL_Reg const g_winreg_functions[] =
+{
+ { "query", xm_winreg_query }
+, { tb_null, tb_null }
+};
+#endif
+
// the process functions
static luaL_Reg const g_process_functions[] =
{
@@ -419,6 +433,11 @@ xm_machine_ref_t xm_machine_init()
// bind sandbox functions
luaL_register(impl->lua, "sandbox", g_sandbox_functions);
+ // bind winreg functions
+#ifdef TB_CONFIG_OS_WINDOWS
+ luaL_register(impl->lua, "winreg", g_winreg_functions);
+#endif
+
#ifdef XM_CONFIG_API_HAVE_READLINE
// bind readline functions
luaL_register(impl->lua, "readline", g_readline_functions);
diff --git a/core/src/xmake/makefile b/core/src/xmake/makefile
index c7b1ffc29..efc32d94d 100644
--- a/core/src/xmake/makefile
+++ b/core/src/xmake/makefile
@@ -44,6 +44,7 @@ xmake_C_FILES += \
path/absolute \
path/translate \
path/is_absolute \
+ winreg/query \
string/strcmp \
string/endswith \
string/startswith \
diff --git a/core/src/xmake/winreg/prefix.h b/core/src/xmake/winreg/prefix.h
new file mode 100644
index 000000000..45fe6f42c
--- /dev/null
+++ b/core/src/xmake/winreg/prefix.h
@@ -0,0 +1,39 @@
+/*!The Make-like Build Utility based on Lua
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Copyright (C) 2015 - 2017, TBOOX Open Source Group.
+ *
+ * @author TitanSnow
+ * @file prefix.h
+ *
+ */
+#ifndef XM_WINREG_PREFIX_H
+#define XM_WINREG_PREFIX_H
+
+/* //////////////////////////////////////////////////////////////////////////////////////
+ * includes
+ */
+#include "../prefix.h"
+#ifdef TB_CONFIG_OS_WINDOWS
+#include <windows.h>
+#endif
+
+
+#endif
+
+
diff --git a/core/src/xmake/winreg/query.c b/core/src/xmake/winreg/query.c
new file mode 100644
index 000000000..036d4a7c3
--- /dev/null
+++ b/core/src/xmake/winreg/query.c
@@ -0,0 +1,235 @@
+/*!The Make-like Build Utility based on Lua
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * Copyright (C) 2015 - 2017, TBOOX Open Source Group.
+ *
+ * @author TitanSnow, ruki
+ * @file query.c
+ *
+ */
+
+/* //////////////////////////////////////////////////////////////////////////////////////
+ * trace
+ */
+#define TB_TRACE_MODULE_NAME "query"
+#define TB_TRACE_MODULE_DEBUG (0)
+
+/* //////////////////////////////////////////////////////////////////////////////////////
+ * includes
+ */
+#include "prefix.h"
+
+/* //////////////////////////////////////////////////////////////////////////////////////
+ * types
+ */
+#ifdef TB_CONFIG_OS_WINDOWS
+// the RegGetValueA func type
+typedef BOOL (WINAPI* xm_RegGetValueA_t)(HKEY hkey, LPCSTR lpSubKey, LPCSTR lpValue, DWORD dwFlags, LPDWORD pdwType, PVOID pvData, LPDWORD pcbData);
+#endif
+
+/* //////////////////////////////////////////////////////////////////////////////////////
+ * implementation
+ */
+
+#ifdef TB_CONFIG_OS_WINDOWS
+
+/* query registry
+ *
+ * local value, errors = winreg.query("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug;Debugger")
+ */
+tb_int_t xm_winreg_query(lua_State* lua)
+{
+ // check
+ tb_assert_and_check_return_val(lua, 0);
+
+ // get the path
+ tb_char_t const* path = luaL_checkstring(lua, 1);
+ tb_check_return_val(path, 0);
+
+ // query key-value
+ tb_bool_t ok = tb_false;
+ HKEY key = NULL;
+ HKEY keynew = NULL;
+ tb_char_t pathbuf[TB_PATH_MAXN];
+ tb_char_t* value = tb_null;
+ do
+ {
+ // copy path
+ tb_size_t size = tb_strlcpy(pathbuf, path, sizeof(pathbuf));
+ if (size >= sizeof(pathbuf))
+ {
+ lua_pushnil(lua);
+ lua_pushfstring(lua, "too long path: %s", path);
+ break;
+ }
+
+ // parse path key and subkey
+ tb_char_t* pathkey = tb_null;
+ tb_char_t* pathsubkey = tb_null;
+ tb_char_t* p = pathbuf;
+ for (; *p && *p != '\\'; p++) ;
+ if (*p == '\\')
+ {
+ *p = '\0';
+ pathkey = pathbuf;
+ pathsubkey = p + 1;
+ }
+ if (!pathkey || !pathsubkey)
+ {
+ lua_pushnil(lua);
+ lua_pushfstring(lua, "parse pathkey and pathsubkey failed: %s", path);
+ break;
+ }
+
+ // parse value name
+ tb_char_t* valuename = tb_null;
+ for (p = pathbuf + size - 1; p >= pathbuf && *p && *p != ';'; p--) ;
+ if (p >= pathbuf && *p == ';')
+ {
+ valuename = p + 1;
+ *p = '\0';
+ }
+ if (!valuename)
+ {
+ lua_pushnil(lua);
+ lua_pushfstring(lua, "parse value name failed: %s", path);
+ break;
+ }
+
+ // trace
+ tb_trace_d("key: %s, subkey: %s, name: %s", pathkey, pathsubkey, valuename);
+
+ // get registry key
+ if (!tb_strcmp(pathkey, "HKEY_CLASSES_ROOT")) key = HKEY_CLASSES_ROOT;
+ else if (!tb_strcmp(pathkey, "HKEY_CURRENT_CONFIG")) key = HKEY_CURRENT_CONFIG;
+ else if (!tb_strcmp(pathkey, "HKEY_CURRENT_USER")) key = HKEY_CURRENT_USER;
+ else if (!tb_strcmp(pathkey, "HKEY_LOCAL_MACHINE")) key = HKEY_LOCAL_MACHINE;
+ else if (!tb_strcmp(pathkey, "HKEY_USERS")) key = HKEY_USERS;
+ else
+ {
+ lua_pushnil(lua);
+ lua_pushfstring(lua, "invalid registry path: %s", path);
+ break;
+ }
+
+ // attempt to load RegGetValueA
+ static xm_RegGetValueA_t s_RegGetValueA = tb_null;
+ if (!s_RegGetValueA)
+ {
+ // load the advapi32 module
+ tb_dynamic_ref_t module = (tb_dynamic_ref_t)GetModuleHandleA("advapi32.dll");
+ if (!module) module = tb_dynamic_init("advapi32.dll");
+ if (module) s_RegGetValueA = (xm_RegGetValueA_t)tb_dynamic_func(module, "RegGetValueA");
+ }
+
+ // get registry value
+ DWORD type = 0;
+ if (s_RegGetValueA)
+ {
+ // get registry value size
+ DWORD valuesize = 0;
+ if (s_RegGetValueA(key, pathsubkey, valuename, RRF_RT_ANY, 0, tb_null, &valuesize) != ERROR_SUCCESS)
+ {
+ lua_pushnil(lua);
+ lua_pushfstring(lua, "get registry value size failed: %s", path);
+ break;
+ }
+
+ // make value buffer
+ value = (tb_char_t*)tb_malloc0(valuesize);
+ tb_assert_and_check_break(value);
+
+ // get value result
+ type = 0;
+ if (s_RegGetValueA(key, pathsubkey, valuename, RRF_RT_ANY, &type, (PVOID)value, &valuesize) != ERROR_SUCCESS)
+ {
+ lua_pushnil(lua);
+ lua_pushfstring(lua, "get registry value failed: %s", path);
+ break;
+ }
+ }
+ else
+ {
+ // open registry key
+ if (RegOpenKeyExA(key, pathsubkey, 0, KEY_QUERY_VALUE, &keynew) != ERROR_SUCCESS && keynew)
+ {
+ lua_pushnil(lua);
+ lua_pushfstring(lua, "open registry key failed: %s", path);
+ break;
+ }
+
+ // get registry value size
+ DWORD valuesize = 0;
+ if (RegQueryValueEx(keynew, valuename, tb_null, tb_null, tb_null, &valuesize) != ERROR_SUCCESS)
+ {
+ lua_pushnil(lua);
+ lua_pushfstring(lua, "get registry value size failed: %s", path);
+ break;
+ }
+
+ // make value buffer
+ value = (tb_char_t*)tb_malloc0(valuesize);
+ tb_assert_and_check_break(value);
+
+ // get value result
+ type = 0;
+ if (RegQueryValueEx(keynew, valuename, tb_null, &type, (LPBYTE)value, &valuesize) != ERROR_SUCCESS)
+ {
+ lua_pushnil(lua);
+ lua_pushfstring(lua, "get registry value failed: %s", path);
+ break;
+ }
+ }
+
+ // save result
+ switch (type)
+ {
+ case REG_SZ:
+ case REG_EXPAND_SZ:
+ lua_pushstring(lua, value);
+ ok = tb_true;
+ break;
+ case REG_DWORD:
+ lua_pushfstring(lua, "%d", *((tb_int_t*)value));
+ ok = tb_true;
+ break;
+ case REG_QWORD:
+ lua_pushfstring(lua, "%lld", *((tb_int64_t*)value));
+ ok = tb_true;
+ break;
+ default:
+ lua_pushnil(lua);
+ lua_pushfstring(lua, "unsupported registry value type: %d", type);
+ break;
+ }
+
+ } while (0);
+
+ // exit registry key
+ if (keynew != NULL)
+ RegCloseKey(keynew);
+ keynew = NULL;
+
+ // exit value
+ if (value) tb_free(value);
+ value = tb_null;
+
+ // ok?
+ return ok? 1 : 2;
+}
+#endif