시스템 프로그래밍

8-2. 핸들 테이블과 오브젝트 핸들의 상속

CalebHong 2022. 5. 20. 11:32

핸들테이블의 이해

 - 핸들 테이블은 프로세스마다 독립적

 

핸들테이블의 상속

 - CreateProcess 함수에서 5번째 인자 값으로 bInheritHandles라는 BOOL 값에 따라 핸들테이블 상속이 가능

 - 핸들 테이블의 데이터 마다 상속 여부가 있으며, Y가 되어 있는 핸들 데이터만 상속이 가능

ex) 핸들 테이블 예시

핸들 주소 상속여부
127 0x1200 Y
168 0x1680 N
256 0x2400 Y
.....
SECURITY_ARRTIVUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE; // 핸들 상속 여부
.....
CreateMailSlot(....&sa); // &sa는 4번째 전달인자

 

핸들의 상속과 UC

 - 자식 프로세스에게 상속이 이루어진 핸들은 접근 가능한 프로세스가 증가함으로 UC 카운트가 2가 됨

 - 부모 프로세스가 Receiver 프로세스의 MailSlot을 만들고 자식 프로세스까지 핸들을 상속 받게 되면 UC는 2가 됨

 - 자식 프로세스는 핸들 값을 통해 MailSlot의 영역에 접근이 가능

 

Pseudo(가짜) 핸들과 핸들의 중복 1

 - A 프로세스가 생성되면 커널오브젝트도 함께 생성되며, 커널오브젝트의 핸들 정보가 핸들 테이블에 등록이 된다고 알지만 사실상 등록이 안됨 => GetCurrentProcess()는 Pseudo 핸들 값을 반환

 - 핸들 테이블에 등록되지 않은 핸들 값은 모두 Pseudo 핸들

 

 - A 프로세스가 B 프로세스를 생성할 때, 자식인 B프로세스는 부모 프로세스의 상태를 알기 위해 A프로세스의 핸들 정보를 상속를 상속 받아야 함

 - A 프로세스는 자기 자신의 핸들 정보를 핸들 테이블에 등록해야 하는 이때 DuplicateHandle() 함수를 사용함

 - DuplicateHandle(A 핸들, 핸들 값, B 핸들, &val, ...);

 - 핸들 값과 주소를 다를 수 있으며, 주소 값만 제대로 등록되었으며 접근이 가능

 

Pseudo(가짜) 핸들과 핸들의 중복 2

// 자신의 프로세스 핸들 정보를 자신의 핸들 테이블에 복사해서 등록
DuplicateHandle(
    GetCurrentProcess(),
    GetCurrentProcess(),
    GetCurrentProcess(),
    &hProcess,
    0,
    TRUE,
    DUPLICATE_SAME_ACCESS
);

 

'시스템 프로그래밍' 카테고리의 다른 글

9. 프로세스의 스케줄링  (0) 2022.05.24
8-3. 파이프 방식의 IPC  (0) 2022.05.20
8-1. 프로세스 환경변수  (0) 2022.05.20
7-2. Signaled & Non-Signaled  (0) 2022.05.17
7-1. 프로세스간 통신(IPC)  (0) 2022.05.17