SymLoadModule64 и GetCurrentProcess из C # - PullRequest
       51

SymLoadModule64 и GetCurrentProcess из C #

0 голосов
/ 24 октября 2011

Я хочу использовать библиотеку 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);

приводит кЗагруженный модуль имеет значение 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 голосов
/ 24 октября 2011

Дескриптор процесса, который вы передаете в качестве первого параметра в SymLoadModule64, может быть произвольным значением, фактически он не должен быть действительным дескриптором процесса. Однако для каждого дескриптора процесса, который вы хотите использовать, вы должны сначала инициализировать dbghelp для этого значения, вызвав SymInitialize.

Что касается GetCurrentProcess, значение -1 является псевдокендом, относящимся к текущему процессу. Его можно использовать с большинством функций Windows, которые ожидают дескриптор. Обратите внимание, что тот факт, что функция возвращает псевдо-дескриптор, очень хорошо задокументирован.

0 голосов
/ 24 октября 2011

Рабочий код для вашего "основного вопроса" о том, как реализовать использование SymLoadModule64 в C # (ответ отображается в конце), см. http://social.msdn.microsoft.com/Forums/en/netfxtoolsdev/thread/d79f7876-6d37-429f-937c-57797462473a

Также см. Этот вопрос SO и ответ DbgHelp.dll: вызов SymGetModuleInfo64 из C # - в нем есть хороший код, который поможет вам начать работу ...

...