본문 바로가기

Windows/_System Programming

CreateProcess 함수

CreateProcess

Process A                     ------->             Process B
(부모 프로세스)           CreateProcess        (자식 프로세스)

BOOL CreateProcess(
    LPCTSTR lpApplicationName,    // 생성될 프로세스의 이름
    LPTSTR lpCommandLine,         // 생성될 프로세스에 인자 전달(변수만 가능)
    LPSECURITY_ATTRIBUTES lpProcessAttributes, // 프로세스의 보안 속성 지정
    LPSECURITY_ATTRIBUTES lpThreadAttributes,   // 쓰레드의 보안 속성 지정
    BOOL bInheritHandles,                   // TRUE : 부모 프로세스가 소유하는 상속 가능한 핸들을 상속한다.
    DWORD dwCreationFlags,              // 생성하는 프로세스의 특성을 결정짓는 옵션(우선순위)
    LPVOID lpEnvironment,                  // 생성하는 프로세스의 Environment Block 지정
                                                           NULL : 부모 프로세스의 환경 블록 복사
    LPCTSTR lpCurrentDirectory,          // 생성하는 프로세스의 현재 디렉터리 설정
                                                            NULL : 부모 프로세스의 현재 디렉터리
    LPSTARTUPINFO lpStartupInfo,       // STARTUPINFO 구조체 변수 초기화한 후
                                                           변수의 포인터를 인자로 전달
    LPPROCESS_INFORMATION lpProcessInformation
                                                      //생성하는 프로세스의 정보를 얻기 위한 인자
                                                      //PROCESS_INFORMATION 구조체 변수의 주소값을 인자로 전달
);

첫번째 인자에 실행파일을 전달할 경우 현재 디렉터리를 기준으로 실행파일을 검색한다.
두번째 인자에 실행파일을 전달할 경우 표준 검색경로 순서대로 실행파일을 검색한다.



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;



현재 디텍터리(Current Directory) 설정

현재 디렉터리 확인 :

DWORD GetCurrentDirectory(
       DWORD nBufferLength,      // 현재 디렉터리 정보가 저장될 메모리 버퍼의 크기(문자열 길이정보)
       LPTSTR lpBuffer               // 현재 디텍터리 정보가 저장될 메모리 버퍼의 포인터
};


현재 디렉터리 변경 :

BOOL SetCurrentDirectory(
      LPCTSTR lpPathName      // 디렉터리 경로
};



표준 검색경로(실행 파일 이름(경로없이)만 전달할 경우 다음의 순서대로 실행파일을 찾는다)

1. 실행 중인 프로세스의 실행파일이 존재하는 디렉터리
2. 실행 중인 프로세스의 현재 디렉터리(Current Directory)
3. Windows 시스템 디렉터리(System Directory)
4. Windows 디렉터리(Windows Directory)
5. 환경변수 PATH에 지정되어 있는 디렉터리


(추가 :

WinExec() 함수

CreateProcess 의 많은 옵션을 따로 지정할 필요가 없다면

WinExec() 함수로 간단하게 프로세스를 생성할 수 있다.

WinExec(__in LPCSTR lpCmdLine, __in UINT uCmdShow)

예)

WinExec("C:\Windows\System32\winmine.exe", SW_SHOW);