2010-11-07 2 views
0

Если вы хотите остановить процесс от завершения, одним из способов является подключение к 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 в качестве моей морской свинки, поэтому это определенно не медиа-приложение!

Кто-нибудь знает, как еще я могу получить любую информацию о завершении процесса из этого дескриптора?

ответ

1

Это обычная ручка процесса. Вопрос в том, в каком процессе выполняется ваша функция hook? Если это вызывающий процесс, дескриптор может использоваться как-для GetProcessId или NtQueryInformationProcess. Если нет, вам нужно вызвать DuplicateHandle, чтобы дублировать дескриптор в вашем процессе.

Если вы получаете отказ в доступе, это может быть связано с тем, что дескриптор процесса имеет доступ только PROCESS_TERMINATE. В этом случае используйте DuplicateHandle для «повторного открытия» процесса с доступом PROCESS_QUERY_ (LIMITED_).

+0

Я упомянул в вопросе, что я уже пробовал DuplicateHandle() (чтобы получить достаточный доступ), но безрезультатно. Поскольку крючок вводится в каждый процесс и может захватывать вызовы, которые тот же самый процесс делает NTDLL, его следует вызывать только в контексте приложения, выполняющего завершение. Например, если ProcessExplorer завершает приложение, это код hook, отображаемый в ProcessExplorer, который запускает, и не согласны ли вы с тем, что это должен быть собственный контекст ProcessExplorer? Это не может быть целевое приложение, так как это не вызвало вызов TerminateProcess ... – JTeagle

+0

Я должен уточнить, что я использую метод appInit_DLLs для подключения, а не общесистемный. Я забыл прояснить, что мой код-крючок выполняется только в приложении, что вызывает вызов для завершения другого. – JTeagle

+0

Причина, по которой я упоминал материал о ручках, заключалась в том, что вы не указали, как было выполнено перехват, и вы упомянули о том, что получили неправильные ошибки обработки. В чем проблема с использованием DuplicateHandle? Может быть, вы можете опубликовать код ... – wj32

 Смежные вопросы

  • Нет связанных вопросов^_^