프로세스의 생성 2 - CreateProcess()
CreateProcess()의 두 번째 포스팅으로 STARTUPINFO 파라미터에 대해 알아보도록 하겠습니다.
프로세스가 생성될 때 이 STARTUPINFO or STARTUPINFOEX 구조체를 참조하여 프로세스의 속성들을 설정해줄 수 있습니다.
CreateProcess()를 호출할 때 이 STARTUPINFO는 반드시 0으로 초기화 되어 있어야 합니다.
예를 들면,,,
STARTUPINFO lpStartInfo = { sizeof(lpStartInfo) };
CreateProcess(......, lpStartInfo, ......);
이런 식의 초기화가 필요합니다.
- STARTUPINFO를 초기화 하지 않으면 쓰레기 값들이 들어가있기 때문에 오동작 가능성이 생기게 됩니다.
1. STARTUPINFO 구조체
- https://msdn.microsoft.com/en-us/library/windows/desktop/ms686331(v=vs.85).aspx
구조체의 모냥은 요런 형태로 각 인자들에 대한 내용은 아래 표와 같습니다.
파라미터 | 설명 |
cb | 구조체의 바이트 수로 sizeof(STARTUPINFO)를 의미 |
lpReserved | Reserved |
lpDesktop | 애플리케이션이 수행될 데스크탑의 이름으로 대체로 NULL로 지정 - NULL이면 프로세스가 실행되는 현재 데스크탑 |
lpTitle | 콘솔 윈도우의 윈도우 타이틀을 지정 - NULL이라면 프로세스의 파일명이 타이틀이 됨 |
dwX, dwY | 프로세스가 실행 될 윈도우의 x, y 좌표를 지정 |
dwXSize, dwYSize |
프로세스가 실행 될 윈도우의 x, y 너비를 지정 - 지정하지 않는다면 기본값인 CW_USEDEFAULT로 실행됨 |
dwXCountChars, dwYCountChars |
콘솔 애플리케이션이 실행 중이다가 새로운 프로세스(자식 프로세스)를 수행하게 될 때, 자식 윈도우의 x, y 너비(스크린 버퍼)를 지정 |
dwFillAttributes | 콘솔 애플리케이션이 실행 중이다가 새로운 프로세스(자식 프로세스)를 수행하게 될 때, 자식 윈도우의 글자색을 지정 - FOREGROUND_GREEN, FOREGROUND_RED...... |
dwFlags | 실행될 프로세스에 지정할 플래그 - STARTF_FORCEONFEEDBACK : 프로세스 수행 상태에 따라 마우스 커서 변경 - STARTF_FORCEOFFEEDBACK : 프로세스가 실행되고 2초동안 마우스 커서가 모래시계(?) 상태 - STARTF_PREVENTPINNING : 작업 표시줄에 표시되지 않는 프로세스 생성 - STARTF_RUNFULLSCREEN : 전체화면으로 시작 - STARTF_TITLEISAPPID : lpTitle 파라미터의 값이 작업표시줄과 시작 메뉴의 이름이 됨 + STARTF_TITLEISLINKNAME과 같이 사용될 수 없음 - STARTF_TITLEISLINKNAME : lpTitle 파라미터(프로세스 이름)가 단축 아이콘의 이름이 됨 + STARTF_TITLEISAPPID와 같이 사용될 수 없음 - STARTF_USECOUNTCHARS : dwXCountChars, dwYCountChars 파라미터를 사용 - STARTF_USEPOSITION : dwX, dwY 파라미터를 사용 - STARTF_USEFILLATTRIBUTE : dwFillAttributes 파라미터를 사용 - STARTF_USEHOTKEY : hStdInput 파라미터를 사용 + STARTF_USESTDHANDLES와 같이 사용될 수 없음 - STARTF_USESHOWWINDOW : wShowWindow 파라미터를 사용 - STARTF_USESIZE : dwXSize, dwYSize 파라미터를 사용 - STARTF_USESTDHANDLES : hStdInput, hStdOutput, hStdError 파라미터를 사용 + STARTF_USEHOTKEY와 같이 사용될 수 없음 |
cbReserved2, lpReserved2 |
cbReserved2 : 0으로 초기화 (사용되지 않음) lpReserved2 : NULL로 초기화 (역시 사용되지 않음) + OS내부적으로 처리하는 동작은 있지만 적지는 않겠음 |
hStdInput, hStdOutput, hStdError |
콘솔 입출력에 사용할 버퍼 핸들 - hStdInput : 키보드 입력 버퍼 - hStdOutput, hStdError : 윈도우 화면 출력 버퍼 |
2. STARTUPINFOEX 구조체
- STARTUPINFO 구조체 대신 STARTUPINFOEX 구조체를 사용해도 무방합니다.
파라미터 | 설명 |
StartupInfo | 위 STARTUPINFO 구조체 |
lpAttributeList | 특성 리스트 설정 (아래 둘 중 하나가 들어갈 수 있음) - PROC_THREAD_ATTRIBUTE_HANDLE_LIST : CreateProcess의 인자 중 bInheritHandles 값을 무시하고 자식 프로세스(CreateProcess로 생성될 프로세스)에 상속할 커널 오브젝트 핸들을 설정 - PROC_THREAD_ATTRIBUTE_PARENT_PROCESS : 프로세스 핸들로 파라미터로 지정한 프로세스를 부모 프로세스로 정한 후 프로세스를 생성 |
PROC_THREAD_ATTRIBUTE_HANDLE_LIST
- InitializeProcThreadAttributeList()로 초기화
+ https://msdn.microsoft.com/en-us/library/windows/desktop/ms683481(v=vs.85).aspx
- UpdateProcThreadAttribute()로 내용 채우기
+ https://msdn.microsoft.com/en-us/library/windows/desktop/ms686880(v=vs.85).aspx
- DeleteProcThreadAttribute()로 사용 후 해제하기
+ https://msdn.microsoft.com/en-us/library/windows/desktop/ms682559(v=vs.85).aspx