[Vm-dev] Identify console executable and standard one

Alistair Grant akgrant0710 at gmail.com
Fri Apr 27 11:25:23 UTC 2018


Hi Ben,

Thanks very much for the links.


On 27 April 2018 at 12:39, Ben Coman <btc at openinworld.com> wrote:
>
>
>
> On 16 April 2018 at 21:17, Alistair Grant <akgrant0710 at gmail.com> wrote:
>>
>>
>> Hi Eliot & Subbu,
>>
>> On 16 April 2018 at 05:50, K K Subbu <kksubbu.ml at gmail.com> wrote:
>> >
>> > On Sunday 15 April 2018 11:42 PM, Eliot Miranda wrote:
>> >>>
>> >>>
>> >>> On Windows in sqFileStdioHandlesInto() in sqWin32FilePrims.c:
>> >>>
>> >>> files[0].sessionID = thisSession;
>> >>> files[0].file = GetStdHandle(STD_INPUT_HANDLE);
>> >>> files[0].writable = false;
>> >>> files[0].lastOp = 0; /* unused on win32 */
>> >>> files[0].isStdioStream = GetConsoleMode(files[0].file, &mode) != 0;
>> >>> AddHandleToTable(win32Files, files[0].file);
>> >>
>> >>
>> >> This could be causing problems, because AFAIA
>> >> GetConsoleMode(files[0].file, &mode) is no longer reliable.  Can you test?
>> >
>> >
>> > I believe _isatty(fd) from io.h is the syscall on Windows:
>> >
>> >  https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/isatty
>> >
>> > HTH .. Subbu
>>
>> Right, _isatty sounds like the more sensible call.  Just looking at
>> the docs, the return value of GetConsoleMode() is simply whether it
>> succeeded or not.
>>
>> However, in some quick tests it appears that both _isatty() and
>> GetConsoleMode() return the correct value when called from a cmd.exe
>> terminal window (I guess GetConsoleMode() fails if there isn't a
>> terminal).  They both fail when called from a cygwin shell (mintty).
>> It looks like vim (yes, the text editor) has some MIT licensed code
>> that does the check correctly from within mintty.
>
>
>
> I've was reading around this topic to see if I could find anything useful.
> I haven't really got my head around it yet to tell what is directly related,
> but here is the most interesting links I found...
>
> How can I tell whether my console program was launched from Explorer or from a command prompt?
> https://blogs.msdn.microsoft.com/oldnewthing/20160125-00/?p=92922
>
> What Is conhost.exe and Why Is It Running?
> https://www.howtogeek.com/howto/4996/what-is-conhost.exe-and-why-is-it-running/
>
> GetConsoleMode fails when input piped
> http://comp.os.ms-windows.programmer.win32.narkive.com/xiPamaWm/getconsolemode-fails-when-input-piped
>
> Both isatty() and GetConsoleScreenBufferInfo() fail with mintty 2.1.5 in MSYS2 [okay with Cygwin]
> https://github.com/mintty/mintty/issues/482

This is the one that says that Windows Consoles and MinTTY terminals
are basically incompatible.



> MSVC's native _isatty() thinks Cygwin Bash is a pipe, not an interactive shell, because it just uses GetFileType() deep under the hood.

This is how Vincent's code checks to see if we're running in a MinTTY
terminal.  It looks for a pipe with a particular name.



> https://stackoverflow.com/questions/45223868/how-do-i-play-nice-with-cygwin
>
> ReadConsole and WriteConsole can only be used with console handles;
> ReadConsole and WriteConsole fail if used with a standard handle that has been redirected and is no longer a console handle.
> ReadFile and WriteFile can be used with other handles (such as files or pipes).
> https://docs.microsoft.com/en-us/windows/console/high-level-console-input-and-output-functions
>
>  "GetConsoleMode error: 6" when running under Unix emulation environments such as cygwin and msys.
> What this means is that GetConsoleMode is being called on an invalid file handle (STD_INPUT_HANDLE).
> https://lists.osuosl.org/pipermail/darcs-users/2004-June/002104.html
>
> Windows: Improve terminal detection mechanism
> https://phabricator.haskell.org/D2809
> https://github.com/git/git/blob/0767172b9068b225c06fd7ce66422e5936ec60a2/compat/winansi.c#L534-L571
> https://fossies.org/linux/vim/src/iscygpty.c
> https://hackage.haskell.org/package/base-4.6.0.0/src/cbits/consUtils.c
>
> Cunningly conquering communicated console caveats. Comprende, mon Capitán?
> http://archives.miloush.net/michkap/archive/2010/05/07/10008232.html
>
> What does CreateFile(“CONIN$” ..) do?
> https://stackoverflow.com/questions/377152/what-does-createfileconin-do?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
>
> The CreateFile function enables a process to get a handle to its console's input buffer and active screen buffer, even if STDIN and STDOUT have been redirected. To open a handle to a console's input buffer, specify the CONIN$ value in a call to CreateFile
> https://docs.microsoft.com/en-us/windows/console/console-handles
>
> Where do writes to stdout go when launched from a cygwin shell, no redirection
> https://stackoverflow.com/questions/4028353/where-do-writes-to-stdout-go-when-launched-from-a-cygwin-shell-no-redirection
>
>
> How to create a Windows program that works both as a GUI and console application
> https://www.tillett.info/2013/05/13/how-to-create-a-windows-program-that-works-as-both-as-a-gui-and-console-application/


It will take me a while to read through the rest. :-)

Thanks again,
Alistair


More information about the Vm-dev mailing list