Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Grab Program's Console Output

I am creating a network administration program for a company I'm currently doing some contract work with (irrelevant I suppose)

As part of the program, I would like to have a console/telnet(type) clone. I have a working directory system, where I can essentially read all files in directories, and change directories. I also have an easy FTP protocol set up. However I would like to arbitrarily speak to different programs with the standard input/output procedures programmatically. I'm not opposed to DLL injection techniques, and other methods, as this is a benign program. If possible it would be awesome if I could just directly use the console easily. (system() would possibly work, however this doesn't allow continued communication or reading back of output)

I'm thinking so far of grabbing the PATH environment vars and utilizing that for std commands (ipconfig, netstat, etc) My networking library makes communication easy, but I'm just not sure how to interface with the program's console...

TL;DR:

Are there any predefined ways of standard console communication between programs?

like image 544
ultifinitus Avatar asked Dec 13 '22 11:12

ultifinitus


2 Answers

As Jerry mentioned, what you're looking for is a pipe (CreatePipe). Two of them actually - one for input and one for output. You then create the new process with them set as stdin/stdout/stderr in STARTUPINFO passed to CreateProcess. You can then use WriteFile, ReadFile, PeekNamedPipe and friends to communicate.

A complete example is available on MSDN:

http://msdn.microsoft.com/en-us/library/ms682499(v=vs.85).aspx

And make sure you don't fall into these common pitfalls (which luckily Raymond Chen just happened to document recently):

  • http://blogs.msdn.com/b/oldnewthing/archive/2011/07/07/10183884.aspx
  • http://blogs.msdn.com/b/oldnewthing/archive/2011/07/06/10183368.aspx
  • http://blogs.msdn.com/b/oldnewthing/archive/2011/07/08/10184375.aspx

PS, this is sooooo much easier in Python with the subprocess module.

like image 174
kichik Avatar answered Dec 25 '22 04:12

kichik


The easiest way is usually to spawn the child program with _popen. This will give you a handle to write to the child's standard input, or read from the child's standard output.

If you need to do both, things get a lot uglier in a hurry. You usually have to create the anonymous pipes yourself and specify them in a call to CreateProcess, which is, frankly, a pain.

like image 45
Jerry Coffin Avatar answered Dec 25 '22 02:12

Jerry Coffin