CreateProcess()프로세스를 생성하는 함수입니다.

msdn을 참고해보면......

https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx



CreateProcess 함수가 호출되면 프로세스 커널 오브젝트를 생성하고 실행 파일의 코드와 구동에 필요한 DLL들을 프로세스 주소 공간으로 로드합니다. 그 후 스레드 커널 오브젝트를 생성해 Main 함수를 실행시키면서 TRUE를 리턴하게 됩니다. 


이번 포스팅에서는 CreateProcess 함수의 파라미터들에 대해서 알아보도록 하겠습니다.

- 9번째 파라미터인 lpStartupInfo는 다음 포스팅에서 따로 언급하도록 하겠습니다. (양이 많아요~)

- lpStartupInfo : http://wonjayk.tistory.com/278


1. LPCTSTR lpApplicationName

- 프로세스를 생성할 실행 파일의 이름

- 대부분 NULL로 넘겨줌

- 만약 지정해주려면 확장자를 반드시 포함해야함

- 실행할 파일의 드라이브 명을 포함한 FullPath를 전달

 + 파일명만 전달해 주더라도 윈도우가 찾아서 실행함 (CreateProcess가 호출된 현재 경로 -> 윈도우 시스템 디렉토리 -> 윈도우 디렉토리 -> 환경변수에 포함된 디렉토리)


2, LPTSTR lpCommandLine

- 프로세스에게 전달할 CommandLine

- 읽기 전용으로 전달하면 안됨, CreateProcess가 동작하면서 CommandLine을 읽고 쓰기 작업을 수행하기 때문 (따로 변수선언을 해 참조하도록 해야함)


3. LPSECURITY_ATTRIBUTES lpProcessAttributes, lpThreadAttributes

- 프로세스와 프로세스가 가지게 될 스레드의 보안 디스크립터 설정

- 기본 보안 디스크립터를 사용하려면 NULL로 세팅

- 따로 보안 디스크립터를 설정하고 싶다면 SECURITY_ATTRIBUTES 구조체를 따로 할당하고 내용을 설정한 후에 파라미터로 넣어주면 됨 (보안 디스크립터에 대한 내용은 생략)


4. BOOL bInheritHandles

- 자식 프로세스가 생성될 때 보안 디스크립터 설정들을 상속시켜 줄 것인지 여부 (TRUE면 상속가능)




5. DWORD dwCreationFlags

- 프로세스를 어떤 목적으로 생성할지 결정하는 플래그 (OR로 다수 선택 가능)

 FLAG

설명 

 CREATE_BREAKAWAY_FROM_JOB

잡에서 실행되는 프로세스가 현재의 잡과 연결되지 않는 프로세스를 생성하고 싶을 때 사용 

 CREATE_DEFAULT_ERRORMODE

부모 프로세스가 사용하는 에러모드를 상속받지 않음

 CREATE_NEW_CONSOLE 

새로운 콘솔 윈도우 생성

- DETACHED_PROCESS 플래그를 같이 사용하면 에러 발생 

 CREATE_NEW_PROCESS_GROUP 

새로운 프로세스 그룹 생성

프로세스 그룹 내에서 실행 중인 프로세스가 있을 때 Ctrl+C or Ctrl+Break를 누르면 해당 그룹 내의 프로세스들이 모두 정지됨

 CREATE_NO_WINDOW

콘솔 윈도우를 생성하지 않음 (인터페이스가 필요 없는 프로세스) 

 CREATE_PROTECTED_PROCESS

보호모드로 프로세스를 생성, 함부로 종료되면 안되는 프로세스들이 해당

+ Windows Error Reporting, Audio Engine 등 

 CREATE_SEPARATE_WOW_VDM

16비트 윈도우 애플리케이션을 실행하고 싶을 때 사용

+ Virtual Dos Machine을 생성하고 그 안에서 애플리케이션 실행

+ 이 플래그가 세팅되어 있으면 CreateProcess로 호출된 프로세스에서 VDM을 새로 생성해 사용하게 됨 (VDM을 공유하지 않음)

+ 독립적인 VDM에서 실행되기 때문에 중간에 종료되더라도 연관된 애플리케이션이 동시에 종료되는 경우가 없음

 CREATE_SHARED_WOW_VDM

CREATE_SEPARATE_WOW_VDM과 마찬가지로 16비트 윈도우 애플리케이션을 실행하고 싶을 때 사용

+ 역시 VDM을 사용해 애플리케이션을 실행하지만 CREATE_SHARED_WOW_VDM 플래그를 달고 있다면 해당 플래그를 달고 있는 프로세스들은 모두 같은 VDM에서 실행되게 됨

 CREATE_SUSPENDED

프로세스가 중지 상태로 생성

+ 중지 상태로 생성되기 때문에 스레드 우선순위를 변경하거나, 주소 공간 내 메모리를 변경하거나(INJECTION) 프로세스를 잡에 추가하는 등의 코드를 수행할 수 있음 

 CREATE_UNICODE_ENVIRONMENT

자식 프로세스의 환경 블록 내 유니코드 문자열이 사용 가능하도록 함

+ 기본으로는 ANSI 문자열이 사용

 DEBUG_ONLY_THIS_PROCESS

부모 프로세스가 직접 생성한 자식 프로세스에 대해서만 디버깅을 함

+ 자식 프로세스의 자식 프로세스 이벤트는 받지 못함

 DEBUG_PROCESS

부모 프로세스가 자식 프로세스와 자식이 생성하는 모든 프로세스를 디버깅

자식 프로세스들에게서 이벤트가 발생하면 부모 프로세스로 통보

 DETACHED_PROCESS

CUI 인터페이스에서 자식 프로세스가 부모 프로세스의 콘솔 윈도우로 접근하는 것을 막음 

 EXTENDED_STARTUPINFO_PRESENT

lpStartupInfo 파라미터를 통해 STARTUPINFO 를 사용할 것임을 표시

 INHERIT_PARENT_AFFINITY

부모 프로세스의 Affinity를 상속받음 


6. LPVOID lpEnvironment

- 생성될 프로세스가 사용할 환경변수의 포인터

- NULL을 지정하면 부모 프로세스의 환경블록을 상속받음

- PVOID GetEnvironmentStrings(); 함수를 호출하면 현재 프로세스가 사용하는 환경블록의 주소를 리턴해주는데 이 함수를 활용해도 괜찮 (사용 후에는 BOOL FreeEnvironmentStrings(LPTSTR pszEnvironmentBlock) 을 호출해 해제)


7. LPCTSTR lpCurrentDirectory

- 부모 프로세스가 자식 프로세스의 현재 드라이브와 디렉터리를 설정할 수 있게 함

- NULL이면 현재 프로세스가 실행중인 디렉터리로 설정


8. LPSTARTUPINFO lpStartupInfo

- 차후 포스팅


9. LPPROCESS_INFORMATION lpProcessInformation (OUT Param)

- 프로세스가 초기화되기 전에 이 구조체에 정보를 넣는다


- CreateProcess 동작이 완료되고 TRUE를 리턴하기 직전에 PROCESS_INFORMATION 구조체를 채움

- hProcess와 hThread 멤버에 커널 오브젝트 핸들 값들을 각각 넣음

- 마찬가지로 ProcessID, ThreadID도 채워줌


Posted by 긍정왕오킹