我想使用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的原因( )失败了。提前谢谢。
答案 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功能。请注意,函数返回伪句柄的事实已有详细记录。