Windows System Programming 커널 오브젝트

mohadang·2023년 4월 23일
0
post-thumbnail

커널 오브젝트

커널에 의해 관리되는 리소스 정보를 담고 있는 데이터 블록

커널 오브젝트 특징

프로세스는 자신만의 커널 오브젝트 테이블을 가지고 있다
리소스를 획득하면 커널 오브젝트 핸들값을 반환 받는다
프로세스는 커널 오브젝트에 직접적으로 접근할 수 없지만 커널 오브젝트 핸들을 통해 제어가 가능하다
생성한 리소스는 커널 오브젝트 핸들을 통해서 다시 반환해야 한다
커널 오브젝트 핸들은 상속, 명명된 오브젝트, 복사등을 통해서 다른 프로세스와 리소스를 공유할 수 있다
커널 오브젝트 핸들을 생성하거나 획득 할때마다 참조 카운트가 증가한다. 반환할 때는 감소한다
커널 오브젝트를 생성한 프로세스가 종료 되어도 다른 프로세스가 리소스를 사용하고 있다면 커널 오브젝트 핸들은 OS에 남아있는다

커널 오브젝트의 상태

리소스의 현재 상황을 알리기 위함
프로세스가 실행중일때는 프로세스 커널 오브젝트가 Non-Signaled 이다
프로세스가 종료될때는 프로세스 커널 오브젝트가 Signaled 이다

Signaled vs Non-Signaled

리소스의 상태 변경을 감지하기 위한 신호이다
각 리소스(프로세스, 뮤텍스, ...)마다 Signaled, Non-Signaled 의 의미가 다르다
주로 신호를 통해 리소스의 상태 변경을 감지하고 쓰레드에서 다음 처리를 수행하는 식으로 사용한다

리소스 상태 관찰 API는 WaitForSingleObjec() 함수를 통해서 관찰한다
WaitForSingleObjec() 는 해당 커널 오브젝트가 Signaled 상태가 되기를 대기(Block) 한다

커널 오브젝트 상속

부모 프로세스의 핸들 테이블을 자식 프로세스에 상속할 수 있다
프로세스 핸들 테이블에는 각 리소스의 상속 여부 정보도 같이 있다
CreateProcess 를 호출할때 bInheritHandles를 TRUE로 설정한 후 자식 프로세스를 생성하면 상속 가능으로 설정된 리소스들은 자식 프로세스에 상속된다

핸들 상속 가능한 리소스 생성

보안 속성의 bInheritHandle 를 TRUE로 설정 해야한다

커널 오브젝트 핸들 상속 전

커널 오브젝트 핸들 상속 후

커널 오브젝트 핸들 복사

커널 오브젝트 핸들을 다른 프로세스에게 전달하기 위해 복사 가능하다.
복사된 대산 프로세스의 핸들 테이블에는 새로운 커널 오브젝트가 등록된다.
DuplicateHandle()함수를 통해서 복사된 핸들값(&val, 364)을 얻을 수 있으며 이를 프로세스 B 에서 사용할 수 있다. 단 핸들값을 프로세스 B 혼자서는 알 수 없는데 이는 DuplicateHandle를 호출한 프로세스가 처리 해야할 문제이다.

자신의 대상으로 커널 오브젝트 핸들을 복사할 수 있다. 이 커널 오브젝트는 반환시 CloseHandle 함수를 2번(256, 284) 호출 해야한다.

이런 사용방식은 다음과 같이 자식 프로세스에게 부모 프로세스의 핸들을 상속 시킬때도 사용할 수 있다.

자식 프로세스는 상속 받은 부모 프로세스 핸들을 사용하여 부모 프로세스가 종료하기를 기다리는 것과 같은 동작을 수행 가능

profile
mohadang

0개의 댓글