mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 12:55:43 +00:00
[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
This commit is contained in:
parent
d39ec05957
commit
194222d3bc
7 changed files with 286 additions and 537 deletions
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
SC_HANDLE hManager = NULL;
|
||||
SC_HANDLE hService = NULL;
|
||||
SERVICE_STATUS ServiceStatus;
|
||||
DWORD dwError = ERROR_SUCCESS;
|
||||
INT nError = 0;
|
||||
|
||||
if (argc>4)
|
||||
if (argc != 3)
|
||||
{
|
||||
help();
|
||||
return 0;
|
||||
/* FIXME: Print usage message! */
|
||||
printf("Usage: NET STOP <Service name>\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (argc==2)
|
||||
hManager = OpenSCManagerW(NULL,
|
||||
SERVICES_ACTIVE_DATABASE,
|
||||
SC_MANAGER_ENUMERATE_SERVICE);
|
||||
if (hManager == NULL)
|
||||
{
|
||||
string = (char *) malloc(size);
|
||||
if (string != NULL)
|
||||
{
|
||||
sprintf(string,"rpcclient -c \"service enum\"");
|
||||
system(string);
|
||||
free(string);
|
||||
}
|
||||
return 0;
|
||||
printf("1\n");
|
||||
dwError = GetLastError();
|
||||
nError = 1;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (argc==3)
|
||||
hService = OpenServiceW(hManager,
|
||||
argv[2],
|
||||
SERVICE_STOP);
|
||||
if (hService == NULL)
|
||||
{
|
||||
stop_service(argv[1]);
|
||||
return 0;
|
||||
printf("2\n");
|
||||
dwError = GetLastError();
|
||||
nError = 1;
|
||||
goto done;
|
||||
}
|
||||
|
||||
return 0;
|
||||
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;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS net command
|
||||
|
@ -10,99 +9,171 @@
|
|||
|
||||
#include "net.h"
|
||||
|
||||
INT cmdStart(INT argc, CHAR **argv )
|
||||
/* Enumerate all running services */
|
||||
static
|
||||
INT
|
||||
EnumerateRunningServices(VOID)
|
||||
{
|
||||
char *string;
|
||||
long size = 100*sizeof(char);
|
||||
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;
|
||||
|
||||
if (argc>4)
|
||||
hManager = OpenSCManagerW(NULL,
|
||||
SERVICES_ACTIVE_DATABASE,
|
||||
SC_MANAGER_ENUMERATE_SERVICE);
|
||||
if (hManager == NULL)
|
||||
{
|
||||
help();
|
||||
return 0;
|
||||
dwError = GetLastError();
|
||||
nError = 1;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (argc==2)
|
||||
EnumServicesStatusW(hManager,
|
||||
SERVICE_WIN32,
|
||||
SERVICE_ACTIVE,
|
||||
NULL,
|
||||
0,
|
||||
&dwBufferSize,
|
||||
&dwServiceCount,
|
||||
&dwResumeHandle);
|
||||
|
||||
if (dwBufferSize != 0)
|
||||
{
|
||||
string = (char *) malloc(size);
|
||||
if (string != NULL)
|
||||
lpServiceBuffer = HeapAlloc(GetProcessHeap(), 0, dwBufferSize);
|
||||
if (lpServiceBuffer != NULL)
|
||||
{
|
||||
sprintf(string,"rpcclient -c \"service enum\"");
|
||||
system(string);
|
||||
free(string);
|
||||
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);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (argc==3)
|
||||
{
|
||||
start_service(argv[1]);
|
||||
return 0;
|
||||
HeapFree(GetProcessHeap(), 0, lpServiceBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
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;
|
||||
|
||||
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)
|
||||
hManager = OpenSCManagerW(NULL,
|
||||
SERVICES_ACTIVE_DATABASE,
|
||||
SC_MANAGER_ENUMERATE_SERVICE);
|
||||
if (hManager == NULL)
|
||||
{
|
||||
return 0;
|
||||
dwError = GetLastError();
|
||||
nError = 1;
|
||||
goto done;
|
||||
}
|
||||
|
||||
srvlst = (CHAR *) malloc(size);
|
||||
if (srvlst == NULL)
|
||||
hService = OpenServiceW(hManager,
|
||||
argv[2],
|
||||
SERVICE_START);
|
||||
if (hService == 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);
|
||||
}
|
||||
dwError = GetLastError();
|
||||
nError = 1;
|
||||
goto done;
|
||||
}
|
||||
|
||||
free(srvlst);
|
||||
return 0;
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
INT
|
||||
cmdStart(INT argc, WCHAR **argv)
|
||||
{
|
||||
INT nError = 0;
|
||||
|
||||
if (argc == 2)
|
||||
{
|
||||
nError = EnumerateRunningServices();
|
||||
}
|
||||
else
|
||||
{
|
||||
nError = StartOneService(argc, argv);
|
||||
}
|
||||
|
||||
return nError;
|
||||
}
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS net command
|
||||
|
@ -10,154 +9,154 @@
|
|||
|
||||
#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");
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS net command
|
||||
|
@ -10,109 +9,66 @@
|
|||
|
||||
#include "net.h"
|
||||
|
||||
|
||||
|
||||
int main(int argc, char **argv)
|
||||
typedef struct _COMMAND
|
||||
{
|
||||
if (argc<2)
|
||||
WCHAR *name;
|
||||
INT (*func)(INT, WCHAR**);
|
||||
// VOID (*help)(INT, WCHAR**);
|
||||
} COMMAND, *PCOMMAND;
|
||||
|
||||
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 (argc < 2)
|
||||
{
|
||||
help();
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (_stricmp(argv[1],"ACCOUNTS")==0)
|
||||
/* Scan the command table */
|
||||
for (cmdptr = cmds; cmdptr->name; cmdptr++)
|
||||
{
|
||||
return unimplemented();
|
||||
if (_wcsicmp(argv[1], cmdptr->name) == 0)
|
||||
{
|
||||
return cmdptr->func(argc, argv);
|
||||
}
|
||||
if (_stricmp(argv[1],"COMPUTER")==0)
|
||||
{
|
||||
return unimplemented();
|
||||
}
|
||||
if (_stricmp(argv[1],"CONFIG")==0)
|
||||
{
|
||||
return unimplemented();
|
||||
}
|
||||
if (_stricmp(argv[1],"CONTINUE")==0)
|
||||
{
|
||||
return unimplemented();
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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();
|
||||
}
|
||||
|
||||
if (_stricmp(argv[1],"START")==0)
|
||||
{
|
||||
return cmdStart(argc, &argv[1]);
|
||||
}
|
||||
if (_stricmp(argv[1],"STATISTICS")==0)
|
||||
{
|
||||
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();
|
||||
}
|
||||
|
||||
help();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
int unimplemented()
|
||||
INT unimplemented(INT argc, WCHAR **argv)
|
||||
{
|
||||
puts("This command is not implemented yet");
|
||||
return 1;
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
/*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS net command
|
||||
|
@ -12,24 +11,12 @@
|
|||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <windows.h>
|
||||
#include <winsvc.h>
|
||||
|
||||
void help(void);
|
||||
int unimplemented(void);
|
||||
VOID help(VOID);
|
||||
INT unimplemented(INT argc, WCHAR **argv);
|
||||
|
||||
|
||||
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);
|
||||
|
||||
/* 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);
|
||||
|
|
|
@ -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;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue