Announcement

Collapse
No announcement yet.

ThreadHandle eines Threads bekommen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ThreadHandle eines Threads bekommen

    Ich versuche unter Win98se das Handle zu einen Thread zu bekommen.<BR>
    Ich besitze die process-id und die thread-id.<BR>
    Hintergrund ist, das ich die thread-priority eines Threads von 'idle'<BR>auf 'normal' setzen will (ist ein distributed computing-Programm).<BR>
    Um SetThreadPriority(handle, priority) einsetzen zu koennen, braeucht ich <BR>das Handle zu dem Thread. <BR>
    In der MSDN ist die Funktion OpenThread dokumentiert, die aber unter Win98 <BR>nicht zur Verfuegung steht.<BR>
    Kennt einer von euch einen Kniff, wie ich an das entsprechende Handle komm?

  • #2
    vll wirds per code anschaulicher:<br>
    <PRE>
    uses ...,TlHelp32;
    </PRE><br>
    <PRE>
    //processlist/////////////////////////////////////////////////////////////////
    procedure TForm1.GetProcessList;
    var
    hProcessSnap, hProcess: THandle;
    pe32: PROCESSENTRY32;
    dwPPriorityClass: DWORD;
    begin
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    if hProcessSnap = INVALID_HANDLE_VALUE then
    begin
    CloseHandle(hProcessSnap);
    Exit;
    end;

    pe32.dwSize := SizeOf(PROCESSENTRY32);
    if Process32First(hProcessSnap, pe32) then
    repeat
    hProcess := OpenProcess (PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
    dwPPriorityClass := GetPriorityClass (hProcess);
    GetThreadList(pe32.th32ProcessID, ExtractFileName(pe32.szExeFile));
    GetModuleList(pe32.th32ProcessID, pe32.th32ModuleID, ExtractFileName(pe32.szExeFile));
    CloseHandle (hProcess);

    //ausgabe
    Memo1.Lines.Add('Process: '+ExtractFileName(pe32.szExeFile));
    Memo1.Lines.Add('th32ParentProcessID: '+IntToStr(pe32.th32ParentProcessID));
    Memo1.Lines.Add('th32ProcessID: '+IntToStr(pe32.th32ProcessID));
    Memo1.Lines.Add('th32ModuleID: '+IntToStr(pe32.th32ModuleID));
    Memo1.Lines.Add('th32DefaultHeapID: '+IntToStr(pe32.th32DefaultHeapID));
    Memo1.Lines.Add('Path: '+pe32.szExeFile);
    Memo1.Lines.Add('dwSize: '+IntToStr(pe32.dwSize));
    Memo1.Lines.Add('cntUsage: '+IntToStr(pe32.cntUsage));
    Memo1.Lines.Add('cntThreads: '+IntToStr(pe32.cntThreads));
    Memo1.Lines.Add('pcPriClassBase: '+IntToStr(pe32.pcPriClassBase));

    case dwPPriorityClass of
    IDLE_PRIORITY_CLASS : Memo1.Lines.Add('Process Priority: Idle');
    NORMAL_PRIORITY_CLASS : Memo1.Lines.Add('Process Priority: Normal');
    HIGH_PRIORITY_CLASS : Memo1.Lines.Add('Process Priority: High');
    REALTIME_PRIORITY_CLASS : Memo1.Lines.Add('Process Priority: Realtime');
    end;
    Memo1.Lines.Add('dwFlags: '+IntToStr(pe32.dwFlags));
    Memo1.Lines.Add('_________________________________ _________________');
    until not Process32Next(hProcessSnap, pe32);
    CloseHandle (hProcessSnap);
    end;
    </PRE&gt

    Comment


    • #3
      <PRE>
      //threadlist//////////////////////////////////////////////////////////////////
      procedure TForm1.GetThreadList(p_id: Cardinal; p_name: String);
      var
      dwTPriorityClass: DWORD;
      te32: THREADENTRY32;
      hThreadSnap, hThread: THandle;
      begin
      hThreadSnap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, p_id);
      te32.dwSize := SizeOf(THREADENTRY32);

      //Thread32First(hSnapshot:Cardinal; var lpte:tagTHREADENTRY32): LongBool;
      //Thread32Next(hSnapshot:Cardinal; var lpte:tagTHREADENTRY32): LongBool;

      if Thread32First(hThreadSnap, te32) then
      repeat
      if te32.th32OwnerProcessID = p_id then
      begin
      //ausgabe
      Memo2.Lines.Add('ProcName:'+ p_name); //zugehoeriger processname, dient der uebersicht
      Memo2.Lines.Add('dwSize: '+ IntToStr(te32.dwSize));
      Memo2.Lines.Add('cntUsage: '+ IntToStr(te32.cntUsage));
      Memo2.Lines.Add('th32ThreadID: '+ IntToStr(te32.th32ThreadID));
      Memo2.Lines.Add('th32OwnerProcessID: '+ IntToStr(te32.th32OwnerProcessID));
      Memo2.Lines.Add('tpBasePri: '+ IntToStr(te32.tpBasePri));
      Memo2.Lines.Add('tpDeltaPri: '+ IntToStr(te32.tpDeltaPri));
      Memo2.Lines.Add('dwFlags: '+ IntToStr(te32.dwFlags));

      {hThread := ? ; //<B>hier brauch ich das handle</B>
      if hThread = 0 then
      begin
      CloseHandle(hThread);
      Exit;
      end;
      dwTPriorityClass := GetThreadPriority(hThread);
      case dwTPriorityClass of
      THREAD_PRIORITY_NORMAL : Memo2.Lines.Add('ThreadPriority: Normal');
      THREAD_PRIORITY_ABOVE_NORMAL : Memo2.Lines.Add('ThreadPriority: Above Normal');
      THREAD_PRIORITY_HIGHEST : Memo2.Lines.Add('ThreadPriority: Highest');
      THREAD_PRIORITY_TIME_CRITICAL : Memo2.Lines.Add('ThreadPriority: Time Critical');
      THREAD_PRIORITY_ERROR_RETURN : Memo2.Lines.Add('ThreadPriority: Error Return');
      end;
      if ((p_name = 'FOLDTRAJLITE.EXE') and (dwTPriorityClass <> THREAD_PRIORITY_NORMAL)) then
      SetThreadPriority(hThread, THREAD_PRIORITY_NORMAL);
      CloseHandle(hThread);}

      Memo2.Lines.Add('---------------------------');
      end;
      until not Thread32Next(hThreadSnap, te32);
      CloseHandle(hThreadSnap);
      end;
      </PRE&gt

      Comment


      • #4
        Ich sag es mal so "ja es gibt unter Win95 einen Trick". Dazu wird auf die internen Datenstrukturen des Thread Control Blocks und die Handle Tabelle des Prozesses zugegriffen. Man programmiert sozusagen eine Funktion die OpenThread() für Win9x simuliert. Allerdings ist das übelste Trickprogramierung, d.h. nicht das diese unsauber oder schwer zu begreifen wäre. Suche im Web nach OpenThread() + Win95 und du solltest fündig werden.

        Gruß Hage

        Comment


        • #5
          ich glaube, das ich das richtige fuer mich gefunden habe (obsfucator eigentlich obfuscator, hack der openprocess-funktion...).<br>
          da sie mir keinen direkten link gegeben haben, geh ich davon aus,<br>
          das links oder codebeispiele eher unerwuenscht sind. <br>
          fuer mich sieht das teilweise wie uebelste assembler-programmierung aus (was mir ehrlich gesagt zu hoch ist).<br>
          das ganze waere als c-code verfuegbar, nur tu ich mich schwer,<br>
          das ganze nach delphi zu konvertieren (grad die pointer sachen).<br>
          aber danke fuer die antwort

          Comment


          • #6
            Genau das ist es, aber Assembler habe ich dafür nicht nutzen müssen (bis auf 1 Zeile).
            Unerwünscht oder nicht spielt eigentlich weniger ne Rolle. Wichtiger ist es mir das Du dich auf die Suche begeben musst denn nur so verstehst du am Ende wie es funktioniert. Deswegen meine ich das es falsch wäre hier einen fertigen Source zu posten, es folgen dann immer mehr Fragen. Derjenige der solche Funktionen nutzt sollte schon wissen was er tut. Veröffentliche ich einen Source hier habe ich damit keinem geholfen.

            Gruß Hage

            Comment


            • #7
              ich hatte etwas gefunden, was mehrere zeilen per asm modifiziert (http://www.sistemo.com/Articles/ForceLibrary.htm).<br>
              ist diese OpenThread9x-function denn zu umstaendlich geloest

              Comment


              • #8
                Hm, diese Funktion scannt den OpenProcess Kernel Code nach bestimmten Maschinencode und nutzt diese Informationen um ein OpenThread zu machen. Der Weg den ich meine funktioniert anders. Persönlich finde ich den gezeigten Weg nicht so gut. Aber wenn er unter jeder Version funktioniert dann auch gut.

                Gruß Hage

                Comment

                Working...
                X