본문 바로가기

Programming/Windows&C#

[Windows/WinAPI] CreateProcess

728x90
반응형

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 -----⑩ );



함수 설명 :

새로운 프로세스를 생성한다. 실패시 0값을 리턴한다.


① lpApplicationName : 

생성할 프로세스의 실행 파일 이름을 인자로 전달한다. 이때는 문자열을 인자로 입력하여야 한다.


② lpCommandLine :

생성할 프로세스 이름과 해당 프로세스에 인자를 전달 할 때 사용한다. 이를 사용할 때에는 

lpApplicationName에 인자를 NULL로 주어야 한다. 이때 실행 파일의 이름은 표준 검색 경로를 기준으로 찾게 된다. 


③ lpProcessAttributes : 

프로세스 보안 속성을 지정할 때 사용한다. NULL일 경우 디폴트 보안속성이 지정된다.. 


④ lpThreadAttributes : 

쓰래드의 보안 속성을 지정한다. NULL일 경우 디폴트 보안 속성이 지정된다.


⑤ bInheritHandles : 

생성되는 자식 프로세스와 부모 프로세스관의 관계를 나타낸다. 이떄 TRUE를 설정하면 자식프로세스는 부모 프로세스가 소유하는 핸들중 일부를 상속한다.


⑥ dwCreationFlags : 

생성하는 프로세스의 특성(우선순위)를 결정지을 때 사용되는 옵션이다. 필요 없을시 NULL을 지정할 수 있다.

값 

의미 

 DEBUG_PROCESS

 호출 프로세스가 디버거 때 사용합니다.자손 프로세스(디버그 대상)로 디버그 이벤트가 일어나면, parent process(디버거)에 통지됩니다.

 DEBUG_ONLY_THIS_PROCESS

 이 플래그가 지정되지 않는 경우, 한편, 호출측 프로세스가 디버그 되고 있는 경우에는, 새로운 프로세스도 또 호출해 옆프로세스의 디버거에 의한 디버그 대상이 됩니다.

 CREATE_SUSPENDED

 새로운 프로세스의 프라이마리스렛드를 중지 상태로 기동합니다.중지 상태의 스렛드를 실행시키려면 ResumeThread 함수를 사용합니다.

 DETACHED_PROCESS

 새로운 캐릭터 베이스의 프로세스가 parent process의 콘솔 윈도우를 이용할 수 없게 합니다.이 플래그를 CREATE_NEW_CONSOLE 플래그와 함께 지정할 수 없습니다.

 CREATE_NEW_CONSOLE

 새로운 프로세스를 위해서 새로운 콘솔 윈도우를 작성합니다.이 플래그를 DETACHED_PROCESS 플래그와 함께 지정할 수 없습니다.

 CREATE_NEW_PROCESS_GROUPE

 새로운 캐릭터 베이스의 프로세스를 새로운 프로세스 그룹의 루트 프로세스로 합니다.프로세스 그룹에는, 루트 프로세스의 모든 자손 프로세스가 포함됩니다.새로운 프로세스 그룹의 프로세스ID(은)는, ppiProcInfo 파라미터로 나타난다 PROCESS_INFORMATION구조체에 돌려주어지는 프로세스ID(와)과 같게 됩니다.프로세스 그룹은, 콘솔 프로세스의 그룹에 [Ctrl]+[Break] 시그널 송신을 가능하게 하기 위해서GenerateConsoleCtrlEvent 함수에 의해서 사용됩니다


이 플래그가 지정되면, 새로운 프로세스 그룹의 모든 그룹에 대한다 [Ctrl]+[C] 시그널이 무효가 됩니다.

 CREATE_UNICODE_ENVIRONMENT

 pvEnvironment 파라미터가 가리키는 환경 블록이 Unicode (을)를 사용하고 있는 것을 나타냅니다.

 CREATE_SEPARATE_WOW_VDM

 이 플래그는16비트Windows베이스의 어플리케이션을 실행시키는 경우만 유효합니다.새로운 프로세스를 별개의 가상DOS머신(VDM) 중(안)에서 실행시킵니다.이 플래그를 지정하지 않고 개시된다16비트Windows베이스의 어플리케이션은 모두, 단일의 공유VDM중(안)에서 스렛드로서 실행됩니다.

 CREATE_SHARED_WOW_VDM

 이 플래그는16비트Windows베이스의 어플리케이션을 실행시키는 경우만 유효합니다. WIN.INI 의 Windows 섹션(레지스트리의 HKEY_LOCAL_MACHINE\ System\CurrentConsoleSet\Control\WOW 키)에 있다 DefaultSeparateVDM 스윗치가 TRUE (으)로 설정되어 있는 경우에서도, 새로운 프로세스를 공유VDM위에서 실행시키도록(듯이) 합니다.

 CREATE_FORCEDOS

 16비트 OS/2 어플리케이션에 파묻혔다MS-DOS어플리케이션을 강제적으로 실행시킵니다.

 CREATE_BREAKAWAY_FROM_JOB

 어느 작업에 속하고 있는 프로세스로부터 기동되는 child process이 그 작업에 속하지 않게 합니다.호출측 프로세스를 작업에 관련지을 수 있지 않은 경우는, 이 플래그는 효과를 가지지 않습니다.호출측 프로세스를 작업에 관련지을 수 있고 있는 경우는 작업에 JOB_OBJECT_LIMIT_BREAKAWAY_OK 제한이 설정되어 있을 필요가 있습니다.

 CREATE_DEFAULT_ERROR_MODE

 새로운 프로세스에, 호출측 프로세스의 에러 모드를 계승시키지 않습니다.새로운 프로세스에는, 디폴트의 에러 모드를 적용합니다.

 CREATE_NO_WINDOW

 이 플래그는16비트Windows베이스의 어플리케이션을 실행시키는 경우만 유효합니다.콘솔 프로그램을 콘솔 윈도우 없이 실행시킵니다.


프로세스의 우선도를 설정한다. 


피 

우선도 

 NORMAL_PRIORITY_CLASS

 통상

 IDLE_PRIORITY_CLASS

 아이돌

 HIGH_PRIORITY_CLASS

 우선

 REALTIME_PRIORITY_CLASS

 리얼타임

 BELOW_NORMAL_PRIORITY_CLASS

 통상 이하

 ABOVE_NORMAL_PRIORITY_CLASS

 통상 이상 


⑦ lpEnvironment : 

프로세스 마다 Environment Block(환경 블록)이라는 메모리 블록을 관리한다. 이 블록을 통해서 프로세스가 실행에 필요로 하는 문자열을 저장할 수 있다. NULL이 지정되면, 자식 프로세는 부모 프로세스의 환경 블록에 저장되어 있는 문자열을 복사한다.


dwCreationFlags 인자에 CREATE_UNICODE_ENVIRONMENT 플래그가 포함되어 있으면 유니코드 문자열을 저장하고, 아니면 아스키 코드를 저장한다.


⑧ lpCurrentDirectory : 

생성하는 프로세스의 현재 디렉토리를 설정하는 인자이다. 전달 인자는 절대 경로로 전달 되어야하며, NULL이 전달될 경우 부모 프로세스의 현재 디렉토리가 새로 생성하는 자식 프로세스의 현재 디렉토리가 된다. 보통은 NULL 사용

⑨ lpStartupInfo :

STARTUPINFO 구조체 변수를 초기화 한 다음에 이 번수의 포인터를 인자로 전달한다. STARTUPINFO 의 구조체는 다음과 같다.


typedef struct _STARTUPINFO { DWORD  cb; ------- 구조체 변수의 크기 LPTSTR lpReserved; LPTSTR lpDesktop; LPTSTR lpTitle; ------- 콘솔 윈도우의 타이틀 바 제목 DWORD  dwX; ------- 프로세스 윈도우의 x 좌표 DWORD  dwY; ------- 프로세스 윈도우의 y 좌표 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;

형태이다.


⑩ lpProcessInformation :

생성하는 프로세스의 정보를 얻기 위해 사용되는 인자이다. PROCESS_INFORMATION 구조체 변수의 주소값을 인자로 전달한다. 그러면 변수에 프로세스 정보가 체워진다. PROCESS_INFORMATION 구조체의 형태는 다음과 같다.


typedef struct _PROCESS_INFORMATION { HANDLE hProcess; ------ 프로세스 핸들 HANDLE hThread; ------ 쓰래드 핸들 DWORD  dwProcessId; ------ 프로세스 ID DWORD  dwThreadId; ------ 쓰래드 ID } PROCESS_INFORMATION, *LPPROCESS_INFORMATION;




반응형