10.5(금) 이론-CreateProcess

from Study/System 2007/10/13 20:17 view 23158
1. CreateProcess ~ ko상태

사용자 삽입 이미지
 
  - A.exe에서 CreateProcess로 계산기를 생성함.
    1) &si로 STRARTUPINFO정보를 넘기고 &pi 로 PROCESS_INFORMATION를 얻어온다.
    2) pi에는 &pko(0x8100,000) 와 &tko(0x8200,0000) 를 얻어 올수 있다.(id도 얻어옴)
    3) 생성된 계산기의 참조계수는 부모와 자신이 참조하게 되므로 2가 된다.
    4) 이 때 calc.exe를 닫는다면 참조계수는 1이 되면서 메모리 Leak이 발생한다.
    5) 관리하는 구조체가 남아있는 상태가 되는 것이다.(좀비상태) CloseHandle을 사용하여 죽여야 한다.
    6) 그래서 프로세스의 생성에 성공했다면 참조계수를 꼭 1로 만들어 줘야 한다.(메모리 Leak방지)

  - 다른 프로세스의 종료코드 확인 ; GetExitCodeProcess()
  - PKO 내부에 ExitStatus 에서 이값을 저장하고 있다.
    1) Main_CRT_STARTUP -> 어떤한것 -> main -> return 하면 ExitStatus에 저장.
    2) STILL_ACTIVE (0x103) : 계산기가 살아있다면 가지고 있는값이다!!!

  - 프로세스 강제 종료 : TerminateProcess()
    1) 비동기 함수. 바로 종료되었는지를 확신 하지 못한다.
    2) Process 는 KO의 signal에 상태를 저장하고 있는데 non-signal은 살아있다. signal은 죽었을때 발생.
    3) WaitForSingleObject 로 KO가 signal 이 될때까지 대기 해주면 동기화 할 수 있다.




2. HWND VS ID

  - GetWindowProcessThreadId로 hwnd로 부터 pid를 얻어 낼 수 있다.
  - hwnd로는 대상윈도우에 접근 할려고 한다면 이는 상대적이므로 에러가 발생한다.
  - 하지만 pid는 시스템 전체에서 유니크하기 때문에 접근이 가능하다.
  - pid로 대상윈도우의 HANDLE을 얻기 위해선 OpenProcess를 사용하여 PKO->ObjectTable에 등록해준다.
  - 윈도우의 핸들 => 프로세스ID => 프로세스핸들 얻어서 제어 일종의 공식??

3. 프로세스의 핸들을 얻을 때는 필요한 권한만 요구해야 한다.( 제한된 권한까지 열려고 할땐 에러남 )
  // ALL은 너무 많은 권한
  HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, 0, pid );
  // 최소 요구의 원칙 - 필요한 권한만 요구하자.****꼭 필요한것만 요구하자.
            HANDLE hProcess = OpenProcess(
                PROCESS_TERMINATE | SYNCHRONIZE,    // 죽이고 | wait 할수 있는 권한
                0,
                pid
                );

Tag |

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다