プロセスの終了を停止する場合、1つの方法は、TerminateProcess(またはNtTerminateProcess)にフックすることです。プロセスがそれ自体を終了している場合(たとえば、ウィンドウを閉じたため)、これらの関数に提供されるハンドルはNULLであるため、GetCurrentProcess()およびGetModuleFileNameEx()を使用して終了している実行可能ファイルを確認できます。GetCurrentProcess()は疑似ハンドルを返すため、問題なくアクセスできます。
ただし、あるプロセスが別のプロセスを終了している場合、提供されたハンドルはNULLではありません。終了するプロセスを表します。問題は、そのプロセスに関する情報を取得できないことです。元の[Nt]TerminateProcess()を呼び出す代わりに、「アクセスが拒否されました」というコードを返すだけで済みますが、そのブランケットにより、すべてのプロセスが他のプロセスを終了できなくなります。これは悪い考えです。
ハンドルは有効なものを表す必要があります。そうでない場合、TerminateProcessはそれを使用して有用なことを実行できません。ただし、GetProcessId()を呼び出すこともできず、ERROR_INVALID_HANDLE(またはERROR_ACCESS_DENIED)を取得します。ヘルプやオンラインから収集したさまざまなメソッドを試しました。たとえば、デバッグ権限(成功)、DuplicateHandle()(同じエラー)、ZwQueryInformationProcess()を取得してID(STATUS_ACCESS_DENIED)を取得するなどです。プロセスはIDを返すため、プロセスを列挙することすらできません。また、IDを取得できません。また、OpenProcess()は常に新しいハンドルを返すため、ハンドルを比較できません。
ハンドルにはPROCESS_TERMINATE権限があり、他には何もないと想定できます。Vista以降では、デジタル著作権管理によってプロセスが保護されていることは知っていますが、モルモットとしてProcessExplorerを使用しているため、メディアアプリケーションではありません。
このハンドルから終了するプロセスに関するあらゆる種類の情報を他にどのように取得できるかを誰かが知っていますか?