WinCNT

실제 핸들과 허위 핸들(Pseudo Handle) 본문

게임 프로그래밍(학습 내용 정리)/시스템 프로그래밍

실제 핸들과 허위 핸들(Pseudo Handle)

WinCNT_SSS 2022. 3. 22. 11:30

자신의 구분자 얻기


실제 핸들과 허위 핸들(Pseudo Handle)

GetCurrentProcess()와 GetCurrentThread() 등의 함수는 특별하게도

해당 함수를 호출한 프로세스나 스레스의 실제 핸들을 얻어 오는 것이 아니라,

허위 핸들(Pseudo Handle)을 얻어온다

 

이러한 함수는 프로세스의 커널 오브젝트 핸들 테이블에 어떠한 영향도 미치치 않고

프로세스나 스레드 커널 오브젝트의 사용 카운트(Usage Count)에도 영향을 미치지 않는다

그리고 허위 핸들을 CloseHandle 하면 함수 호출 자체를 무시하고 FALSE를 반환한다

 

프로세스나 스레드의 핸들을 필요로 하는 윈도우 함수에 허위 핸들을 이용하면

현재 프로세스나 스레드에 대해 자신의 기능을 수행할 수 있다

(물론 실제 핸들을 요구하는 윈도우 함수도 있으므로 MSDN을 잘 확인하자)

 

허위 핸들을 실제 핸들로 변경하기

허위 핸들은 항상 현재 프로세스/스레드의 핸들이다

 

예를 들어 자식 스레드에게 부모 스레드가 GetCurrentThread() 함수로

허위 핸들을 넘기고 그 핸들로 CPU 시간을 얻으면,

그 결과로 얻어지는 것은 부모 스레드가 아닌 자식 스레드의 CPU 시간이다

 

이러한 문제를 해결하려면 허위 핸들을 실제 핸들로 변경해야 한다

DuplicateHandle() 함수를 이용하면 허위 핸들을 실제 핸들로 변경할 수 있다

 

DWORD WINAPI ParentThread(PVOID pvParam)
{
	HANDLE hThreadParent;
	DuplicateHandle(
		GetCurrentProcess(),	// 현재 스레드를 소유하고 있는 프로세스의 허위 핸들
		GetCurrentThread(),		// 페어런트 스레드의 허위 핸들
		GetCurrentProcess(),	// 새로운 스레드 핸들을 생성할 프로세스 핸들
		&hThreadParent,			// 페어런트 스레드의 실제 핸들이 반환됨
		0,						// DUPLICATE_SAME_ACCESS가 지정되면 무시됨
		FALSE,					// 새로 생성된 스레드 핸들은 상속 불가능
		DUPLICATE_SAME_ACCESS	// 새로 생성된 핸들은 허위 핸들과 같은 접근 권한을 가지도록 설정
	);

	CreateThread(NULL, 0, ChildThread, (PVOID)hThreadParent, 0, NULL);
	// 이하 생략
}

DWORD WINAPI ChildThread(PVOID pvParam)
{
	HANDLE hThreadParent = (HANDLE) pvParam;
	FILETIME ftCreationTime, ftExitTime, ftKernelTime, ftUserTime;
	GetThreadTimes(hThreadParent, &ftCreationTime, &ftExitTime, &ftKernelTime, &ftUserTime);
	CloseHandle(hThreadParent);
	// 이하 생략
}

 

 

 

SSS

'게임 프로그래밍(학습 내용 정리) > 시스템 프로그래밍' 카테고리의 다른 글

스레드 스케줄링  (0) 2022.03.28
Exception Filter  (0) 2022.03.22
프로세스와 스레드  (0) 2022.03.21
커널 오브젝트와 프로세스  (0) 2022.03.14
커널 오브젝트  (0) 2022.03.08