Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 작업 집합
- 벡터
- Cell Shader
- ColorGradingLutPass
- VR
- 게임 수학
- Cell Look
- 프로그래밍 기초
- Windows Build
- Virtual Byte
- URP로 변경
- 가상 바이트
- 3d
- 메모리 누수
- Specular
- OculusMotionVectorPass
- C언어
- Private Bytes
- AppSW
- ASW(Application SpaceWarp)
- URP
- Rim Light
- 개인 바이트
- Toon Shader
- Cartoon Rendering
- Three(Two) Tone Shading
- working set
Archives
- Today
- Total
WinCNT
실제 핸들과 허위 핸들(Pseudo Handle) 본문
자신의 구분자 얻기
실제 핸들과 허위 핸들(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 |