1 (изменено: Kakuo, 2021-10-12 14:11:09)

Тема: AHK: Заморозка Threads

У меня есть код который замораживает процесс игры, но как мне сделать чтоб он замораживал не весь процесс игры, а мне надо заморозить его пару подпроцессов (Threads) вот код

sc3E::
 
if (toggle := !toggle) {
 
Process_Suspend("SoTGame.exe")
 
Process_Suspend(PID_or_Name){
 
    PID := (InStr(PID_or_Name,".")) ? ProcExist(PID_or_Name) : PID_or_Name
 
    h:=DllCall("OpenProcess", "uInt", 0x1F0FFF, "Int", 0, "Int", pid)
 
    If !h   
 
        Return -1
 
    DllCall("ntdll.dll\NtSuspendProcess", "Int", h)
 
    DllCall("CloseHandle", "Int", h)
	}
 
} else {
 
Process_Resume("SoTGame.exe")
 
Process_Resume(PID_or_Name){
 
    PID := (InStr(PID_or_Name,".")) ? ProcExist(PID_or_Name) : PID_or_Name
 
    h:=DllCall("OpenProcess", "uInt", 0x1F0FFF, "Int", 0, "Int", pid)
 
    If !h   
 
        Return -1
 
    DllCall("ntdll.dll\NtResumeProcess", "Int", h)
 
    DllCall("CloseHandle", "Int", h)
}
 
ProcExist(PID_or_Name=""){
 
    Process, Exist, % (PID_or_Name="") ? DllCall("GetCurrentProcessID") : PID_or_Name
 
    Return Errorlevel
	}
}
return

2

Re: AHK: Заморозка Threads

Возможно нужно указать сами процессы по отдельности?

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

3 (изменено: Kakuo, 2021-10-12 22:14:54)

Re: AHK: Заморозка Threads

__Михаил__https://i.imgur.com/oncQCob.png
Мне надо заморозить TID процесса.

4

Re: AHK: Заморозка Threads

UP

5 (изменено: Kakuo, 2021-10-24 23:39:08)

Re: AHK: Заморозка Threads

Подскажите команду пожалуйста.

6

Re: AHK: Заморозка Threads

Kakuo пишет:

Подскажите команду пожалуйста.

Функцию NTAPI? NtSuspendThread. Как найти TID, полагаю, знаете.

7

Re: AHK: Заморозка Threads

greg zakharov, а смысл пользоваться недокументированной, когда есть SuspendThread.
https://docs.microsoft.com/en-us/window … pendthread

8

Re: AHK: Заморозка Threads

Malcev пишет:

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

В грубом схематичном округлении: kernel32!SuspendThread (заглушка) -> kernelbase!SuspendThread (call) -> ntdll!NtSuspendThead (syscall) -> ... Далее берем в руки cdb.

cdb -z %__appdir__%ntoskrnl.exe -c "uf ntoskrnl!NtSuspendThread;q"

Смотрим на дизассемблерный код и видим, что NtSuspendThread отличается от просто SuspendThread одним параметром, передаваемым по ссылке. Что здесь недокументированного? Сам же резон более в быстродействии.
С вашей стороны будет ещё контраргументация?

9

Re: AHK: Заморозка Threads

greg zakharov пишет:

С вашей стороны будет ещё контраргументация?

Да.

greg zakharov пишет:

Что здесь недокументированного?

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

greg zakharov пишет:

Сам же резон более в быстродействии.

Вы на автохотки быстродействие замеряли?
Если да, то покажите результаты.

10

Re: AHK: Заморозка Threads

Malcev пишет:

Ссылку на msdn с использованием этой функции приведите, тогда и будем считать, что она документирована.

Ужель документированность определяется скудным docs.microsoft.com? Есть заголовочные файлы WDK, чай тоже своего рода документация. Хотя может что в нём и изменилось за последнее время, не в курсе.

Malcev пишет:

Вы на автохотки быстродействие замеряли?

А вы осмелитесь утверждать, что вызванная NtSuspenThread из юзермодной ntdll.dll снизит быстродействие? о_О... Знаете, осенью полезны витамины.

11 (изменено: Malcev, 2021-11-01 02:55:21)

Re: AHK: Заморозка Threads

greg zakharov пишет:

А вы осмелитесь утверждать, что вызванная NtSuspenThread из юзермодной ntdll.dll снизит быстродействие? о_О... Знаете, осенью полезны витамины.

Да, представьте себе, осмелюсь.
У меня в блокноте SuspenThread работает на 20% быстрее чем NtSuspenThread 800ms/1000ms (win10 ahk64bit).
Так что вместо советов о приеме витаминов, на профильном форуме рекомендуется свои гипотезы доказывать кодом.

setbatchlines -1
f11::
ThreadID := DllCall("GetWindowThreadProcessId", "ptr", WinExist("A"), "uint", 0)
hThread := DllCall("OpenThread", "uint", 0x0002, "int", 0, "uint", ThreadID, "ptr")
a := a_tickcount
loop 1000000
{
   DllCall("SuspendThread", "ptr", hThread)
   DllCall("ResumeThread", "ptr", hThread)
}
msgbox % a_tickcount - a

DllCall("LoadLibrary", "str", "ntdll", "ptr")
a := a_tickcount
loop 1000000
{
   DllCall("ntdll\NtSuspendThread", "ptr", hThread, "uint*", count)
   DllCall("ntdll\NtResumeThread", "ptr", hThread, "uint*", count)
}
msgbox % a_tickcount - a
DllCall("CloseHandle", "ptr", hThread)

12

Re: AHK: Заморозка Threads

Malcev пишет:

У меня в блокноте SuspenThread работает на 20% быстрее...

Прям-таки в блокноте?

Malcev пишет:

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

Вашим кодом (огрехи которого целиком на вашей совести) ничего не доказать (витамины вам действительно необходимы).

13

Re: AHK: Заморозка Threads

Какие огрехи?
Если моим не доказать, докажите своим.