#c #windows #winapi #psapi
#c #Windows #winapi #psapi
Вопрос:
Я сгенерировал список модулей из результата EnumProcessModules() и попытки получить имена файлов модулей из этого списка с помощью функции GetModuleFileName().
auto sizeInBytes = getModulesSize();
std::vector<HMODULE> hmodules(sizeInBytes / sizeof(HMODULE), 0);
if (!EnumProcessModules(d_process, hmodules.data(), sizeInBytes, amp;sizeInBytes))
{
CUSTOM_THROW("failed to load process modules);
}
WCHAR buffer[MAX_PATH];
std::vector<std::wstring> resu<
for (auto hmod : hmodules)
{
DWORD size = GetModuleFileName(hmod, buffer, MAX_PATH);
if (!size)
{
CUSTOM_THROW("failed to get module path");
}
}
Но время от времени, по неизвестной причине, иногда выдается исключение «не удалось получить путь к модулю».
Как я могу исследовать, какие модули вызывают это исключение во время выполнения или что-то еще?
Другой вопрос в том, что может привести к тому, что модуль загружается и доступен через EnumProcessModules, но становится недоступным через GetModuleFileName?
Комментарии:
1. Вы настроили себя на гонку TOCTOU . Вы мало что можете сделать, кроме игнорирования сбоя или приостановки целевого процесса.
2. CUSTOM_THROW внутри вызова GetLastError() и ошибка log 126
3. EnumProcessModules предназначен для реализации отладчика, сценария, в котором вы можете быть достаточно уверены, что сможете предотвратить или обнаружить завершение процесса. Вместо этого используйте CreateToolhelp32Snapshot().
4.
GetModuleFileName
найдите модуль в вашем текущем процессе, когдаEnumProcessModules
вd_process
5. в контексте проблемы d_process является текущим процессом