Я хотел получить набор 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);
GetModuleHandle()
требует, чтобы DLL уже была загружена:
Получает дескриптор модуля для указанного модуля. Модуль должен быть загружен вызывающим процессом.
ntdll.dll всегда будет загружен, но user32.dll а также advapi32.dll не обязательно загружаются по умолчанию. На основании вашего описания звучит так, как будто код вызывает GetModuleHandle()
во-первых, что приведет к сбою, если DLL еще не загружена (проверьте значение GetLastError()
в случае неудачи).
использование LoadLibrary()
для DLL, которые не загружены по умолчанию. Однако, используя LoadLibrary()
в случае, если GetModuleHandle()
неудачи — опасная стратегия, так как некоторые другие процессы могут FreeLibrary()
DLL, к которой вы приобрели дескриптор через GetModuleHandle()
(что означает, что любые адреса функций, которые вы получили через этот дескриптор, являются недопустимыми, поскольку DLL больше не находится в памяти). С помощью LoadLibrary()
с последующим FreeLibrary()
, это более безопасный подход, так как он гарантирует, что DLL не будет выгружена, пока вы FreeLibrary()
Это.