DOS programs under "screen"

Andy Koppe
Sat May 2 05:47:00 GMT 2009

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.


Unsubscribe info:
Problem reports:

More information about the Cygwin mailing list