advapi32/service: Forward GetServiceDisplayNameA to GetServiceDisplayNameW.

This commit is contained in:
Paul Vriens 2007-07-26 16:09:37 +02:00 committed by Alexandre Julliard
parent 23d61ac866
commit 95d2f04611
2 changed files with 35 additions and 36 deletions

View File

@ -2266,45 +2266,50 @@ BOOL WINAPI QueryServiceLockStatusW( SC_HANDLE hSCManager,
BOOL WINAPI GetServiceDisplayNameA( SC_HANDLE hSCManager, LPCSTR lpServiceName,
LPSTR lpDisplayName, LPDWORD lpcchBuffer)
{
struct sc_manager *hscm;
DWORD type, size;
LONG ret;
LPWSTR lpServiceNameW, lpDisplayNameW = NULL;
DWORD size, sizeW, GLE;
BOOL ret;
TRACE("%p %s %p %p\n", hSCManager,
debugstr_a(lpServiceName), lpDisplayName, lpcchBuffer);
hscm = sc_handle_get_handle_data(hSCManager, SC_HTYPE_MANAGER);
if (!hscm)
lpServiceNameW = SERV_dup(lpServiceName);
lpDisplayNameW = HeapAlloc(GetProcessHeap(), 0, *lpcchBuffer * sizeof(WCHAR));
size = sizeW = *lpcchBuffer;
ret = GetServiceDisplayNameW(hSCManager, lpServiceNameW,
lpDisplayName ? lpDisplayNameW : NULL,
&sizeW);
/* Last error will be set by GetServiceDisplayNameW and must be preserved */
GLE = GetLastError();
if (!lpDisplayName && lpcchBuffer && !ret && (GLE == ERROR_INSUFFICIENT_BUFFER))
{
SetLastError(ERROR_INVALID_HANDLE);
return FALSE;
/* Request for buffersize.
*
* Only set the size for ERROR_INSUFFICIENT_BUFFER
*/
size = sizeW * 2;
}
else if (lpDisplayName && lpcchBuffer && !ret)
{
/* Request for displayname.
*
* size only has to be set if this fails
*/
size = sizeW * 2;
}
if (!lpServiceName)
{
SetLastError(ERROR_INVALID_ADDRESS);
return FALSE;
}
WideCharToMultiByte(CP_ACP, 0, lpDisplayNameW, (sizeW + 1), lpDisplayName,
*lpcchBuffer, NULL, NULL );
size = *lpcchBuffer;
ret = RegGetValueA(hscm->hkey, lpServiceName, "DisplayName", RRF_RT_REG_SZ, &type, lpDisplayName, &size);
if (!ret && !lpDisplayName && size)
ret = ERROR_MORE_DATA;
*lpcchBuffer = size;
if (ret)
{
if (lpDisplayName && *lpcchBuffer) *lpDisplayName = 0;
HeapFree(GetProcessHeap(), 0, lpDisplayNameW);
SERV_free(lpServiceNameW);
if (ret == ERROR_MORE_DATA)
{
SetLastError(ERROR_INSUFFICIENT_BUFFER);
*lpcchBuffer = size - 1;
}
else
SetLastError(ret);
return FALSE;
}
return TRUE;
SetLastError(GLE);
return ret;
}
/******************************************************************************

View File

@ -459,24 +459,19 @@ static void test_get_displayname(void)
SetLastError(0xdeadbeef);
displaysize = (tempsize / 2) + 1;
ret = GetServiceDisplayNameA(scm_handle, spooler, displayname, &displaysize);
todo_wine
{
ok(ret, "Expected success\n");
ok(displaysize == ((tempsize / 2) + 1), "Expected no change for the needed buffer size\n");
ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ ||
GetLastError() == ERROR_IO_PENDING /* W2K */ ||
GetLastError() == 0xdeadbeef /* NT4, XP, Vista */,
"Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError());
}
/* Now with the original returned size */
SetLastError(0xdeadbeef);
displaysize = tempsize;
ret = GetServiceDisplayNameA(scm_handle, spooler, displayname, &displaysize);
todo_wine
ok(ret, "Expected success\n");
ok(displaysize == tempsize, "Expected no change for the needed buffer size\n");
todo_wine
ok(GetLastError() == ERROR_SUCCESS /* W2K3 */ ||
GetLastError() == ERROR_IO_PENDING /* W2K */ ||
GetLastError() == 0xdeadbeef /* NT4, XP, Vista */,
@ -493,7 +488,6 @@ static void test_get_displayname(void)
"Expected ERROR_SUCCESS, ERROR_IO_PENDING or 0xdeadbeef, got %d\n", GetLastError());
/* Test that shows that if the buffersize is enough, it's not changed */
ok(displaysize == tempsize * 2, "Expected no change for the needed buffer size\n");
todo_wine
ok(lstrlen(displayname) == tempsize/2,
"Expected the buffer to be twice the length of the string\n") ;
@ -538,9 +532,9 @@ static void test_get_displayname(void)
ok(displaysize == tempsizeW, "Expected the needed buffersize\n");
ok(lstrlenW(displaynameW) == displaysize,
"Expected the buffer to be the length of the string\n") ;
}
ok(tempsize / 2 == tempsizeW,
"Expected the needed buffersize (in bytes) to be the same for the A and W call\n");
}
CloseServiceHandle(scm_handle);