[PATCH] [Kernel32,Server]: implemented GetConsoleProcessList
Eric Pouech
eric.pouech at orange.fr
Tue Nov 16 15:04:36 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 | 14 +++++++++++++
7 files changed, 107 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/console.c b/dlls/kernel32/console.c
index c0af117..a0bdb19 100644
--- a/dlls/kernel32/console.c
+++ b/dlls/kernel32/console.c
@@ -2966,15 +2966,28 @@ 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;
}
+ else
+ {
+ NTSTATUS nts;
- return 0;
+ 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..b1dbb25 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,ints); */
+ 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 412
#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..5c311f7 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,ints); /* 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..0e96e3d 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -1688,6 +1688,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_ints( ", 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 +3917,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 +4164,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 +4411,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