윈도우의 프로세스와 스레드 (12)
윈도우의 프로세스와 스레드 (12)
프로세스 생성
윈도우는 다양한 종류의 프로세스가 존재합니다.
여기서 Win32 API에 한정한다면 16비트 코드를 해석할수있는 WOW VDM 내에 프로세스를 한정시킬 것인지,
WOW VDM 도 공유 VDM에 쓸것인지 전용 VDM을 쓸것인지 고려해야하는 문제가 벌어집니다.
하나의 프로세스에서 다른 프로세스를 형성할때 해당 프로세스가 혹시 Win16코드를 갖고있지 않은지 한번쯤 살펴볼 필요가있습니다.
프로세스를 생성하는것은 크게 네가지 중요 정보를 제공해줍니다.
생성 플래그는 몇가지 방법론을 제공하며, 이플래그를 어떻게 조작하느냐에 따라 16비트 VDM 혹은 디버그 이벤트받음 여부등을
설정할수있습니다.
또한 생성된 플래그는 몇가지 방법론을 제공하며, 이 플래그를 어떻게 조작하느냐에 따라
16비트 VDM 혹은 디버그 이벤트 받음 여부등을 설정할수있습니다.
또한 생성된 프로세스의 주스레드를 대기모드로 생성할수도있습니다.
윈도우에서 프로세스가 새 프로세스를 생성할때는 기존 프로세스의 속성을 계승할수있도록 설정하기도하고,
계승하지 않도록 설정하기도 합니다.
프로세스 종료 및 정보 얻기
유닉스에서는 전통적으로 kill 명령어를 사용하여 프로세스를 강제로 종료하였습니다.
윈도우 시스템에는 작업관리자가 존재하지만 작업관리자는 반드시 GUI 로 실행해주어야 된다는 단점이 존재합니다.
그런데 윈도우에서 프로세스를 종료하는것은 어려운일이아닙니다.
프로세스 역시 커널 객체이므로, 이제 커널 객체에 익숙해졌다면 생성된 프로세스 ID 로 프로세스 핸들을 받아와서 해당 핸들을 가진 프로세스를 종료하면된다는
등식이 머리속에 도식적으로 나타날것입니다.
그런데 윈도우 프로세스는 일반객체가 아니라 보안성까지 체크되는 보안객체 입니다.
이러한 까닭에 단순히 프로세스 번호로 해당 프로세스를 종료시키는것이 아니라 해당 프로세스 ACL 혹은 시스템 프로세스 여부등을 파악하여
최종적으로 종료시킬수있는지 판단합니다.
사용자가 충분히 권한있으며 해당 프로세스를 종료시킬수있다면 핸들을 이용해 완전히 종료시킬수있습니다.
프로세스를 중단하기 위해 가끔 프로세스가 자살할필요가있을때가 있습니다.
윈도우에서 명시적으로 프로세스를 종료하라는말이없을경우 스스로 종료할수있습니다.
사용중인 DLL 에 대한 참조값을 제거하고 발생시킨 모든 스레드 참조값역시 제거합니다.
그리고 스스로 죽겠다는 메세지를 객체 관리자에게 송신합니다.
그러나 객체 관리자가 죽여주기 전까지는 실제로 프로세스 객체가 사라지는것은 아닙니다.
Reference
- https://karfn84.tistory.com/entry/%ED%8E%8C%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%9C%88%EB%8F%84%EC%9A%B0%EC%9D%98-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C