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

4-1. Kernel Object

by 헛둘이 2022. 9. 13.
윈도우 핸들
  • A라는 프로세스가 윈도우를 만들어서 3000번이라는 핸들을 받았다고 가정한다.
  • 이 3000번이라는 번호를 B 프로세스에게 전달한다고 했을 때
  • B 프로세스가 A 프로세스가 만든 핸들을 조작할 수 있을까? OK
  • 윈도우 핸들은 모든 프로세스에 개방적이다.

 

그렇다면 CreatePen의 반환값인 Pen 객체는 어떨까?
  • CreatePen의 반환값으로 나온 Pen도 같은 방법으로 B 프로세스에 전달한다면?
  • B 프로세스가 A 프로세스가 만든 펜의 핸들을 조작할 수 있을까? NO
  • GDI 핸들은 그걸 만든 하나의 프로세스만 사용할 수 있다.

 

그럼 어떤건 되고 어떤 건 안되는데 이걸 어떻게 판별해야 할까?
이 접근권한은 Object Category라는 카테고리로 분류된다.

 


Object Category
  1. User Object : 윈도우와 관련된 Object (User32.dll)
    • DestroyXXX();로 해제한다.
    • 모든 프로세스에 개방적
  2. Gdi Object : 그래픽 관련 Object (Gdi32.dll)
    • DeleteXXX();로 해제한다.
    • 핸들을 만든 프로세스만 사용할 수 있다. (공유X)
  3. Kernel Object : 파일, 메모리, 프로세스 등 UI 이외의 Object (Kernel32.dll)
    • CloseHandle();로 참조계수 감소시켜서 0이 되면 삭제된다.
    • DuplicateHandle을 통해서만 공유 가능하다.

 

 

Kernel Object의 특징
  1. 보안 속성 
  2. 이름
  3. 참조계수
  4. Signal
  5. Wait list
  6. 그 외 각각의 특성에 관한 추가적인 멤버들..
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

댓글