본문 바로가기
Programming/Win_API

Windows API - 서비스 제어

by bbolmin 2014. 1. 21.



시스템 시작시 실행해야 될 서비스 목록을 레지스트리에 기록 (서비스 데이터베이스)

-> HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service\



1) OpenSCManager

2) OpenService or CreateService

3) StartService or ControlService or DeleteService




[참고] : http://blog.naver.com/superchangho/70083473739





[ 서비스 생성, 실행, 삭제 ]



SC_HANDLE WINAPI OpenSCManager(

_In_opt_  LPCTSTR lpMachineName,     // 접속할 컴퓨터 (NULL)

_In_opt_  LPCTSTR lpDatabaseName,    // 서비스DB 이름 (NULL) _In_      DWORD dwDesiredAccess     // 액세스 권한 (SC_MANAGER_ALL_ACCESS) );



- 지정한 컴퓨터 SCM의 DB에 연결




SC_HANDLE WINAPI OpenService(

_In_  SC_HANDLE hSCManager,       // SCM핸들 (SC_HANDLE hManager) 

_In_  LPCTSTR lpServiceName,     // 서비스 이름 ("TEST")

_In_  DWORD dwDesiredAccess     // 액세스 권한 (SERVICE_ALL_ACCESS)

);


- 서비스 핸들을 가져옴


SC_HANDLE WINAPI CreateService(

_In_       SC_HANDLE hSCManager,       // SCM핸들 (SC_HANDLE hManager) 

_In_       LPCTSTR lpServiceName,      // 서비스 이름 ("TEST") _In_opt_   LPCTSTR lpDisplayName,     // 서비스 설명 ("TEST2") _In_       DWORD dwDesiredAccess,  // 액세스 권한 _In_       DWORD dwServiceType,  // 서비스 유형 _In_       DWORD dwStartType,   // 시작 유형 _In_       DWORD dwErrorControl,      // 에러 제어 수준 _In_opt_   LPCTSTR lpBinaryPathName,  // 바이너리 경로 _In_opt_   LPCTSTR lpLoadOrderGroup, // NULL _Out_opt_  LPDWORD lpdwTagId,         // NULL _In_opt_   LPCTSTR lpDependencies,     // NULL _In_opt_   LPCTSTR lpServiceStartName, // NULL _In_opt_   LPCTSTR lpPassword // NULL );


- 서비스 설치 (레지스트리에 등록됨) <-> DeleteService



BOOL WINAPI StartService(

_In_      SC_HANDLE hService,         // 서비스 핸들 (SC_HANDLE hService)  _In_      DWORD dwNumServiceArgs,     // 서비스 메인으로 전달되는 인자 개수 (0) _In_opt_  LPCTSTR *lpServiceArgVectors // argument 배열 (NULL) );


- 서비스 시작




BOOL WINAPI DeleteService( _In_  SC_HANDLE hService                // 서비스 핸들 (SC_HANDLE hService)  );


- 서비스 삭제 (레지스트리에서 삭제됨)





[ 서비스 제어 ]


BOOL WINAPI ControlService( _In_   SC_HANDLE hService,            // 서비스 핸들 (SC_HANDLE hService) 

_In_   DWORD dwControl,               // 제어 코드 (SERVICE_CONTROL_STOP) _Out_  LPSERVICE_STATUS lpServiceStatus  // SERVICE_STATUS 구조체 (&Status)

);


- 서비스에 제어신호 전달



BOOL WINAPI QueryServiceStatus(

_In_   SC_HANDLE hService,                // 서비스 핸들 (SC_HANDLE hService)  _Out_  LPSERVICE_STATUS lpServiceStatus  // SERVICE_STATUS 구조체 (&Status) );


- 서비스 상태 확인