Что делает CreateFile ("CONIN $" ..)? - PullRequest
       38

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

7 голосов
/ 18 декабря 2008

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

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

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

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

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

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 Ответ

11 голосов
/ 18 декабря 2008

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

...