49 DWORD bytesAvailable = 0;
50 if (PeekNamedPipe(hStdin,
nullptr, 0,
nullptr, &bytesAvailable,
nullptr)) {
51 if (bytesAvailable > 0)
56 INPUT_RECORD inputRecord;
58 if (!PeekConsoleInput(hStdin, &inputRecord, 1, &numRead))
59 return llvm::createStringError(
"failed to peek standard input");
64 if (inputRecord.EventType == KEY_EVENT &&
65 inputRecord.Event.KeyEvent.bKeyDown &&
66 inputRecord.Event.KeyEvent.uChar.AsciiChar != 0)
69 if (!ReadConsoleInput(hStdin, &inputRecord, 1, &numRead))
70 return llvm::createStringError(
"failed to read standard input");
87 bool isConsole = GetConsoleMode(hStdin, &consoleMode) != 0;
92 DWORD oldConsoleMode = consoleMode;
93 SetConsoleMode(hStdin, consoleMode & ~ENABLE_LINE_INPUT & ~ENABLE_ECHO_INPUT);
97 std::lock_guard<std::mutex> guard(
m_mutex);
102 DWORD result = WaitForMultipleObjects(2, waitHandles, FALSE, INFINITE);
106 case WAIT_OBJECT_0: {
109 if (!hasInputOrErr) {
112 "failed to process debuggee's IO: {0}");
123 if (!ReadFile(hStdin, &ch, 1, &read,
nullptr) || read != 1)
132 case WAIT_OBJECT_0 + 1: {
149 SetConsoleMode(hStdin, oldConsoleMode);