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