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 を返します。

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

4

2 に答える 2

0

SymLoadModule64C#での使用法を実装する方法に関する「主要な質問」の作業コード(最後に表示される返信)については、 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

最初のパラメーターとして渡すプロセス ハンドルはSymLoadModule64、任意の値にすることができます。実際には、プロセスに対して有効なハンドルである必要はありません。ただし、使用するプロセス ハンドルごとに、最初に を呼び出してその値の dbghelp を初期化する必要がありますSymInitialize

に関してはGetCurrentProcess、値 -1 は現在のプロセスを参照する疑似ハンドルです。ハンドルを必要とするほとんどの Windows 関数で使用できます。関数が擬似ハンドルを返すという事実は、非常によく文書化されていることに注意してください。

于 2011-10-24T16:23:24.087 に答える