Ошибка с получением имени файла модуля: ошибка 126 «Не удалось найти указанный модуль» в результатах EnumProcessModules

#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 является текущим процессом