본문 바로가기
dev/windows

[windows] 외부에서 서비스 제어 못하게 하기

by 최연탄 2017. 5. 23.
728x90
반응형

참고: https://msdn.microsoft.com/en-us/library/windows/desktop/ms685996(v=vs.85).aspx

본인이 만든 windows service를 작업관리자나 sc 등의 명령으로 정지 못하게 하고 싶은 경우 SERVICE_STATUS의 dwControlsAccepted 값을 제어함으로 목적을 달성할 수 있다.

 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
BOOL Lock(SERVICE_STATUS_HANDLE hServiceStatus)
{
	SERVICE_STATUS ss;
	ss.dwCheckPoint = 0;
	ss.dwControlsAccepted = 0; // 어떤 제어 요청도 받지 않음
	ss.dwCurrentState = dwCurrentState
	ss.dwServiceSpecificExitCode = 0;
	ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
	ss.dwWaitHint = 0;
	ss.dwWin32ExitCode = 0;

	return SetServiceStatus(hServiceStatus, &ss);
}

BOOL Unlock(SERVICE_STATUS_HANDLE hServiceStatus)
{
	SERVICE_STATUS ss;
	ss.dwCheckPoint = 0;
	ss.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE;
	ss.dwCurrentState = dwCurrentState
	ss.dwServiceSpecificExitCode = 0;
	ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
	ss.dwWaitHint = 0;
	ss.dwWin32ExitCode = 0;

	return SetServiceStatus(hServiceStatus, &ss);
}

여기서 파라미터로 받는 SERVICE_STATUS_HANDLE은 서비스 등록 시 사용한 RegisterServiceCtrlHandlerEx의 리턴 값을 사용해야한다.

반응형

댓글