#include "stdafx.h" #include "VG-process.h" bool CommandLine2Argv(CString & cmdline, CArray & argv) { //TODO: consider space and double quote argv.RemoveAll(); cmdline.Trim(); int prev_index = 0; int current_index; while(1){ current_index = cmdline.Find(_T(" "), prev_index); if(current_index != -1){ CString arg = cmdline.Mid(prev_index, current_index - prev_index); argv.Add(arg); prev_index = current_index + 1; }else{ CString arg = cmdline.Mid(prev_index); argv.Add(arg); break; } } return true; } bool Argv2CommandLine(CArray & argv, CString & cmdline) { //TODO: consider space and double quote cmdline = _T(""); int array_size = argv.GetSize(); if(array_size){ cmdline += argv.GetAt(0); int i; for(i = 1; i < array_size; i++){ cmdline += _T(" "); cmdline += argv.GetAt(i); } } return true; } bool EnvironmentBlock2Evnp(CString & envblk, CArray & envp) { return true; } bool Evnp2EnvironmentBlock(CArray & envp, CString & envblk) { return true; } CString GetModulePath() { TCHAR zsFileName[_MAX_PATH]; //DWORD dwRes = ::GetModuleFileName(NULL, zsFileName, _MAX_PATH); DWORD dwRes = ::GetModuleFileName(AfxGetInstanceHandle(), zsFileName, _MAX_PATH); ASSERT(dwRes); CString csFilePath = zsFileName; int nFLs = csFilePath.ReverseFind(_T('\\')); if (nFLs > 0) { csFilePath.ReleaseBuffer(nFLs + 1); } return csFilePath; } bool CreateAndConnectProcess(CArray & argv, CArray & envp, CString & strPipeName, HANDLE & hpipeProcess) { CString cmdline; Argv2CommandLine(argv, cmdline); CString starter_cmdline; starter_cmdline += _T('"'); starter_cmdline += GetModulePath(); starter_cmdline += _T("\\starter.exe"); starter_cmdline += _T('"'); starter_cmdline += _T(' '); starter_cmdline += strPipeName; starter_cmdline += _T(' '); starter_cmdline += cmdline; //create namedpipe server side hpipeProcess = CreateNamedPipe( strPipeName, PIPE_ACCESS_DUPLEX,// | FILE_FLAG_FIRST_PIPE_INSTANCE, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, PIPE_UNLIMITED_INSTANCES, 4096, 4096, 10000, NULL); if(hpipeProcess == INVALID_HANDLE_VALUE){ //error TRACE(_T("CreateNamedPipe failed\n")); goto fail; } SetHandleInformation(hpipeProcess, HANDLE_FLAG_INHERIT, 0); PROCESS_INFORMATION piProcInfo; STARTUPINFO siStartInfo; BOOL bFuncRetn = FALSE; // Set up members of the PROCESS_INFORMATION structure. ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) ); // Set up members of the STARTUPINFO structure. ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) ); siStartInfo.cb = sizeof(STARTUPINFO); // Create the child process. TCHAR * p_temp_cmdline = new TCHAR[starter_cmdline.GetLength() + 1]; StrCpy(p_temp_cmdline, (LPCTSTR)starter_cmdline); bFuncRetn = CreateProcess(NULL, p_temp_cmdline, // command line NULL, // process security attributes NULL, // primary thread security attributes FALSE, // handles are not inherited DETACHED_PROCESS, // creation flags NULL, // use parent's environment NULL, // use parent's current directory &siStartInfo, // STARTUPINFO pointer &piProcInfo); // receives PROCESS_INFORMATION delete p_temp_cmdline; if (bFuncRetn == 0){ TRACE(_T("CreateProcess failed\n")); goto fail_close_pipe; } //don't need WaitForSingleObject(hProcess, INFINITE); CloseHandle(piProcInfo.hThread); CloseHandle(piProcInfo.hProcess); return true; fail_close_pipe: CloseHandle(hpipeProcess); hpipeProcess = NULL; fail: return false; }