시스템 시작시 실행해야 될 서비스 목록을 레지스트리에 기록 (서비스 데이터베이스)
-> 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) );
- 서비스 상태 확인
'Programming > Win_API' 카테고리의 다른 글
Windows 서비스 프로그램 (0) | 2014.03.22 |
---|---|
Windows 버전 구별 - GetVerion() (0) | 2014.01.21 |
ANSI, WIDE, TCHAR 함수들 (0) | 2014.01.08 |
실행 중인 Class, Caption, Process 이름 구하기 (0) | 2014.01.08 |
API Hooking - [3] DLL Injection + Trampoline Code Hooking (0) | 2013.12.07 |