Annotation of q_a/samples/sd_flppy/instsrv.c, revision 1.1

1.1     ! root        1: #include <windows.h>
        !             2: #include <stdio.h>
        !             3: #include <stdlib.h>
        !             4: #include <string.h>
        !             5: 
        !             6: #define FORCE_SERVICE_NAME_TO_FLOPPYLOCK (0==0)
        !             7: 
        !             8: #define PERR(api) printf("\n%s: Error %d from %s on line %d",  \
        !             9:     __FILE__, GetLastError(), api, __LINE__);
        !            10: #define PMSG(msg) printf("\n%s line %d: %s",  \
        !            11:     __FILE__, __LINE__, msg);
        !            12: 
        !            13: #define MSG_FOR_ACCESS_DENIED "You aren't authorized to do this - please see your system Administrator"
        !            14: #define MSG_1_FOR_BAD_PATH "The fully qualified path name to the .exe must be given, and"
        !            15: #define MSG_2_FOR_BAD_PATH "  the drive letter must be for a fixed disk (e.g., not a net drive)"
        !            16: 
        !            17: SC_HANDLE schService;
        !            18: SC_HANDLE schSCManager;
        !            19: 
        !            20: VOID InstallService(LPCTSTR serviceName, LPCTSTR serviceExe)
        !            21: {
        !            22:   LPCTSTR lpszBinaryPathName = serviceExe;
        !            23:   LPTSTR  lpszRootPathName="?:\\";
        !            24: 
        !            25:   if ( (':' != *(lpszBinaryPathName+1)) || ('\\' != *(lpszBinaryPathName+2)) )
        !            26:   { printf("\n%s",MSG_1_FOR_BAD_PATH);
        !            27:     printf("\n%s\n",MSG_2_FOR_BAD_PATH);
        !            28:     return;
        !            29:   }
        !            30: 
        !            31:   #define DRIVE_TYPE_INDETERMINATE 0
        !            32:   #define ROOT_DIR_DOESNT_EXIST    1
        !            33: 
        !            34:   *lpszRootPathName = *(lpszBinaryPathName+0) ;
        !            35: 
        !            36:   switch (  GetDriveType(lpszRootPathName)  )
        !            37:   {
        !            38:     case DRIVE_FIXED :
        !            39:     { // OK
        !            40:       break;
        !            41:     }
        !            42:     case  ROOT_DIR_DOESNT_EXIST :
        !            43:     { printf("\n%s",MSG_1_FOR_BAD_PATH);
        !            44:       printf("\n  the root directory where the .exe is specified to be must exist, and");
        !            45:       printf("\n%s\n",MSG_2_FOR_BAD_PATH);
        !            46:       return;
        !            47:     }
        !            48:     case  DRIVE_TYPE_INDETERMINATE :
        !            49:     case  DRIVE_REMOVABLE          :
        !            50:     case  DRIVE_REMOTE             :
        !            51:     case  DRIVE_CDROM              :
        !            52:     case  DRIVE_RAMDISK            :
        !            53:     { printf("\n%s",MSG_1_FOR_BAD_PATH);
        !            54:       printf("\n%s\n",MSG_2_FOR_BAD_PATH);
        !            55:       return;
        !            56:     }
        !            57:     default :
        !            58:     { printf("\n%s",MSG_1_FOR_BAD_PATH);
        !            59:       printf("\n%s\n",MSG_2_FOR_BAD_PATH);
        !            60:       return;
        !            61:     }
        !            62:   }
        !            63: 
        !            64:   if (INVALID_HANDLE_VALUE == CreateFile(lpszBinaryPathName,
        !            65:                                          GENERIC_READ,
        !            66:                                          FILE_SHARE_READ,
        !            67:                                          NULL,
        !            68:                                          OPEN_EXISTING,
        !            69:                                          FILE_ATTRIBUTE_NORMAL,
        !            70:                                          NULL))
        !            71:   { printf("\n%s",MSG_1_FOR_BAD_PATH);
        !            72:     printf("\n  the file must exist, and");
        !            73:     printf("\n%s\n",MSG_2_FOR_BAD_PATH);
        !            74:     return;
        !            75:   }
        !            76: 
        !            77:   schService = CreateService(
        !            78:       schSCManager,               // SCManager database
        !            79:       serviceName,                // name of service
        !            80:       serviceName,                // name to display (new parameter after october beta)
        !            81:       SERVICE_ALL_ACCESS,         // desired access
        !            82:       SERVICE_WIN32_OWN_PROCESS,  // service type
        !            83:       SERVICE_AUTO_START,         // start type
        !            84:       SERVICE_ERROR_NORMAL,       // error control type
        !            85:       lpszBinaryPathName,         // service's binary
        !            86:       NULL,                       // no load ordering group
        !            87:       NULL,                       // no tag identifier
        !            88:       NULL,                       // no dependencies
        !            89:       ".\\Administrator",         // Admin account
        !            90:       "");                        // null password
        !            91: 
        !            92:   if (NULL == schService)
        !            93:   { switch (GetLastError())
        !            94:     {
        !            95:       case ERROR_ACCESS_DENIED :
        !            96:       { printf("\n%s",MSG_FOR_ACCESS_DENIED);
        !            97:         break;
        !            98:       }
        !            99:       case ERROR_SERVICE_EXISTS :
        !           100:       { printf("\nThe %s service is already installed",serviceName);
        !           101:         printf("\nRemove it first if you need to re-install a new version\n");
        !           102:         break;
        !           103:       }
        !           104:       default :
        !           105:       { PERR("CreateService");
        !           106:       }
        !           107:     }
        !           108:     return;
        !           109:   }
        !           110:   else
        !           111:   { printf("\nCreateService SUCCESS\n");
        !           112:     printf("\nDon't forget!!! You must now go to the Control Panel and");
        !           113:     printf("\n  use the Services applet to change the account name and");
        !           114:     printf("\n  password that this newly installed service will use when");
        !           115:     printf("\n  it attempts to logon as a service when it starts.");
        !           116:     printf("\nTo do this: use the Startup button in the Services applet,");
        !           117:     printf("\n  and (for example) specify the Administrator account and");
        !           118:     printf("\n  correct password.");
        !           119:     printf("\nAlso, use the Services applet to ensure this newly installed");
        !           120:     printf("\n  service starts automatically, since the point of this");
        !           121:     printf("\n  service is to start automatically and apply the DACLs");
        !           122:     printf("\n  to the floppy drives prior to a user logging on at");
        !           123:     printf("\n  the keyboard\n");
        !           124:   }
        !           125: 
        !           126:   CloseServiceHandle(schService);
        !           127: }
        !           128: 
        !           129: VOID RemoveService(LPCTSTR serviceName)
        !           130: {
        !           131:   {
        !           132:     #define                                     SZ_ENUM_BUF 4096
        !           133:     ENUM_SERVICE_STATUS        essServiceStatus[SZ_ENUM_BUF];
        !           134:     DWORD   dwBufSize = sizeof(essServiceStatus);
        !           135:     DWORD   dwBytesNeeded      = 0;
        !           136:     DWORD   dwServicesReturned = 0;
        !           137:     DWORD   dwResumeHandle     = 0;
        !           138:     DWORD   dwI                = 0;
        !           139:     BOOLEAN bFound = FALSE;
        !           140: 
        !           141:     if (!EnumServicesStatus(schSCManager,
        !           142:                             SERVICE_WIN32,
        !           143:                             SERVICE_ACTIVE,
        !           144:                             (LPENUM_SERVICE_STATUS)&essServiceStatus,
        !           145:                             dwBufSize,
        !           146:                             &dwBytesNeeded,
        !           147:                             &dwServicesReturned,
        !           148:                             &dwResumeHandle))
        !           149:     { switch (GetLastError())
        !           150:       {
        !           151:         case ERROR_ACCESS_DENIED :
        !           152:         { printf("\n%s",MSG_FOR_ACCESS_DENIED);
        !           153:           break;
        !           154:         }
        !           155:         default :
        !           156:         { PERR("EnumServicesStatus");
        !           157:         }
        !           158:       }
        !           159:       return;
        !           160:     }
        !           161: 
        !           162:     for (dwI=0; dwI<dwServicesReturned; dwI++)
        !           163:     { if(0 == _stricmp(essServiceStatus[dwI].lpServiceName,serviceName))
        !           164:       { bFound = TRUE;
        !           165:         break;
        !           166:       }
        !           167:     }
        !           168: 
        !           169:     if (bFound)
        !           170:     { printf("\nThe %s service cannot be removed until it has been stopped.",serviceName);
        !           171:       printf("\nTo stop the %s service, use the Stop button in the Control",serviceName);
        !           172:       printf("\n  Panel Services applet\n");
        !           173:       return;
        !           174:     }
        !           175:   }
        !           176: 
        !           177:   schService = OpenService(schSCManager,
        !           178:                            serviceName,
        !           179:                            SERVICE_ALL_ACCESS);
        !           180:   if (NULL == schService)
        !           181:   { switch (GetLastError())
        !           182:     {
        !           183:       case ERROR_ACCESS_DENIED :
        !           184:       { printf("\n%s",MSG_FOR_ACCESS_DENIED);
        !           185:         break;
        !           186:       }
        !           187:       case ERROR_SERVICE_DOES_NOT_EXIST :
        !           188:       { printf("\nThe %s service is not installed, so cannot be removed\n",serviceName);
        !           189:         break;
        !           190:       }
        !           191:       default :
        !           192:       { PERR("OpenService");
        !           193:       }
        !           194:     }
        !           195:     return;
        !           196:   }
        !           197: 
        !           198:   if (DeleteService(schService))
        !           199:   { printf("\nDeleteService SUCCESS\n");
        !           200:   }
        !           201:   else
        !           202:   { switch (GetLastError())
        !           203:     {
        !           204:       case ERROR_ACCESS_DENIED :
        !           205:       { printf("\n%s",MSG_FOR_ACCESS_DENIED);
        !           206:         break;
        !           207:       }
        !           208:       default :
        !           209:       { PERR("DeleteService");
        !           210:       }
        !           211:     }
        !           212:   }
        !           213: }
        !           214: 
        !           215: VOID main(int argc, char *argv[])
        !           216: {
        !           217:   #define           SZ_NAME_BUF  270  // 256 is max, add a little
        !           218:   UCHAR   ucNameBuf[SZ_NAME_BUF] = "FloppyLock";
        !           219:   LPTSTR  lpszServName = (LPTSTR)&ucNameBuf;
        !           220: 
        !           221:   UCHAR   ucExeNBuf[SZ_NAME_BUF] = "";
        !           222:   LPTSTR  lpszExeName  = (LPTSTR)&ucExeNBuf;
        !           223: 
        !           224:   BOOL    bRemovingService = FALSE;
        !           225: 
        !           226:   if (FORCE_SERVICE_NAME_TO_FLOPPYLOCK)
        !           227:   { if (argc != 2)
        !           228:     { printf("\nUsage: instsrv <exe location>");
        !           229:       printf("\n           to install the FloppyLock service, or:");
        !           230:       printf("\n       instsrv remove");
        !           231:       printf("\n           to  remove the FloppyLock service\n");
        !           232:       printf("\nA more specific example");
        !           233:       printf("\n       instsrv c:\\q_a\\samples\\sd_flppy\\service\\floplock.exe");
        !           234:       printf("\n           (note fully-qualified path name to .exe)");
        !           235:       printf("\n       instsrv remove\n");
        !           236:       exit(1);
        !           237:     }
        !           238:     else
        !           239:     {
        !           240:       strcpy(lpszExeName ,argv[1]);
        !           241: 
        !           242:       bRemovingService = (!stricmp(argv[1], "remove"));
        !           243:     }
        !           244:   }
        !           245:   else
        !           246:   { if (argc != 3)
        !           247:     { printf("\nUsage: instsrv <service name> <exe location>");
        !           248:       printf("\n           to install a service, or:");
        !           249:       printf("\n       instsrv <service name> remove");
        !           250:       printf("\n           to remove a service\n");
        !           251:       printf("\nIn the case of this service, a more specific example");
        !           252:       printf("\n       instsrv FloppyLocker c:\\q_a\\samples\\sd_flppy\\service\\floplock.exe");
        !           253:       printf("\n           (note fully-qualified path name to .exe)");
        !           254:       printf("\n       instsrv FloppyLocker remove\n");
        !           255:       exit(1);
        !           256:     }
        !           257:     else
        !           258:     { if (strlen(argv[1]) > 256)
        !           259:       { printf("\nThe service name cannot be longer than 256 characters\n");
        !           260:         exit(1);
        !           261:       }
        !           262:       strcpy(lpszServName,argv[1]);
        !           263:       strcpy(lpszExeName ,argv[2]);
        !           264: 
        !           265:       bRemovingService = (!stricmp(argv[2], "remove"));
        !           266:     }
        !           267:   }
        !           268: 
        !           269:   schSCManager = OpenSCManager(
        !           270:                       NULL,                   // machine (NULL == local)
        !           271:                       NULL,                   // database (NULL == default)
        !           272:                       SC_MANAGER_ALL_ACCESS); // access required
        !           273:   if (NULL == schSCManager)
        !           274:   { switch (GetLastError())
        !           275:     {
        !           276:       case ERROR_ACCESS_DENIED :
        !           277:       { printf("\n%s",MSG_FOR_ACCESS_DENIED);
        !           278:         break;
        !           279:       }
        !           280:       default :
        !           281:       { PERR("OpenSCManager");
        !           282:       }
        !           283:     }
        !           284:     return;
        !           285:   }
        !           286: 
        !           287:   if (bRemovingService)
        !           288:   { RemoveService(lpszServName);
        !           289:   }
        !           290:   else
        !           291:   { InstallService(lpszServName,lpszExeName);
        !           292:   }
        !           293: 
        !           294:   CloseServiceHandle(schSCManager);
        !           295: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.