LoadLibraryExA 함수(libloaderapi.h)
지정된 모듈을 호출 프로세스의 주소 공간에 로드합니다. 지정된 모듈로 인해 다른 모듈이 로드될 수 있습니다.
통사론
HMODULE LoadLibraryExA(
[in] LPCSTR lpLibFileName,
HANDLE hFile,
[in] DWORD dwFlags
);
매개 변수
[in] lpLibFileName
로드할 모듈의 파일 이름을 지정하는 문자열입니다. 이 이름은 모듈 정의(.def) 파일의 LIBRARY 키워드에 지정된 대로 라이브러리 모듈 자체에 저장된 이름과 관련이 없습니다.
이 모듈은 라이브러리 모듈(.dll 파일) 또는 실행 모듈(.exe 파일)일 수 있습니다. 지정된 모듈이 실행 가능한 모듈인 경우 정적 가져오기가 로드되지 않습니다. 대신 모듈이 DONT_RESOLVE_DLL_REFERENCES 지정된 것처럼 로드됩니다. 자세한 내용은 dwFlags 매개 변수를 참조하세요.
문자열이 경로 없이 모듈 이름을 지정하고 파일 이름 확장명을 생략하면 함수는 기본 라이브러리 확장명 ".DLL"을 모듈 이름에 추가합니다. 함수가 모듈 이름에 ".DLL"을 추가하지 않도록 하려면 모듈 이름 문자열에 후행 지점 문자(.)를 포함합니다.
문자열이 정규화된 경로를 지정하는 경우 함수는 해당 경로에서 모듈만 검색합니다. 경로를 지정할 때 슬래시(/)가 아닌 백슬라이시(\)를 사용해야 합니다. 경로에 대한 자세한 내용은 이름 지정 파일, 경로 및 네임스페이스참조하세요.
문자열이 경로 없이 모듈 이름을 지정하고 로드된 모듈이 둘 이상 동일한 기본 이름과 확장명을 갖는 경우 함수는 먼저 로드된 모듈에 대한 핸들을 반환합니다.
문자열이 경로 없이 모듈 이름을 지정하고 같은 이름의 모듈이 아직 로드되지 않았거나 문자열이 상대 경로를 사용하여 모듈 이름을 지정하는 경우 함수는 지정된 모듈을 검색합니다. 또한 지정된 모듈을 로드하면 시스템에서 연결된 다른 모듈을 로드하는 경우(즉, 모듈에 종속성이 있는 경우) 모듈을 검색합니다. 검색되는 디렉터리와 검색 순서는 지정된 경로 및 dwFlags 매개 변수에 따라 달라집니다. 자세한 내용은 비고를 참조하세요.
함수가 모듈 또는 해당 종속성 중 하나를 찾을 수 없으면 함수가 실패합니다.
hFile
이 매개 변수는 나중에 사용하도록 예약되어 있습니다. NULL
[in] dwFlags
모듈을 로드할 때 수행할 작업입니다. 플래그가 지정되지 않은 경우 이 함수의 동작은 LoadLibrary 함수의 동작과 동일합니다. 이 매개 변수는 다음 값 중 하나일 수 있습니다.
값 | 의미 |
---|---|
|
이 값을 사용하고 실행 모듈이 DLL인 경우 시스템은 프로세스 및 스레드 초기화 및 종료를 위해 DllMain 호출하지 않습니다. 또한 시스템은 지정된 모듈에서 참조하는 추가 실행 모듈을 로드하지 않습니다.
참고 이 값을 사용하지 마세요. 이전 버전과의 호환성을 위해서만 제공됩니다. DLL의 데이터 또는 리소스에만 액세스하려는 경우 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 또는 LOAD_LIBRARY_AS_IMAGE_RESOURCE 또는 둘 다를 사용합니다. 그렇지 않으면 LoadLibrary 함수를 사용하여 라이브러리를 DLL 또는 실행 가능한 모듈로 로드합니다.
|
|
이 값을 사용하면 시스템에서 Windows Server 2008 R2 및 Windows 7: KB2532445 설치된 시스템에서 호출자는 "LocalSystem" 또는 "TrustedInstaller"로 실행되어야 합니다. 그렇지 않으면 시스템에서 이 플래그를 무시합니다. 자세한 내용은 https://support.microsoft.com/kb/2532445도움말 및 지원 기술 자료에서 "Windows 7 또는 Windows Server 2008 R2를 실행하는 컴퓨터에서 Office 매크로를 사용하여 AppLocker 규칙을 우회할 수 있습니다."를 참조하세요. Windows Server 2008, Windows Vista, Windows Server 2003 및 Windows XP: AppLocker는 Windows 7 및 Windows Server 2008 R2에서 도입되었습니다. |
|
이 값을 사용하는 경우 시스템은 호출 프로세스의 가상 주소 공간에 데이터를 데이터 파일처럼 매핑합니다. 매핑된 파일을 실행하거나 실행할 준비를 수행하지 않습니다. 따라서 GetModuleFileName 이 값은 LOAD_LIBRARY_AS_IMAGE_RESOURCE함께 사용할 수 있습니다. 자세한 내용은 비고를 참조하세요. |
|
LOAD_LIBRARY_AS_DATAFILE마찬가지로 DLL 파일은 호출 프로세스에 대한 단독 쓰기 액세스 권한으로 열립니다. 다른 프로세스는 사용 중인 동안 쓰기 액세스를 위해 DLL 파일을 열 수 없습니다. 그러나 DLL은 다른 프로세스에서 계속 열 수 있습니다.
이 값은 LOAD_LIBRARY_AS_IMAGE_RESOURCE함께 사용할 수 있습니다. 자세한 내용은 비고를 참조하세요. Windows Server 2003 및 Windows XP: 이 값은 Windows Vista까지 지원되지 않습니다. |
|
이 값을 사용하는 경우 시스템은 파일을 프로세스의 가상 주소 공간에 이미지 파일로 매핑합니다.
그러나 로더는 정적 가져오기를 로드하거나 다른 일반적인 초기화 단계를 수행하지 않습니다. DLL을 로드하여 메시지 또는 리소스를 추출하려는 경우에만 이 플래그를 사용합니다.
애플리케이션이 이미지의 메모리 내 레이아웃이 있는 파일에 의존하지 않는 한 이 값은 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 또는 LOAD_LIBRARY_AS_DATAFILE함께 사용해야 합니다. 자세한 내용은 설명 섹션을 참조하세요. Windows Server 2003 및 Windows XP: 이 값은 Windows Vista까지 지원되지 않습니다. |
|
이 값을 사용하면 애플리케이션의 설치 디렉터리가 DLL 및 해당 종속성을 검색합니다. 표준 검색 경로의 디렉터리를 검색하지 않습니다. 이 값은 LOAD_WITH_ALTERED_SEARCH_PATH함께 사용할 수 없습니다.
Windows 7, Windows Server 2008 R2, Windows Vista 및 Windows Server 2008: 이 값을 사용하려면 KB2533623 설치해야 합니다. Windows Server 2003 및 Windows XP: 이 값은 지원되지 않습니다. |
|
이 값은 LOAD_LIBRARY_SEARCH_APPLICATION_DIR, LOAD_LIBRARY_SEARCH_SYSTEM32및 LOAD_LIBRARY_SEARCH_USER_DIRS조합입니다. 표준 검색 경로의 디렉터리를 검색하지 않습니다. 이 값은 LOAD_WITH_ALTERED_SEARCH_PATH함께 사용할 수 없습니다.
이 값은 애플리케이션이 DLL 검색 경로에 포함해야 하는 권장되는 최대 디렉터리 수를 나타냅니다. Windows 7, Windows Server 2008 R2, Windows Vista 및 Windows Server 2008: 이 값을 사용하려면 KB2533623 설치해야 합니다. Windows Server 2003 및 Windows XP: 이 값은 지원되지 않습니다. |
|
이 값을 사용하면 DLL이 포함된 디렉터리가 DLL의 종속성을 검색하는 디렉터리 목록의 시작 부분에 일시적으로 추가됩니다. 표준 검색 경로의 디렉터리를 검색하지 않습니다.
lpFileName 매개 변수는 정규화된 경로를 지정해야 합니다. 이 값은 LOAD_WITH_ALTERED_SEARCH_PATH함께 사용할 수 없습니다. 예를 들어 Lib2.dll C:\Dir1에서만 C:\Dir1\Lib1.dll, loading Lib1.dll with this value causes the system to search for Lib2.dll 종속성인 경우입니다. C:\Dir1에서 Lib2.dll DLL 검색 경로의 모든 디렉터리를 검색하려면 이 값을 LOAD_LIBRARY_SEARCH_DEFAULT_DIRS결합합니다. Windows 7, Windows Server 2008 R2, Windows Vista 및 Windows Server 2008: 이 값을 사용하려면 KB2533623 설치해야 합니다. Windows Server 2003 및 Windows XP: 이 값은 지원되지 않습니다. |
|
이 값을 사용하면 %windows%\system32가 DLL 및 해당 종속성을 검색합니다.
표준 검색 경로의 디렉터리를 검색하지 않습니다. 이 값은 LOAD_WITH_ALTERED_SEARCH_PATH함께 사용할 수 없습니다.
Windows 7, Windows Server 2008 R2, Windows Vista 및 Windows Server 2008: 이 값을 사용하려면 KB2533623 설치해야 합니다. Windows Server 2003 및 Windows XP: 이 값은 지원되지 않습니다. |
|
이 값을 사용하는 경우 AddDllDirectory 또는 SetDllDirectory 함수를 사용하여 추가된 디렉터리가 DLL 및 해당 종속성을 검색합니다. 둘 이상의 디렉터리가 추가된 경우 디렉터리를 검색하는 순서는 지정되지 않습니다. 표준 검색 경로의 디렉터리를 검색하지 않습니다. 이 값은 LOAD_WITH_ALTERED_SEARCH_PATH함께 사용할 수 없습니다.
Windows 7, Windows Server 2008 R2, Windows Vista 및 Windows Server 2008: 이 값을 사용하려면 KB2533623 설치해야 합니다. Windows Server 2003 및 Windows XP: 이 값은 지원되지 않습니다. |
|
이 값을 사용하고 lpFileName 절대 경로를 지정하는 이 값을 사용하지 않거나 lpFileName 경로를 지정하지 않는 경우 시스템은 설명 섹션에 설명된 표준 검색 전략을 사용하여 지정된 모듈이 로드되는 관련 실행 모듈을 찾습니다. 이 값은 LOAD_LIBRARY_SEARCH 플래그와 결합할 수 없습니다. |
|
이진 이미지의 디지털 서명을 로드 시 확인해야 하며,
이 값에는 Windows 8.1, Windows 10 이상이 필요합니다. |
|
이 값을 사용하는 경우 현재 디렉터리에서 실행을 위해 DLL을 로드하는 것은 안전 부하 목록의 디렉터리 아래에 있는 경우에만 허용됩니다. |
반환 값
함수가 성공하면 반환 값은 로드된 모듈에 대한 핸들입니다.
함수가 실패하면 반환 값은 NULL
발언
LoadLibraryEx 함수는 LoadLibrary 함수와 매우 유사합니다. 차이점은 LoadLibraryEx 제공하는
- LoadLibraryEx DLL의 DllMain 함수를 호출하지 않고 DLL 모듈을 로드할 수 있습니다.
- LoadLibraryEx 모듈이 실행되지 않는 경우에 최적화된 방식으로 모듈을 로드하여 모듈이 데이터 파일인 것처럼 로드할 수 있습니다.
- LoadLibraryEx 두 가지 검색 전략 중 하나를 사용하여 모듈 및 관련 모듈을 찾거나 프로세스별 디렉터리 집합을 검색할 수 있습니다.
호출 프로세스는 LoadLibraryEx 반환된 핸들을 사용하여 GetProcAddress, FindResource및 LoadResource 함수에 대한 호출에서 모듈을 식별할 수 있습니다.
DLL 로드 중에 로더가 표시하는 오류 메시지를 사용하거나 사용하지 않도록 설정하려면 SetErrorMode 함수를 사용합니다.
DllMainLoadLibraryEx 호출하는 것은 안전하지 않습니다. 자세한 내용은 DllMain설명 섹션을 참조하세요.
Visual C++: Visual C++ 컴파일러는 스레드-로컬 변수를 선언할 수 있는 구문을 지원합니다. _declspec(스레드). DLL에서 이 구문을 사용하는 경우 Windows Vista 이전 버전의 Windows에서 LoadLibraryEx 사용하여 DLL을 명시적으로 로드할 수 없습니다. DLL이 명시적으로 로드되는 경우 _declspec(스레드)대신 스레드 로컬 스토리지 함수를 사용해야 합니다. 예를 들어 동적 링크 라이브러리스레드 로컬 스토리지를 사용하는
데이터 파일 또는 이미지 리소스로 DLL 로드
LOAD_LIBRARY_AS_DATAFILE, LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE및 LOAD_LIBRARY_AS_IMAGE_RESOURCE 값은 프로세스별 참조 수 및 지정된 모듈의 로드에 영향을 미칩니다. 이러한 값이 dwFlags 매개 변수에 대해 지정된 경우 로더는 모듈이 프로세스에서 실행 파일 DLL로 이미 로드되었는지 여부를 확인합니다. 이 경우 모듈이 호출 프로세스의 가상 주소 공간에 이미 매핑되어 있음을 의미합니다. 이 경우 LoadLibraryEx DLL에 대한 핸들을 반환하고 DLL 참조 수를 증분합니다. DLL 모듈이 아직 DLL로 로드되지 않은 경우 시스템은 모듈을 실행 가능한 DLL이 아닌 데이터 또는 이미지 파일로 매핑합니다. 이 경우 LoadLibraryEx 로드된 데이터 또는 이미지 파일에 대한 핸들을 반환하지만 모듈에 대한 참조 수를 증가시키지 않으며 CreateToolhelp32Snapshot 또는 EnumProcessModules같은 함수에 모듈을 표시하지 않습니다.LOAD_LIBRARY_AS_DATAFILE, LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE또는 LOAD_LIBRARY_AS_IMAGE_RESOURCE있는 동일한 파일에 대해 LoadLibraryEx 두 번 호출되면 파일에 대해 두 개의 별도 매핑이 만들어집니다.
LOAD_LIBRARY_AS_IMAGE_RESOURCE 값을 사용하면 모듈이 PE(이식 가능한 실행 파일) 섹션 맞춤 확장을 사용하여 이미지로 로드됩니다. RVA(상대 가상 주소)는 디스크 주소에 매핑할 필요가 없으므로 모듈에서 리소스를 더 빠르게 검색할 수 있습니다. LOAD_LIBRARY_AS_IMAGE_RESOURCE 지정하면 다른 프로세스가 모듈을 로드하는 동안 수정할 수 없습니다.
애플리케이션이 특정 이미지 매핑 특성에 의존하지 않는 한 LOAD_LIBRARY_AS_IMAGE_RESOURCE 값은 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 또는 LOAD_LIBRARY_AS_DATAFILE함께 사용해야 합니다. 이렇게 하면 로더가 모듈을 이미지 리소스 또는 데이터 파일로 로드할지 여부를 선택할 수 있으며, 시스템에서 페이지를 보다 효과적으로 공유할 수 있는 옵션을 선택할 수 있습니다. FindResource 같은 리소스 함수는 매핑을 사용할 수 있습니다.
모듈이 로드된 방법을 확인하려면 다음 매크로 중 하나를 사용하여 LoadLibraryEx반환된 핸들을 테스트합니다.
#define LDR_IS_DATAFILE(handle) (((ULONG_PTR)(handle)) & (ULONG_PTR)1)
#define LDR_IS_IMAGEMAPPING(handle) (((ULONG_PTR)(handle)) & (ULONG_PTR)2)
#define LDR_IS_RESOURCE(handle) (LDR_IS_IMAGEMAPPING(handle) || LDR_IS_DATAFILE(handle))
다음 표에서는 이러한 매크로에 대해 설명합니다.
매크로 | 묘사 |
---|---|
LDR_IS_DATAFILE(핸들) | 이 매크로가 true |
LDR_IS_IMAGEMAPPING(핸들) | 이 매크로가 TRUE |
LDR_IS_RESOURCE(핸들) | 이 매크로가 TRUE |
FreeLibrary 함수를 사용하여 모듈을 로드하면 참조 수가 증가했는지 여부에 관계없이 로드된 모듈을 해제할 수 있습니다. 모듈을 데이터 또는 이미지 파일로 로드한 경우 매핑이 제거되지만 참조 수는 감소되지 않습니다. 그렇지 않으면 DLL 참조 수가 감소됩니다. 따라서 LoadLibraryEx반환된 핸들을 사용하여 FreeLibrary 호출하는 것이 안전합니다.
DLL 및 종속성 검색
검색 경로는 DLL을 검색하는 디렉터리 집합입니다.LoadLibraryEx 함수는 다음과 같은 경우 표준 검색 경로를 사용합니다.
- 파일 이름은 경로 없이 지정되며 기본 파일 이름이 로드된 모듈의 기본 파일 이름과 일치하지 않으며 LOAD_LIBRARY_SEARCH 플래그가 사용되지 않습니다.
- 경로가 지정되었지만 LOAD_WITH_ALTERED_SEARCH_PATH 사용되지 않습니다.
- 애플리케이션에서 SetDefaultDllDirectories사용하여 프로세스에 대한 기본 DLL 검색 경로를 지정하지 않았습니다.
lpFileName 상대 경로를 지정하는 경우 전체 상대 경로가 DLL 검색 경로의 모든 토큰에 추가됩니다. 다른 경로를 검색하지 않고 상대 경로에서 모듈을 로드하려면 GetFullPathName 사용하여 비관계형 경로를 가져와서 비관계형 경로로 LoadLibraryEx 호출합니다. 모듈이 데이터 파일로 로드되고 상대 경로가 "." 또는 ".."로 시작하는 경우 상대 경로는 절대 경로로 처리됩니다.
SetDllDirectory 함수를 사용하여 검색 경로를 수정할 수 있습니다. 이 솔루션은 SetCurrentDirectory 사용하거나 DLL의 전체 경로를 하드 코딩하는 것보다 낫습니다. 그러나 지정된 디렉터리가 검색 경로에 있고 스레드로부터 안전하지 않은 동안 SetDllDirectory 사용하면 안전한 DLL 검색 모드를 효과적으로 사용하지 않도록 설정됩니다. 가능하면 AddDllDirectory 사용하여 기본 프로세스 검색 경로를 수정하는 것이 가장 좋습니다. 자세한 내용은 Dynamic-Link 라이브러리 검색 순서참조하세요.
애플리케이션은 LOAD_LIBRARY_SEARCH_* 플래그를 사용하여 단일 LoadLibraryEx 호출을 검색할 디렉터리를 지정할 수 있습니다. 둘 이상의 LOAD_LIBRARY_SEARCH 플래그를 지정하면 디렉터리를 다음 순서로 검색합니다.
- DLL(LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR)이 포함된 디렉터리입니다. 이 디렉터리가 로드할 DLL의 종속성에 대해서만 검색됩니다.
- 애플리케이션 디렉터리(LOAD_LIBRARY_SEARCH_APPLICATION_DIR)입니다.
- AddDllDirectory 함수(LOAD_LIBRARY_SEARCH_USER_DIRS) 또는 SetDllDirectory 함수를 사용하여 애플리케이션 검색 경로에 명시적으로 추가된 경로입니다. 둘 이상의 경로가 추가된 경우 경로를 검색하는 순서는 지정되지 않습니다.
- System32 디렉터리(LOAD_LIBRARY_SEARCH_SYSTEM32)입니다.
Windows 7, Windows Server 2008 R2, Windows Vista 및 Windows Server 2008: LOAD_LIBRARY_SEARCH_ 플래그는 KB2533623 설치된 시스템에서 사용할 수 있습니다. 플래그를 사용할 수 있는지 여부를 확인하려면
애플리케이션이 SetDefaultDllDirectories 함수를 사용하여 프로세스에 대한 DLL 검색 경로를 설정하고 LOAD_LIBRARY_SEARCH_* 플래그를 사용하지 않는 경우 LoadLibraryEx 함수는 표준 검색 경로 대신 프로세스 DLL 검색 경로를 사용합니다.
경로가 지정되고 애플리케이션과 연결된 리디렉션 파일이 있는 경우 LoadLibraryEx 함수는 애플리케이션 디렉터리에서 모듈을 검색합니다. 모듈이 애플리케이션 디렉터리에 있는 경우 LoadLibraryEx 경로 사양을 무시하고 애플리케이션 디렉터리에서 모듈을 로드합니다. 애플리케이션 디렉터리에 모듈이 없는 경우 함수는 지정된 디렉터리에서 모듈을 로드합니다. 자세한 내용은 동적 링크 라이브러리 리디렉션
경로 사양이 없는 어셈블리 이름으로 LoadLibraryEx 호출하고 어셈블리가 시스템 호환 매니페스트에 나열되면 호출이 병렬 어셈블리로 자동으로 리디렉션됩니다.
보안 설명
LOAD_LIBRARY_AS_DATAFILE 로드되는 동안 다른 프로세스가 모듈을 수정하는 것을 방지하지 않습니다. 이렇게 하면 애플리케이션의 보안이 떨어지므로 LOAD_LIBRARY_AS_DATAFILE사용해야 하는 경우가 아니면 모듈을 데이터 파일로 로드할 때 LOAD_LIBRARY_AS_DATAFILE 대신 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 사용해야 합니다. LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 지정하면 다른 프로세스가 모듈을 로드하는 동안 수정할 수 없습니다. 동일한 호출에서 LOAD_LIBRARY_AS_DATAFILE 및 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 지정하지 마세요.
SearchPath 함수를 사용하여 후속 LoadLibraryEx 호출에 대한 DLL 경로를 검색하지 마세요.
SearchPath 함수는 LoadLibraryEx 다른 검색 순서를 사용하며 BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODESetSearchPathMode 호출하여 명시적으로 사용하도록 설정되지 않는 한 안전한 프로세스 검색 모드를 사용하지 않습니다. 따라서 SearchPath
DLL을 검색하는 LoadLibraryEx 호출을 기반으로 운영 체제 버전을 가정하지 마세요. 애플리케이션이 DLL이 합법적으로 존재하지 않지만 악성 버전의 DLL이 검색 경로에 있는 환경에서 실행 중인 경우 악성 버전의 DLL이 로드될 수 있습니다. 대신 시스템 버전 가져오기
DLL 보안 문제에 대한 일반적인 내용은 Dynamic-Link 라이브러리 보안참조하세요.
예제
다음 코드 예제에서는 LoadLibraryExA
//Load the FMAPI DLL
hLib = ::LoadLibraryEx(L"fmapi.dll", NULL, NULL);
if ( !hLib )
{
wprintf(L"Could not load fmapi.dll, Error #%d.\n", GetLastError());
return;
}
추가 예제는오류 코드 번호에 대한
메모
libloaderapi.h 헤더는 LOADLibraryEx를 UNICODE 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입대한
요구 사항
요구 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows XP [데스크톱 앱만 해당] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱만 해당] |
대상 플랫폼 | Windows |
헤더 | libloaderapi.h(Windows.h 포함) |
라이브러리 | Kernel32.lib |
DLL | Kernel32.dll |
참고 항목
FindResource
freeLibrary
GetSystemDirectory
GetWindowsDirectory
LoadLibrary
LoadResource
OpenFile
동적 연결
SearchPath
SetDllDirectory
SetErrorMode