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 を返します。
だから:「主要な」質問(C#からSymLoadModule64()を機能させる方法)に関するアイデアをいただければ幸いです。もちろん、GetCurrentProcess()への呼び出しが失敗する理由も知りたいです。前もって感謝します。