Annotation of q_a/samples/sd_flppy/instsrv.c, revision 1.1.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.