Я хочу использовать библиотеку 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() не удается.Заранее спасибо.