Le 20/02/2022 à 14:03, Jacek Caban a écrit :
Hi Eric,
On 2/9/22 16:44, Eric Pouech wrote:
Signed-off-by: Eric Pouecheric.pouech@gmail.com
dlls/kernelbase/console.c | 32 ++++++++++++++- include/wine/condrv.h | 1 programs/conhost/conhost.c | 93 +++++++++++++++++++++++++++++++++++--------- programs/conhost/conhost.h | 1 server/console.c | 1 5 files changed, 107 insertions(+), 21 deletions(-)
diff --git a/dlls/kernelbase/console.c b/dlls/kernelbase/console.c index a7eeb439232..52949ab7541 100644 --- a/dlls/kernelbase/console.c +++ b/dlls/kernelbase/console.c @@ -1598,8 +1598,36 @@ BOOL WINAPI ReadConsoleW( HANDLE handle, void *buffer, DWORD length, DWORD *coun return FALSE; } - ret = console_ioctl( handle, IOCTL_CONDRV_READ_CONSOLE, NULL, 0, buffer, - length * sizeof(WCHAR), count ); + if (reserved) + { + CONSOLE_READCONSOLE_CONTROL* crc = reserved; + char *tmp;
+ if (crc->nLength != sizeof(*crc) || crc->nInitialChars >= length) + { + SetLastError( ERROR_INVALID_PARAMETER ); + return FALSE; + } + if (!(tmp = HeapAlloc( GetProcessHeap(), 0, sizeof(DWORD) + crc->nInitialChars * sizeof(WCHAR) ))) + { + SetLastError( ERROR_NOT_ENOUGH_MEMORY ); + return FALSE; + }
+ memcpy( tmp, &crc->dwCtrlWakeupMask, sizeof(DWORD) ); + memcpy( tmp + sizeof(DWORD), buffer, crc->nInitialChars * sizeof(WCHAR) ); + ret = console_ioctl( handle, IOCTL_CONDRV_READ_COMPLETION, + tmp, sizeof(DWORD) + crc->nInitialChars
- sizeof(WCHAR),
+ buffer, length * sizeof(WCHAR), + count ); + crc->dwConsoleKeyState = 0; + HeapFree( GetProcessHeap(), 0, tmp ); + } + else + { + ret = console_ioctl( handle, IOCTL_CONDRV_READ_CONSOLE, NULL, 0, buffer, + length * sizeof(WCHAR), count ); + } if (ret) *count /= sizeof(WCHAR); return ret;
Could we just use IOCTL_CONDRV_READ_CONSOLE in both cases and distinguish the actual mode by checking input size in conhost?
that's possible ;-) (first version of the patch were written that way)
but there's a different structure on input and on output between the two modes. We need to differentiate anyway in conhost between the two modes.
I thought it was clearer this way
I also considered the other way around (only using the new mode) but thought the extra copy on return wasn't worth it
Also, it would be interesting to try to add a test for this, see conhost/tests/tty.c for an example of other ReadConsole() tests. A fair warning: it may prove to be tricky. When I wrote those tests, I observed some weird or inconsistent Windows behaviour. Pseudo consoles were not matured on Windows back then, hopefully things will be better now. There is a huge chance that it's not one of those cases and it will be straightforward. If things get ugly, I'm fine skipping tests, but it's worth to try.
ok I'll give it a try