Что делает CreateFile("CONIN$" ..)?
Я взламывал исходный код plink, чтобы сделать его совместимым с unison.
Если вы не знаете, unison - это инструмент синхронизации файлов, он запускает команду "ssh" для подключения к удаленному серверу, но ssh.exe для windows не существует; есть plink, который очень близок, но не достаточно близок (он не ведет себя так, как этого ожидает унисон), поэтому люди обычно делают обертки вокруг него, как этот.
одна из проблем заключается в том, что unison ожидает, что запрос пароля будет напечатан на stderr (но plink печатает его на stdout, что приводит к путанице в unison), поэтому я подумал, что все должно быть достаточно просто, взломайте код моего thru 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 ...... )
и на удивление это работает! Теперь я могу ответить на приглашение!
Почему это? что такое "CONIN$"? и почему он отличается от STD_INPUT_HANDLE
?
Я могу "догадаться", что FILE_SHARE_READ
а также OPEN_EXISTING
играют роль в этом (поскольку ssh запускается из другого процесса), но я хочу понять, что здесь происходит, и убедиться, что в этом коде нет нежелательных побочных эффектов, дыр в безопасности или чего-то такого страшного!
1 ответ
CONIN$
это консольное устройство ввода. Обычно stdin является дескриптором открытого файла, но если stdin по какой-то причине перенаправляется, тогда используется CONIN$
позволит вам получить доступ к консоли, несмотря на перенаправление. Ссылка.