Adds NET STOP to net.exe

Tim Schwartz tim at sanityinternet.com
Mon Jun 18 12:22:09 CDT 2007


-------------- next part --------------
diff --git a/programs/net/net.c b/programs/net/net.c
index 3a6c39a..9da1e1a 100644
--- a/programs/net/net.c
+++ b/programs/net/net.c
@@ -21,6 +21,41 @@
 #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)) return FALSE;
+    
+        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) StopService(SCManager, dependent_serviceHandle);
+            else
+            {
+                printf("Could not stop service %s\n", dependencies[counter].lpDisplayName);
+                return FALSE;
+            }
+        }
+    }
+
+    if(result) result = ControlService(serviceHandle, SERVICE_CONTROL_STOP, (LPSERVICE_STATUS)&ssp);
+    HeapFree(GetProcessHeap(), 0, dependencies);
+    return result;
+}
 
 static BOOL net_service(int operation, char *service_name)
 {
@@ -57,6 +92,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 +113,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 +122,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 +140,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