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