Kernel Object Namespaces

Kernel Object Namespaces
 
 
터미널 서비스 서버는 몇몇의 커널 객체(Event, Semaphore, Mutex, Waitable timer, File-mapping 객체 그리고  Job 객체)에
대해서  복합적인 이름을 사용할수 있도록 되어 있다. 전역적인 이름은 클라이언트/서버 형식의 응용프로그램들이
많이 사용한다. 그리고 각 클라이언트 세션(session)은 위에 열거한 객체들을 위해 분리된 독자적인 이름 공간을 가지고 있다.
이것은 모든 프로세스와 서비스가 위에 열거한 객체들을 위해 단일화된 이름공간을 공유한다는 원칙과 차이가 있다는것에
주의해야 한다.
 
이름공간을 클라이언트 세션마다 별도로 구별해서 사용하는것은 동일한 응용프로그램을 여러번 실행했을때,
여러번 실행된 각각의 프로그램이 서로에게 영향을 받지 않고 실행되도록 하기 위함이다.
클라이언트 세션에서 실행한 프로세스들은 기본적으로 세션내의 이름공간을 사용한다. 그러나 프로세스가 객체의
이름을 명시할때 "Global\"과 같은 접두어를 사용해서 이름을 명시한다면 전역적인 이름공간을 사용하게 된다.
 
예를 들어, 아래와 같이 CreateEvent함수를 사용하여 Tipsware라는 이름의 이벤트 객체를 생성하면 이 객체는
세션내에 이름공간을 사용할 것이다.
 
CreateEvent(NULL, FALSE, FALSE, "Tipsware");
 
하지만, 이름을 "Global\\Tipsware"라고 사용하면 시스템의 전역적인 이름공간을 사용하게 된다.
 
CreateEvent(NULL, FALSE, FALSE, "Global\\Tipsware");
 
터미널 서비스 환경에서 실행되는 서비스 응용프로그램들은 기본적으로 전역적인 이름공간을 사용한다. 그리고 
시작 세션(Session Zero, 일반적으로 콘솔 세션 또는 서비스 세션)하에서 실행되는 프로그램도 기본적으로 
전역적인 이름공간을 사용한다. 이것은 전역적인 이름공간을 사용해서 여러개의 클라이언트 세션에 실행된 각각의 
프로세스가 서로 통신하는것을 가능하게 한다.
 
예를들어, 터미널 서비스에 의해서 서버루틴이 실행되었거나 서비스루틴에 의해서 자동으로 서버루틴이 실행된 경우,
서버루틴에서 사용하는 객체들은 전역적인 이름공간을사용하기때문에 클라이언트 세션 또는 일반 사용자 세션에서
서버가 만든 객체를 사용하고자 한다면 객체의 이름을 명시할때, "Global\"이라는 접두어를 이름앞에 붙여서 사용해야 한다.
 
그리고 전역적인 이름공간을 사용하는 또다른 경우는, 각 세션마다 분리된 이름공간을 가지고 있기 때문에, 각 세션에서
커널객체를 이용하여 세션내에서 실행되는 프로그램에 대햐여 중복실행 체크가 가능하지만 다른 세션에 같은 프로그램이
실행되는것은 체크할수 없다. 따라서 현재 시스템에서 실행중인 모든세션에서 특정 프로그램이 중복 실행되지 않도록 하려면
전역적인 이름 공간을 사용해서 객체를 생성시키고 체크하면 된다.
 
클라이언트 프로세스들이 객체를 생성할때, 자신이 실행되는 세션의 이름공간에 생성하는것을 좀더 확실하게 보장받고
싶다면 "Local\"이라는 접두어를 사용하면 된다.
 
"Local", "Global" 그리고 "Session"이라는 용어는 시스템에 의해서 예약되어져 있기 때문에 커널 객체를 생성할때 이름으로
사용하면 안된다. 하지만 이용어들은 대소문자를 구별하기 때문에 LOCAL, loCAL과 같은 형태로 사용하는것은 문제가되지
않는다. 그리고 터미널 서비스를 제공하지 않는 Windows 2000 제품군에서는 위 용어들이 무시될 것이다.