gpt4 book ai didi

windows - 获取名称/描述 Startaddress 或从进程中的线程 (Delphi/Pascal)

转载 作者:可可西里 更新时间:2023-11-01 12:05:04 26 4
gpt4 key购买 nike

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

当您在流程管理器中双击某个流程时,例如探索者
您会看到很多信息,包括:
与流程相关的主题。 PDD、周期增量开始、地址、优先级。

好吧,我尝试在 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;

最佳答案

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

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

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

C:\Dev\lib\SQLite3\exe\TestSQL3.exe 0.0.0.0 (2011-04-13) Host=Laptop User=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) Low level common: TDynArray "" stack trace 0002FE0B SynCommons.TDynArray.Init (15148) 00036736 SynCommons.Test64K (18206) 0003682F SynCommons.TTestLowLevelCommon._TDynArray (18214) 000E9C94 TestSQL3 (163)

没有日志记录的测试服 (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 级别,但您可以使用任何可用的级别。

关于windows - 获取名称/描述 Startaddress 或从进程中的线程 (Delphi/Pascal),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5793106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com