-2

プロセスが終了する直前にコードを実行する必要がある Windows でアプリケーションを開発しています。これを達成するためにカーネルモジュールを書いても大丈夫です。しかし、私がフックする必要がある機能は何ですか?

プロセスの終了に関する通知を受け取るために、私はこれを行っています。

HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 1234);
DWORD wait = WaitForSingleObject(handle, INFINITE);
// Some block of code here that does the business logic.
handleProcessTermination();

私の問題は、関数 handleProcessTermination() が完了する前にターゲットプロセスが終了することです。プロセスの終了を停止してロジックを実行する方法が必要です。

4

2 に答える 2

0

プロセスの終了を延期する方法はないと思います。プロセスの強制終了はカーネルによって行われるため、そのプロセスのすべてのスレッドを停止しても役に立ちません。

私自身の経験から、Windowsはプロセスの終了時に次のことを行うと思います:

  1. 終了するプロセスをマークする
  2. プロセスのすべてのスレッドを終了する
  3. クリーンアップ (メモリの解放、ハンドルの解放など)
  4. プロセスを終了する

ステップ 1 が完了すると、スケジューラはそのプロセスのどのスレッドもアクティブにしないため、プロセスは運命づけられます。スレッドの 1 つをアクティブにすると、プロセスが部分的に破壊された状態 (たとえば、メモリが解放されたり、ハンドルが破壊されたりするなど) にあるため、スレッドが暴走し、深刻な問題が発生する可能性があります。

カーネルの一部を変更せずにその動作を変更する可能性はないと思います。

補足: が のWaitForSingleObject(thread, ...)前に通知されているかどうかをテストするのは興味深いことWaitForSingleObject(process, ...)です。

于 2015-06-18T12:39:39.317 に答える