static void LaunchProcess()

in dotnet/tools/launcher_core_nunit3/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);
}