1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
|
// Thierry Bremard
// spawner code
// to get child process output to http client under apache cgi modules
// January 2010
#include <custom/all.h>
#define bzero(a) memset(a,0,sizeof(a)) //easier -- shortcut
BOOL IsWinNT(void);
void ErrorMessage(char *str);
BOOL IsWinNT(void) //check if we're running NT
{
OSVERSIONINFO osv;
osv.dwOSVersionInfoSize = sizeof(osv);
GetVersionEx(&osv);
return (osv.dwPlatformId == VER_PLATFORM_WIN32_NT);
}
void ErrorMessage(char *str) //display detailed error info
{
LPVOID msg;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &msg,
0, NULL );
printf("%s: %s\n",str,msg);
LocalFree(msg);
}
void ReadProcessStdout(HANDLE read_stdout)
{
char buffer[1024];
unsigned long bread; //bytes read
unsigned long avail;
bzero(buffer);
PeekNamedPipe(read_stdout,buffer,1023,&bread,&avail,NULL);
//check to see if there is any data to read from stdout
if (bread != 0)
{
if(!ReadFile(read_stdout,buffer,4,&bread,NULL)) //read the stdout pipe
{
puts("Error reading the stdout pipe in the thread");
}
// prints on stdout the output of process
fwrite(buffer,bread,1, stdout);
}
return 0;
}
int SpawnProcess(void)
{
char buf[1024]; //i/o buffer
int len;
char *app_spawned;
STARTUPINFO si;
SECURITY_ATTRIBUTES sa;
SECURITY_DESCRIPTOR sd; //security information for pipes
PROCESS_INFORMATION pi;
HANDLE newstdin,newstdout,write_stdin; //pipe handles
unsigned long exit=0; //process exit code
unsigned long bread; //bytes read
unsigned long avail; //bytes available
BOOL read;
HANDLE read_stdout;
BOOL PROCESS_ON, bValue ;
LPTSTR lpCommandLine ;
if (IsWinNT()) //initialize security descriptor (Windows NT)
{
InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, true, NULL, false);
sa.lpSecurityDescriptor = &sd;
}
else
{
sa.lpSecurityDescriptor = NULL;
}
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = true; //allow inheritable handles
if (!CreatePipe(&newstdin,&write_stdin,&sa,0)) //create stdin pipe
{
ErrorMessage("CreatePipe");
return 0;
}
if (!CreatePipe(&read_stdout,&newstdout,&sa,0)) //create stdout pipe
{
ErrorMessage("CreatePipe");
CloseHandle(newstdin);
CloseHandle(write_stdin);
return 0;
}
GetStartupInfo(&si); //set startupinfo for the spawned process
/*
The dwFlags member tells CreateProcess how to make the process.
STARTF_USESTDHANDLES validates the hStd* members. STARTF_USESHOWWINDOW
validates the wShowWindow member.
*/
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.hStdOutput = newstdout;
si.hStdError = newstdout; //set the new handles for the child process
si.hStdInput = newstdin;
//spawn the child process
app_spawned="D:\\Prog\\google\\searcher_6\\searcher_5\\searcher.exe";
lpCommandLine = NULL;/*"searcher.exe download&mp3"*/;
lpCommandLine = "searcher.exe \"president&sarkozy\"";
bValue = CreateProcess(app_spawned, lpCommandLine ,
NULL,
NULL,
TRUE,
0, // No creation flags CREATE_NEW_CONSOLE,
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi); // Pointer to PROCESS_INFORMATION structure
if (! bValue)
{
ErrorMessage("CreateProcess");
CloseHandle(newstdin);
CloseHandle(newstdout);
CloseHandle(read_stdout);
CloseHandle(write_stdin);
return 0;
}
PROCESS_ON=1;
while(PROCESS_ON)
{
GetExitCodeProcess(pi.hProcess,&exit); //while the process is running
if (exit != STILL_ACTIVE)
{
PROCESS_ON=0;
}
ReadProcessStdout(read_stdout);
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(newstdin); //clean stuff up
CloseHandle(newstdout);
CloseHandle(read_stdout);
CloseHandle(write_stdin);
return 1;
}
/*
int main()
{
SpawnProcess();
return 0;
}
*/ |
Partager