Jacek Caban : kernelbase: Introduce console_ioctl helper.
Alexandre Julliard
julliard at winehq.org
Fri Jul 10 16:30:31 CDT 2020
Module: wine
Branch: master
Commit: 674ec0c7f6754c47a5a513ceff80663bb8f5a3e4
URL: https://source.winehq.org/git/wine.git/?a=commit;h=674ec0c7f6754c47a5a513ceff80663bb8f5a3e4
Author: Jacek Caban <jacek at codeweavers.com>
Date: Fri Jul 10 17:06:01 2020 +0200
kernelbase: Introduce console_ioctl helper.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/kernelbase/console.c | 50 ++++++++++++++++++++++++++++-------------------
1 file changed, 30 insertions(+), 20 deletions(-)
diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c
index 37ca8b599b..606589339e 100644
--- a/dlls/kernelbase/console.c
+++ b/dlls/kernelbase/console.c
@@ -80,6 +80,28 @@ static inline obj_handle_t console_handle_unmap( HANDLE h )
return wine_server_obj_handle( console_handle_map( h ) );
}
+static BOOL console_ioctl( HANDLE handle, DWORD code, void *in_buff, DWORD in_count,
+ void *out_buff, DWORD out_count, DWORD *read )
+{
+ IO_STATUS_BLOCK io;
+ NTSTATUS status;
+
+ status = NtDeviceIoControlFile( handle, NULL, NULL, NULL, &io, code, in_buff, in_count,
+ out_buff, out_count );
+ switch( status )
+ {
+ case STATUS_SUCCESS:
+ if (read) *read = io.Information;
+ return TRUE;
+ case STATUS_INVALID_PARAMETER:
+ break;
+ default:
+ status = STATUS_INVALID_HANDLE;
+ break;
+ }
+ return set_ntstatus( status );
+}
+
/* map input records to ASCII */
static void input_records_WtoA( INPUT_RECORD *buffer, int count )
{
@@ -162,11 +184,8 @@ static COORD get_largest_console_window_size( HANDLE handle )
struct condrv_output_info info;
COORD c = { 0, 0 };
- if (!DeviceIoControl( handle, IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0, &info, sizeof(info), NULL, NULL ))
- {
- SetLastError( ERROR_INVALID_HANDLE );
+ if (!console_ioctl( handle, IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0, &info, sizeof(info), NULL ))
return c;
- }
c.X = info.max_width;
c.Y = info.max_height;
@@ -543,11 +562,8 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetConsoleCursorInfo( HANDLE handle, CONSOLE_CURSO
{
struct condrv_output_info condrv_info;
- if (!DeviceIoControl( handle, IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0, &condrv_info, sizeof(condrv_info), NULL, NULL ))
- {
- SetLastError( ERROR_INVALID_HANDLE );
+ if (!console_ioctl( handle, IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0, &condrv_info, sizeof(condrv_info), NULL ))
return FALSE;
- }
if (!info)
{
@@ -636,12 +652,9 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetConsoleScreenBufferInfo( HANDLE handle, CONSOLE
{
struct condrv_output_info condrv_info;
- if (!DeviceIoControl( handle , IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0,
- &condrv_info, sizeof(condrv_info), NULL, NULL ))
- {
- SetLastError( ERROR_INVALID_HANDLE );
+ if (!console_ioctl( handle , IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0,
+ &condrv_info, sizeof(condrv_info), NULL ))
return FALSE;
- }
info->dwSize.X = condrv_info.width;
info->dwSize.Y = condrv_info.height;
@@ -677,12 +690,9 @@ BOOL WINAPI DECLSPEC_HOTPATCH GetConsoleScreenBufferInfoEx( HANDLE handle,
return FALSE;
}
- if (!DeviceIoControl( handle, IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0, &condrv_info,
- sizeof(condrv_info), NULL, NULL ))
- {
- SetLastError( ERROR_INVALID_HANDLE );
+ if (!console_ioctl( handle, IOCTL_CONDRV_GET_OUTPUT_INFO, NULL, 0, &condrv_info,
+ sizeof(condrv_info), NULL ))
return FALSE;
- }
info->dwSize.X = condrv_info.width;
info->dwSize.Y = condrv_info.height;
@@ -755,7 +765,7 @@ COORD WINAPI DECLSPEC_HOTPATCH GetLargestConsoleWindowSize( HANDLE handle )
BOOL WINAPI DECLSPEC_HOTPATCH GetNumberOfConsoleInputEvents( HANDLE handle, DWORD *count )
{
struct condrv_input_info info;
- if (!DeviceIoControl( handle, IOCTL_CONDRV_GET_INPUT_INFO, NULL, 0, &info, sizeof(info), NULL, NULL ))
+ if (!console_ioctl( handle, IOCTL_CONDRV_GET_INPUT_INFO, NULL, 0, &info, sizeof(info), NULL ))
return FALSE;
*count = info.input_count;
return TRUE;
@@ -784,7 +794,7 @@ BOOL WINAPI DECLSPEC_HOTPATCH PeekConsoleInputW( HANDLE handle, INPUT_RECORD *bu
DWORD length, DWORD *count )
{
DWORD read;
- if (!DeviceIoControl( handle, IOCTL_CONDRV_PEEK, NULL, 0, buffer, length * sizeof(*buffer), &read, NULL ))
+ if (!console_ioctl( handle, IOCTL_CONDRV_PEEK, NULL, 0, buffer, length * sizeof(*buffer), &read ))
return FALSE;
if (count) *count = read / sizeof(*buffer);
return TRUE;
More information about the wine-cvs
mailing list