CreateProcess CreatePipe - gather Stderr output not working
Im trying to create a process and send the output to a pipe which I
read after the
process runs so I can see whats wrong. In this case Im trying to call
it with pscp
(which is why I hardcoded the error Im looking for btw). Ive tried
googling this and
Ive seen many variations of this code, but so far I cant get it to
work the way I was
expecting it to.
In my debug output, ReadFile Avail <0> is as far as it gets and then
'hangs'.
I know its hanging because when I do it in the command line It also
hangs with the
string Im looking for, "Server refused our key", but I cant see why
the following code
isnt getting my Stderr output as I want. And yes, Im a newbie still.
Id appreciate any help on getting this to work and bulletproofing it
more also.
Thanks
bool doSystem(LPSTR cmd)
{
HANDLE read_stderr, wr_stderr;
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si); // Must set the size of structure
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = FALSE;
sa.lpSecurityDescriptor = NULL;
if (!CreatePipe(&read_stderr, &wr_stderr, &sa, 0)) //create
stderr pipe
{
dmsg(TERR, "CreatePipe %d", GetLastError());
return false;
}
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.hStdError = wr_stderr;
BOOL ret = CreateProcess(NULL, cmd, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, //CREATE_NO_WINDOW,
NULL, NULL, &si, &pi);
if (!ret)
{
dmsg(TERR, "CreateProcess FAILED");
return false;
}
//WaitForSingleObject(pi.hProcess, INFINITE);
dmsg(TINFO, "Process Started");
char buf[MAX_BUF];
DWORD bread, avail;
if (!PeekNamedPipe(read_stderr, buf, MAX_BUF - 1, &bread, &avail,
NULL))
{
dmsg(TERR, "PeekNamedPipe stderr");
}
else
{
dmsg(TINFO, "ReadFile Avail <%d>", avail);
ReadFile(read_stderr, buf, 1023, &bread, NULL);
dmsg(TINFO, "bread <%d>", bread);
dmsg(TINFO, "BUF: <%s>", buf);
if (bread > 5)
{
if (!strcmp(buf, "Server refused our key"))
{
dmsg(TERR, "Server refused our key");
}
}
}
CloseHandle(wr_stderr);
CloseHandle(pi.hProcess);
return true;
}