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