📄 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 + -