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

1

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

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

Anixx
источник
Вы можете легко создать небольшое приложение, которое может быть вызвано из командной строки, просто получить аргумент и вызвать функцию 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

Anixx
источник
снова, поделитесь трассировкой, чтобы я мог рассказать вам, что делает поток, вместо того, чтобы просто убить его.
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