GetProcAddress Function

2019. 5. 4. 23:04
728x90
728x90
728x90

출처: https://docs.microsoft.com/en-us/windows/desktop/api/libloaderapi/nf-libloaderapi-getprocaddress

 

GetProcAddress function (libloaderapi.h)

Retrieves the address of an exported function or variable from the specified dynamic-link library (DLL).

docs.microsoft.com

지정된 DLL에서 내보낸 함수 도는 변수의 주소를 검색해라.

 

Syntax

FARPROC GetProcAddress(
  HMODULE hModule,
  LPCSTR  lpProcName
);

 

Parameters

 (1) hModule

  1) 함수 또는 변수를 포함하는 DLL 모듈에 대한 핸들. LoadLibrary, LoadLibraryEx, LoadPackagedLibrary 또는 GetModuleHandle 함수는 이 핸들을 반환한다.

 

  2) GetProcAddress 함수가 LOAD_LIBRARY_AS_DATAFILE flag를 사용하여 로드된 모듈에서 주소를 검색하지 않는다. 자세한 내용은 LoadLibraryEx를 참조해라.

 

 (2) lpProcName

  함수 또는 변수 이름 또는 함수의 ordinal 값. 이 parameter가 ordinal 값이면 low-order word에 있어야 하며, high-order word는 0이어야 한다.

 

Return Value

 (1) 함수가 성공하면, return value는 export된 함수 또는 변수의 주소이다.

 

 (2) 함수가 실패하면, return value는 NULL이며 extended error information을 얻으려면 GetLastError를 호출해라.

 

Remarks

 (1) lpProcName에 의해 가리켜진 함수 이름의 spelling과 case는 소스 DLL의 module-definition (.def) 파일의 EXPORTS statement와 동일해야 한다. export된 함수의 이름은 코드에서 이런 함수들을 호출할 때 사용하는 이름과 다를 수 있다. 이 차이는 SDK 헤더 파일에 사용되는 매크로에 의해 숨겨진다. 자세한 내용은 Conventions for Functions Prototypes를 참조해라.

 

 (2) lpProcName parameter는 EXPORT statement에서 함수와 연관된 ordinal 값을 지정하여 DLL 함수를 식별할 수 있다. GetProcAddress는 지정된 ordinal 값이 .def 파일로 내보낸 가장 높은 ordinal 값에서 1 범위 내에 있는지 확인한다. 그런 다음 함수는 함수 테이블로부터 함수의 주소를 읽기 위해 index로서 ordinal을 사용한다.

 

 (3) .def 파일이 함수를 1에서 N까지 연속적으로 번호를 매기지 않으면(N은 export된 함수의 수) 지정된 ordinal의 함수가 없음에도 불구하고 GetProcAddress가 유효하지 않은 non-NULL 주소를 반환하는 오류가 발생할 수 있다.

 

 (4) DLL 모듈에 함수가 존재하지 않는 경우(예를 들어 함수가 Windows Vista에서만 사용 가능하지만 Windows XP에서 실행 중일 경우) ordinal 값이 아닌 이름으로 함수를 지정하고 다음 코드와 같이 함수를 사용할 수 없을 때 처리하도록 application을 설계해라.

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);

// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise.

   PGNSI pGNSI;
   SYSTEM_INFO si;

   ZeroMemory(&si, sizeof(SYSTEM_INFO));
   
   pGNSI = (PGNSI) GetProcAddress(
      GetModuleHandle(TEXT("kernel32.dll")), 
      "GetNativeSystemInfo");
   if(NULL != pGNSI)
   {
      pGNSI(&si);
   }
   else 
   {
       GetSystemInfo(&si);
   }

 

Requirements

 (1) Minimum supported client

  Windows XP [desktop apps | UWP apps]

 

 (2) Minimum supported server

  Windows Server 2003 [desktop apps | UWP apps]

 

 (3) Target Platform

  Windows

 

 (4) Header

  libloaderapi.h (include Windows.h)

 

 (5) Library

  Kernel32.lib

 

 (6) DLL

  Kernel32.dll

728x90
728x90

'ETC > Windows API' 카테고리의 다른 글

WaitForSingleObject Function  (1) 2019.05.05
CreateRemoteThread Function  (0) 2019.05.04
GetModuleHandleA Function  (0) 2019.05.04
WriteProcessMemory Function  (0) 2019.05.04
VitualAllocEx Function  (0) 2019.05.04

+ Recent posts