我正在破解plink的源代码以使其与统一兼容。

如果您不知道,unison是文件同步工具,它将运行“ssh”命令以连接到远程服务器,但Windows没有ssh.exe;有一个plink,它非常接近但不够紧密(它的行为不像统一预期的那样),因此人们通常在它周围包装like this one

问题之一是,unison期望密码提示符打印到stderr(但是plink将其打印到stdout,并导致unison混淆),所以我认为,应该足够简单,通过plink的代码来破解我的代码将提示打印到标准输出。所以我破解了自己的方式并做到了

下一个问题:我无法回应提示!不管我输入什么,它都没有效果。

获取输入的代码大致如下:

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

我不确定为什么要这样做,但是我不是设计Windows命令行工具的专家,所以我知道些什么!但是我认为设置输入句柄时缺少一些东西。

我查看了above wrapper tool的源代码,然后看到了: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_READOPEN_EXISTING在其中起作用(因为ssh从另一个进程中运行),但是我想了解这里发生的事情,并确保该代码没有某些内容有害的副作用或安全漏洞或类似的可怕内容!

最佳答案

CONIN$是控制台输入设备。通常,stdin是对此的打开文件句柄,但是如果出于某种原因重定向了stdin,则尽管使用了重定向,但使用CONIN$仍将允许您访问控制台。 Reference.

关于winapi - CreateFile ("CONIN$"..)有什么作用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/377152/

10-11 19:07