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