Конференция "WinAPI" » Получение ID главного потока приложения [D7, WinXP]
 
  • JetuS (17.06.08 17:42) [0]
    Нужно определить ThreadID приложения по его ProcessID (PID).
    Как это можно сделать?
  • clickmaker © (17.06.08 18:44) [1]
    а зачем? и откуда PID взят?
  • jetus (17.06.08 22:41) [2]

    > а зачем? и откуда PID взят?

    PID взят из снимка системы CreateToolhelp32Snapshot.
    А ID потока надо, чтобы сделать ему Suspend.
  • Riply © (17.06.08 23:18) [3]
    > [2] jetus   (17.06.08 22:41)
    > PID взят из снимка системы CreateToolhelp32Snapshot.

    Дык, а почему оттуда же не взять и ID потоков ?
    CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, ...)

    P.S.
    Если уж усыплять, то всех :)
  • JetuS (18.06.08 09:34) [4]

    > Дык, а почему оттуда же не взять и ID потоков ?CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,
    >  ...)P.S.Если уж усыплять, то всех :)

    Это именно то что нужно, большое спасибо.
    Но... не работает :)

    Вот код:
    // Получение ProcessID процесса по имени
    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;

    // Получение массива ID-шек потоков процесса по его PID
    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'); // PID вытягивается нормально (проверяю через TaskManager)
     ThreadsID := GetThreads(PID); // Массив заполняется
     for i := 0 to Length(ThreadsID)-1 do
       SuspendThread(ThreadsID[i]); // А вот тут не работает :(
    end;



    Не останавливает потоки и всё...
    Что не так?
  • JetuS (18.06.08 09:37) [5]
    А! Забыл описание выложить:
    type
     TThreadsArray = array of DWORD;

  • Rouse_ © (18.06.08 10:18) [6]
     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'); // PID вытягивается нормально (проверяю через TaskManager)
       ThreadsID := GetThreads(PID); // Массив заполняется
       for I := 0 to Length(ThreadsID) - 1 do
         SuspendThread(OpenThread(THREAD_ALL_ACCESS, False, ThreadsID[i]));

  • Leonid Troyanovsky © (18.06.08 12:59) [7]

    > Riply ©   (17.06.08 23:18) [3]

    > Если уж усыплять, то всех :)

    NtSuspendProcess - 2003, XP

    --
    Regards, LVT.
  • JetuS (18.06.08 16:58) [8]
    tnx 2 All!
    Всё работает :)
  • Rouse_ © (18.06.08 16:59) [9]
    Если работает, то не забывай хэндл открытый OpenThread-ом закрывать :)
  • Riply © (18.06.08 17:33) [10]
    > [7] Leonid Troyanovsky ©   (18.06.08 12:59)
    > NtSuspendProcess - 2003, XP

    Если мне не изменяет память, то под XP SP2, не было возможности
    использовать эту функцию.
    Я ошибаюсь ?

    > [9] Rouse_ ©   (18.06.08 16:59)

    С возвращением :)

    > Если работает, то не забывай хэндл открытый OpenThread-ом закрывать :)

    Дык ты сам, в своем примере, накорню пресек возможность закрыть Handle :)
  • Rouse_ © (18.06.08 18:01) [11]

    > С возвращением :)

    Пасиб :)


    > Дык ты сам, в своем примере, накорню пресек возможность
    > закрыть Handle :)

    А мне лень расписывать было :)
  • Leonid Troyanovsky © (18.06.08 18:15) [12]

    > Riply ©   (18.06.08 17:33) [10]

    > Я ошибаюсь ?

    Поищи в ntdll.dll
    tdump.exe
    0000E83A  344 0150 NtSuspendProcess

    --
    Regards, LVT.
  • Riply © (18.06.08 19:54) [13]
    > [12] Leonid Troyanovsky ©   (18.06.08 18:15)
    > Поищи в ntdll.dll

    Она не только там сидит, но еще и корректно работает негодяйка :)
    Спасибо.

    P.S.
    Уж и не помню откуда я сделала вывод, что ее нельзя использовать под XP :(
 
Конференция "WinAPI" » Получение ID главного потока приложения [D7, WinXP]
Есть новые Нет новых   [134434   +28][b:0][p:0.002]