커널, 드라이버

SCM(services.exe)

디버그정 2008. 7. 28. 01:08
SCM(services.exe) 는 Windows2000 에서 시스템 서비스를 생성하거나 수정할 수 있도록 제공해주는 관리 도구이다.
SCM 은 시스템 부팅시에 시작되며, remote procedure call(RPC) 서버이다. 그래서 service configuration 과 service control program 이 remote machine 에서 서비스를 조작할 수 있는 것이다.

SCM 은 시작될 때 각 서비스에 named pipe 를 생성한다.

* named pipes : local 혹은 remote 프로세스 간의 통신을 위한 방법.
                   pipe 는 두개 혹은 그 이상의 프로세스들이 공유하는 메모리 영역이다.


SCM 이 하는 일

-. 설치된 서비스에 대한 database 를 유지한다.
database 는 registry 에 저장된다.
경로. HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices
설치된 서비스의 이름들이 Subkey 이다.

* database 내용
- service type.

  (자신의 프로세스를 실행하는 서비스인지 다른 서비스의 프로세스를 공유하는지)
- start type.
- error control level.
- 서비스 실행파일의 full path.
- 서비스 실행 순서를 결정하는데 사용되는 dependency 정보
- 서비스 계정명과 password
기타등등..

-. 시스템 시작시나 요청시에 서비스와 Driver 서비스를 시작시킨다.
* 서비스 자동 시작
  시스템 부팅시에 SCM 은 모든 auto-start service 를 실행시킨다.
  load 순서는 아래와 같이 결정된다 :
  HKEY_LOCAL_MACHINESystemCurrentControlSetControl
1. 로드 순서를 매겨놓은 group list, ServiceGroupOrder(subkey) 에서의 그룹 순서

 2. tag order vector, GroupOrderList(subkey) 에 명세된 그룹에서 service 의 순서.
3. 각 service 가 리스트된 데 따라서

     
 성공적으로 부팅되면 시스템은 이 database 의 사본을 저장해놓는데.
 이것을 last-known-good(LKG) 라고 한다.
 database 가 수정된 후 재부팅에 실패하면 다음 재부팅은 LKG 로 하며
 LKG 로도 실패하면 부팅에 실패한다.

* 요청으로 서비스 시작
사용자가 sevice control panel applet 에서 service 를 시작시키거나,
service control 프로그램에서 StartService 함수로 서비스를 시작하는 경우.
서비스가 시작되면 SCM은
1. database 에 저장된 계정 정보를 검색
2. service 계정으로 log on.
3. suspended 상태로 서비스 생성
4. 프로세스에 logon token 을 할당
5. 프로세스를 실행.

-. 설치된 서비스를 리스트한다.
-. 실행중인 서비스에 대한 상태 정보를 유지한다.
-. 실행중인 서비스에 제어 요청을 전달한다.
-. 서비스 database 를 잠그거나 해제한다.

 
Service Record List
SCM 은 설치된 서비스의 database 에서 각 service entry 를 읽어온 후

service record 를 생성하는데 내용은 아래와 같다.
- Service name
- Start type (auto-start or demand-start)
- Service status (SERVICE_STATUS 구조체 참조)
- Type
- Current state
- Acceptable control codes
- Exit code
- Wait hint 
-Pointer to dependency list
계정 user name과 password 는 service 가 설치될 때 명세되며,
SCM 은 registry 에 user name 을, Local Security Authority(LSA)의 안전한 곳에

password 를 저장한다.

SCM Handle
SCM 은 아래와 같은 object 를 접근할 수 있는 handle 을 지원한다.
- 설치된 service 의 database
- service
- database lock