Как убить определенный поток в Windows?


1

Процесс explorer.exe имеет поток с «начальным адресом», начинающимся с «windows.immersiveshell.serviceprovider.dll». Это занимает много вычислительной мощности. Кроме того, после пробуждения он выдает три окна класса "MetroGhostWindow", которые появляются в диалоге Alt + Tab.

Уничтожение потока с помощью Process Hacker работает отлично и освобождает ресурсы. Но есть ли инструмент командной строки, чтобы сделать то же самое?


Вы можете легко создать небольшое приложение, которое может быть вызвано из командной строки, просто получить аргумент и вызвать функцию TerminateThread .
Ramhound

@ Ramhound Я не знаю, как это сделать. Также он должен получить в качестве аргумента подстроку имени точки входа, а не TID. PS Почему понижающий голос? Это не сайт программирования, не так ли?
Anixx

Если вам нужна эта возможность, вы узнаете, как это сделать, проблема с функцией, которую я предоставил, заключается в том, что для нее требуется дескриптор потока. Вам лучше просто завершить процесс, к которому принадлежит поток, гораздо проще, чем пытаться получить дескриптор потока к приложению, которое уже запущено. В прошлый раз, когда я проверял, голосование является анонимным , я шокирован тем, что они дают возможность увидеть историю голосования по вопросу к новым пользователям.
Ramhound

То, что вы хотите, требует написания небольшого приложения командной консоли или, по крайней мере, сценария Powershell.
Ramhound

2
лучше проанализируйте, что делает поток, а не убиваете его. поделиться трассировкой WPR, чтобы я мог рассказать вам, что он делает. Установите WPT (часть Win10 SDK: dev.windows.com/en-us/downloads/windows-10-sdk, который также работает на 8.1), запустите WPRUI.exe, выберите «Первый уровень», в разделе «Ресурсы выберите использование ЦП» и нажмите на начало . Теперь захватите 1 минуту использования процессора. Через 1 минуту нажмите Сохранить . Заархивируйте большой файл ETL (+ папка NGENPDB) в 1 zip, загрузите zip (OneDrive, dropbox, google drive) и опубликуйте здесь ссылку для обмена.
magicandre1981

Ответы:


1

Ну, этот скрипт VBS делает вещь для меня.

Положите ярлык к нему в папку автозапуска. Поместите в ту же папку, что и этот скрипт утилиты nopey и processhacker.

Set objShell = CreateObject("WScript.Shell")
Set objWshScriptExec = objShell.Exec("nopey.exe list threads Explorer.exe")
Set objStdOut = objWshScriptExec.StdOut

Do 
strLine = objStdOut.ReadLine
pos=Instr(strLine, "00000000")
If pos<>0 And Op=0 Then Exit Do
Op=Instr(strline, "TID")
Loop

Tid=CLng("&H" & (Mid(strLine, 4,4)))

'WScript.Echo Tid

objShell.Run "ProcessHacker.exe -c -ctype thread -cobject " & Tid & " -caction terminate", 0

Он также отключает все элементы Metro, пока проводник не будет перезапущен

PS Здесь находится zip-архив со всем необходимым. Просто распакуйте его и бегите.

http://www.eightforums.com/attachments/customization/67840d1462474574-there-way-disable-metro-interface-metrokill.zip


снова, поделитесь трассировкой, чтобы я мог рассказать вам, что делает поток, вместо того, чтобы просто убить его.
magicandre1981

Если этот скрипт работает для вас, вам очень повезло. Нет никакой связи между найденным вами потоком и windows.immersiveshell.serviceprovider.dll: я бы не использовал его (особенно не при запуске), если бы не смог установить эту ссылку, и мне еще не удалось найти инструмент командной строки, который бы это делал. При заказе в моем ProcessHackerсписке, он находит совершенно другую ветку.
AFH

@ АФХ, ты прав, это плохое решение, но у меня нет лучшего.
Anixx

0

Вы можете создать аргумент командной строки для PH (Process Hacker).

Ты можешь сделать ProcessHacker.exe -c -ctype thread -cobject 1424 -caction terminate

Вы можете получить идентификатор с помощью Process Explorer, чтобы найти TID (ID потока) потока, который вы хотите завершить. Для этого вы можете щелкнуть правой кнопкой мыши на Process> Properties и увидеть поток, который хотите завершить.

Пример для меня TID 7924

Отображение TID потока, который вы хотите закончить


Я прошу инструмент командной строки, который завершит поток подстрокой «начальный адрес», чтобы запускаться каждый раз, когда я запускаю компьютер. Без использования графического интерфейса. Завершение потока с помощью графического интерфейса возможно с Process Hacker, как я уже упоминал в этом вопросе. Этот ответ просто повторяет информацию в моем вопросе.
Anixx

Кроме того, этот ответ может быть использован из скрипта или командной строки.
Ramhound

@ Обойти это не может. Для получения TID требуется запуск Process Explorer в GUI. Также требуется вся информация из моего комментария к вопросу по ссылке, которую я уже предоставил: wj32.org/processhacker/forums/viewtopic.php?t=75
Anixx

1
Ах, я понимаю тебя. Я уверен, что Powershell может получить TID процесса. Это просто фильтрация по имени процесса. Я посмотрю и посмотрю.
Укушенный флекс

@Bitten Fleax, но позволит ли он получить TID с начального адреса?
Anixx
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.