0

我想使用 dbghelp 库从 pdb 文件中获取一些类型和程序信息。现在,因为我更喜欢 C# 而不是 C++,所以我目前正试图让它在 C# 中工作。我目前被困在对 SymLoadModule64 的调用中。我在 C++ 中有一个工作调用,如下所示:

const TCHAR* pModName = argv[1]; 
HANDLE currentProcHandle = GetCurrentProcess();

DWORD64 ModBase = ::SymLoadModule64 ( 
            currentProcHandle,
            NULL,
            pModName,
            NULL,
            0, 
            0);

但是,当尝试以某种方式从 C# 调用它时,我不断收到错误消息:

    [DllImport("dbghelp.dll", SetLastError = true)]
    public static extern ulong SymLoadModule64(IntPtr hProcess, IntPtr hFile,
    string ImageName, string ModuleName,
    ulong BaseOfDll, uint SizeOfDll);

[...]

            var loadedModule = SymLoadModule64(
                currentProcHandle,
                System.IntPtr.Zero,
                "C:\\Path\\To\\Executable.exe",
                string.Empty,
                0,
                0);

导致loadedModule 设置为0 并且Marshal.GetLastWin32Error() 返回6 (ERROR_INVALID_HANDLE)。现在,我认为这似乎是句柄的问题,我可以只使用本机函数来检索它(以避免由于 c# 句柄检索内容与 c++ 期望的不兼容而导致的任何陷阱等)。然而,虽然托管

Process.GetCurrentProcess().Handle;

总是返回一些或多或少有意义的东西(1008、1036、...),调用

[DllImport("kernel32.dll")]
static extern IntPtr GetCurrentProcess();
GetCurrentProcess();

总是返回 -1。

所以:由于我很欣赏关于“主要”问题的任何想法(如何让 SymLoadModule64() 从 C# 工作),我当然也很想知道为什么对 GetCurrentProcess() 的调用失败。提前致谢。

4

2 回答 2

0

有关如何SymLoadModule64在 C# 中实现使用的“主要问题”的工作代码(最后显示的回复)请参阅http://social.msdn.microsoft.com/Forums/en/netfxtoolsdev/thread/d79f7876-6d37-429f -937c-57797462473a

另请参阅此 SO 问题并回答DbgHelp.dll :从 C# 调用 SymGetModuleInfo64 - 它有一些不错的代码可以帮助您入门...

于 2011-10-24T15:50:01.723 回答
0

The process handle that you pass as the first parameter to SymLoadModule64 can be an arbitrary value, it does not actually have to be a valid handle to a process. However, for every process handle you want to use, you must first initialize dbghelp for that value by calling SymInitialize.

As for GetCurrentProcess, the value -1 is a pseudo-handle referring to the current process. It can be used with most Windows functions that expect a handle. Note that the fact that the function returns the pseudo-handle is very well documented.

于 2011-10-24T16:23:24.087 回答