[PATCH 2/3] server: Add console process list ioctl.
Jacek Caban
jacek at codeweavers.com
Tue Feb 8 15:32:21 CST 2022
Hi Roman,
On 2/4/22 19:03, Roman Pišl wrote:
> Signed-off-by: Roman Pišl <rpisl at seznam.cz>
> ---
> include/wine/condrv.h | 1 +
> server/console.c | 55 +++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 56 insertions(+)
>
> diff --git a/include/wine/condrv.h b/include/wine/condrv.h
> index 4d2332a1ee9..13fb2c0b2c8 100644
> --- a/include/wine/condrv.h
> +++ b/include/wine/condrv.h
> @@ -43,6 +43,7 @@
> #define IOCTL_CONDRV_BEEP CTL_CODE(FILE_DEVICE_CONSOLE, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
> #define IOCTL_CONDRV_FLUSH CTL_CODE(FILE_DEVICE_CONSOLE, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
> #define IOCTL_CONDRV_GET_WINDOW CTL_CODE(FILE_DEVICE_CONSOLE, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
> +#define IOCTL_CONDRV_GET_PROCESS_LIST CTL_CODE(FILE_DEVICE_CONSOLE, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
>
> /* console output ioctls */
> #define IOCTL_CONDRV_WRITE_CONSOLE CTL_CODE(FILE_DEVICE_CONSOLE, 30, METHOD_BUFFERED, FILE_WRITE_ACCESS)
> diff --git a/server/console.c b/server/console.c
> index 5407fba1411..2df8fed5dfb 100644
> --- a/server/console.c
> +++ b/server/console.c
> @@ -707,6 +707,27 @@ static void propagate_console_signal( struct console *console,
> enum_processes(propagate_console_signal_cb, &csi);
> }
>
> +struct console_process_list
> +{
> + DWORD size;
> + DWORD count;
> + DWORD *processes;
> + struct console *console;
> +};
Please avoid using DWORD for internal server fields (size and count).
> +
> +static int console_process_list_cb(struct process *process, void *user)
> +{
> + struct console_process_list* cpl = (struct console_process_list*)user;
The cast is not needed.
> +
> + if (process->console == cpl->console)
> + {
> + if (cpl->count < cpl->size) cpl->processes[cpl->count] = process->id;
> + cpl->count++;
> + }
> +
> + return 0;
> +}
> +
> /* dumb dump */
> static void console_dump( struct object *obj, int verbose )
> {
> @@ -963,6 +984,40 @@ static void console_ioctl( struct fd *fd, ioctl_code_t code, struct async *async
> return;
> }
>
> + case IOCTL_CONDRV_GET_PROCESS_LIST:
> + {
> + struct console_process_list cpl;
> + cpl.count = 0;
> + cpl.size = get_reply_max_size() / sizeof(DWORD);
> +
> + if (cpl.size < 1)
> + {
> + set_error( STATUS_INVALID_PARAMETER );
> + return;
> + }
> + if (!console)
> + {
> + set_error( STATUS_INVALID_HANDLE );
> + return;
> + }
There is no need to test for NULL console here.
> +
> + cpl.console = console;
> + cpl.processes = (DWORD *) set_reply_data_size( get_reply_max_size() );
> + enum_processes( console_process_list_cb, &cpl );
> +
> + if (cpl.count > cpl.size)
> + {
> + current->reply_size = sizeof(DWORD);
> + *cpl.processes = cpl.count;
> + set_error( STATUS_BUFFER_TOO_SMALL );
> + return;
> + }
> +
> + current->reply_size = cpl.count * sizeof(DWORD);
over-allocating result and direct manipulation of reply_size does not
really look nice. The usual practice would be to test size first and
allocate appropriate result when we know its size. In this case, it's
probably easiest if you do another enum_processes() call first, just to
calculate result size (another solution would be to keep track of
attached processes in console object itself).
Thanks,
Jacek
More information about the wine-devel
mailing list