Windows_/Windows32_API

Windows :: CreateProcess, STARTUPINFO

sosal 2014. 7. 24. 00:51
반응형

/*

 * http://sosal.kr/

 * made by so_Sal

 */




윈도우는 다중 태스킹 운영체제입니다.
한 시점에서 여러 개의 프로그램들이 실행되는데,
각 실행중인 프로그램은 하나의 프로세스가 되고,
하나의 프로그램이 여러개의 프로세스를 생성할 수 있습니다.

따라서 여러 사용자들이 하나의 프로그램을 실행시켜 프로세스를
생성할 수 있고, 하나의 프로세스가 또다른 프로세스를 생성할 수 있습니다.
시스템 자체도 시스템 자원을 관리하고 사용자 접근을 제어하기 위해
여러 개의 프로그램들을 실행 합니다.

프로세스 :: 시스템 자원들을 포함하는 하나의 주소공간

프로세스는 프로그램 코드, 자료, 변수들, 열린 파일들,
그리고 환경으로 구성됩니다.
하드 메모리에 저장되어 있는 프로그램을 시스템 메모리에 끌어와
하드메모리에 존재하는 하나의 복사본만 존재할 수 있도록
프로그램 코드와 시스템 라이브러리들을 여러 프로세스들이 공유하게 합니다.
더 자세한 내용은 이전에 쓴 '04. Windows 프로세스' 글을 참조하시고
여기서는 프로세스 생성 함수에 대해서 설명하겠습니다.
(프로세스가 새로운 프로세스를 실행시키는것)


프로세스의 생성

하나의 프로세스가 새로운 프로세스를 만든다면,(CreateProcess)
원래의 프로세스는 부모 프로세스라고 하고,
새로 만들어진 프로세스는 자식 프로세스라고 합니다.

그렇다면, 이것은 바탕화면에서 프로그램을 더블클릭하여
생성한 프로세스와 다른것인가?
아닙니다. 바탕화면을 보여주는것도 프로세스입니다.
바탕화면 관리자에서 보여지는 프로그램을 실행시킨다면 (더블클릭)
바탕화면 관리자는 부모프로세스, 실행된 프로세스는 자식 프로세스가 됩니다.
ㅇㅋ?



** :: CreateProcess :: **
MSDN :: http://msdn.microsoft.com/en-us/library/ms682425(VS.85).aspx ::
BOOL CreateProcess(
    LPCTSTR lpApplicationName,
             //생성될 프로세스의 이름 (NULL을 넣고 IpCommandLine로 전달 가능)
     LPTSTR lpCommandLine,
        
   //argc. argv[] 인자로 전달할 문자 매개변수. 표준 검색 경로를 기준으로 찾는다.
     LPSECURITY_ATTRIBUTES lpProcessAttributes, //보안 속성을 지정하는 인자. 보통 NULL
     LPSECURITY_ATTRIBUTES lpThreadAttributes,
                           //쓰레드의 보안 속성 지정. NULL 입력시 기본 보안 속성지정
     BOOL bInheritHandles, // TRUE ::부모 프로세스가 소유하는 상속 가능한 핸들을 상속한다.
     DWORD dwCreationFlags, // 프로세스의 특성을 결정짓는 옵션. 사용 안할경우 0 입력
     LPVOID lpEnvironment, //환경변수 지정. NULL 전달시 부모는 자식에게 환경변수 복사
     LPCTSTR lpCurrentDirectory, //생성하는 프로세스의 현재 디렉터리 NULL시 자식위치 = 부모위치
     LPSTARTUPINFO lpStartupInfo, //STARTUPINFO 구조체 변수 초기화후 변수의 포인터를
               //매개변수 로 전달. STARTUPINFO 구조체 변수들은 프로세스의 속성 정보를 전달한다.
     LPPROCESS_INFORMATION lpProcessInformation
           
//생성하는 프로세스의 정보를 얻기 위한 매개변수.
               //PROCESS_INFORMATION 구조체 변수의 주소값을 받음
);

9번째 인자 LPSTARTUPINFO 에 정보를 저장하여
CreateProcess를 통하여 프로세스를 생성합니다.
그럼 프로세스의 정보를 다시 가져올때는?
LPPROCESS_INFORMATION을 통해 가져오게 됩니다.

아.. 그런데 위에 CreateProcess 함수 하나에 매개변수가 10개고..
미친듯이 외워야 할거같고,.. 답답..합니다.
저거 다 외워서 쓰는사람... 아무도 없습니다.
공부할때 한번쯤 훑어주고..
중요하게 굵게 써놓은거 정도만 자세히 봐주고...
넘어갑시다!!!!
아주 많이 사용되는 함수도 아닐 뿐더러
책을 보던가 인터넷 조금만 뒤져봐도
상당히 자세히 나와있고, 예제도 널려있으니
그거 보고 프로그래밍 하시면 됩니다!

위 함수를 실행하면 새로운 프로세스가 생성되는데..
프로그램이 부모 프로세스가 되고, 프로그램 안에서 함수에 의해 새로 생성된 프로세스는
자식 프로세스라고 말합니다.

CreateProcess의 첫번째로 전달되는 인자를 통해서 실행파일의 이름이 전달하는 경우에는
현재 디렉터리를 기준으로 실행파일을 찾게 된다.
하지만 두번째 인자로 (첫번째에 NULL을 넣고) 전달되는 경우에는
표준 검색경로 순서대로 실행파일을 찾는다.

1.프로세스의 실행파일이 존재하는 풀더
2.실행중인 프로세스의 현재 풀더
3.windows의 시스템 풀더(system Directory)
4.windows풀더 (windows directory)
5.환경변수 PATH


함수 매개변수의 9번째 매개변수를 보면 STARTUPINFO 라는 구조체가 있다고 나오는데,
그 구조체에 대해서 살펴봅시답!
이것은 새롭게 생성할 프로세스에 정보를 입력하기 위한 구조체입니다.

LPSTARTUPINFO의 구조이다.
MSDN :: http://msdn.microsoft.com/en-us/library/ms686331(VS.85).aspx ::

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;           // 이 글에서는 CreateProcess에 대해서
  HANDLE hStdOutput;         // 적당히 살펴보는 취지라..
  HANDLE hStdError;           // 핸들에 대한 내용은 넘기겠습니다.
} STARTUPINFO, *LPSTARTUPINFO;

첫번째 인자 DWORD cb가 중요한 이유는
CreateProcess 함수에서 9번째에 들어갈 프로세스 정보 구조체에 들어가는 구조체가
혹시나 다음에 바뀔 수도 있고, 다양한 구조체가 들어갈 수 있게 하기 위해서 둔것인데,
즉 정보를 전달하는 구조체가 무엇인지 구분짓겠다는 의도라고 생각하시면 되겠네요.

아래는 위 함수를 사용한 간단한 예제소스 링크입니다.
LINK_