2009/5/1 Barry Kelly: >> ReadConsoleOutput() on the hidden console only >> gives you the cooked output in terms of character cell contents and >> attributes, whereas the raw output as it came from the console app >> would need to be sent to the pty to be displayed by the likes of >> screen. As far as I can see, recreating the raw output from the cooked >> one isn't possible in general. > > You could intercept the calls to the console APIs by finding out where > the imports resolve to using GetProcAddress etc. (i.e. somewhere inside > where kernel32.dll is mapped to in the process), then adjusting the page > permissions (VirtualProtect etc.) and rewriting the entrypoint code > (save original 5 bytes of code, insert JMP <your-stub-here>, and at > <your-stub-here> save the parameters, update your stuff, execute the > missing code (the code you skipped - may need adjustment owing to > code-relative addressing modes in e.g. Jcc instructions), then JMP back. > > That's all assuming you have access to the innards of the process, most > likely with debugging APIs like CreateRemoteThread, DebugActiveProcess / > CreateProcess w/ debug, and WaitForDebugEvent / ContinueDebugEvent > debugging loop. > > Doing all this could be fun, but I reckon it would amount to a stack of > hacks. It also requires overbearing privileges.
Thanks very much Barry, that's valuable info. I get the feeling this would best be attempted as a separate utility to be invoked as a wrapper around Win32 console programs. This would translate the console API calls into reads and writes on stdin and stdout. It could be used with all pty-based terminal emulators while keeping the hackery out of the Cygwin DLL. On the last point, do you really need special privileges to access the innards of your own processes? Assuming the hooking could be made to work, translating the low-level console I/O functions that reach directly into the console screen buffer would still be rather a big challenge. Perhaps the wrapper would need to be limited to high-level console I/O only. Oh, and ReadFile() and WriteFile() would need to be hooked too, to see whether they're accessing the console in question. I think I'll stick with difficulty rating "Insane" for this issue on the MinTTY issue tracker. Andy -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/