Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fremden Thread anhalten (SuspendThread) (https://www.delphipraxis.net/82286-fremden-thread-anhalten-suspendthread.html)

Zacherl 10. Dez 2006 11:35


Fremden Thread anhalten (SuspendThread)
 
Hi,

wie kann ich den HauptThread einer fremden Anwendung anhalten? Ich habe die PID des Prozesses. Jetzt muss ich irgendwie ein Handle auf den Mainthread erhalten, um diesen dann mit SuspendThread anzuhalten ...

Weiß jemand wie das geht?

Florian

Meflin 10. Dez 2006 11:39

Re: Fremden Thread anhalten (SuspendThread)
 
MSDN-Library durchsuchenCreateToolhelp32Snapshot dürfte dein Freund und Helfer sein...


Zacherl 10. Dez 2006 12:28

Re: Fremden Thread anhalten (SuspendThread)
 
Habe jetzt folgendes gefunden:

Code:
unsigned long GetTargetThreadIdFromWindow(char *className, char *windowName)

    HWND targetWnd;
    HANDLE hProcess
    unsigned long processId, pTID, threadID;

    targetWnd = FindWindow(className, windowName);
    GetWindowThreadProcessId(targetWnd, &processId);


    _asm { 
   mov eax, fs:[0x18]
   add eax, 36 
   mov [pTID], eax
    } 

    hProcess = OpenProcess(PROCESS_VM_READ, false, processID);
    ReadProcessMemory(hProcess, (const void *)pTID, &threadID, 4, NULL);
    CloseHandle(hProcess);

    return threadID;
}
Kann mir das jemand nach Delphi portieren?

Ein paar Zeilen kann man weglassen, da ich die PID des Prozesses bereits kenne und nicht anhand des Fensterhandles ermitteln muss. Ich nehme einfach mal 435 als Beispiel.

Code:
unsigned long GetTargetThreadIdFromWindow(char *className, char *windowName)

    HWND targetWnd;
    HANDLE hProcess
    unsigned long processId, pTID, threadID;

    processID = 435;


    _asm { 
   mov eax, fs:[0x18]
   add eax, 36 
   mov [pTID], eax
    } 

    hProcess = OpenProcess(PROCESS_VM_READ, false, processID);
    ReadProcessMemory(hProcess, (const void *)pTID, &threadID, 4, NULL);
    CloseHandle(hProcess);

    return threadID;
}
Vielen Dank
Florian

Zacherl 10. Dez 2006 13:59

Re: Fremden Thread anhalten (SuspendThread)
 
So, hab das mal soweit selber gemacht:

Delphi-Quellcode:
function GetMainThread(PID: Integer): THandle;
var
  ThreadID,
  pTID: Longint;
  hProcess: THandle;
  lpRead: Cardinal;
begin
  asm
    mov eax, fs:[$18]
    add eax, 36
    mov [pTID], eax
  end;

  hProcess := OpenProcess(PROCESS_VM_READ, false, PID);
  ReadProcessMemory(hProcess, @pTID, @threadID, SizeOf(ThreadID), lpRead);
  CloseHandle(hProcess);

  Result := ThreadID;
end;
Nur leider ist meine ThreadID immer ungültig ... woran kann das liegen?

SirThornberry 10. Dez 2006 14:28

Re: Fremden Thread anhalten (SuspendThread)
 
Das liegt daran das du nirgends die ThreadID ausliest. Hast du dir überhaupt mal in der Hilfe angeschaut welche Parameter ReadProcessMemory erwartet?
Ich würde dir einfach empfehlen die Methoden verwenden welche dir bereits empfohlen wurden. Diese funktionieren.

Zacherl 10. Dez 2006 15:04

Re: Fremden Thread anhalten (SuspendThread)
 
Mh ich habe gelesen, dass man hiermit die ThreadID ermitteln kann. Aber okey, mit CreateToolbarHelp32Snapshot funktionierts :thumb:

Danke an alle.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz