윈도우 핸들
- A라는 프로세스가 윈도우를 만들어서 3000번이라는 핸들을 받았다고 가정한다.
- 이 3000번이라는 번호를 B 프로세스에게 전달한다고 했을 때
- B 프로세스가 A 프로세스가 만든 핸들을 조작할 수 있을까? OK
- 윈도우 핸들은 모든 프로세스에 개방적이다.
그렇다면 CreatePen의 반환값인 Pen 객체는 어떨까?
- CreatePen의 반환값으로 나온 Pen도 같은 방법으로 B 프로세스에 전달한다면?
- B 프로세스가 A 프로세스가 만든 펜의 핸들을 조작할 수 있을까? NO
- GDI 핸들은 그걸 만든 하나의 프로세스만 사용할 수 있다.
그럼 어떤건 되고 어떤 건 안되는데 이걸 어떻게 판별해야 할까?
이 접근권한은 Object Category라는 카테고리로 분류된다.
Object Category
- User Object : 윈도우와 관련된 Object (User32.dll)
- DestroyXXX();로 해제한다.
- 모든 프로세스에 개방적
- Gdi Object : 그래픽 관련 Object (Gdi32.dll)
- DeleteXXX();로 해제한다.
- 핸들을 만든 프로세스만 사용할 수 있다. (공유X)
- Kernel Object : 파일, 메모리, 프로세스 등 UI 이외의 Object (Kernel32.dll)
- CloseHandle();로 참조계수 감소시켜서 0이 되면 삭제된다.
- DuplicateHandle을 통해서만 공유 가능하다.
Kernel Object의 특징
- 보안 속성
- 이름
- 참조계수
- Signal
- Wait list
- 그 외 각각의 특성에 관한 추가적인 멤버들..
CreateXXX 함수 중 인자로 보안 속성(SECURITY_ATTRIBUTES)를 받는다면 커널 오브젝트를 반환한다고 보면 된다.
커널 오브젝트 테이블
- 프로그램에서 커널 오브젝트 핸들을 만들면 Object가 만들어지고, 그 Object의 정보가 커널 오브젝트 테이블에 담긴다.
- 테이블은 인덱스로 관리된다 (n번째에 어떤 커널 오브젝트의 주소값이 담김)
- 그 n번째 인덱스가 그 커널 오브젝트 주소값의 핸들이다!
- 커널 오브젝트는 이렇게 자신이 생성되고 테이블에 담기면 참조계수를 1로 세팅한다.
- DuplicateHandle이라는 함수로 핸들을 다른 프로세스에 복사할 수 있는데,
- 그러면 마찬가지로 참조계수가 1 증가된다.
- 커널 오브젝트는 자신을 생성한 프로세스가 죽더라도 참조계수가 0이 되지 않으면 파괴되지 않는다.
- 참조계수를 줄이는 함수는 CloseHandle이라는 함수이며, 프로그램이 종료되기 전에 꼭 호출해주어야 한다.
INDEX (HANDLE) | NAME | ADDRESS |
0x10 | File Object | 0x00FD31AA |
... | ... | ... |
'운영체제 > [ecourse] Windows Programming' 카테고리의 다른 글
5-1. Virtual Address Space (1) | 2022.09.16 |
---|---|
4-2. Process ID & Handle (0) | 2022.09.13 |
3-3. 가상 주소 공간과 DLL (0) | 2022.09.12 |
3-2 Dynamic Library (0) | 2022.09.11 |
3-1. Static Library (0) | 2022.09.08 |
댓글