본문 바로가기

Research/Windows

CreateProcess








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