8

plinkのソース コードをunisonと互換性を持たせるためにハッキングしていました。

unison はファイル同期ツールであり、「ssh」コマンドを実行してリモート サーバーに接続しますが、Windows 用の ssh.exe はありません。plink は非常に近いですが、十分に近いわけではありません (unison が期待するように動作しません)。そのため、人々は通常、このようなラッパーを作成します。

問題の 1 つは、unison がパスワード プロンプトが stderr に出力されることを期待していることです (ただし、plink はそれを stdout に出力し、unison を混乱させる原因となります)。プロンプトを標準出力に出力します。だから私は自分の道をハックしてそれをしました。

次の問題: プロンプトに応答できません!! 何を入力しても効果はありません。

入力を取得するためのコードは、おおよそ次のようになります。

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_READOPEN_EXISTING果たしています(sshは別のプロセス内から実行されているため)が、ここで何が起こっているのかを理解し、このコードに不要な側面がないことを確認したい.エフェクトとかセキュリティホールとかそういう怖いもの!

4

1 に答える 1

12

CONIN$コンソール入力デバイスです。通常、stdin はこれに対するオープン ファイル ハンドルですが、何らかの理由で stdin がリダイレクトされた場合CONIN$、リダイレクトにもかかわらず、使用するとコンソールにアクセスできます。参照。

于 2008-12-18T08:00:35.753 に答える