当前位置:  开发笔记 > 运维 > 正文

CreateFile("CONIN $"..)有什么作用?

如何解决《CreateFile("CONIN$"..)有什么作用?》经验,为你挑选了1个好方法。

我正在破解plink的源代码,使其与unison兼容.

如果您不知道,unison是一个文件同步工具,它运行"ssh"命令连接到远程服务器,但没有用于Windows的ssh.exe; 有plink,它非常接近但不够接近(它的行为不像unison期望的那样),所以人们通常围绕它做包装,就像这个一样.

其中一个问题是unison希望密码提示打印到stderr(但是plink将它打印到stdout,并导致混淆被混淆),所以我想,嗯,应该很简单,破解我通过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> Chris Jester..:

CONIN$是控制台输入设备.通常,stdin是一个打开文件句柄,但如果stdin由于某种原因被重定向,那么CONIN$尽管重定向,使用将允许您访问控制台.参考.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有