Windows/Windows Programming

프로세스의 생성 2 - CreateProcess()

MOLOKINI 2016. 2. 13. 13:00

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