ADVAPI32: Implement GetServiceDisplayNameA

Rolf Kalbermatter rolf.kalbermatter at cit.be
Fri Apr 20 03:42:25 CDT 2007


Changelog
  dlls/advapi32/service.c
   - Implement GetServiceDisplayNameA

License: X11/LGPL

Rolf Kalbermatter
-------------- next part --------------
From d5a3d9455d2c84bce9e10ed140ca700706f7557c Mon Sep 17 00:00:00 2001
From: Rolf Kalbermatter <r.kalbermatter at hccnet.nl>
Date: Fri, 20 Apr 2007 08:34:42 +0200
Subject: [PATCH] Implement GetServiceDisplayNameA
---
 dlls/advapi32/service.c |   40 +++++++++++++++++++++++++++++++++++++---
 1 files changed, 37 insertions(+), 3 deletions(-)

diff --git a/dlls/advapi32/service.c b/dlls/advapi32/service.c
index ae6fb0f..c5dbb66 100644
--- a/dlls/advapi32/service.c
+++ b/dlls/advapi32/service.c
@@ -2003,9 +2003,43 @@ BOOL WINAPI QueryServiceLockStatusW( SC_
 BOOL WINAPI GetServiceDisplayNameA( SC_HANDLE hSCManager, LPCSTR lpServiceName,
   LPSTR lpDisplayName, LPDWORD lpcchBuffer)
 {
-    FIXME("%p %s %p %p\n", hSCManager,
-          debugstr_a(lpServiceName), lpDisplayName, lpcchBuffer);
-    return FALSE;
+    LPWSTR wServiceName, wStr = NULL;
+    BOOL ret;
+    DWORD size = *lpcchBuffer;
+
+    TRACE("%p %s %p %p\n", hSCManager, debugstr_a(lpServiceName), lpDisplayName, lpcchBuffer);
+
+    wServiceName = SERV_dup(lpServiceName);
+    if (lpServiceName && size)
+        wStr = HeapAlloc(GetProcessHeap(), 0, size * sizeof (WCHAR));
+
+    ret = GetServiceDisplayNameW(hSCManager, wServiceName, wStr, &size);
+    if (!ret && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+    {
+        size++;
+        if (wStr)
+            wStr = HeapReAlloc(GetProcessHeap(), 0, wStr, size * sizeof (WCHAR));
+        else
+            wStr = HeapAlloc(GetProcessHeap(), 0, size * sizeof (WCHAR));
+        ret = GetServiceDisplayNameW(hSCManager, wServiceName, wStr, &size);
+    }
+
+    if (ret)
+    {
+        size = WideCharToMultiByte(CP_ACP, 0, wStr, -1, NULL, 0, 0, 0);
+        if (size <= *lpcchBuffer)
+        {
+            WideCharToMultiByte(CP_ACP, 0, wStr, -1, lpDisplayName, size, 0, 0);
+        }
+        else
+        {
+            ret = FALSE;
+            SetLastError(ERROR_INSUFFICIENT_BUFFER);
+        }
+        *lpcchBuffer = size - 1;
+    }
+    HeapFree(GetProcessHeap(), 0, wStr);
+    return ret;
 }
 
 /******************************************************************************
-- 
1.4.1



More information about the wine-patches mailing list