27 #if !defined(__MINGW32__)
41 PLARGE_INTEGER lpFileSize);
48 SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX |
49 SEM_NOOPENFILEERRORBOX);
50 #if !defined(__MINGW32__)
51 _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);
52 _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG);
55 _setmode(0, _O_BINARY);
56 _setmode(1, _O_BINARY);
57 _setmode(2, _O_BINARY);
60 _set_fmode(_O_BINARY);
66 setvbuf(
stdout, NULL, _IONBF, 0);
67 setvbuf(
stderr, NULL, _IONBF, 0);
77 WCHAR
image[MAX_PATH + 1];
78 WCHAR
args[MAX_PATH * 2];
80 PROCESS_INFORMATION pi;
88 if (GetTempPathW(
sizeof(
path) /
sizeof(WCHAR), (WCHAR*)&
path) == 0)
90 if (GetTempFileNameW((WCHAR*)&
path,
L"uv", 0, (WCHAR*)&
filename) == 0)
94 GENERIC_READ | GENERIC_WRITE,
98 FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_DELETE_ON_CLOSE,
103 if (!SetHandleInformation(
file, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT))
106 nul = CreateFileA(
"nul",
108 FILE_SHARE_READ | FILE_SHARE_WRITE,
111 FILE_ATTRIBUTE_NORMAL,
116 if (!SetHandleInformation(nul, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT))
119 result = GetModuleFileNameW(NULL,
121 sizeof(
image) /
sizeof(WCHAR));
126 if (_snwprintf((WCHAR*)
args,
127 sizeof(
args) /
sizeof(WCHAR),
135 if (_snwprintf((WCHAR*)
args,
136 sizeof(
args) /
sizeof(WCHAR),
144 memset((
void*)&si, 0,
sizeof(si));
146 si.dwFlags = STARTF_USESTDHANDLES;
148 si.hStdOutput =
file;
152 0, NULL, NULL, &si, &pi))
155 CloseHandle(pi.hThread);
157 SetHandleInformation(nul, HANDLE_FLAG_INHERIT, 0);
158 SetHandleInformation(
file, HANDLE_FLAG_INHERIT, 0);
162 p->process = pi.hProcess;
181 HANDLE
handles[MAXIMUM_WAIT_OBJECTS];
182 DWORD timeout_api,
result;
188 ASSERT(
n <= MAXIMUM_WAIT_OBJECTS);
190 for (
i = 0;
i <
n;
i++)
196 timeout_api = INFINITE;
201 if (
result < WAIT_OBJECT_0 +
n) {
205 if (
result == WAIT_TIMEOUT) {
216 return (
long int)
size.QuadPart;
224 fd = _open_osfhandle((
intptr_t)
p->stdio_out, _O_RDONLY | _O_TEXT);
232 while ((
r = _read(fd,
buf,
sizeof(
buf))) != 0)
246 OVERLAPPED overlapped;
251 if (
size == INVALID_FILE_SIZE)
259 memset(&overlapped, 0,
sizeof overlapped);
260 if (
size >= buffer_len)
261 overlapped.Offset =
size - buffer_len - 1;
267 while (
start-- > 0) {
287 if (!TerminateProcess(
p->process, 1))
295 if (!GetExitCodeProcess(
p->process, &exitCode))
297 return (
int)exitCode;
302 CloseHandle(
p->process);
303 CloseHandle(
p->stdio_in);
309 CONSOLE_SCREEN_BUFFER_INFO info;
317 if (!GetConsoleScreenBufferInfo(
handle, &info))
320 coord = info.dwCursorPosition;
326 if (!SetConsoleCursorPosition(
handle, coord))
329 if (!FillConsoleOutputCharacterW(
handle,