2012년 9월 3일 월요일

윈도우즈 시스템 프로그래밍 [8] - 프로세스간 통신 (IPC) 2.




윈도우즈 시스템 프로그래밍을 공부하면서 정리한 글입니다.



7장.  프로세스간 통신 (IPC) 1



I. 프로세스간 통신(IPC)의 의미



1. 프로세스의 커널 오브젝트 핸들 테이블

- 마이크로소프트에서 Windows 운영체제 소스코드를 공개하지 않아 핸들 테이블이 어떻게 관리되는지
   알 방법이 없음
- 리소스 생성 과정에서 커널 오브젝트가 생성되면, 해당 오브젝트의 핸들이 반환

① 핸들과 커널 오브젝트의 리뷰 (Review)


=> 핸들 256을 통해 0x2400번지에 할당 되어 있는 메일 슬롯에 접근 가능
      BUT 핸들 256이 0x2400번지의 커널 오브젝트를 의미한다는 정보가 없음
      => 핸들 테이블 개념을 도입


② 핸들 테이블의 도입


- 핸들 테이블은 핸들 정보를 저장하고 있는 테이블로서 프로세스 별로 독립적


2. 핸들의 상속

- CreateProcess 함수 호출 시 다섯번째 인자가 무엇이냐에 따라 부모 프로세스의 핸들 테이블이
   자식 프로세스에게 상속될 수 있음

① 핸들의 상속에 대한 이해

- 자식 프로세스는 부모 프로세스의 핸들 테이블 정보를 상속 받을 수 있음
   but 모든 핸들 정보를 상속 받진 않음
- 핸들 테이블에는 해당 핸들의 상속 여부 컬럼(column)이 존재
- 상속시, 상속 여부에 대한 정보도 변경 없이 그대로 상속됨
   => 자식 프로세스에 상속된 핸들은 또 다른 자식 프로세스 만들때도 상속됨
- 상속되는 핸들을 결정 하는건 프로그래머 몫


② 핸들의 상속을 위한 전달 인자

BOOL CreateProcess (
   LPCTSTR lpApplicationName,
   LPTSTR lpCommandLine,
   ...
   BOOL bInheritHandles // 핸들 상속 인자
   ...
);

bInheritHandles  -> TRUE 전달할 경우 부모 프로세스의 핸들 테이블은 상속됨
  -> BUT 상속 여부가 Y 로 설정된 핸들에 한해서만 상속이 이루어짐


③ 핸들의 상속과 커널 오브젝트의 Usage Count (UC)

- 프로세스가 핸들을 얻게 되었다는 의미 : 핸들 테이블에 대한 정보가 갱신됨

ex) CreateMailslot 호출
      ⑴ 메일 슬롯 리소스 생성
      ⑵ 커널 오브젝트 생성
      ⑶ 핸들 정보가 핸들 테이블에 갱신  // 이때부터 프로세스가 핸들 정보를 얻음
      ⑷ CreateMailslot 함수를 빠져 나오면서 핸들값 반환

- 부모 프로세스 핸들 테이블에 있는 커널 오브젝트들 UC가 1
- 자식 프로세스 생성 후 상속여부가 Y 였던 커널 오브젝트는 UC가 1 증가 => UC=2가 됨


④ 상속이 되기 위한 핸들의 조건

- 핸들의 상속 여부는 리소스 생성되는 순간 결정 (핸들 테이블의 Y or N)

- LPSECURITY_ATTRIBUTES 구조체 = SECURITY_ATTRIBUTES의 포인터로 정의
- NULL 이 전달되면 상속이 되지 않음
   BUT 구조체 변수를 적절히 초기화해 주소값 전달하면 상속 가능

typedef struct _SECURITY_ATTRIBUTES {
   DWORD nLength;   // 구조체 변수 크기
   LPVOID lpSecurityDescriptor;   // 상속과 관계 없음
   BOOL bInheritHandle;   // 상속 여부 결정   TRUE : Y,  FALSE : N
}

ex)

SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;

HANDLE hMailSlot = CreateMailslot(   ...   , &sa);
CreateProcess(   ...   , &sa,   ...   );




II. Pseudo (가짜) 핸들과 핸들의 중복 (Duplicate)


- 프로세스의 핸들은 Pseudo (가짜) 핸들

1. 프로세스의 커널 오브젝트 핸들 테이블







댓글 없음:

댓글 쓰기