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

Posted by 긍정왕오킹