Убить процесс (Windows 8)

Я установил Windows 8 около месяца назад и у меня возникли проблемы, когда процесс зависает, я не могу его закончить/убить. Ни менеджер задач, ни CMD Taskkill/f/PID #### не выполнит эту работу, поэтому я решил, что напишу свой собственный обработчик процессов на С# и посмотрю, какие проблемы возникают.

После написания небольшого приложения я понял, что я не настолько умный, как я думал - я все еще не могу завершить этот процесс. Сначала мне удалось найти процесс по имени /PID:

Process p = Process.GetProcessById(aPid)
//or
foreach (Process p in Process.GetProcessesByName(aProcessName)

.. и получал исключение "Доступ запрещен", когда я пытался:

process.Kill();

.. после нескольких попыток, которые изменились, и я больше не смогу найти этот процесс. Например. когда я пытался найти его по имени или PID, ничего не возвращалось, пока процесс все еще оставался в диспетчере задач и на моем экране.

Я также прочитал в Process @MSDN, и он говорит, что "Access Denied" может быть запущен, если процесс уже завершен или не может быть завершен..: (

Помощь? Неужели нет способа завершить процесс FORCE?

Ответ 1

Ну, вы, по сути, сталкиваетесь с той же проблемой, которая препятствует прекращению процесса Task Manager. Возможны две причины. Один из них связан с исключением, запрещенным доступом, процесс мог бы удалить право доступа к другим процессам для получения дескриптора процесса. Поскольку вы работаете в Windows 8, у вас установлен .NET 4.5. Что обеспечивает новый метод для класса Process, вы можете вызвать EnterDebugMode(). То, что позволяет SeDebugPrivilege, может быть достаточно хорошим, чтобы теперь работать Kill().

Другая проблема гораздо важнее, процесс может иметь поток, активный в режиме ядра, который не выходит. Лучший способ диагностировать это с помощью вкладки "Диспетчер задач", "Сведения", щелкните правой кнопкой мыши один из заголовков столбцов и выберите "Выбрать столбцы". Отметьте "Ручки". Посмотрите на отображаемое значение для процесса. Если вы видите ненулевое значение, у процесса, скорее всего, будет открыт дескриптор и ожидает, что драйвер устройства выполнит запрос ввода-вывода. И этот драйвер устройства в противном случае непроницаем для Windows, требуя отменить запрос. Сужение нарушителя не так просто, вам нужно больше узнать о том, какие запросы ввода-вывода выполняются вашим процессом. Следуйте за этим, задав вопрос об этом на superuser.com