[PATCH v2] kernelbase: Implement SetCurrentConsoleFontEx

Jacek Caban jacek at codeweavers.com
Tue Feb 8 15:03:50 CST 2022


Hi Hugh,

On 2/8/22 13:38, Hugh McMaster wrote:
> Signed-off-by: Hugh McMaster <hugh.mcmaster at outlook.com>
> ---
> Changes in this version:
>    - Move struct condrv_output_info_params_font to SetCurrentConsoleFontEx
>      as anonymous struct.
>    - ioctl size only contains meaningful bytes.
>    - Calculate face_name string size in conhost.
>    - Manage invalid font height, weight and face name parameters.


It looks mostly good to me, some minor comments bellow.


> diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c
> index a7eeb439232..5f64fc90fa3 100644
> --- a/dlls/kernelbase/console.c
> +++ b/dlls/kernelbase/console.c
> @@ -1303,6 +1303,46 @@ BOOL WINAPI DECLSPEC_HOTPATCH SetConsoleWindowInfo( HANDLE handle, BOOL absolute
>   }
>   
>   
> +/******************************************************************************
> + *	SetCurrentConsoleFontEx   (kernelbase.@)
> + */
> +BOOL WINAPI SetCurrentConsoleFontEx(HANDLE hConsole, BOOL maxwindow, CONSOLE_FONT_INFOEX *cfix)
> +{
> +    struct
> +    {
> +        struct condrv_output_info_params params;
> +        WCHAR face_name[LF_FACESIZE];
> +    } data;
> +
> +    WCHAR *p = cfix->FaceName;
> +    int len = 0;
> +    DWORD size;
> +
> +    TRACE( "(%p %d %p)\n", hConsole, maxwindow, cfix );
> +
> +    if (cfix->cbSize != sizeof(CONSOLE_FONT_INFOEX))
> +    {
> +        SetLastError(ERROR_INVALID_PARAMETER);
> +        return FALSE;
> +    }
> +
> +    data.params.mask = SET_CONSOLE_OUTPUT_INFO_FONT;
> +
> +    data.params.info.font_width  = cfix->dwFontSize.X;
> +    data.params.info.font_height = cfix->dwFontSize.Y;
> +    data.params.info.font_pitch_family = cfix->FontFamily;
> +    data.params.info.font_weight = cfix->FontWeight;
> +
> +    while (*p && len < LF_FACESIZE) { p++; len++; }
> +    size = len * sizeof(WCHAR);
> +
> +    memcpy( data.face_name, cfix->FaceName, size );


This could be simplified to:

size = wcsnlen( info->FaceName, LF_FACESIZE - 1 ) * sizeof(WCHAR);


> @@ -1917,6 +1917,24 @@ static NTSTATUS set_output_info( struct screen_buffer *screen_buffer,
>           screen_buffer->max_width  = info->max_width;
>           screen_buffer->max_height = info->max_height;
>       }
> +    if (params->mask & SET_CONSOLE_OUTPUT_INFO_FONT)
> +    {
> +        WCHAR *face_name = (WCHAR *)(params + 1);
> +        size_t face_name_size = in_size - sizeof(*params);
> +        unsigned int height = info->font_height;
> +        unsigned int weight = FW_NORMAL;
> +
> +        if (!*face_name)


You potentially check uninitialized bytes here, I think you meant 
something like:

if (face_name_size)


Thanks,

Jacek




More information about the wine-devel mailing list