Usage Count 란?

 자식 프로세스의 종료코드는 커널 오브젝트에 저장된다.
 만약 자식 프로세스가 종료될 시 커널 오브젝트도 동시에 소멸되면
 부모 프로세스는 종료코드를 얻을 수 없게 된다.

 커널 오브젝트를 참조하는 대상이 하나도 없을 때 소멸하는 것이 가장 인상적이며
 이것이 윈도우스가 오브젝트 소멸시기를 결정하는 방식이다.

 즉 커널 오브젝트를 참조하는 프로세스가 하나라도 존재할 시
 커널 오브젝트는 소멸되지 않는다.
 윈도우 운영체제는 이것을 위해 Usage count(참조횟수) 를 관리하며,
 이것이 0이 될 시 커널 오브젝트를 소멸한다.
 또한 커널 오브젝트에 접근 가능한 핸들 개수가 증가 될때 마다 늘어난다.
 
 그러므로 부모 프로세스가 CreateProcess 함수 호출 과정에
 자식 프로세스의 핸들을 얻기 때문에 ( PROCESS_INFORMATION )
 자식 프로세스 생성이 완료되면 Usage Count 는 2가 된다.
 
 자식 프로세스는 GetCurrentProcess 함수를 통해
 언제든지 자신의 커널 오브젝트 참조를 위한 핸들을 얻을 수 있다.
 UsageCount 는 커널 오브젝트의 멤버로 존재한다.

 즉 CloseHandle() 함수는 핸들을 반환하면서 커널 오브젝트의 UsageCount를 하나 감소 시키는
 기능을 가지고 있으며, 또한 프로세스 및 쓰레드도 프로세스가 종료되는 시점에
 Usage Count가 하나 감소한다.

 BOOL WINAPI GetExitCodeProcess( //종료코드를 얻는다.
  __in          HANDLE hProcess,
  __out         LPDWORD lpExitCode
 );

 
 // TerminateProcess() //악성코드 제거를 위해서만 사용할 것.
 //입출력도중 사용시 굉장한 오류가 발생!! 사용자제할 것.

 BOOL WINAPI TerminateProcess(
  __in          HANDLE hProcess,
  __in          UINT uExitCode
 );

+ Recent posts