[PATCH] [Kernel32,Server]: implemented GetConsoleProcessList

Eric Pouech eric.pouech at orange.fr
Thu Nov 18 14:27:32 CST 2010




A+
---

 dlls/kernel32/console.c        |   19 ++++++++++++++----
 dlls/kernel32/tests/console.c  |    2 --
 include/wine/server_protocol.h |   20 ++++++++++++++++++-
 server/console.c               |   43 ++++++++++++++++++++++++++++++++++++++++
 server/protocol.def            |    9 ++++++++
 server/request.h               |    6 ++++++
 server/trace.c                 |   29 +++++++++++++++++++++++++++
 7 files changed, 121 insertions(+), 7 deletions(-)


diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c
index c0af117..f3d029d 100644
--- a/dlls/kernel32/console.c
+++ b/dlls/kernel32/console.c
@@ -2966,15 +2966,26 @@ DWORD WINAPI GetConsoleAliasW(LPWSTR lpSource, LPWSTR lpTargetBuffer,
  */
 DWORD WINAPI GetConsoleProcessList(LPDWORD processlist, DWORD processcount)
 {
-    FIXME("(%p,%d): stub\n", processlist, processcount);
+    DWORD       numproc = 0;
+
+    TRACE("(%p,%d)\n", processlist, processcount);
 
     if (!processlist || processcount < 1)
     {
         SetLastError(ERROR_INVALID_PARAMETER);
-        return 0;
     }
-
-    return 0;
+    else
+    {
+        SERVER_START_REQ(get_console_process_list)
+        {
+            req->handle = 0;
+            wine_server_set_reply( req, processlist, processcount * sizeof(DWORD));
+            wine_server_call_err( req );
+            numproc = reply->num_processes;
+        }
+        SERVER_END_REQ;
+    }
+    return numproc;
 }
 
 BOOL CONSOLE_Init(RTL_USER_PROCESS_PARAMETERS *params)
diff --git a/dlls/kernel32/tests/console.c b/dlls/kernel32/tests/console.c
index 2f8cf84..05db187 100644
--- a/dlls/kernel32/tests/console.c
+++ b/dlls/kernel32/tests/console.c
@@ -971,7 +971,6 @@ static void test_GetConsoleProcessList(void)
 
     SetLastError(0xdeadbeef);
     ret = pGetConsoleProcessList(list, 1);
-    todo_wine
     ok(ret == 1, "Expected 1, got %d\n", ret);
 
     HeapFree(GetProcessHeap(), 0, list);
@@ -980,7 +979,6 @@ static void test_GetConsoleProcessList(void)
 
     SetLastError(0xdeadbeef);
     ret = pGetConsoleProcessList(list, ret);
-    todo_wine
     ok(ret == 1, "Expected 1, got %d\n", ret);
 
     if (ret == 1)
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 72f3cde..cf7b333 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -1619,6 +1619,21 @@ struct get_console_input_info_reply
 
 
 
+struct get_console_process_list_request
+{
+    struct request_header __header;
+    obj_handle_t  handle;
+};
+struct get_console_process_list_reply
+{
+    struct reply_header __header;
+    int           num_processes;
+    /* VARARG(pidlist,process_id_ts); */
+    char __pad_12[4];
+};
+
+
+
 struct append_console_input_history_request
 {
     struct request_header __header;
@@ -4834,6 +4849,7 @@ enum request
     REQ_set_console_mode,
     REQ_set_console_input_info,
     REQ_get_console_input_info,
+    REQ_get_console_process_list,
     REQ_append_console_input_history,
     REQ_get_console_input_history,
     REQ_create_console_output,
@@ -5084,6 +5100,7 @@ union generic_request
     struct set_console_mode_request set_console_mode_request;
     struct set_console_input_info_request set_console_input_info_request;
     struct get_console_input_info_request get_console_input_info_request;
+    struct get_console_process_list_request get_console_process_list_request;
     struct append_console_input_history_request append_console_input_history_request;
     struct get_console_input_history_request get_console_input_history_request;
     struct create_console_output_request create_console_output_request;
@@ -5332,6 +5349,7 @@ union generic_reply
     struct set_console_mode_reply set_console_mode_reply;
     struct set_console_input_info_reply set_console_input_info_reply;
     struct get_console_input_info_reply get_console_input_info_reply;
+    struct get_console_process_list_reply get_console_process_list_reply;
     struct append_console_input_history_reply append_console_input_history_reply;
     struct get_console_input_history_reply get_console_input_history_reply;
     struct create_console_output_reply create_console_output_reply;
@@ -5519,6 +5537,6 @@ union generic_reply
     struct set_cursor_reply set_cursor_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 411
+#define SERVER_PROTOCOL_VERSION 413
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/console.c b/server/console.c
index 42d985d..35c7178 100644
--- a/server/console.c
+++ b/server/console.c
@@ -1785,3 +1785,46 @@ DECL_HANDLER(get_console_wait_event)
     }
     else set_error( STATUS_INVALID_PARAMETER );
 }
+
+struct console_pcs_list
+{
+    struct console_input*       console;
+    unsigned                    idx;
+    process_id_t*               pidlist;
+};
+
+static int feed_console_process_list_cb(struct process *process, void *user)
+{
+    struct console_pcs_list* cpl = (struct console_pcs_list*)user;
+
+    if (process->console == cpl->console)
+    {
+        cpl->pidlist[cpl->idx++] = process->id;
+    }
+    return FALSE;
+}
+
+DECL_HANDLER(get_console_process_list)
+{
+    struct console_pcs_list     cpl;
+
+    if ((cpl.console = console_input_get( req->handle, FILE_READ_PROPERTIES )))
+    {
+        data_size_t     sz;
+
+        reply->num_processes = sz = cpl.console->num_proc;
+
+        if ((sz *= sizeof(process_id_t)) <= get_reply_max_size())
+        {
+            if ((cpl.pidlist = set_reply_data_size( sz )))
+            {
+                cpl.idx = 0;
+                enum_processes( feed_console_process_list_cb, &cpl );
+                assert( cpl.console->num_proc == cpl.idx );
+            }
+        }
+        else set_error( STATUS_BUFFER_TOO_SMALL );
+
+        release_object( cpl.console );
+    }
+}
diff --git a/server/protocol.def b/server/protocol.def
index 6245f4c..0f31625 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -1274,6 +1274,15 @@ struct console_renderer_event
 @END
 
 
+/* Get console's process list */
+ at REQ(get_console_process_list)
+    obj_handle_t  handle;        /* handle to console input (0 for current process console) */
+ at REPLY
+    int           num_processes; /* number of processes attached to this console */
+    VARARG(pidlist,process_id_ts); /* process list */
+ at END
+
+
 /* appends a string to console's history */
 @REQ(append_console_input_history)
     obj_handle_t handle;        /* handle to console input, or 0 for process' console */
diff --git a/server/request.h b/server/request.h
index e0bffaf..8c4e639 100644
--- a/server/request.h
+++ b/server/request.h
@@ -169,6 +169,7 @@ DECL_HANDLER(get_console_mode);
 DECL_HANDLER(set_console_mode);
 DECL_HANDLER(set_console_input_info);
 DECL_HANDLER(get_console_input_info);
+DECL_HANDLER(get_console_process_list);
 DECL_HANDLER(append_console_input_history);
 DECL_HANDLER(get_console_input_history);
 DECL_HANDLER(create_console_output);
@@ -418,6 +419,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
     (req_handler)req_set_console_mode,
     (req_handler)req_set_console_input_info,
     (req_handler)req_get_console_input_info,
+    (req_handler)req_get_console_process_list,
     (req_handler)req_append_console_input_history,
     (req_handler)req_get_console_input_history,
     (req_handler)req_create_console_output,
@@ -1000,6 +1002,10 @@ C_ASSERT( FIELD_OFFSET(struct get_console_input_info_reply, input_cp) == 24 );
 C_ASSERT( FIELD_OFFSET(struct get_console_input_info_reply, output_cp) == 28 );
 C_ASSERT( FIELD_OFFSET(struct get_console_input_info_reply, win) == 32 );
 C_ASSERT( sizeof(struct get_console_input_info_reply) == 40 );
+C_ASSERT( FIELD_OFFSET(struct get_console_process_list_request, handle) == 12 );
+C_ASSERT( sizeof(struct get_console_process_list_request) == 16 );
+C_ASSERT( FIELD_OFFSET(struct get_console_process_list_reply, num_processes) == 8 );
+C_ASSERT( sizeof(struct get_console_process_list_reply) == 16 );
 C_ASSERT( FIELD_OFFSET(struct append_console_input_history_request, handle) == 12 );
 C_ASSERT( sizeof(struct append_console_input_history_request) == 16 );
 C_ASSERT( FIELD_OFFSET(struct get_console_input_history_request, handle) == 12 );
diff --git a/server/trace.c b/server/trace.c
index 83d5b16..39947c8 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -400,6 +400,21 @@ static void dump_varargs_unicode_str( const char *prefix, data_size_t size )
     remove_data( size );
 }
 
+static void dump_varargs_process_id_ts( const char *prefix, data_size_t size )
+{
+    const process_id_t *data = cur_data;
+    data_size_t len = size / sizeof(*data);
+
+    fprintf( stderr,"%s{", prefix );
+    while (len > 0)
+    {
+        fprintf( stderr, "%04x", *data++ );
+        if (--len) fputc( ',', stderr );
+    }
+    fputc( '}', stderr );
+    remove_data( size );
+}
+
 static void dump_varargs_context( const char *prefix, data_size_t size )
 {
     const context_t *context = cur_data;
@@ -1688,6 +1703,17 @@ static void dump_get_console_input_info_reply( const struct get_console_input_in
     dump_varargs_unicode_str( ", title=", cur_size );
 }
 
+static void dump_get_console_process_list_request( const struct get_console_process_list_request *req )
+{
+    fprintf( stderr, " handle=%04x", req->handle );
+}
+
+static void dump_get_console_process_list_reply( const struct get_console_process_list_reply *req )
+{
+    fprintf( stderr, " num_processes=%d", req->num_processes );
+    dump_varargs_process_id_ts( ", pidlist=", cur_size );
+}
+
 static void dump_append_console_input_history_request( const struct append_console_input_history_request *req )
 {
     fprintf( stderr, " handle=%04x", req->handle );
@@ -3906,6 +3932,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
     (dump_func)dump_set_console_mode_request,
     (dump_func)dump_set_console_input_info_request,
     (dump_func)dump_get_console_input_info_request,
+    (dump_func)dump_get_console_process_list_request,
     (dump_func)dump_append_console_input_history_request,
     (dump_func)dump_get_console_input_history_request,
     (dump_func)dump_create_console_output_request,
@@ -4152,6 +4179,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
     NULL,
     NULL,
     (dump_func)dump_get_console_input_info_reply,
+    (dump_func)dump_get_console_process_list_reply,
     NULL,
     (dump_func)dump_get_console_input_history_reply,
     (dump_func)dump_create_console_output_reply,
@@ -4398,6 +4426,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
     "set_console_mode",
     "set_console_input_info",
     "get_console_input_info",
+    "get_console_process_list",
     "append_console_input_history",
     "get_console_input_history",
     "create_console_output",




More information about the wine-patches mailing list