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도 채워줌
'Windows > Windows Programming' 카테고리의 다른 글
파일/디렉토리 접근 권한 (FILE_READ_DATA, FILE_WRITE_DATA ......) (0) | 2016.02.27 |
---|---|
프로세스의 생성 2 - CreateProcess() (2) | 2016.02.13 |
프로세스간 커널 오브젝트 공유 (0) | 2016.01.02 |
윈도우 핸들 (Windows Handle Object) (0) | 2015.12.31 |
에러 핸들링 (0) | 2015.09.28 |