Если вы хотите остановить процесс от завершения, одним из способов является подключение к TerminateProcess (или NtTerminateProcess). Если процесс завершает себя (потому что вы закрыли его окно, например), дескриптор, предоставленный этим функциям, равен NULL, поэтому вы можете узнать, какой исполняемый файл завершается с помощью GetCurrentProcess() & GetModuleFileNameEx(). Поскольку GetCurrentProcess() возвращает псевдо-дескриптор, вы можете получить к нему доступ без проблем.Подключение к терминалуПроцесс и получение информации из ручки Это приносит
Если один из процессов завершает работу другого, то поставляемая рукоятка не является NULL. Он представляет собой процесс, который прекращается. Проблема в том, что вы не можете получить информацию об этом процессе. Вы можете просто вернуть код, говорящий «access denied» вместо вызова исходного [Nt] TerminateProcess(), но это одеяло останавливает все процессы от завершения других - это плохая идея.
дескриптор должен представлять что-то действительное, иначе TerminateProcess не сможет ничего с ним поделать - но я не могу даже вызвать GetProcessId() на нем, я получаю ERROR_INVALID_HANDLE (или ERROR_ACCESS_DENIED). Я пробовал различные методы, которые я собрал из справки и из Интернета, включая получение прав отладки (успех) и DuplicateHandle() (той же ошибки) и ZwQueryInformationProcess(), чтобы получить идентификатор (STATUS_ACCESS_DENIED). Я даже не могу перечислять процессы, потому что они возвращают идентификаторы, и я не могу получить идентификатор, а OpenProcess() всегда возвращает новый дескриптор, поэтому я не могу сравнивать дескрипторы.
Я могу только предположить, что у ручки есть PROCESS_TERMINATE справа и ничего больше. Я знаю, что Vista и выше защитили процессы из-за управления цифровыми правами, но я использую ProcessExplorer в качестве моей морской свинки, поэтому это определенно не медиа-приложение!
Кто-нибудь знает, как еще я могу получить любую информацию о завершении процесса из этого дескриптора?
Я упомянул в вопросе, что я уже пробовал DuplicateHandle() (чтобы получить достаточный доступ), но безрезультатно. Поскольку крючок вводится в каждый процесс и может захватывать вызовы, которые тот же самый процесс делает NTDLL, его следует вызывать только в контексте приложения, выполняющего завершение. Например, если ProcessExplorer завершает приложение, это код hook, отображаемый в ProcessExplorer, который запускает, и не согласны ли вы с тем, что это должен быть собственный контекст ProcessExplorer? Это не может быть целевое приложение, так как это не вызвало вызов TerminateProcess ... – JTeagle
Я должен уточнить, что я использую метод appInit_DLLs для подключения, а не общесистемный. Я забыл прояснить, что мой код-крючок выполняется только в приложении, что вызывает вызов для завершения другого. – JTeagle
Причина, по которой я упоминал материал о ручках, заключалась в том, что вы не указали, как было выполнено перехват, и вы упомянули о том, что получили неправильные ошибки обработки. В чем проблема с использованием DuplicateHandle? Может быть, вы можете опубликовать код ... – wj32