/* * File: instsrv.c * Purpose: To install a new service and to insert registry entries. * */ #ifndef __RPCASYNC_H__ #define __RPCASYNC_H__ /* Skip asynch rpc inclusion */ #endif #include #include #define PERR(api) printf("\n%s: Error %d from %s on line %d", \ __FILE__, GetLastError(), api, __LINE__); #define MSG_FOR_ACCESS_DENIED "You aren't authorized to do this - please see your system Administrator" #define MSG_1_FOR_BAD_PATH "The fully qualified path name to the .exe must be given, and" #define MSG_2_FOR_BAD_PATH " the drive letter must be for a fixed disk (e.g., not a net drive)" SC_HANDLE schService; SC_HANDLE schSCManager; int ok2; VOID DisplayHelp(VOID); /* --------------------------------------------------------------------------------------- */ int InstallService(LPCTSTR serviceName, LPCTSTR displayName, LPCTSTR serviceExe) { LPCTSTR lpszBinaryPathName = serviceExe; TCHAR lpszRootPathName[] ="?:\\"; if ( (':' != *(lpszBinaryPathName+1)) || ('\\' != *(lpszBinaryPathName+2)) ) { printf("\n%s",MSG_1_FOR_BAD_PATH); printf("\n%s\n",MSG_2_FOR_BAD_PATH); return 1; } #define DRIVE_TYPE_INDETERMINATE 0 #define ROOT_DIR_DOESNT_EXIST 1 *lpszRootPathName = *(lpszBinaryPathName+0) ; switch ( GetDriveType(lpszRootPathName) ) { case DRIVE_FIXED : { // OK break; } case ROOT_DIR_DOESNT_EXIST : { printf("\n%s",MSG_1_FOR_BAD_PATH); printf("\n the root directory where the .exe is specified to be must exist, and"); printf("\n%s\n",MSG_2_FOR_BAD_PATH); return 1; } case DRIVE_TYPE_INDETERMINATE : case DRIVE_REMOVABLE : case DRIVE_REMOTE : case DRIVE_CDROM : case DRIVE_RAMDISK : { printf("\n%s",MSG_1_FOR_BAD_PATH); printf("\n%s\n",MSG_2_FOR_BAD_PATH); return 1; } default : { printf("\n%s",MSG_1_FOR_BAD_PATH); printf("\n%s\n",MSG_2_FOR_BAD_PATH); return 1; } } if (INVALID_HANDLE_VALUE == CreateFile(lpszBinaryPathName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)) { printf("\n%s",MSG_1_FOR_BAD_PATH); printf("\n the file must exist, and"); printf("\n%s\n",MSG_2_FOR_BAD_PATH); return 1; } schService = CreateService( schSCManager, // SCManager database serviceName, // name of service displayName, // name to display SERVICE_ALL_ACCESS, // desired access SERVICE_WIN32_OWN_PROCESS, // service type SERVICE_AUTO_START, // start type SERVICE_ERROR_NORMAL, // error control type lpszBinaryPathName, // service's binary NULL, // no load ordering group NULL, // no tag identifier NULL, // no dependencies NULL, // Local System account NULL); // null password if (NULL == schService) { switch (GetLastError()) { case ERROR_ACCESS_DENIED : { printf("\n%s",MSG_FOR_ACCESS_DENIED); break; } case ERROR_SERVICE_EXISTS : { printf("\nThe %s service is already installed",serviceName); printf("\nRemove it first if you need to re-install a new version\n"); break; } default : { PERR("CreateService"); } } return 1; } else CloseServiceHandle(schService); return 0; } /* --------------------------------------------------------------------------------------- */ int RemoveService(LPCTSTR serviceName) { { #define SZ_ENUM_BUF 4096 ENUM_SERVICE_STATUS essServiceStatus[SZ_ENUM_BUF]; DWORD dwBufSize = sizeof(essServiceStatus); DWORD dwBytesNeeded = 0; DWORD dwServicesReturned = 0; DWORD dwResumeHandle = 0; DWORD dwI = 0; BOOLEAN bFound = FALSE; if (!EnumServicesStatus(schSCManager, SERVICE_WIN32, SERVICE_ACTIVE, (LPENUM_SERVICE_STATUS)&essServiceStatus, dwBufSize, &dwBytesNeeded, &dwServicesReturned, &dwResumeHandle)) { switch (GetLastError()) { case ERROR_ACCESS_DENIED : { printf("\n%s",MSG_FOR_ACCESS_DENIED); break; } default : { PERR("EnumServicesStatus"); } } return 1; } for (dwI=0; dwI 256) { printf("\nThe service name cannot be longer than 256 characters\n"); return(1); } bRemovingService = (!stricmp(argv[1], "remove")); schSCManager = OpenSCManager( NULL, // machine (NULL == local) NULL, // database (NULL == default) SC_MANAGER_ALL_ACCESS); // access required if (NULL == schSCManager) { switch (GetLastError()) { case ERROR_ACCESS_DENIED : { printf("\n%s",MSG_FOR_ACCESS_DENIED); break; } default : { PERR("OpenSCManager"); } } return (0); } if (bRemovingService) { ok = RemoveService(lpszServName); } else { /* get the exe name */ strcpy(lpszExeName,argv[1]); ok = InstallService(lpszServName, lpszDispName, lpszExeName); } CloseServiceHandle(schSCManager); if (!bRemovingService) { if (ok == 0) { /* Set the Event-ID message-file name. */ ok = addSourceToRegistry("NTP", lpszExeName); if (ok == 0) ok = addKeysToRegistry(); else return ok; if (ok == 0) { printf("\nThe \"Network Time Protocol\" service was successfully created.\n"); printf("\nDon't forget!!! You must now go to the Control Panel and"); printf("\n use the Services applet to change the account name and"); printf("\n password that the NTP Service will use when"); printf("\n it starts."); printf("\nTo do this: use the Startup button in the Services applet,"); printf("\n and (for example) specify the desired account and"); printf("\n correct password."); printf("\nAlso, use the Services applet to ensure this newly installed"); printf("\n service starts automatically on bootup.\n"); return 0; } } else return ok; } return 0; } /* --------------------------------------------------------------------------------------- */ VOID DisplayHelp(VOID) { printf("Installs or removes the NTP service.\n"); printf("To install the NTP service,\n"); printf("type INSTSRV \n"); printf("Where:\n"); printf(" path Absolute path to the NTP service, name.exe. You must\n"); printf(" use a fully qualified path and the drive letter must be for a\n"); printf(" fixed, local drive.\n\n"); printf("For example, INSTSRV i:\\winnt\\system32\\ntpd.exe\n"); printf("To remove the NTP service,\n"); printf("type INSTSRV remove \n"); } /* EOF */