获取名称/描述Startaddress或来自进程中的线程(Delphi / Pascal)

时间:2011-04-26 16:06:12

标签: windows delphi winapi

Process Hacker在C中有一个流程管理器。

在流程管理器中双击流程管理器时,例如资源管理器
你会看到很多信息,包括:
与流程相关的主题。 PDD,循环Delta开始,地址,优先级。

我试着在Delphi中做类似的事情,但我只得到TID和优先级......
我不能把信息开始地址如下:“msiltcfg.dll 0x258!”或者只能返回 00630EFA。

(原始)申请流程黑客在下图中显示信息:

http://i54.tinypic.com/mrcztx.png

我该如何解决这个问题?基于下面的代码示例。

procedure TForm1.Button7Click (Sender: TObject);
var
  tbi: THREAD_BASIC_INFORMATION;
  hThreadSnap, Process, hThread, ThreadInfo: THandle;
  te32: tagTHREADENTRY32;
  me32: MODULEENTRY32;
  th32: THREADENTRY32;
  dwPID: DWORD;

  startaddr: Pointer;
  Status: LongInt;
  Error: DWORD;
  modname: String;
  hToken: DWORD;
  TKP: TOKEN_PRIVILEGES;
  otkp: TOKEN_PRIVILEGES;
  dwLen: dword;


begin
  hThreadSnap: = CreateToolhelp32Snapshot (TH32CS_SNAPTHREAD, 0);
  if hThreadSnap = INVALID_HANDLE_VALUE then 
   Exit;
  try
    dwPID: = GetProcessID (Trim (Edit1.Text));

    te32.dwSize: = SizeOf (THREADENTRY32);

    me32.dwSize: = SizeOf (MODULEENTRY32);

    ListBox1.Items.Clear;
    ListBox2.Items.Clear;

    if not Thread32First (hThreadSnap, te32) then
      Exit;

    repeat
      if te32.th32OwnerProcessID = dwPID then 
      begin
        hThread: = OpenThread (THREAD_ALL_ACCESS,
        False, te32.th32ThreadID);
        status: = ZwQueryInformationThread (hThread,
        9, 
        ThreadQuerySetWin32StartAddress {}
        @Startaddr,
        SizeOf (startaddr)
        @ DwLen);

        listbox1.Items.AddObject (Format ('StartAddress:% p'
        [Startaddr]) + 'ID:' + IntToStr(te32.th32ThreadID), TObject (hThread));

        if hThread <> 0 then
          CloseHandle (hThread);
      end;
    Until not Thread32Next (hThreadSnap, te32);
  finally
    CloseHandle (hThreadSnap);
  end;
end;

1 个答案:

答案 0 :(得分:2)

Open Source SynCommons.pas单元中查看我们的日志记录类:您可以将任何方法的堆栈跟踪到日志文件中。如果.map(或其压缩的.mab等效)可用,则将显示行号。

我正在开发一个日志查看器,能够在保存.map / .mab文件的过程中添加源代码行。

它现在由单元测试类使用,因此任何失败都会在日志中创建一个包含源代码行和堆栈跟踪的条目:

  

C:\ Dev \ lib \ SQLite3 \ exe \ TestSQL3.exe 0.0.0.0(2011-04-13)       主机=笔记本电脑用户= MyName CPU = 2 * 0-15-1027 OS = 2.3 = 5.1.2600 Wow64 = 0 Freq = 3579545       TSynLogTest 1.13 2011-04-13 05:40:25

     

20110413 05402559 fail TTestLowLevelCommon(00B31D70)低级公共:TDynArray“”堆栈跟踪0002FE0B SynCommons.TDynArray.Init(15148)00036736 SynCommons.Test64K(18206)0003682F SynCommons.TTestLowLevelCommon._TDynArray(18214)000E9C94 TestSQL3(163)< / p>

没有记录的测试服(TSynTests)和带测井的测试服(TSynTestsLogged)之间的区别仅在于:

procedure TSynTestsLogged.Failed(const msg: string; aTest: TSynTestCase);
begin
  inherited;
  with TestCase[fCurrentMethod] do begin
    fLogFile.Log(sllFail,'%: % "%"',
      [Ident,TestName[fCurrentMethodIndex],msg],aTest);
  end; {with}
end;

此处使用sllFail级别,但您可以使用任何可用级别。