@@ -82,6 +82,9 @@ static DWORD WINAPI service_handler(DWORD ctrl, DWORD event_type, void *event_da
82
82
SetServiceStatus (service_handle , & status );
83
83
SetEvent (service_stop_event );
84
84
return NO_ERROR ;
85
+ case 128 :
86
+ service_event ("CUSTOM" );
87
+ return 0xdeadbeef ;
85
88
default :
86
89
status .dwCurrentState = SERVICE_RUNNING ;
87
90
SetServiceStatus ( service_handle , & status );
@@ -92,11 +95,17 @@ static DWORD WINAPI service_handler(DWORD ctrl, DWORD event_type, void *event_da
92
95
static void WINAPI service_main (DWORD argc , char * * argv )
93
96
{
94
97
SERVICE_STATUS status ;
98
+ char buf [64 ];
95
99
BOOL res ;
96
100
97
- service_ok (argc == 1 , "argc = %d\n" , argc );
98
- if (argc )
99
- service_ok (!strcmp (argv [0 ], service_name ), "argv[0] = %s, expected %s\n" , argv [0 ], service_name );
101
+ service_ok (argc == 3 , "argc = %u, expected 3\n" , argc );
102
+ service_ok (!strcmp (argv [0 ], service_name ), "argv[0] = '%s', expected '%s'\n" , argv [0 ], service_name );
103
+ service_ok (!strcmp (argv [1 ], "param1" ), "argv[1] = '%s', expected 'param1'\n" , argv [1 ]);
104
+ service_ok (!strcmp (argv [2 ], "param2" ), "argv[2] = '%s', expected 'param2'\n" , argv [2 ]);
105
+
106
+ buf [0 ] = 0 ;
107
+ GetEnvironmentVariableA ("PATHEXT" , buf , sizeof (buf ));
108
+ service_ok (buf [0 ], "did not find PATHEXT environment variable\n" );
100
109
101
110
service_handle = pRegisterServiceCtrlHandlerExA (service_name , service_handler , NULL );
102
111
service_ok (service_handle != NULL , "RegisterServiceCtrlHandlerEx failed: %u\n" , GetLastError ());
@@ -190,9 +199,8 @@ static void WINAPI no_stop_main(DWORD argc, char **argv)
190
199
SERVICE_STATUS status ;
191
200
BOOL res ;
192
201
193
- service_ok (argc == 1 , "argc = %d\n" , argc );
194
- if (argc )
195
- service_ok (!strcmp (argv [0 ], service_name ), "argv[0] = %s, expected %s\n" , argv [0 ], service_name );
202
+ service_ok (argc == 1 , "argc = %u, expected 1\n" , argc );
203
+ service_ok (!strcmp (argv [0 ], service_name ), "argv[0] = '%s', expected '%s'\n" , argv [0 ], service_name );
196
204
197
205
service_handle = pRegisterServiceCtrlHandlerExA (service_name , no_stop_handler , NULL );
198
206
service_ok (service_handle != NULL , "RegisterServiceCtrlHandlerEx failed: %u\n" , GetLastError ());
@@ -274,7 +282,7 @@ static void expect_event(const char *event_name)
274
282
275
283
static DWORD WINAPI pipe_thread (void * arg )
276
284
{
277
- char buf [257 ], * ptr ;
285
+ char buf [512 ], * ptr ;
278
286
DWORD read ;
279
287
BOOL res ;
280
288
@@ -316,15 +324,18 @@ static DWORD WINAPI pipe_thread(void *arg)
316
324
317
325
static void test_service (void )
318
326
{
327
+ static const char * argv [2 ] = {"param1" , "param2" };
319
328
SC_HANDLE service_handle = register_service ("simple_service" );
329
+ SERVICE_STATUS_PROCESS status2 ;
320
330
SERVICE_STATUS status ;
331
+ DWORD bytes ;
321
332
BOOL res ;
322
333
323
334
if (!service_handle )
324
335
return ;
325
336
326
337
trace ("starting...\n" );
327
- res = StartServiceA (service_handle , 0 , NULL );
338
+ res = StartServiceA (service_handle , 2 , argv );
328
339
ok (res , "StartService failed: %u\n" , GetLastError ());
329
340
if (!res ) {
330
341
DeleteService (service_handle );
@@ -345,6 +356,15 @@ static void test_service(void)
345
356
ok (status .dwCheckPoint == 0 , "status.dwCheckPoint = %d\n" , status .dwCheckPoint );
346
357
todo_wine ok (status .dwWaitHint == 0 , "status.dwWaitHint = %d\n" , status .dwWaitHint );
347
358
359
+ res = QueryServiceStatusEx (service_handle , SC_STATUS_PROCESS_INFO , (BYTE * )& status2 , sizeof (status2 ), & bytes );
360
+ ok (res , "QueryServiceStatusEx failed: %u\n" , GetLastError ());
361
+ ok (status2 .dwCurrentState == SERVICE_RUNNING , "status2.dwCurrentState = %x\n" , status2 .dwCurrentState );
362
+ ok (status2 .dwProcessId != 0 , "status2.dwProcessId = %d\n" , status2 .dwProcessId );
363
+
364
+ res = ControlService (service_handle , 128 , & status );
365
+ ok (res , "ControlService failed: %u\n" , GetLastError ());
366
+ expect_event ("CUSTOM" );
367
+
348
368
res = ControlService (service_handle , SERVICE_CONTROL_STOP , & status );
349
369
ok (res , "ControlService failed: %u\n" , GetLastError ());
350
370
expect_event ("STOP" );
@@ -358,7 +378,9 @@ static void test_service(void)
358
378
static inline void test_no_stop (void )
359
379
{
360
380
SC_HANDLE service_handle = register_service ("no_stop" );
381
+ SERVICE_STATUS_PROCESS status2 ;
361
382
SERVICE_STATUS status ;
383
+ DWORD bytes ;
362
384
BOOL res ;
363
385
364
386
if (!service_handle )
@@ -389,6 +411,11 @@ static inline void test_no_stop(void)
389
411
ok (status .dwCheckPoint == 0 , "status.dwCheckPoint = %d\n" , status .dwCheckPoint );
390
412
todo_wine ok (status .dwWaitHint == 0 , "status.dwWaitHint = %d\n" , status .dwWaitHint );
391
413
414
+ res = QueryServiceStatusEx (service_handle , SC_STATUS_PROCESS_INFO , (BYTE * )& status2 , sizeof (status2 ), & bytes );
415
+ ok (res , "QueryServiceStatusEx failed: %u\n" , GetLastError ());
416
+ ok (status2 .dwCurrentState == SERVICE_RUNNING , "status2.dwCurrentState = %x\n" , status2 .dwCurrentState );
417
+ ok (status2 .dwProcessId != 0 , "status2.dwProcessId = %d\n" , status2 .dwProcessId );
418
+
392
419
res = ControlService (service_handle , SERVICE_CONTROL_STOP , & status );
393
420
ok (res , "ControlService failed: %u\n" , GetLastError ());
394
421
expect_event ("STOP" );
@@ -405,6 +432,11 @@ static inline void test_no_stop(void)
405
432
ok (status .dwCheckPoint == 0 , "status.dwCheckPoint = %d\n" , status .dwCheckPoint );
406
433
ok (status .dwWaitHint == 0 , "status.dwWaitHint = %d\n" , status .dwWaitHint );
407
434
435
+ res = QueryServiceStatusEx (service_handle , SC_STATUS_PROCESS_INFO , (BYTE * )& status2 , sizeof (status2 ), & bytes );
436
+ ok (res , "QueryServiceStatusEx failed: %u\n" , GetLastError ());
437
+ ok (status2 .dwProcessId == 0 || broken (status2 .dwProcessId != 0 ),
438
+ "status2.dwProcessId = %d\n" , status2 .dwProcessId );
439
+
408
440
res = DeleteService (service_handle );
409
441
ok (res , "DeleteService failed: %u\n" , GetLastError ());
410
442
@@ -420,6 +452,11 @@ static inline void test_no_stop(void)
420
452
ok (status .dwCheckPoint == 0 , "status.dwCheckPoint = %d\n" , status .dwCheckPoint );
421
453
ok (status .dwWaitHint == 0 , "status.dwWaitHint = %d\n" , status .dwWaitHint );
422
454
455
+ res = QueryServiceStatusEx (service_handle , SC_STATUS_PROCESS_INFO , (BYTE * )& status2 , sizeof (status2 ), & bytes );
456
+ ok (res , "QueryServiceStatusEx failed: %u\n" , GetLastError ());
457
+ ok (status2 .dwProcessId == 0 || broken (status2 .dwProcessId != 0 ),
458
+ "status2.dwProcessId = %d\n" , status2 .dwProcessId );
459
+
423
460
CloseServiceHandle (service_handle );
424
461
425
462
res = QueryServiceStatus (service_handle , & status );
0 commit comments