71 return llvm::make_error<llvm::StringError>(
"ConPTY is not available",
72 llvm::errc::io_error);
78 HANDLE hInputRead = INVALID_HANDLE_VALUE;
79 HANDLE hInputWrite = INVALID_HANDLE_VALUE;
80 HANDLE hOutputRead = INVALID_HANDLE_VALUE;
81 HANDLE hOutputWrite = INVALID_HANDLE_VALUE;
83 wchar_t pipe_name[MAX_PATH];
84 swprintf(pipe_name, MAX_PATH, L
"\\\\.\\pipe\\conpty-lldb-%d-%p",
85 GetCurrentProcessId(),
this);
90 CreateNamedPipeW(pipe_name, PIPE_ACCESS_INBOUND | FILE_FLAG_OVERLAPPED,
91 PIPE_TYPE_BYTE | PIPE_WAIT, 1, 4096, 4096, 0, NULL);
92 hOutputWrite = CreateFileW(pipe_name, GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
93 FILE_ATTRIBUTE_NORMAL, NULL);
95 if (!CreatePipe(&hInputRead, &hInputWrite, NULL, 0))
96 return llvm::errorCodeToError(
97 std::error_code(GetLastError(), std::system_category()));
99 COORD consoleSize{80, 25};
100 HPCON hPC = INVALID_HANDLE_VALUE;
101 hr =
kernel32.CreatePseudoConsole(consoleSize, hInputRead, hOutputWrite, 0,
103 CloseHandle(hInputRead);
104 CloseHandle(hOutputWrite);
107 CloseHandle(hInputWrite);
108 CloseHandle(hOutputRead);
109 return llvm::make_error<llvm::StringError>(
110 "Failed to create Windows ConPTY pseudo terminal",
111 llvm::errc::io_error);
114 DWORD mode = PIPE_NOWAIT;
115 SetNamedPipeHandleState(hOutputRead, &mode, NULL, NULL);
121 return llvm::Error::success();