I fixed the bug. You need to change the USE_WIN32 section in ___os_device_stream_open_predefined to this:
switch (___INT(index)) { case -4: open_console: { ___device_tty *d;
if ((e = ___device_tty_setup_console (&d, io_mod.dgroup, direction)) != ___FIX(___NO_ERR)) return e;
dev = ___CAST(___device_stream*,d);
break; }
default: { switch (___INT(index)) { default: case -1: h = GetStdHandle (STD_INPUT_HANDLE); break; case -2: h = GetStdHandle (STD_OUTPUT_HANDLE); break; case -3: h = GetStdHandle (STD_ERROR_HANDLE); break; }
if (h == INVALID_HANDLE_VALUE) return err_code_from_GetLastError ();
if (GetFileType (h) == FILE_TYPE_UNKNOWN) goto open_console;
...
The bug occurs on Windows when the Gambit runtime is being run as a windowed application (no problem in console applications). In a windowed application the GetStdHandle calls (which are meant to return the standard input/output/error) return a handle whose type is not recognized by Gambit (it is not a file, a pipe, a socket, a console, or a serial port). This caused the runtime to terminate. The fix adds a check for the handle type and associates a console window to stdin/out/err if their type is unknown. So for windowed applications any "standard I/O" from Scheme will go to a freshly created console (unless stdin/out/err were redirected).
Marc