ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2015.01.19 CreateProcess를 이용한 프로세스 생성
    Legacy/뇌자극 - WinSysProg 2015. 1. 19. 21:49
    728x90

    CreateProcess를 이용한 프로세스 생성

    AdderProcess.cpp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #include <stdio.h>
    #include <tchar.h>
    #include <Windows.h>
     
    int _tmain(int argc, TCHAR* argv[])
    {
        DWORD val1, val2;
        val1 = _ttoi(argv[1]);
        val2 = _ttoi(argv[2]);
     
        _tprintf( _T("%d + %d = %d \n"), val1, val2, val1 + val2);
     
        _gettchar();
        return 0;
    }


    CreateProcess.cpp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include <stdio.h>
    #include <tchar.h>
    #include <Windows.h>
     
    #define DIR_LEN MAX_PATH+1
     
    int _tmain(int argc, TCHAR* argv[])
    {
        STARTUPINFO si = {0,};
        PROCESS_INFORMATION pi;
     
        si.cb = sizeof(si);
        si.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE;
        si.dwX = 100;
        si.dwY = 200;
        si.dwXSize = 300;
        si.dwYSize = 200;
        si.lpTitle = _T("I am a boy!");
     
        TCHAR command[] = _T("AdderProcess.exe 10 20");
        TCHAR cDir[DIR_LEN];
        BOOL state;
     
        GetCurrentDirectory(DIR_LEN, cDir);
        _fputts(cDir, stdout);
        _fputts(_T("\n"), stdout);
     
        SetCurrentDirectory(_T("C:\\WinSystem"));
     
        GetCurrentDirectory(DIR_LEN, cDir);
        _fputts(cDir, stdout);
        _fputts(_T("\n"), stdout);
     
        state = CreateProcess (
            NULL,
            command,
            NULL,
            NULL,
            TRUE,
            CREATE_NEW_CONSOLE,
            NULL,
            NULL,
            &si,
            &pi
            );
        
        if(state != 0)
            _fputts(_T("Creation OK! \n"), stdout);
        else
            _fputts(_T("Creation Error! \n"), stdout);
     
        return 0;
    }


    step 1 STARTUPINFO 구조체 변수의 생성 및 초기화

    CreateProcess.cpp의 12행~18행

    step 2 현재 디렉토리의 설정

    DWORD GetCurrentDirectory (

    DWORD nBufferLength,

    LPTSTR lpBuffer

    );

    If the function fails, the return value is zero.

    GetCurrentDirectory 함수를 이용해 현재 디렉토리를 확인할 수 있다.

    일반적으로 프로세스가 생성되면 프로세스의 현재 디렉토리는 프로세스의 실행파일이 존재하는 디렉토리로 설정된다. lpBuffer이 현재 디렉토리 정보가 저장될 버퍼의 포인터이고 nBufferLength는 현재 디렉토리 정보가 저장될 버퍼의 크기이다.

    참고. MAX_PATH라는 상수는 windef.h에 선언되어있음. Windows에서 허용하는 절대경로의 최대 길이가 얼마인지 알려줌.

    프로세스의 현재 디렉토리는 변경할 수 있다. SetCurrentDirectory 함수를 이용해서말이다.

    BOOL SetCurrentDirectory (

    LPCTSTR lpPathName

    );

    If the function fails, the return value is zero.

    인자로 넘겨준 디렉토리가 존재한다면 정상적으로 디렉토리가 바뀐 것을 확인할 수 있을 것이다.

    \(역슬레시 또는 원 표시)는 이스케이프 시켜야 하므로 두번 입력해 줘야 한다는 것을 주의

    step 3 CreateProcess 함수의 호출

    CreateProcess (
            NULL,
            command,
            NULL,
            NULL,
            TRUE,
            CREATE_NEW_CONSOLE,
            NULL,
            NULL,
            &si,
            &pi

            );

    여기서 한 가지 주의해야 할 점은 다음과 같은 형태의 호출은 불가능 하다는 것.

    CreateProcess (
            NULL,
            _T("AdderProcess.exe 10 20"),
            NULL,
            NULL,
            TRUE,
            CREATE_NEW_CONSOLE,
            NULL,
            NULL,
            &si,
            &pi

            );

    CreateProcess 함수는 내부적으로 두 번째 인자로 전달되는 문자열에 변경을 가한다. 함수 호출이 끝날 때 변경된 문자열을 다시 원래 상태로 되돌려 놓기 때문에 변경되는 것을 인식하기 어렵지만, 분명히 CreateProcess 함수는 내부적으로 문자열에 변경을 가한다. 따라서 두번째 인수는 문자열 상수가 아닌 변수 형태여야 가능하다.

    ※ 자세한 내용은 다음을 참조 문자열 변수와 상수의 차이

    CreateProcess 함수의 첫 번째 전달인자를 통해서 실행파일 이름을 전달할 경우, 현재 디렉토리를 기준으로 실행파일을 찾게 되지만, 두 번째 전달인자를 통해서 실행파일 이름을 전달할 경우에는 아래에서 보여주는 표준 검색경로 순서대로 실행파일을 찾게 된다.

    1. 실행 중인 프로세스의 실행파일이 존재하는 디렉토리

    2. 실행 중인 프로세스의 현재 디렉토리(Current Directory)

    3. Windows의 시스템 디렉토리(System Directory)

    4. Windows 디렉토리(Windows Directory)

    5. 환경변수 PATH에 의해 지정되어 있는 디렉토리

    시스템 속성(내 컴퓨터 오른쪽 클릭 후 설정)의 [고급]-[환경변수]에서 확인가능

    이렇게 다양한 경로에서 실행파일을 찾기 때문에 보통은 두 번째 전달인자를 통해서 실행파일 이름을 전달함.

Designed by Tistory.