GetModuleHandleA Function
출처: https://docs.microsoft.com/en-us/windows/desktop/api/libloaderapi/nf-libloaderapi-getmodulehandlea
GetModuleHandleA function (libloaderapi.h)
Retrieves a module handle for the specified module. The module must have been loaded by the calling process.
docs.microsoft.com
가. 지정된 모듈에 대한 모듈 핸들을 검색한다. 모듈은 호출 프로세스에 의해 로드되었어야 한다.
나. Remarks 섹션에서 설명된 race condtions를 방지하려면 GetModuleHandleEx 함수를 사용해라.
Syntax
HMODULE GetModuleHandleA(
LPCSTR lpModuleName
);
Parameters
(1) lpModuleName
1) 로드된 모듈의 이름(.dll 파일 또는 .exe 파일). 파일 확장자명이 생략된 경우, default 라이브러리 확장자 .dll이 추가된다. 파일 이름 문자열은 모듈 이름에 확장자가 없음을 나타내는 후행 점 문자(.)가 포함될 수 있다. 문자열은 경로를 지정할 필요가 없다. 경로를 지정할 때는 슬래시가 아니라 백 슬래시를 사용해라. 그 이름(문자열)은 현재 호출 프로세스의 주소 공간에 매핑된 모듈의 이름과 비교된다.
2) 이 parameter가 NULL 인 경우, GetModuleHandle은 호출 프로세스(.exe 파일)를 생성하는 데 사용되는 파일로 핸들을 반환한다.
3) GetModuleHandle 함수는 LOAD_LIBRARY_AS_DATAFILE flag를 사용하여 로드된 모듈에 대한 핸들을 검색하지 않는다. 자세한 내용은 LoadLibraryEx를 참조해라.
Return Value
(1) 함수가 성공하면, return value는 지정된 모듈에 대한 핸들이다.
(2) 함수가 실패하면, return value는 NULL이며 extended error information을 얻으려면 GetLastError를 호출해라.
Remarks
(1) 반환된 핸들은 global 하거나 inheritable 할 수 없다. 그것은 다른 프로세스에 의해 복제되거나 사용될 수 없다.
(2) lpModuleName에 경로가 포함되어 있지 않고 기본 이름과 확장자가 동일한 로드된 모듈이 둘 이상 있는 경우, 어떤 모듈 핸들을 반환할지 예측할 수 없다. 이 문제를 해결하려면, 경로를 지정하거나 side-by-side 어셈블리를 사용하거나 GetModuleHandleEx를 사용하여 DLL 이름이 아닌 메모리 위치를 지정할 수 있다.
(3) GetModuleHandle 함수는 참조 카운트를 증가시키지 않고 매핑된 모듈로 밴들을 반환한다. 그러나 이 핸들을 FreeLibrary 함수로 전달하면, 매핑된 모듈의 참조 카운트가 감소될 것이다. 따라서 GetModuleHandle이 반환한 핸들을 FreeLibrary 함수로 전달하지 마라. 이렇게 하면 DLL 모듈이 조기에 매핑 해제될 수 있다.
(4) 이 함수는 multithreaded application에서 조심스럽게 사용해야 한다. 이 함수가 핸들을 반환하는 시점과 핸들을 사용한 시간 사이에 모듈 핸들이 계속 유효하다는 보장이 없다. 예를 들어, thread가 모듈 핸들을 검색한다고 가정하다. 하지만 그것이 핸들을 사용하기 전에 두 번째 thread가 모듈을 해제한다. 시스템이 다른 모듈을 로드할 경우, 최근에 해제된 모듈 핸들을 재사용할 수 있다. 다라서 첫 번째 thread는 의도한 것과 다른 모듈에 대한 핸들을 가지고 있을 것이다.
Requirements
(1) Minimum supported client
Windows XP [desktop apps only]
(2) Minimum supported server
Windows Server 2003 [desktop apps only]
(3) Target Platform
Windows
(4) Header
libloaderapi.h (include Windows.h)
(5) Library
Kernel32.lib
(6) DLL
Kernel32.dll
'ETC > Windows API' 카테고리의 다른 글
CreateRemoteThread Function (0) | 2019.05.04 |
---|---|
GetProcAddress Function (1) | 2019.05.04 |
WriteProcessMemory Function (0) | 2019.05.04 |
VitualAllocEx Function (0) | 2019.05.04 |
OpenProcess Function (0) | 2019.05.04 |