커널오브젝트의 상속과 핸들테이브에 대한 개념을 소개하려 한다
파이프 기반 IPC를 이해하기 위해서 필요한 내용이다
유능한 Windows 프로그래머는 프로세스 핸들 테이블이 어떻게 관리되는지를 이해하고 있어야 한다
Jeffrey Richter
"Programming Application for Microsoft Windows"
마소에서 Windows 운영체제를 공개하지 않고 있다
프로세스 핸들테이블이 어떻게 관리되는지를 아주 세밀한 부분까지 정확히 알 방법은 없다
Windows 버전마다 핸들 테이블이 관리되는 방법에 차이가 있다고 한다.
이러한 어려움 때문에 Jeffrey Richter 는 가장 일반적인 형태로 프로세스 핸들 테이블이 관리되는 방식을 설명하고 있는데 이 내용을 통해서 기본적인 메커니즘을 이해할 수 있으며, 이는 Windows 프로그래머들에게 아주 많은 도움이 되었다
시스템 리소스의 생성과정에서 커널오브젝트가 생성되면, 생성된 커널 오브젝트를 가리킬때 사용되는 핸들이 반환된다는것은 이미 알고 있다
메일슬롯을 다른 각도에서 살펴보자
MailReceiver.cpp는 함수 CreateMailslot 호출을 통해 메일슬롯을 생성한다 그런데 이 리소스는 운영체제에 의해서 관리되므로 메일슬롯 정보를 담고 있는 커널 오브젝트가 생성되고, 최종적으로는 커널 오브젝트의 핸들이 반환된다. 이 핸들은 메일슬롯의 커널 오브젝트를 가리키는 용도로 사용된다.
그림에서 0x2400번지에 메일슬롯 정보를 저장하는 커널 오브젝트가 생성되었고 256은 커널 오브젝트를 가리키는 용도로 사용되는 핸들임을 나타내고 있다
위 그림에서 이해하기 어려운 부분이 한군데 존재한다.
"핸들 256을 통해서 0x2400번지에 할당되어 있는 메일슬롯에 접근이 가능하다"
왜 이것이 이해하기 어려운 부분인가? 핸들256이 0x2400번지에 존재하는 커널 오브젝트를 의미한다는 정보는 어디에도 없다
CloseHandle 함수를 호출하면서 핸들256을 인자로 전달할경우 0x2400번지에 존재하는 커널 오브젝트의 UsageCount 값이 하나 감소되는 부분에 대해서 의문이 생긴다.