From: Eric Kohl Date: Mon, 24 Sep 2012 12:37:12 +0000 (+0000) Subject: [NET] CORE-6413 X-Git-Tag: backups/ros-csrss@57560~177 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=194222d3bcd49facefd72cdc36f3756408632be7 [NET] CORE-6413 - Convert the application to Unicode. - Implement "net start" and "net stop" commands that use the service manager APIs. svn path=/trunk/; revision=57375 --- diff --git a/reactos/base/applications/network/net/CMakeLists.txt b/reactos/base/applications/network/net/CMakeLists.txt index 668c18a4ec0..279abd3d302 100644 --- a/reactos/base/applications/network/net/CMakeLists.txt +++ b/reactos/base/applications/network/net/CMakeLists.txt @@ -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) diff --git a/reactos/base/applications/network/net/cmdStop.c b/reactos/base/applications/network/net/cmdStop.c index 87fb83eafcd..179bc31b558 100644 --- a/reactos/base/applications/network/net/cmdStop.c +++ b/reactos/base/applications/network/net/cmdStop.c @@ -1,4 +1,3 @@ - /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS net command @@ -10,99 +9,65 @@ #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 \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 (pos4) - { - 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 (pos3) + 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"); diff --git a/reactos/base/applications/network/net/main.c b/reactos/base/applications/network/net/main.c index f8adf735559..4fe37563cac 100644 --- a/reactos/base/applications/network/net/main.c +++ b/reactos/base/applications/network/net/main.c @@ -1,4 +1,3 @@ - /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS net command @@ -10,112 +9,69 @@ #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; } diff --git a/reactos/base/applications/network/net/net.h b/reactos/base/applications/network/net/net.h index 594bbb86669..4120d9a90c1 100644 --- a/reactos/base/applications/network/net/net.h +++ b/reactos/base/applications/network/net/net.h @@ -1,4 +1,3 @@ - /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS net command @@ -12,24 +11,12 @@ #include #include #include +#include -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 index 4ce29b216df..00000000000 --- a/reactos/base/applications/network/net/process.c +++ /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