71 wchar_t pipe_name[MAX_PATH];
72 swprintf(pipe_name, MAX_PATH, L
"\\\\.\\pipe\\conpty-lldb-%d-%p",
73 GetCurrentProcessId(),
this);
75 CreateNamedPipeW(pipe_name, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED,
76 PIPE_TYPE_BYTE | PIPE_WAIT, 1, 4096, 4096, 0,
nullptr);
77 if (out_read == INVALID_HANDLE_VALUE)
78 return llvm::errorCodeToError(
79 std::error_code(GetLastError(), std::system_category()));
80 SECURITY_ATTRIBUTES write_sa = {
sizeof(SECURITY_ATTRIBUTES),
nullptr, TRUE};
81 out_write = CreateFileW(pipe_name, GENERIC_WRITE, 0,
82 inheritable ? &write_sa :
nullptr, OPEN_EXISTING,
83 FILE_ATTRIBUTE_NORMAL,
nullptr);
84 if (out_write == INVALID_HANDLE_VALUE) {
85 CloseHandle(out_read);
86 out_read = INVALID_HANDLE_VALUE;
87 return llvm::errorCodeToError(
88 std::error_code(GetLastError(), std::system_category()));
91 return llvm::Error::success();
100 return llvm::make_error<llvm::StringError>(
"ConPTY is not available",
101 llvm::errc::io_error);
104 wchar_t pipe_name[MAX_PATH];
105 swprintf(pipe_name, MAX_PATH, L
"\\\\.\\pipe\\conpty-lldb-%d-%p",
106 GetCurrentProcessId(),
this);
107 HANDLE hOutputRead = INVALID_HANDLE_VALUE;
108 HANDLE hOutputWrite = INVALID_HANDLE_VALUE;
112 HANDLE hInputRead = INVALID_HANDLE_VALUE;
113 HANDLE hInputWrite = INVALID_HANDLE_VALUE;
114 if (!CreatePipe(&hInputRead, &hInputWrite,
nullptr, 0)) {
115 CloseHandle(hOutputRead);
116 CloseHandle(hOutputWrite);
117 return llvm::errorCodeToError(
118 std::error_code(GetLastError(), std::system_category()));
121 COORD consoleSize{80, 25};
125 int cursorRow = consoleSize.Y;
127 CONSOLE_SCREEN_BUFFER_INFO csbi;
128 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) {
130 static_cast<SHORT
>(csbi.srWindow.Right - csbi.srWindow.Left + 1),
131 static_cast<SHORT
>(csbi.srWindow.Bottom - csbi.srWindow.Top + 1)};
132 cursorRow = csbi.dwCursorPosition.Y - csbi.srWindow.Top + 1;
133 cursorCol = csbi.dwCursorPosition.X + 1;
135 HPCON hPC = INVALID_HANDLE_VALUE;
137 kernel32.CreatePseudoConsole(consoleSize, hInputRead, hOutputWrite,
139 CloseHandle(hInputRead);
140 CloseHandle(hOutputWrite);
143 CloseHandle(hInputWrite);
144 CloseHandle(hOutputRead);
145 return llvm::make_error<llvm::StringError>(
146 "Failed to create Windows ConPTY pseudo terminal",
147 llvm::errc::io_error);
160 llvm::SmallString<32> response =
161 llvm::formatv(
"\x1b[{0};{1}R", cursorRow, cursorCol).sstr<32>();
163 WriteFile(
m_conpty_input, response.data(), response.size(), &nwritten,
167 return llvm::Error::success();
219 SECURITY_ATTRIBUTES sa = {
sizeof(SECURITY_ATTRIBUTES),
nullptr, TRUE};
220 HANDLE hStdinRead = INVALID_HANDLE_VALUE;
221 HANDLE hStdinWrite = INVALID_HANDLE_VALUE;
222 if (!CreatePipe(&hStdinRead, &hStdinWrite, &sa, 0))
223 return llvm::errorCodeToError(
224 std::error_code(GetLastError(), std::system_category()));
226 SetHandleInformation(hStdinWrite, HANDLE_FLAG_INHERIT, 0);
228 HANDLE hStdoutRead = INVALID_HANDLE_VALUE;
229 HANDLE hStdoutWrite = INVALID_HANDLE_VALUE;
231 CloseHandle(hStdinRead);
232 CloseHandle(hStdinWrite);
241 return llvm::Error::success();