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 이 될때까지 대기 해주면 동기화 할 수 있다.
- 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. 프로세스의 핸들을 얻을 때는 필요한 권한만 요구해야 한다.( 제한된 권한까지 열려고 할땐 에러남 )
- 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
);
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, 0, pid );
// 최소 요구의 원칙 - 필요한 권한만 요구하자.****꼭 필요한것만 요구하자.
HANDLE hProcess = OpenProcess(
PROCESS_TERMINATE | SYNCHRONIZE, // 죽이고 | wait 할수 있는 권한
0,
pid
);
Tag | System