현재 실행되는 프로세스 자신의 핸들을 얻는 방법으로써 GetCurrentProcess 함수가 있다. 그런데 이 함수 호출을 통해 얻은 핸들을 가리켜 가짜 핸들(Pseudo핸들)이라한다. 왜냐하면 이렇게 얻어진 핸들은 핸들 테이블에 등록되어 있지 않고 다만 현재 실행중인 프로세스를 참조하기 위한 용도로 정의해 놓은 상수가 반환되는 것이기 때문이다.
진짜 핸들을 얻는 방법 DuplicateHandle 사용하면 된다.
복제할 핸들을 소유하는 프로세스
복제할 핸들
복제된 핸들을 소유할 프로세스
복제된 핸들값을 저장할 변수
프로세스A는 자신의 핸들 테이블에 존재하는 핸들 256을 B에게 복사해 주고 싶다.
DuplicateHandle(A핸들, 256, B핸들, &val) 등록된 핸들의 값은 변수val에 저장된다. 복사된다고 해서 핸들 값까지 같지 않다. 독립된 프로세스 영역의 핸들이기 때문에 값이 같건 다르건 별 의미를 지니지 않는다.
DuplicateHandle(A핸들, 256, A핸들, &val)
프로세스가 자신이 소유하고 있는 핸들을 자신의 핸들 테이블에 복사할 수 도 있다.
UsageCount 증가한다. 따라서 CloseHandle 함수 호출을 통해 핸들 반환해야한다
DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(),
GetCurrentProcess(), &hProcess)
첫 번째 GetCurrentProcess() 호출은 소스 프로세스의 "의사 핸들(pseudo-handle)"을 반환합니다. 이 핸들은 현재 프로세스를 참조합니다.
두 번째 GetCurrentProcess() 호출은 복사할 핸들 (이 경우에도 의사 핸들)을 반환합니다.
세 번째 GetCurrentProcess() 호출은 목표 프로세스의 핸들을 제공합니다, 다시 말해 복사된 핸들이 어디에 저장될지를 지정합니다. 이 경우에도 현재 프로세스입니다.
&hProcess는 복사된 핸들이 저장될 변수를 지정합니다.
GetCurrentProcess 통해서 얻은 가짜 핸들을 진짜 핸들(hProcess)로 구성해서 핸들 테이블에 등록하고 있다 핸들테이블에 등록된 정보는 자식 프로세스로 상속이 가능하니까 자식 프로세스는 부모 프로세스의 핸들을 얻게 된다.
_stprintf(cmdString, _T("%s %u"), _T("childProcess.exe"),(unsigned)hPrecess);
CreateProcess(NULL, cmdString)
얻은 핸들정보를 문자열로 구성한 다음 매개변수로 전달하고 있따. 자식 프로세스는 부모 프로세스의 핸들 정보를 얻게 된다.