[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