Что делает CreateFile(CONIN$ ..)?

Я взломал исходный код для plink, чтобы сделать его совместимы с унисоном.

Если вы не знаете, unison — это инструмент синхронизации файлов, он запускает команду «ssh» для подключения к удаленному серверу, но для Windows нет ssh.exe; есть plink, который очень близок, но не достаточно (он не ведет себя так, как ожидает унисон), поэтому люди обычно делают вокруг него обертки, как этот.

одна из проблем заключается в том, что unison ожидает, что запрос пароля будет напечатан в stderr (но plink печатает его в stdout и вызывает путаницу в unison), поэтому я подумал, что это должно быть достаточно просто, взломать мой сквозной код plink и сделать его вывести приглашение на стандартный вывод. поэтому я взломал свой путь и сделал это.

Следующая проблема: я не могу ответить на приглашение!! что бы я ни печатал, это не имеет никакого эффекта.

код для получения ввода примерно такой:

hin = GetStdHandle(STD_INPUT_HANDLE);
....
r = ReadFile(hin, .....);

Я не уверен, почему это сделано именно так, но я не эксперт в разработке инструментов командной строки для Windows, так что я знаю! Но я полагаю, что чего-то не хватает в настройке дескриптора ввода.

Я просмотрел исходный код вышеупомянутого инструмента-оболочки и вижу это : hconin=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0)

и я попробую (просто так)

hin=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
....
r = ReadFile( hin ...... )

и на удивление это работает! Теперь я могу ответить на приглашение!

Почему это? что такое "КОНИН$"? и чем он отличается от STD_INPUT_HANDLE?

Я могу как бы "догадаться", что в этом играют роль FILE_SHARE_READ и OPEN_EXISTING (поскольку ssh запускается из другого процесса), но я хочу понять, что здесь происходит, и убедиться, что в этом коде нет нежелательные побочные эффекты или дыры в безопасности или что-то в этом роде страшное!


person hasen    schedule 18.12.2008    source источник


Ответы (1)


CONIN$ — консольное устройство ввода. Обычно stdin является дескриптором открытого файла, но если stdin по какой-то причине перенаправляется, то использование CONIN$ позволит вам получить доступ к консоли, несмотря на перенаправление. Справочник.

person Chris Jester-Young    schedule 18.12.2008
comment
Это похоже на открытие /dev/console в Unix. :-) - person Chris Jester-Young; 18.12.2008
comment
Это больше похоже на /dev/tty, который указывает на управляющий терминал процесса, тогда как /dev/console обычно является физической консолью (serial или tty1). - person user1686; 21.06.2011
comment
@Эндрю: Правда? Если вы перенаправили стандартный ввод, /dev/stdin получит перенаправленный файл. Я думал, что CONIN$ должен добраться до терминала, независимо от каких-либо перенаправлений. - person Chris Jester-Young; 12.09.2011
comment
Вы правы - в моем оптимизме по поводу того, что я нашел ответ, я неправильно понял, что делает CONIN$. Кажется, это то же самое, что и CON, который похож на /dev/tty, а не на /dev/stdin. Я удалил свой комментарий. (Есть ли эквивалент /dev/stdin для Windows?) - person Andrew Dalke; 13.09.2011