Piotr Caban : advapi32: Added support for SERVICE_CONFIG_PRESHUTDOWN_INFO.
Alexandre Julliard
julliard at winehq.org
Wed Nov 30 14:19:21 CST 2011
Module: wine
Branch: master
Commit: e2172edca2097fc62c60922fd3d5d2a7fad7ba1c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=e2172edca2097fc62c60922fd3d5d2a7fad7ba1c
Author: Piotr Caban <piotr at codeweavers.com>
Date: Wed Nov 30 15:28:49 2011 +0100
advapi32: Added support for SERVICE_CONFIG_PRESHUTDOWN_INFO.
---
dlls/advapi32/service.c | 10 +++++++++-
dlls/advapi32/tests/service.c | 28 ++++++++++++++++++++++++++++
2 files changed, 37 insertions(+), 1 deletions(-)
diff --git a/dlls/advapi32/service.c b/dlls/advapi32/service.c
index bb5e49c..7c45f94 100644
--- a/dlls/advapi32/service.c
+++ b/dlls/advapi32/service.c
@@ -1400,6 +1400,10 @@ BOOL WINAPI QueryServiceConfig2A(SC_HANDLE hService, DWORD dwLevel, LPBYTE buffe
else configA->lpDescription = NULL;
}
break;
+ case SERVICE_CONFIG_PRESHUTDOWN_INFO:
+ if (buffer && bufferW && *needed<=size)
+ memcpy(buffer, bufferW, *needed);
+ break;
default:
FIXME("conversation W->A not implemented for level %d\n", dwLevel);
ret = FALSE;
@@ -1421,7 +1425,7 @@ BOOL WINAPI QueryServiceConfig2W(SC_HANDLE hService, DWORD dwLevel, LPBYTE buffe
{
DWORD err;
- if(dwLevel != SERVICE_CONFIG_DESCRIPTION) {
+ if(dwLevel!=SERVICE_CONFIG_DESCRIPTION && dwLevel!=SERVICE_CONFIG_PRESHUTDOWN_INFO) {
FIXME("Level %d not implemented\n", dwLevel);
SetLastError(ERROR_INVALID_LEVEL);
return FALSE;
@@ -2051,6 +2055,10 @@ BOOL WINAPI ChangeServiceConfig2A( SC_HANDLE hService, DWORD dwInfoLevel,
HeapFree( GetProcessHeap(), 0, faw.lpRebootMsg );
HeapFree( GetProcessHeap(), 0, faw.lpCommand );
}
+ else if (dwInfoLevel == SERVICE_CONFIG_PRESHUTDOWN_INFO)
+ {
+ r = ChangeServiceConfig2W( hService, dwInfoLevel, lpInfo);
+ }
else
SetLastError( ERROR_INVALID_PARAMETER );
diff --git a/dlls/advapi32/tests/service.c b/dlls/advapi32/tests/service.c
index c5dea2f..b6aff26 100644
--- a/dlls/advapi32/tests/service.c
+++ b/dlls/advapi32/tests/service.c
@@ -1896,6 +1896,7 @@ static void test_queryconfig2(void)
DWORD expected, needed;
BYTE buffer[MAX_PATH];
LPSERVICE_DESCRIPTIONA pConfig = (LPSERVICE_DESCRIPTIONA)buffer;
+ SERVICE_PRESHUTDOWN_INFO preshutdown_info;
static const CHAR servicename [] = "Winetest";
static const CHAR displayname [] = "Winetest dummy service";
static const CHAR pathname [] = "we_dont_care.exe";
@@ -2062,6 +2063,33 @@ static void test_queryconfig2(void)
ret = pQueryServiceConfig2W(svc_handle, SERVICE_CONFIG_DESCRIPTION,buffer, needed,&needed);
ok(ret, "expected QueryServiceConfig2W to succeed\n");
+ SetLastError(0xdeadbeef);
+ ret = pQueryServiceConfig2W(svc_handle, SERVICE_CONFIG_PRESHUTDOWN_INFO,
+ (LPBYTE)&preshutdown_info, sizeof(preshutdown_info), &needed);
+ if(!ret && GetLastError()==ERROR_INVALID_LEVEL)
+ {
+ /* Win2k3 and older */
+ win_skip("SERVICE_CONFIG_PRESHUTDOWN_INFO not supported\n");
+ goto cleanup;
+ }
+ ok(ret, "expected QueryServiceConfig2W to succeed (%d)\n", GetLastError());
+ ok(needed == sizeof(preshutdown_info), "needed = %d\n", needed);
+ ok(preshutdown_info.dwPreshutdownTimeout == 180000, "Default PreshutdownTimeout = %d\n",
+ preshutdown_info.dwPreshutdownTimeout);
+
+ SetLastError(0xdeadbeef);
+ preshutdown_info.dwPreshutdownTimeout = -1;
+ ret = pChangeServiceConfig2A(svc_handle, SERVICE_CONFIG_PRESHUTDOWN_INFO,
+ (LPVOID)&preshutdown_info);
+ ok(ret, "expected ChangeServiceConfig2A to succeed (%d)\n", GetLastError());
+
+ ret = pQueryServiceConfig2W(svc_handle, SERVICE_CONFIG_PRESHUTDOWN_INFO,
+ (LPBYTE)&preshutdown_info, sizeof(preshutdown_info), &needed);
+ ok(ret, "expected QueryServiceConfig2W to succeed (%d)\n", GetLastError());
+ ok(needed == sizeof(preshutdown_info), "needed = %d\n", needed);
+ ok(preshutdown_info.dwPreshutdownTimeout == -1, "New PreshutdownTimeout = %d\n",
+ preshutdown_info.dwPreshutdownTimeout);
+
cleanup:
DeleteService(svc_handle);
More information about the wine-cvs
mailing list