선언:

LoadLibraryEx (C#)
[DllImport("kernel32")]
static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags);

LoadLibraryEx (VB.NET)
<DllImport("kernel32")>
Shared Function LoadLibraryEx(ByVal lpFileName As String, ByVal hFile As IntPtr, ByVal dwFlags As UInteger) As IntPtr
End Function



사용 예제:

LoadLibraryEx Example (C#)
using System;
using System.Runtime.InteropServices;

namespace ApiReference {
    class ApiExample {
        [DllImport("kernel32")]
        static extern IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, uint dwFlags);
        [DllImport("kernel32")]
        static extern bool FreeLibrary(IntPtr hModule);
        
        public static void Main(string[] args) {
            Console.Write("불러올 모듈의 이름을 입력하세요: ");
            
            string lpFileName = Console.ReadLine();
            Console.WriteLine("{0} 모듈을 불러옵니다.", lpFileName);
            
            // 모듈을 불러옵니다.
            IntPtr hModule = LoadLibraryEx(lpFileName, IntPtr.Zero, 0);
            
            if ( hModule != IntPtr.Zero ) {
                Console.WriteLine("{0} 모듈을 불러왔습니다. (주소: 0x{1:X8})", lpFileName, hModule.ToInt32());
                FreeLibrary(hModule);
            } else
                Console.WriteLine("{0} 모듈을 불러오지 못했습니다.", lpFileName);
            
            Console.ReadKey(true);
        }
    }
}
예제 코드 (.NET Fiddle)


LoadLibraryEx Example (VB.NET)
Imports System
Imports System.Runtime.InteropServices

Class ApiExample
    
    <DllImport("kernel32")>
    Shared Function LoadLibraryEx(lpFileName As String, hFile As IntPtr, dwFlags As UInteger) As IntPtr
    End Function
    
    <DllImport("kernel32")>
    Shared Function FreeLibrary(hModule As IntPtr) As Boolean
    End Function
    
    Public Shared Sub Main(args As String())
        Console.Write("불러올 모듈의 이름을 입력하세요: ")
        
        Dim lpFileName As String = Console.ReadLine()
        Console.WriteLine("{0} 모듈을 불러옵니다.", lpFileName)
        
        ' 모듈을 불러옵니다.
        Dim hModule As IntPtr = LoadLibraryEx(lpFileName, IntPtr.Zero, 0)
        
        If hModule <> IntPtr.Zero Then
            Console.WriteLine("{0} 모듈을 불러왔습니다. (주소: 0x{1:X8})", lpFileName, hModule.ToInt32())
            FreeLibrary(hModule)
        Else
            Console.WriteLine("{0} 모듈을 불러오지 못했습니다.", lpFileName)
        End If
        
        Console.ReadKey(True)
    End Sub
End Class
예제 코드 (.NET Fiddle)




예제 실행 결과:




매개변수 설명(기울임꼴로 표시된 매개변수는 생략 가능합니다):

lpFileName - 불러올 모듈의 이름입니다.

hFile - 사용되지 않습니다. 이 값은 항상 NULL(= IntPtr.Zero)이여야 합니다.

dwFlags - 파일을 불러올 때 사용할 옵션을 입력합니다. (비고 참조)




API 설명:

지정한 모듈을 불러옵니다.




참고:

LoadLibraryEx (MSDN)

Dynamic-Link Library Search Order (MSDN) - 동적 라이브러리 검색 순서를 설명하는 문서입니다.




문자셋:

LoadLibraryExA (Ansi)

LoadLibraryExW (Unicode)




요구 사항:

Windows XP 이상

Windows Server 2003 이상




비고:

lpFileName 매개변수는 정의 파일(DEF)에 LIBRARY 키워드로 명시된 이름과는 상관이 없습니다. 그리고 불러올 모듈은 라이브러리 파일(DLL) 또는 실행 파일(EXE)이 될 수 있습니다.

모듈 이름에 파일 확장자가 누락된 경우, 자동으로 ".dll" 를 붙여줍니다. (쌍따옴표 제외)

dwFlags 매개변수에는 다음과 같은 옵션이 사용 가능합니다.


LoadLibraryEx - dwFlags 매개변수에 사용 가능한 옵션
enum LoadFlags {
    DONT_RESOLVE_DLL_REFERENCES         = 0x00000001,
    LOAD_LIBRARY_AS_DATAFILE            = 0x00000002,
    LOAD_WITH_ALTERED_SEARCH_PATH       = 0x00000008,
    LOAD_IGNORE_CODE_AUTHZ_LEVEL        = 0x00000010,
    LOAD_LIBRARY_AS_IMAGE_RESOURCE      = 0x00000020,
    LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR    = 0x00000100,
    LOAD_LIBRARY_SEARCH_APPLICATION_DIR = 0x00000200,
    LOAD_LIBRARY_SEARCH_USER_DIRS       = 0x00000400,
    LOAD_LIBRARY_SEARCH_SYSTEM32        = 0x00000800,
    LOAD_LIBRARY_SEARCH_DEFAULT_DIRS    = 0x00001000,
}

DONT_RESOLVE_DLL_REFERENCES

모듈이 불러와질 때 DllMain 함수를 호출하지 않도록 설정합니다. 또한 시스템에서 해당 모듈이 참조하고 있는 추가 모듈을 불러오지 않습니다.

이 값은 이전 버전의 호환성때문에 제공되는 값입니다. 만약 DLL을 데이터 또는 리소스에 접근하기 위한 용도로 사용할 경우에는 LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE 또는 LOAD_LIBRARY_AS_IMAGE_RESOURCE 옵션을 이용하여 불러오는 것을 권장합니다.

그 외의 경우엔 LoadLibraryEx API 대신 LoadLibrary API를 이용하시기 바랍니다.


LOAD_LIBRARY_AS_DATAFILE

모듈을 데이터파일로 취급합니다. 만약 모듈이 데이터파일인 경우 시스템에서 호출 프로세스의 가상 주소에 파일을 매핑합니다.

매핑된 파일은 실행을 하는 등의 작업을 할 수 없으므로 GetModuleFileName, GetModuleHandle, GetProcAddress 등의 API를 사용할 수 없습니다.

이 옵션은 DLL에서 메세지나 리소스를 추출하려는 경우에만 사용하시기 바랍니다.

추가로 이 옵션은 LOAD_LIBRARY_AS_IMAGE_RESOURCE 옵션과 같이 사용할 수 있습니다.


LOAD_WITH_ALTERED_SEARCH_PATH

이 옵션이 사용되고, lpFileName 매개변수가 절대 경로일 경우 기존의 파일 검색 방식을 사용하지 않고, 대체 파일 검색 방식을 사용합니다.


대체 파일 검색 방식이 파일을 찾는 순서

  1. lpFileName 매개변수에 명시된 디렉터리

  2. 시스템 디렉터리 (GetSystemDirectory API를 호출하여 얻어진 디렉터리)

  3. 16비트 시스템 디렉터리 (이 디렉터리의 경로를 얻는 API는 없지만, 검색이 된다고 합니다)

  4. 윈도우 디렉터리 (GetWindowsDirectory API를 호출하여 얻어진 디렉터리)

  5. 현재 디렉터리 (현재 프로세스가 실행된 디렉터리)

  6. 환경변수 PATH에 나열된 경로 (단, 레지스트리 키인 AppPaths 는 DLL 경로 검색에 사용되지 않습니다)


만약 lpFileName 매개변수가 절대 경로가 아닌 상대 경로(Relative path)일 경우에는 이 옵션은 작동을 하지 않습니다.


LOAD_IGNORE_CODE_AUTHZ_LEVEL

이 옵션이 사용되면 DLL에 대해 AppLocker 규칙 및 소프트웨어 제한 정책(Software Restriction Policies)을 적용하지 않습니다.

이 옵션은 설치 프로그램에서 설치 도중에 압축 해제한 DLL을 실행해야 하는 상황에 유용합니다.

* Windows Server 2008 R2 및 Windows 7

  위의 운영체제에서 KB2532445 업데이트가 설치된 경우 호출자는 LocalSystem 또는 TrustedInstaller 권한을 가지고 있어야 합니다.


LOAD_LIBRARY_AS_IMAGE_RESOURCE

모듈을 이미지 리소스로 사용합니다. 시스템에서 모듈을 호출 프로세스의 가상 주소에 "이미지 파일"로 매핑합니다.


LOAD_LIBRARY_SEARCH_*

이름이 LOAD_LIBRARY_SEARCH 로 시작하는 옵션을 지정한 경우, 기본 파일 검색 방식을 모두 사용하지 않고 옵션에 해당하는 폴더 내에서만 검색을 시도합니다.


APPLICATION_DIR

애플리케이션 설치 디렉터리에서 검색합니다.


DEFAULT_DIRS

LOAD_LIBRARY_SEARCH_APPLICATION_DIR, LOAD_LIBRARY_SEARCH_SYSTEM32, LOAD_LIBRARY_SEARCH_USER_DIRS 세 개의 옵션을 사용한 것과 동일합니다.


DLL_LOAD_DIR

DLL을 포함하는 디렉터리에서 검색합니다.


SYSTEM32

%windows%\system32 디렉터리에서 검색합니다.


USER_DIRS

AddDllDirectory 또는 SetDllDirectory API를 사용하여 설정한 디렉터리를 검색합니다.






.NET Fiddle 의 .NET 보안 수준으로 인해 P/Invoke 를 직접 테스트하실 수 없습니다. .NET Fiddle 사이트는 코드 참고용으로만 이용해 주시기 바랍니다.
틀린 부분이나 개선되야할 부분을 찾으셨다면 주저없이 댓글로 남겨주세요~ 바로 반영하도록 하겠습니다!!
Powered by SlaneR & TeamDEV Korea



'API Reference' 카테고리의 다른 글

63. ReadProcessMemory  (1) 2015.11.12
62. PROCESS_EXTENDED_BASIC_INFORMATION  (0) 2015.10.09
60. RegisterWindowMessage  (0) 2015.10.03
59. IsWindow  (0) 2015.09.29
58. SystemFunction041 (RtlDecryptMemory)  (0) 2015.09.27

+ Recent posts