📄 jk_nt_service.c
字号:
NO_ERROR, // exit code 3000)) { // wait hint start_jk_service(lpszArgv[0]); } } // try to report the stopped status to the service control manager. // if(sshStatusHandle) { ReportStatusToSCMgr(SERVICE_STOPPED, dwErr, 0); }}void WINAPI service_ctrl(DWORD dwCtrlCode){ /* * Handle the requested control code. */ switch(dwCtrlCode) { /* * Stop the service. */ case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: ssStatus.dwCurrentState = SERVICE_STOP_PENDING; stop_jk_service(); break; /* * Update the service status. */ case SERVICE_CONTROL_INTERROGATE: break; /* * Invalid control code, nothing to do. */ default: break; } ReportStatusToSCMgr(ssStatus.dwCurrentState, NO_ERROR, 0);}BOOL ReportStatusToSCMgr(DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwWaitHint){ static DWORD dwCheckPoint = 1; BOOL fResult = TRUE; if(dwCurrentState == SERVICE_START_PENDING) { ssStatus.dwControlsAccepted = 0; } else { ssStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN; } ssStatus.dwCurrentState = dwCurrentState; ssStatus.dwWin32ExitCode = dwWin32ExitCode; ssStatus.dwWaitHint = dwWaitHint; if((dwCurrentState == SERVICE_RUNNING) || (dwCurrentState == SERVICE_STOPPED)) { ssStatus.dwCheckPoint = 0; } else { ssStatus.dwCheckPoint = dwCheckPoint++; } if(!(fResult = SetServiceStatus(sshStatusHandle, &ssStatus))) { AddToMessageLog(TEXT("SetServiceStatus")); } return fResult;}typedef WINADVAPI BOOL (WINAPI * pfnChangeServiceConfig2_t) (SC_HANDLE hService, DWORD dwInfoLevel, LPVOID lpInfo);void install_service(char *name, char *dname, char *user, char *password, char *deps, BOOL bAutomatic, char *rel_prp_file){ SC_HANDLE schService; SC_HANDLE schSCManager; char szExecPath[2048]; char szPropPath[2048]; char szTrueName[256]; char *dummy; char *src, *dst; dst = szTrueName; for (src = name; *src; ++src) { if (dst >= szTrueName + sizeof(szTrueName) - 1) { break; } if (!isspace(*src) && *src != '/' && *src != '\\') { *(dst++) = *src; } } *dst = '\0'; if (0 == stricmp("", deps)) deps = NULL; /* XXX strcat( deps, "Tcpip\0Afd\0" ); */ if(!GetFullPathName(rel_prp_file, sizeof(szPropPath) - 1, szPropPath, &dummy)) { printf("Unable to install %s - %s\n", name, GetLastErrorText(szErr, sizeof(szErr))); return; } if(!jk_file_exists(szPropPath)) { printf("Unable to install %s - File [%s] does not exists\n", name, szPropPath); return; } szExecPath[0] = '\"'; if(GetModuleFileName( NULL, szExecPath + 1, sizeof(szExecPath) - 2) == 0) { /* Was: if(GetModuleFileName( NULL, szExecPath, sizeof(szExecPath) - 1) == 0) { */ 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 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -