[PATCH 2/3] server: Add get_console_process_list implementation.

Roman Pišl rpisl at seznam.cz
Tue Apr 21 15:10:44 CDT 2020


Signed-off-by: Roman Pišl <rpisl at seznam.cz>
---
 include/wine/server_protocol.h | 18 ++++++++++++++
 server/console.c               | 45 ++++++++++++++++++++++++++++++++++
 server/protocol.def            |  9 +++++++
 server/request.h               |  6 +++++
 server/trace.c                 | 14 +++++++++++
 5 files changed, 92 insertions(+)

diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 9cdb9c765f..4d917199d6 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -1931,6 +1931,21 @@ struct attach_console_reply
 
 
 
+struct get_console_process_list_request
+{
+    struct request_header __header;
+    data_size_t count;
+};
+struct get_console_process_list_reply
+{
+    struct reply_header __header;
+    data_size_t total;
+    /* VARARG(data,uints); */
+    char __pad_12[4];
+};
+
+
+
 struct get_console_wait_event_request
 {
     struct request_header __header;
@@ -5849,6 +5864,7 @@ enum request
     REQ_get_console_renderer_events,
     REQ_open_console,
     REQ_attach_console,
+    REQ_get_console_process_list,
     REQ_get_console_wait_event,
     REQ_get_console_mode,
     REQ_set_console_mode,
@@ -6151,6 +6167,7 @@ union generic_request
     struct get_console_renderer_events_request get_console_renderer_events_request;
     struct open_console_request open_console_request;
     struct attach_console_request attach_console_request;
+    struct get_console_process_list_request get_console_process_list_request;
     struct get_console_wait_event_request get_console_wait_event_request;
     struct get_console_mode_request get_console_mode_request;
     struct set_console_mode_request set_console_mode_request;
@@ -6451,6 +6468,7 @@ union generic_reply
     struct get_console_renderer_events_reply get_console_renderer_events_reply;
     struct open_console_reply open_console_reply;
     struct attach_console_reply attach_console_reply;
+    struct get_console_process_list_reply get_console_process_list_reply;
     struct get_console_wait_event_reply get_console_wait_event_reply;
     struct get_console_mode_reply get_console_mode_reply;
     struct set_console_mode_reply set_console_mode_reply;
diff --git a/server/console.c b/server/console.c
index 5feb1c2ba7..b94bb9c500 100644
--- a/server/console.c
+++ b/server/console.c
@@ -614,6 +614,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)
 {
diff --git a/server/protocol.def b/server/protocol.def
index 1413021a39..41c7d8a4e0 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -1542,6 +1542,15 @@ struct console_renderer_event
 @END
 
 
+/* Get console process list */
+ at REQ(get_console_process_list)
+    data_size_t count;          /* maximum number of processes in list */
+ at REPLY
+    data_size_t total;
+    VARARG(data,uints);         /* PIDs attached to the console */
+ at END
+
+
 /* Get the input queue wait event */
 @REQ(get_console_wait_event)
     obj_handle_t handle;        /* handle to the console */
diff --git a/server/request.h b/server/request.h
index 0d4c083460..9ea4eedd02 100644
--- a/server/request.h
+++ b/server/request.h
@@ -185,6 +185,7 @@ DECL_HANDLER(free_console);
 DECL_HANDLER(get_console_renderer_events);
 DECL_HANDLER(open_console);
 DECL_HANDLER(attach_console);
+DECL_HANDLER(get_console_process_list);
 DECL_HANDLER(get_console_wait_event);
 DECL_HANDLER(get_console_mode);
 DECL_HANDLER(set_console_mode);
@@ -486,6 +487,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
     (req_handler)req_get_console_renderer_events,
     (req_handler)req_open_console,
     (req_handler)req_attach_console,
+    (req_handler)req_get_console_process_list,
     (req_handler)req_get_console_wait_event,
     (req_handler)req_get_console_mode,
     (req_handler)req_set_console_mode,
@@ -1148,6 +1150,10 @@ C_ASSERT( FIELD_OFFSET(struct attach_console_reply, std_in) == 8 );
 C_ASSERT( FIELD_OFFSET(struct attach_console_reply, std_out) == 12 );
 C_ASSERT( FIELD_OFFSET(struct attach_console_reply, std_err) == 16 );
 C_ASSERT( sizeof(struct attach_console_reply) == 24 );
+C_ASSERT( FIELD_OFFSET(struct get_console_process_list_request, count) == 12 );
+C_ASSERT( sizeof(struct get_console_process_list_request) == 16 );
+C_ASSERT( FIELD_OFFSET(struct get_console_process_list_reply, total) == 8 );
+C_ASSERT( sizeof(struct get_console_process_list_reply) == 16 );
 C_ASSERT( FIELD_OFFSET(struct get_console_wait_event_request, handle) == 12 );
 C_ASSERT( sizeof(struct get_console_wait_event_request) == 16 );
 C_ASSERT( FIELD_OFFSET(struct get_console_wait_event_reply, event) == 8 );
diff --git a/server/trace.c b/server/trace.c
index dd63b166f3..729a5f2c38 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -2037,6 +2037,17 @@ static void dump_attach_console_reply( const struct attach_console_reply *req )
     fprintf( stderr, ", std_err=%04x", req->std_err );
 }
 
+static void dump_get_console_process_list_request( const struct get_console_process_list_request *req )
+{
+    fprintf( stderr, " count=%u", req->count );
+}
+
+static void dump_get_console_process_list_reply( const struct get_console_process_list_reply *req )
+{
+    fprintf( stderr, " total=%u", req->total );
+    dump_varargs_uints( ", data=", cur_size );
+}
+
 static void dump_get_console_wait_event_request( const struct get_console_wait_event_request *req )
 {
     fprintf( stderr, " handle=%04x", req->handle );
@@ -4663,6 +4674,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_get_console_renderer_events_request,
     (dump_func)dump_open_console_request,
     (dump_func)dump_attach_console_request,
+    (dump_func)dump_get_console_process_list_request,
     (dump_func)dump_get_console_wait_event_request,
     (dump_func)dump_get_console_mode_request,
     (dump_func)dump_set_console_mode_request,
@@ -4961,6 +4973,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_get_console_renderer_events_reply,
     (dump_func)dump_open_console_reply,
     (dump_func)dump_attach_console_reply,
+    (dump_func)dump_get_console_process_list_reply,
     (dump_func)dump_get_console_wait_event_reply,
     (dump_func)dump_get_console_mode_reply,
     NULL,
@@ -5259,6 +5272,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
     "get_console_renderer_events",
     "open_console",
     "attach_console",
+    "get_console_process_list",
     "get_console_wait_event",
     "get_console_mode",
     "set_console_mode",
-- 
2.20.1




More information about the wine-devel mailing list