📄 jk_nt_service.c
字号:
printf("Unable to install %s - %s\n", name, GetLastErrorText(szErr, sizeof(szErr))); return; } strcat(szExecPath, "\" "); strcat(szExecPath, szTrueName); schSCManager = OpenSCManager(NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS); // access required if(schSCManager) { schService = CreateService(schSCManager, // SCManager database szTrueName, // name of service dname, // name to display SERVICE_ALL_ACCESS, // desired access SERVICE_WIN32_OWN_PROCESS, // service type bAutomatic ? SERVICE_AUTO_START : SERVICE_DEMAND_START, // start type SERVICE_ERROR_NORMAL, // error control type szExecPath, // service's binary NULL, // no load ordering group NULL, // no tag identifier deps, // dependencies user, // account password); // password if(schService) { printf("The service named %s was created. Now adding registry entries\n", name); if(set_registry_values(schService, szTrueName, szPropPath)) { CloseServiceHandle(schService); } else { printf("CreateService failed setting the private registry - %s\n", GetLastErrorText(szErr, sizeof(szErr))); DeleteService(schService); CloseServiceHandle(schService); } } else { printf("CreateService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr))); } CloseServiceHandle(schSCManager); } else { printf("OpenSCManager failed - %s\n", GetLastErrorText(szErr, sizeof(szErr))); }}void remove_service(char *name){ SC_HANDLE schService; SC_HANDLE schSCManager; char szNameBuff[256]; DWORD lenNameBuff = 256; char *szTrueName = name; schSCManager = OpenSCManager(NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS ); // access required if(schSCManager) { if (GetServiceKeyName(schSCManager, name, szNameBuff, &lenNameBuff)) { szTrueName = szNameBuff; } schService = OpenService(schSCManager, szTrueName, SERVICE_ALL_ACCESS); if(schService) { // try to stop the service if(ControlService( schService, SERVICE_CONTROL_STOP, &ssStatus )) { printf("Stopping %s.", name); Sleep(1000); while(QueryServiceStatus(schService, &ssStatus )) { if(ssStatus.dwCurrentState == SERVICE_STOP_PENDING) { printf("."); Sleep(1000); } else { break; } } if(ssStatus.dwCurrentState == SERVICE_STOPPED) { printf("\n%s stopped.\n", name); } else { printf("\n%s failed to stop.\n", name); } } // now remove the service if(DeleteService(schService)) { printf("%s removed.\n", name); } else { printf("DeleteService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr))); } CloseServiceHandle(schService); } else { printf("OpenService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr))); } CloseServiceHandle(schSCManager); } else { printf("OpenSCManager failed - %s\n", GetLastErrorText(szErr, sizeof(szErr))); }}void start_service(char *name, char *machine){ SC_HANDLE schService; SC_HANDLE schSCManager; schSCManager = OpenSCManager(machine, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS); // access required if(schSCManager) { schService = OpenService(schSCManager, name, SERVICE_ALL_ACCESS); if(schService) { // try to start the service if(StartService(schService, 0, NULL)) { printf("Starting %s.", name); Sleep(1000); while(QueryServiceStatus(schService, &ssStatus )) { if(ssStatus.dwCurrentState == SERVICE_START_PENDING) { printf("."); Sleep(1000); } else { break; } } if(ssStatus.dwCurrentState == SERVICE_RUNNING) { printf("\n%s started.\n", name); } else { printf("\n%s failed to start.\n", name); } } else printf("StartService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr))); CloseServiceHandle(schService); } else { printf("OpenService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr))); } CloseServiceHandle(schSCManager); } else { printf("OpenSCManager failed - %s\n", GetLastErrorText(szErr, sizeof(szErr))); }}void stop_service(char *name, char *machine){ SC_HANDLE schService; SC_HANDLE schSCManager; schSCManager = OpenSCManager(machine, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS); // access required if(schSCManager) { schService = OpenService(schSCManager, name, SERVICE_ALL_ACCESS); if(schService) { // try to stop the service if(ControlService( schService, SERVICE_CONTROL_STOP, &ssStatus )) { printf("Stopping %s.", name); Sleep(1000); while(QueryServiceStatus(schService, &ssStatus )) { if(ssStatus.dwCurrentState == SERVICE_STOP_PENDING) { printf("."); Sleep(1000); } else { break; } } if(ssStatus.dwCurrentState == SERVICE_STOPPED) { printf("\n%s stopped.\n", name); } else { printf("\n%s failed to stop.\n", name); } } else printf("StopService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr))); CloseServiceHandle(schService); } else { printf("OpenService failed - %s\n", GetLastErrorText(szErr, sizeof(szErr))); } CloseServiceHandle(schSCManager); } else { printf("OpenSCManager failed - %s\n", GetLastErrorText(szErr, sizeof(szErr))); }}static int set_registry_values(SC_HANDLE schService, char *name, char *prp_file){ char tag[1024]; HKEY hk; int rc; /* Api based */ HANDLE hAdvApi32; char *szDescription = "Jakarta Tomcat Server"; pfnChangeServiceConfig2_t pfnChangeServiceConfig2; if((hAdvApi32 = GetModuleHandle("advapi32.dll")) && ((pfnChangeServiceConfig2 = (pfnChangeServiceConfig2_t) GetProcAddress(hAdvApi32, "ChangeServiceConfig2A")))) { (void) pfnChangeServiceConfig2(schService, // Service Handle 1, // SERVICE_CONFIG_DESCRIPTION &szDescription); } else { char value[2024]; rc = JK_FALSE; strcpy(tag, BASE_REGISTRY_LOCATION); strcat(tag, name); if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, tag, (DWORD)0, KEY_WRITE | KEY_READ, &hk)) { rc = get_registry_config_parameter(hk, IMAGE_NAME, value, sizeof(value)); if(rc) { strcat(value, " "); strcat(value, name); rc = set_registry_config_parameter(hk, IMAGE_NAME, value); if(rc) { printf("Registry values were added\n"); printf("If you have already updated wrapper.properties you may start the %s" "service by executing \"jk_nt_service -s %s\" from the command prompt\n", name, name); } } RegCloseKey(hk); } if(!rc) { printf("Error: Failed to update the service command line - %s\n", GetLastErrorText(szErr, sizeof(szErr))); } } strcpy(tag, BASE_REGISTRY_LOCATION); strcat(tag, name); strcat(tag, "\\"); strcat(tag, PARAMS_LOCATION); rc = create_registry_key(tag, &hk); if(rc) { rc = set_registry_config_parameter(hk, PRP_LOCATION, prp_file); if(!rc) { printf("Error: Can not create value [%s] - %s\n", PRP_LOCATION, GetLastErrorText(szErr, sizeof(szErr))); } RegCloseKey(hk); } else { printf("Error: Can not create key [%s] - %s\n", tag, GetLastErrorText(szErr, sizeof(szErr))); } return rc;}static void start_jk_service(char *name){ /* * report the status to the service control manager. */ if(ReportStatusToSCMgr(SERVICE_START_PENDING, // service state NO_ERROR, // exit code 3000)) { // wait hint /* * create the event object. The control handler function signals * this event when it receives the "stop" control code. */ hServerStopEvent = CreateEvent(NULL, // no security attributes TRUE, // manual reset event FALSE, // not-signalled NULL); // no name if(hServerStopEvent) { if(ReportStatusToSCMgr(SERVICE_START_PENDING, // service state NO_ERROR, // exit code 20000)) { // wait hint HANDLE hTomcat = NULL; char szNameBuff[256]; DWORD lenNameBuff = 256; char *szTrueName = name; SC_HANDLE schSCManager; int rc; schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS ); if(schSCManager) { if (GetServiceKeyName(schSCManager, name, szNameBuff, &lenNameBuff)) { szTrueName = szNameBuff; } CloseServiceHandle(schSCManager); } rc = start_tomcat(szTrueName, &hTomcat); if(rc && ReportStatusToSCMgr(SERVICE_RUNNING, // service state NO_ERROR, // exit code 0)) { // wait hint HANDLE waitfor[] = { hServerStopEvent, hTomcat}; DWORD dwIndex = WaitForMultipleObjects(2, waitfor, FALSE, INFINITE); switch(dwIndex) { case WAIT_OBJECT_0: /* * Stop order arrived */ ResetEvent(hServerStopEvent); stop_tomcat(name, shutdown_port, shutdown_protocol, shutdown_secret, hTomcat); break; case (WAIT_OBJECT_0 + 1): /* * Tomcat died !!! */ CloseHandle(hServerStopEvent); CloseHandle(hTomcat); exit(0); // exit ungracefully so // Service Control Manager // will attempt a restart. break; default: /* * some error... * close the servlet container and exit */ stop_tomcat(name, shutdown_port, shutdown_protocol, shutdown_secret, hTomcat); } CloseHandle(hServerStopEvent); CloseHandle(hTomcat); } } } } if(hServerStopEvent) { CloseHandle(hServerStopEvent); }}static void stop_jk_service(void){ if(hServerStopEvent) { SetEvent(hServerStopEvent); }}static void AddToMessageLog(char *lpszMsg){ char szMsg[2048]; HANDLE hEventSource; char * lpszStrings[2]; printf("Error: %s\n", lpszMsg); dwErr = GetLastError(); hEventSource = RegisterEventSource(NULL, "Jakarta - Tomcat"); sprintf(szMsg, "%s error: %d", "Jakarta - Tomcat", dwErr); lpszStrings[0] = szMsg; lpszStrings[1] = lpszMsg; if(hEventSource != NULL) { ReportEvent(hEventSource, // handle of event source EVENTLOG_ERROR_TYPE, // event type 0, // event category 0, // event ID NULL, // current user's SID 2, // strings in lpszStrings 0, // no bytes of raw data lpszStrings, // array of error strings NULL); // no raw data DeregisterEventSource(hEventSource); } }//// FUNCTION: GetLastErrorText//// PURPOSE: copies error message text to string//// PARAMETERS:// lpszBuf - destination buffer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -