ReactOS 0.4.15-dev-8135-g1bc6c90
ServiceArgs.c File Reference
#include "precomp.h"
Include dependency graph for ServiceArgs.c:

Go to the source code of this file.

Functions

static void send_msg (const char *type, const char *msg)
 
static void service_ok (int cnd, const char *msg,...)
 
static VOID WINAPI service_handler (DWORD ctrl)
 
static void service_main_common (void)
 
static void WINAPI service_mainA (DWORD service_argc, char **service_argv)
 
static void WINAPI service_mainW (DWORD service_argc, WCHAR **service_argv)
 
static void service_process (BOOLEAN unicode)
 
static SC_HANDLE register_service (PCWSTR extra_args)
 
static DWORD WINAPI pipe_thread (void *arg)
 
static void test_startA (SC_HANDLE service_handle, int service_argc, const char **service_argv)
 
static void test_startW (SC_HANDLE service_handle, int service_argc, const WCHAR **service_argv)
 
static void test_runner (BOOLEAN unicode, PCWSTR extra_args, int service_argc, void *service_argv)
 
 START_TEST (ServiceArgs)
 

Variables

static char ** argv
 
static int argc
 
static HANDLE pipe_handle = INVALID_HANDLE_VALUE
 
static char service_nameA [100]
 
static WCHAR service_nameW [100]
 
static WCHAR named_pipe_name [100]
 
static SC_HANDLE scm_handle
 
static SERVICE_STATUS_HANDLE service_handle
 

Function Documentation

◆ pipe_thread()

static DWORD WINAPI pipe_thread ( void arg)
static

Definition at line 252 of file ServiceArgs.c.

253{
254 char buf[512];
255 DWORD read;
256 BOOL res;
257
259 ok(res || GetLastError() == ERROR_PIPE_CONNECTED, "ConnectNamedPipe failed: %lu\n", GetLastError());
260
261 while (1)
262 {
263 res = ReadFile(pipe_handle, buf, sizeof(buf), &read, NULL);
264 if (!res)
265 {
267 "ReadFile failed: %lu\n", GetLastError());
268 break;
269 }
270
271 if (!strncmp(buf, "TRACE:", 6))
272 {
273 trace("service trace: %s\n", buf+6);
274 }
275 else if (!strncmp(buf, "OK:", 3))
276 {
277 ok(1, "service: %s\n", buf+3);
278 }
279 else if (!strncmp(buf, "FAIL:", 5))
280 {
281 ok(0, "service: %s\n", buf+5);
282 }
283 else
284 {
285 ok(0, "malformed service message: %s\n", buf);
286 }
287 }
288
290 //trace("pipe disconnected\n");
291 return 0;
292}
static HANDLE pipe_handle
Definition: ServiceArgs.c:14
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
Definition: utclib.c:534
#define read
Definition: acwin.h:96
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define NULL
Definition: types.h:112
#define ReadFile(a, b, c, d, e)
Definition: compat.h:742
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint res
Definition: glext.h:9613
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
BOOL WINAPI ConnectNamedPipe(IN HANDLE hNamedPipe, IN LPOVERLAPPED lpOverlapped)
Definition: npipe.c:701
BOOL WINAPI DisconnectNamedPipe(HANDLE hNamedPipe)
Definition: npipe.c:961
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define ERROR_BROKEN_PIPE
Definition: winerror.h:183
#define ERROR_PIPE_CONNECTED
Definition: winerror.h:352

Referenced by test_runner().

◆ register_service()

static SC_HANDLE register_service ( PCWSTR  extra_args)
static

Definition at line 226 of file ServiceArgs.c.

227{
228 WCHAR service_cmd[MAX_PATH+150];
229 SC_HANDLE service;
230
231 GetModuleFileNameW(NULL, service_cmd, MAX_PATH);
232
233 StringCbCatW(service_cmd, sizeof(service_cmd), L" ServiceArgs ");
234 StringCbCatW(service_cmd, sizeof(service_cmd), service_nameW);
235 StringCbCatW(service_cmd, sizeof(service_cmd), extra_args);
236
237 trace("service_cmd \"%ls\"\n", service_cmd);
238
241 service_cmd, NULL, NULL, NULL, NULL, NULL);
242 if (!service && GetLastError() == ERROR_ACCESS_DENIED)
243 {
244 skip("Not enough access right to create service\n");
245 return NULL;
246 }
247
248 ok(service != NULL, "CreateService failed: %lu\n", GetLastError());
249 return service;
250}
static WCHAR service_nameW[100]
Definition: ServiceArgs.c:16
static SC_HANDLE scm_handle
Definition: ServiceArgs.c:20
#define skip(...)
Definition: atltest.h:64
#define MAX_PATH
Definition: compat.h:34
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
DWORD WINAPI GetModuleFileNameW(HINSTANCE hModule, LPWSTR lpFilename, DWORD nSize)
Definition: loader.c:600
#define L(x)
Definition: ntvdm.h:50
SC_HANDLE WINAPI CreateServiceW(SC_HANDLE hSCManager, LPCWSTR lpServiceName, LPCWSTR lpDisplayName, DWORD dwDesiredAccess, DWORD dwServiceType, DWORD dwStartType, DWORD dwErrorControl, LPCWSTR lpBinaryPathName, LPCWSTR lpLoadOrderGroup, LPDWORD lpdwTagId, LPCWSTR lpDependencies, LPCWSTR lpServiceStartName, LPCWSTR lpPassword)
Definition: scm.c:812
STRSAFEAPI StringCbCatW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:342
#define SERVICE_ALL_ACCESS
Definition: winsvc.h:62
#define SERVICE_DEMAND_START
Definition: cmtypes.h:978
#define SERVICE_WIN32_OWN_PROCESS
Definition: cmtypes.h:962
#define SERVICE_ERROR_IGNORE
Definition: cmtypes.h:981
__wchar_t WCHAR
Definition: xmlstorage.h:180

◆ send_msg()

static void send_msg ( const char type,
const char msg 
)
static

Definition at line 23 of file ServiceArgs.c.

24{
25 DWORD written = 0;
26 char buf[512];
27
28 StringCbPrintfA(buf, sizeof(buf), "%s:%s", type, msg);
29 WriteFile(pipe_handle, buf, lstrlenA(buf)+1, &written, NULL);
30}
#define msg(x)
Definition: auth_time.c:54
BOOL WINAPI WriteFile(IN HANDLE hFile, IN LPCVOID lpBuffer, IN DWORD nNumberOfBytesToWrite OPTIONAL, OUT LPDWORD lpNumberOfBytesWritten, IN LPOVERLAPPED lpOverlapped OPTIONAL)
Definition: rw.c:24
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
int WINAPI lstrlenA(LPCSTR lpString)
Definition: lstring.c:145
STRSAFEAPI StringCbPrintfA(STRSAFE_LPSTR pszDest, size_t cbDest, STRSAFE_LPCSTR pszFormat,...)
Definition: strsafe.h:547

Referenced by service_ok().

◆ service_handler()

static VOID WINAPI service_handler ( DWORD  ctrl)
static

Definition at line 58 of file ServiceArgs.c.

59{
61
62 status.dwServiceType = SERVICE_WIN32;
63 status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
64 status.dwWin32ExitCode = 0;
65 status.dwServiceSpecificExitCode = 0;
66 status.dwCheckPoint = 0;
67 status.dwWaitHint = 0;
68
69 switch(ctrl)
70 {
72 status.dwCurrentState = SERVICE_STOP_PENDING;
73 status.dwControlsAccepted = 0;
75 default:
76 status.dwCurrentState = SERVICE_RUNNING;
78 }
79}
static SERVICE_STATUS_HANDLE service_handle
Definition: ServiceArgs.c:21
#define ctrl
Definition: input.c:1756
BOOL WINAPI SetServiceStatus(SERVICE_STATUS_HANDLE hServiceStatus, LPSERVICE_STATUS lpServiceStatus)
Definition: sctrl.c:997
Definition: ps.c:97
#define SERVICE_ACCEPT_STOP
Definition: winsvc.h:28
#define SERVICE_STOP_PENDING
Definition: winsvc.h:23
#define SERVICE_RUNNING
Definition: winsvc.h:24
#define SERVICE_CONTROL_STOP
Definition: winsvc.h:36
#define SERVICE_WIN32
Definition: cmtypes.h:964

Referenced by service_main_common().

◆ service_main_common()

static void service_main_common ( void  )
static

Definition at line 81 of file ServiceArgs.c.

82{
84 BOOL res;
85
87 service_ok(service_handle != NULL, "RegisterServiceCtrlHandler failed: %lu\n", GetLastError());
88 if (!service_handle)
89 return;
90
91 status.dwServiceType = SERVICE_WIN32;
92 status.dwCurrentState = SERVICE_RUNNING;
94 status.dwWin32ExitCode = 0;
95 status.dwServiceSpecificExitCode = 0;
96 status.dwCheckPoint = 0;
97 status.dwWaitHint = 10000;
99 service_ok(res, "SetServiceStatus(SERVICE_RUNNING) failed: %lu", GetLastError());
100
101 Sleep(100);
102
103 status.dwCurrentState = SERVICE_STOPPED;
104 status.dwControlsAccepted = 0;
106 service_ok(res, "SetServiceStatus(SERVICE_STOPPED) failed: %lu", GetLastError());
107}
static void service_ok(int cnd, const char *msg,...)
Definition: ServiceArgs.c:46
static VOID WINAPI service_handler(DWORD ctrl)
Definition: ServiceArgs.c:58
SERVICE_STATUS_HANDLE WINAPI RegisterServiceCtrlHandlerW(LPCWSTR lpServiceName, LPHANDLER_FUNCTION lpHandlerProc)
Definition: sctrl.c:742
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:790
#define SERVICE_STOPPED
Definition: winsvc.h:21
#define SERVICE_ACCEPT_SHUTDOWN
Definition: winsvc.h:30

Referenced by service_mainA(), and service_mainW().

◆ service_mainA()

static void WINAPI service_mainA ( DWORD  service_argc,
char **  service_argv 
)
static

Definition at line 124 of file ServiceArgs.c.

125{
126 int i;
127 char *next_arg;
128 char *next_arg_aligned;
129
130 service_ok(service_argc == argc - 3, "service_argc = %d, expected %d", service_argc, argc - 3);
131 if (service_argc == argc - 3)
132 {
133 service_ok(!strcmp(service_argv[0], service_nameA), "service_argv[0] = %s, expected %s", service_argv[0], service_nameA);
134 service_ok(service_argv[0] == (char *)&service_argv[service_argc] ||
135 service_argv[1] == (char *)&service_argv[service_argc] ||
136 service_argv[1] == (char *)(((ULONG_PTR)&service_argv[service_argc] + 7) & ~7), "service_argv[0] = %p, [1] = %p, expected one of them to be %p", service_argv[0], service_argv[1], &service_argv[service_argc]);
137 //service_trace("service_argv[0] = %p", service_argv[0]);
138 next_arg_aligned = next_arg = NULL;
139 for (i = 1; i < service_argc; i++)
140 {
141 //service_trace("service_argv[%d] = %p", i, service_argv[i]);
142 service_ok(!strcmp(service_argv[i], argv[i + 3]), "service_argv[%d] = %s, expected %s", i, service_argv[i], argv[i + 3]);
144 service_argv[i] == next_arg ||
145 service_argv[i] == next_arg_aligned, "service_argv[%d] = %p, expected %p or %p", i, service_argv[i], next_arg, next_arg_aligned);
146 next_arg = service_argv[i];
147 next_arg += 2 * (strlen(next_arg) + 1);
148 next_arg_aligned = (char *)(((ULONG_PTR)next_arg + 3) & ~3);
149 }
150 }
151
153}
static char service_nameA[100]
Definition: ServiceArgs.c:15
static void service_main_common(void)
Definition: ServiceArgs.c:81
static int argc
Definition: ServiceArgs.c:12
static char ** argv
Definition: ServiceArgs.c:11
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
char * next_arg(char *src, char needle)
Definition: rdesktop.c:1174
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
uint32_t ULONG_PTR
Definition: typedefs.h:65

Referenced by service_process().

◆ service_mainW()

static void WINAPI service_mainW ( DWORD  service_argc,
WCHAR **  service_argv 
)
static

Definition at line 155 of file ServiceArgs.c.

156{
157 int i;
158 WCHAR argW[32];
160 WCHAR *next_arg_aligned;
161
162 service_ok(service_argc == argc - 3, "service_argc = %d, expected %d", service_argc, argc - 3);
163 if (service_argc == argc - 3)
164 {
165 service_ok(!wcscmp(service_argv[0], service_nameW), "service_argv[0] = %ls, expected %ls", service_argv[0], service_nameW);
166 service_ok(service_argv[0] == (WCHAR *)&service_argv[service_argc] ||
167 service_argv[1] == (WCHAR *)&service_argv[service_argc] ||
168 service_argv[1] == (WCHAR *)(((ULONG_PTR)&service_argv[service_argc] + 7) & ~7), "service_argv[0] = %p, [1] = %p, expected one of them to be %p", service_argv[0], service_argv[1], &service_argv[service_argc]);
169 //service_trace("service_argv[0] = %p", service_argv[0]);
170 next_arg_aligned = next_arg = NULL;
171 for (i = 1; i < service_argc; i++)
172 {
173 //service_trace("service_argv[%d] = %p", i, service_argv[i]);
174 MultiByteToWideChar(CP_ACP, 0, argv[i + 3], -1, argW, _countof(argW));
175 service_ok(!wcscmp(service_argv[i], argW), "service_argv[%d] = %ls, expected %ls", i, service_argv[i], argW);
177 service_argv[i] == next_arg ||
178 service_argv[i] == next_arg_aligned, "service_argv[%d] = %p, expected %p or %p", i, service_argv[i], next_arg, next_arg_aligned);
179 next_arg = service_argv[i];
180 next_arg += wcslen(next_arg) + 1;
181 next_arg_aligned = (WCHAR *)(((ULONG_PTR)next_arg + 3) & ~3);
182 }
183 }
184
186}
#define CP_ACP
Definition: compat.h:109
#define MultiByteToWideChar
Definition: compat.h:110
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
_Check_return_ _CRTIMP int __cdecl wcscmp(_In_z_ const wchar_t *_Str1, _In_z_ const wchar_t *_Str2)
#define _countof(array)
Definition: sndvol32.h:70

Referenced by service_process().

◆ service_ok()

static void service_ok ( int  cnd,
const char msg,
  ... 
)
static

Definition at line 46 of file ServiceArgs.c.

47{
49 char buf[512];
50
52 StringCbVPrintfA(buf, sizeof(buf), msg, valist);
54
55 send_msg(cnd ? "OK" : "FAIL", buf);
56}
static void send_msg(const char *type, const char *msg)
Definition: ServiceArgs.c:23
char * va_list
Definition: acmsvcex.h:78
#define va_end(ap)
Definition: acmsvcex.h:90
#define va_start(ap, A)
Definition: acmsvcex.h:91
static __ms_va_list valist
Definition: printf.c:66
STRSAFEAPI StringCbVPrintfA(STRSAFE_LPSTR pszDest, size_t cbDest, STRSAFE_LPCSTR pszFormat, va_list argList)
Definition: strsafe.h:502

Referenced by report_service_status(), service_main(), service_main_common(), service_mainA(), service_mainW(), service_process(), start_service(), test_tcp(), and test_udp().

◆ service_process()

static void service_process ( BOOLEAN  unicode)
static

Definition at line 188 of file ServiceArgs.c.

189{
190 BOOL res;
191
192 SERVICE_TABLE_ENTRYA servtblA[] =
193 {
195 { NULL, NULL }
196 };
197 SERVICE_TABLE_ENTRYW servtblW[] =
198 {
200 { NULL, NULL }
201 };
202
204 if (!res)
205 return;
206
209 return;
210
211 //service_trace("Starting...");
212 if (unicode)
213 {
215 service_ok(res, "StartServiceCtrlDispatcherW failed: %lu\n", GetLastError());
216 }
217 else
218 {
220 service_ok(res, "StartServiceCtrlDispatcherA failed: %lu\n", GetLastError());
221 }
222
224}
static void WINAPI service_mainW(DWORD service_argc, WCHAR **service_argv)
Definition: ServiceArgs.c:155
static void WINAPI service_mainA(DWORD service_argc, char **service_argv)
Definition: ServiceArgs.c:124
static WCHAR named_pipe_name[100]
Definition: ServiceArgs.c:17
#define CloseHandle
Definition: compat.h:739
#define OPEN_EXISTING
Definition: compat.h:775
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define CreateFileW
Definition: compat.h:741
#define FILE_ATTRIBUTE_NORMAL
Definition: compat.h:137
BOOL WINAPI WaitNamedPipeW(LPCWSTR lpNamedPipeName, DWORD nTimeOut)
Definition: npipe.c:458
#define GENERIC_WRITE
Definition: nt_native.h:90
BOOL WINAPI StartServiceCtrlDispatcherA(const SERVICE_TABLE_ENTRYA *lpServiceStartTable)
Definition: sctrl.c:1035
BOOL WINAPI StartServiceCtrlDispatcherW(const SERVICE_TABLE_ENTRYW *lpServiceStartTable)
Definition: sctrl.c:1134
#define NMPWAIT_USE_DEFAULT_WAIT
Definition: winbase.h:134

Referenced by START_TEST().

◆ START_TEST()

START_TEST ( ServiceArgs  )

Definition at line 382 of file ServiceArgs.c.

383{
385
387 ok(scm_handle != NULL, "OpenSCManager failed: %lu\n", GetLastError());
388 if (!scm_handle)
389 {
390 skip("Failed to open service control manager. Skipping test\n");
391 return;
392 }
393
394 if (argc < 3)
395 {
396 char *service_argvA[10];
397 WCHAR *service_argvW[10];
398
399 test_runner(FALSE, L" A", 0, NULL);
400 test_runner(FALSE, L" W", 0, NULL);
401 test_runner(TRUE, L" A", 0, NULL);
402 test_runner(TRUE, L" W", 0, NULL);
403
404 service_argvA[0] = "x";
405 service_argvW[0] = L"x";
406 test_runner(FALSE, L" A x", 1, service_argvA);
407 test_runner(FALSE, L" W x", 1, service_argvA);
408 test_runner(TRUE, L" A x", 1, service_argvW);
409 test_runner(TRUE, L" W x", 1, service_argvW);
410
411 service_argvA[1] = "y";
412 service_argvW[1] = L"y";
413 test_runner(FALSE, L" A x y", 2, service_argvA);
414 test_runner(FALSE, L" W x y", 2, service_argvA);
415 test_runner(TRUE, L" A x y", 2, service_argvW);
416 test_runner(TRUE, L" W x y", 2, service_argvW);
417
418 service_argvA[0] = "ab";
419 service_argvW[0] = L"ab";
420 test_runner(FALSE, L" A ab y", 2, service_argvA);
421 test_runner(FALSE, L" W ab y", 2, service_argvA);
422 test_runner(TRUE, L" A ab y", 2, service_argvW);
423 test_runner(TRUE, L" W ab y", 2, service_argvW);
424
425 service_argvA[0] = "abc";
426 service_argvW[0] = L"abc";
427 test_runner(FALSE, L" A abc y", 2, service_argvA);
428 test_runner(FALSE, L" W abc y", 2, service_argvA);
429 test_runner(TRUE, L" A abc y", 2, service_argvW);
430 test_runner(TRUE, L" W abc y", 2, service_argvW);
431
432 service_argvA[0] = "abcd";
433 service_argvW[0] = L"abcd";
434 test_runner(FALSE, L" A abcd y", 2, service_argvA);
435 test_runner(FALSE, L" W abcd y", 2, service_argvA);
436 test_runner(TRUE, L" A abcd y", 2, service_argvW);
437 test_runner(TRUE, L" W abcd y", 2, service_argvW);
438
439 service_argvA[0] = "abcde";
440 service_argvW[0] = L"abcde";
441 test_runner(FALSE, L" A abcde y", 2, service_argvA);
442 test_runner(FALSE, L" W abcde y", 2, service_argvA);
443 test_runner(TRUE, L" A abcde y", 2, service_argvW);
444 test_runner(TRUE, L" W abcde y", 2, service_argvW);
445
446 service_argvA[0] = "abcdef";
447 service_argvW[0] = L"abcdef";
448 test_runner(FALSE, L" A abcdef y", 2, service_argvA);
449 test_runner(FALSE, L" W abcdef y", 2, service_argvA);
450 test_runner(TRUE, L" A abcdef y", 2, service_argvW);
451 test_runner(TRUE, L" W abcdef y", 2, service_argvW);
452
453 service_argvA[0] = "abcdefg";
454 service_argvW[0] = L"abcdefg";
455 test_runner(FALSE, L" A abcdefg y", 2, service_argvA);
456 test_runner(FALSE, L" W abcdefg y", 2, service_argvA);
457 test_runner(TRUE, L" A abcdefg y", 2, service_argvW);
458 test_runner(TRUE, L" W abcdefg y", 2, service_argvW);
459
460 service_argvA[0] = "";
461 service_argvW[0] = L"";
462 test_runner(FALSE, L" A \"\" y", 2, service_argvA);
463 test_runner(FALSE, L" W \"\" y", 2, service_argvA);
464 test_runner(TRUE, L" A \"\" y", 2, service_argvW);
465 test_runner(TRUE, L" W \"\" y", 2, service_argvW);
466 }
467 else
468 {
471 StringCbPrintfW(named_pipe_name, sizeof(named_pipe_name), L"\\\\.\\pipe\\%ls_pipe", service_nameW);
472 if (!strcmp(argv[3], "A"))
474 else
476 }
477
479}
static void test_runner(BOOLEAN unicode, PCWSTR extra_args, int service_argc, void *service_argv)
Definition: ServiceArgs.c:334
static void service_process(BOOLEAN unicode)
Definition: ServiceArgs.c:188
char * strcpy(char *DstString, const char *SrcString)
Definition: utclib.c:388
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
SC_HANDLE WINAPI OpenSCManagerW(LPCWSTR lpMachineName, LPCWSTR lpDatabaseName, DWORD dwDesiredAccess)
Definition: scm.c:2068
BOOL WINAPI CloseServiceHandle(SC_HANDLE hSCObject)
Definition: scm.c:580
int winetest_get_mainargs(char ***pargv)
STRSAFEAPI StringCbPrintfW(STRSAFE_LPWSTR pszDest, size_t cbDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:557
#define SC_MANAGER_ALL_ACCESS
Definition: winsvc.h:13

◆ test_runner()

static void test_runner ( BOOLEAN  unicode,
PCWSTR  extra_args,
int  service_argc,
void service_argv 
)
static

Definition at line 334 of file ServiceArgs.c.

335{
337 SC_HANDLE service_handle;
338 BOOL res;
339
340 StringCbPrintfW(service_nameW, sizeof(service_nameW), L"WineTestService%lu", GetTickCount());
342 //trace("service_name: %ls\n", service_nameW);
343 StringCbPrintfW(named_pipe_name, sizeof(named_pipe_name), L"\\\\.\\pipe\\%ls_pipe", service_nameW);
344
346 PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT, 10, 2048, 2048, 10000, NULL);
347 ok(pipe_handle != INVALID_HANDLE_VALUE, "CreateNamedPipe failed: %lu\n", GetLastError());
349 return;
350
352 ok(thread != NULL, "CreateThread failed: %lu\n", GetLastError());
353 if (!thread)
354 goto Quit;
355
356 service_handle = register_service(extra_args);
357 if (!service_handle)
358 goto Quit;
359
360 //trace("starting...\n");
361
362 if (unicode)
363 test_startW(service_handle, service_argc, service_argv);
364 else
365 test_startA(service_handle, service_argc, service_argv);
366
368 ok(res, "DeleteService failed: %lu\n", GetLastError());
369
371
372 ok(WaitForSingleObject(thread, 10000) == WAIT_OBJECT_0, "Timeout waiting for thread\n");
373
374Quit:
375 if (thread)
377
380}
static DWORD WINAPI pipe_thread(void *arg)
Definition: ServiceArgs.c:252
static void test_startW(SC_HANDLE service_handle, int service_argc, const WCHAR **service_argv)
Definition: ServiceArgs.c:314
static void test_startA(SC_HANDLE service_handle, int service_argc, const char **service_argv)
Definition: ServiceArgs.c:294
static HANDLE thread
Definition: service.c:33
#define WideCharToMultiByte
Definition: compat.h:111
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:455
HANDLE WINAPI CreateNamedPipeW(LPCWSTR lpName, DWORD dwOpenMode, DWORD dwPipeMode, DWORD nMaxInstances, DWORD nOutBufferSize, DWORD nInBufferSize, DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: npipe.c:246
BOOL WINAPI DeleteService(SC_HANDLE hService)
Definition: scm.c:921
#define register_service
Definition: svchlp.h:69
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
#define PIPE_ACCESS_INBOUND
Definition: winbase.h:165
#define PIPE_WAIT
Definition: winbase.h:171
#define PIPE_READMODE_MESSAGE
Definition: winbase.h:170
#define WAIT_OBJECT_0
Definition: winbase.h:406
#define PIPE_TYPE_MESSAGE
Definition: winbase.h:168

Referenced by START_TEST().

◆ test_startA()

static void test_startA ( SC_HANDLE  service_handle,
int  service_argc,
const char **  service_argv 
)
static

Definition at line 294 of file ServiceArgs.c.

295{
297 BOOL res;
298
299 res = StartServiceA(service_handle, service_argc, service_argv);
300 ok(res, "StartService failed: %lu\n", GetLastError());
301 if (!res)
302 return;
303
304 do
305 {
306 Sleep(100);
307 ZeroMemory(&status, sizeof(status));
309 } while (res && status.dwCurrentState != SERVICE_STOPPED);
310 ok(res, "QueryServiceStatus failed: %lu\n", GetLastError());
311 ok(status.dwCurrentState == SERVICE_STOPPED, "status.dwCurrentState = %lx\n", status.dwCurrentState);
312}
BOOL WINAPI QueryServiceStatus(SC_HANDLE hService, LPSERVICE_STATUS lpServiceStatus)
Definition: scm.c:2845
BOOL WINAPI StartServiceA(SC_HANDLE hService, DWORD dwNumServiceArgs, LPCSTR *lpServiceArgVectors)
Definition: scm.c:2942
#define ZeroMemory
Definition: winbase.h:1712

Referenced by test_runner().

◆ test_startW()

static void test_startW ( SC_HANDLE  service_handle,
int  service_argc,
const WCHAR **  service_argv 
)
static

Definition at line 314 of file ServiceArgs.c.

315{
317 BOOL res;
318
319 res = StartServiceW(service_handle, service_argc, service_argv);
320 ok(res, "StartService failed: %lu\n", GetLastError());
321 if (!res)
322 return;
323
324 do
325 {
326 Sleep(100);
327 ZeroMemory(&status, sizeof(status));
329 } while (res && status.dwCurrentState != SERVICE_STOPPED);
330 ok(res, "QueryServiceStatus failed: %lu\n", GetLastError());
331 ok(status.dwCurrentState == SERVICE_STOPPED, "status.dwCurrentState = %lx\n", status.dwCurrentState);
332}
BOOL WINAPI StartServiceW(SC_HANDLE hService, DWORD dwNumServiceArgs, LPCWSTR *lpServiceArgVectors)
Definition: scm.c:2980

Referenced by test_runner().

Variable Documentation

◆ argc

int argc
static

Definition at line 12 of file ServiceArgs.c.

Referenced by __GetMainArgs(), __getmainargs(), __wgetmainargs(), _CorExeMain(), _getopt_internal(), _getopt_internal_r(), _getopt_long_only_r(), _getopt_long_r(), _main(), _tmain(), _tWinMain(), account(), ActiveXObject_value(), add_route(), AddService(), array_access(), Array_concat(), Array_forEach(), Array_indexOf(), Array_join(), Array_map(), Array_push(), Array_slice(), Array_sort(), Array_splice(), array_to_args(), Array_unshift(), ArrayConstr_isArray(), ArrayConstr_value(), AssocQ(), BGStartCmd(), BindFunction_call(), BlankArgument(), BookmarkCmd(), BoolConstr_value(), CatCmd(), cd(), change_command(), ChdirCmd(), check_option(), ChmodCmd(), clean_main(), cmd_copy(), cmd_date(), cmd_mkdir(), cmd_mklink(), cmd_move(), cmd_replace(), cmd_setlocal(), cmd_time(), cmd_type(), cmdAccounts(), cmdComputer(), cmdConfig(), cmdContinue(), CmdDebugService(), cmdGroup(), cmdHelp(), cmdHelpMsg(), cmdLocalGroup(), cmdPause(), cmdSession(), cmdShare(), cmdStart(), cmdStatistics(), cmdStop(), cmdUse(), cmdUser(), CommandChoice(), CommandDumpSector(), CommandFree(), CommandLineToArgv(), CommandLineToArgvT(), CommandLineToArgvW(), CommandPartInfo(), CommandTimer(), construct_function(), convert_add_cmd_line(), convert_params(), create_bind_function(), create_command(), CreateExtendedPartition(), CreateLogicalPartition(), CreateMain(), CreatePrimaryPartition(), Date_setDate(), Date_setFullYear(), Date_setHours(), Date_setMilliseconds(), Date_setMinutes(), Date_setMonth(), Date_setSeconds(), Date_setTime(), Date_setUTCDate(), Date_setUTCFullYear(), Date_setUTCHours(), Date_setUTCMilliseconds(), Date_setUTCMinutes(), Date_setUTCMonth(), Date_setUTCSeconds(), Date_setYear(), Date_toLocaleTimeString(), date_utc(), DateConstr_parse(), DateConstr_UTC(), DateConstr_value(), DbgGdiKdbgCliCallback(), DebugCmd(), del_route(), delete(), delete_command(), DeleteCmd(), DeletePartition(), DetailDisk(), DetailPartition(), DetailVolume(), DirtyMain(), DiskFreeMain(), DismountMain(), disp_call(), disp_call_value(), DispatchEx_InvokeEx(), DisplayApplet(), do_attribute_tag_format(), do_chmod(), do_umask(), doChild(), doCrash(), document_write(), doDebugger(), domacro(), DoParse(), doproxy(), DriveTypeMain(), DumpDisk(), DumpPartition(), EchoCmd(), EnumeratorConstr_value(), error_constr(), ErrorConstr_value(), EvalErrorConstr_value(), exec_source(), exprval_call(), FindHandler(), FsInfoMain(), Function_apply(), Function_bind(), Function_call(), Function_invoke(), Function_value(), FunctionConstr_value(), get(), get_extrac_args(), get_pnames(), get_strarg(), get_utf8_args(), GetArgument(), GetCmd(), getit(), getopt(), getopt_long(), getopt_long_only(), getwhoisserver(), HandleDumpAttributes(), HandleImageArg(), HardLinkMain(), help(), help_main(), HelpCmd(), Host_Echo(), HostsCmd(), HTMLImageElementFactory_value(), idle(), ImageFile_ParseCmdline(), init(), InstallWindowsNt(), InteractiveConsole(), interp_assign_call(), interp_new(), InterpretCmd(), InterpretedFunction_call(), invoke_prop_func(), isCmdWithArg(), jsdisp_call(), jsdisp_call_name(), jsdisp_call_value(), JSGlobal_decodeURI(), JSGlobal_decodeURIComponent(), JSGlobal_encodeURI(), JSGlobal_encodeURIComponent(), JSGlobal_escape(), JSGlobal_eval(), JSGlobal_isFinite(), JSGlobal_isNaN(), JSGlobal_parseFloat(), JSGlobal_parseInt(), JSGlobal_unescape(), JSON_parse(), JSON_stringify(), KdbCommand_Gdi_dumpht(), lcd(), ListCmd(), LocalChdirCmd(), LocalChmodCmd(), LocalListCmd(), LocalMkdirCmd(), LocalPageCmd(), LocalRenameCmd(), LocalRmCmd(), LocalRmdirCmd(), LookupCmd(), ls(), macdef(), main(), makedir(), Math_abs(), Math_acos(), Math_asin(), Math_atan(), Math_atan2(), Math_ceil(), Math_cos(), Math_exp(), Math_floor(), Math_log(), Math_max(), Math_min(), Math_pow(), Math_round(), Math_sin(), Math_sqrt(), Math_tan(), mdelete(), mget(), MkdirCmd(), mls(), MlsCmd(), modtime(), mput(), MSVCRT20__getmainargs(), MSVCRT20__wgetmainargs(), NativeFunction_call(), newer(), no_stop_main(), NPP_New(), NtfsInfoMain(), NtProcessStartup(), Number_toExponential(), Number_toFixed(), Number_toPrecision(), Number_toString(), NumberConstr_value(), Object_create(), Object_defineProperties(), Object_defineProperty(), Object_getOwnPropertyDescriptor(), Object_getPrototypeOf(), Object_hasOwnProperty(), Object_propertyIsEnumerable(), ObjectConstr_value(), ok_argsA_imp(), ok_argsW_imp(), OpenCmd(), optionInit(), optionParse(), PageCmd(), PageHeap_ParseCmdline(), parse_cmdlineargs(), parse_switches(), ParseArguments(), ParseCmdAndExecute(), CCABManager::ParseCmdline(), ParseCmdLine(), ParseCmdline(), ParseCommandLine(), CConfiguration::ParseParameters(), prepare_test(), process_arguments(), process_long_option(), TConfig::Process_Params(), ProcessArguments(), ProcessCmdLine(), ProcessCommandLine(), put(), PutCmd(), QueryMain(), quote(), QuoteCmd(), RangeErrorConstr_value(), ReferenceErrorConstr_value(), reg_add(), reg_copy(), reg_delete(), reg_export(), reg_import(), reg_query(), regdump(), reget(), RegExp_exec(), RegExp_test(), RegExpConstr_value(), RegExpErrorConstr_value(), removedir(), renamefile(), rep_call(), restart(), RGlobCmd(), RmdirCmd(), rmthelp(), RmtHelpCmd(), rmtstatus(), RStartServiceA(), RStartServiceW(), RunInstallReactOS(), SchedServiceMain(), ScmLoadService(), ScmSendStartCommand(), ScmStartService(), ScmStartUserModeService(), SelectDisk(), SelectPartition(), SelectVolume(), service_main(), service_mainA(), service_mainW(), ServiceMain(), ServiceStart(), SetCmd(), setdebug(), setid_main(), SetMain(), setnmap(), setntrans(), setpeer(), settype(), setup_scope(), shell(), ShellCmd(), site(), SiteCmd(), sizecmd(), SpoolGetCmd(), SpoolPutCmd(), START_TEST(), StartOneService(), startup(), StatisticsMain(), String_anchor(), String_charAt(), String_charCodeAt(), String_concat(), String_fontcolor(), String_fontsize(), String_indexOf(), String_lastIndexOf(), String_link(), String_match(), String_replace(), String_search(), String_slice(), String_split(), String_substr(), String_substring(), StringConstr_fromCharCode(), StringConstr_value(), SyntaxErrorConstr_value(), test___getmainargs(), test__environ(), test__wenviron(), test_pipes_child(), ThemeServiceMain(), tokenizeCommand(), TypeCmd(), TypeErrorConstr_value(), UniqueIdDisk(), update_loglevel(), URIErrorConstr_value(), user(), userlist(), VBArray_getItem(), VBArray_lbound(), VBArray_ubound(), VBArrayConstr_value(), verify_xpointers(), VolumeInfoMain(), VolumeMain(), W32TmServiceMain(), WhereParseCommandLine(), WinMain(), wmain(), and wWinMain().

◆ argv

char** argv
static

Definition at line 11 of file ServiceArgs.c.

Referenced by service_mainA(), service_mainW(), and START_TEST().

◆ named_pipe_name

WCHAR named_pipe_name[100]
static

Definition at line 17 of file ServiceArgs.c.

Referenced by service_process(), START_TEST(), and test_runner().

◆ pipe_handle

HANDLE pipe_handle = INVALID_HANDLE_VALUE
static

Definition at line 14 of file ServiceArgs.c.

Referenced by pipe_thread(), send_msg(), service_process(), and test_runner().

◆ scm_handle

◆ service_handle

SERVICE_STATUS_HANDLE service_handle
static

◆ service_nameA

char service_nameA[100]
static

Definition at line 15 of file ServiceArgs.c.

Referenced by service_mainA(), service_process(), START_TEST(), and test_runner().

◆ service_nameW