#define WIN32_LEAN_AND_MEAN #include int starter_entry() { int i; STARTUPINFOW si; PROCESS_INFORMATION pi; int cmdline_length; WCHAR * p; int argc; int * start_index_of_arguments; int * end_index_of_arguments; WCHAR * cmdline_copy; WCHAR ** argv; WCHAR * subprocess_cmdline = NULL; WCHAR * PipeName; HANDLE hpipeClient; SECURITY_ATTRIBUTES sa; BOOL f; for(i = 0; i < sizeof(STARTUPINFOW); i++){ *((volatile char *)(&si) + i ) = 0; } si.cb = sizeof(STARTUPINFOW); for(i = 0; i < sizeof(PROCESS_INFORMATION); i++){ *((volatile char *)(&pi) + i ) = 0; } LPWSTR cmdline = GetCommandLineW(); //get argc and length of command line string p = cmdline; i = 0; while(*p){ if(*p == L'"'){ i++; p++; while(*p != L'"' && *p){ p++; } if(!*p){ //error : unbalanced double quote goto error_ret; break; }else{ //*p == L'"' p++; continue; } }else if(*p != L' '){ i++; while(*p != L' ' && *p){ p++; } if(!*p){ //end of string break; }else{ //*p == L' ' continue; } }else{ //*p == L' ' p++; continue; } } argc = i; cmdline_length = p - cmdline; //get argv start_index_of_arguments = (int *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, argc * sizeof(int)); end_index_of_arguments = (int *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, argc * sizeof(int)); p = cmdline; i = 0; while(*p){ if(*p == L'"'){ i++; p++; start_index_of_arguments[i - 1] = p - cmdline; while(*p != L'"' && *p){ p++; } end_index_of_arguments[i - 1] = p - cmdline; if(!*p){ //error : unbalanced double quote goto error_ret; break; }else{ //*p == L'"' p++; continue; } }else if(*p != L' '){ i++; start_index_of_arguments[i - 1] = p - cmdline; while(*p != L' ' && *p){ p++; } end_index_of_arguments[i - 1] = p - cmdline; if(!*p){ //end of string break; }else{ //*p == L' ' continue; } }else{ //*p == L' ' p++; continue; } } cmdline_copy = (WCHAR * )HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WCHAR) * (cmdline_length + 1)); for(i = 0; i < cmdline_length + 1; i++){ cmdline_copy[i] = cmdline[i]; } for(i = 0; i < argc; i++){ cmdline_copy[end_index_of_arguments[i]] = L'\0'; } argv = (WCHAR **)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WCHAR *) * argc); for(i = 0; i < argc; i++){ argv[i] = cmdline_copy + start_index_of_arguments[i]; } //get subprocess command line p = cmdline; i = 0; while(*p){ if(*p == L'"'){ if(i == 2){ subprocess_cmdline = p; break; } i++; p++; while(*p != L'"' && *p){ p++; } if(!*p){ goto error_ret; //error : unbalanced double quote break; }else{ //*p == L'"' p++; continue; } }else if(*p != L' '){ if(i == 2){ subprocess_cmdline = p; break; } i++; while(*p != L' ' && *p){ p++; } if(!*p){ //end of string break; }else{ //*p == L' ' continue; } }else{ //*p == L' ' p++; continue; } } if(!subprocess_cmdline){ //error : goto error_ret; } //create client side of the named pipe PipeName = argv[1]; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; hpipeClient = CreateFileW( PipeName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, OPEN_EXISTING, 0, NULL); if(hpipeClient == INVALID_HANDLE_VALUE){ //error goto error_ret; } SetHandleInformation(hpipeClient, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT); si.hStdError = hpipeClient; si.hStdOutput = hpipeClient; si.hStdInput = hpipeClient; si.dwFlags |= STARTF_USESTDHANDLES; // f = CreateProcessW(NULL, subprocess_cmdline, // command line NULL, // process security attributes NULL, // primary thread security attributes TRUE, // handles are inherited DETACHED_PROCESS, // creation flags NULL, // use parent's environment NULL, // use parent's current directory &si, // STARTUPINFO pointer &pi); // receives PROCESS_INFORMATION if(!f){ //error goto error_ret; } error_ret: return 0; }