相关疑难解决方法(0)

从另一个进程获取win32线程的StartAddress

背景:

我在Win32中编写了一个多线程应用程序,我使用Process来自System.Diagnostics命名空间的类从C#代码开始.

现在,在C#代码中,我想获取在Win32应用程序中创建的每个线程的起始地址的名称/符号,以便我可以将与线程相关的信息(例如CPU使用情况)记录到数据库中.基本上,C#代码启动Win32应用程序的多个实例,监视它们,如果需要则终止,然后将info/error/exceptions/reason/etc记录到数据库.

为此,我已经包装了两个Win32 API viz.SymInitialize以及SymFromAddr我自己编写的程序友好API,如下所示:

extern "C"
{
    //wraps SymInitialize
    DllExport bool initialize_handler(HANDLE hModue);

    //wraps SymFromAddr
    DllExport bool get_function_symbol(HANDLE hModule, //in
                                       void *address,  //in
                                       char *name);    //out
}
Run Code Online (Sandbox Code Playgroud)

然后使用pinvoke从C#代码调用这些API.但它不起作用,并GetLastError提供126 错误代码,这意味着:

指定的模块无法找到

我传递Process.HandlehModule这两个函数; initialize_handler似乎工作,但get_function_symbol没有; 它给出了上述错误.我不确定我是否通过了正确的手柄.我尝试传递以下句柄:

Process.MainWindowHandle
Process.MainModule.BaseAddress
Run Code Online (Sandbox Code Playgroud)

两者都在第一步失败(即调用时initialize_handler).我Process.Threads[i].StartAddress作为第二个参数传递,这似乎是失败的原因,ProcessThread.StartAddress似乎是RtlUserThreadStart函数的地址,而不是特定于应用程序的启动函数的地址.在MSDN说一下吧:

每个Windows线程实际上都是在系统提供的函数中开始执行,而不是应用程序提供的函数.因此,主线程的起始地址与系统中的每个Windows进程相同(因为它表示系统提供的函数的地址).但是,StartAddress属性允许您获取特定于应用程序的起始函数地址.

但它没有说明如何使用ProcessThread.StartAddress获取特定于应用程序的startinbg函数地址.

题:

我的问题是从另一个应用程序(用C#编写)获取win32线程的起始地址,因为一旦我得到它,我将使用上面提到的API得到名称.那么如何获得起始地址?


我从C++代码测试了我的符号查找API.如果给出正确的地址,它可以很好地将地址解析为符号.

这是我的p/invoke声明:

[DllImport("UnmanagedSymbols.dll", SetLastError = true, …
Run Code Online (Sandbox Code Playgroud)

c# c++ dll pinvoke process

22
推荐指数
1
解决办法
6614
查看次数

标签 统计

c# ×1

c++ ×1

dll ×1

pinvoke ×1

process ×1