r1617: Start working on the svcctl pipe
authorJelmer Vernooij <jelmer@samba.org>
Mon, 2 Aug 2004 00:24:04 +0000 (00:24 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:57:44 +0000 (12:57 -0500)
(This used to be commit 518ff5f505446fee623365fd5bdfc75c0cb93d2a)

source4/gtk/README
source4/librpc/config.m4
source4/librpc/idl/svcctl.idl [new file with mode: 0644]
source4/torture/config.mk
source4/torture/rpc/svcctl.c [new file with mode: 0644]
source4/torture/torture.c

index ae41065e341d79c9aca37ff265d76bc6eab4252a..729334ab829217741d296f4cfbb8b51e1f8b7d6c 100644 (file)
@@ -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:
index 4577d79b161afbc414ff8592dba2779883c647f4..ba46cac36cc68396163cd45b69fe3b22a6ce7c03 100644 (file)
@@ -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/source4/librpc/idl/svcctl.idl b/source4/librpc/idl/svcctl.idl
new file mode 100644 (file)
index 0000000..07e38de
--- /dev/null
@@ -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);
+}
index de24d106178b060bdcdcf705c2e0061647dd3c3f..77d01f75c0fc1e8ca4502bc6e788f2e6edeaa83e 100644 (file)
@@ -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/source4/torture/rpc/svcctl.c b/source4/torture/rpc/svcctl.c
new file mode 100644 (file)
index 0000000..062fcdf
--- /dev/null
@@ -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;
+}
index 804dd34f2a38b7311795c9b8601515d1638c90a4..c7cc29524d9d969bde2ce75db819d31218b5009f 100644 (file)
@@ -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},