DllMain
- DLL에는 DllMain이라는 함수를 만들 수 있는데 필수는 아님.
- hInstDLL - dll의 모듈 핸들, DLL이 프로세스 가상 메모리에 로드됐을 때 그 시작 주소
- fdwReason - 어떤 이유로 DllMain이 호출되었는지에 대한 내용
- lpvReserved - 명시적 링킹인지, 암시적 링킹인지를 구분짓는 매개변수임
- (명시적 (LoadLibrary) 호출이면 0, 아니면 0이 아닌 값)
fdwReason에 대한 상세 내용
- DLL_PROCESS_ATTACH : DLL이 처음 프로세스에 매핑될 때 (LoadLibrary 등)
- DLL_PROCESS_DETACH : DLL이 프로세스에서 언로드될 때 (FreeLibrary 등)
- DLL_THREAD_ATTACH : 매핑된 프로세스에서 쓰레드를 생성할 때 쓰레드 메인 함수 진입 전 실행
- DLL_THREAD_DETACH : 매핑된 프로세스에서 생성한 쓰레드가 종료될 때 종료 후 실행
// DLL 내부 코드
#include <iostream>
#include <Windows.h>
BOOL __stdcall DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
printf("DLL_PROCESS_ATTACH : %d\n", GetCurrentThreadId());
printf("DLL Address : %p\n", hInstDLL);
printf("%s Linking \n", lpvReserved ? "Implicit" : "explicit");
break;
case DLL_PROCESS_DETACH:
printf("DLL_PROCESS_DETACH : %d\n", GetCurrentThreadId());
break;
case DLL_THREAD_ATTACH:
printf("DLL_THREAD_ATTACH : %d\n", GetCurrentThreadId());
break;
case DLL_THREAD_DETACH:
printf("DLL_THREAD_DETACH : %d\n", GetCurrentThreadId());
break;
}
return TRUE;
}
// 출처 : https://www.ecourse.co.kr/course-status/
// DLL을 매핑할 CPP 코드
#include <Windows.h>
#include <iostream>
#include <conio.h>
DWORD __stdcall threadMain(LPVOID p)
{
printf("Start threadMain : %d\n", GetCurrentThreadId());
Sleep(5000);
printf("Finish threadMaiin : %d\n", GetCurrentThreadId());
return 0;
}
int main()
{
printf("PRIMARY THREAD ID : %d\n", GetCurrentThreadId());
_getch();
HMODULE hDll = LoadLibraryA("DllSample.dll");
printf("ADDR : %p\n", hDll);
_getch();
HANDLE hThread = CreateThread(0, 0, threadMain, 0, 0, 0);
_getch();
FreeLibrary(hDll);
}
//출처 : https://www.ecourse.co.kr/course-status/
1. 메인 함수 실행
2. DLL 로드
3. 쓰레드 생성 후 전 DllMaiin 진입
4. 쓰레드 메인 합수 진입
5. 쓰레드 종료 후 DllMain 진입
DLL을 매핑한 후 쓰레드를 만들면 함수 실행 전 후로 DLL_THREAD_ATTACH, DLL_THREAD_DETACH가 불림
이걸 부르지 않으려면 DLL_PROCESS_ATTACH 구문에서 DisableThreadLibraryCalls(hInstDLL)을 호출해야 함
'운영체제 > [ecourse] Windows Programming' 카테고리의 다른 글
7-2. API Hooking (1) | 2022.09.21 |
---|---|
6-2-3. Critical Section 실습 (0) | 2022.09.20 |
6-2-2. Event 실습 (0) | 2022.09.20 |
6-2-1. Semaphore 실습 (0) | 2022.09.20 |
6-2. 동기화 개념과 Critical Section (1) | 2022.09.20 |
댓글