ADVAPI32: Implement GetServiceKeyNameA

Rolf Kalbermatter r.kalbermatter at hccnet.nl
Fri Apr 20 03:42:18 CDT 2007


Changelog
  dlls/advapi32/service.c
   - Implement GetServiceKeyNameA

License: X11/LGPL

Rolf Kalbermatter
-------------- next part --------------
>From 5957f2e503ed735711b7e3d0f3846dc433f85dc4 Mon Sep 17 00:00:00 2001
From: Rolf Kalbermatter <r.kalbermatter at hccnet.nl>
Date: Fri, 20 Apr 2007 08:33:42 +0200
Subject: [PATCH] Implement GetServiceKeyNameA
---
 dlls/advapi32/service.c |   43 +++++++++++++++++++++++++++++++++++++++----
 1 files changed, 39 insertions(+), 4 deletions(-)

diff --git a/dlls/advapi32/service.c b/dlls/advapi32/service.c
index 5d663e2..ae6fb0f 100644
--- a/dlls/advapi32/service.c
+++ b/dlls/advapi32/service.c
@@ -1578,10 +1578,10 @@ BOOL WINAPI QueryServiceStatus(SC_HANDLE
 
     TRACE("%p %p\n", hService, lpservicestatus);
 
-    ret = QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, &SvcStatusData,
+    ret = QueryServiceStatusEx(hService, SC_STATUS_PROCESS_INFO, (LPBYTE)&SvcStatusData,
                                 sizeof(SERVICE_STATUS_PROCESS), NULL);
     if (ret)
-        memcpy(lpservicestatus, &(SvcStatusData.status), sizeof(SERVICE_STATUS);
+        memcpy(lpservicestatus, &(SvcStatusData.status), sizeof(SERVICE_STATUS));
     return ret;
 }
 
@@ -1924,8 +1924,43 @@ EnumServicesStatusW( SC_HANDLE hSCManage
 BOOL WINAPI GetServiceKeyNameA( SC_HANDLE hSCManager, LPCSTR lpDisplayName,
                                 LPSTR lpServiceName, LPDWORD lpcchBuffer )
 {
-    FIXME("%p %s %p %p\n", hSCManager, debugstr_a(lpDisplayName), lpServiceName, lpcchBuffer);
-    return FALSE;
+    LPWSTR wDisplayName, wStr = NULL;
+    BOOL ret;
+    DWORD size = *lpcchBuffer;
+
+    TRACE("%p %s %p %p\n", hSCManager, debugstr_a(lpDisplayName), lpServiceName, lpcchBuffer);
+
+    wDisplayName = SERV_dup(lpDisplayName);
+    if (lpServiceName && size)
+        wStr = HeapAlloc(GetProcessHeap(), 0, size * sizeof (WCHAR));
+
+    ret = GetServiceKeyNameW(hSCManager, wDisplayName, 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 = GetServiceKeyNameW(hSCManager, wDisplayName, wStr, &size);
+    }
+
+    if (ret)
+    {
+        size = WideCharToMultiByte(CP_ACP, 0, wStr, -1, NULL, 0, 0, 0);
+        if (size <= *lpcchBuffer)
+        {
+            WideCharToMultiByte(CP_ACP, 0, wStr, -1, lpServiceName, 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