[解決済み] Windowsでアプリケーションにctrl-C(SIGINT)を送ることはできますか?
質問
私は (過去に) クロスプラットフォーム (Windows/Unix) のアプリケーションを書いたことがありますが、それはコマンドラインから起動したときに、ユーザが入力した Ctrl - C の組み合わせで、同じように(つまり、アプリケーションをきれいに終了させるために)実行することができます。
Windows で Ctrl - C /SIGINT/他の(無関係な)プロセスから、プロセスをきれいに終了するように要求する(リソースを整理する機会を与えるなど)ことに相当するのでしょうか?
どのように解決するのですか?
解決策に最も近いのは SendSignal サード パーティ製アプリです。 作者はソース コードと実行ファイルをリストアップしています。 64 ビット Windows で動作することは確認しましたが (32 ビット プログラムとして実行し、別の 32 ビット プログラムを殺す)、Windows プログラム (32 ビットまたは 64 ビットのいずれか) にコードを埋め込む方法は分かっていません。
どのように動作するか。
デバッガでいろいろ調べた結果、ctrl-break のようなシグナルに関連する動作を実際に行うエントリ ポイントは kernel32!CtrlRoutine であることを発見しました。この関数は ThreadProc と同じプロトタイプを持っていたので、コードを注入することなく CreateRemoteThread で直接使用することができます。しかし、これはエクスポートされたシンボルではありません! Windowsのバージョンによって、アドレスが違う(名前も違う)のです。どうしたらいいでしょうか?
私が最終的に思いついた解決策は次のとおりです。私のアプリにコンソール ctrl ハンドラーをインストールし、私のアプリに ctrl-ブレーク シグナルを生成します。ハンドラーが呼び出されたとき、スタックの先頭を振り返り、kernel32!BaseThreadStart に渡されたパラメータを見つけます。最初のパラメータはスレッドの開始アドレスで、これはkernel32!CtrlRoutineのアドレスです。そして、シグナルを処理したことを示すハンドラから戻り、私のアプリを終了させないようにしました。メインスレッドに戻り、kernel32!CtrlRoutineのアドレスが取得されるまで待ちます。このアドレスが見つかったら、ターゲット・プロセスでリモート・スレッドを作成し、その開始アドレスを取得する。これにより、ターゲット プロセスの ctrl ハンドラは、ctrl-break が押されたかのように評価されるようになります!
良い点は、ターゲット プロセスのみが影響を受け、任意のプロセス (ウィンドウ プロセスでさえ) をターゲットにできることです。1 つの欠点は、私の小さなアプリはバッチ ファイルで使用できないことです。なぜなら、kernel32!CtrlRoutine のアドレスを発見するために ctrl-key イベントを送信すると、バッチ ファイルが停止してしまうからです。
(その前に
start
を付けてください。)
関連
-
[解決済み] Windowsにpipをインストールするにはどうしたらいいですか?
-
[解決済み] Windows での Git リポジトリのディレクトリを無視する
-
[解決済み] Windowsのコマンドラインからアプリケーションの終了コードを取得するにはどうすればよいですか?
-
[解決済み] PythonでSIGINTを捕捉するには?
-
[解決済み】WindowsでTCPまたはUDPポートをリッスンしているプロセスを見つけるにはどうすればよいですか?
-
[解決済み] CMDがAdministratorとして実行されているか、または昇格した特権を持っているかどうかを検出する方法は?
-
[解決済み] ダウンロードした.boxファイルをVagrantに追加するには?
-
[解決済み] WindowsでBashスクリプトを実行する方法はありますか?[クローズド]
-
[解決済み] Windowsで大きなテキストファイルを分割する方法は?
-
[解決済み] WindowsでLinuxのlddに相当するものは何ですか?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】SIGTERMシグナルを優雅に処理する方法は?
-
[解決済み] ダウンロードした.boxファイルをVagrantに追加するには?
-
[解決済み] AltGrキーが効かない、代わりにCtrl+AltGrを使わなければならない [閉店]。
-
[解決済み] Windowsで環境変数をエクスポート/インポートするには?
-
[解決済み] Windowsで.gitconfigの場所を変更する
-
[解決済み] 特定のファイルだけを含むディレクトリ構造をコピーする方法(Windowsのバッチファイルを使用)。
-
[解決済み] Windowsのバッチファイルで複数のコマンドを1行で実行する
-
[解決済み] バッチファイルを使用してサービスが実行されているかどうかを確認し、実行されていない場合は開始するにはどうすればよいですか?
-
[解決済み] WindowsでLinuxのlddに相当するものは何ですか?[クローズド]
-
[解決済み] Windowsのコマンドプロンプトでパスワード認証付きsshを実行する