Commit 2fd27f0a authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

kernel32: Use NtDeviceIoControlFile directly for IOCTL_CONDRV_READ_CONSOLE and…

kernel32: Use NtDeviceIoControlFile directly for IOCTL_CONDRV_READ_CONSOLE and IOCTL_CONDRV_WRITE_CONSOLE. Avoids messing last error for non-conhost consoles. Signed-off-by: 's avatarJacek Caban <jacek@codeweavers.com> Signed-off-by: 's avatarAlexandre Julliard <julliard@winehq.org>
parent af0ae9df
...@@ -526,6 +526,7 @@ BOOL WINAPI ReadConsoleA( HANDLE handle, LPVOID buffer, DWORD length, DWORD *ret ...@@ -526,6 +526,7 @@ BOOL WINAPI ReadConsoleA( HANDLE handle, LPVOID buffer, DWORD length, DWORD *ret
BOOL WINAPI ReadConsoleW(HANDLE hConsoleInput, LPVOID lpBuffer, BOOL WINAPI ReadConsoleW(HANDLE hConsoleInput, LPVOID lpBuffer,
DWORD nNumberOfCharsToRead, LPDWORD lpNumberOfCharsRead, LPVOID lpReserved) DWORD nNumberOfCharsToRead, LPDWORD lpNumberOfCharsRead, LPVOID lpReserved)
{ {
IO_STATUS_BLOCK io;
DWORD charsread; DWORD charsread;
LPWSTR xbuf = lpBuffer; LPWSTR xbuf = lpBuffer;
DWORD mode; DWORD mode;
...@@ -541,10 +542,10 @@ BOOL WINAPI ReadConsoleW(HANDLE hConsoleInput, LPVOID lpBuffer, ...@@ -541,10 +542,10 @@ BOOL WINAPI ReadConsoleW(HANDLE hConsoleInput, LPVOID lpBuffer,
return FALSE; return FALSE;
} }
if (DeviceIoControl(hConsoleInput, IOCTL_CONDRV_READ_CONSOLE, NULL, 0, lpBuffer, if (!NtDeviceIoControlFile(hConsoleInput, NULL, NULL, NULL, &io, IOCTL_CONDRV_READ_CONSOLE, NULL, 0, lpBuffer,
nNumberOfCharsToRead * sizeof(WCHAR), lpNumberOfCharsRead, NULL)) nNumberOfCharsToRead * sizeof(WCHAR)))
{ {
*lpNumberOfCharsRead /= sizeof(WCHAR); if (lpNumberOfCharsRead) *lpNumberOfCharsRead = io.Information / sizeof(WCHAR);
return TRUE; return TRUE;
} }
...@@ -794,6 +795,7 @@ BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumber ...@@ -794,6 +795,7 @@ BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumber
const WCHAR* psz = lpBuffer; const WCHAR* psz = lpBuffer;
CONSOLE_SCREEN_BUFFER_INFO csbi; CONSOLE_SCREEN_BUFFER_INFO csbi;
int k, first = 0, fd; int k, first = 0, fd;
IO_STATUS_BLOCK io;
TRACE("%p %s %d %p %p\n", TRACE("%p %s %d %p %p\n",
hConsoleOutput, debugstr_wn(lpBuffer, nNumberOfCharsToWrite), hConsoleOutput, debugstr_wn(lpBuffer, nNumberOfCharsToWrite),
...@@ -801,8 +803,8 @@ BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumber ...@@ -801,8 +803,8 @@ BOOL WINAPI WriteConsoleW(HANDLE hConsoleOutput, LPCVOID lpBuffer, DWORD nNumber
if (lpNumberOfCharsWritten) *lpNumberOfCharsWritten = 0; if (lpNumberOfCharsWritten) *lpNumberOfCharsWritten = 0;
if (DeviceIoControl(hConsoleOutput, IOCTL_CONDRV_WRITE_CONSOLE, (void *)lpBuffer, if (!NtDeviceIoControlFile(hConsoleOutput, NULL, NULL, NULL, &io, IOCTL_CONDRV_WRITE_CONSOLE, (void *)lpBuffer,
nNumberOfCharsToWrite * sizeof(WCHAR), NULL, 0, NULL, NULL)) nNumberOfCharsToWrite * sizeof(WCHAR), NULL, 0))
{ {
if (lpNumberOfCharsWritten) *lpNumberOfCharsWritten = nNumberOfCharsToWrite; if (lpNumberOfCharsWritten) *lpNumberOfCharsWritten = nNumberOfCharsToWrite;
return TRUE; return TRUE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment