객체구조 – 객체 핸들과 프로세스 핸들 테이블
- Windows Server 2008
프로세스는 이름을 사용하여 객체를 생성하거나 오픈 할 때 객체에 대한 자신의 접근을 나타내는 핸들을 받는다. 객체 관리자는 이름 찾기 과정을 생략하고 객체를 직접 찾을 수 있기 때문에 객체 이름보다 객체의 핸들로써 객체를 참조하는 것이 좀더 빠르다.
프로세스는 프로세스 생성 시점에서 핸들을 상속받거나 또는 다른 프로세스로부터 복사된 핸들을 받음으로써 객체에 대한 핸들을 구할 수 있다.
익스큐티브 구성 요소와 디바이스 드라이버는 커널모드에서 실행해 시스템 메모리에 있는 객체 구조체에 접근할 수 있기 때문에 직접 객체에 접근한다.
객체 핸들은 추가적인 이점이 있다.
- 객체 핸들은 자신들이 참조하는 대상을 제외하면 파일 핸들과 이벤트 핸들, 프로세스 핸들 간에 차이점이 없다. (객체를 참조하는 일관적인 인터페이스 제공)
- 객체 관리자는 핸들을 생성하고 핸들이 참조하는 개체를 찾는 데 있어 독점적인 권한을 가진다. (모든 유저 모드 행위를 객체 관리자가 검사할 수 있음을 의미)
객체 핸들은 익스큐티브 프로세스(EPROCESS)블록이 가리키는 프로세스 특정적인 핸들 테이블의 인덱스다. 첫 번째 핸들 인덱스는 4이며 두 번째 8과 같은 방식이다. 프로세스 핸들 테이블은 프로세스가 오픈한 핸들과 관련된 모든 객체에 대한 포인터를 포함한다.
핸들 테이블은 x86 메모리 관리 유닛의 가상-물리 메모리 변환 방식과 유사한 3단계 구조로 구현되며 프로세스당 최대 16,000,000개의 핸들을 제공한다. 프로세스 생성 시에는 최하위 레벨의 핸들 테이블만이 할당되며 나머지 레벨의 핸들 테이블은 필요에 따라 생성된다. 서브 핸들 테이블은 한 페이지에 들어갈 수 있는 엔트리 수에서 1을 뺀 만큼 엔트리로 이루어졌다. 이 한 엔트리는 핸들 감사용으로 사용된다.
아래 그림에서 x86 시스템의 경우 각 핸들 엔트리는 객체에 대한 포인터와 승인된 접근 마스크인 두 개의 32비트 멤버로 이루어 진다. 64비트 시스템인 경우 핸들 테이블 엔트리는 객체 헤더에 대한 64비트 포인터와 32비트 접근 마스크를 갖는 12바이트 크기다.
- Lock : 엔트리가 현재 사용 중인지 나타내는 락 비트 이다.
- Inheritable : 상속을 지정. 이 프로세스에 의해 생성된 프로세스가 이 핸들의 복사본을 자신의 핸들 테이블에 가질 것인지를 나타냄.
- Protect from close : 객체를 닫을 때 감사 메시지를 발생해야 하는지를 나타냄
- Audit on close : 미사용 부분에 위치하는 닫기로부터 보호 비트로서 호출자가 이 핸들을 닫을 수 있게 허용되는지 나타낸다.
시스템 구성 요소와 디바이스 드라이버는 종종 유저모드 애플리케이션이 접근하지 못하는 개체에 대한 핸들을 오픈 할 필요가 있다. 이것은 커널 핸들 테이블내에 핸들을 생성함으로써 가능하다. 이 테이블 내의 핸들은 커널모드라면 어떤 프로세스 컨텍스트에서도 접근 가능하다. 커널모드 함수는 성능에 영향을 주지 않고서 어떤 프로세스 컨텍스트에서든 이 핸들을 참조할 수 있음을 의미한다.
[참고자료]
- Windows Internals
강성욱 / http://sqlmvp.kr
'Windows , IIS' 카테고리의 다른 글
객체구조 – 객체 유지 (0) | 2015.07.16 |
---|---|
객체구조 – 객체 보안 (0) | 2015.07.16 |
객체구조 – 객체 메소드 (0) | 2015.07.16 |
객체구조 – 형식 객체 (0) | 2015.07.16 |
객체구조 – 객체 헤더와 본체 (0) | 2015.07.16 |