⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jk_nt_service.c

📁 jboss与apache集成的中间件,详情请参看文档说明.
💻 C
📖 第 1 页 / 共 3 页
字号:
        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 + -