[NET] CORE-6413
authorEric Kohl <eric.kohl@reactos.org>
Mon, 24 Sep 2012 12:37:12 +0000 (12:37 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Mon, 24 Sep 2012 12:37:12 +0000 (12:37 +0000)
- Convert the application to Unicode.
- Implement "net start" and "net stop" commands that use the service manager APIs.

svn path=/trunk/; revision=57375

reactos/base/applications/network/net/CMakeLists.txt
reactos/base/applications/network/net/cmdStop.c
reactos/base/applications/network/net/cmdstart.c
reactos/base/applications/network/net/help.c
reactos/base/applications/network/net/main.c
reactos/base/applications/network/net/net.h
reactos/base/applications/network/net/process.c [deleted file]

index 668c18a..279abd3 100644 (file)
@@ -5,12 +5,11 @@ list(APPEND SOURCE
     main.c
     cmdstart.c
     cmdStop.c
-    help.c
-    process.c)
+    help.c)
 
 add_executable(net ${SOURCE})
 
-set_module_type(net win32cui)
+set_module_type(net win32cui UNICODE)
 add_pch(net net.h)
-add_importlibs(net ws2_32 msvcrt kernel32)
+add_importlibs(net advapi32 msvcrt kernel32)
 add_cd_file(TARGET net DESTINATION reactos/system32 FOR all)
index 87fb83e..179bc31 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS net command
 
 #include "net.h"
 
-INT cmdStop(INT argc, CHAR **argv )
+INT cmdStop(INT argc, WCHAR **argv)
 {
-   char *string;
-   long size = 100*sizeof(char);
-
-   if (argc>4)
-   {
-         help();
-         return 0;
-   }
-
-   if (argc==2)
-   {
-      string = (char *) malloc(size);
-      if (string != NULL)
-      {
-         sprintf(string,"rpcclient -c \"service enum\"");
-         system(string);
-         free(string);
-      }
-      return 0;
-   }
-
-   if (argc==3)
-   {
-         stop_service(argv[1]);
-      return 0;
-   }
-
-   return 0;
+    SC_HANDLE hManager = NULL;
+    SC_HANDLE hService = NULL;
+    SERVICE_STATUS ServiceStatus;
+    DWORD dwError = ERROR_SUCCESS;
+    INT nError = 0;
+
+    if (argc != 3)
+    {
+        /* FIXME: Print usage message! */
+        printf("Usage: NET STOP <Service name>\n");
+        return 1;
+    }
+
+    hManager = OpenSCManagerW(NULL,
+                              SERVICES_ACTIVE_DATABASE,
+                              SC_MANAGER_ENUMERATE_SERVICE);
+    if (hManager == NULL)
+    {
+printf("1\n");
+        dwError = GetLastError();
+        nError = 1;
+        goto done;
+    }
+
+    hService = OpenServiceW(hManager,
+                            argv[2],
+                            SERVICE_STOP);
+    if (hService == NULL)
+    {
+printf("2\n");
+        dwError = GetLastError();
+        nError = 1;
+        goto done;
+    }
+
+    if (!ControlService(hService, SERVICE_CONTROL_STOP, &ServiceStatus))
+    {
+printf("3\n");
+        dwError = GetLastError();
+        nError = 1;
+        goto done;
+    }
+
+done:
+    if (hService != NULL)
+        CloseServiceHandle(hService);
+
+    if (hManager != NULL)
+        CloseServiceHandle(hManager);
+
+    if (dwError != ERROR_SUCCESS)
+    {
+        /* FIXME: Print proper error message */
+        printf("Error: %lu\n", dwError);
+    }
+
+    return nError;
 }
 
 
-INT stop_service(CHAR *service)
-{
-
-  CHAR *srvlst;
-  LONG pos=0;
-  LONG old_pos=0;
-  LONG row_size=0;
-  LONG size=0;
-
-  CHAR *row; /* we assume display name can max be 20 row and each row is 80 char */
-
-
-  /* Get the size for  srvlst */
-  myCreateProcessStartGetSzie("rpcclient -c \"service enum\"", &size);
-  if (size==0)
-  {
-    return 0;
-  }
-
-  srvlst = (CHAR *) malloc(size);
-  if (srvlst == NULL)
-  {
-         return 0;
-  }
-  /* Get the server list */
-  myCreateProcessStart("rpcclient -c \"service enum\"", srvlst, size);
-
-
-  /* scan after display name */
-  while (pos<size)
-  {
-               old_pos = pos;
-
-               if (1 == row_scanner_service(srvlst, &pos, size, service, NULL))
-               {
-                 row_size = (pos - old_pos)+32; /* 32 buffer for command */
-                 pos = old_pos;
-                 row = (CHAR *) malloc(row_size*sizeof(CHAR));
-                 if (row == NULL)
-             {
-                   free(srvlst);
-                   return 0;
-                 }
-                 memset(row,0,row_size*sizeof(CHAR));
-                 if (1 == row_scanner_service(srvlst, &pos, size, service, &row[27]))
-                 {
-                    /*
-                           display name found
-                       now we can start the service
-                         */
-
-                         memcpy(row,"rpcclient -c \"service stop %s\"\"",27*sizeof(CHAR));
-                         row_size = strlen(row);
-                         row[row_size] = '\"';
-              system(row);
-                 }
-                 free(row);
-               }
-  }
-
-  free(srvlst);
-  return 0;
-}
index 400f9d2..786be03 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS net command
 
 #include "net.h"
 
-INT cmdStart(INT argc, CHAR **argv )
+/* Enumerate all running services */
+static
+INT
+EnumerateRunningServices(VOID)
 {
-   char *string;
-   long size = 100*sizeof(char);
-
-   if (argc>4)
-   {
-         help();
-         return 0;
-   }
-
-   if (argc==2)
-   {
-      string = (char *) malloc(size);
-      if (string != NULL)
-      {
-         sprintf(string,"rpcclient -c \"service enum\"");
-         system(string);
-         free(string);
-      }
-      return 0;
-   }
-
-   if (argc==3)
-   {
-         start_service(argv[1]);
-      return 0;
-   }
-
-   return 0;
+    SC_HANDLE hManager = NULL;
+    SC_HANDLE hService = NULL;
+    DWORD dwBufferSize = 0;
+    DWORD dwServiceCount;
+    DWORD dwResumeHandle = 0;
+    LPENUM_SERVICE_STATUS lpServiceBuffer = NULL;
+    INT i;
+    INT nError = 0;
+    DWORD dwError = ERROR_SUCCESS;
+
+    hManager = OpenSCManagerW(NULL,
+                              SERVICES_ACTIVE_DATABASE,
+                              SC_MANAGER_ENUMERATE_SERVICE);
+    if (hManager == NULL)
+    {
+        dwError = GetLastError();
+        nError = 1;
+        goto done;
+    }
+
+    EnumServicesStatusW(hManager,
+                        SERVICE_WIN32,
+                        SERVICE_ACTIVE,
+                        NULL,
+                        0,
+                        &dwBufferSize,
+                        &dwServiceCount,
+                        &dwResumeHandle);
+
+    if (dwBufferSize != 0)
+    {
+        lpServiceBuffer = HeapAlloc(GetProcessHeap(), 0, dwBufferSize);
+        if (lpServiceBuffer != NULL)
+        {
+            if (EnumServicesStatusW(hManager,
+                                    SERVICE_WIN32,
+                                    SERVICE_ACTIVE,
+                                    lpServiceBuffer,
+                                    dwBufferSize,
+                                    &dwBufferSize,
+                                    &dwServiceCount,
+                                    &dwResumeHandle))
+            {
+                printf("The following services hav been started:\n\n");
+
+                for (i = 0; i < dwServiceCount; i++)
+                {
+                    printf("  %S\n", lpServiceBuffer[i].lpDisplayName);
+                }
+            }
+
+            HeapFree(GetProcessHeap(), 0, lpServiceBuffer);
+        }
+    }
+
+done:
+    if (hService != NULL)
+        CloseServiceHandle(hService);
+
+    if (hManager != NULL)
+        CloseServiceHandle(hManager);
+
+     if (dwError != ERROR_SUCCESS)
+    {
+        /* FIXME: Print proper error message */
+        printf("Error: %lu\n", dwError);
+    }
+
+    return nError;
 }
 
 
-INT start_service(CHAR *service)
+/* Start the service argv[2] */
+static
+INT
+StartOneService(INT argc, WCHAR **argv)
 {
+    SC_HANDLE hManager = NULL;
+    SC_HANDLE hService = NULL;
+    LPCWSTR *lpArgVectors = NULL;
+    DWORD dwError = ERROR_SUCCESS;
+    INT nError = 0;
+    INT i;
+
+    hManager = OpenSCManagerW(NULL,
+                              SERVICES_ACTIVE_DATABASE,
+                              SC_MANAGER_ENUMERATE_SERVICE);
+    if (hManager == NULL)
+    {
+        dwError = GetLastError();
+        nError = 1;
+        goto done;
+    }
+
+    hService = OpenServiceW(hManager,
+                            argv[2],
+                            SERVICE_START);
+    if (hService == NULL)
+    {
+        dwError = GetLastError();
+        nError = 1;
+        goto done;
+    }
+
+    lpArgVectors = HeapAlloc(GetProcessHeap(),
+                             0,
+                             (argc - 2) * sizeof(LPCWSTR));
+    if (lpArgVectors == NULL)
+    {
+        dwError = GetLastError();
+        nError = 1;
+        goto done;
+    }
+
+    for (i = 2; i < argc; i++)
+    {
+        lpArgVectors[i] = argv[i + 2];
+    }
+
+    if (!StartServiceW(hService,
+                       (DWORD)argc - 2,
+                       lpArgVectors))
+    {
+        dwError = GetLastError();
+        nError = 1;
+    }
+
+done:
+    if (lpArgVectors != NULL)
+        HeapFree(GetProcessHeap(), 0, lpArgVectors);
+
+    if (hService != NULL)
+        CloseServiceHandle(hService);
+
+    if (hManager != NULL)
+        CloseServiceHandle(hManager);
+
+    if (dwError != ERROR_SUCCESS)
+    {
+        /* FIXME: Print proper error message */
+        printf("Error: %lu\n", dwError);
+    }
+
+    return nError;
+}
 
-  CHAR *srvlst;
-  LONG pos=0;
-  LONG old_pos=0;
-  LONG row_size=0;
-  LONG size=0;
-
-  CHAR *row; /* we assume display name can max be 20 row and each row is 80 char */
-
-
-  /* Get the size for  srvlst */
-  myCreateProcessStartGetSzie("rpcclient -c \"service enum\"", &size);
-  if (size==0)
-  {
-    return 0;
-  }
-
-  srvlst = (CHAR *) malloc(size);
-  if (srvlst == NULL)
-  {
-         return 0;
-  }
-  /* Get the server list */
-  myCreateProcessStart("rpcclient -c \"service enum\"", srvlst, size);
-
-
-  /* scan after display name */
-  while (pos<size)
-  {
-               old_pos = pos;
-
-               if (1 == row_scanner_service(srvlst, &pos, size, service, NULL))
-               {
-                 row_size = (pos - old_pos)+32; /* 32 buffer for command */
-                 pos = old_pos;
-                 row = (CHAR *) malloc(row_size*sizeof(CHAR));
-                 if (row == NULL)
-             {
-                   free(srvlst);
-                   return 0;
-                 }
-                 memset(row,0,row_size*sizeof(CHAR));
-                 if (1 == row_scanner_service(srvlst, &pos, size, service, &row[28]))
-                 {
-                    /*
-                           display name found
-                       now we can start the service
-                         */
-
-                         memcpy(row,"rpcclient -c \"service start %s\"\"",28*sizeof(CHAR));
-                         row_size = strlen(row);
-                         row[row_size] = '\"';
-              system(row);
-                 }
-                 free(row);
-               }
-  }
-
-  free(srvlst);
-  return 0;
+
+INT
+cmdStart(INT argc, WCHAR **argv)
+{
+    INT nError = 0;
+
+    if (argc == 2)
+    {
+        nError = EnumerateRunningServices();
+    }
+    else
+    {
+        nError = StartOneService(argc, argv);
+    }
+
+    return nError;
 }
index ae32525..5b9d0c5 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS net command
 
 #include "net.h"
 
-INT cmdHelp(INT argc, CHAR **argv)
+INT cmdHelp(INT argc, WCHAR **argv)
 {
-    if (argc>3)
+    if (argc > 3)
     {
       return 0;
     }
 
-    if (strcmp(argv[0],"ACCOUNTS")==0)
+    if (_wcsicmp(argv[2],L"ACCOUNTS")==0)
     {
         puts("ACCOUNTS");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"COMPUTER")==0)
+    if (_wcsicmp(argv[2],L"COMPUTER")==0)
     {
         puts("COMPUTER");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"CONFIG")==0)
+    if (_wcsicmp(argv[2],L"CONFIG")==0)
     {
         puts("CONFIG");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"CONTINUE")==0)
+    if (_wcsicmp(argv[2],L"CONTINUE")==0)
     {
         puts("CONTINUE");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"FILE")==0)
+    if (_wcsicmp(argv[2],L"FILE")==0)
     {
         puts("FILE");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"GROUP")==0)
+    if (_wcsicmp(argv[2],L"GROUP")==0)
     {
         puts("GROUP");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"HELP")==0)
+    if (_wcsicmp(argv[2],L"HELP")==0)
     {
         puts("HELP");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"HELPMSG")==0)
+    if (_wcsicmp(argv[2],L"HELPMSG")==0)
     {
         puts("HELPMSG");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"LOCALGROUP")==0)
+    if (_wcsicmp(argv[2],L"LOCALGROUP")==0)
     {
         puts("LOCALGROUP");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"NAME")==0)
+    if (_wcsicmp(argv[2],L"NAME")==0)
     {
         puts("NAME");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"PRINT")==0)
+    if (_wcsicmp(argv[2],L"PRINT")==0)
     {
         puts("PRINT");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"SEND")==0)
+    if (_wcsicmp(argv[2],L"SEND")==0)
     {
         puts("SEND");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"SESSION")==0)
+    if (_wcsicmp(argv[2],L"SESSION")==0)
     {
         puts("SESSION");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"SHARE")==0)
+    if (_wcsicmp(argv[2],L"SHARE")==0)
     {
         puts("SHARE");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"START")==0)
+    if (_wcsicmp(argv[2],L"START")==0)
     {
         puts("START");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"STATISTICS")==0)
+    if (_wcsicmp(argv[2],L"STATISTICS")==0)
     {
         puts("STATISTICS");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"STOP")==0)
+    if (_wcsicmp(argv[2],L"STOP")==0)
     {
         puts("STOP");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"TIME")==0)
+    if (_wcsicmp(argv[2],L"TIME")==0)
     {
         puts("TIME");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"USE")==0)
+    if (_wcsicmp(argv[2],L"USE")==0)
     {
         puts("USE");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"USER")==0)
+    if (_wcsicmp(argv[2],L"USER")==0)
     {
         puts("USER");
         puts("help text");
         return 0;
     }
 
-    if (strcmp(argv[0],"VIEW")==0)
+    if (_wcsicmp(argv[2],L"VIEW")==0)
     {
         puts("VIEW");
         puts("help text");
@@ -168,7 +167,8 @@ INT cmdHelp(INT argc, CHAR **argv)
     return 0;
 }
 
-void help()
+
+VOID help(VOID)
 {
     puts("NET ACCOUNTS");
     puts("NET COMPUTER");
index f8adf73..4fe3756 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS net command
 
 #include "net.h"
 
-
-
-int main(int argc, char **argv)
+typedef struct _COMMAND
 {
-    if (argc<2)
-       {
-      help();
-      return 1;
-       }
+    WCHAR *name;
+    INT (*func)(INT, WCHAR**);
+//    VOID (*help)(INT, WCHAR**);
+} COMMAND, *PCOMMAND;
 
-    if (_stricmp(argv[1],"ACCOUNTS")==0)
-    {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"COMPUTER")==0)
-    {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"CONFIG")==0)
-    {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"CONTINUE")==0)
-    {
-               return unimplemented();
-    }
+COMMAND cmds[] =
+{
+    {L"accounts",   unimplemented},
+    {L"computer",   unimplemented},
+    {L"config",     unimplemented},
+    {L"continue",   unimplemented},
+    {L"file",       unimplemented},
+    {L"group",      unimplemented},
+    {L"help",       cmdHelp},
+    {L"helpmsg",    unimplemented},
+    {L"localgroup", unimplemented},
+    {L"name",       unimplemented},
+    {L"print",      unimplemented},
+    {L"send",       unimplemented},
+    {L"session",    unimplemented},
+    {L"share",      unimplemented},
+    {L"start",      cmdStart},
+    {L"statistics", unimplemented},
+    {L"stop",       cmdStop},
+    {L"time",       unimplemented},
+    {L"use",        unimplemented},
+    {L"user",       unimplemented},
+    {L"view",       unimplemented},
+
+};
+
+
+int wmain(int argc, WCHAR **argv)
+{
+    PCOMMAND cmdptr;
 
-    if (_stricmp(argv[1],"FILE")==0)
-    {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"GROUP")==0)
-    {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"HELP")==0)
-    {
-        return cmdHelp(argc,&argv[1]);
-    }
-    if (_stricmp(argv[1],"HELPMSG")==0)
-    {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"LOCALGROUP")==0)
-    {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"NAME")==0)
-    {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"PRINT")==0)
+    if (argc < 2)
     {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"SEND")==0)
-    {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"SESSION")==0)
-    {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"SHARE")==0)
-    {
-               return unimplemented();
+        help();
+        return 1;
     }
 
-    if (_stricmp(argv[1],"START")==0)
-    {
-       return cmdStart(argc, &argv[1]);
-    }
-    if (_stricmp(argv[1],"STATISTICS")==0)
+    /* Scan the command table */
+    for (cmdptr = cmds; cmdptr->name; cmdptr++)
     {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"STOP")==0)
-    {
-               return cmdStop(argc, &argv[1]);
-    }
-    if (_stricmp(argv[1],"TIME")==0)
-    {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"USE")==0)
-    {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"USER")==0)
-    {
-               return unimplemented();
-    }
-    if (_stricmp(argv[1],"VIEW")==0)
-    {
-               return unimplemented();
+        if (_wcsicmp(argv[1], cmdptr->name) == 0)
+        {
+            return cmdptr->func(argc, argv);
+        }
     }
 
     help();
-       return 1;
+
+    return 1;
 }
 
 
-int unimplemented()
+INT unimplemented(INT argc, WCHAR **argv)
 {
-       puts("This command is not implemented yet");
-       return 1;
+    puts("This command is not implemented yet");
+    return 1;
 }
 
 
index 594bbb8..4120d9a 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS net command 
 #include <string.h>
 #include <stdlib.h>
 #include <windows.h>
+#include <winsvc.h>
 
-void help(void);
-int unimplemented(void);
-
-
-INT cmdHelp(INT argc, CHAR **argv);
-
-INT cmdStart(INT argc, CHAR **argv );
-INT start_service(CHAR *service);
-
-INT cmdStop(INT argc, CHAR **argv );
-INT stop_service(CHAR *service);
+VOID help(VOID);
+INT unimplemented(INT argc, WCHAR **argv);
 
-/* Control and start rpcclient */
-BOOL myCreateProcessStartGetSzie(CHAR *cmdline, LONG *size);
-BOOL myCreateProcessStart(CHAR *cmdline, CHAR *srvlst, LONG size);
-BOOL myCreateProcess(HANDLE hChildStdoutWr, HANDLE hChildStdinRd, CHAR *cmdline);
-LONG ReadPipe(HANDLE hStdoutWr, HANDLE hStdoutRd, CHAR *srvlst, LONG size);
-LONG ReadPipeSize(HANDLE hStdoutWr, HANDLE hStdoutRd); 
-INT row_scanner_service(CHAR *buffer, LONG* pos, LONG size, CHAR *name,CHAR *save);
 
+INT cmdHelp(INT argc, WCHAR **argv);
+INT cmdStart(INT argc, WCHAR **argv);
+INT cmdStop(INT argc, WCHAR **argv);
diff --git a/reactos/base/applications/network/net/process.c b/reactos/base/applications/network/net/process.c
deleted file mode 100644 (file)
index 4ce29b2..0000000
+++ /dev/null
@@ -1,229 +0,0 @@
-
-/*
- * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS net command
- * FILE:
- * PURPOSE:
- *
- * PROGRAMMERS:     Magnus Olsen (greatlord@reactos.org)
- */
-
-#include "net.h"
-
-BOOL myCreateProcessStartGetSzie(CHAR *cmdline, LONG *size)
-{
-    HANDLE hChildStdinRd;
-       HANDLE hChildStdinWr;
-       HANDLE hChildStdoutRd;
-       HANDLE hChildStdoutWr;
-       SECURITY_ATTRIBUTES saAttr;
-
-       saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
-    saAttr.bInheritHandle = TRUE;
-    saAttr.lpSecurityDescriptor = NULL;
-
-    if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0))
-    {
-        return FALSE;
-    }
-
-    if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0))
-    {
-        return FALSE;
-    }
-
-    myCreateProcess(hChildStdoutWr, hChildStdinRd,"rpcclient -c \"service enum\"");
-    *size = ReadPipeSize(hChildStdoutWr, hChildStdoutRd);
-       return TRUE;
-}
-
-BOOL myCreateProcessStart(CHAR *cmdline, CHAR *srvlst, LONG size)
-{
-    HANDLE hChildStdinRd;
-       HANDLE hChildStdinWr;
-       HANDLE hChildStdoutRd;
-       HANDLE hChildStdoutWr;
-       SECURITY_ATTRIBUTES saAttr;
-
-       saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
-    saAttr.bInheritHandle = TRUE;
-    saAttr.lpSecurityDescriptor = NULL;
-
-    if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0))
-    {
-        return FALSE;
-    }
-
-    if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0))
-    {
-        return FALSE;
-    }
-
-    myCreateProcess(hChildStdoutWr, hChildStdinRd,"rpcclient -c \"service enum\"");
-
-       return ReadPipe(hChildStdoutWr, hChildStdoutRd, srvlst, size);
-}
-
-BOOL myCreateProcess(HANDLE hStdoutWr, HANDLE hStdinRd, CHAR *cmdline)
-{
-   PROCESS_INFORMATION piProcInfo;
-   STARTUPINFO siStartInfo;
-   BOOL status = FALSE;
-
-   ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
-   ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
-   siStartInfo.cb = sizeof(STARTUPINFO);
-   siStartInfo.hStdError = hStdoutWr;
-   siStartInfo.hStdOutput = hStdoutWr;
-   siStartInfo.hStdInput = hStdinRd;
-   siStartInfo.dwFlags |= STARTF_USESTDHANDLES;
-   status = CreateProcess(NULL, cmdline, NULL, NULL,
-                             TRUE, 0, NULL, NULL, &siStartInfo,  &piProcInfo);
-
-   if (status != 0)
-   {
-      CloseHandle(piProcInfo.hProcess);
-      CloseHandle(piProcInfo.hThread);
-      return status;
-   }
-   return status;
-}
-
-LONG ReadPipeSize(HANDLE hStdoutWr, HANDLE hStdoutRd)
-{
-  CHAR chBuf[2];
-  LONG pos=0;
-
-  if (!CloseHandle(hStdoutWr))
-  {
-      return 0; /* fail */
-  }
-
-  for (;;)
-  {
-         long dwRead;
-      if( !ReadFile( hStdoutRd, chBuf, 1, (LPDWORD)&dwRead, NULL) || dwRead == 0)
-         {
-                break;
-         }
-         else
-         {
-           pos+=dwRead;
-         }
-   }
-   return pos;
-}
-
-LONG ReadPipe(HANDLE hStdoutWr, HANDLE hStdoutRd, CHAR *srvlst, LONG size)
-{
-  CHAR chBuf[2];
-  LONG pos;
-
-  pos=0;
-
-  if (!CloseHandle(hStdoutWr))
-  {
-      return 0; /* fail */
-  }
-
-   for (;;)
-   {
-         LONG dwRead;
-      if( !ReadFile( hStdoutRd, chBuf, 1, (LPDWORD)&dwRead, NULL) || dwRead == 0)
-         {
-                break;
-         }
-         else
-         {
-           srvlst[pos++] = chBuf[0] ;
-         }
-   }
-   return 0;
-}
-
-INT row_scanner_service(CHAR *buffer, LONG* pos, LONG size,
-                                         CHAR *name,CHAR *save)
-{
-       LONG get_semi;
-       LONG t;
-       LONG row_size=0;
-       LONG start_pos;
-
-       start_pos = *pos;
-
-       if (*pos>=size)
-       {
-               return 0;
-       }
-
-
-       /* get row start */
-       for (t=start_pos;t<size;t++)
-       {
-               if (buffer[t]=='\n')
-               {
-                       buffer[t]='\0';
-                       if (buffer[t-1]==0x09)
-                       {
-                         buffer[t-1]='\0';
-                       }
-                       if (buffer[t-1]==0x0d)
-                       {
-                         buffer[t-1]='\0';
-                       }
-                       *pos = t+1;
-            row_size = t;
-            break;
-               }
-       }
-
-       /* get : */
-    get_semi=-1;
-       for (t=start_pos;t<row_size;t++)
-       {
-               if (buffer[t]==':')
-               {
-                       get_semi=t;
-            break;
-               }
-       }
-
-       if (get_semi==-1)
-       {
-               return 0;
-       }
-
-       /* lock for space */
-       for (t=get_semi+1;t<row_size;t++)
-       {
-               if (!isspace(buffer[t]))
-               {
-                       break;
-               }
-       }
-       if (t==0)
-       {
-               /* : not found next row*/
-               return 0;
-       }
-
-       /* Compare now */
-       if (_strnicmp(name,&buffer[t],strlen(&buffer[t]))==0)
-       {
-               if (save != NULL)
-               {
-                       /* lock for space */
-               for (t=start_pos;t<get_semi;t++)
-               {
-                      if (!isspace(buffer[t]))
-                      {
-                              break;
-                      }
-                }
-
-                        memcpy(save,&buffer[t],get_semi-t);
-               }
-               return 1;
-       }
-  return 0;
-}