[PATCH 3/4] server: Added get_console_process_list implementation.

Roman Pišl rpisl at seznam.cz
Tue Mar 17 08:28:53 CDT 2020


Signed-off-by: Roman Pišl <rpisl at seznam.cz>
---
 server/console.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)

diff --git a/server/console.c b/server/console.c
index c3b235d022..877c29237b 100644
--- a/server/console.c
+++ b/server/console.c
@@ -606,6 +606,25 @@ static void propagate_console_signal( struct console_input *console,
     enum_processes(propagate_console_signal_cb, &csi);
 }
 
+struct console_process_list
+{
+    DWORD* processes;
+    DWORD size;
+    DWORD count;
+};
+
+static int console_process_list_cb(struct process *process, void *user)
+{
+    if (process->console == current->process->console)
+    {
+        struct console_process_list* cpl = (struct console_process_list*)user;
+        if (cpl->count < cpl->size) cpl->processes[cpl->count] = process->id;
+        cpl->count++;
+    }
+
+    return 0;
+}
+
 static int get_console_mode( obj_handle_t handle )
 {
     struct object *obj;
@@ -1617,6 +1636,32 @@ error:
     release_object( process );
 }
 
+/* Get console process list */
+DECL_HANDLER(get_console_process_list)
+{
+    struct console_process_list cpl;
+    cpl.count = 0;
+    cpl.size = req->count;
+    cpl.processes = NULL;
+    reply->total = 0;
+
+    if (cpl.size > 0)
+    {
+        cpl.processes = malloc(cpl.count * sizeof(DWORD));
+        if (!cpl.processes) return;
+    }
+
+    enum_processes(console_process_list_cb, &cpl);
+
+    if (cpl.count > 0 && cpl.count <= req->count)
+    {
+        set_reply_data( cpl.processes, cpl.count * sizeof(DWORD) );
+    }
+
+    if (cpl.processes) free(cpl.processes);
+    reply->total = cpl.count;
+}
+
 /* set info about a console input */
 DECL_HANDLER(set_console_input_info)
 {
-- 
2.20.1




More information about the wine-devel mailing list