Что делает 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$
позволит вам получить доступ к консоли, несмотря на перенаправление. ссылка.