2015-08-21 21:45:50 +00:00
|
|
|
/*
|
|
|
|
* Demonstrates a conhost hang that occurs when widening the console buffer
|
|
|
|
* while selection is in progress. The problem affects the new Windows 10
|
|
|
|
* console, not the "legacy" console mode that Windows 10 also includes.
|
|
|
|
*
|
|
|
|
* First tested with:
|
|
|
|
* - Windows 10.0.10240
|
|
|
|
* - conhost.exe version 10.0.10240.16384
|
|
|
|
* - ConhostV1.dll version 10.0.10240.16384
|
|
|
|
* - ConhostV2.dll version 10.0.10240.16391
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <windows.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <wchar.h>
|
|
|
|
#include "../shared/DebugClient.cc"
|
2015-08-23 03:56:24 +00:00
|
|
|
#include "TestUtil.cc"
|
2015-08-21 21:45:50 +00:00
|
|
|
|
|
|
|
const int SC_CONSOLE_MARK = 0xFFF2;
|
|
|
|
const int SC_CONSOLE_SELECT_ALL = 0xFFF5;
|
|
|
|
|
2015-08-23 03:56:24 +00:00
|
|
|
int main(int argc, char *argv[]) {
|
|
|
|
if (argc == 1) {
|
|
|
|
startChildProcess(L"CHILD");
|
|
|
|
return 0;
|
2015-08-21 21:45:50 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
setWindowPos(0, 0, 1, 1);
|
|
|
|
setBufferSize(80, 25);
|
|
|
|
setWindowPos(0, 0, 80, 25);
|
|
|
|
|
|
|
|
countDown(5);
|
|
|
|
|
|
|
|
SendMessage(GetConsoleWindow(), WM_SYSCOMMAND, SC_CONSOLE_SELECT_ALL, 0);
|
|
|
|
Sleep(2000);
|
|
|
|
|
|
|
|
// This API call does not return. In the console window, the "Select All"
|
|
|
|
// operation appears to end. The console window becomes non-responsive,
|
|
|
|
// and the conhost.exe process must be killed from the Task Manager.
|
|
|
|
// (Killing this test program or closing the console window is not
|
|
|
|
// sufficient.)
|
|
|
|
//
|
|
|
|
// The same hang occurs whether line resizing is off or on. It happens
|
2015-08-24 07:00:08 +00:00
|
|
|
// with both "Mark" and "Select All". Calling setBufferSize with the
|
|
|
|
// existing buffer size does not hang, but calling it with only a changed
|
|
|
|
// buffer height *does* hang. Calling setWindowPos does not hang.
|
2015-08-21 21:45:50 +00:00
|
|
|
setBufferSize(120, 25);
|
|
|
|
|
|
|
|
printf("Done...\n");
|
|
|
|
Sleep(2000);
|
|
|
|
}
|