54 HANDLE hInputRead = NULL;
55 HANDLE hInputWrite = NULL;
56 HANDLE hOutputRead = NULL;
57 HANDLE hOutputWrite = NULL;
65 SECURITY_ATTRIBUTES saAttr = {0};
66 saAttr.nLength =
sizeof(SECURITY_ATTRIBUTES);
67 saAttr.bInheritHandle = TRUE;
68 saAttr.lpSecurityDescriptor = NULL;
70 if (!CreatePipe(&hInputRead, &hInputWrite, &saAttr, 0)) {
73 "[PTY] Failed to create input pipe. Error: %lu\n",
78 if (!CreatePipe(&hOutputRead, &hOutputWrite, &saAttr, 0)) {
81 "[PTY] Failed to create output pipe. Error: %lu\n",
88 COORD terminalSize = {(SHORT)columns, (SHORT)rows};
89 HRESULT hr = CreatePseudoConsole(terminalSize, hInputRead, hOutputWrite, 0, &state->
hPC);
92 (void)fprintf(stderr,
"[PTY] Failed to create ConPTY. HRESULT: 0x%08lX\n", hr);
130 SIZE_T attr_list_size = 0;
131 InitializeProcThreadAttributeList(NULL, 1, 0, &attr_list_size);
140 LPPROC_THREAD_ATTRIBUTE_LIST attr_list =
141 (LPPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, attr_list_size);
143 if (attr_list == NULL) {
144 (void)fprintf(stderr,
"[PTY] Failed to allocate process thread attribute list.\n");
148 if (!InitializeProcThreadAttributeList(attr_list, 1, 0, &attr_list_size)) {
151 "[PTY] Failed to initialize attribute list. Error: %lu\n",
153 HeapFree(GetProcessHeap(), 0, attr_list);
165 if (!UpdateProcThreadAttribute(
168 PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE,
175 "[PTY] Failed to set ConPTY process attribute. Error: %lu\n",
177 DeleteProcThreadAttributeList(attr_list);
178 HeapFree(GetProcessHeap(), 0, attr_list);
194 STARTUPINFOEXW si = {0};
195 si.StartupInfo.cb =
sizeof(STARTUPINFOEXW);
196 si.lpAttributeList = attr_list;
216 PROCESS_INFORMATION pi = {0};
217 BOOL success = CreateProcessW(
219 (LPWSTR)command_line,
223 EXTENDED_STARTUPINFO_PRESENT,
237 DeleteProcThreadAttributeList(attr_list);
238 HeapFree(GetProcessHeap(), 0, attr_list);
241 (void)fprintf(stderr,
"[PTY] CreateProcessW failed. Error: %lu\n", GetLastError());
b32 pty_init(struct pty_state_t *state, u16 columns, u16 rows)
Initializes a Pseudo Console and establishes bidirectional communication pipes.
b32 pty_spawn(struct pty_state_t *state, LPCWSTR command_line)
Spawns a shell process and attaches it to an initialized Pseudo Console.