advapi32: Reimplemented ChangeServiceConfig2W in services.exe.
This commit is contained in:
parent
8cdbeacd59
commit
3249b40f70
@ -2112,8 +2112,8 @@ BOOL WINAPI ChangeServiceConfig2A( SC_HANDLE hService, DWORD dwInfoLevel,
|
|||||||
BOOL WINAPI ChangeServiceConfig2W( SC_HANDLE hService, DWORD dwInfoLevel,
|
BOOL WINAPI ChangeServiceConfig2W( SC_HANDLE hService, DWORD dwInfoLevel,
|
||||||
LPVOID lpInfo)
|
LPVOID lpInfo)
|
||||||
{
|
{
|
||||||
HKEY hKey;
|
|
||||||
struct sc_service *hsvc;
|
struct sc_service *hsvc;
|
||||||
|
DWORD err;
|
||||||
|
|
||||||
hsvc = sc_handle_get_handle_data(hService, SC_HTYPE_SERVICE);
|
hsvc = sc_handle_get_handle_data(hService, SC_HTYPE_SERVICE);
|
||||||
if (!hsvc)
|
if (!hsvc)
|
||||||
@ -2121,26 +2121,21 @@ BOOL WINAPI ChangeServiceConfig2W( SC_HANDLE hService, DWORD dwInfoLevel,
|
|||||||
SetLastError( ERROR_INVALID_HANDLE );
|
SetLastError( ERROR_INVALID_HANDLE );
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
hKey = hsvc->hkey;
|
|
||||||
|
|
||||||
if (dwInfoLevel == SERVICE_CONFIG_DESCRIPTION)
|
__TRY
|
||||||
{
|
{
|
||||||
static const WCHAR szDescription[] = {'D','e','s','c','r','i','p','t','i','o','n',0};
|
err = svcctl_ChangeServiceConfig2W( hsvc->hdr.server_handle, dwInfoLevel, lpInfo );
|
||||||
LPSERVICE_DESCRIPTIONW sd = (LPSERVICE_DESCRIPTIONW)lpInfo;
|
|
||||||
if (sd->lpDescription)
|
|
||||||
{
|
|
||||||
TRACE("Setting Description to %s\n",debugstr_w(sd->lpDescription));
|
|
||||||
if (sd->lpDescription[0] == 0)
|
|
||||||
RegDeleteValueW(hKey,szDescription);
|
|
||||||
else
|
|
||||||
RegSetValueExW(hKey, szDescription, 0, REG_SZ,
|
|
||||||
(LPVOID)sd->lpDescription,
|
|
||||||
sizeof(WCHAR)*(strlenW(sd->lpDescription)+1));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
__EXCEPT(rpc_filter)
|
||||||
FIXME("STUB: %p %d %p\n",hService, dwInfoLevel, lpInfo);
|
{
|
||||||
return TRUE;
|
err = map_exception_code(GetExceptionCode());
|
||||||
|
}
|
||||||
|
__ENDTRY
|
||||||
|
|
||||||
|
if (err != ERROR_SUCCESS)
|
||||||
|
SetLastError(err);
|
||||||
|
|
||||||
|
return err == ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
@ -89,8 +89,19 @@ typedef struct _SERVICE_STATUS {
|
|||||||
typedef enum _SC_STATUS_TYPE {
|
typedef enum _SC_STATUS_TYPE {
|
||||||
SC_STATUS_PROCESS_INFO = 0
|
SC_STATUS_PROCESS_INFO = 0
|
||||||
} SC_STATUS_TYPE;
|
} SC_STATUS_TYPE;
|
||||||
|
|
||||||
|
typedef struct _SERVICE_DESCRIPTIONW {
|
||||||
|
LPWSTR lpDescription;
|
||||||
|
} SERVICE_DESCRIPTIONW,*LPSERVICE_DESCRIPTIONW;
|
||||||
|
|
||||||
|
#define SERVICE_CONFIG_DESCRIPTION 1
|
||||||
|
|
||||||
cpp_quote("#endif")
|
cpp_quote("#endif")
|
||||||
|
|
||||||
|
typedef [switch_type(DWORD)] union
|
||||||
|
{
|
||||||
|
[case (SERVICE_CONFIG_DESCRIPTION)] SERVICE_DESCRIPTIONW descr;
|
||||||
|
} SERVICE_CONFIG2W;
|
||||||
|
|
||||||
/* Compatible with Windows function 0x00 */
|
/* Compatible with Windows function 0x00 */
|
||||||
DWORD svcctl_CloseServiceHandle(
|
DWORD svcctl_CloseServiceHandle(
|
||||||
@ -276,8 +287,11 @@ cpp_quote("#endif")
|
|||||||
/* Not compatible with Windows function 0x24 */
|
/* Not compatible with Windows function 0x24 */
|
||||||
DWORD svcctl_ChangeServiceConfig2A(/* FIXME */);
|
DWORD svcctl_ChangeServiceConfig2A(/* FIXME */);
|
||||||
|
|
||||||
/* Not compatible with Windows function 0x25 */
|
/* Untested with Windows function 0x25 */
|
||||||
DWORD svcctl_ChangeServiceConfig2W(/* FIXME */);
|
DWORD svcctl_ChangeServiceConfig2W(
|
||||||
|
[in] SC_RPC_HANDLE hService,
|
||||||
|
[in] DWORD InfoLevel,
|
||||||
|
[in,switch_is(InfoLevel)] SERVICE_CONFIG2W *config );
|
||||||
|
|
||||||
/* Not compatible with Windows function 0x26 */
|
/* Not compatible with Windows function 0x26 */
|
||||||
DWORD svcctl_QueryServiceConfig2A(/* FIXME */);
|
DWORD svcctl_QueryServiceConfig2A(/* FIXME */);
|
||||||
|
@ -609,6 +609,43 @@ DWORD svcctl_SetServiceStatus(
|
|||||||
return ERROR_SUCCESS;
|
return ERROR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DWORD svcctl_ChangeServiceConfig2W( SC_RPC_HANDLE hService, DWORD level, SERVICE_CONFIG2W *config )
|
||||||
|
{
|
||||||
|
struct sc_service_handle *service;
|
||||||
|
DWORD err;
|
||||||
|
|
||||||
|
if ((err = validate_service_handle(hService, SERVICE_CHANGE_CONFIG, &service)) != 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
switch (level)
|
||||||
|
{
|
||||||
|
case SERVICE_CONFIG_DESCRIPTION:
|
||||||
|
{
|
||||||
|
WCHAR *descr = NULL;
|
||||||
|
|
||||||
|
if (config->descr.lpDescription[0])
|
||||||
|
{
|
||||||
|
if (!(descr = strdupW( config->descr.lpDescription )))
|
||||||
|
return ERROR_NOT_ENOUGH_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
WINE_TRACE( "changing service %p descr to %s\n", service, wine_dbgstr_w(descr) );
|
||||||
|
service_lock_exclusive( service->service_entry );
|
||||||
|
HeapFree( GetProcessHeap(), 0, service->service_entry->description );
|
||||||
|
service->service_entry->description = descr;
|
||||||
|
save_service_config( service->service_entry );
|
||||||
|
service_unlock( service->service_entry );
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
WINE_FIXME("level %u not implemented\n", level);
|
||||||
|
err = ERROR_INVALID_LEVEL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
DWORD svcctl_QueryServiceStatusEx(
|
DWORD svcctl_QueryServiceStatusEx(
|
||||||
SC_RPC_HANDLE hService,
|
SC_RPC_HANDLE hService,
|
||||||
SC_STATUS_TYPE InfoLevel,
|
SC_STATUS_TYPE InfoLevel,
|
||||||
@ -1097,13 +1134,6 @@ DWORD svcctl_ChangeServiceConfig2A(
|
|||||||
return ERROR_CALL_NOT_IMPLEMENTED;
|
return ERROR_CALL_NOT_IMPLEMENTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
DWORD svcctl_ChangeServiceConfig2W(
|
|
||||||
void)
|
|
||||||
{
|
|
||||||
WINE_FIXME("\n");
|
|
||||||
return ERROR_CALL_NOT_IMPLEMENTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD svcctl_QueryServiceConfig2A(
|
DWORD svcctl_QueryServiceConfig2A(
|
||||||
void)
|
void)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user