38 #define CHILD_STDIO_SIZE(count) \
40 sizeof(unsigned char) * (count) + \
41 sizeof(uintptr_t) * (count))
43 #define CHILD_STDIO_COUNT(buffer) \
44 *((unsigned int*) (buffer))
46 #define CHILD_STDIO_CRT_FLAGS(buffer, fd) \
47 *((unsigned char*) (buffer) + sizeof(int) + fd)
49 #define CHILD_STDIO_HANDLE(buffer, fd) \
50 *((HANDLE*) ((unsigned char*) (buffer) + \
52 sizeof(unsigned char) * \
53 CHILD_STDIO_COUNT((buffer)) + \
54 sizeof(HANDLE) * (fd)))
62 #define FNOINHERIT 0x10
79 handle = GetStdHandle(STD_INPUT_HANDLE);
81 SetHandleInformation(
handle, HANDLE_FLAG_INHERIT, 0);
83 handle = GetStdHandle(STD_OUTPUT_HANDLE);
85 SetHandleInformation(
handle, HANDLE_FLAG_INHERIT, 0);
87 handle = GetStdHandle(STD_ERROR_HANDLE);
89 SetHandleInformation(
handle, HANDLE_FLAG_INHERIT, 0);
99 uv_pipe_t* server_pipe, HANDLE* child_pipe_ptr,
unsigned int flags) {
101 SECURITY_ATTRIBUTES sa;
102 DWORD server_access = 0;
103 DWORD client_access = 0;
112 server_access |= PIPE_ACCESS_OUTBOUND | PIPE_ACCESS_INBOUND;
113 client_access |= GENERIC_READ | FILE_WRITE_ATTRIBUTES;
116 server_access |= PIPE_ACCESS_INBOUND;
117 client_access |= GENERIC_WRITE | FILE_READ_ATTRIBUTES;
130 sa.nLength =
sizeof sa;
131 sa.lpSecurityDescriptor = NULL;
132 sa.bInheritHandle =
TRUE;
135 child_pipe = CreateFileA(pipe_name,
140 overlap ? FILE_FLAG_OVERLAPPED : 0,
143 err = GetLastError();
151 BOOL r = GetNamedPipeHandleState(child_pipe,
159 assert(
mode == (PIPE_READMODE_BYTE | PIPE_WAIT));
165 if (!ConnectNamedPipe(server_pipe->handle, NULL)) {
166 if (GetLastError() != ERROR_PIPE_CONNECTED) {
167 err = GetLastError();
178 *child_pipe_ptr = child_pipe;
187 CloseHandle(child_pipe);
195 HANDLE current_process;
207 return ERROR_INVALID_HANDLE;
210 current_process = GetCurrentProcess();
212 if (!DuplicateHandle(current_process,
218 DUPLICATE_SAME_ACCESS)) {
220 return GetLastError();
232 return ERROR_INVALID_HANDLE;
243 SECURITY_ATTRIBUTES sa;
245 sa.nLength =
sizeof sa;
246 sa.lpSecurityDescriptor = NULL;
247 sa.bInheritHandle =
TRUE;
251 FILE_SHARE_READ | FILE_SHARE_WRITE,
257 return GetLastError();
274 if (count < 0 || count > 255) {
276 return ERROR_NOT_SUPPORTED;
277 }
else if (
count < 3) {
285 return ERROR_OUTOFMEMORY;
298 if (i < options->stdio_count) {
314 DWORD
access = (
i == 0) ? FILE_GENERIC_READ :
315 FILE_GENERIC_WRITE | FILE_READ_ATTRIBUTES;
335 assert(fdopt.
data.
stream->type == UV_NAMED_PIPE);
360 if (fdopt.
data.
fd <= 2 &&
err == ERROR_INVALID_HANDLE) {
369 switch (GetFileType(child_handle)) {
379 case FILE_TYPE_REMOTE:
383 case FILE_TYPE_UNKNOWN:
384 if (GetLastError() != 0) {
385 err = GetLastError();
386 CloseHandle(child_handle);
404 unsigned char crt_flags;
408 if (
stream->type == UV_TTY) {
411 }
else if (
stream->type == UV_NAMED_PIPE &&
424 err = ERROR_NOT_SUPPORTED;
475 SetHandleInformation(
handle, HANDLE_FLAG_INHERIT, 0);