sc.exe now supports basic starting, stopping, creation and deletion of
services.
Still early days and very bare bones, so not including into build yet
Modified: trunk/reactos/subsys/system/sc/control.c
Modified: trunk/reactos/subsys/system/sc/create.c
Modified: trunk/reactos/subsys/system/sc/delete.c
Modified: trunk/reactos/subsys/system/sc/query.c
Modified: trunk/reactos/subsys/system/sc/sc.c
Modified: trunk/reactos/subsys/system/sc/sc.h
Modified: trunk/reactos/subsys/system/sc/start.c
Modified: trunk/reactos/subsys/system/sc/usage.c
_____
Modified: trunk/reactos/subsys/system/sc/control.c
--- trunk/reactos/subsys/system/sc/control.c 2005-11-04 16:49:37 UTC
(rev 18999)
+++ trunk/reactos/subsys/system/sc/control.c 2005-11-04 18:19:09 UTC
(rev 19000)
@@ -16,14 +16,26 @@
* control, continue, interrogate, pause, stop
*/
-BOOL Control(DWORD Control, TCHAR **Args)
+BOOL Control(DWORD Control, LPCTSTR ServiceName, LPCTSTR *Args)
{
SC_HANDLE hSc;
SERVICE_STATUS Status;
- LPCTSTR ServiceName = *Args;
+
+ /* testing */
+ _tprintf(_T("service to control - %s\n\n"), ServiceName);
+ _tprintf(_T("command - %lu\n\n"), Control);
+ _tprintf(_T("Arguments :\n"));
+ while (*Args)
+ {
+ printf("%s\n", *Args);
+ Args++;
+ }
- hSc = OpenService(hSCManager, ServiceName, DELETE);
+ hSc = OpenService(hSCManager, ServiceName,
+ SERVICE_INTERROGATE | SERVICE_PAUSE_CONTINUE |
+ SERVICE_STOP | SERVICE_USER_DEFINED_CONTROL |
+ SERVICE_QUERY_STATUS);
if (hSc == NULL)
{
@@ -40,6 +52,9 @@
}
CloseServiceHandle(hSc);
+
+ /* print the status information */
+
return TRUE;
}
_____
Modified: trunk/reactos/subsys/system/sc/create.c
--- trunk/reactos/subsys/system/sc/create.c 2005-11-04 16:49:37 UTC
(rev 18999)
+++ trunk/reactos/subsys/system/sc/create.c 2005-11-04 18:19:09 UTC
(rev 19000)
@@ -11,13 +11,15 @@
#include "sc.h"
-BOOL Create(TCHAR **Args)
+BOOL Create(LPCTSTR ServiceName, LPCTSTR *ServiceArgs)
{
SC_HANDLE hSc;
- LPCTSTR ServiceName = *Args;
- LPCTSTR BinaryPathName = *++Args;
- LPCTSTR *Options = (LPCTSTR *)++Args;
+ LPCTSTR BinaryPathName = *++ServiceArgs;
+ LPCTSTR *Options = ++ServiceArgs;
+ if ((! ServiceName) || (! BinaryPathName))
+ return CreateUsage();
+
/* testing */
printf("service to create - %s\n", ServiceName);
printf("Binary path - %s\n", BinaryPathName);
@@ -28,7 +30,6 @@
Options++;
}
-
hSc = CreateService(hSCManager,
ServiceName,
ServiceName,
_____
Modified: trunk/reactos/subsys/system/sc/delete.c
--- trunk/reactos/subsys/system/sc/delete.c 2005-11-04 16:49:37 UTC
(rev 18999)
+++ trunk/reactos/subsys/system/sc/delete.c 2005-11-04 18:19:09 UTC
(rev 19000)
@@ -11,10 +11,9 @@
#include "sc.h"
-BOOL Delete(TCHAR **Args)
+BOOL Delete(LPCTSTR ServiceName)
{
SC_HANDLE hSc;
- LPCTSTR ServiceName = *Args;
/* testing */
printf("service to delete - %s\n\n", ServiceName);
_____
Modified: trunk/reactos/subsys/system/sc/query.c
--- trunk/reactos/subsys/system/sc/query.c 2005-11-04 16:49:37 UTC
(rev 18999)
+++ trunk/reactos/subsys/system/sc/query.c 2005-11-04 18:19:09 UTC
(rev 19000)
@@ -12,32 +12,31 @@
#include "sc.h"
/* local function decs */
-VOID PrintService(ENUM_SERVICE_STATUS_PROCESS *pSStatus, BOOL
bExtended);
+VOID PrintService(BOOL bExtended);
INT EnumServices(DWORD ServiceType, DWORD ServiceState);
/* global variables */
static ENUM_SERVICE_STATUS_PROCESS *pServiceStatus = NULL;
-BOOL
-Query(TCHAR **Args, BOOL bExtended)
+
+BOOL Query(LPCTSTR ServiceName, LPCTSTR *ServiceArgs, BOOL bExtended)
{
- LPCTSTR ServiceName = *Args;
-
- if (! *Args)
+ if (! ServiceName)
{
- printf("Service name %s\n", ServiceName); // test
+ /* display all running services and drivers */
+ _tprintf(_T("No service name, displaying all services\n")); //
test
/* get default values */
EnumServices(SERVICE_WIN32, SERVICE_ACTIVE);
/* print default values */
- PrintService(pServiceStatus, bExtended);
+ PrintService(bExtended);
}
-
- if (_tcsicmp(Args[0], _T("type=")) == 0)
+ else if (_tcsicmp(ServiceName, _T("type=")) == 0)
{
- TCHAR *Type = *++Args;
+ LPCTSTR Type = *ServiceArgs;
+
_tprintf(_T("got type\narg = %s\n"), Type); // test
if (_tcsicmp(Type, _T("driver")) == 0)
EnumServices(SERVICE_DRIVER, SERVICE_STATE_ALL);
@@ -51,11 +50,11 @@
_tprintf(_T("Must be \"driver\" or \"service\" or
\"all\"\n"));
}
- PrintService(pServiceStatus, bExtended);
+ PrintService(bExtended);
}
- else if(_tcsicmp(Args[0], _T("state=")) == 0)
+ else if(_tcsicmp(ServiceName, _T("state=")) == 0)
{
- TCHAR *State = *++Args;
+ LPCTSTR State = *ServiceArgs;
if (_tcsicmp(State, _T("active")) == 0)
EnumServices(SERVICE_DRIVER|SERVICE_WIN32, SERVICE_ACTIVE);
@@ -69,27 +68,27 @@
_tprintf(_T("Must be \"active\" or \"inactive\" or
\"all\"\n"));
}
- PrintService(pServiceStatus, bExtended);
+ PrintService(bExtended);
}
+/*
+ else if(_tcsicmp(ServiceName, _T("bufsize=")))
+
+ else if(_tcsicmp(ServiceName, _T("ri=")))
+
+ else if(_tcsicmp(ServiceName, _T("group=")))
+*/
else
{
- printf("no args\n"); // test
+ /* print only the service requested */
+ printf("Service name %s\n", ServiceName); // test
+
/* get default values */
EnumServices(SERVICE_WIN32, SERVICE_ACTIVE);
/* print default values */
- PrintService(pServiceStatus, bExtended);
+ PrintService(bExtended);
}
-/*
- else if(_tcsicmp(Args[0], _T("bufsize=")))
-
- else if(_tcsicmp(Args[0], _T("ri=")))
-
- else if(_tcsicmp(Args[0], _T("group=")))
-*/
-
-
}
@@ -100,6 +99,8 @@
DWORD BytesNeeded = 0;
DWORD NumServices = 0;
DWORD ResumeHandle = 0;
+
+// hSc = OpenService(hSCManager, ServiceName, SERVICE_QUERY_STATUS);
/* determine required buffer size */
if (! EnumServicesStatusEx(hSCManager,
@@ -147,8 +148,7 @@
VOID
-PrintService(ENUM_SERVICE_STATUS_PROCESS *pServiceStatus,
- BOOL bExtended)
+PrintService(BOOL bExtended)
{
_tprintf(_T("SERVICE_NAME: %s\n"), pServiceStatus->lpServiceName);
_tprintf(_T("DISPLAY_NAME: %s\n"), pServiceStatus->lpDisplayName);
_____
Modified: trunk/reactos/subsys/system/sc/sc.c
--- trunk/reactos/subsys/system/sc/sc.c 2005-11-04 16:49:37 UTC (rev
18999)
+++ trunk/reactos/subsys/system/sc/sc.c 2005-11-04 18:19:09 UTC (rev
19000)
@@ -44,8 +44,14 @@
}
-INT ScControl(LPTSTR MachineName, LPCTSTR Command, TCHAR **Args)
+INT ScControl(LPTSTR MachineName, // remote machine name
+ LPCTSTR Command, // sc command
+ LPCTSTR ServiceName, // name of service
+ LPCTSTR *ServiceArgs, // any options
+ DWORD ArgCount) // argument counter
{
+ /* count trailing arguments */
+ ArgCount -= 3;
if (MachineName)
{
@@ -61,66 +67,66 @@
return -1;
}
-
+ /* emurate command */
if (_tcsicmp(Command, _T("query")) == 0)
- Query(Args, FALSE);
+ Query(ServiceName, ServiceArgs, FALSE);
else if (_tcsicmp(Command, _T("queryex")) == 0)
- Query(Args, TRUE);
+ Query(ServiceName, ServiceArgs, TRUE);
else if (_tcsicmp(Command, _T("start")) == 0)
{
- if (*Args)
- Start(0, Args);
+ if (ServiceName)
+ Start(ServiceName, ServiceArgs, ArgCount);
else
StartUsage();
}
else if (_tcsicmp(Command, _T("pause")) == 0)
{
- if (*Args)
- Control(SERVICE_CONTROL_PAUSE, Args);
+ if (ServiceName)
+ Control(SERVICE_CONTROL_PAUSE, ServiceName, ServiceArgs);
else
PauseUsage();
}
else if (_tcsicmp(Command, _T("interrogate")) == 0)
{
- if (*Args)
- Control(SERVICE_CONTROL_INTERROGATE, Args);
+ if (ServiceName)
+ Control(SERVICE_CONTROL_INTERROGATE, ServiceName,
ServiceArgs);
else
InterrogateUsage();
}
else if (_tcsicmp(Command, _T("stop")) == 0)
{
- if (*Args)
- Control(SERVICE_CONTROL_STOP, Args);
+ if (ServiceName)
+ Control(SERVICE_CONTROL_STOP, ServiceName, ServiceArgs);
else
StopUsage();
}
else if (_tcsicmp(Command, _T("continue")) == 0)
{
- if (*Args)
- Control(SERVICE_CONTROL_CONTINUE, Args);
+ if (ServiceName)
+ Control(SERVICE_CONTROL_CONTINUE, ServiceName,
ServiceArgs);
else
ContinueUsage();
}
else if (_tcsicmp(Command, _T("delete")) == 0)
{
- if (*Args)
- Delete(Args);
+ if (ServiceName)
+ Delete(ServiceName);
else
DeleteUsage();
}
else if (_tcsicmp(Command, _T("create")) == 0)
{
- if (*Args)
- Create(Args);
+ if (*ServiceArgs)
+ Create(ServiceName, ServiceArgs);
else
CreateUsage();
}
else if (_tcsicmp(Command, _T("control")) == 0)
{
- if (*Args)
- Control((DWORD)NULL, ++Args);
+ if (ServiceName)
+ Control((DWORD)NULL, ServiceName, ServiceArgs);
else
ContinueUsage();
}
@@ -130,10 +136,9 @@
int _tmain(DWORD argc, LPCTSTR argv[])
{
- LPTSTR MachineName = NULL; // remote machine
- LPCTSTR Command = argv[1]; // sc command
- TCHAR **Args = NULL; // rest of args
-
+ LPTSTR MachineName = NULL; // remote machine
+ LPCTSTR Command = NULL; // sc command
+ LPCTSTR ServiceName = NULL; // Name of service
if (argc < 2)
return MainUsage();
@@ -146,13 +151,16 @@
_tcscpy(MachineName, argv[1]);
Command = argv[2];
- Args = (TCHAR **)&argv[3];
- return ScControl(MachineName, Command, Args);
+ if (argc > 3)
+ ServiceName = argv[3];
+ return ScControl(MachineName, Command, ServiceName, &argv[4],
argc);
}
else
{
- Args = (TCHAR **)&argv[2];
- return ScControl(MachineName, Command, Args);
+ Command = argv[1];
+ if (argc > 2)
+ ServiceName = argv[2];
+ return ScControl(MachineName, Command, ServiceName, &argv[3],
argc);
}
return MainUsage();
_____
Modified: trunk/reactos/subsys/system/sc/sc.h
--- trunk/reactos/subsys/system/sc/sc.h 2005-11-04 16:49:37 UTC (rev
18999)
+++ trunk/reactos/subsys/system/sc/sc.h 2005-11-04 18:19:09 UTC (rev
19000)
@@ -7,11 +7,11 @@
//#define DBG
/* control functions */
-BOOL Query(TCHAR **Args, BOOL bExtended);
-BOOL Start(INT ArgCount, TCHAR **Args);
-BOOL Create(TCHAR **Args);
-BOOL Delete(TCHAR **Args);
-BOOL Control(DWORD Control, TCHAR **Args);
+BOOL Query(LPCTSTR ServiceName, LPCTSTR *ServiceArgs, BOOL bExtended);
+BOOL Start(LPCTSTR ServiceName, LPCTSTR *ServiceArgs, INT ArgCount);
+BOOL Create(LPCTSTR ServiceName, LPCTSTR *ServiceArgs);
+BOOL Delete(LPCTSTR ServiceName);
+BOOL Control(DWORD Control, LPCTSTR ServiceName, LPCTSTR *Args);
/* print and error functions */
DWORD ReportLastError(VOID);
@@ -25,3 +25,5 @@
INT StopUsage(VOID);
INT ConfigUsage(VOID);
INT DescriptionUsage(VOID);
+INT DeleteUsage(VOID);
+INT CreateUsage(VOID);
_____
Modified: trunk/reactos/subsys/system/sc/start.c
--- trunk/reactos/subsys/system/sc/start.c 2005-11-04 16:49:37 UTC
(rev 18999)
+++ trunk/reactos/subsys/system/sc/start.c 2005-11-04 18:19:09 UTC
(rev 19000)
@@ -11,14 +11,11 @@
#include "sc.h"
-BOOL Start(INT ArgCount, TCHAR **Args)
+BOOL Start(LPCTSTR ServiceName, LPCTSTR *ServiceArgs, INT ArgCount)
{
SC_HANDLE hSc;
SERVICE_STATUS_PROCESS ServiceStatus;
- LPCTSTR ServiceName = *Args++;
- LPCTSTR *ServiceArgs = (LPCTSTR *)Args;
DWORD BytesNeeded;
-
/* testing */
_tprintf(_T("service to start - %s\n\n"), ServiceName);
@@ -28,8 +25,7 @@
printf("%s\n", *ServiceArgs);
ServiceArgs++;
}
- if (! *ServiceArgs)
- ServiceArgs = NULL;
+
/* get a handle to the service requested for starting */
hSc = OpenService(hSCManager, ServiceName, SERVICE_ALL_ACCESS);
_____
Modified: trunk/reactos/subsys/system/sc/usage.c
--- trunk/reactos/subsys/system/sc/usage.c 2005-11-04 16:49:37 UTC
(rev 18999)
+++ trunk/reactos/subsys/system/sc/usage.c 2005-11-04 18:19:09 UTC
(rev 19000)
@@ -142,13 +142,25 @@
INT CreateUsage(VOID)
{
- _tprintf(_T("DESCRIPTION:\n")
- _T("Creates a service entry in the registry and Service
Database.\n")
- _T(" If the service is running, or another
process has an\n")
- _T(" open handle to the service, the service is
simply marked\n")
- _T(" for deletion.\n")
- _T("USAGE:\n")
- _T(" sc <server> delete [service name]\n"));
+ _tprintf(_T("Creates a service entry in the registry and Service
Database.\n")
+ _T("SYNTAX:\n")
+ _T("sc create [service name] [binPath= ] <option1>
<option2>...\n")
+ _T("CREATE OPTIONS:\n")
+ _T("NOTE: The option name includes the equal sign.\n")
+ _T(" type= <own|share|interact|kernel|filesys|rec>\n")
+ _T(" (default = own)\n")
+ _T(" start= <boot|system|auto|demand|disabled>\n")
+ _T(" (default = demand)\n")
+ _T(" error= <normal|severe|critical|ignore>\n")
+ _T(" (default = normal)\n")
+ _T(" binPath= <BinaryPathName>\n")
+ _T(" group= <LoadOrderGroup>\n")
+ _T(" tag= <yes|no>\n")
+ _T(" depend= <Dependencies(separated by / (forward
slash))>\n")
+ _T(" obj= <AccountName|ObjectName>\n")
+ _T(" (default = LocalSystem)\n")
+ _T(" DisplayName= <display name>\n")
+ _T(" password= <password>\n"));
return 0;
}