Я пытаюсь использовать DIA SDK разрешить некоторые адреса, которые я сохраняю в некотором контейнере, используя _penter и, кажется, работает для стандартных функций (в выводе я вижу много станд материал), но ничего из моего приложения (которое в данном случае является собственным модулем node.js).
Чтобы получить адрес вызывающей функции, я использую это в _penter:
mov ecx, [esp + 0Ch]
push ecx
И позже для разрешения сохраненных адресов, которые я использую:
auto processHandle = GetCurrentProcess();
HMODULE moduleHandles[1024] = {nullptr};
DWORD bytesUsed;
if (EnumProcessModules( processHandle,
moduleHandles,
sizeof(moduleHandles),
&bytesUsed)) {
for (auto i = 0u; i < (bytesUsed / sizeof(HMODULE)); i++) {
MODULEINFO moduleInfo = {0};
if (GetModuleInformation( processHandle,
moduleHandles[i],
&moduleInfo,
sizeof(MODULEINFO))) {
auto loadAddress = (DWORD)(moduleInfo.lpBaseOfDll);
auto endAddress = loadAddress + moduleInfo.SizeOfImage;
if (loadAddress <= address && address <= endAddress) {
wchar_t moduleName[MAX_PATH] = {};
if (GetModuleFileNameExW( processHandle,
moduleHandles[i],
moduleName,
MAX_PATH)) {
CComPtr<IDiaDataSource> diaSource;
auto result = diaSource.CoCreateInstance( CLSID_DiaSource,
nullptr,
CLSCTX_INPROC_SERVER);
if (SUCCEEDED(result)) {
if (SUCCEEDED(diaSource->loadDataForExe(moduleName,
nullptr,
nullptr))) {
CComPtr<IDiaSession> mPtrSession;
if (SUCCEEDED( diaSource->openSession(&mPtrSession))) {
result = mPtrSession->put_loadAddress(reinterpret_cast<ULONGLONG>(moduleHandles[i]));
if (SUCCEEDED(result)) {
IDiaSymbol* pFunc = nullptr;
if (SUCCEEDED( mPtrSession->findSymbolByVA( address,
SymTagFunction,
&pFunc))) {
// do stuff here
}
}
}
}
}
}
}
}
}
}
Для не стандартных символов кажется, что SUCCEEDED (mPtrSession-> findSymbolByVA ()) проверка прошла, но возвращенный IDiaSymbol имеет значение null.
Для компиляции я использую мошенничать который в свою очередь использует cl.exe и для флагов компиляции я использую / MP / MTd / EHsc / GR / Gh / DUNICODE / DNOMINMAX / ДОПОЛНИТЕЛЬНО: НЕТ
Я что-то здесь не так делаю?
Задача ещё не решена.
Других решений пока нет …