From: Jelmer Vernooij Date: Mon, 2 Aug 2004 00:24:04 +0000 (+0000) Subject: r1617: Start working on the svcctl pipe X-Git-Tag: samba-misc-tags/initial-v4-0-unstable~12256 X-Git-Url: http://git.samba.org/?p=samba.git;a=commitdiff_plain;h=518ff5f505446fee623365fd5bdfc75c0cb93d2a;hp=d9b4e45f46cd738b196f8d167cea264b3ce0d364 r1617: Start working on the svcctl pipe --- diff --git a/source/gtk/README b/source/gtk/README index ae41065e341..729334ab829 100644 --- a/source/gtk/README +++ b/source/gtk/README @@ -7,7 +7,7 @@ GtkRpcBindingDialog - Gtk Dialog Window for obtaining user credentials and a RPC GtkSelectDomainDialog - Gtk Dialog for selecting a domain GtkSelectHostDialog - Gtk Dialog for selecting a SMB host gtk_show_werror() - Show dialog box with a WERROR -gtk_show_nterror() - Show dialog box with a NTSTATUS +gtk_show_ntstatus() - Show dialog box with a NTSTATUS create_gtk_samba_about() - Shows about Window Utilities: diff --git a/source/librpc/config.m4 b/source/librpc/config.m4 index 4577d79b161..ba46cac36cc 100644 --- a/source/librpc/config.m4 +++ b/source/librpc/config.m4 @@ -17,6 +17,7 @@ SMB_SUBSYSTEM(LIBNDR_RAW,[], librpc/gen_ndr/ndr_spoolss.o librpc/gen_ndr/ndr_wkssvc.o librpc/gen_ndr/ndr_srvsvc.o + librpc/gen_ndr/ndr_svcctl.o librpc/gen_ndr/ndr_atsvc.o librpc/gen_ndr/ndr_eventlog.o librpc/gen_ndr/ndr_epmapper.o diff --git a/source/librpc/idl/svcctl.idl b/source/librpc/idl/svcctl.idl new file mode 100644 index 00000000000..07e38deee69 --- /dev/null +++ b/source/librpc/idl/svcctl.idl @@ -0,0 +1,161 @@ +#include "idl_types.h" + +/* + svcctl interface definitions +*/ + +[ uuid(367abb81-9844-35f1-ad32-98f038001003), + version(2.0), + pointer_default(unique) +] interface svcctl +{ + typedef struct { + uint32 is_locked; + unistr *lock_owner; + uint32 lock_duration; + } SERVICE_LOCK_STATUS; + + typedef struct { + uint32 type; + uint32 state; + uint32 controls_accepted; + uint32 win32_exit_code; + uint32 service_exit_code; + uint32 check_point; + uint32 wait_hint; + } SERVICE_STATUS; + + typedef struct { + unistr *service_name; + unistr *display_name; + SERVICE_STATUS status; + } ENUM_SERVICE_STATUS; + + typedef enum { + SERVICE_TYPE_KERNEL_DRIVER=0x01, + SERVICE_TYPE_FS_DRIVER=0x02, + SERVICE_TYPE_ADAPTER=0x04, + SERVICE_TYPE_RECOGNIZER_DRIVER=0x08, + SERVICE_TYPE_DRIVER=SERVICE_TYPE_KERNEL_DRIVER|SERVICE_TYPE_FS_DRIVER|SERVICE_TYPE_RECOGNIZER_DRIVER, + SERVICE_TYPE_WIN32_OWN_PROCESS=0x10, + SERVICE_TYPE_WIN32_SHARE_PROCESS=0x20, + SERVICE_TYPE_WIN32=SERVICE_TYPE_WIN32_OWN_PROCESS|SERVICE_TYPE_WIN32_SHARE_PROCESS + } ServiceType; + + typedef enum { + SERVICE_STATE_ACTIVE=0x01, + SERVICE_STATE_INACTIVE=0x02, + SERVICE_STATE_ALL=0x03 + } ServiceState; + + /*****************/ + /* Function 0x00 */ + uint32 svcctl_CloseServiceHandle( + [in,out,ref] policy_handle *handle + ); + + /*****************/ + /* Function 0x01 */ + + WERROR svcctl_ControlService(); + + /*****************/ + /* Function 0x02 */ + WERROR svcctl_DeleteService(); + + /*****************/ + /* Function 0x03 */ + + WERROR svcctl_LockServiceDatabase( + [in,ref] policy_handle *handle, + [out] policy_handle lock + ); + + /*****************/ + /* Function 0x04 */ + WERROR svcctl_QueryServiceObjectSecurity(); + + /*****************/ + /* Function 0x05 */ + WERROR svcctl_SetServiceObjectSecurity(); + + /*****************/ + /* Function 0x06 */ + WERROR svcctl_QueryServiceStatus( + [in,ref] policy_handle *handle, + [out,ref] SERVICE_STATUS *status); + + /*****************/ + /* Function 0x07 */ + WERROR svcctl_SetServiceStatus(); + + /*****************/ + /* Function 0x08 */ + WERROR svcctl_UnlockServiceDatabase( + [in,out,ref] policy_handle *lock + ); + + /*****************/ + /* Function 0x09 */ + WERROR svcctl_NotifyBootConfigStatus(); + + /*****************/ + /* Function 0x0a */ + WERROR svcctl_SCSetServiceBits(); + + /*****************/ + /* Function 0x0b */ + WERROR svcctl_ChangeServiceConfig(); + + /*****************/ + /* Function 0x0c */ + WERROR svcctl_CreateService(); + + /*****************/ + /* Function 0x0d */ + WERROR svcctl_EnumDependentServices(); + + /*****************/ + /* Function 0x0e */ + WERROR svcctl_EnumServicesStatus( + [in,ref] policy_handle *handle, + [in] uint32 type, + [in] uint32 state, + [out,size_is(buf_size)] ENUM_SERVICE_STATUS *service, + [in] uint32 buf_size, + [out] uint32 bytes_needed, + [out] uint32 services_returned, + [in,out] uint32 *resume_handle + ); + /*****************/ + /* Function 0x0f */ + WERROR svcctl_OpenSCManager( + [in] unistr *MachineName, + [in] unistr *DatabaseName, + [in] uint32 access_mask, + [out,ref] policy_handle *handle); + + /*****************/ + /* Function 0x10 */ + WERROR svcctl_OpenService(); + + /*****************/ + /* Function 0x11 */ + WERROR svcctl_QueryServiceConfig(); + + /*****************/ + /* Function 0x12 */ + WERROR svcctl_QueryServiceLockStatus( + [in,ref] policy_handle *handle, + [in] uint32 buf_size, + [out,ref] SERVICE_LOCK_STATUS *status, + [out,ref] uint32 *required_buf_size + ); + + /*****************/ + /* Function 0x13 */ + WERROR svcctl_StartService( + [in,ref] policy_handle *handle, + [in] uint32 NumArgs, + [in,length_of(NumArgs)] unistr *Arguments); +} diff --git a/source/torture/config.mk b/source/torture/config.mk index de24d106178..77d01f75c0f 100644 --- a/source/torture/config.mk +++ b/source/torture/config.mk @@ -55,6 +55,7 @@ ADD_OBJ_FILES = \ torture/rpc/samr.o \ torture/rpc/wkssvc.o \ torture/rpc/srvsvc.o \ + torture/rpc/svcctl.o \ torture/rpc/atsvc.o \ torture/rpc/eventlog.o \ torture/rpc/epmapper.o \ diff --git a/source/torture/rpc/svcctl.c b/source/torture/rpc/svcctl.c new file mode 100644 index 00000000000..062fcdf5845 --- /dev/null +++ b/source/torture/rpc/svcctl.c @@ -0,0 +1,141 @@ +/* + Unix SMB/CIFS implementation. + test suite for srvsvc rpc operations + + Copyright (C) Jelmer Vernooij 2004 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +static BOOL test_EnumServicesStatus(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *h) +{ + struct svcctl_EnumServicesStatus r; + int i; + NTSTATUS status; + uint32 resume_handle = 0; + struct ENUM_SERVICE_STATUS *service = talloc_p(mem_ctx, struct ENUM_SERVICE_STATUS); + + r.in.handle = h; + r.in.type = SERVICE_TYPE_WIN32; + r.in.state = SERVICE_STATE_ALL; + r.in.buf_size = sizeof(struct ENUM_SERVICE_STATUS); + r.in.resume_handle = &resume_handle; + r.out.service = service; + r.out.resume_handle = &resume_handle; + + status = dcerpc_svcctl_EnumServicesStatus(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("ËnumServicesStatus failed!\n"); + return False; + } + + if (W_ERROR_EQUAL(r.out.result, WERR_MORE_DATA)) { + r.in.buf_size = r.out.bytes_needed + sizeof(struct ENUM_SERVICE_STATUS); + service = talloc_realloc(mem_ctx, service, r.in.buf_size); + r.out.service = service; + + status = dcerpc_svcctl_EnumServicesStatus(p, mem_ctx, &r); + + if (!NT_STATUS_IS_OK(status)) { + printf("ËnumServicesStatus failed!\n"); + return False; + } + + if (!W_ERROR_IS_OK(r.out.result)) { + printf("EnumServicesStatus failed\n"); + return False; + } + } + + for(i = 0; i < r.out.services_returned; i++) { + printf("%s - %s\n", service[i].service_name, service[i].display_name); + } + + return True; +} + +static BOOL test_OpenSCManager(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *h) +{ + struct svcctl_OpenSCManager r; + NTSTATUS status; + + r.in.MachineName = NULL; + r.in.DatabaseName = NULL; + r.in.access_mask = SEC_RIGHTS_MAXIMUM_ALLOWED; + r.out.handle = h; + + status = dcerpc_svcctl_OpenSCManager(p, mem_ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("OpenSCManager failed!\n"); + return False; + } + + return True; +} + +static BOOL test_CloseServiceHandle(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, struct policy_handle *h) +{ + struct svcctl_CloseServiceHandle r; + NTSTATUS status; + r.in.handle = h; + r.out.handle = h; + status = dcerpc_svcctl_CloseServiceHandle(p, mem_ctx, &r); + if (!NT_STATUS_IS_OK(status)) { + printf("CloseServiceHandle failed\n"); + return False; + } + + return True; +} + +BOOL torture_rpc_svcctl(int dummy) +{ + NTSTATUS status; + struct dcerpc_pipe *p; + struct policy_handle h; + TALLOC_CTX *mem_ctx; + BOOL ret = True; + + mem_ctx = talloc_init("torture_rpc_svcctl"); + + status = torture_rpc_connection(&p, + DCERPC_SVCCTL_NAME, + DCERPC_SVCCTL_UUID, + DCERPC_SVCCTL_VERSION); + if (!NT_STATUS_IS_OK(status)) { + return False; + } + + if (!test_OpenSCManager(p, mem_ctx, &h)) { + ret = False; + } + + if (!test_EnumServicesStatus(p, mem_ctx, &h)) { + ret = False; + } + + if (!test_CloseServiceHandle(p, mem_ctx, &h)) { + ret = False; + } + + talloc_destroy(mem_ctx); + + torture_rpc_close(p); + + return ret; +} diff --git a/source/torture/torture.c b/source/torture/torture.c index 804dd34f2a3..c7cc29524d9 100644 --- a/source/torture/torture.c +++ b/source/torture/torture.c @@ -4209,6 +4209,7 @@ static struct { {"RPC-SCHANNEL", torture_rpc_schannel, 0}, {"RPC-WKSSVC", torture_rpc_wkssvc, 0}, {"RPC-SRVSVC", torture_rpc_srvsvc, 0}, + {"RPC-SVCCTL", torture_rpc_svcctl, 0}, {"RPC-ATSVC", torture_rpc_atsvc, 0}, {"RPC-EVENTLOG", torture_rpc_eventlog, 0}, {"RPC-EPMAPPER", torture_rpc_epmapper, 0},