summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSaikari <[email protected]>2026-01-31 17:29:44 +0300
committerSaikari <[email protected]>2026-01-31 17:29:44 +0300
commite494d44263b18e2981cb35041817b052a2bdda6a (patch)
tree5714989cea3b0d32970261b982a0a87dc6e1605a
parentd6589924f98f6e9f9dc80916912491fff95a1d62 (diff)
add winos_processes function to retrieve process information on Windows
-rw-r--r--core/src/xmake/engine.c2
-rw-r--r--core/src/xmake/os/processes.c86
2 files changed, 88 insertions, 0 deletions
diff --git a/core/src/xmake/engine.c b/core/src/xmake/engine.c
index eb07fe2b5..df5ae06be 100644
--- a/core/src/xmake/engine.c
+++ b/core/src/xmake/engine.c
@@ -278,6 +278,7 @@ tb_int_t xm_winos_registry_query(lua_State *lua);
tb_int_t xm_winos_registry_keys(lua_State *lua);
tb_int_t xm_winos_registry_values(lua_State *lua);
tb_int_t xm_winos_short_path(lua_State *lua);
+tb_int_t xm_winos_processes(lua_State* lua);
#endif
// the utf8 functions
@@ -483,6 +484,7 @@ static luaL_Reg const g_winos_functions[] = {
{ "registry_keys", xm_winos_registry_keys },
{ "registry_values", xm_winos_registry_values },
{ "short_path", xm_winos_short_path },
+ { "processes", xm_winos_processes },
{ tb_null, tb_null },
};
#endif
diff --git a/core/src/xmake/os/processes.c b/core/src/xmake/os/processes.c
new file mode 100644
index 000000000..a50ffbe1c
--- /dev/null
+++ b/core/src/xmake/os/processes.c
@@ -0,0 +1,86 @@
+/*!A cross-platform build utility based on Lua
+ *
+ * Licensed 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-present, Xmake Open Source Community.
+ *
+ * @author ruki
+ * @file processes.c
+ *
+ */
+
+/* //////////////////////////////////////////////////////////////////////////////////////
+ * trace
+ */
+#define TB_TRACE_MODULE_NAME "processes"
+#define TB_TRACE_MODULE_DEBUG (0)
+
+/* //////////////////////////////////////////////////////////////////////////////////////
+ * includes
+ */
+#include "prefix.h"
+#ifdef TB_CONFIG_OS_WINDOWS
+#include <windows.h>
+#include <tlhelp32.h>
+#endif
+
+/* //////////////////////////////////////////////////////////////////////////////////////
+ * implementation
+ */
+
+tb_int_t xm_winos_processes(lua_State* lua) {
+#ifdef TB_CONFIG_OS_WINDOWS
+ // init result table
+ lua_newtable(lua);
+
+ HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
+ if (hSnapshot != INVALID_HANDLE_VALUE) {
+ PROCESSENTRY32W pe32;
+ pe32.dwSize = sizeof(PROCESSENTRY32W);
+
+ if (Process32FirstW(hSnapshot, &pe32)) {
+ tb_int_t i = 1;
+ do {
+ // new process entry table
+ lua_newtable(lua);
+
+ // name
+ tb_char_t name[MAX_PATH * 4];
+ tb_size_t size = tb_charset_conv_data(TB_CHARSET_TYPE_UTF16 | TB_CHARSET_TYPE_LE, TB_CHARSET_TYPE_UTF8, (tb_byte_t const*)pe32.szExeFile, tb_wcslen(pe32.szExeFile) * sizeof(tb_wchar_t), (tb_byte_t*)name, sizeof(name));
+ if (size != -1) {
+ lua_pushlstring(lua, name, size);
+ } else {
+ lua_pushstring(lua, "");
+ }
+ lua_setfield(lua, -2, "name");
+
+ // pid
+ lua_pushinteger(lua, (tb_int_t)pe32.th32ProcessID);
+ lua_setfield(lua, -2, "pid");
+
+ // ppid
+ lua_pushinteger(lua, (tb_int_t)pe32.th32ParentProcessID);
+ lua_setfield(lua, -2, "ppid");
+
+ // result[i++] = entry
+ lua_rawseti(lua, -2, i++);
+
+ } while (Process32NextW(hSnapshot, &pe32));
+ }
+ CloseHandle(hSnapshot);
+ }
+ return 1;
+#else
+ return 0;
+#endif
+}