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

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

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

одна из проблем заключается в том, что unison ожидает, что запрос пароля будет напечатан в stderr (но plink печатает его в stdout и вызывает путаницу unison), поэтому я подумал, что должен быть достаточно простым, взломать код моего thru 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 ...... )

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

почему это? что такое " Конин$"? и почему это отличается от the STD_INPUT_HANDLE?

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

1 ответов


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