6 #include <SDKDDKVer.h>
\r
11 #include <Raym/Log.h>
\r
14 #define SERVICE_NAME (TEXT("Demo_Service"))
\r
18 BOOL g_bService = TRUE;
\r
20 SERVICE_STATUS_HANDLE g_hServiceStatus = NULL;
\r
24 DWORD WINAPI HandlerEx (
\r
27 LPVOID lpEventData,
\r
28 LPVOID lpContext ) {
\r
33 // Initialize Variables for Service Control
\r
34 ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
\r
35 ss.dwWin32ExitCode = NO_ERROR;
\r
36 ss.dwServiceSpecificExitCode = 0;
\r
37 ss.dwCheckPoint = 1;
\r
38 ss.dwWaitHint = 3000;
\r
39 ss.dwControlsAccepted = SERVICE_ACCEPT_STOP;
\r
42 case SERVICE_CONTROL_STOP:
\r
44 DebugLog0("SERVICE_CONTROL_STOP\n");
\r
46 // Set STOP_PENDING status.
\r
47 ss.dwCurrentState = SERVICE_STOP_PENDING;
\r
49 bRet = SetServiceStatus (g_hServiceStatus, &ss);
\r
52 DebugLog0 ("SetServiceStatus failed. %u\n", GetLastError());
\r
56 // SERVICE SPECIFIC STOPPING CODE HERE.
\r
64 // Set STOPPED status.
\r
65 ss.dwCurrentState = SERVICE_STOPPED;
\r
66 ss.dwCheckPoint = 0;
\r
69 bRet = SetServiceStatus (g_hServiceStatus, &ss);
\r
72 DebugLog0 ("SetServiceStatus failed. %u\n", GetLastError());
\r
78 case SERVICE_CONTROL_PAUSE:
\r
80 DebugLog0 ("SERVICE_CONTROL_PAUSE\n");
\r
82 // Set PAUSE_PENDING status.
\r
83 ss.dwCurrentState = SERVICE_PAUSE_PENDING;
\r
85 bRet = SetServiceStatus (g_hServiceStatus, &ss);
\r
88 DebugLog0 ("SetServiceStatus failed. %u\n", GetLastError());
\r
92 // APPLICATION SPECIFIC PAUSE_PENDING CODE HERE.
\r
98 // Set PAUSE_PENDING status.
\r
99 ss.dwCurrentState = SERVICE_PAUSED;
\r
100 ss.dwCheckPoint = 0;
\r
102 ss.dwControlsAccepted |= SERVICE_ACCEPT_PAUSE_CONTINUE;
\r
104 bRet = SetServiceStatus (g_hServiceStatus, &ss);
\r
107 DebugLog0 ("SetServiceStatus failed. %u\n", GetLastError());
\r
113 case SERVICE_CONTROL_CONTINUE:
\r
115 DebugLog0 ("SERVICE_CONTROL_CONTINUE\n");
\r
117 // Set PAUSE_PENDING status.
\r
118 ss.dwCurrentState = SERVICE_START_PENDING;
\r
120 bRet = SetServiceStatus (g_hServiceStatus, &ss);
\r
123 DebugLog0 ("SetServiceStatus failed. %u\n", GetLastError());
\r
127 // APPLICATION SPECIFIC START_PENDING CODE HERE.
\r
133 // Set RUNNING status.
\r
134 ss.dwCurrentState = SERVICE_RUNNING;
\r
135 ss.dwCheckPoint = 0;
\r
137 ss.dwControlsAccepted |= SERVICE_ACCEPT_PAUSE_CONTINUE;
\r
139 bRet = SetServiceStatus (g_hServiceStatus, &ss);
\r
142 DebugLog0 ("SetServiceStatus failed. %u\n", GetLastError());
\r
149 return ERROR_CALL_NOT_IMPLEMENTED;
\r
157 VOID WINAPI ServiceMain(DWORD dwArgc, PTSTR* pszArgv) {
\r
162 // Initialize Variables for Service Control
\r
163 ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
\r
164 ss.dwWin32ExitCode = NO_ERROR;
\r
165 ss.dwServiceSpecificExitCode = 0;
\r
166 ss.dwCheckPoint = 1;
\r
167 ss.dwWaitHint = 1000;
\r
168 ss.dwControlsAccepted = SERVICE_ACCEPT_STOP;
\r
170 // Register Service Control Handler
\r
172 g_hServiceStatus =
\r
173 RegisterServiceCtrlHandlerEx (SERVICE_NAME, HandlerEx, NULL);
\r
175 if(0 == g_hServiceStatus) {
\r
177 "RegisterServiceCtrlHandler failed. %u\n",
\r
182 // Entering Starting Service.
\r
183 DebugLog0 ("SERVICE_START_PENDING...\n");
\r
185 ss.dwCurrentState = SERVICE_START_PENDING;
\r
187 bRet = SetServiceStatus (g_hServiceStatus, &ss);
\r
190 DebugLog0 ("SetServiceStatus failed. %u\n", GetLastError());
\r
194 // APPLICATION SPECIFIC INITIALIZATION CODE
\r
198 // Finish Initializing.
\r
199 DebugLog0 ("SERVICE_RUNNING.\n");
\r
201 ss.dwCurrentState = SERVICE_RUNNING;
\r
202 ss.dwCheckPoint = 0;
\r
204 ss.dwControlsAccepted =
\r
205 SERVICE_ACCEPT_PAUSE_CONTINUE |
\r
206 SERVICE_ACCEPT_STOP;
\r
208 bRet = SetServiceStatus (g_hServiceStatus, &ss);
\r
211 DebugLog0 ("SetServiceStatus failed. %u\n", GetLastError());
\r
216 // Service Main Code.
\r
219 while(g_bService) {
\r
222 DebugLog0 ("%s is running.\n", SERVICE_NAME);
\r
228 DebugLog0 ("END OF ServiceMain\n");
\r
232 SERVICE_TABLE_ENTRY ServiceTable[] =
\r
234 { TEXT("iPTd"), ServiceMain },
\r
240 int main(int argc, char *argv[])
\r
243 bRet = StartServiceCtrlDispatcher(ServiceTable);
\r