Signed-off-by: Roman Pišl rpisl@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 */ +@REQ(get_console_process_list) + data_size_t count; /* maximum number of processes in list */ +@REPLY + data_size_t total; + VARARG(data,uints); /* PIDs attached to the console */ +@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",