я использую SymFromName Функция Dbghelp, чтобы получить значение локальной переменной в функции.
Перед вызовом SymFromName я вызываю SymSetContext и передаю адрес моей целевой функции, чтобы получить локальные переменные. Установленная часть контекста работает отлично, как я тестировал. (Создавая переменные со случайными именами и находя их с помощью SymFromName)
TCHAR szSymbolName[MAX_SYM_NAME];
ULONG64 buffer[(sizeof(SYMBOL_INFO) +
MAX_SYM_NAME * sizeof(TCHAR) +
sizeof(ULONG64) - 1) /
sizeof(ULONG64)];
PSYMBOL_INFO pSymbol = (PSYMBOL_INFO)buffer;
strcpy_s(szSymbolName, MAX_SYM_NAME, TEXT("NAME_OF_THE_VARIABLE"));
pSymbol->SizeOfStruct = sizeof(SYMBOL_INFO);
pSymbol->MaxNameLen = MAX_SYM_NAME;
HANDLE hProcess = GetCurrentProcess();
IMAGEHLP_STACK_FRAME sf;
sf.InstructionOffset = ADDRESS_OF_THE_FUNCTION;
if (SymSetContext(hProcess, &sf, 0) && SymFromName(hProcess, szSymbolName, pSymbol))
{
if (pSymbol->Flags & SYMFLAG_REGREL) {
// Hmmmmmmmm
} else {
VAR_TYPE value = *reinterpret_cast<VAR_TYPE*>(pSymbol->Address);
}
}
Проблема в возвращаемой информации о символах, pSymbol
имеет SYMFLAG_REGREL
флаг, который в соответствии с документы означает, что он имеет адрес «относительный регистр».
pSymbol->Address
это -4, pSymbol->Register
30006 и, как я видел в единственном рабочем примере кода, который я смог найти, TypeInfoDump, это значения, которые имеют значение в таких случаях. Но в этом примере не указано, как получить значение, хранящееся в этом нечетном регистре.
Что это за номер 30006? Разве (универсальные) регистры не названы как EAX, EBX и тому подобное?
Я также нашел эти два кода, которые пытаются получить значение:
write_var_values
функция в этот код а также fill_sym_lvalue
функция в этот код что на самом деле использует memory_get_register
функция ВотНо они не очень помогли. В случае, если значение находится в памяти, значение может быть легко прочитано с помощью приведения pSymbol->Address
к типу указателя и разыменованию его, но я понятия не имею, что делать с этим «30002» !!
Задача ещё не решена.
Других решений пока нет …