http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx
Namespaces
윈도우 API 에서 사용되는 네임스페이스 규칙에는 NT namespaces 와 Win32 네임스페이스, 두 가지 카테고리가 있다. NT 네임스페이스는 Win32 네임스페이스를 넘어서, Win32 서브시스템을 포함한 다른 서브시스템과 네임스페이스에서도 존재할 수 있도록 더 low 레벨에서 디자인되었다. POSIX 는 다른 서브시스템의 다른 예인데, POSIX 는 NT 네임스페이스의 꼭대기에서 빌드되었다(?). 초기의 윈도우에서도 커뮤니케이션 포트나 디스플레이 콘솔과 같은 특정 디바이스들의 이름들에 대해 이미 다양한 정의들을 해 두었다.
Win32 Device Namespaces
\\.\ 접두어는 Win32 디바이스 네임스페이스에 접근하는 데 사용한다(파일 네임스페이스와 다름). API 가 이런 방식의 접근을 지원한다면, 파일 시스템을 거치지 않고 물리적 디스크나 볼륨에 직접 접근할 수 있는 방법이다. 디스크 뿐 아니라 다양한 디바이스에 이 방법으로 접근할 수 있다(예를 들면 CreateFile 이나 DefineDosDevice 함수를 이용해서)
예를 들어서 시스템의 시리얼포트1을 열고 싶으면 CreateFile 함수를 써서 COM1 을 접근할 수 있을 거다. COM1-COM9 가 이미 NT 네임스페이스 내에 예약되어 있기 때문에 이게 가능한데, "\\.\" 접두어를 쓰면 똑같이 이 디바이스에 접근 가능하다. 반면에, 만약 니가 메인보드를 확장해서 100개 포트를 만들었고 그 중 56번에 연결하고 싶은데 COM56 은 NT 네임스페이스에 없다 하면 \\.\COM56을 쓰면 된다. 왜냐하면 \\.\ 은 미리 정의되어 있는 alias 를 사용하려 하지 않고, 직접적으로 디바이스 네임스페이스에 접근하기 때문이다.
다른 예를 들어서 Win32 디바이스 네임스페이스에서 CreateFile 아규먼트로 "\\.\PhysicalDiskX"를 쓰거나 "\\.CdRomX" 를 쓰는경우가 있다(X는 숫자). 이런 방식도 마찬가지로 파일시스템을 우회해서 디바이스에 직접 접근하게끔 해준다. 디바이스 이름이 시스템에 의해 enumerated 하게 만들어졌기 때문에 가능한 방법이다. 몇몇 드라이버는 시스템 내에서 또다른 alias 를 만들 수도 있다. 예를 들어서 C:\ 라고 이름붙여진 디바이스 드라이버가 자시 자신의 네임스페이스를 갖고 있으면 파일 시스템에서도 마찬가지다 (???? - For example, the device driver that implements the name "C:\" has its own namespace that also happens to be the file system.)
보통 CreateFile API 에 "\\.\" 접두사를 갖고 사용을 하는데, 이는 CreateFile API가 파라미터에 따라 파일과 디바이스 둘 다에 사용할 수 있기 때문이다. 파일은 필요없고 디바이스에만 접근하기 위해 API 함수를 쓴다고 하면 "\\.\" 접두어를 써야만 한다
디바이스 네임스페이스를 위해 "\\.\" 접두어를 인식하는 API 는 드물기 때문에 항상 레퍼런스를 체크해야 한다.
NT Namespaces
윈도우 어플리케이션에서 접근 가능한 디바이스 객체를 만들기 위해서는, 디바이스 드라이버가 Win32 네임스페이스 "Global??" 내부에 심볼릭 링크를 만들어 주어야 한다. 예를 들어서 Global?? 서브디렉토리 내부의 COM0, COM1 은 Serial0과 Serial1 이란 심볼릭 링크로 간단히 연결되고, "C:" 는 HarddiskVolume1 이라는 심볼릭 링크로, "Physicaldrive0" 는 DR0 이라는 심볼릭 링크로 연결.... 기타 등등이다. 특정 디바이스 "Xxx" 에 심볼릭 링크가 없다면, 앞에서 서술한 Win32 네임스페이스 규칙을 사용하는 다른 윈도우 어플리케이션에서 사용할 수가 없다. 그러나 NT 네임스페이스 를 지원하는 API 로 "\Device\Xxx" 포맷의 절대경로를 사용하면 핸들은 딸 수가 있다.
터미널 서비스나 VM 을 통한 멀티유저 서포트를 추가하게 되면 시스템 전역 루트 디바이스를 반드시 가상화해야 한다(??). 이는 "GLOBALROOT" 라고 명명된 심볼릭링크를 Win32 네임스페이스 추가함으로써 가능한데, WinObj를 사용하면 "Global??" 서브디렉토리 안에서 찾을 수 있다. 그리고 "\\?\GLOBALROOT" 를 통해서도 접근 가능하다. 이 접두어는 session-dependent path 가 아닌 system object manager 의 실제 루트패스로 보이도록 해 준다.
'Research > Kernel' 카테고리의 다른 글
adding sys call on kernel 3.16.x, 3.19.x (0) | 2016.06.14 |
---|---|
SYSENTER 가 보이지 않는 이유 (0) | 2013.10.28 |