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 hThread von einem externen Programm? (https://www.delphipraxis.net/132456-hthread-von-einem-externen-programm.html)

gandime 13. Apr 2009 03:25


hThread von einem externen Programm?
 
Hi,
ist es möglich ein hThread mit den rechten THREAD_GET_CONTEXT und THREAD_SET_CONTEXT von einem externen Programm in Delphi zu bekommen, ohne das man es selbst gestartet hat?
Wenn man einen Process mit CreateProcess() erstellt hat, hat man ja die guten ProcessInfo, in welchen auch die Thread-Informationen enthalten sind!

hab da mal was zusammen geschrieben^^

Delphi-Quellcode:
function OpenThread(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwThreadId: DWORD): DWORD; stdcall;
external 'kernel32.dll';

const
THREAD_GET_CONTEXT = $0008;
THREAD_SET_CONTEXT = $0010;
THREAD_SUSPEND_RESUME = $0002;

function CheckProcess(ExeFileName: string; var hProcess:Cardinal; var hThread:Cardinal): boolean;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  TE32: TThreadEntry32;
begin
  result:=false;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS or TH32CS_SNAPTHREAD, 0);
  FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  while Integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
      UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
      UpperCase(ExeFileName))) then
      begin
        hProcess:=OpenProcess(PROCESS_ALL_ACCESS , false,FProcessEntry32.th32ProcessID);
        TE32.dwSize := SizeOf(ThreadEntry32);
        if not Thread32First(FSnapshotHandle, TE32) then RaiseLastWin32Error;
        repeat
          if TE32.th32OwnerProcessID = FProcessEntry32.th32ProcessID then
          begin
            hThread:=OpenThread(THREAD_GET_CONTEXT and THREAD_SET_CONTEXT, false,TE32.th32ThreadID);
            if hThread<>0 then
            begin
              result:=true;
              CloseHandle(FSnapshotHandle);
              exit;
            end;
          end;
        until not Thread32Next(FSnapshotHandle, TE32);
      end;
     ContinueLoop:=Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;
Blos wenn ich bei OpenThread() THREAD_GET_CONTEXT and THREAD_SET_CONTEXT als rechte eingebe bekomme ich keinen hThread... wenn ich blos einen der beiden rechte beantrage gibt es massig Threads die ich bekomme!

mfg
gandime

jaenicke 13. Apr 2009 08:01

Re: hThread von einem externen Programm?
 
Du darfst auch nicht and zum Verknüpfen benutzen... Du musst or benutzen.

gandime 13. Apr 2009 14:35

Re: hThread von einem externen Programm?
 
oh stimmt und ich brauchte doch volle Thread Rechte^^
für die die es sich nicht noch etra raussuchen wollen:
Delphi-Quellcode:
STANDARD_RIGHTS_REQUIRED = $F0000;
SYNCHRONIZE = $100000;
THREAD_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $3FF);
Danke! War Gestern doch etwas spät^^

Luckie 13. Apr 2009 17:37

Re: hThread von einem externen Programm?
 
Ich frae mich, wer diesen Quatsch mal angefangen hat:
Delphi-Quellcode:
while Integer(ContinueLoop) <> 0 do
Warum wird eine Boolean Variable benutzt, wenn sie dann doch nach Integer gecastet wird? Dieser Code wird ohne Sinn und Verstand immer und immer wieder kopiert.

Process32Next gibt einen BOOL zurück, warum also nicht:
Delphi-Quellcode:
while ContinueLoop do


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:12 Uhr.

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