From e2172edca2097fc62c60922fd3d5d2a7fad7ba1c Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Wed, 30 Nov 2011 15:28:49 +0100 Subject: [PATCH] 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 deletion(-) diff --git a/dlls/advapi32/service.c b/dlls/advapi32/service.c index bb5e49ca204..7c45f94ba27 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 c5dea2ffcdc..b6aff26cc3a 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);