From 5dab8935b928c43e1050dffa55bbb37d270bc132 Mon Sep 17 00:00:00 2001 From: Paul Vriens Date: Wed, 11 Jul 2007 21:10:36 +0200 Subject: [PATCH] advapi/service: First tests (and fixes) for CreateService. --- dlls/advapi32/service.c | 6 ++++ dlls/advapi32/tests/service.c | 54 +++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/dlls/advapi32/service.c b/dlls/advapi32/service.c index 55e9716db6f..54bfc8ebd79 100644 --- a/dlls/advapi32/service.c +++ b/dlls/advapi32/service.c @@ -1309,6 +1309,12 @@ CreateServiceW( SC_HANDLE hSCManager, LPCWSTR lpServiceName, return NULL; } + if (!lpServiceName || !lpBinaryPathName) + { + SetLastError(ERROR_INVALID_ADDRESS); + return NULL; + } + r = RegCreateKeyExW(hscm->hkey, lpServiceName, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dp); if (r!=ERROR_SUCCESS) diff --git a/dlls/advapi32/tests/service.c b/dlls/advapi32/tests/service.c index b3779f9fb9e..be526bd8fee 100644 --- a/dlls/advapi32/tests/service.c +++ b/dlls/advapi32/tests/service.c @@ -132,6 +132,59 @@ static void test_open_svc(void) CloseServiceHandle(scm_handle); } +static void test_create_delete_svc(void) +{ + SC_HANDLE scm_handle, svc_handle1; + static const CHAR servicename [] = "Winetest"; + static const CHAR pathname [] = "we_dont_care.exe"; + + /* All NULL */ + SetLastError(0xdeadbeef); + svc_handle1 = CreateServiceA(NULL, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL); + ok(!svc_handle1, "Expected failure\n"); + ok(GetLastError() == ERROR_INVALID_HANDLE, "Expected ERROR_INVALID_HANDLE, got %d\n", GetLastError()); + + scm_handle = OpenSCManagerA(NULL, NULL, SC_MANAGER_CONNECT); + + /* Only a valid handle to the Service Control Manager */ + SetLastError(0xdeadbeef); + svc_handle1 = CreateServiceA(scm_handle, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL); + ok(!svc_handle1, "Expected failure\n"); + ok(GetLastError() == ERROR_INVALID_ADDRESS /* W2K, W2K3, XP, Vista */ || + GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */, + "Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + + /* Now with a servicename */ + SetLastError(0xdeadbeef); + svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL); + ok(!svc_handle1, "Expected failure\n"); + ok(GetLastError() == ERROR_INVALID_ADDRESS /* W2K, W2K3, XP, Vista */ || + GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */, + "Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + + /* Or just a binary name */ + SetLastError(0xdeadbeef); + svc_handle1 = CreateServiceA(scm_handle, NULL, NULL, 0, 0, 0, 0, pathname, NULL, NULL, NULL, NULL, NULL); + ok(!svc_handle1, "Expected failure\n"); + ok(GetLastError() == ERROR_INVALID_ADDRESS /* W2K, W2K3, XP, Vista */ || + GetLastError() == ERROR_INVALID_PARAMETER /* NT4 */, + "Expected ERROR_INVALID_ADDRESS or ERROR_INVALID_PARAMETER, got %d\n", GetLastError()); + + /* Both servicename and binary name (We only have connect rights) */ + SetLastError(0xdeadbeef); + svc_handle1 = CreateServiceA(scm_handle, servicename, NULL, 0, 0, 0, 0, pathname, NULL, NULL, NULL, NULL, NULL); + todo_wine + { + ok(!svc_handle1, "Expected failure\n"); + ok(GetLastError() == ERROR_ACCESS_DENIED, "Expected ERROR_ACCESS_DENIED, got %d\n", GetLastError()); + DeleteService(svc_handle1); /* Wine doesn't care (yet) about access rights, line can be removed when fixed */ + CloseServiceHandle(svc_handle1); /* Wine doesn't care (yet) about access rights, line can be removed when fixed */ + } + + CloseServiceHandle(scm_handle); +} + + static void test_close(void) { SC_HANDLE handle; @@ -290,6 +343,7 @@ START_TEST(service) /* First some parameter checking */ test_open_scm(); test_open_svc(); + test_create_delete_svc(); test_close(); /* Test the creation, querying and deletion of a service */ test_sequence();