2010.04.27 15:44 System

*이 서비스 프로그래밍 포스팅은 전체적으로 WIndows API 정복의 '서비스' 챕터 부분을 참고하셨음을 알려드립니다




어쩌다 보니 서비스 프로그램을 하나 만들게 되었습니다

서비스 프로그램이란

Linux 의 데몬처럼 Windows background 환경에서 작동하는 프로그램을 말합니다

Windows7 에서는 작업 관리자를 통해서 보거나




서비스 창을 통해서 확인하실수 있죠




먼저 서비스 프로그램을 돌리기 위해서는

자체적으로 돌아가는 서비스 프로그램과 이를 제어하기 위한 제어 프로그램이 필요합니다

서비스 프로그램은 Back Ground 에서 돌아가기 때문에 사용자와 상호 대화할 필요가 없죠

그래서 보통은 Console Application 으로 만들어지고

제어 프로그램은 이를 사용자가 제어하기 위해 만들어졌기 때문에

GUI 를 지니게 됩니다

또한, 서비스 프로그램은 직접 제어 프로그램과 통신하지 않고

SCM [ Service Control Manager ] 를 통해서 하게 됩니다

이때, SCM 과 서비스 프로그램과 통신을 담당하는 것을 ' Dispather ' 라고 하구요

전체적인 통신 방법을 살펴보자면..

1.      SCM은 해당 서비스를 가지고 있는 프로세스의 경로를 레지스트리에서 찾는다. 만약 이 프로세스가 실행중이 아니라면 프로세스를 실행시킨다.

 

2.      서비스 프로세스의 Main 함수에서 디스패처 쓰레드를 생성하며, 이때 Main 은 디스패처에게 자신이 가지고 있는 서비스의 목록과 서비스 메인 함수의 시작 번지 등을 전달해 준다. 디스패처는 프로세스에 속한 서비스의 정보를 가지고 SCM 과 통신을 시작한다.

 

3.      해당 서비스를 시작하기 위해 별도의 쓰레드를 생성하고, 서비스 메인 함수를 호출하여 서비스를 시작한다. 이때, 서비스 메인에서는 서비스를 위한 초기화와 핸들러 등록을 한다.

 

4.      서비스는 실행중에 자신의 상태를 SCM에 보고 한다. 그리고 SCM으로 부터 제어 신호가 들어오면 디스패처가 이를 서비스의 핸들러에게 전달해주며, 핸들러가 이 제어 신호를 처리한다.

 

5.      서비스가 종료되면 디스패처는 실행중인 서비스 카운터를 1 감소시키며, 0이면 디스패처도 종료되고 Main 함수로 리턴된다. 즉, 디스패처는 자신이 생성한 모든 서비스가 종료될  때까지 계속 무한 루프에서 대기하며 모든 서비스가 종료될 때 비로소 리턴한다.



뭐 이런 식입니다

그럼 구체적인 구현 방법을 볼까요?

먼저 서비스 프로그램 부터 봅시다

서비스 프로그램은 크게

Main 함수,  서비스 Main ,  핸들러

정도로 나뉩니다

이를 자세히 살펴보면

1. Main 함수
 

상당히 간단하죠? 

Main 함수는  디스패처 스레드를 실행시키는 일만을 맡고 있습니다


2.  서비스 Main

 

실제 서비스 작업을 하는 서비스의 본체입니다

일단, 10초에 한번씩 실행하도록 코드를 짜두었습니다

저~ 기 중앙에 실행시키고자 하는 code를 집어넣으면 되구요



3. 핸들러



제어 프로그램에서 오는 신호를 처리합니다

여기서는 PAUSE, CONTINUE, STOP 의 처리를 해주었습니다



4. 상태제어 함수



현재 상태를 변경하는 역할을 맡고 있습니다







이번엔 서비스 제어 프로그램을 살퍼보겠습니다

서비스 제어 프로그램의 역할은 크게 2가지로 나눌 수 있습니다

설치/삭제와

제어 부분 입니다

2가지 프로그램으로 만들 수도 있겠습니다만,

괜히 여러프로그램을 만드는건 좀 아니죠

먼저 서비스 제어 프로그램의 전체적인 모습입니다



Install / Uninstall 로 서비스를 설치 / 제거 하고

설치가 되었다면 상태 제어를 할 수 있도록 짰습니다


1.Install 버튼



제어 프로그램과 같은 폴더에서 서비스 프로그램을 검색하고 있다면 설치합니다

여기서 EXENAME 은 설치될 서비스 프로그램의 파일명이구요

저기 에러 처리는 권한이 없을 때 보통 뜨더군요

다른 경우라면  define 을 잘못해준 경우겠죠?



2.Uninstall 버튼


서비스를 제거합니다



3.Start 버튼
 


다른 버튼과는 다소 차이가 있는데 구조가 크게 다르진 않습니다


4. 나머지 버튼


간단하네요  각 버튼에 맞는 MemControl 을 호출합니다


5. MemControl



서비스 프로그램에 각 상태를 전달합니다


6.  QueryService



dwCurrentState 를 이용해 서비스 프로그램의 상태를 가져온다음에 이를 제어 프로그램

버튼 활성화/비활성화에 적용합니다


7. Timer



이는 제가 추가해준 부분이긴 한데, 아시다 시피 서비스 프로그램은 설치만 되면

서비스 제어 프로그램 외에도 관리도구에서도 쉽게 제어 할 수 있습니다

제어 프로그램은 서비스 프로그램으로 일방적으로 메시지를 보내서

서비스 프로그램의 상태를 실시간으로 받아올 수 없다는 단점이 있지요

그래서 이러한 Timer 함수를 만들어 두고 주기적으로 QueryService 를 호출해주면

실시간으로 반영이 된다는 것입니다

OnInitDialog 같은 함수에 Timer 를 셋팅해놓으면 되겠죠



8. OnInitDialog



처음에 Dialog 가 실행이 되면서 설치/비 설치 여부를 판단하고

설치 되었으면 기존의 서비스 프로그램의 설명 부분을 가져옵니다




이렇게 대략적인 서비스 프로그램의 설명은 끝났습니다

실험해본 결과  서비스 설치/ 삭제/ 시작 모두 '관리자 계정' 일 때만 올바르게 작동합니다

일단 관리자 계정으로 설치하고 시작하면 '사용자 계정'은 그 서비스에 터치를 못한다는 거죠

또한 windows 7 의 경우는 관리자 계정에서도 '관리자 권한으로 실행' 으로 해주실 때 올바르게 작동 한다는거~

이점 유의하시길 바랍니다 :D

'System' 카테고리의 다른 글

DLL injection on 64 Bit OS  (2) 2010.08.03
Screen Capture with DLL injection  (2) 2010.07.27
서비스 프로그래밍  (3) 2010.04.27
System Information 을 가져오는 API  (2) 2010.04.21
What is VCP[Virtualized Code Protection]?  (0) 2010.01.29
셸 코드 작성  (0) 2010.01.17
Posted by LinkC

블로그 이미지
LinkC

태그목록

Tistory Cumulus Flash tag cloud by BLUEnLIVE requires Flash Player 9 or better.

공지사항

Yesterday301
Today84
Total298,301

달력

 « |  » 2018.02
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28      

최근에 받은 트랙백

글 보관함


. .