diff --git a/programs/net/Makefile.in b/programs/net/Makefile.in index 5db7fc0..9037323 100644 --- a/programs/net/Makefile.in +++ b/programs/net/Makefile.in @@ -4,7 +4,7 @@ SRCDIR = @srcdir@ VPATH = @srcdir@ MODULE = net.exe APPMODE = -mconsole -IMPORTS = kernel32 +IMPORTS = kernel32 advapi32 C_SRCS = net.c diff --git a/programs/net/net.c b/programs/net/net.c index f77c820..8703abf 100644 --- a/programs/net/net.c +++ b/programs/net/net.c @@ -18,15 +18,75 @@ #include #include +#include + +#define NET_START 0001 + +static int net_service(int operation, char *service_name) +{ + SC_HANDLE SCManager, serviceHandle; + int result = 0; + DWORD buffer_size = 0; + char *service_display_name = NULL; + + SCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); + if(!SCManager) + { + printf("Couldn't get handle to SCManager.\n"); + return 0; + } + serviceHandle = OpenService(SCManager, service_name, SC_MANAGER_ALL_ACCESS); + if(!serviceHandle) + { + printf("Couldn't get handle to service.\n"); + CloseServiceHandle(SCManager); + return 0; + } + + if(!GetServiceDisplayName(SCManager, service_name, NULL, &buffer_size)) + { + /* Presently, this function returns success (non-zero) */ + /* According to MSDN, calling GetServiceDisplayName with the third parameter null should always return fail. */ + if((GetLastError() == ERROR_INSUFFICIENT_BUFFER) && buffer_size) + { + service_display_name = HeapAlloc(GetProcessHeap(), 0, buffer_size + 1); + if(!GetServiceDisplayName(SCManager, service_name, service_display_name, &buffer_size)) + { + HeapFree(GetProcessHeap(), 0, service_display_name); + service_display_name = HeapAlloc(GetProcessHeap(), 0, strlen(service_name)); + strcpy(service_display_name, service_name); + } + } + } + else + { + service_display_name = HeapAlloc(GetProcessHeap(), 0, strlen(service_name)); + strcpy(service_display_name, service_name); + } + + switch(operation) + { + case NET_START: + printf("The %s service is starting.\n", service_display_name); + result = StartService(serviceHandle,0,NULL); + if(!result) printf("The %s service failed to start.\n", service_display_name); + else printf("The %s service was started successfully.\n", service_display_name); + break; + } + + CloseServiceHandle(serviceHandle); + CloseServiceHandle(SCManager); + HeapFree(GetProcessHeap(), 0, service_display_name); + return result; +} int main(int argc, char *argv[]) { - int ret = 0; if (argc < 2) { printf("The syntax of this command is:\n\n"); - printf("NET [ HELP ]\n"); + printf("NET [ HELP | START ]\n"); return 1; } @@ -35,7 +95,23 @@ int main(int argc, char *argv[]) printf("The syntax of this command is:\n\n"); printf("NET HELP command\n -or-\nNET command /HELP\n\n"); printf(" Commands available are:\n"); - printf(" NET HELP\n"); + printf(" NET HELP NET START\n"); } - return ret; + + if(!strcasecmp(argv[1], "start")) + { + if(argc < 3) + { + printf("Specify service name to start.\n"); + return 1; + } + + if(!net_service(NET_START, argv[2])) + { + return TRUE; + } + return 0; + } + + return 0; }