728x90
핸들테이블
- 프로세스에서 메일 슬롯을 생성하면 메일 슬롯의 커널 오브젝트가 생성이 되고 접근하기 위한 핸들값과 커널 오브젝트의 주소 정보가 핸들 테이블에 등록(저장)
핸들 테이블의 상속
- 핸들 테이블은 부모 프로세스에서 조건이 맞으면 자식 프로세스에서 상속이 가능
BOOL CreateProcess(
LPCSTR lpApplicationName,
LPSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles, // 핸들 테이블의 상속 여부
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATIO lpProcessInformation
);
- 각각 핸들의 상속 여부가 설정되어 있는 경우만 가능
-> SECURITY_ATTRIBUTES를 설정
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle; // 핸들의 상속 여부
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
-> 이 정보를 보안 설정을 해주는 파라미터에 넣음
SECURITY_ATTRIBUTES sa;
sa.bInheritHandle = true;
hMailSlot = CreateMailslot(
SLOT_NAME, // 메일 슬롯 이름(주소)
0, // 메일 슬롯 버퍼 크기(0 = 최대치)
MAILSLOT_WAIT_FOREVER,
&sa // 보안 설정
);
- 부모 프로세스에서 자식 프로세스로 핸들 테이블이 상속될 때 상속이 된 커널 오브젝트의 UC는 1씩 증가
Pseudo 핸들
- 실제로 핸들 테이블에 등록되어 있지 않은 가짜 핸들
-> 자기 프로세스의 핸들 정보는 핸들 테이블에 등록이 되어 있지 않고 GetCurrentProcess() 함수를 통해 반환된 상수(-1)를 통해 프로세스 자신의 커널 오브젝트에 접근을 함
- DuplicateHandle() : 자신의 핸들 정보를 자식 프로세스에 상속을 해주기 위해 사용
BOOL DuplicateHandle(
HANDLE hSourceProcessHandle, // 부모 프로세스
HANDLE hSourceHandle, // 부모 프로세스에서 복사할 핸들
HANDLE hTargetProcessHandle, // 자식 프로세스
LPHANDLE lpTargetHandle, // 자식 프로세스에서 저장할 핸들 정보 지정
DWORD dwDesiredAccess, // 복사한 핸들의 접근 권한
BOOL bInheritHandle, // 복사한 핸들의 상속 여부
DWORD dwOptions // 옵션 값(DUPLICATE_SAME_ACCESS / DUPLICATE_CLOSE_SOURCE)
);
- 자기 자신의 핸들 값을 핸들 테이블에 등록하는 방법
Handle var;
DuplicateHandle(
GetCurrentProcess(), // 자기 자신의 프로세스의
GetCurrentProcess(), // 핸들 값(-1)을
GetCurrentProcess(), // 자기 자신의 프로세스에
&var, // var 값으로 등록
0,
true,
DUPLICATE_SAME_ACCESS
)
728x90
'Programming > System Programming' 카테고리의 다른 글
윈도우즈 시스템 프로그래밍 - 8. 프로세스간 통신2(3) (0) | 2020.07.19 |
---|---|
윈도우즈 시스템 프로그래밍 - 8. 프로세스간 통신2(2) (0) | 2020.07.19 |
윈도우즈 시스템 프로그래밍 - 7. 프로세스간 통신(2) (0) | 2020.07.19 |
윈도우즈 시스템 프로그래밍 - 7. 프로세스간 통신(1) (0) | 2020.07.19 |
윈도우즈 시스템 프로그래밍 - 6. 커널 오브젝트와 오브젝트 핸들(4) (0) | 2020.07.16 |