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
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
'커널, 드라이버' 카테고리의 다른 글
디바이스 드라이버에서 3가지 버퍼 전달 방식 (0) | 2009.11.01 |
---|---|
운영체제의 메모리 관리 (1) | 2009.10.31 |
프로그래밍단에서 커널단 접근 및 프로세스 숨김 (0) | 2009.06.24 |
여러가지 훜 기법들과 탐지법들.... (2) | 2008.09.03 |
장치 드라이버 기초와 프로그래밍 Study (1) | 2008.08.01 |
Windows Kernel(윈도우즈 커널) (0) | 2008.07.26 |