Adds NET STOP to net.exe (try 2)
Tim Schwartz
tim at sanityinternet.com
Mon Jun 18 12:48:06 CDT 2007
Previous try did not free allocated memory in all cases. Fixed.
-------------- next part --------------
diff --git a/programs/net/net.c b/programs/net/net.c
index 3a6c39a..0d1892d 100644
--- a/programs/net/net.c
+++ b/programs/net/net.c
@@ -21,6 +21,38 @@
#include <windows.h>
#define NET_START 0001
+#define NET_STOP 0002
+
+static BOOL StopService(SC_HANDLE SCManager, SC_HANDLE serviceHandle)
+{
+ LPENUM_SERVICE_STATUS dependencies = NULL;
+ DWORD buffer_size = 0;
+ DWORD count = 0, counter;
+ BOOL result = 0;
+ SC_HANDLE dependent_serviceHandle;
+ SERVICE_STATUS_PROCESS ssp;
+
+ result = EnumDependentServices(serviceHandle, SERVICE_ACTIVE, dependencies, buffer_size, &buffer_size, &count);
+
+ if(!result && (GetLastError() == ERROR_MORE_DATA))
+ {
+ dependencies = (LPENUM_SERVICE_STATUS)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, buffer_size);
+ if(EnumDependentServices(serviceHandle, SERVICE_ACTIVE, dependencies, buffer_size, &buffer_size, &count))
+ {
+ for(counter = 0; counter < count; counter++)
+ {
+ printf("Stopping dependent service: %s\n", dependencies[counter].lpDisplayName);
+ dependent_serviceHandle = OpenService(SCManager, dependencies[counter].lpServiceName, SC_MANAGER_ALL_ACCESS);
+ if(dependent_serviceHandle) result = StopService(SCManager, dependent_serviceHandle);
+ if(!result) printf("Could not stop service %s\n", dependencies[counter].lpDisplayName);
+ }
+ }
+ }
+
+ if(result) result = ControlService(serviceHandle, SERVICE_CONTROL_STOP, (LPSERVICE_STATUS)&ssp);
+ if(dependencies) HeapFree(GetProcessHeap(), 0, dependencies);
+ return result;
+}
static BOOL net_service(int operation, char *service_name)
{
@@ -57,6 +89,14 @@ static BOOL net_service(int operation, char *service_name)
if(!result) printf("failed to start.\n");
else printf("was started successfully.\n");
break;
+ case NET_STOP:
+ printf("The %s service is stopping.\n", service_display_name);
+ result = StopService(SCManager, serviceHandle);
+
+ printf("The %s service ", service_display_name);
+ if(!result) printf("failed to stop.\n");
+ else printf("was stopped successfully.\n");
+ break;
}
CloseServiceHandle(serviceHandle);
@@ -70,7 +110,7 @@ int main(int argc, char *argv[])
if (argc < 2)
{
printf("The syntax of this command is:\n\n");
- printf("NET [ HELP | START ]\n");
+ printf("NET [ HELP | START | STOP ]\n");
return 1;
}
@@ -79,7 +119,7 @@ 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 NET START\n");
+ printf(" NET HELP NET START NET STOP\n");
}
if(!strcasecmp(argv[1], "start"))
@@ -97,5 +137,20 @@ int main(int argc, char *argv[])
return 0;
}
+ if(!strcasecmp(argv[1], "stop"))
+ {
+ if(argc < 3)
+ {
+ printf("Specify service name to stop.\n");
+ return 1;
+ }
+
+ if(!net_service(NET_STOP, argv[2]))
+ {
+ return 1;
+ }
+ return 0;
+ }
+
return 0;
}
More information about the wine-patches
mailing list