객체구조 – 형식 객체
- Windows Server 2008
객체 헤더는 모든 객체에 공통적인 데이터를 포함하지만 객체 각 인스턴스마다 다른 값을 가질 수 있다. 예를 들어 각 객체는 고유한 이름을 가지며 고유한 보안 디스크립터를 가질 수 있다. 하지만 객체는 특정 유형의 모든 객체에 대해서는 항상 변하지 않는 값을 가지기도 한다.
어떤 유형의 객체 핸들을 오픈 할 때 접근 권한 집합에서 이 객체 유형에 고유한 권한을 선택할 수 있다. 익스큐티브는 스레드 객체의 경우 여러 접근 권한 중에 종료와 서스펜드 접근 권한을 제공하고 파일 객체의 경우에는 읽기와 쓰기, 추가, 삭제 접근 권한을 제공한다.
객체 관리자는 메모리 절약을 위해 이들 정적이며 객체 유형 특정적인 속성을 새로운 객체 유형을 생성할 때 한번만 저장한다. 객체 관리자는 이 데이터를 기록하기 위해 자신만의 객체와 형식 객체(Type Object)를 사용한다.
객체 추적 디버그 플래그가 설정되어 있다면 형식 객체도 동일한 유형의 모든 객체끼리 서로 연결된다. 이것은 객체 관리자가 필요하다면 이들을 찾고 열거하게 해준다. 이 기능은 생성자 정보 서브헤더를 이용함으로써 가능하다.
객체 관리자는 형식 객체에 대한 서비스를 제공하지 않기 때문에 유저모드에서 형식 객체를 조작할 수 없다. 하지만 형식 객체가 정의하는 일부 속성은 특정 네이티브 서비스와 윈도우 API 루틴을 통해 볼 수 있다.
속성 | 용도 |
유형 이름 | 해당 유형의 객체 이름('프로세스', '이벤트', '포트' 등)이다. |
풀 유형(Pool Type) | 해당 유형의 객체가 페이지 메모리나 넌페이지드 메모리에서 할당되어야 하는지를 나타낸다. |
디폴트 쿼터 차지(Default Quota Cahrges) | 프로세스 쿼터에 지정할 디폴트 페이지드와 넌페이지드 값이다. |
유효한 접근 마스크(Valid Access Mask) | 스레드가 해당 유형의 객체 핸들을 오픈 할 때 요청할 수 있는 접근 유형(읽기,쓰기, 종료, 서스펜드 등)이다. |
범용 접근 권한 매핑(generic Access Rights Mapping) | 유형 특정적인 접근 권한에 대한 4가지 범용 접근 권한(읽기, 쓰기, 실행, 모두)사이의 매핑이다. |
플래그 | 객체가 이름을 갖지 말아야 하는지(프로세스 객체의 경우)객체가 보안 디스크립터를 필요로 하는지, 핸들 데이터베이스(핸들 정보 서브헤더)와 또는 유형 리스트 연결을 더 관리 해야 하는지를 나타낸다. |
유효하지 않은 속성 | 해당 객체 유형에 유효하지 않는 객체 속성 플래그를 명시 |
디폴트 객체 | 객체 유형 생성자가 이벤트를 요청한다면 해당 객체를 대기하는 동안 사용되어야 할 내부 객체 관리자 이벤트를 명시한다. 파일 객체의 경우 객체 관리자는 Event로 불리는 FILE_OBJECT 구조체 내부 멤버에 디폴트 객체를 하드코딩 한다. |
메소드 | 객체 관리자가 객체 수명 동안의 특정 시점에 자동으로 호출하는 하나 이상의 루틴이다. |
윈도우 애플리케이션 동기화는 한 상태에서 또 다른 상태로 변화하기를 기다림으로써 스레드가 자신의 실행을 동기화하는 기능이다. 스레드는 익스큐티브 잡, 프로세스, 스레드, 파일, 이벤트, 세마포어, 뮤텍스, 타이머 객체로 동기화 할 수 있다. 그 밖의 다른 익스큐티브 객체는 동기화를 지원하지 않는다.
[참고자료]
Windows Internals
'Windows , IIS' 카테고리의 다른 글
객체구조 – 객체 핸들과 프로세스 핸들 테이블 (0) | 2015.07.16 |
---|---|
객체구조 – 객체 메소드 (0) | 2015.07.16 |
객체구조 – 객체 헤더와 본체 (0) | 2015.07.16 |
익스큐티브 객체 (0) | 2015.07.16 |
커널모드 시스템 디스패칭과 서비스 디스크립터 테이블 (0) | 2015.07.16 |