[PATCH] services: when displayname is absent, the keyname should be used when searching by displayname (fixes bug #13958)
Mikołaj Zalewski
mikolaj at zalewski.pl
Mon Jul 7 06:45:22 CDT 2008
---
dlls/advapi32/tests/service.c | 9 ++++++++-
programs/services/services.c | 2 +-
programs/services/services.h | 2 ++
3 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/dlls/advapi32/tests/service.c b/dlls/advapi32/tests/service.c
index cd6d82c..5b3a43e 100644
--- a/dlls/advapi32/tests/service.c
+++ b/dlls/advapi32/tests/service.c
@@ -415,6 +415,7 @@ static void test_get_displayname(void)
SC_HANDLE scm_handle, svc_handle;
BOOL ret;
CHAR displayname[4096];
+ CHAR keyname[4096];
WCHAR displaynameW[2048];
DWORD displaysize, tempsize, tempsizeW;
static const CHAR deadbeef[] = "Deadbeef";
@@ -615,7 +616,7 @@ static void test_get_displayname(void)
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected ERROR_INSUFFICIENT_BUFFER, got %d\n", GetLastError());
- /* Get the displayname */
+ /* Get the displayname - as dislpayname was NULL, the keyname will be returned */
SetLastError(0xdeadbeef);
ret = GetServiceDisplayNameA(scm_handle, servicename, displayname, &displaysize);
ok(ret, "Expected success\n");
@@ -626,6 +627,12 @@ static void test_get_displayname(void)
GetLastError() == 0xdeadbeef /* NT4, XP, Vista */,
"Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError());
+ /* the keyname will also work as displayname in GetServiceKeyNameA */
+ displaysize = strlen(servicename) + 1;
+ ok(GetServiceKeyNameA(scm_handle, servicename, keyname, &displaysize), "GetServiceKeyName failed\n");
+ ok(!lstrcmpi(keyname, servicename),
+ "Expected keyname to be %s, got %s\n", servicename, keyname);
+
/* Delete the service */
ret = DeleteService(svc_handle);
ok(ret, "Expected success\n");
diff --git a/programs/services/services.c b/programs/services/services.c
index 36ed117..b166d51 100644
--- a/programs/services/services.c
+++ b/programs/services/services.c
@@ -344,7 +344,7 @@ struct service_entry *scmdatabase_find_service_by_displayname(struct scmdatabase
LIST_FOR_EACH_ENTRY(service, &db->services, struct service_entry, entry)
{
- if (strcmpiW(name, service->config.lpDisplayName) == 0)
+ if (strcmpiW(name, get_display_name(service)) == 0)
return service;
}
diff --git a/programs/services/services.h b/programs/services/services.h
index fd99bf9..ff082bb 100644
--- a/programs/services/services.h
+++ b/programs/services/services.h
@@ -90,6 +90,8 @@ DWORD load_reg_string(HKEY hKey, LPCWSTR szValue, BOOL bExpand, LPWSTR *output);
DWORD load_reg_multisz(HKEY hKey, LPCWSTR szValue, LPWSTR *output);
DWORD load_reg_dword(HKEY hKey, LPCWSTR szValue, DWORD *output);
+/* The display name can be absent. In such situations the keyname should be used as displayname
+ */
static inline LPCWSTR get_display_name(struct service_entry *service)
{
return service->config.lpDisplayName ? service->config.lpDisplayName : service->name;
--
1.5.4
--------------090705090109070800020009--
More information about the wine-patches
mailing list