diff --git a/dlls/advapi32/service.c b/dlls/advapi32/service.c index 69f38fb890f..5f362155257 100644 --- a/dlls/advapi32/service.c +++ b/dlls/advapi32/service.c @@ -2035,9 +2035,36 @@ BOOL WINAPI QueryServiceLockStatusW( SC_HANDLE hSCManager, BOOL WINAPI GetServiceDisplayNameA( SC_HANDLE hSCManager, LPCSTR lpServiceName, LPSTR lpDisplayName, LPDWORD lpcchBuffer) { - FIXME("%p %s %p %p\n", hSCManager, + struct sc_manager *hscm; + DWORD type, size; + LONG ret; + + TRACE("%p %s %p %p\n", hSCManager, debugstr_a(lpServiceName), lpDisplayName, lpcchBuffer); - return FALSE; + + hscm = sc_handle_get_handle_data(hSCManager, SC_HTYPE_MANAGER); + if (!hscm) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + + size = *lpcchBuffer; + ret = RegGetValueA(hscm->hkey, lpServiceName, "DisplayName", RRF_RT_REG_SZ, &type, lpDisplayName, &size); + if (ret) + { + if (lpDisplayName && *lpcchBuffer) *lpDisplayName = 0; + + if (ret == ERROR_MORE_DATA) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + *lpcchBuffer = size - 1; + } + else + SetLastError(ret); + return FALSE; + } + return TRUE; } /******************************************************************************