GetProcAddress

GetProcAddress는 저장된 DLL에서 함수 또는 변수의 주소를 얻으며 동적 API 로딩에 사용됩니다.

FARPROC GetProcAddress(
  [in] HMODULE hModule,
  [in] LPCSTR  lpProcName
);
인자
설명

hModule

DLL 핸들 모듈

lpProcName

함수 이름 문자열 / Ordinal 번호

Example

#include <windows.h>
#include <iostream>

int main()
{
    // kernel32.dll의 함수들 동적 로딩
    HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");
    if (!hKernel32) {
        std::cout << "Failed to get kernel32 handle" << std::endl;
        return 1;
    }

    // CreateFileA 함수 주소 획득
    FARPROC pCreateFile = GetProcAddress(hKernel32, "CreateFileA");

    // CreateFileA를 못 찾았을 때 예외처리
    if (!pCreateFile) {
        std::cout << "GetProcAddress failed" << std::endl;
        return 1;
    }
    std::cout << "CreateFileA address: 0x" << std::hex << pCreateFile << std::endl;

    // 함수 포인터로 캐스팅하여 사용
    typedef HANDLE(WINAPI* pCreateFileA)(
        LPCSTR,
        DWORD, 
        DWORD, 
        LPSECURITY_ATTRIBUTES,
        DWORD, 
        DWORD, 
        HANDLE
        );
    pCreateFileA CreateFileFunc = (pCreateFileA)pCreateFile;

    // 동적으로 로드한 함수 호출 -> CreateFileFunc은 CreateFileA의 함수 포인터
    HANDLE hFile = CreateFileFunc(
        "test.txt",
        GENERIC_WRITE,
        0,
        NULL,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL
    );
    if (hFile != INVALID_HANDLE_VALUE) {
        std::cout << "File created successfully using dynamic call" << std::endl;
        CloseHandle(hFile);
    }

    return 0;
}

References

Last updated