-
Нужно определить ThreadID приложения по его ProcessID (PID). Как это можно сделать?
-
а зачем? и откуда PID взят?
-
> а зачем? и откуда PID взят?
PID взят из снимка системы CreateToolhelp32Snapshot. А ID потока надо, чтобы сделать ему Suspend.
-
> [2] jetus (17.06.08 22:41) > PID взят из снимка системы CreateToolhelp32Snapshot.
Дык, а почему оттуда же не взять и ID потоков ? CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, ...)
P.S. Если уж усыплять, то всех :)
-
> Дык, а почему оттуда же не взять и ID потоков ?CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, > ...)P.S.Если уж усыплять, то всех :)
Это именно то что нужно, большое спасибо. Но... не работает :) Вот код: function GetPID(aExeName: String): DWORD;
var
hSnap: Cardinal;
ProcessEntry: TProcessEntry32;
Finding: LongBool;
begin
Result := 0;
aExeName := AnsiLowerCase(aExeName);
hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if hSnap = 0 then
Exit;
ProcessEntry.dwSize := SizeOf(ProcessEntry);
Finding := Process32First(hSnap, ProcessEntry);
while Finding do
begin
if aExeName = AnsiLowerCase(ExtractFileName(ProcessEntry.szExeFile)) then
begin
Result := ProcessEntry.th32ProcessID;
Break;
end;
Finding := Process32Next(hSnap,ProcessEntry);
end;
CloseHandle(hSnap);
end;
function GetThreads(aPID: DWORD): TThreadsArray;
var
hSnap: Cardinal;
ThreadEntry: TThreadEntry32;
Finding: LongBool;
aThreads: TThreadsArray;
begin
SetLength(aThreads, 0);
hSnap := CreateToolHelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if hSnap = 0 then
Exit;
ThreadEntry.dwSize := SizeOf(ThreadEntry);
Finding := Thread32First(hSnap, ThreadEntry);
while Finding do
begin
if aPID = ThreadEntry.th32OwnerProcessID then
begin
SetLength(aThreads, Length(aThreads)+1);
aThreads[Length(aThreads)-1] := ThreadEntry.th32ThreadID;
end;
Finding := Thread32Next(hSnap, ThreadEntry);
end;
CloseHandle(hSnap);
SetLength(Result, Length(aThreads));
Result := aThreads;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
PID: DWORD;
ThreadsID: TThreadsArray;
i: Integer;
begin
PID := GetPID('calc.exe'); ThreadsID := GetThreads(PID); for i := 0 to Length(ThreadsID)-1 do
SuspendThread(ThreadsID[i]); end;
Не останавливает потоки и всё... Что не так?
-
А! Забыл описание выложить: type
TThreadsArray = array of DWORD;
-
function OpenThread(dwDesiredAccess: DWORD;
bInheritHandle: BOOL; dwThreadId: DWORD): THandle; stdcall;
external kernel32;
const
THREAD_ALL_ACCESS = $000F0000 or $00100000 or $3FF;
...
PID := GetPID('calc.exe'); ThreadsID := GetThreads(PID); for I := 0 to Length(ThreadsID) - 1 do
SuspendThread(OpenThread(THREAD_ALL_ACCESS, False, ThreadsID[i]));
-
> Riply © (17.06.08 23:18) [3]
> Если уж усыплять, то всех :)
NtSuspendProcess - 2003, XP
-- Regards, LVT.
-
tnx 2 All! Всё работает :)
-
Если работает, то не забывай хэндл открытый OpenThread-ом закрывать :)
-
> [7] Leonid Troyanovsky © (18.06.08 12:59) > NtSuspendProcess - 2003, XP
Если мне не изменяет память, то под XP SP2, не было возможности использовать эту функцию. Я ошибаюсь ?
> [9] Rouse_ © (18.06.08 16:59)
С возвращением :)
> Если работает, то не забывай хэндл открытый OpenThread-ом закрывать :)
Дык ты сам, в своем примере, накорню пресек возможность закрыть Handle :)
-
> С возвращением :)
Пасиб :)
> Дык ты сам, в своем примере, накорню пресек возможность > закрыть Handle :)
А мне лень расписывать было :)
-
> Riply © (18.06.08 17:33) [10]
> Я ошибаюсь ?
Поищи в ntdll.dll tdump.exe 0000E83A 344 0150 NtSuspendProcess
-- Regards, LVT.
-
> [12] Leonid Troyanovsky © (18.06.08 18:15) > Поищи в ntdll.dll
Она не только там сидит, но еще и корректно работает негодяйка :) Спасибо.
P.S. Уж и не помню откуда я сделала вывод, что ее нельзя использовать под XP :(
|