85 bool const include_std_handles
94 size_t handle_count = 0;
95 for (handle_count =
_nhandle; handle_count != 0 &&
_osfile(handle_count - 1) != 0; --handle_count)
102 size_t const handle_data_header_size =
sizeof(
int);
103 size_t const handle_data_element_size =
sizeof(
char) +
sizeof(
intptr_t);
105 unsigned short const handle_data_size =
static_cast<unsigned short>(
106 handle_data_header_size +
107 handle_count * handle_data_element_size);
109 __crt_unique_heap_ptr<BYTE>
handle_data(_calloc_crt_t(
BYTE, handle_data_size));
113 *
reinterpret_cast<int*
>(
handle_data.get()) =
static_cast<int>(handle_count);
115 auto const first_flags =
reinterpret_cast<char*
>(
handle_data.get() +
sizeof(
int));
116 auto const first_handle =
reinterpret_cast<intptr_t UNALIGNED*
>(first_flags + (handle_count *
sizeof(
char)));
119 auto flags_it = first_flags;
120 auto handle_it = first_handle;
121 for (
size_t i = 0;
i != handle_count; ++
i, ++flags_it, ++handle_it)
137 if (!include_std_handles)
139 flags_it = first_flags;
140 handle_it = first_handle;
141 for (
size_t i = 0;
i !=
__min(handle_count, 3); ++
i, ++flags_it, ++handle_it)
149 *
size = handle_data_size;
167template <
typename Character>
171 Character
const*
const*
const arguments,
172 Character
const*
const*
const environment
182 __crt_unique_heap_ptr<Character> command_line;
183 __crt_unique_heap_ptr<Character> environment_block;
184 if (traits::pack_command_line_and_environment(
187 command_line.get_address_of(),
188 environment_block.get_address_of()
195 size_t handle_data_size;
199 DWORD creation_flags = 0;
209 startup_info.
cb =
sizeof(startup_info);
214 BOOL const create_process_status = traits::create_process(
221 environment_block.get(),
226 __crt_unique_handle process_handle(process_info.
hProcess);
227 __crt_unique_handle thread_handle(process_info.
hThread);
229 if (!create_process_status)
266 return reinterpret_cast<intptr_t>(process_handle.detach());
272template <
typename Character>
276 Character
const*
const*
const arguments,
277 Character
const*
const*
const environment
288 Character
const*
const final_backslash = traits::tcsrchr(
file_name,
'\\');
289 Character
const*
const final_slash = traits::tcsrchr(
file_name,
'/');
291 Character
const* mutated_file_name =
file_name;
292 Character
const* end_of_directory = final_backslash;
295 if (!final_backslash)
297 Character
const*
const final_colon = traits::tcsrchr(
file_name,
':');
300 end_of_directory = final_colon;
306 size_t const file_name_size = traits::tcslen(
file_name) + 3;
307 __crt_unique_heap_ptr<Character>
buffer(_calloc_crt_t(Character, file_name_size));
311 static Character
const dot_slash[] = {
'.',
'\\',
'\0' };
315 mutated_file_name =
buffer.detach();
316 end_of_directory = mutated_file_name + 2;
320 else if (!final_backslash || final_slash > final_backslash)
322 end_of_directory = final_slash;
326 __crt_unique_heap_ptr<Character const>
const mutated_file_name_cleanup(
file_name == mutated_file_name
328 : mutated_file_name);
330 if (traits::tcsrchr(end_of_directory,
'.'))
333 if (traits::taccess_s(mutated_file_name, 0) == 0)
341 size_t const buffer_size = traits::tcslen(mutated_file_name) + 5;
342 __crt_unique_heap_ptr<Character>
const buffer(_calloc_crt_t(Character,
buffer_size));
349 typedef Character
const extension_type[5];
350 static extension_type
const extensions[4] =
352 {
'.',
'c',
'o',
'm',
'\0' },
353 {
'.',
'e',
'x',
'e',
'\0' },
354 {
'.',
'b',
'a',
't',
'\0' },
355 {
'.',
'c',
'm',
'd',
'\0' }
360 extension_type
const*
const first_extension = extensions;
361 extension_type
const*
const last_extension = first_extension +
_countof(extensions);
362 for (
auto it = first_extension; it != last_extension; ++it)
364 _ERRCHECK(traits::tcscpy_s(extension_buffer, 5, *it));
366 if (traits::taccess_s(
buffer.get(), 0) == 0)
381 char const*
const*
const arguments
389 char const*
const*
const arguments,
390 char const*
const*
const environment
399 char const*
const*
const arguments
408 char const*
const*
const arguments,
409 char const*
const*
const environment
419 wchar_t const*
const*
const arguments
427 wchar_t const*
const*
const arguments,
428 wchar_t const*
const*
const environment
437 wchar_t const*
const*
const arguments
446 wchar_t const*
const*
const arguments,
447 wchar_t const*
const*
const environment
@ __acrt_lowio_index_lock
void __cdecl __acrt_errno_map_os_error(unsigned long)
#define _VALIDATE_RETURN(expr, errorcode, retexpr)
#define INVALID_HANDLE_VALUE
BOOL WINAPI GetExitCodeProcess(IN HANDLE hProcess, IN LPDWORD lpExitCode)
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define _VALIDATE_CLEAR_OSSERR_RETURN(expr, errorcode, retexpr)
#define _VALIDATE_RETURN_NOEXC(expr, errorcode, retexpr)
static bool accumulate_inheritable_handles(BYTE **const data, size_t *const size, bool const include_std_handles)
static bool __cdecl should_create_unicode_environment(char)
intptr_t __cdecl _wexecv(wchar_t const *const file_name, wchar_t const *const *const arguments)
intptr_t __cdecl _wspawnv(int const mode, wchar_t const *const file_name, wchar_t const *const *const arguments)
static intptr_t __cdecl common_spawnv(int const mode, Character const *const file_name, Character const *const *const arguments, Character const *const *const environment)
intptr_t __cdecl _execv(char const *const file_name, char const *const *const arguments)
intptr_t __cdecl _execve(char const *const file_name, char const *const *const arguments, char const *const *const environment)
intptr_t __cdecl _wexecve(wchar_t const *const file_name, wchar_t const *const *const arguments, wchar_t const *const *const environment)
static intptr_t __cdecl execute_command(int const mode, Character const *const file_name, Character const *const *const arguments, Character const *const *const environment)
intptr_t __cdecl _wspawnve(int const mode, wchar_t const *const file_name, wchar_t const *const *const arguments, wchar_t const *const *const environment)
intptr_t __cdecl _spawnv(int const mode, char const *const file_name, char const *const *const arguments)
intptr_t __cdecl _spawnve(int const mode, char const *const file_name, char const *const *const arguments, char const *const *const environment)
wchar_t const *const size_t const buffer_size
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
static BOOL handle_data(struct parsed_symbol *sym)
DWORD WINAPI GetLastError(void)
#define CREATE_UNICODE_ENVIRONMENT