来自C#的SymLoadModule64和GetCurrentProcess

时间:2011-10-24 15:38:51

标签: c# c++ dbghelp

我想使用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的原因( )失败了。提前谢谢。

2 个答案:

答案 0 :(得分:0)

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

另请参阅此问题及答案DbgHelp.dll : calling SymGetModuleInfo64 from C# - 它有一些很好的代码可以帮助您入门......

答案 1 :(得分:0)

作为第一个参数传递给SymLoadModule64的进程句柄可以是任意值,它实际上不必是进程的有效句柄。但是,对于要使用的每个进程句柄,必须首先通过调用SymInitialize来初始化该值的dbghelp。

对于GetCurrentProcess,值-1是指向当前进程的伪句柄。它可以用于大多数期望处理的Windows功能。请注意,函数返回伪句柄的事实已有详细记录。