본문 바로가기
운영체제/[ecourse] Windows Programming

7-1. DllMain 기본 개념

by 헛둘이 2022. 9. 21.
DllMain
  • DLL에는 DllMain이라는 함수를 만들 수 있는데 필수는 아님.

DllMain 함수 원형

  • hInstDLL - dll의 모듈 핸들, DLL이 프로세스 가상 메모리에 로드됐을 때 그 시작 주소
  • fdwReason - 어떤 이유로 DllMain이 호출되었는지에 대한 내용
  • lpvReserved - 명시적 링킹인지, 암시적 링킹인지를 구분짓는 매개변수임
  • (명시적 (LoadLibrary) 호출이면 0, 아니면 0이 아닌 값)

 

 

fdwReason에 대한 상세 내용

출처: msdn

  • 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

댓글