Загрузка DLL в программировании Windows

Я хотел получить набор API Native, использующий GetProcAddressto. в методе, который я использую сначала с помощью GetModuleHandle, получил рассматриваемый DLLHandle, а затем адрес API, который является моим желанием, берется GetProcAddress. это работает для функций в ntdll, но для user32 и advapi32 функция GetModuleHandle возвращает нулевое значение. для решения этой проблемы, что вы предлагаете?

enter code here

HANDLE Proc = GetCurrentProcess();
HMODULE hNtdll = GetModuleHandle(TEXT("ntdll.dll"));
FARPROC function_address = GetProcAddress(hNtdll, function_name);

0

Решение

GetModuleHandle() требует, чтобы DLL уже была загружена:

Получает дескриптор модуля для указанного модуля. Модуль должен быть загружен вызывающим процессом.

ntdll.dll всегда будет загружен, но user32.dll а также advapi32.dll не обязательно загружаются по умолчанию. На основании вашего описания звучит так, как будто код вызывает GetModuleHandle() во-первых, что приведет к сбою, если DLL еще не загружена (проверьте значение GetLastError() в случае неудачи).

использование LoadLibrary() для DLL, которые не загружены по умолчанию. Однако, используя LoadLibrary() в случае, если GetModuleHandle() неудачи — опасная стратегия, так как некоторые другие процессы могут FreeLibrary() DLL, к которой вы приобрели дескриптор через GetModuleHandle() (что означает, что любые адреса функций, которые вы получили через этот дескриптор, являются недопустимыми, поскольку DLL больше не находится в памяти). С помощью LoadLibrary()с последующим FreeLibrary(), это более безопасный подход, так как он гарантирует, что DLL не будет выгружена, пока вы FreeLibrary() Это.

3

Другие решения


По вопросам рекламы [email protected]