Einzelnen Beitrag anzeigen

gandime
(Gast)

n/a Beiträge
 
#1

hThread von einem externen Programm?

  Alt 13. Apr 2009, 04:25
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
  Mit Zitat antworten Zitat