CreateProcess STATUS_DLL_NOT_FOUND - какая DLL?

У меня есть процесс, который вызывает CreateProcess. Похоже, что CreateProcess возвращает ненулевой показатель успеха. Тем не менее, РУЧКА для процесса затем сразу же устанавливается, указывая, что процесс вышел. Когда я вызываю GetExitCodeProcess, возвращается STATUS_DLL_NOT_FOUND.

Я понимаю, что DLL отсутствует. Я даже точно знаю, какой именно. Однако я не понимаю, как это понять программно.

Я заметил, что Windows представит диалог, в котором говорится, что процесс не запускался, потому что он не смог найти указанную DLL (снимок экрана: http://www.mediafire.com/view/?kd9ddq0e2dlvlb9). В диалоговом окне Windows указывает, какая DLL отсутствует. Тем не менее, я не нахожу никакого способа получить эту информацию самостоятельно.

Если процесс не запускается и возвратит STATUS_DLL_NOT_FOUND, как я программно получаю имя библиотеки, с которой был связан целевой процесс, который не может быть найден? Таким образом, я могу автоматически записать в сообщение об ошибке, что DLL кажется отсутствующим или поврежденным в данной установке.

3 ответа

CreateProcess возвращает 0, указывающий на успех.

CreateProcess() возвращает a BOOL, где 0 - FALSE, а также неудача.

Если процесс не запускается и возвратит STATUS_DLL_NOT_FOUND, как я программно получаю имя библиотеки, с которой был связан целевой процесс, который не может быть найден?

К сожалению, для этого нет API. Единственным вариантом будет доступ вручную и перечисление исполняемой таблицы IMPORTS, чтобы узнать, какие библиотеки DLL они используют, а затем рекурсивно получить доступ и перечислить их таблицы IMPORTS, вручную проверив каждую найденную DLL-ссылку, чтобы увидеть, существует ли этот DLL файл на пути поиска ОС или нет.


Если DLL статически связана, вы можете пройти iat и посмотреть, существует ли dll. Если dll динамически загружается, то запуск процесса приостановлен и перехват LoadLibrary (или вместо того, чтобы перехватывать эмуляцию отладчика) является единственным способом, который я вижу.


Очень сложный способ: Разбор файлов .EXE и .DLL и создание дерева зависимостей .DLL файлов.

Я не думаю, что есть способ получить список DLL файлов, которые отсутствуют: Когда Windows обнаруживает один отсутствующий DLL файл, он перестает загружаться, поэтому, если отсутствует один DLL файл, вы не узнаете, что больше DLL файлов отсутствуют.

Еще одна проблема, которая может возникнуть в том, что старые версии DLL могут отсутствовать "экспорт" (функции). Это еще труднее обнаружить, чем дерево зависимостей.

licensed under cc by-sa 3.0 with attribution.