static void test_service(void) { SC_HANDLE service_handle = register_service("simple_service"); SERVICE_STATUS status; BOOL res; if(!service_handle) return; trace("starting...\n"); res = StartServiceA(service_handle, 0, NULL); ok(res, "StartService failed: %u\n", GetLastError()); if(!res) { DeleteService(service_handle); CloseServiceHandle(service_handle); return; } expect_event("RUNNING"); res = QueryServiceStatus(service_handle, &status); ok(res, "QueryServiceStatus failed: %d\n", GetLastError()); todo_wine ok(status.dwServiceType == SERVICE_WIN32_OWN_PROCESS, "status.dwServiceType = %x\n", status.dwServiceType); ok(status.dwCurrentState == SERVICE_RUNNING, "status.dwCurrentState = %x\n", status.dwCurrentState); ok(status.dwControlsAccepted == (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN), "status.dwControlsAccepted = %x\n", status.dwControlsAccepted); ok(status.dwWin32ExitCode == 0, "status.dwExitCode = %d\n", status.dwWin32ExitCode); ok(status.dwServiceSpecificExitCode == 0, "status.dwServiceSpecificExitCode = %d\n", status.dwServiceSpecificExitCode); ok(status.dwCheckPoint == 0, "status.dwCheckPoint = %d\n", status.dwCheckPoint); todo_wine ok(status.dwWaitHint == 0, "status.dwWaitHint = %d\n", status.dwWaitHint); res = ControlService(service_handle, SERVICE_CONTROL_STOP, &status); ok(res, "ControlService failed: %u\n", GetLastError()); expect_event("STOP"); res = DeleteService(service_handle); ok(res, "DeleteService failed: %u\n", GetLastError()); CloseServiceHandle(service_handle); }
static inline void test_no_stop(void) { SC_HANDLE service_handle = register_service("no_stop"); SERVICE_STATUS status; BOOL res; if(!service_handle) return; trace("starting...\n"); res = StartServiceA(service_handle, 0, NULL); ok(res, "StartService failed: %u\n", GetLastError()); if(!res) { DeleteService(service_handle); return; } expect_event("RUNNING"); /* Let service thread terminate */ Sleep(1000); res = QueryServiceStatus(service_handle, &status); ok(res, "QueryServiceStatus failed: %d\n", GetLastError()); todo_wine ok(status.dwServiceType == SERVICE_WIN32_OWN_PROCESS, "status.dwServiceType = %x\n", status.dwServiceType); ok(status.dwCurrentState == SERVICE_RUNNING, "status.dwCurrentState = %x\n", status.dwCurrentState); ok(status.dwControlsAccepted == (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN), "status.dwControlsAccepted = %x\n", status.dwControlsAccepted); ok(status.dwWin32ExitCode == 0, "status.dwExitCode = %d\n", status.dwWin32ExitCode); ok(status.dwServiceSpecificExitCode == 0, "status.dwServiceSpecificExitCode = %d\n", status.dwServiceSpecificExitCode); ok(status.dwCheckPoint == 0, "status.dwCheckPoint = %d\n", status.dwCheckPoint); todo_wine ok(status.dwWaitHint == 0, "status.dwWaitHint = %d\n", status.dwWaitHint); res = ControlService(service_handle, SERVICE_CONTROL_STOP, &status); ok(res, "ControlService failed: %u\n", GetLastError()); expect_event("STOP"); res = QueryServiceStatus(service_handle, &status); ok(res, "QueryServiceStatus failed: %d\n", GetLastError()); todo_wine ok(status.dwServiceType == SERVICE_WIN32_OWN_PROCESS, "status.dwServiceType = %x\n", status.dwServiceType); ok(status.dwCurrentState==SERVICE_STOPPED || status.dwCurrentState==SERVICE_STOP_PENDING, "status.dwCurrentState = %x\n", status.dwCurrentState); ok(status.dwControlsAccepted == 0, "status.dwControlsAccepted = %x\n", status.dwControlsAccepted); ok(status.dwWin32ExitCode == 0, "status.dwExitCode = %d\n", status.dwWin32ExitCode); ok(status.dwServiceSpecificExitCode == 0, "status.dwServiceSpecificExitCode = %d\n", status.dwServiceSpecificExitCode); ok(status.dwCheckPoint == 0, "status.dwCheckPoint = %d\n", status.dwCheckPoint); ok(status.dwWaitHint == 0, "status.dwWaitHint = %d\n", status.dwWaitHint); res = DeleteService(service_handle); ok(res, "DeleteService failed: %u\n", GetLastError()); res = QueryServiceStatus(service_handle, &status); ok(res, "QueryServiceStatus failed: %d\n", GetLastError()); todo_wine ok(status.dwServiceType == SERVICE_WIN32_OWN_PROCESS, "status.dwServiceType = %x\n", status.dwServiceType); ok(status.dwCurrentState==SERVICE_STOPPED || status.dwCurrentState==SERVICE_STOP_PENDING, "status.dwCurrentState = %x\n", status.dwCurrentState); ok(status.dwControlsAccepted == 0, "status.dwControlsAccepted = %x\n", status.dwControlsAccepted); ok(status.dwWin32ExitCode == 0, "status.dwExitCode = %d\n", status.dwWin32ExitCode); ok(status.dwServiceSpecificExitCode == 0, "status.dwServiceSpecificExitCode = %d\n", status.dwServiceSpecificExitCode); ok(status.dwCheckPoint == 0, "status.dwCheckPoint = %d\n", status.dwCheckPoint); ok(status.dwWaitHint == 0, "status.dwWaitHint = %d\n", status.dwWaitHint); CloseServiceHandle(service_handle); res = QueryServiceStatus(service_handle, &status); ok(!res, "QueryServiceStatus should have failed\n"); ok(GetLastError() == ERROR_INVALID_HANDLE, "GetLastError = %d\n", GetLastError()); }