BOOL WINAPI CreateProcess( _In_opt_ LPCTSTR lpApplicationName, _Inout_opt_ LPTSTR lpCommandLine, _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ BOOL bInheritHandles, _In_ DWORD dwCreationFlags, _In_opt_ LPVOID lpEnvironment, _In_opt_ LPCTSTR lpCurrentDirectory, _In_ LPSTARTUPINFO lpStartupInfo, _Out_ LPPROCESS_INFORMATION lpProcessInformation );
특징
- 함수 호출 결과는 BOOL 형태로, 핸들 값을 돌려주지 않는다.
- 프로세스 핸들과 스레드 핸들, 이 두 개의 개별 핸들을 구조체에 저장해서 돌려 준다.
- 두 핸들 모두 닫아주는 습관이 필요하다. 스레드 핸들을 닫는다고 스레드가 종료되는 것이 아니다.
인자
- lpApplicationName / lpCommandLine
- lpsaProcess / lpsaThread
프로세스와 스레드에 대한 Long Pointer 타입의 Security Attribute 구조체
보통 NULL 을 입력한다 (책에서 다루면 그 때 다시 기술)
- bInheritHandles
-dwCreateFlags
NORMAL_PRIORITY_CLASS :: 그냥 아무것도 지정 안하는 경우.
CREATE_SUSPENDED :: 유보 상태로 두고, ResumeThread 호출 시에 실행 시작.
DETACHED_PROCESS :: 프로세스를 콘솔 없이 생성
CREATE_NEW_CONSOLE :: 프로세스가 자신의 콘솔을 갖게 함. DETACHED_PROCESS 와 배타적인 관계.
CREATE_NEW_PROCESS ::
플래그 3가지를 결합해서 지정 가능.
- lpEnvironment
새 프로세스의 환경 블록. 블럭에는 환경변수 / 값 / 문자열이 있다.
NULL 로 하면 프로세스는 부모의 환경 사용.
- lpCurDir
새 프로세스 드라이브 및 디렉터리 지정.
NULL 일 시 부모의 작업 디렉터리 사용
- lpStartupInfo *
윈도우 모양 및 표준 장치 핸들 지정.
GetStartupInfo 로 얻은 정보를 사용하거나, 아니면 미리 0으로 채워둔 STARTUPINFO 구조체를 사용한다. 아니면 직접 설정하던지.
- lpProcInfo **
프로세스와 스레드 핸들, 식별자를 담을 PROCESS_INFORMATION 구조체를 가리킨다.
* STARTUPINFO 구조체
typedef struct _STARTUPINFO { DWORD cb; LPTSTR lpReserved; LPTSTR lpDesktop; LPTSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindow; WORD cbReserved2; LPBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFO, *LPSTARTUPINFO;
** PROCESS_INFORMATION
typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; } PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
리턴
- 프로세스와 스레드가 성공적으로 생성되었을 때 TRUE 반환
PROCESS_INFORMATION 에 핸들과 ID 까지가 있는 이유는 ?
ID는 프로세스, 스레드 객체 수명 전체 뿐 아니라 모든 프로세스에 대해 고유하다.
그러나 하나의 스레드는 여러 핸들을 가질 수 있으며, 각 핸들마다 보안 접근 특성 등이 다를 수 있다.
그래서 어떤 함수들은 ID를 요구하기도 하고, 또 다른 함수들은 핸들을 요구하기도 한다.
'Research > Windows' 카테고리의 다른 글
NTSTATUS (1) | 2014.08.12 |
---|---|
CrtlsalidHeapPointer, pUserData 에러 (0) | 2014.07.09 |
C++ / Mysql Connector (0) | 2013.10.18 |
[ 책 정리 ] Thread - 1 (0) | 2013.09.12 |
GetProcessHandleCount (0) | 2013.07.31 |