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

4810
Anixx

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

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

1
Вы можете легко создать небольшое приложение, которое может быть вызвано из командной строки, просто сделайте так, чтобы оно приняло аргумент, и чтобы оно вызывало функцию [TerminateThread] (https://msdn.microsoft.com/en-us/library/windows /desktop/ms686717(v=vs.85).aspx). Ramhound 7 лет назад 0
@ Ramhound Я не знаю, как это сделать. Также он должен получить в качестве аргумента подстроку имени точки входа, а не TID. PS Почему понижающий голос? Это не сайт программирования, не так ли? Anixx 7 лет назад 0
Если вам нужна эта возможность, вы узнаете, как это сделать, проблема с предоставленной мною функцией заключается в том, что для нее требуется дескриптор потока. Вам лучше просто завершить процесс, к которому принадлежит поток, гораздо проще, чем пытаться получить дескриптор потока к приложению, которое уже запущено. В прошлый раз, когда я проверял, голосование ** анонимно **, я шокирован тем, что они дают возможность увидеть историю голосования по вопросу к новым пользователям. Ramhound 7 лет назад 0
То, что вы хотите, требует написания небольшого приложения командной консоли или, по крайней мере, [скрипта Powershell.] (Https://technet.microsoft.com/en-us/library/ee177004.aspx?f=255&MSPPError=- 2147217396) Ramhound 7 лет назад 0
@Ramhound «Вам лучше просто завершить процесс, к которому принадлежит поток» - невозможно, это Explorer.exe, как упоминалось в вопросе. После перезапуска проводника поток будет воссоздан. «То, что вы хотите, требует написания небольшого приложения командной консоли или, по крайней мере, сценария Powershell». - Я не знаю язык PowerShell. Если кто-то может предоставить решение, было бы здорово. Если бы подобная утилита уже существовала, это было бы также здорово. Anixx 7 лет назад 0
Ваш запрос выходит за рамки полномочий суперпользователя. Мы можем помочь ** вам ** в достижении вашей цели, мы не будем писать сценарий или программу для вас, ваш запрос о том, чтобы мы написали сценарий для вас, не обоснован. [Handle v4.0] (https://technet.microsoft.com/en-us/sysinternals/handle), похоже, будет делать то, что вы хотите. Ramhound 7 лет назад 0
[Pslist] Sysinternals (https://technet.microsoft.com/en-us/sysinternals/bb896649) покажет потоки в программе, но его список не позволяет легко определить проблемный поток. Я бы порекомендовал приостановить поток, а не убивать его, хотя я не нашел ни инструментов командной строки для них. Я бы предложил отключить его, но посмотрите [эту рекомендацию] (http://www.fileinspect.com/fileinfo/windows.immersiveshell.serviceprovider-dll/). Вы можете попробовать оба варианта, используя [procxp] (https://technet.microsoft.com/en-us/sysinternals/bb896653): попробуйте это, прежде чем идти дальше. AFH 7 лет назад 0
@Ramhound Я думал, что для этого есть утилита командной строки, потому что Process Hacker может это сделать. Anixx 7 лет назад 0
Process Explroer может сделать это, потому что кто-то написал это. То, что вы хотите, возможно, но может и не существовать, поэтому проще сделать это самостоятельно. Итак, вы должны начать с изучения того, как это сделать, чтобы вы могли написать эту программу и решить эту проблему для миллионов людей. Ramhound 7 лет назад 0
@AFH Как я уже сказал, я сделал это уже с Process Hacker (другое название для Process Explorer). Это работает хорошо. Anixx 7 лет назад 0
@ Хорошо, я нашел Process Hacker, который может убить поток по его идентификатору: https://wj32.org/processhacker/forums/viewtopic.php?t=75. Вопрос в том, как получить его по имени точки входа. Anixx 7 лет назад 0
@Anixx - Вы должны исследовать, как найти точки входа для этой dll, основываясь на этом знании, вы можете попробовать каждую из них, пока не получите желаемый результат. Ramhound 7 лет назад 0
@ Ramhound Я знаю подстроку начального адреса, как получить TID с помощью командной строки? Anixx 7 лет назад 0
Я дал вам отличное предложение, как это определить. Ramhound 7 лет назад 0
@ Бродить где? TID будет отличаться при каждом перезапуске процесса. Anixx 7 лет назад 0
лучше проанализируйте, что делает поток, а не убиваете его. поделиться трассировкой WPR, чтобы я мог рассказать вам, что он делает. Установите WPT (часть Win10 SDK: https://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 7 лет назад 2

2 ответа на вопрос

1
Anixx

Well, this vbs script does the thing for me.

Put a shortcut to it into autostart folder. Put in the same folder as this script utilities nopey and 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 

It also disables all Metro stuff until Explorer restarted.

P.S. Here is the zip archive with all necessary stuff. Just unpack it and run.

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

снова поделитесь трассировкой, чтобы я мог рассказать вам, что делает поток, вместо того, чтобы просто убить его. magicandre1981 7 лет назад 0
Если этот скрипт работает для вас, вам очень повезло. Нет никакой связи между темой, которую вы находите, и `windows.immersiveshell.serviceprovider.dll`: я бы не использовал ее (особенно при запуске), если бы не смог установить эту ссылку, и мне еще не удалось найти команду инструмент линии, который делает это. С упорядочением в моем списке `ProcessHacker` он находит совершенно другую нить. AFH 7 лет назад 0
@ АФХ, ты прав, это плохое решение, но у меня нет лучшего. Anixx 7 лет назад 0
0
Bitten Fleax

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

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

You can get the ID by using Process Explorer to find the TID (Thread ID) of the thread you want to end. To do this you can right click the Process > Properties and you can see the thread you want to end.

Example for me the TID is 7924

Showing TID of the thread you want to end

Я прошу инструмент командной строки, который будет завершать поток подстрокой «начальный адрес», чтобы запускаться каждый раз, когда я запускаю компьютер. Без использования графического интерфейса. Завершение потока с помощью графического интерфейса возможно с Process Hacker, как я уже упоминал в этом вопросе. Этот ответ просто повторяет информацию в моем вопросе. Anixx 7 лет назад 0
Кроме того, этот ответ может быть использован из скрипта или командной строки. Ramhound 7 лет назад 0
@ Обойти это не может. Для получения TID требуется запуск Process Explorer в GUI. Также требуется вся информация из моего комментария к вопросу по ссылке, которую я уже предоставил: https://wj32.org/processhacker/forums/viewtopic.php?t=75 Anixx 7 лет назад 0
Ах, я вас понимаю. Я почти уверен, что Powershell может получить TID процесса. Это просто фильтрация по имени процесса. Я посмотрю и посмотрю. Bitten Fleax 7 лет назад 1
@Bitten Fleax, но позволит ли он получить TID с начального адреса? Anixx 7 лет назад 0