in dotnet/tools/launcher_core_xunit/main.c [23:77]
static void LaunchProcess(int argc, char *argv[], const char *workingDir)
{
STARTUPINFO info;
PROCESS_INFORMATION pi;
BOOL r;
DWORD rc;
ZeroMemory(&info, sizeof(info));
ZeroMemory(&pi, sizeof(pi));
info.cb = sizeof(info);
char commandline[32 * 1024];
if (strchr(argv[0], ' ') != NULL)
sprintf(commandline, "\"%s\"", argv[0]);
else
strcpy(commandline, argv[0]);
for (int i = 1; i < argc; ++i)
{
strcat(commandline, " ");
if (strchr(argv[i], ' ') != NULL)
{
strcat(commandline, "\"");
strcat(commandline, argv[i]);
strcat(commandline, "\"");
}
else
{
strcat(commandline, argv[i]);
}
}
r = CreateProcess(NULL, commandline, NULL, NULL, TRUE, 0, NULL, workingDir, &info, &pi);
if (!r)
{
printf("CreateProcess failed (%d).\n", GetLastError());
exit(-1);
}
// Wait until child process exits.
WaitForSingleObject(pi.hProcess, INFINITE);
r = GetExitCodeProcess(pi.hProcess, &rc);
if (!r)
{
printf("GetExitCodeProcess failed (%d).\n", GetLastError());
exit(-1);
}
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
exit(rc);
}