windows-nt/Source/XPSP1/NT/sdktools/sclist/sclist.c
2020-09-26 16:20:57 +08:00

174 lines
4.4 KiB
C

//----------------------------------------------------------------------//
//
// Oct 1996 - fixed bug 54583 - simple typo in usage text //
// a-martih (Martin Holladay)
//
//----------------------------------------------------------------------//
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
SC_HANDLE hSvc;
ENUM_SERVICE_STATUS SvcStat[1024];
ULONG i;
ULONG Resume;
ULONG NumSvc;
LPSTR p;
LPSTR CmdLine;
BOOL StoppedOnly;
BOOL RunningOnly;
CHAR MachineName[256];
CHAR ch;
int
__cdecl
main( void )
{
CmdLine = GetCommandLine();
//
// skip the program name
//
while( *CmdLine && *CmdLine != ' ' ) {
CmdLine += 1;
}
//
// skip any white space
//
while( *CmdLine && *CmdLine == ' ' ) {
CmdLine += 1;
}
//
// get the command line options
//
while( *CmdLine && (*CmdLine == '-' || *CmdLine == '/') ) {
CmdLine += 1;
ch = (CHAR)tolower(*CmdLine);
CmdLine += 1;
switch( ch ) {
case 's':
StoppedOnly = TRUE;
break;
case 'r':
RunningOnly = TRUE;
break;
default:
fputs("\n"
"Microsoft (R) Windows NT (TM) Version 5.0 SCLIST\n"
"Copyright (C) Microsoft Corp. All rights reserved\n\n"
"usage: SCLIST [-?] [-r] [-s] [MachineName]\n"
" [-?] Display this message\n"
" [-r] Display only running services\n"
" [-s] Display only stopped services\n"
" [-MachineName] Machine name to list services\n",
stderr );
exit(0);
}
while( *CmdLine == ' ' ) {
CmdLine += 1;
}
}
//
// get the machine name
//
if (*CmdLine) {
//
// skip any white space
//
while( *CmdLine && *CmdLine == ' ' ) {
CmdLine += 1;
}
//
// get the machine name
//
p = MachineName;
while( *CmdLine && *CmdLine != ' ' ) {
*p++ = *CmdLine;
CmdLine += 1;
}
*p = 0;
}
hSvc = OpenSCManager( MachineName, NULL, SC_MANAGER_ENUMERATE_SERVICE );
if (!hSvc) {
printf( "could not open service manager for %s\n",
MachineName[0] ? MachineName : "Local Machine" );
return 1;
}
if (!EnumServicesStatus(
hSvc,
SERVICE_WIN32,
SERVICE_ACTIVE | SERVICE_INACTIVE,
SvcStat,
sizeof(SvcStat),
&i,
&NumSvc,
&Resume
)) {
printf( "could not enumerate services for %s\n",
MachineName[0] ? MachineName : "Local Machine" );
return 1;
}
printf( "\n" );
printf( "--------------------------------------------\n" );
printf( "- Service list for %s ", MachineName[0] ? MachineName : "Local Machine" );
if (StoppedOnly || RunningOnly) {
printf( "(" );
if (RunningOnly) {
printf( "running" );
}
if (StoppedOnly) {
printf( "stopped" );
}
printf( ")" );
}
printf( "\n" );
printf( "--------------------------------------------\n" );
for (i=0; i<NumSvc; i++) {
if (RunningOnly && SvcStat[i].ServiceStatus.dwCurrentState != SERVICE_RUNNING) {
continue;
}
if (StoppedOnly && SvcStat[i].ServiceStatus.dwCurrentState != SERVICE_STOPPED) {
continue;
}
switch( SvcStat[i].ServiceStatus.dwCurrentState ) {
case SERVICE_STOPPED:
p = "stopped";
break;
case SERVICE_START_PENDING:
p = "start pending";
break;
case SERVICE_STOP_PENDING:
p = "stop pending";
break;
case SERVICE_RUNNING:
p = "running";
break;
case SERVICE_CONTINUE_PENDING:
p = "continue pending";
break;
case SERVICE_PAUSE_PENDING:
p = "pause pending";
break;
case SERVICE_PAUSED:
p = "paused";
break;
}
printf( "%-16s %-32s %s\n", p, SvcStat[i].lpServiceName, SvcStat[i].lpDisplayName );
}
return 0;
}