Вызовы LoadLibrary, возвращенные указатели не сохранены - PullRequest
3 голосов
/ 11 января 2012

Я исправляю чужой код и заметил, что человек несколько раз вызывает LoadLibrary, как показано ниже:

LoadLibrary("C:\\Windows\\SysWOW64\\msjint40");
LoadLibrary("C:\\Windows\\SysWOW64\\msjtes40");
LoadLibrary("C:\\Windows\\SysWOW64\\expsrv");

Какой смысл в этом?Указатели возврата не сохраняются!Позже программа вызывает несколько других DLL, которые используют функции из MSJTES40, но не в контексте того, где загружаются библиотеки.

В комментарии говорится - "else preload to optimize", но как остальная часть программы узнает, где находятся библиотеки DLL?

Спасибо за любую информацию.

1 Ответ

4 голосов
/ 11 января 2012

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

См. Документацию

Если указанный модуль является DLL, которая еще не загружена для вызывающего процесса, система вызывает функцию DLL DllMain с помощьюЗначение DLL_PROCESS_ATTACH.

Также из документации.

Не делайте предположений о версии операционной системы на основе вызова LoadLibrary, который выполняет поиск DLL.Если приложение работает в среде, где DLL законно отсутствует, но вредоносная версия DLL находится в пути поиска, вредоносная версия DLL может быть загружена

При условии жесткогорасположение закодированной DLL открывает вашу программу до всевозможных неприятностей!

...